LangChain中的prompt| 豆包MarsCode AI刷题

204 阅读25分钟

LangChain中提供String(StringPromptTemplate)和Chat(BaseChatPromptTemplate)两种基本类型的模板,并基于它们构建了不同类型的提示模板:

https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/97cbbd7fb0b34ecea8f602b159ead02e~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MjI2NjkzMTY3MDU=:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiNDI4MTk3NjQzMjEwNjUwNiJ9&rk3s=e9ecf3d6&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1731591345&x-orig-sign=zuHEK1DCZwv3wBxSyK2Dzw45WQY%3D

这些模板的导入方式如下:

from langchain.prompts.prompt import PromptTemplate#简单了解
from langchain.prompts import FewShotPromptTemplate#典型重点
from langchain.prompts.pipeline import PipelinePromptTemplate#简单
from langchain.prompts import ChatPromptTemplate
from langchain.prompts import (
    ChatMessagePromptTemplate,
    SystemMessagePromptTemplate,
    AIMessagePromptTemplate,
    HumanMessagePromptTemplate,
)

下面是自定义模板

from langchain import PromptTemplate
  • 1.PromptTemplate
from langchain import PromptTemplate

template = """\
你是业务咨询顾问。
你给一个销售{product}的电商公司,起一个好的名字?
"""
prompt = PromptTemplate.from_template(template)

print(prompt.format(product="鲜花"))

这个程序的主要功能是生成适用于不同场景的提示,对用户定义的一种产品或服务提供公司命名建议。

在这里,"你是业务咨询顾问。你给一个销售{product}的电商公司,起一个好的名字?" 就是原始提示模板,其中 {product} 是占位符。

然后通过PromptTemplate的from_template方法,我们创建了一个提示模板对象,并通过prompt.format方法将模板中的 {product} 替换为 "鲜花"

输出:

你是业务咨询顾问。
你给一个销售鲜花的电商公司,起一个好的名字?

得到了一句具体的提示:你是业务咨询顾问。你给一个销售鲜花的电商公司,起一个好的名字? ——这就要求大语言模型,要有的放矢。

在上面这个过程中,LangChain中的模板的一个方便之处是from_template方法可以从传入的字符串中自动提取变量名称(如product),而无需刻意指定。上面程序中的product自动成为了format方法中的一个参数

可以通过提示模板类的构造函数,在创建模板时手工指定input_variables,示例如下:

prompt = PromptTemplate(
    input_variables=["product", "market"], 
    template="你是业务咨询顾问。对于一个面向{market}市场的,专注于销售{product}的公司,你会推荐哪个名字?"
)
print(prompt.format(product="鲜花", market="高端"))

输出:

你是业务咨询顾问。对于一个面向高端市场的,专注于销售鲜花的公司,你会推荐哪个名字?

上面的方式直接生成了提示模板,并没有通过from_template方法从字符串模板中创建提示模板。二者效果是一样的

  • 2.ChatPromptTemplate
  • 这是对于OpenAI推出的ChatGPT这一类的聊天模型,LangChain也提供了一系列的模板,这些模板的不同之处是它们有对应的角色。
import openai
openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Who won the world series in 2020?"},
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
        {"role": "user", "content": "Where was it played?"}
    ]
)

OpenAI对传输到gpt-3.5-turbo和GPT-4的messsage格式说明如下:

消息必须是消息对象的数组,其中每个对象都有一个角色(系统、用户或助理)和内容。对话可以短至一条消息,也可以来回多次。

通常,对话首先由系统消息格式化,然后是交替的用户消息和助理消息。

系统消息有助于设置助手的行为。例如,你可以修改助手的个性或提供有关其在整个对话过程中应如何表现的具体说明。但请注意,系统消息是可选的,并且没有系统消息的模型的行为可能类似于使用通用消息,例如“你是一个有用的助手”。

用户消息提供助理响应的请求或评论。

助理消息存储以前的助理响应,但也可以由你编写以给出所需行为的示例。

LangChain的ChatPromptTemplate这一系列的模板,就是跟着这一系列角色而设计的

下面,我给出一个示例。

# 导入聊天消息类模板
from langchain.prompts import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
# 模板的构建
template="你是一位专业顾问,负责为专注于{product}的公司起名。"
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template="公司主打产品是{product_detail}。"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
prompt_template = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])

