AI训练营prompt工程学习心得 | 豆包MarsCode AI刷题

162 阅读5分钟

这是新的学科

prompt工程可以让ai回答地更精确,对专业问题也能step by step有逻辑地推理 这就需要我们给出好的引导。接下来用易速鲜花商城作为例子,来详细探究ai的思维链(chain of thought) , 思维树(tree of thought

💡在实践之前,我们应该看看提示的框架

image.png

  • 给大模型命令(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章节会有更深入的理解。