提示模板(Prompts)| 豆包MarsCode AI 刷题

7 阅读12分钟

1.提示模板 好的提示(其实也就是好的问题或指示啦),肯定能够让你在调用语言模型的时候事半功倍。具体原则:给予模型清晰明确的指示。让模型慢慢地思考。

2.提示模板的生成方式如下:

导入LangChain中的提示模板

from langchain.prompts import PromptTemplate

创建原始模板

template = """您是一位专业的鲜花店文案撰写员。\n 对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗? """

根据原始模板创建LangChain提示模板

prompt = PromptTemplate.from_template(template)

打印LangChain提示模板的内容

print(prompt)

3.提示模板的具体内容如下: input_variables=['flower_name', 'price'] output_parser=None partial_variables={} template='/\n您是一位专业的鲜花店文案撰写员。 \n对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗?\n' template_format='f-string' validate_template=True

4.在这里,所谓“模板”就是一段描述某种鲜花的文本格式,它是一个 f-string,其中有两个变量 {flower_name} 和 {price} 表示花的名称和价格,这两个值是模板里面的占位符,在实际使用模板生成提示时会被具体的值替换。 代码中的from_template是一个类方法,它允许我们直接从一个字符串模板中创建一个PromptTemplate对象。打印出这个PromptTemplate对象,你可以看到这个对象中的信息包括输入的变量(在这个例子中就是 flower_name 和 price)、输出解析器(这个例子中没有指定)、模板的格式(这个例子中为'f-string')、是否验证模板(这个例子中设置为 True)。 因此PromptTemplate的from_template方法就是将一个原始的模板字符串转化为一个更丰富、更方便操作的PromptTemplate对象,这个对象就是LangChain中的提示模板。LangChain 提供了多个类和函数,也为各种应用场景设计了很多内置模板,使构建和使用提示变得容易。我们下节课还会对提示工程的基本原理和LangChain中的各种提示模板做更深入的讲解。

5.无独有偶,在Open AI的官方文档 GPT 最佳实践中,也给出了和上面这两大原则一脉相承的6大策略。分别是: 写清晰的指示 给模型提供参考(也就是示例) 将复杂任务拆分成子任务 给GPT时间思考 使用外部工具 反复迭代问题

6.提示框架 指令(Instuction)告诉模型这个任务大概要做什么、怎么做,比如如何使用提供的外部信息、如何处理查询以及如何构造输出。这通常是一个提示模板中比较固定的部分。一个常见用例是告诉模型“你是一个有用的XX助手”,这会让他更认真地对待自己的角色。 上下文(Context)则充当模型的额外知识来源。这些信息可以手动插入到提示中,通过矢量数据库检索得来,或通过其他方式(如调用API、计算器等工具)拉入。一个常见的用例时是把从向量数据库查询到的知识作为上下文传递给模型。 提示输入(Prompt Input)通常就是具体的问题或者需要大模型做的具体事情,这个部分和“指令”部分其实也可以合二为一。但是拆分出来成为一个独立的组件,就更加结构化,便于复用模板。这通常是作为变量,在调用模型之前传递给提示模板,以形成具体的提示。 输出指示器(Output Indicator)标记​​要生成的文本的开始。这就像我们小时候的数学考卷,先写一个“解”,就代表你要开始答题了。如果生成 Python 代码,可以使用 “import” 向模型表明它必须开始编写 Python 代码(因为大多数 Python 脚本以import开头)。这部分在我们和ChatGPT对话时往往是可有可无的,当然LangChain中的代理在构建提示模板时,经常性的会用一个“Thought:”(思考)作为引导词,指示模型开始输出自己的推理(Reasoning)。

7.LangChain 提示模板的类型 LangChain中提供String(StringPromptTemplate)和Chat(BaseChatPromptTemplate)两种基本类型的模板,并基于它们构建了不同类型的提示模板: PromptTemplate:String提示模版 ChatPromptTemplate:Chat提示模版,用于组合各种角色的消息模版 FewShotPromptTemplate:少样本提示模版,通过示例展示“教”模型回答 PipelinePrompt:把几个提示组合一起使用 自定义模版

8.使用 PromptTemplate from langchain import PromptTemplate template = """
你是业务咨询顾问。 你给一个销售{product}的电商公司,起一个好的名字? """ prompt = PromptTemplate.from_template(template) print(prompt.format(product="鲜花")) 这个程序的主要功能是生成适用于不同场景的提示,对用户定义的一种产品或服务提供公司命名建议。 在这里,"你是业务咨询顾问。你给一个销售{product}的电商公司,起一个好的名字?" 就是原始提示模板,其中 {product} 是占位符。 然后通过PromptTemplate的from_template方法,我们创建了一个提示模板对象,并通过prompt.format方法将模板中的 {product} 替换为 "鲜花"。