# 格式化提示消息生成提示
prompt = prompt_template.format_prompt(product="鲜花装饰", product_detail="创新的鲜花设计。").to_messages()

# 下面调用模型,把提示传入模型,生成结果
import os
os.environ["OPENAI_API_KEY"] = '你的OpenAI Key'
from langchain.chat_models import ChatOpenAI
chat = ChatOpenAI()
result = chat(prompt)
print(result)

输出:

content='1. 花语创意\n2. 花韵设计\n3. 花艺创新\n4. 花漾装饰\n5. 花语装点\n6. 花翩翩\n7. 花语之美\n8. 花馥馥\n9. 花语时尚\n10. 花之魅力' 
additional_kwargs={} 
example=False
  • 3.FewShotPromptTemplate

  • FewShot的思想起源

    今天我下楼跑步时,一个老爷爷教孙子学骑车,小孩总掌握不了平衡,蹬一两下就下车。

    • 爷爷说:“宝贝,你得有毅力!”
    • 孙子说:“爷爷,什么是毅力?”
    • 爷爷说:“你看这个叔叔,绕着楼跑了10多圈了,这就是毅力,你也得至少蹬个10几趟才能骑起来。”

    这老爷爷就是给孙子做了一个One-Shot(一个例子的情况下就明白)学习。如果他的孙子第一次听说却上来就明白什么是毅力,那就神了,这就叫Zero-Shot,表明这孩子的语言天赋不是一般的高,从知识积累和当前语境中就能够推知新词的涵义。有时候我们把Zero-Shot翻译为“顿悟”,聪明的大模型,某些情况下也是能够做到的。


    Few-Shot(少样本)、One-Shot(单样本)和与之对应的 Zero-Shot(零样本) 的概念都起源于机器学习。如何让机器学习模型在极少量甚至没有示例的情况下学习到新的概念或类别,对于许多现实世界的问题是非常有价值的,因为我们往往无法获取到大量的标签化数据。

    这几个重要概念并非在某一篇特定的论文中首次提出,而是在机器学习和深度学习的研究中逐渐形成和发展的。

    对于Few-Shot Learning,一个重要的参考文献是2016年Vinyals, O.的论文《小样本学习的匹配网络》。 这篇论文提出了一种新的学习模型——匹配网络(Matching Networks),专门针对单样本学习(One-Shot Learning)问题设计, One-Shot Learning 可以看作是一种最常见的 Few-Shot 学习的情况。

    对于Zero-Shot Learning,一个代表性的参考文献是Palatucci, M.在2009年提出的《基于语义输出编码的零样本学习(Zero-Shot Learning with semantic output codes)》,这篇论文提出了零次学习(Zero-Shot Learning)的概念,其中的学习系统可以根据类的语义描述来识别之前未见过的类。

    在提示工程(Prompt Engineering)中,Few-Shot 和 Zero-Shot 学习的概念也被广泛应用。

    在Few-Shot学习设置中,模型会被给予几个示例,以帮助模型理解任务,并生成正确的响应。

    在Zero-Shot学习设置中,模型只根据任务的描述生成响应,不需要任何示例。

    而OpenAI在介绍GPT-3模型的重要论文《Language models are Few-Shot learners(语言模型是少样本学习者)》中,更是直接指出:GPT-3模型,作为一个大型的自我监督学习模型,通过提升模型规模,实现了出色的Few-Shot学习性能。

    这篇论文为大语言模型可以进行Few-Shot学习提供了扎实的理论基础。

    https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/b1dd766219074a7d8ec505b1199de1c2~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MjI2NjkzMTY3MDU=:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiNDI4MTk3NjQzMjEwNjUwNiJ9&rk3s=e9ecf3d6&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1731591345&x-orig-sign=323PiJ8nMgvrGO66in2yuJKaTfY%3D

    下图就是OpenAI的GPT-3论文给出的GPT-3在翻译任务中,通过FewShot提示完成翻译的例子。

    https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/c60fcb39f74c4c2ea9e8dcfddafe920f~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MjI2NjkzMTY3MDU=:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiNDI4MTk3NjQzMjEwNjUwNiJ9&rk3s=e9ecf3d6&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1731591345&x-orig-sign=BlgBkMI0XDKLzAYsSKox5zTbwv4%3D

    以上,就是ZeroShot、OneShot、FewShot这些重要概念的起源。

  • FewShot的步骤

    1. 创建示例样本

    首先,创建一些示例,作为提示的样本。其中每个示例都是一个字典,其中键是输入变量,值是这些输入变量的值。

