优化AI智能体的提示词,特别是那些参与复杂工作流程的智能体,不只是简单的试错。一种系统方法确保改进可衡量、可重复,并有助于持续优化。这种结构化的过程帮助你明白你所做改动的影响,并避免引入意料之外的退化。可将其看作是专门针对智能体“大脑”——其提示词——的专注开发循环。
核心迭代循环
系统化提示词优化的核心是一个迭代循环。每次循环旨在根据证据和分析改进智能体表现,而非凭空猜测。
提示词迭代循环:一个用于优化智能体行为的结构化循环。
我们来逐一审视每个步骤:
-
提出假设:
- 确定问题:首先准确指出一个具体问题。例如,“智能体常未能从用户查询中提取出正确的日期”或“智能体处理多步骤任务的计划常效率不高”。
- 提出假设:提出一个具体的提示词修改方案并预测其结果。例如,“添加明确的指令,如‘始终以YYYY-MM-DD格式提取日期’将提高日期提取的准确性。”或者,“提供三个高效计划的少样本提示示例将引导智能体生成更好的计划。”
-
设计与修改:
- 实施更改:根据你的假设,仔细修改提示词。
- 原子性更改:只要可行,每次只更改提示词的一个方面。如果你同时修改指令、示例和输出格式,就很难确定是哪项更改导致了观察到的改进或退步。
- 版本控制:这是一个提醒提示词版本管理重要性的好时机,它类似于代码版本管理。这使你能在更改不奏效时轻松回滚(我们将在“智能体提示词的组织与版本管理”中更详细地讨论此主题)。
-
测试:
- 使用测试用例执行:使用修改后的提示词智能体针对一组预定义的输入或情境进行运行。这些测试用例对于确保一致性和衡量进展很重要。
- 受控环境:争取在提示词之外的变量都受到控制的测试环境中进行。对于具有
temperature设置的大语言模型,在初始测试期间使用低值(例如0或0.1)可以得到更确定的输出,从而更容易分离提示词更改的效果。对于更广泛的测试,你最终会使用更典型的温度设置,并可能进行多次试验。
-
分析与评估:
- 收集数据:收集你测试的输出。这不仅包括最终结果,如果智能体架构允许,还包括中间步骤(例如,ReAct风格智能体中的思考和行动)。
- 对照指标衡量:将新结果与基线和你定义的指标进行比较。日期提取准确性是否提高?计划是否更有效率?
- 寻找副作用:更改是否不经意地破坏了其他功能?例如,更严格的日期格式指令是否使智能体在处理以前能处理的略微格式错误的用户输入时变得不那么灵活了?
-
学习与决定:
- 解释结果:你的假设得到证实了吗?如果得到,那很好!如果没有,为什么?这告诉你关于智能体如何理解提示词的什么信息?
- 做出决定:
- 采纳:如果更改是明显的改进,且没有重大的负面副作用,则将其集成到你的主要提示词中。
- 调整:如果更改显示出潜力但不够完美,或者引入了新问题,则完善你的假设并准备下一次迭代。也许指令过于僵硬,或者某个示例需要微调。
- 放弃:如果更改有害或没有积极效果,则恢复到先前的提示词版本并形成新的假设。
- 记录所学:记录下你尝试了什么、原因是什么以及发生了什么。这种提示词的“实验笔记本”对于未来的工作和新成员的加入非常宝贵。
为有效测试做准备
迭代循环的“测试”阶段很大程度上依赖于良好的测试设置。没有它,你的分析会薄弱,你的决定也可能被误导。
定义明确的目标和衡量指标
在开始调整提示词之前,你需要明白“成功”的定义。
- 总体目标:智能体应该达到什么?(例如,“根据用户限制成功预订会议。”)
- 具体衡量指标:你将如何衡量实现该目标的表现?
- 量化衡量指标:这些是可衡量的数字。示例包括:
- 任务完成率(TCR):成功完成的任务百分比。
- 准确性:用于信息提取或分类任务。
- 工具成功率:正确执行的工具调用百分比。
- 轮次/步骤数:较少可能表示效率,但不总是质量。
- 错误率:特定失败模式的出现频率。
- 资源使用:API调用、消耗的Token。
- 定性衡量指标:这些通常需要人工判断。示例包括:
- 清晰度和连贯性:智能体的输出是否容易理解?
- 角色一致性:智能体是否保持其设定的角色?
- 帮助性:智能体的回复是否有效满足用户需求?
- 鲁棒性:智能体处理略微模糊或意外输入的能力如何?
量化和定性指标的结合通常提供最全面的智能体表现视图。例如,一个智能体可能任务完成率很高(量化),但生成的回复却帮助不大或不符合品牌(定性)。
制作多样化的测试用例集
你的测试套件应反映智能体将遇到的各种情况。
- 理想路径情境:这些是直接的测试用例,预期一切都会顺利进行。它们确认基本功能。(例如,用户清晰地提供所有必要信息)。
- 边界情况:这些测试智能体能力的边界。(例如,用户提供冲突信息、使用不常见的措辞,或请求某项超出工具功能限制的事物)。
- 已知失败模式:如果你已确定智能体之前失败的特定情况,请包含这些情况,以确保你的提示词更改能够解决它们,并且不会重新引入旧错误(回归测试)。
- 不同复杂程度:包括简单、中等和复杂的任务。
- 负面测试:智能体应得体地拒绝或要求澄清的情境,而非尝试不可能或不适当的操作。
例如,如果构建一个客户支持智能体,你的测试用例可能包括:
- 简单查询:“你们的营业时间是?”
- 需要使用工具的查询:“跟踪我的订单 #12345。”
- 模糊查询:“我需要我的东西的帮助。”
- 超出范围的查询:“火星上的天气怎么样?”
- 信息缺失的查询:“我想退货。”(智能体应询问订单/商品详情)。
维护此测试套件并在提示词更改后持续运行它是系统化迭代的支柱。
建立基线
如果你不知道从何开始,就无法知道是否正在改进。
- 初始提示词表现:在你开始迭代之前,用你的测试套件运行你最初的提示词设计,并记录指标。这是你的基线。
- 对照组:每个新的提示词变体都与此基线(或当前表现最佳的提示词)进行比较。这突出了你特定更改的影响。
迭代策略:进行有意义的更改
当你处于“设计与修改”阶段时,你如何更改提示词很重要。
-
隔离变量:如前所述,抵制同时更改提示词多个方面的冲动,尤其是在调试过程的早期。如果你同时修改角色定义、一条指令和三个少样本示例,并且性能有所提高,那么是哪项更改起了作用?或者是它们的组合?通过一次只更改一个元素(例如,重写一条指令、添加一个特定示例、稍微调整角色描述),你可以更清楚地归因因果关系。
-
增量调整:对提示词进行大幅、全面的更改有时是必要的,但通常,更小、更有针对性的调整对于微调更有效。例如,与其完全重写一个10步计划指令,不如尝试重新措辞单个模糊的步骤或添加一个澄清的句子。
-
提示词片段的A/B测试:有时,你可能不确定某条重要指令的两种措辞哪个更好。你可以设计一个只关注这方面的迷你测试。例如:
- 提示词A:“使用搜索工具查找最新新闻文章。”
- 提示词B:“要查找最新新闻,请使用相关关键词调用
search_news工具。”
运行一组对此指令敏感的特定测试用例,使用两组提示词(保持其他一切相同),并比较结果。这是一种A/B测试形式,我们将在“比较提示词变体以提升智能体效能”中更详细地讨论它。
分析结果:不只是简单的通过/失败
当你的测试结果出来时,需要进行细致的分析。
- 检查智能体轨迹:如果你的智能体框架记录了“思考”或中间步骤(如ReAct模式),请仔细审查这些轨迹。它们可以显示智能体做出特定决定或工具调用的原因,即使最终输出是正确(或不正确)的。它是否考虑了正确的选项?它是否在早期阶段误解了指令?
- 错误分析:当测试失败时,对错误进行分类。智能体是否持续在某个特定子任务(例如,工具的参数格式化)上失败?它是否误解了某个特定内容?这有助于你缩小提示词需要关注的范围。
- 输出比较:对于生成任务,直接比较不同提示词版本的输出。提供“差异”视图的工具在这里会很有帮助。寻找清晰度、准确性、完整性和对所需格式的遵守方面的改进。
- 定性反馈循环:如果可能,从实际用户或内部利益相关者那里获取关于智能体输出的反馈。这对于评估语气、帮助性、用户满意度等方面尤为重要,这些方面很难用纯粹的自动化指标捕捉。
通过采用系统化方法进行提示词迭代和测试,你可以将提示词工程从一门艺术转变为一种更规范的工程实践。这种严谨性对于构建能处理复杂任务的可靠且高效的AI智能体来说是必要的。投入到仔细测试和分析中的精力将在性能提升、调试时间减少以及对如何引导LLM驱动的智能体有更透彻的理解方面带来回报。