9.使用 ChatPromptTemplate 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?"} LangChain的ChatPromptTemplate这一系列的模板,就是跟着这一系列角色而设计的。

模板的构建

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()

10使用 FewShotPromptTemplate

1. 创建一些示例

samples = [ { "flower_type": "玫瑰", "occasion": "爱情", "ad_copy": "玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。" }, { "flower_type": "康乃馨", "occasion": "母亲节", "ad_copy": "康乃馨代表着母爱的纯洁与伟大,是母亲节赠送给母亲的完美礼物。" }, { "flower_type": "百合", "occasion": "庆祝", "ad_copy": "百合象征着纯洁与高雅,是你庆祝特殊时刻的理想选择。" }, { "flower_type": "向日葵", "occasion": "鼓励", "ad_copy": "向日葵象征着坚韧和乐观,是你鼓励亲朋好友的最好方式。" } ] samples这个列表,它包含了四个字典,每个字典代表了一种花的类型、适合的场合,以及对应的广告文案。 这些示例样本,就是构建FewShotPrompt时,作为例子传递给模型的参考信息。

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

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"] ) 可以看到,FewShotPromptTemplate是一个更复杂的提示模板,它包含了多个示例和一个提示。这种模板可以使用多个示例来指导模型生成对应的输出。

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)

11.CoT(Chain of Thought) 如果生成一系列的中间推理步骤,就能够显著提高大型语言模型进行复杂推理的能力。 CoT的模板设计:

设置环境变量和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)

12.Few-Shot CoT 简单说,就是给出一两个示例,然后在示例中写清楚推导的过程。CoT在一系列的算术、常识和符号推理任务中都提高了性能。在GSM8K数学问题基准测试中,通过CoT指导后,大模型的表现可以达到当时最先进的准确性。 问题理解:首先,AI需要理解用户的需求。例如,用户可能会说:“今天要参加朋友的生日Party,想送束花祝福她。”我们可以给AI一个提示模板,里面包含示例:“遇到XX问题,我先看自己有没有相关知识,有的话,就提供答案;没有,就调用工具搜索,有了知识后再试图解决。”—— 这就是给了AI一个思维链的示例。
信息搜索:接下来,AI需要搜索相关信息。例如,它可能需要查找哪些花最适合生日派对。
决策制定:基于收集到的信息,AI需要制定一个决策。我们可以通过思维链让他详细思考决策的流程,先做什么后做什么。例如,我们可以给它一个示例:“遇到生日派对送花的情况,我先考虑用户的需求,然后查看鲜花的库存,最后决定推荐一些玫瑰和百合,因为这些花通常适合生日派对。”—— 那么有了生日派对这个场景做示例,大模型就能把类似的思维流程运用到其它场景。
生成销售列表:最后,AI使用OutputParser生成一个销售列表,包括推荐的花和价格。 在这个过程中,整体上,思维链引导AI从理解问题,到搜索信息,再到制定决策,最后生成销售列表。这种方法不仅使AI的推理过程更加清晰,也使得生成的销售列表更加符合用户的需求。具体到每一个步骤,也可以通过思维链来设计更为详细的提示模板,来引导模型每一步的思考都遵循清晰准确的逻辑。

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

14.Tree of Thought ToT是一种解决复杂问题的框架,它在需要多步骤推理的任务中,引导语言模型搜索一棵由连贯的语言序列(解决问题的中间步骤)组成的思维树,而不是简单地生成一个答案。ToT框架的核心思想是:让模型生成和评估其思维的能力,并将其与搜索算法(如广度优先搜索和深度优先搜索)结合起来,进行系统性地探索和验证。 ToT 框架为每个任务定义具体的思维步骤和每个步骤的候选项数量。例如,要解决一个数学推理任务,先把它分解为3个思维步骤,并为每个步骤提出多个方案,并保留最优的5个候选方案。然后在多条思维路径中搜寻最优的解决方案。 这种方法的优势在于,模型可以通过观察和评估其自身的思维过程,更好地解决问题,而不仅仅是基于输入生成输出。这对于需要深度推理的复杂任务非常有用。此外,通过引入强化学习、集束搜索等技术,可以进一步提高搜索策略的性能,并让模型在解决新问题或面临未知情况时有更好的表现。