创建一些示例

samples = [ { "flowertype": "玫瑰", "occasion": "爱情", "adcopy": "玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。" }, { "flowertype": "康乃馨", "occasion": "母亲节", "adcopy": "康乃馨代表着母爱的纯洁与伟大,是母亲节赠送给母亲的完美礼物。" }, { "flowertype": "百合", "occasion": "庆祝", "adcopy": "百合象征着纯洁与高雅,是你庆祝特殊时刻的理想选择。" }, { "flowertype": "向日葵", "occasion": "鼓励", "adcopy": "向日葵象征着坚韧和乐观,是你鼓励亲朋好友的最好方式。" } ]

    samples这个列表,它包含了四个字典,每个字典代表了一种花的类型、适合的场合,以及对应的广告文案。 这些示例样本,就是构建FewShotPrompt时,作为例子传递给模型的参考信息。

    **2. 创建提示模板**

    配置一个提示模板,将一个示例格式化为字符串。这个格式化程序应该是一个PromptTemplate对象。

    ```Python
# 2. 创建一个提示模板
from langchain.prompts.prompt import PromptTemplate
template="鲜花类型: {flower_type}\n
          场合: {occasion}\n
          文案: {ad_copy}"
prompt_sample = PromptTemplate(input_variables=["flower_type", "occasion", "ad_copy"], 
                               template=template)
print(prompt_sample.format(**samples[0]))
提示模板的输出如下:

```Python

鲜花类型: 玫瑰 场合: 爱情 文案: 玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。

    在这个步骤中,我们创建了一个PromptTemplate对象。这个对象是根据指定的输入变量和模板字符串来生成提示的。在这里,输入变量包括 `"flower_type"`、`"occasion"`、`"ad_copy"`,模板是一个字符串,其中包含了用大括号包围的变量名,它们会被对应的变量值替换。

    到这里,我们就把字典中的示例格式转换成了提示模板,可以形成一个个具体可用的LangChain提示。比如我用samples[0]中的数据替换了模板中的变量,生成了一个完整的提示。

    **3. 创建 FewShotPromptTemplate 对象**

    然后,通过使用上一步骤中创建的prompt_sample,以及samples列表中的所有示例, 创建一个FewShotPromptTemplate对象,生成更复杂的提示。

    ```Python
# 3. 创建一个FewShotPromptTemplate对象
from langchain.prompts.few_shot import FewShotPromptTemplate
prompt = FewShotPromptTemplate(
    examples=samples,
    example_prompt=prompt_sample,
    suffix="鲜花类型: {flower_type}\n
            场合: {occasion}",
    input_variables=["flower_type", "occasion"]
)
print(prompt.format(flower_type="野玫瑰", occasion="爱情"))
输出:

```Python

鲜花类型: 玫瑰 场合: 爱情 文案: 玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。

鲜花类型: 康乃馨 场合: 母亲节 文案: 康乃馨代表着母爱的纯洁与伟大,是母亲节赠送给母亲的完美礼物。

鲜花类型: 百合 场合: 庆祝 文案: 百合象征着纯洁与高雅,是你庆祝特殊时刻的理想选择。

鲜花类型: 向日葵 场合: 鼓励 文案: 向日葵象征着坚韧和乐观,是你鼓励亲朋好友的最好方式。

鲜花类型: 野玫瑰 场合: 爱情

    可以看到,FewShotPromptTemplate是一个更复杂的提示模板,它包含了多个示例和一个提示。这种模板可以使用多个示例来指导模型生成对应的输出。目前我们创建一个新提示,其中包含了根据指定的花的类型“野玫瑰”和场合“爱情”。

    **4. 调用大模型创建新文案**

    最后,把这个对象输出给大模型,就可以根据提示,得到我们所需要的文案了!

    ```Python
# 4. 把提示传递给大模型
import os
os.environ["OPENAI_API_KEY"] = '你的Open AI Key'
from langchain.llms import OpenAI
model = OpenAI(model_name='gpt-3.5-turbo-instruct')
result = model(prompt.format(flower_type="野玫瑰", occasion="爱情"))
print(result)
输出:

```Python

