本次动手实践练习将迭代设计和评估应用于提示工程的实际情境。通常,第一次尝试的提示词不会产生理想的结果。此过程包括获取一个效果不佳的提示词,分析其不足之处,并系统地完善它,以提高大型语言模型(LLM)输出的质量、一致性和结构。挑战:提取结构化信息假设您有一些客户反馈邮件,需要从中提取特定信息:客户的主要情感(正面、负面、中立)、提及的产品(如果有),以及对反馈核心问题或赞扬的简要总结。初始情境:您将从包含多封客户邮件的一大段文本开始。以下是代表一封邮件的片段:主题:喜欢新的Xylos功能! 团队您好, 只想说Xylos平台的最新更新,尤其是仪表板自定义功能,非常棒!它让我的工作流程顺畅了许多。我确实注意到一个小毛病,日期筛选器有时会意外重置,但总体来说,这是一个巨大的改进。请继续保持出色的工作! 此致, Alex Chen效果不佳的提示词(尝试1):这是一些客户反馈: [在此插入邮件文本] 这份反馈是关于什么的?典型输出(尝试1):LLM可能会回应如下内容:这份反馈是关于Xylos平台更新的。客户喜欢仪表板自定义功能,但发现日期筛选器有一个小毛病。他们认为总体来说这是一个很大的改进。尝试1的分析:尽管LLM理解了基本内容,但其输出在我们的目标方面存在几个问题:缺乏结构: 这是一个自由格式的文本摘要。我们想要特定的字段(情感、产品、摘要)。隐式信息: 情感(“正面”)是暗示的,但未按要求明确说明。产品(“Xylos”)有提及,但未明确提取为数据点。缺少限制: 提示词没有指导LLM如何呈现信息。第一次迭代:添加指示和结构让我们完善提示词,使其对任务和期望的输出格式更具体。我们将使用清晰的指示,并要求采用像JSON这样的结构化格式,这更容易让应用程序解析。改进的提示词(尝试2):分析以下客户反馈邮件。提取主要情感(正面、负面或中立)、提及的具体产品(如果有,否则使用“无”),以及反馈核心要点的简洁总结(1-2句话)。将输出格式化为JSON对象,包含键:“sentiment”、“product”和“summary”。 反馈邮件: ''' 主题:喜欢新的Xylos功能! 团队您好, 只想说Xylos平台的最新更新,尤其是仪表板自定义功能,非常棒!它让我的工作流程顺畅了许多。我确实注意到一个小毛病,日期筛选器有时会意外重置,但总体来说,这是一个巨大的改进。请继续保持出色的工作! 此致, Alex Chen ''' 输出:预期输出(尝试2):{ "sentiment": "Positive", "product": "Xylos", "summary": "客户赞赏Xylos平台更新中的仪表板自定义功能,但报告了日期筛选器重置的小错误。" }尝试2的分析:这明显更好了!结构化输出: JSON格式正是我们进行后续处理所需的。明确提取: 情感和产品都清晰地识别出来了。简洁性: 总结侧重于核心要点。清晰指示: 提示词清晰地定义了任务、所需字段和输出格式。第二次迭代:处理模糊情况和特殊情况(可选优化)如果反馈更模糊或者没有提及产品怎么办?让我们考虑这样的反馈:主题:登录问题 我今天早上似乎无法访问我的账户。它一直在转圈。是不是有什么问题?- Sam使用提示词2可能会产生:{ "sentiment": "Negative", "product": "None", "summary": "客户无法登录账户,遇到了无限加载的问题。" }这很好,但也许我们想确保总结总是捕捉负面反馈的主要问题或正面反馈的主要亮点。我们可以稍微调整指示。进一步改进的提示词(尝试3):您是一位分析反馈的客户支持助理。分析以下客户反馈邮件。确定主要情感(严格分类为“正面”、“负面”或“中立”)。识别提及的具体产品(如果没有提及特定产品,则使用“无”)。创建一个简洁的总结(1-2句话),如果情感是负面/中立,则侧重于核心问题;如果是正面,则侧重于主要赞扬。 将结果输出为JSON对象,包含键:“sentiment”、“product”和“summary”。 反馈邮件: ''' [在此插入邮件文本] ''' JSON 输出:此版本增加了一个“角色”(客户支持助理),并根据情感稍微调整了总结的指示。这增加了可靠性,能更精确地引导LLM处理不同类型的反馈。评估我们如何知道我们的提示词正在变好?准确性: 提取的信息是否正确反映了邮件内容?情感分类是否准确?是否识别出正确的产品?完整性: 输出中是否包含所有要求的字段?格式遵循: 输出是否始终符合要求的JSON结构?简洁性: 总结是否简明扼要?一致性: 提示词是否能可靠地处理不同的示例邮件(正面、负面、中立、提及产品、未提及产品)?您可以创建一组包含不同邮件的小型测试集,并针对它们运行每个提示词版本,将输出与手动创建的“理想”提取结果进行比较。这构成了系统评估的依据,这对于构建可靠的LLM应用程序来说非常重要。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="Arial", fontsize=10, margin=0.2]; edge [fontname="Arial", fontsize=9]; subgraph cluster_0 { label = "提示词优化循环"; bgcolor="#e9ecef"; P1 [label="尝试1:\n模糊提示词", style="filled", fillcolor="#ffc9c9"]; O1 [label="输出1:\n非结构化摘要", style="filled", fillcolor="#ffc9c9"]; A1 [label="分析:\n- 缺乏结构\n- 隐式信息\n- 没有限制", style="filled", fillcolor="#ffe066"]; P2 [label="尝试2:\n添加指示,\n请求JSON", style="filled", fillcolor="#b2f2bb"]; O2 [label="输出2:\n结构化JSON", style="filled", fillcolor="#b2f2bb"]; A2 [label="分析:\n- 处理模糊情况?\n- 特殊情况?", style="filled", fillcolor="#ffe066"]; P3 [label="尝试3:\n细化摘要逻辑,\n添加角色", style="filled", fillcolor="#a5d8ff"]; O3 [label="输出3:\nJSON", style="filled", fillcolor="#a5d8ff"]; E [label="评估:\n- 准确性\n- 格式\n- 一致性", style="filled", fillcolor="#74c0fc"]; P1 -> O1 [label="生成"]; O1 -> A1 [label="审查"]; A1 -> P2 [label="优化"]; P2 -> O2 [label="生成"]; O2 -> A2 [label="审查"]; A2 -> P3 [label="优化(可选)"]; P3 -> O3 [label="生成"]; O3 -> E [label="最终检查"]; E -> P1 [style=dashed, label="如有需要,重复"]; } }提示词优化的迭代过程包括生成输出、分析其不足、根据分析完善提示词,并评估新的输出。这种动手实践的过程表明,提示词工程并不总是立即找到一个“神奇”的提示词。它通常是一个有条不紊的循环过程,包括创建、测试、分析和完善,以引导LLM生成您的应用程序所需的精确输出。在构建自己的提示词时,请牢记这些迭代完善和仔细评估的原则。