这是新的学科
prompt工程可以让ai回答地更精确,对专业问题也能step by step有逻辑地推理 这就需要我们给出好的引导。接下来用易速鲜花商城作为例子,来详细探究ai的思维链(chain of thought) , 思维树(tree of thought)
💡在实践之前,我们应该看看提示的框架
- 给大模型命令(Instruction),给出回答的形式,做什么,怎么做,让AI认真回答
- 给大模型文本(Context),作为补充信息.我们将做的OA系统也是基于此,通过Loading--Splitting--Storage--Retrieval -- output 这套流程实现拆分存储信息
- 最重要的问题本身,给大模型具体提示(prompt input),与Instruction拆开来,更具有结构化
template 结构化模板输出的一个实例
在提示工程中,我们可以创建一些模板优化我们的对话
比如,
请你模拟三位出色、逻辑性强的专家合作回答一个问题。每个人都详细地解释他们的思考过程,考虑到其他人之前的解释,并公开承认错误。在每一步,只要可能,每位专家都会在其他人的思考基础上进行完善和建设,并承认他们的贡献。他们继续,直到对问题有一个明确的答案。为了清晰起见,您的整个回应应该是一个Markdown表格。 问题是...
你是个很棒的智能助手,你在这个项目构建里需要帮助我们完成...
PromptTemplate
在下面的示例中我们展示了 prompt占位符的用法
from langchain import PromptTemplate
template = """\
你是业务咨询顾问。
你给一个销售{product}的电商公司,起一个好的名字?
"""
prompt = PromptTemplate.from_template(template)
print(prompt.format(product="鲜花"))
ChatPromptTemplate
大模型另一个令人惊喜的是,它拥有学习示例的能力,给出sample,可以让AI生成。这样的提供样本的称为few-shot学习。 示例:
#1 样本
samples = [ { "flower_type": "玫瑰", "occasion": "爱情", "ad_copy": "玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。" }, { "flower_type": "康乃馨", "occasion": "母亲节", "ad_copy": "康乃馨代表着母爱的纯洁与伟大,是母亲节赠送给母亲的完美礼物。" }]
# 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]))
# 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="爱情"))
# 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)
这样我们传入鲜花类型和场景,就能生成一段文案。
COT和TOT
两种COT
对COT的概念理解给AI推理过程,会得到更好的回答,拿鲜花商城的例子,整体上,思维链引导AI从理解问题,到搜索信息,再到制定决策,最后生成销售列表。这种方法不仅使AI的推理过程更加清晰,也使得生成的销售列表更加符合用户的需求。具体到每一个步骤,也可以通过思维链来设计更为详细的提示模板,来引导模型每一步的思考都遵循清晰准确的逻辑。
其中 Few-Shot COT 就是一种在带有示例的提示中,加入思考推理过程来得到更好的回答。
那么Zero-Shot COT呢,就是直接告诉ai要step by step思考,没有示例。
# 设置环境变量和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助手,我的目标是帮助客户根据他们的喜好做出明智的决定。
我会按部就班的思考,先理解客户的需求,然后考虑各种鲜花的涵义,最后根据这个需求,给出我的推荐。
同时,我也会向客户解释我这样推荐的原因。
"""
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)
上面的实践中,cot_template 设定了AI的角色,告诉它要按部就班的思考,也就是给出COT。这里是zero-shot COT,如果要变成Few-Shot COT 可以添加一些示例,比如 玫瑰的含义是浪漫,根据婚礼场景我会推荐玫瑰捧花,原因是......
TOT
可以不那么严谨地将TOT看作是很多思维链地集合,从中选取最优方案的算法。通过在具体的步骤中产生多条思考路径,ToT 框架为解决复杂问题提供了一种新的方法,这种方法结合了语言模型的生成能力、搜索算法以及强化学习,以达到更好的效果。
总结
我们用几个示例来展示如何做一个prompt template,了解了如何通过思维链,思维树的方式来让AI写出思考推理过程,回答更聪明。就像开头所言,提示工程是新技术,在不同场景有不同提示模板。比如MarsCode的AI回答问题时肯定先看了已写代码,题库在它的知识库中,这在接下来的Memory章节会有更深入的理解。