文案: 野玫瑰代表着爱情的坚贞,是你向心爱的人表达爱意的最佳礼物。

    好!模型成功地模仿了我们的示例,写出了新文案,从结构到语气都蛮相似的。

  - 使用示例选择器

    - **出现原因**:如果我们的示例很多,那么一次性把所有示例发送给模型是不现实而且低效的。另外,每次都包含太多的Token也会浪费流量(OpenAI是按照Token数来收取费用)。

    - **作用**:LangChain给我们提供了示例选择器,来选择最合适的样本。(注意,因为示例选择器使用向量相似度比较的功能,此处需要安装向量数据库,这里我使用的是开源的Chroma,你也可以选择之前用过的Qdrant。)

    下面,就是使用示例选择器的示例代码。

    ```Python
# 5. 使用示例选择器
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings

# 初始化示例选择器
example_selector = SemanticSimilarityExampleSelector.from_examples(
    samples,
    OpenAIEmbeddings(),
    Chroma,
    k=1
)

# 创建一个使用示例选择器的FewShotPromptTemplate对象
prompt = FewShotPromptTemplate(
    example_selector=example_selector, 
    example_prompt=prompt_sample, 
    suffix="鲜花类型: {flower_type}\n场合: {occasion}", 
    input_variables=["flower_type", "occasion"]
)
print(prompt.format(flower_type="红玫瑰", occasion="爱情"))
输出:

```Python

鲜花类型: 玫瑰 场合: 爱情 文案: 玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。

鲜花类型: 红玫瑰 场合: 爱情

    在这个步骤中,它首先创建了一个SemanticSimilarityExampleSelector对象,这个对象可以根据语义相似性选择最相关的示例。然后,它创建了一个新的FewShotPromptTemplate对象,这个对象使用了上一步创建的选择器来选择最相关的示例生成提示。

    然后,我们又用这个模板生成了一个新的提示,因为我们的提示中需要创建的是红玫瑰的文案,所以,示例选择器example_selector会根据语义的相似度(余弦相似度)找到最相似的示例,也就是“玫瑰”,并用这个示例构建了FewShot模板。

    这样,我们就避免了把过多的无关模板传递给大模型,以节省Token的用量。

