AI 对话魔法|Prompt Engineering 探索指南
作者:京东物流 李雪婷
一、什么是 Prompt Engineering?
想象一下,你在和一个智能助手聊天,你需要说出非常清晰和具体的要求,才能得到你想要的答案。Prompt Engineering 就是设计和优化与 AI 对话的“提示词”或“指令”,让 AI 能准确理解并提供有用的回应。
Prompt Engineering 主要包括以下几个方面:
1.明确目标:希望 AI 完成什么任务。例如:写一篇文章,回答一个问题,进行一次对话?
2.设计提示词:设计出具体的提示词,提示词应该尽量简洁明了,包含所有必要的信息。比如:“写一篇关于环境保护重要性的文章。”
3.优化和测试:一开始的提示词可能并不完美,所以需要不断调整和优化,测试不同的表达方式,尝试找到最好的结果。
4.处理意外情况:有时候,AI 可能会给出意外的回答,还需要预测这些意外情况,并设计出应对策略。
二、Prompt Engineering 如何兴起?
1)早期阶段(2017 年前)
•基本指令:早期的 NLP 模型中,用户与 AI 的互动主要是基于简单的指令和关键词匹配。此时的 AI 系统主要依赖预定义的规则和有限的上下文理解能力。
•模板化问答:一些早期的聊天机器人和问答系统采用模板化的问答模式,用户问题必须严格匹配预设的模板才能得到有效回应。
2)初步探索(2017-2018)
•Seq2Seq 模型:Sequence-to-Sequence 模型的引入,使得 AI 能够更好地处理输入和输出之间的关系,但仍然需要明确的指令和大量训练数据。
•预训练模型:2018 年,OpenAI 发布的 GPT 标志着预训练语言模型的兴起。尽管早期的 GPT 模型在理解和生成文本方面有了显著进步,但仍需要明确提示词。
3)快速发展(2019-2020)
•GPT-2 发布(2019) :GPT-2 的发布使得语言模型在生成自然语言文本方面取得了重大突破。Prompt Engineering 开始受到关注,研究人员开始探索如何通过设计提示词来引导模型生成更相关的内容。
•BERT 和其他模型:Google 发布 BERT,进一步提升了 NLP 模型的理解能力。Prompt Engineering 开始利用这些模型的双向理解能力来优化提示词。
4)成熟阶段(2020-2021)
•GPT-3 发布(2020) :GPT-3 的发布带来了更大规模的预训练模型,具备更强的生成和理解能力。Prompt Engineering 变得更加重要,研究人员和开发者开始系统性地研究和优化提示词。
•Few-shot 和 Zero-shot 学习:GPT-3 支持 Few-shot 和 Zero-shot 学习,这意味着模型可以通过少量甚至没有示例的情况下完成任务。Prompt Engineering 技术迅速发展,设计出有效的提示词来最大化模型的性能。
5)技术手段演变(2021-2023)
•Prompt Tuning:研究人员开发了 Prompt Tuning 技术,通过调整提示词的参数来优化模型的输出。这种方法在提高模型性能方面表现出色,成为 Prompt Engineering 的重要手段之一。
•自动化工具:为了简化 Prompt Engineering 的过程,出现了许多自动化工具和框架,帮助开发者快速生成和测试提示词。
•领域特定优化:Prompt Engineering 开始针对特定领域(如医疗、法律、教育等)进行优化,设计出更专业和精准的提示词。
6)现代阶段(2024 及以后)
•自适应提示词生成:随着 AI 技术的进一步发展,出现了自适应提示词生成技术,模型可以根据上下文和用户需求动态调整提示词。
•多模态提示词:结合文本、图像、音频等多模态数据的提示词设计,使得 Prompt Engineering 在处理复杂任务时更加高效和灵活。
•人机协同优化:通过人机协同的方式,结合用户反馈和模型自我改进,进一步提升 Prompt Engineering 的效率和效果。
三、Prompt Engineering 技术介绍
1) 无扩展训练技术 (New Task Without Extensive Training)
Zero-shot 和 Few-shot 是两种最基础的提示词工程,主要注意 Prompt 的格式(比如分段落,用序号的方式展现你想表达内容的逻辑顺序等)和讲述内容就可以,同时根据对输出结果的需求来调整参数。
① Zero-shot Prompting : 直接给出任务和目标,注意 prompt 格式和参数调整。
② Few-shot Prompting: 和 Zero-shot 相比就是多了几个“shots”,给予模型少量样本进行实现上下文学习;注意范例的挑选对模型表现很重要,不恰当的范例选择可能导致模型学习到不精确或有偏见的信息。
小工具:这个链接可以提供 prompt 模版,根据选择不同的模版,帮你设计基础的 prompt 内容。
基础参数:
2) 推理与逻辑技术( Reasoning and Logic)
推理与逻辑技术能使 LLM 更加深入与复杂的逻辑思考。如:Chain-of-Thought (CoT)、Automatic Chain-of-Thought (Auto-CoT)、Self-Consistency、Logical CoT 等,都旨在促进模型以更结构化和逻辑性的方式处理信息,从而提高问题解決的准确性和深度。
① Chain-of-Thought (CoT)
原理: 为了克服 LLM 在处理复杂推理任务方面的限制,Wei et al. (2022) 提出了 CoT,通过引入一种特殊的提示策略,促进模型进行连续和逐步的思考过程,连贯思考技术的主要贡献在于能够更有效地激发 LLM 产出结构化且深入思考的回答。
示例说明: 标准提示中,模型直接给出答案,而没有解释或展示其推理过程。在 CoT 提示中,模型不仅给出答案,还详细展示了其推理过程。CoT 通过在通过在提示中加入详细的推理步骤,引导模型逐步解决问题。适用于需要复杂推理和多步骤计算的任务。
② Automatic Chain-of-Thought (Auto-CoT) Prompting
原理: CoT 是一种手动的方式,过程耗时且效率低下,因此 Zhang et al. (2022) 提出了 Auto-CoT 技術。通过自动生成“逐步思考”式的提示,帮助大模型实现推理链。通过多样化的样本生成来提升整体的稳定性,能够对多种问题产生多个独特的推理链,并将它们组合成一个终极范例集合。这种自动化和多样化的样本生成方式有效地降低了出错率,提升了少样本学习的效率,并避免了手工构建 CoT 的繁琐工作。
示例说明: 左侧展示了 Auto-Cot 的四个步骤(示例构建、聚类、示例选择和上下文推理)。首先,通过聚类算法将问题示例分组,然后从每个组中选择具有代表性的示例,构建一个包含详细解答的示例集,最后,通过在上下文中提供这些示例,帮助 LLM 进行推理并得出正确答案。
③ Self-Consistency
原理: Wang et al. (2022)提出了一种新型解码策略,目标在于取代链式思考提示中使用的天真贪婪解码。从语言模型的 decoder 中提取多条不同的推理路径,从而生成多种可能的推理链,增加找到正确答案的可能性。
示例说明: 不同于简单 CoT 的贪婪解码方式,该技术先生成多个不同的推理路径,不同路径可能会得出不同答案,然后通过对所有生成的路径进行汇总,选择最一致的答案为最终输出。 第一步:模型生成多个推理路径,得到不同的答案(26、18)
④ Logical Chain-of-Thought (LogiCoT) Prompting
原理: Zhao et al. (2023)提出的 LogiCoT,与之前的逐步推理方法 (例如 CoT) 相比,引入了一个全新的框架。该框架吸取了 symbolic logic 的精髓,以一种更加结构化和条理清晰的方式来增强推理过程。采用了反证法这一策略,通过证明某一推理步骤若导致矛盾则该推理步骤错误,从而来核查和纠正模型产生的推理步骤。
图例说明: 上方是 CoT,推理过程是线性的,每一步都依赖于前一步,下方是 LoT,推理过程是树状的,可以在某些步骤上进行分支,每个节点仍代表一个推理步骤,但节点之间有更多的连接方式,形成了一个分支结构。这种方法允许探索多个可能的推理路径。图中虚线框标出了某些分支节点,表示这些节点可以在不同的路径上进行组合和选择。因此 LoT 方法能更灵活地处理复杂问题,允许同时考虑多个推理路径,从而可能得到更全面和准确的结果。
⑤ Chain-of-Symbol (CoS) Prompting
原理: 为了克服 LLM 依赖容易模糊且可能带有偏见的自然语言的限制,Hu et al. (2023)提出了 CoS。这种方法不适用自然语言,而是采用简化的符号作为提示,优势在于使提示更加清晰简洁,提高模型处理空间关系问题能力,同时运作原理更易使人理解。
示例说明: 下图展示了 CoT 和 CoS 在解决一个从一堆砖块中取出特定砖块的问题时的表现 。 CoT 输出 A, E, D,结果错误,没有遵循正确移出顺序。CoS 通过将 Prompt 的结构从文字转换为符号(如下):
1.B/A/D/E/C
2.C/E
3.E/D
4.D
模型输出:C, E, D
3)减少幻觉技术(Reduce Hallucination)
减少幻觉现象(幻觉是指你从大语言模型中得到错误的结果,因为大语言模型主要基于互联网数据进行训练,其中可能存在不一致的信息,过时的信息和误导的信息)是 LLM 的一种挑战,技术如 RAG、ReAct Prompting、Chain-of-Verification (CoVe)等,都是为了减少 LLM 产生无依据或者不准确输出的情况。这些方法通过结合外部信息检索、增强模型的自我检查能力或引入额外的验证步骤来实现。
① RAG (Retrieval Augmented Generation)
原理: RAG 的核心为“检索+生成”,前者主要是利用向量数据库的高效存储和检索能力,召回目标知识;后者则是利用大模型和 Prompt 工程,将召回的知识合理利用,生成目标答案。
流程: 完整的 RAG 应用流程主要包含两个阶段。
•数据准备阶段:一般是离线过程,主要是将私域数据向量化后构建索引并存入数据库的过程。主要包括:数据提取、文本分割、向量化、数据入库等。
◦数据提取——>文本分割——>向量化(embedding)——>数据入库
•应用阶段:根据用户提问,通过高效的检索方法,召回与提问最相关的知识,并融入 Prompt;大模型参考当前提问和相关知识,生成答案。关键环节包括:数据检索(相似性检索、全文检索-关键词)、注入 Prompt(Prompt 设计依赖个人经验,实际应用中往往需要根据输出进行针对性调优)。
◦用户提问——>数据检索(召回)——>注入 Prompt——>LLM 生成答案
② Chain-of-Verification (CoVe) Prompting
原理: Dhuliawala et al. (2023) 提出了一种称为 CoVe 的方法,该方法主要有四个步骤:初步答案、规划验证问题以检验工作、独立解答这些问题、根据验证结果来修正初步答案。该方法通过精心设计验证问题,模型能够辨识自身的错误并进行修正,从而显著提高了准确率。
示例说明: 下图表展示了一个查询和验证过程,目的是找出一些在纽约市出生的政治家。整个过程分为四个步骤,通过验证初步信息来确保最终响应的准确性。
1.初步响应:系统提供了一个初步的响应,列出了一些可能在纽约市出生的政治家:Hillary Clinton、Donald Trump、Michael Bloomberg。
2.计划验证:系统决定验证初步响应中的信息,提出了问题:Hillary Clinton 出生在哪里?Donald Trump 出生在哪里?Michael Bloomberg 出生在哪里?
3.执行验证:系统查找并验证了这些政治家的出生地,Hillary Clinton 出生在伊利诺伊州芝加哥、Donald Trump 出生在纽约州纽约市皇后区、Michael Bloomberg 出生在马萨诸塞州波士顿。
4.最终验证响应:根据验证结果,系统提供了一个修正后的列表,只包含在纽约市出生的政治家。Donald Trump - 前美国总统、Alexandria Ocasio-Cortez - 美国众议院议员。
4) 微调和优化( Fine-Tuning and Optimization)
① Automatic Prompt Engineer (APE)
原理: Zhou et al. (2022)提出的 APE 技术,其突破了手动和固定提示的限制,能够针对特定任务主动生成并选择输出有效的提示。先分析用户输入,设计一系列候选指令,再透过强化学习选择最优提示,并能适应不同情景。
示例说明: 下图展示了 APE 技术的几个步骤。
1.Proposal(提议):使用 LLM 生成初始提示 “write the antonym of the word”。
2.Scoring(评分):对生成的提示进行评分,评分的依据是提示的对数概率(不同提示分数不一致,有 0.26、0.28 等)
3.High Score Candidates(高分候选项):保留得分较高的候选提示,丢弃得分较低的提示。例如,得分为-0.86 和-1.08 的提示被丢弃,得分为-0.26 和-0.28 的提示被保留。
4.(Optional)Resampling(重采样):生成高分候选提示的变体,保持语义不变。例如,生成提示“write the opposite of the word given”。
5.Final Selection(最终选择):选择得分最高的提示作为最终使用提示。提示“write the opposite of the word given”得分为 0.16,被选为最终提示。 通过这个流程,APE 技术能够自动生成和优化提示,确保选择的提示能够生成高质量的输出。
5)其他手段(Others Techniques)
以下四种 Prompt Engineering 手段个人认为比较有意思,因此做简要介绍。
① Chain-of-Code (CoC) Prompting
原理: CoC 技术是Li et al. (2023)提出的,通过编程强化模型在逻辑与语义任务上的推理能力,将语义任务转化为灵活的伪代码。CoT 主要用于解决需要逻辑推理、问题分解和逐步解决的任务,如逻辑推理问题、文本分析等;CoC 则专注于编程任务,通过分步引导模型生成代码解决编程问题。
示例说明: 下图展示了利用三种不同的方法来回答一个问题:“我去过多少个国家?我去过孟买、伦敦、华盛顿、大峡谷、巴尔的摩,等等。”
1.直接回答:直接给出了几个可能的答案,32 和 29 是错误的,54 是正确的。
2.思路链 (CoT):首先,将城市按国家分组,然后计算不同国家的数量。61 和 60 是错误的,54 是正确的。
3.代码链(CoC):首先,初始化一个包含城市名称的列表和一个空的集合来存储国家。然后遍历每个城市,通过函数 get_country(place) 获取对应的国家,并将其添加到集合中。最后计算集合的长度,结果显示,54 是正确的。
总结:直接回答法没有解释过程,容易出错。思路链法逐步解释,但仍可能出错。代码链法通过编程逻辑,确保了答案的准确性,在三种方法中表现最好。
② Contrastive Chain-of-Thought (CCoT) Prompting
原理: 传统 CoT 忽略了从错误中学习的总要环节,Chia et al. (2023)提出 CCoT 技术。这种技术通过同时提供正确和错误的推理示例来要到模型。但是该种技术还是面临一些挑战,即如何为不提供问题自动生成对比示例。
示例说明: 下图展示了三种提示方法在回答数学问题时的表现。
•Prompt 问题:James 每周给两个不同的朋友各写一封 3 页的信,每周写两次。他一年写多少页?
•待回答问题:James 有 30 颗牙齿。他的牙医钻了其中的 4 颗,并且修复了比钻的牙齿多 7 颗的牙齿。牙医修复了 James 牙齿的百分比是多少?
1.标准提示:Prompt 中回答直接给出答案,但没有解释过程,导致第二个问题答案:37.5%,回答错误。
2.思维链(CoT):Prompt 中加入了详细的解释过程,使得模型在输出修复牙齿比例问题中能更准确地思考,但是答案为 36.67%,还是错误。
3.对比思维链(Contrastive CoT):Prompt 中加入了正确答案和错误答案的详细解释说明。最终输出答案 50%正确。Contrastive CoT 不仅提供正确的解释,还展示了错误的解释,帮助理解和验证答案的正确性。
③ Managing Emotions and Tone
原理: Li et al. (2023) 提出了 EmotionPrompt 技术。通过在提示中加入情感词汇或情感上下文来引导模型更好地理解和回应用户的情感需求。 识别情感需求:识别出希望模型生成的响应中包含的情感类型(如开心、悲伤、愤怒等)。 构建情感提示词:在原始提示中加入情感词汇或上下文,以引导模型生成符合预期情感的响应。 测试和调整:生成响应后根据实际效果进行测试和调整,确保模型生成的内容符合预期的情感。
示例说明: 下图展示了不同类型的情感表达及其在不同理论框架下的分类和交叉关系。主要包含了三个理论框架:自我监控、社会认知理论和认知情绪调节,并列出了每个框架下的具体情感表达句子(EP01-EP11)。通过这种分类方式,可以看出不同情感表达在不同理论框架和维度下的交叉关系和应用场景。这种分类有助于更好地理解和应用情感表达在不同情境中的作用。右侧展示了这些情感表达在不同社会效应和自尊维度下的分类:
1.社会效应(Social effect)包含:EP01, EP02, EP03, EP04, EP05, EP06(EP06 是 EP01, EP02, EP03 的复合体)
2.自尊(Self-esteem)包含:EP07, EP08, EP09, EP10, EP11
3.备注:EP06 是 EP01, EP02, 和 EP03 的复合体。
④ Rephrase and Respond (RaR) Prompting
原理: 由于 LLM 经常忽略了人类思维方式和 LLM 思维方式间的差异,Deng et al. (2023)提出了 RaR 技术。通过让 LLM 在提示中重新表述和扩展问题,从而提升模型对问题的理解和回答准确性,改写后的问题能够更清晰地传递语意,减少问题模糊性。
示例说明: RaR 主要分为两个步骤,通过对 prompt 理解和重述,语言模型可以更好地理解和回答问题。
1.重述问题:首先给定一个原始问题,“取 Edgar Bob 中每个单词的最后一个字母并将它们连接起来”。然后重述使其更清晰、更详细。重述后的问题变成“你能识别并提取 Edgar Bob 中每个单词的最后一个字母,然后按它们出现的顺序将它们连接起来吗?”
2.回答重述后的问题:重述后的问题是“你能识别并提取 Edgar Bob 中每个单词的最后一个字母,然后按它们出现的顺序将它们连接起来吗?”回答为“Edgar Bob 中每个单词的最后一个字母是 r 和 b,按出现顺序连接起来是 rb”。
四、Prompt Engineering 的应用案例
1)项目背景
在京东物流的大件商品入库环节,采集人员需要根据产品制定的划分标准人工判断并录入商品件型。然而,件型维护错误会导致物流方面的收入损失、客户投诉及调账等问题。为了解决这些问题,我们通过技术手段对存量 SKU 进行件型异常识别,并在前置环节实现件型推荐,对新入库的 SKU 进行件型录入预警。件型的判断高度依赖于商品品类,但由于大部分 SKU 为外单商品,其品类维护主要依赖于商家和销售,超过 40%的外单商品品类被归为“其他服务”。因此,我们首先对这些品类进行修正,再基于修正后的数据展开异常识别和件型推荐。
随着大模型应用的广泛普及,针对第二阶段件型判断,我们通过引入大模型对文本识别技术方案难以覆盖的 SKU 进行补充识别(提升覆盖率)。以下会尝试上述介绍的几种基础 Prompt Engineering 手段,对空调品类的商品进行件型判断,并对比几种提示词工程在识别效果上的差异。
2)应用举例
识别目标: 通过告诉大模型空调相关品类的件型判断标准,让大模型判断商品的件型。下面主要通过不同的提示词工程手段,来调整 prompt 以提升输出精确率。
样本说明: 数据总共包含 7 个字段(goods_code:商品编码,goods_name:商品名称, item_third_cate_name:修正后品类,weight:重量(kg), big_goods:件型编码,big_goods_desc:件型中文,label:业务打标的正确件型(检验模型结果的 label)。
测试代码:
① 基础 GPT 调用 Demo: 主要设定了模型的角色和任务,为了保证结果输出的稳定性,分别将参数 temperature 设置为 0,同时件型最长字符串不超过 6 个,因此设置 max_tokens=6,仅输出一个结果,设置 top_p=0.1。
Zero-shot:准确率 44.44%
Few-shots:在 Zero-shot 基础上加了两个示例说明,准确率 55.56%。
Chain-of-Thought (CoT):和 Few-shots 的区别,将两个示例分步骤展示,向模型说明进行件型判断的逻辑顺序,准确率 66.67%。
Automatic Chain-of-Thought (Auto-CoT) Prompting:使用 prompt2,但是在调用的任务说明时,告诉大模型判断的顺序为,先判断商品的细分品类,再判断商品来源,再判断商品件型,最终精确率 77.78%。
Self-Consistency:依旧使用 prompt2,但调整调用参数和解析逻辑,让模型进行多次输出,取出现频率最高的结果为最终结果,精确率为 66.67%。
版权声明: 本文为 InfoQ 作者【京东科技开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/78e08c1a39a13afcfd8c01c6d】。文章转载请联系作者。
评论