解锁AI潜能:万字详解大语言模型提示工程的终极指南
解锁AI潜能:万字详解大语言模型提示工程的终极指南
简介
提示工程主要应用于为大模型开发和优化提示词(Prompt),通过提示词优化提升大语言模型处理复杂任务场景的能力。本文主要介绍当前提示工程(Prompt Engineering)领域的一些基础知识,当前有哪些主流的提示工程技术,以及设计提示词的一些通用技巧。最后,本文会分享一个实际工作中短信拦截的prompt调优工作。 你离prompt工程师只差这份指南 (本文标题就是大模型取的)
提示工程是什么
大模型提示工程(Prompt Engineering)是指为大规模预训练语言模型(如GPT-4)设计和优化输入提示(prompts)以获得所需输出的过程。这个过程涉及理解模型的行为和能力,编写有效的提示,调整和优化提示以提高模型的响应质量和准确性。
它通过特定任务的指令,即提示,提升模型效能,无需更改模型核心参数。这些提示能够通过给定的指令直接引导预训练模型完成下游任务,从而实现模型行为的精确调控
提示词要素
明确意图:始终清楚地传达最重要的内容或信息。
构建提示词:首先定义其角色,提供上下文 / 输入数据,然后给出具体指令。
参照例子:为模型提供具体的、多样化的例子,帮助它产生更准确的结果。
限制输出范围:使用限制条件确保模型的输出与指令紧密相关。
任务分解:对于复杂任务,将其分解成一系列更简单的提示词。
质量监控:指导模型在生成响应之前对其进行评估或自检。
逐步思考:针对复杂问题,引导模型按照逐步的逻辑推理输出结果。
关键要点:充分发挥创意,开放思考,随着技术的发展,不断适应和调整。
当前提示工程技术
零样本提示
零样本提示技术标志着在利用大型语言模型方面的一大进步。这种方法(Radford 等人,2019)允许我们在没有大量训练数据的情况下,通过精心设计的提示来引导模型完成新的任务。具体来说,模型通过提示获得任务描述,但没有特定任务的标注数据进行训练。模型依靠已有的知识,根据提示来为新任务做出预测。
提示词:
输出:
该方案可以完成任务,但是输出格式可能并不是如我们所想,如我们可能只想输出:“中性”
少样本提示
虽然大型语言模型展示了惊人的零样本能力,但在使用零样本设置时,它们在更复杂的任务上仍然表现不佳。少样本提示可以作为一种技术,以启用上下文学习,我们在提示中提供示例以引导模型实现更好的推理
提示词:
输出:
通过提供少量样本提示,可以引导模型更好的按我们所想输出
逻辑推理提示
如下的逻辑推理技术最新大模型已经通过训练示例和系统提示词等方式加入到了大模型中,来帮助大模型更好的模拟人类思维过程,所以badcase已经不生效
链式思考(CoT)提示
大语言模型在处理复杂的推理任务时往往遇到困难,这限制了它们的发挥潜力。为了解决这一问题,Wei 等人在 2022 年提出了一种名为链式推理引导(CoT)的新技术,旨在通过特定的提示方式促进大语言模型进行连贯且逐步的推理。研究者证明了链式推理引导技术的独特价值,特别是它在引导模型进行逻辑推理过程中的能力,使得模型能够更深入地理解问题。举个例子,这种提示方式能够详细展示解决复杂数学问题的逻辑推理步骤,类似于人类解题时的思维过程。应用这种技术,研究者们在 PaLM 540B 上针对数学和常识推理的测试中取得了前所未有的准确率,高达 90.2%。
提示词:
输出:
通过告知大模型推理流程,让大模型按照流程进行思考。可以帮助大模型解决推理任务。但是手写的会不够鲁棒,故有了如下的自动链式推理
自动化链式推理引导提示
手动创建高质量的链式推理示例既费时又效率不高。因此,Zhang 等人在 2022 年提出了一种自动化链式推理引导(Auto-CoT)技术,它通过自动生成“让我们一步一步来思考”这类提示,帮助大语言模型构建推理链。这种方法特别注意到单个推理链可能出现的错误,通过多样化采样来增加鲁棒性。它针对不同的问题生成多种独特的推理链,组合成最终的示例集,这种自动化的多样化采样方法有效减少了错误,提高了少量样本学习的效率,避免了手动创建推理链的繁重工作。使用这种技术,研究者们在 GPT-3 上进行的算术和符号推理任务测试中,相比传统的链式推理引导技术,平均准确率分别提高了 1.33% 和 1.5%。
提示词:
输出:
自我一致性
自我一致性是提示工程中更高级的技术之一。由 Wang等人(2022) 提出,自我一致性旨在“替换链式思维提示中使用的天真贪婪解码方法”。其想法是通过少样本 CoT 采样多个不同的推理路径,并使用生成结果选择最一致的答案。这有助于提高 CoT 提示在涉及算术和常识推理的任务中的性能。
提示词:
输出:
思维树(TOT)
对于需要探索或预判战略的复杂任务来说,传统或简单的提示技巧是不够的。最近,Yao et el. (2023) 提出了思维树(Tree of Thoughts,ToT)框架,该框架基于思维链提示进行了总结,引导语言模型探索把思维作为中间步骤来解决通用问题。
ToT 维护着一棵思维树,思维由连贯的语言序列表示,这个序列就是解决问题的中间步骤。使用这种方法,LM 能够自己对严谨推理过程的中间思维进行评估。LM 将生成及评估思维的能力与搜索算法(如广度优先搜索和深度优先搜索)相结合,在系统性探索思维的时候可以向前验证和回溯。
提示词可以概况如下:
链式提示
为了提高大语言模型的性能使其更可靠,一个重要的提示工程技术是将任务分解为许多子任务。 确定子任务后,将子任务的提示词提供给语言模型,得到的结果作为新的提示词的一部分。 这就是所谓的链式提示(prompt chaining),一个任务被分解为多个子任务,根据子任务创建一系列提示操作。
链式提示可以完成很复杂的任务。LLM 可能无法仅用一个非常详细的提示完成这些任务。在链式提示中,提示链对生成的回应执行转换或其他处理,直到达到期望结果。
除了提高性能,链式提示还有助于提高 LLM 应用的透明度,增加控制性和可靠性。这意味着您可以更容易地定位模型中的问题,分析并改进需要提高的不同阶段的性能。
如何链式提示:
- 确定子任务:将您的任务分解为不同的、连续的步骤。
- 使用 XML 结构实现清晰的交接:使用 XML 标签在提示之间传递输出。
- 有一个单一任务目标:每个子任务都应该有一个单一、明确的目标。
- 迭代:根据 gpt 的表现细化子任务。
角色 | 内容 |
---|---|
用户 | 总结这篇医学研究论文。{{RESEARCH_PAPER}} 重点关注方法论、发现和临床意义。 |
助理 | {{SUMMARY}} 方法:对 500 名 2 型糖尿病患者进行双盲 RCT。A 组(n=250)接受新型 GLP-1/GIP 双激动剂治疗;B 组(n=250)接受标准 GLP-1 激动剂治疗。24 周试验,主要终点:HbA1c 降低。 结果: - A 组:平均 HbA1c 降低 1.8% - B 组:平均 HbA1c 降低 1.1% - A 组 68% 对比 B 组 52% 的受试者达到 HbA1c <7% - A 组:平均体重减轻 5.2 公斤 - B 组:平均体重减轻 3.1 公斤 安全性:不良事件情况相似,没有归因于治疗的严重事件。 临床意义:与标准疗法相比,双激动剂表现出更好的血糖控制和减肥效果。可能会改变游戏规则,尤其是对于肥胖糖尿病患者。 |
检索增强生成(RAG)
通用语言模型通过微调就可以完成几类常见任务,比如分析情绪和识别命名实体。这些任务不需要额外的背景知识就可以完成。
要完成更复杂和知识密集型的任务,可以基于语言模型构建一个系统,访问外部知识源来做到。这样的实现与事实更加一性,生成的答案更可靠,还有助于缓解“幻觉”问题。
Meta AI 的研究人员引入了一种叫做检索增强生成(Retrieval Augmented Generation,RAG)的方法来完成这类知识密集型的任务。RAG 把一个信息检索组件和文本生成模型结合在一起。RAG 可以微调,其内部知识的修改方式很高效,不需要对整个模型进行重新训练。
RAG 会接受输入并检索出一组相关/支撑的文档,并给出文档的来源(例如维基百科)。这些文档作为上下文和输入的原始提示词组合,送给文本生成器得到最终的输出。这样 RAG 更加适应事实会随时间变化的情况。这非常有用,因为 LLM 的参数化知识是静态的。RAG 让语言模型不用重新训练就能够获取最新的信息,基于检索生成产生可靠的输出。
如下是一个常见的qa提示词:
1 | qa_prompt_tmpl_str = ( |
ReAct 提示技术
ReAct 框架,全称为 “Reasoning and Acting”(推理与行动)框架,是一种用于增强语言模型在复杂任务中的表现的方法。该框架结合了链式思维(Chain of Thought, CoT)和交互式行动(Interactive Action),使模型不仅能够逐步推理问题,还能够在推理过程中与外部环境进行交互,以获取更多信息来解决问题。
ReAct 框架的核心理念是将推理和行动结合起来,使模型在面对复杂任务时能够更加灵活和高效地处理问题。具体来说,ReAct 框架包括以下几个关键部分:
-
推理(Reasoning):模型在面对问题时,首先进行内部推理,逐步分解问题并尝试得出初步结论。这部分类似于链式思维(CoT),通过逐步推理来解决问题。
-
行动(Acting):在推理过程中,如果模型需要更多信息或需要与外部系统交互(如查询数据库、调用API等),它可以采取行动来获取所需的信息。这部分使得模型能够动态地获取外部资源,以辅助推理过程。
-
反馈循环(Feedback Loop):模型在采取行动后,会根据获取到的新信息继续推理,调整和完善之前的结论。这个反馈循环可以持续进行,直到模型得出最终答案。
通过结合推理和行动,ReAct 框架使得语言模型在处理复杂任务时更加灵活和高效。以下是一个简单的示例,展示了 ReAct 框架的工作流程:
示例:
假设用户问模型一个需要外部信息的问题:
用户输入:
“请告诉我2024年奥运会的举办城市。”
模型输出(推理):
“我需要查询2024年奥运会的举办城市。”
模型行动:
模型调用外部API或数据库,查询2024年奥运会的举办城市。
模型输出(获取信息后继续推理):
“根据查询结果,2024年奥运会的举办城市是巴黎。”
最终输出:
“2024年奥运会的举办城市是巴黎。”
通过这种方式,ReAct 框架使得模型能够在推理过程中动态地获取外部信息,从而提高回答的准确性和全面性。这种框架特别适用于需要多步推理和外部信息获取的复杂任务。
当前使用最多的是大模型支持的function_call方式,来提供外部函数调用
提示工程评估指标
优化提示词之后,我们需要考虑如何评估提示词的效果。
首先,我们可以从以下几个方面来检查回答效果:
- 生成的文本是否真正抓住了问题的本质?
- 回答中是否包含了额外的信息?
- 回答是字面上的还是经过解释的?
- 回答有多具信息性?它是否客观?
- 回答中是否有引用或证据(如URL)来证明答案与问题相符?
对于文本生成类评估,我们通常采用BLEU(双语评估替代)和ROUGE(面向召回的摘要评估替代)等度量标准。它们主要设计用于评估机器生成文本的质量,如翻译或摘要。虽然它们可以提供一些关于答案质量的洞察,但它们并不是专门为评估问答系统设计的。然而,它们仍然可以作为粗略评估的参考指标。
-
BLEU(双语评估替代):BLEU通常用于评估机器翻译输出的质量,通过将其与一个或多个人工参考翻译进行比较。它根据n元组精度计算得分,其中n元组是n个单词的序列。BLEU评估生成文本与参考文本之间的n元组重叠情况,奖励完全匹配和部分匹配。较高的BLEU得分表明与参考文本的相似度更高。
将BLEU应用于评估问答时,需要将生成的答案视为对问题的翻译。你需要将问题视为参考文本,并使用BLEU将其与生成的答案进行比较。然而,这种方法可能无法捕捉答案对问题的具体细微差别和适当性。
-
ROUGE(面向召回的摘要评估替代):ROUGE通常用于评估摘要系统的质量,通过将生成的摘要与一个或多个人工参考摘要进行比较。它基于重叠单位(如n元组、词序列和跳跃二元组)计算召回得分。ROUGE评估生成摘要与参考摘要相比的重要信息覆盖情况。
要使用ROUGE评估答案,需要将生成的答案视为问题的摘要,并使用ROUGE得分将其与人工参考摘要进行比较。然而,与BLEU相似,ROUGE可能无法完全捕捉答案的相关性和准确性。
对于文本分类等任务,我们可以直接使用准确率,F1等指标直观的评判效果
提示工程技术总览
以下通过一个表格展示当前主流的提示工程技术,以及其适用场景,数据集和评价指标
应用场景 | 提示策略 | 比较维度 | 提示获取方式 | 使用的语言模型 | 数据集 | 评价指标 |
---|---|---|---|---|---|---|
面向无训练数据的新任务 | 零样本学习 | 人工制定 | 单一 | GPT-2 | 算术题和符号处理 | 准确度和 ROUGE 得分 |
少样本学习 | 人工制定 | 单一 | GPT-3 | 自然语言问题解答、网络问题搜索、趣味问答 | 准确度 | |
链式推理 (CoT) | 人工制定 | 多样 | PaLM 540B | GSM8K 数学题 | 准确度 | |
逻辑链式推理 (LogiCoT) | 人工制定 | 多样 | Vicuna-33b, GPT-4 | GSM8K 数学题、AQuA、社交问答 | 准确度 | |
上下文串联 (CoS) | 人工制定 | 多样 | gpt-3.5-turbo, GPT-4 | SPARTUN 多项选择题 | 准确度、精确度、召回率 | |
自动生成的链式推理 (Auto-CoT) | 模型生成 | 多样 | GPT-3 | 算术题和符号处理 | 准确度 | |
自我一致性校验 | 人工制定 | 单一 | PaLM 540B | 算术题和常识问题 | 准确度 | |
推理和逻辑能力 | 话题转换 (ToT) | 基于信息检索 | 多样 | GPT-4 | 24 点游戏、创意写作挑战 | 成功率 |
生成式话题转换 (GoT) | 基于信息检索 | 多样 | T5-large | GSM8K 科学问题、ScienceQA | ROUGE 得分 | |
答案到问题 (S2A) | 人工制定 | 单一 | Llama 2-70B | 问答、GSM8K 数学题 | 准确度 | |
混合话题转换 (ThoT) | 混合方法 | 多样 | gpt-3.5-turbo, Llama 2-70b-chat | 流行文化问答、实体查询、多项选择推理 | 精确匹配得分 | |
表格链 (Chain of Table) | 人工制定 | 多样 | GPT 3.5, LLaMA 2 | TabFact 事实验证、WikiTQ 维基问答 | BLEU 得分、ROUGE 得分 | |
上下文验证 (CoVe) | 基于信息检索 | 多样 | Llama 65B | Wikidata 数据、QUEST 问题集、MultiSpanQA 多答案问题 | 精确度、F1 得分 | |
实时反馈 (ReAct) | 基于信息检索 | 多样 | PaLM-540B, GPT-3 | HotpotQA 热门问题、FEVER 事实验证 | 精确匹配得分、准确度 | |
减少错误信息生成 | 检索增强生成 (RAG) | 基于信息检索 | 单一 | RAG-Token, RAG-Seq | MSMARCO 信息搜索、SearchQA 问题搜索 | ROUGE 得分、BLEU 得分 |
一致性校验 (CoN) | 模型生成 | 多样 | Llama 2, DPR | NQ 自然问答、TriviaQA 趣味问答、WebQ 网络问题 | 精确匹配得分、F1 得分 | |
用户交互 | 积极引导 | 人工操作 | 单项任务 | code-davinci-002, text-davinci-003 | 算术计算、常识判断、符号操作 | 评价不一、熵差异、自我评估得分 |
微调和优化 | 自适应性能提升 | 模型自生成 | 单项任务 | text-curie-001, text-davanci-002 | 逻辑推理、真实性问答 | 执行准确度、概率估计、效率评分 |
基于知识的推理与创新 | 艺术智能 | 混合模式 | 多任务处理 | GPT-3 (175B) | 复杂问题挑战、多模块学习 | 准确度 |
提升逻辑一致性和表达连贯性 | 连贯一致性训练 | 模型自生成 | 多任务处理 | gpt-3.5-turbo-0301 | 数学问题、实际问题问答 | 准确度 |
情绪与语调管理 | 情绪引导 | 人工操作 | 单项任务 | GPT-4 | 挑战基准、指令学习 | 准确度 |
社会认知训练 | 混合模式 | 多任务处理 | ChatGPT, Codex | 编程评估、多种编程问题 | 通过率@k | |
代码生成与执行 | 实践操作训练 | 人工操作 | 单项任务 | gpt-3.5-turbo | 数学解题、财经问答 | 精确匹配得分 |
共同创造 | 人工操作 | 单项任务 | text-davinci-003, gpt-3.5-turbo | 高难度挑战 | 准确度 | |
思维导图提示 | 人工操作 | 单项任务 | GPT-3 | 编程问题、增强学习 | 准确度 | |
优化与效率提升 | 操作性能优化 | 人工操作 | 单项任务 | PaLM 2-L-IT, text-bison | 高难度问题解答、挑战基准 | 准确度 |
理解用户意图 | 反馈调整响应 | 人工操作 | 单项任务 | GPT-4-0613 | 知识问答、符号操作 | 准确度、公平性评价、语言建模得分 |
自我认知与反思 | 暂停反思 | 人工操作 | 单项任务 | PaLM2-L, GPT-4 | 物理学习、化学学习、时间问题解答、情境问题、策略问题 | 准确度 |
日常提示使用技巧
1. 使用元提示词(Metaprompt)自动生成prompt
对于gpt4,可以使用元提示词,先输入元提示词,让大模型按这个提示词去组织你的需求,元提示词如下:
1 | 你是一个prompt工程师,我会给你我的需求,需要你帮我组织好prompt,以便我向chatgpt寻求高效的回答; |
在输入元提示词之后,我再如下问询chatgpt
1 | 请帮我对用户短信进行分类,分为普通短信和垃圾短信,在此基础上,再分类为财务、订单、提醒、验证码、电信运营商、公共服务、优惠券、其他。以下是一个示例: |
chatgpt则一步步思考并给出了一个最终可用的prompt
1 | 好的,根据你的需求,我们可以将问题分解为以下几个步骤: |
2. 保持清晰和直接
- 给gpt提供上下文信息: 就像你在了解更多背景后可能会更好地完成任务一样,gpt在拥有更多上下文信息时表现会更好。一些上下文信息的例子:
- 任务结果将用于什么
- 输出面向的受众是谁
- 任务属于哪个工作流程,以及这个任务在工作流程中的位置
- 任务的最终目标,或成功完成任务的样子
- 具体说明你希望gpt做什么: 例如,如果你只想让gpt输出代码而不是其他内容,就明确说明。
- 以连续步骤提供指示: 使用编号列表或项目符号,以更好地确保gpt按照你想要的方式执行任务。
角色 | 无示例 | 有示例 |
---|---|---|
用户 | 请从这些客户反馈信息中删除所有个人身份信息:{{FEEDBACK_DATA}} |
你的任务是为我们的季度审查匿名化客户反馈。 指示: 1. 将所有客户姓名替换为"CUSTOMER_[ID]“(例如,“Jane Doe” → “CUSTOMER_001”)。 2. 将电子邮件地址替换为"EMAIL_[ID]@example.com”。 3. 将电话号码编辑为"PHONE_[ID]"。 4. 如果消息提到特定产品(例如”AcmeCloud”),保持不变。 5. 如果没有发现个人身份信息,逐字复制消息。 6. 只输出处理过的消息,用”—“分隔。 要处理的数据: {{FEEDBACK_DATA}} |
3. 使用示例提示
通过在提示中提供一些精心制作的示例,您可以显著提高大模型输出的准确性、一致性和质量。 这种技术被称为少样本或多次提示,对于需要结构化输出或遵循特定格式的任务特别有效。
角色 | 无示例 | 有示例 |
---|---|---|
用户 | 分析这个客户反馈并对问题进行分类。使用这些类别:UI/UX、性能、功能请求、集成、定价和其他。同时评估情感(积极/中性/消极)和优先级(高/中/低)。 以下是反馈: {{FEEDBACK}} |
我们的客户服务团队被非结构化的反馈淹没了。您的任务是分析反馈并为我们的产品和工程团队对问题进行分类。使用这些类别:UI/UX、性能、功能请求、集成、定价和其他。同时评估情感(积极/中性/消极)和优先级(高/中/低)。这里有一个例子: 输入:新的仪表板一团糟!加载需要很长时间,而且我找不到导出按钮。尽快修复这个问题! 类别:UI/UX、性能 情感:消极 优先级:高 现在,分析这个反馈: {{FEEDBACK}} |
4. 让模型思考(COT)
使用思维链技术让大模型进行思考
- 在你的提示中包含”逐步思考”、 “Let’s think step by step”
- 引导式提示:给出在思考过程中要遵循的具体步骤
- 结构化引导提示:使用 XML 标签如
和 来分离推理和最终答案。
角色 | 逐步思考 | 引导提示 | 结构化引导提示 |
---|---|---|---|
用户 | 起草个性化邮件给捐赠者,请求他们为今年的关爱儿童计划捐款。 计划信息: {{PROGRAM_DETAILS}} 捐赠者信息: {{DONOR_DETAILS}} 在撰写邮件之前逐步思考。 |
起草个性化邮件给捐赠者,请求他们为今年的关爱儿童计划捐款。 计划信息: {{PROGRAM_DETAILS}} 捐赠者信息: {{DONOR_DETAILS}} 在撰写邮件之前思考。首先,考虑根据这位捐赠者的捐赠历史和他们过去支持的活动,什么信息可能吸引他们。然后,考虑关爱儿童计划的哪些方面会吸引他们,考虑他们的历史。最后,使用你的分析撰写个性化的捐赠者邮件。 |
起草个性化邮件给捐赠者,请求他们为今年的关爱儿童计划捐款。 计划信息: {{PROGRAM_DETAILS}} 捐赠者信息: {{DONOR_DETAILS}} 在撰写邮件之前在 |
5. 使用多种标签
当你的提示涉及多个组件,如上下文、指令和示例时,XML标签或者makdrown标签可以成为游戏规则的改变者。它们帮助大模型更准确地解析你的提示,从而产生更高质量的输出。
- **结构化:**显示的指明提示词的各个部分:指令、上下文、输入数据、输出指示
- **清晰度:**清晰地分隔提示的不同部分,确保你的提示结构良好。
- **准确性:**减少由大模型误解提示部分而导致的错误。
- **灵活性:**轻松找到、添加、删除或修改提示的部分,而无需重写所有内容。
- **可解析性:**让大模型在其输出中使用标签,使得通过后处理更容易提取其响应的特定部分。
常见标签有:
- 三重引号: “”"
- 三重反引号: ```
- 三重破折号: —
- 尖括号: <>
- XML标签:
- markdown表格格式
- 结构化分隔符:
#
、##
、- 无序列表
- 强调符号
**加粗强调**
如下提供几个使用标签的样例:
- 使用结构化分隔符
如下是kimi的诗歌创作的预填prompt
1 | 【📖 诗意创作】 现代诗、五言/七言诗词信手拈来的诗歌创作助手 |
- 使用xml标签来生成prompt
关键指令数据使用xml标签包含起来
1 | 你是AcmeCorp的财务分析师。为我们的投资者生成Q2财务报告。 |
- 使用markdown格式来编写prompt
1 | # 短信分类器 |
使用提示词框架
TRACE 框架是一个用于创建和组织与 ChatGPT 交互的方法,它将交互细分为五个核心部分,以确保清晰、有目的的通信。这五个核心部分包括:
- 任务 (Task): 定义要解决的特定任务或问题。
- 请求 (Request): 明确您想要 ChatGPT 完成的具体请求。
- 操作 (Action): 描述应采取的步骤或操作来完成任务或请求。
- 上下文 (Context): 提供与请求相关的背景信息或上下文。
- 示例 (Example): 提供一个或多个示例,以帮助 ChatGPT 理解您的请求和期望的结果。
以下是一个示例:
1 | 假设您是一个项目经理,希望从 ChatGPT 那里获得有关如何更有效地管理项目时间的建议。 |
给大模型赋予(专家)角色
使用大模型时,您可以通过使用参数system赋予其角色来显著提高其性能。这种技术称为角色提示,是使用大模型进行系统提示的最有效方式。
正确的角色可以将大模型从普通助理转变为您的虚拟领域专家!除了可以在system中添加角色,也可以在prompt里面直接添加角色。
如元提示词中,使用
1 | 你是一个prompt工程师,你······ |
在翻译场景中,一般也是将其设置成专家
1 | 你是一位精通简体中文的专业翻译,曾参与《纽约时报》和《经济学人》中文版的翻译工作,因此对于新闻和时事文章的翻译有深入的理解。我希望你能帮我将以下英文新闻段落翻译成中文,风格与上述杂志的中文版相似。 |
长上下文场景设置提示技巧
当prompt需要塞入较多数据的时候,可以按如下技巧整理提示词:
- 将长篇数据放在顶部:将您的长文档和输入(约20K+令牌)放在提示的顶部,位于查询、指令和示例之上。这可以显著提高模型的性能
- 使用XML标签构建文档内容和元数据:使用多个文档时,用
标签包裹每个文档,并使用<document_content>和 (以及其他元数据)子标签以提高清晰度。 - 引用相关内容作为回答依据:对于长文档任务,要求Claude在执行任务之前先引用文档中的相关部分。这有助于Claude从文档内容的”噪音”中筛选出重要信息
如下是一个示例:
1 | 您是一位AI医生助手。您的任务是帮助医生诊断可能的患者疾病。 |
要求模型格式化输出
可以指定模型以json格式输出,方便后续处理
1 | 生成一个包含三个虚构书名以及它们的作者和类型的列表。 |
输出如下:
1 | [ |
设置兜底策略
在很多领域,当大模型不理解的时候,可以显示让大模型兜底输出
1 | 请你扮演一个专业的解释器,用通俗易懂的语言解释用户输入的内容。如果你不理解用户输入的内容,请输出:“未知”两个字,不要包含任何标点符号。请按照以下步骤进行: |
提示缓存(Prompt Cache)
Anthropic模型支持了提示缓存技术,它允许从提示中的特定前缀恢复,从而优化您的 API 使用。这种方法可显著减少重复任务或具有一致元素的提示的处理时间和成本。
您发送启用了“提示缓存”的请求时:
- 系统检查提示前缀是否已从最近的查询中缓存。
- 如果找到,它会使用缓存版本,从而减少处理时间和成本。
- 否则,它将处理完整的提示并缓存前缀以供将来使用。
这对于以下情况尤其有用:
- 带有大量示例的提示
- 大量上下文或背景信息
- 重复任务并遵循一致的指令
- 长时间多轮对话
提示词自动优化框架
为了让提示词能能够自动优化,研究人员提出了多种automatic prompt engineering框架:APE、APO、OPRO、PE2、LongPO、BPO、EVOPROMPT、PromptAgent等。通常框架包括如下步骤:
- 给定一个训练集
- 定义好评价指标
- 运行automatic prompt engineering框架
然后就能自动取得最佳效果的prompt。
其中谷歌通过OPRO找到了更好的一句:Take a deep breath and work on this problem step-by-step
,让GSM8K的结果直接从71.8% -> 80.2%。
APE(候选集选择和重采样)
APE的核心思路是:从候选集中选出好的prompt,再在好的prompt附近进行试探性地搜索。
APE包括三个步骤:
-
**candidate:**使用llm生成prompt候选集。通常是提供一些任务examples,让LLM在最后生成prompt。
-
**selection:**在训练集上打分,并保留高分prompt
打分方式有两种:
- Execution accuracy。在训练集上执行prompt后,得到的任务metric(如Accuracy、F1等)
- Log probability。不使用任务metric,而是评估生成desired answer的概率
实验表明,Execution accuracy的效果更好。
另外,这一步如果在全量训练集上评估,则开销非常大,因此作者提出一种multi-stage策略。大致思想是先在少量subset上评估,然后过滤掉比较差的,循环这一过程直到候选集足够小,此时再在全量训练集上进行评价、挑选。
-
**resample:**在高分prompt附近进行采样,模拟Monte-Carlo Search过程
这一步核心是尝试性地resample,生成语义相似的prompt,看看能否取得更好的效果。这一过程是可迭代的。
resample的工作仍然交由LLM
APO(文本空间梯度下降)
APO框架就是在文本空间实现gradient descent过程。

- 得到当前prompt的“gradient”: 给定一批error samples(当前prompt无法预测正确的),让LLM给出当前prompt预测错误的原因,这一原因即文本形式的“gradient”
- 应用“gradient”,得到new prompt: 使用LLM来edit原来的prompt,目标是修复“gradient”。另外再进行resample,扩充相似语义的prompt。
- 挑选出好的prompt,进入下一轮迭代。
OPRO(LLM优化器)
OPRO的核心思路是让LLM基于过往的迭代记录、优化目标,自己总结规律,逐步迭代prompt,整个过程在文本空间上完成。
OPRO框架如下。
- 使用meta-prompt,让LLM成为Optimizer LLM。meta-prompt包含两个核心部分:一个是solution-score pairs,即以往的迭代路径,包括solution(即prompt) + 分数(任务表现),实践中按照分数大小,从低到高排列top20的结果;另一个是task description,包含一些任务的examples、优化的目标等
- 基于对过往迭代规律的理解,Optimizer LLM生成新的solution。即将meta-prompt给到Optimizer LLM,生成的内容即为新的solution。在实践中,为了提升优化的稳定性,这一步重复了8次。
- 在Scorer LLM上应用prompt(即新的solution),评估效果并记录到meta-prompt中,然后继续下一轮迭代。注意,这里的Scorer LLM是实际使用prompt的LLM,与Optimizer LLM可以是不同的。
- 当效果无法再提升、或者到达预先给定的step上限,整个迭代过程停止。返回得分最高的prompt作为优化结果。
参考
- Claude.提示工程概述 https://docs.anthropic.com/zh-CN/docs/build-with-claude/prompt-engineering/overview
- Claude.提示库 https://docs.anthropic.com/zh-CN/prompt-library/review-classifier
- ChatGPT 中文调教指南 https://github.com/PlexPt/awesome-chatgpt-prompts-zh
- 大语言模型提示工程综述:技巧与应用领域 [译] https://baoyu.io/translations/ai-paper/2402.07927-a-systematic-survey-of-prompt-engineering-in-large-language-models-techniques-and-applications
- A Systematic Survey of Prompt Engineering in Large Language Models:Techniques and Applications https://arxiv.org/pdf/2402.07927
- 提示工程指南 https://www.promptingguide.ai/zh
- 自动优化Prompt:Automatic Prompt Engineering的3种方法 https://zhuanlan.zhihu.com/p/658649353
- Automatic Prompt Optimization with “Gradient Descent” and Beam Search https://arxiv.org/pdf/2305.03495