- Chain of Thought

  ## 什么是 Chain of Thought

  CoT这个概念来源于学术界,是谷歌大脑的Jason Wei等人于2022年在论文《[Chain-of-Thought Prompting Elicits Reasoning in Large Language Models](https://link.juejin.cn/?target=https%3A%2F%2Fproceedings.neurips.cc%2Fpaper_files%2Fpaper%2F2022%2Ffile%2F9d5609613524ecf4f15af0f7b31abca4-Paper-Conference.pdf)(自我一致性提升了语言模型中的思维链推理能力)》中提出来的概念。它提出,如果生成一系列的中间推理步骤,就能够显著提高大型语言模型进行复杂推理的能力。

  ---

  ### Few-Shot CoT

  Few-Shot CoT 简单的在提示中提供了一些链式思考示例(Chain-of-Thought Prompting),足够大的语言模型的推理能力就能够被增强。简单说,就是给出一两个示例,然后在示例中写清楚推导的过程。

  ![https://static001.geekbang.org/resource/image/f2/a0/f27cec109dff8947d85507b34ce240a0.png?wh=940x473](https://static001.geekbang.org/resource/image/f2/a0/f27cec109dff8947d85507b34ce240a0.png?wh=940x473)

  论文中给出了一个大模型通过思维链做数学题的示例。图左和图右,大模型都读入了OneShot示例,但是图左只给出了答案,而图右则在OneShot示例中给出了解题的具体思路。结果,只给出了答案的模型推理错误,而给出解题思路后,同一个模型生成了正确的答案。

  在三种大型语言模型的实验中,CoT在一系列的算术、常识和符号推理任务中都提高了性能。在GSM8K数学问题基准测试中,通过CoT指导后,大模型的表现可以达到当时最先进的准确性。

  - **COT:**给模型一个思维链,使得模型模型能更好的给出我们想要的结果

  ---

  比如,假设我们正在开发一个AI花店助手,它的任务是帮助用户选择他们想要的花,并生成一个销售列表。在这个过程中,我们可以使用CoT来引导AI的推理过程。

  ?整体指导:你需要跟着下面的步骤一步步的推理。

  1. 问题理解:首先,AI需要理解用户的需求。例如,用户可能会说:“今天要参加朋友的生日Party,想送束花祝福她。”我们可以给AI一个提示模板,里面包含示例:“***遇到XX问题,我先看自己有没有相关知识,有的话,就提供答案;没有,就调用工具搜索,有了知识后再试图解决。***”—— 这就是给了AI一个思维链的示例。

  2. 信息搜索:接下来,AI需要搜索相关信息。例如,它可能需要查找哪些花最适合生日派对。

  3. 决策制定:基于收集到的信息,AI需要制定一个决策。我们可以通过思维链让他详细思考决策的流程,先做什么后做什么。例如,我们可以给它一个示例:“***遇到生日派对送花的情况,我先考虑用户的需求,然后查看鲜花的库存,最后决定推荐一些玫瑰和百合,因为这些花通常适合生日派对。***”—— 那么有了生日派对这个场景做示例,大模型就能把类似的思维流程运用到其它场景。

  4. 生成销售列表:最后,AI使用OutputParser生成一个销售列表,包括推荐的花和价格。

  ---

  在这个过程中,整体上,思维链引导AI从理解问题,到搜索信息,再到制定决策,最后生成销售列表。这种方法不仅使AI的推理过程更加清晰,也使得生成的销售列表更加符合用户的需求。具体到每一个步骤,也可以通过思维链来设计更为详细的提示模板,来引导模型每一步的思考都遵循清晰准确的逻辑。

  其实LangChain的核心组件Agent的本质就是进行好的提示工程,并大量地使用预置的FewShot和CoT模板。这个在之后的课程学习中我们会理解得越来越透彻。

  ### Zero-Shot CoT

  下面的这两个CoT提示模板的例子,来自于Google Research和东京大学的论文《[大语言模型是零样本推理者](https://link.juejin.cn/?target=https%3A%2F%2Fproceedings.neurips.cc%2Fpaper_files%2Fpaper%2F2022%2Ffile%2F8bb0d291acd4acf06ef112099c16f326-Paper-Conference.pdf)》。

  图中的(d)示例非常非常有意思,在Zero-Shot CoT中,你只要简单地告诉模型“**让我们一步步的思考(Let's think step by step)**”,模型就能够给出更好的答案!

  ![https://static001.geekbang.org/resource/image/09/8b/09a48be47b3e0e9ec0ae7ebd483d868b.png?wh=944x508](https://static001.geekbang.org/resource/image/09/8b/09a48be47b3e0e9ec0ae7ebd483d868b.png?wh=944x508)

  哈哈哈,这样太神奇了吧,这不由得让我联想起最简单的提示工程,角色设定——模型回答之前,先告诉它“你是一个很有经验的XX专家”,模型应该就会在开始胡说八道之前三思。

  简单总结一下:Few-Shot CoT,指的就是在带有示例的提示过程中,加入思考的步骤,从而引导模型给出更好的结果。而Zero-Shot CoT,就是直接告诉模型要一步一步地思考,慢慢地推理。

  - Chain of Thought 实战

    现在,就让我带着你完成一次Chain of Thought的LangChain应用开发实战。

    **项目需求**:在这个示例中,你正在开发一个AI运营助手,我们要展示AI如何根据用户的需求推理和生成答案。然后,AI根据当前的用户请求进行推理,提供了具体的花卉建议并解释了为什么选择这些建议。

    在这个过程中,AI需要理解客户的需求之后,按部就班的思考,然后给出最符合逻辑的回答。

    ### CoT的模板设计

    针对这个聊天机器人的需求,我设计了下面这样的思维链模板。

    作为一个为花店电商公司工作的AI助手,我的目标是帮助客户根据他们的喜好做出明智的决定。

    我会按部就班的思考,先理解客户的需求,然后考虑各种鲜花的涵义,最后根据这个需求,给出我的推荐。

    同时,我也会向客户解释我这样推荐的原因。

    **示例 1:**
人类:我想找一种象征爱情的花。
AI:首先,我理解你正在寻找一种可以象征爱情的花。在许多文化中,红玫瑰被视为爱情的象征,这是因为它们的红色通常与热情和浓烈的感情联系在一起。因此,考虑到这一点,我会推荐红玫瑰。红玫瑰不仅能够象征爱情,同时也可以传达出强烈的感情,这是你在寻找的。

    **示例 2:**
人类:我想要一些独特和奇特的花。
AI:从你的需求中,我理解你想要的是独一无二和引人注目的花朵。兰花是一种非常独特并且颜色鲜艳的花,它们在世界上的许多地方都被视为奢侈品和美的象征。因此,我建议你考虑兰花。选择兰花可以满足你对独特和奇特的要求,而且,兰花的美丽和它们所代表的力量和奢侈也可能会吸引你。
AI的模板开始于对其角色的阐述,并给出了一些先前的对话示例(Few-Shot Learning)来帮助AI理解如何处理这种类型的请求。这些示例展示了AI如何根据思维链进行思考,给出深思熟虑之后的答案。

    ### 程序的完整框架

    程序的完整代码如下:

    ```Python
# 设置环境变量和API密钥
import os
os.environ["OPENAI_API_KEY"] = '你的OpenAI API Key'

# 创建聊天模型
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(temperature=0)

# 设定 AI 的角色和目标
role_template = "你是一个为花店电商公司工作的AI助手, 你的目标是帮助客户根据他们的喜好做出明智的决定"

# CoT 的关键部分,AI 解释推理过程,并加入一些先前的对话示例(Few-Shot Learning)
cot_template = """
作为一个为花店电商公司工作的AI助手,我的目标是帮助客户根据他们的喜好做出明智的决定。 

我会按部就班的思考,先理解客户的需求,然后考虑各种鲜花的涵义,最后根据这个需求,给出我的推荐。
同时,我也会向客户解释我这样推荐的原因。

示例 1:
  人类:我想找一种象征爱情的花。
  AI:首先,我理解你正在寻找一种可以象征爱情的花。在许多文化中,红玫瑰被视为爱情的象征,这是因为它们的红色通常与热情和浓烈的感情联系在一起。因此,考虑到这一点,我会推荐红玫瑰。红玫瑰不仅能够象征爱情,同时也可以传达出强烈的感情,这是你在寻找的。

示例 2:
  人类:我想要一些独特和奇特的花。
  AI:从你的需求中,我理解你想要的是独一无二和引人注目的花朵。兰花是一种非常独特并且颜色鲜艳的花,它们在世界上的许多地方都被视为奢侈品和美的象征。因此,我建议你考虑兰花。选择兰花可以满足你对独特和奇特的要求,而且,兰花的美丽和它们所代表的力量和奢侈也可能会吸引你。
"""
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate, SystemMessagePromptTemplate
system_prompt_role = SystemMessagePromptTemplate.from_template(role_template)
system_prompt_cot = SystemMessagePromptTemplate.from_template(cot_template)

# 用户的询问
human_template = "{human_input}"
human_prompt = HumanMessagePromptTemplate.from_template(human_template)

# 将以上所有信息结合为一个聊天提示
chat_prompt = ChatPromptTemplate.from_messages([system_prompt_role, system_prompt_cot, human_prompt])

prompt = chat_prompt.format_prompt(human_input="我想为我的女朋友购买一些花。她喜欢粉色和紫色。你有什么建议吗?").to_messages()

# 接收用户的询问,返回回答结果
response = llm(prompt)
print(response)
程序中,首先设置环境变量OpenAI的API密钥,以便能够使用OpenAI的GPT-4模型。然后创建聊天模型:通过调用 ChatOpenAI 类,创建了一个聊天模型。设置 temperature=0 可以让模型生成更确定性的回答,即输出更倾向于最可能的结果。

接着定义了AI的角色和目标,该AI为花店电商公司的助手,其目标是根据客户的喜好来提供购买建议。紧接着,定义 CoT 模板,其中包括了AI的角色和目标描述、思考链条以及遵循思考链条的一些示例,显示了AI如何理解问题,并给出建议。

之后,我使用了PromptTemplate的from_template方法,来生成相应的询问模板。其中包括用于指导模型的SystemMessagePromptTemplate和用于传递人类问题的HumanMessagePromptTemplate。

然后,我使用了ChatPromptTemplate.from_messages方法,整合上述定义的角色,CoT模板和用户询问,生成聊天提示。

最后,将生成的聊天提示输入模型中,获得模型的回答,并打印出来。

在Few-Shot CoT提示的指引之下,模型针对我们的问题,从问题中的具体需求出发,返回了不错的建议。

***现在,根据你的需求:你正在寻找你的女朋友喜欢的粉色和紫色的花。***

***首先,我从理解你的需求出发,只会推荐粉色或紫色,或者两者的组合的花。这些可能包括粉色的玫瑰,紫色的兰花,或者是粉色和紫色的花的混合花束。玫瑰是象征爱情和亲情的经典符号,而兰花象征着美丽和力量。这两种花都蕴含很棒的内涵。当然了,无论你选择哪种花卉,重要的是表达出你对她的爱和关心。记得附上一张温馨的贺卡,写下你的真挚祝福。***
  • Tree of Thought

    CoT这种思想,为大模型带来了更好的答案,然而,对于需要探索或预判战略的复杂任务来说,传统或简单的提示技巧是不够的。基于CoT的思想,Yao和Long等人几乎在同一时间在论文《思维之树:使用大型语言模型进行深思熟虑的问题解决》和《大型语言模型指导的思维之树》中,进一步提出了思维树(Tree of Thoughts,ToT)框架,该框架基于思维链提示进行了总结,引导语言模型探索把思维作为中间步骤来解决通用问题。

  • ToT:是一种解决复杂问题的框架,它在需要多步骤推理的任务中,引导语言模型搜索一棵由连贯的语言序列(解决问题的中间步骤)组成的思维树,而不是简单地生成一个答案。

  • ToT框架的核心思想是:让模型生成和评估其思维的能力,并将其与搜索算法(如广度优先搜索和深度优先搜索)结合起来,进行系统性地探索和验证。

    https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/e4403783b997458d9f15fb850a4a4c45~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MjI2NjkzMTY3MDU=:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiNDI4MTk3NjQzMjEwNjUwNiJ9&rk3s=e9ecf3d6&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1731591345&x-orig-sign=Cq%2BoOLCJu6V0l7ykYZIzBxskQGc%3D

    ToT 框架为每个任务定义具体的思维步骤和每个步骤的候选项数量。例如,要解决一个数学推理任务,先把它分解为3个思维步骤,并为每个步骤提出多个方案,并保留最优的5个候选方案。然后在多条思维路径中搜寻最优的解决方案。

    这种方法的优势在于,模型可以通过观察和评估其自身的思维过程,更好地解决问题,而不仅仅是基于输入生成输出。这对于需要深度推理的复杂任务非常有用。此外,通过引入强化学习、集束搜索等技术,可以进一步提高搜索策略的性能,并让模型在解决新问题或面临未知情况时有更好的表现。


下面我们应用ToT的思想,给出一个鲜花运营方面的示例。 假设一个顾客在鲜花网站上询问:“我想为我的妻子购买一束鲜花,但我不确定应该选择哪种鲜花。她喜欢淡雅的颜色和花香。” AI(使用ToT框架):

思维步骤1:理解顾客的需求

顾客想为妻子购买鲜花。

顾客的妻子喜欢淡雅的颜色和花香。

思维步骤2:考虑可能的鲜花选择。

候选1:百合,因为它有淡雅的颜色和花香。

候选2:玫瑰,选择淡粉色或白色,它们通常有花香。

候选3:紫罗兰,它有淡雅的颜色和花香。

候选4:桔梗,它的颜色淡雅但不一定有花香。

候选5:康乃馨,选择淡色系列,它们有淡雅的花香。

思维步骤3:根据顾客的需求筛选最佳选择。

百合和紫罗兰都符合顾客的需求,因为它们都有淡雅的颜色和花香。

淡粉色或白色的玫瑰也是一个不错的选择。

桔梗可能不是最佳选择,因为它可能没有花香。

康乃馨是一个可考虑的选择。

思维步骤4:给出建议。

“考虑到您妻子喜欢淡雅的颜色和花香,我建议您可以选择百合或紫罗兰。淡粉色或白色的玫瑰也是一个很好的选择。希望这些建议能帮助您做出决策!”

这个例子,可以作为FewShot示例之一,传递给模型,让他学着实现ToT。

通过在具体的步骤中产生多条思考路径,ToT 框架为解决复杂问题提供了一种新的方法,这种方法结合了语言模型的生成能力、搜索算法以及强化学习,以达到更好的效果。