2024年12月14日

提示词工程-提示词链(prompt chain)

作者 柳 永强
内容目录

提示词工程-链式提示词(prompt chain)

罗伯特·C·马丁(Robert C. Martin),一位著名的工程师,曾经说过:“函数应该只做一件
事。它们应该做好这件事。而且只做这件事。” 同样的原则也适用于提示词工程。

提示词应该只做一件事。它们应该做好这件事。而且只做这件事。

如果在同一个提示词中包含了多个任务或者指令时,AI大模型的输出将会不敬人意。这样的
提示词会让AI大模型陷入困境,无法正确理解你的意图。因此,更好的方法是将较大的提示
分解为多个较小的提示,创建动态提示链。每个链式提示词只包含一个任务或者指令。

提示链通过让模型专注于链中每个子任务,实现了对输出的更细粒度控制。

什么是提示词链?

提示词链将一个任务拆解为一系列较小的子任务,每个子任务由独立的提示词处理。

提示词链可以通过多种方式实现,包括结合其他提示工程方法,例如自动链式思维提示
(automatic chain-of-thought prompting)、由易到难提示(least-to-most
prompting)以及自一致性提示(self-consistency prompting)。

例如,在文本摘要任务中,可以通过提示链实现以下步骤:

  1. 创建初步摘要草稿
  2. 对摘要进行批评与改进建议
  3. 检查摘要是否存在事实错误
  4. 根据批评和反馈生成精炼后的摘要

每个步骤都由独立的提示处理,使模型能够完全专注于单个子任务,从而提高整体输出质量。

提示链对于完成复杂任务非常有用,因为这些任务如果使用一个非常详细的单一提示,LLM
可能难以应对。在提示链中,每个链式提示都会对生成的响应进行转换或额外处理,直到最
终达到期望的结果。

除了获得更好的性能,提示链还能提高LLM应用的透明性、可控性和可靠性。这意味着你可
以更轻松地调试模型响应中的问题,并分析和改进需要优化的各个阶段的性能。

提示链在构建基于LLM的对话助手、改善应用的个性化和用户体验方面尤其有用。

提示链的工作原理

下图展示了提示链的基本工作原理。首先使用提示链时,需要将任务拆解为多个子任务,子
任务的粒度足够小,每个子任务都由独立的提示处理。上一个提示词的输出作为下一个提示
词的输入。

提示链的好处

  • 增强专注力:通过将庞大的提示拆解为有针对性的子提示,模型可以将注意力集中在
    每个任务上,一次只处理一个任务。

  • 更高质量的输出:如后续研究所示,提示链的效果明显优于庞大的提示。研究结果表
    明,提示链能够提供更精确和有效的输出。

  • 更易理解:理解复杂的庞大提示非常具有挑战性,这也使得团队协作变得困难,输出
    质量难以提升。通过利用提示链,所使用的提示更加专注,因此更容易理解。

  • 广泛适用:提示链几乎可以提高任何复杂任务的输出质量。无论是摘要、问题解决还
    是创意写作,通过提示链将过程拆解为更小的步骤都能帮助模型提高表现。

提示链在生成长篇输出或处理包含大量上下文的提示时特别有益。

何时使用提示词链

提示链本身其实也是模拟了人类思维的链式思考过程。在人类思维中,我们会将一个大的
任务拆解为多个小的子任务,然后逐个完成。这种思维方式使我们能够更好地处理复杂的问题。

但是当你的任务非常简单或者只包含一个步骤时,使用提示链可能会增加不必要的复杂性。

如果你在决定是创建提示链还是使用单个提示时,可以考虑以下四个问题:

  • 我的任务涉及多个指令吗? 例如,“阅读这篇文章并生成摘要,然后创建一个相关的
    LinkedIn帖子。”

  • 我的任务需要多次转换吗? 比如,如果输出需要以多种方式进行处理或重新格式
    化。

  • 我对单一提示的结果不满意吗? 将任务拆解为子任务,并通过提示链逐个处理,可
    以帮助你找出问题所在,从而更容易修复。

  • 模型是否似乎失去焦点或忘记上下文? 如果是这样,将单个提示转化为提示链可以
    确保每个步骤都能得到模型的全神贯注。

提示链的典型示例

数据分析任务

通常在做数据分析时,我们需要进行数据提取、数据清理、数据分析和数据可视化等多个步骤。
而且每一步都要基于上一步的结果进行。因此这是一种典型的适合使用提示链的场景。

提示1:提取数据
从我们公司的数据库的导出数据 {{ 数据库数据 }} 中提取收入和用户参与数据,重点关注第一季度到第四季度的数据。

提示 2:数据转换
清理提取的数据 {{ 提取的数据 }} ,去除异常值,处理缺失值,并标准化数值字段。

提示 3:数据分析
分析清理后的数据 {{ 转换后的数据 }},以识别收入增长和用户参与度随时间的主要趋势。

提示 4:数据可视化
根据 {{ 数据分析结果 }} 创建可视化图表,突出分析中识别的趋势,重点展示收入增长和参与度激增。

代码编写任务

软件的代码编写是一个相当复杂的过程,通常需要多个步骤,例如需求分析、设计、编码、测试和部署等等。
如何将编写代码的任务交给AI大模型呢?这时候提示链就派上用场了。

如下提示链的示例,将代码编写拆解为:根据需求生成代码-》生成测试用例 -》代码检视 -》解决问题。

提示1:生成代码
请根据用户的 {{ 功能需求 }} 使用 {{ 编程语言 }} 生成相应的代码,保证生成的代码和用户需求一致。
始终使用注释来解释代码片段,如果是函数和类,请添加函数和类的注释,函数的注释包括函数名、参数、
返回值、功能描述。始终保持代码的整洁和可读性。

提示2:生成测试用例
请根据生成的代码 {{ 生成的代码 }} 生成相应的测试用例,保证测试用例能够覆盖生成的代码。

提示3:代码检视
请对 {{ 代码和测试用例 }} 进行检视,找出代码中存在的问题,并给出改进建议。

提示4:解决问题
请根据检视建议对 {{ 生成的代码 }} 和测试用例 {{ 生成的测试用例 }} 进行改进优化,同时保证测试
用例能够通过。

复杂任务拆解

如果你一开始还不太清楚如何将一个任务拆解为多个子任务,那么你也可以提示链技术借助LLM的能力,
将任务拆解为多个子任务。

系统提示词:
你是一个任务拆解专家,请根据用户的需求,将任务拆解为多个子任务。目标是尽可能的将任务拆解为
细粒度的子任务。

提示词1:
这是一个复杂任务 {{ 任务描述 }} ,将任务拆解为多个子任务或者执行步骤。

提示词2:
根据 {{ 任务拆解 }} ,列出每个子任务的具体目标和预期结果。

提示词3:
根据 {{ 任务拆解 }} ,列出每个子任务需要完成指定目标所需要使用的方法或者解决方案。

提示词4:
请根据 {{ 任务拆解 }} 和 {{ 子任务目标 }} ,列出每个子任务的执行优先级。

提示词5:
请根据 {{ 任务优先级 }} ,列出每个子任务的执行顺序。

提示词6:
请根据 {{ 任务拆解 }} 列出每个子任务需要依赖的外部资源。

参考文章:

https://www.prompthub.us/blog/prompt-chaining-guide
https://www.ibm.com/topics/prompt-chaining
https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/chain-prompts
https://www.promptingguide.ai/techniques/prompt_chaining