
第 08 课 | Prompt Engineering让模型输出稳定可靠的结构化数据如果说 LLM 是 Agent 的大脑Prompt Engineering 就是和大脑沟通的语言。模型输出不稳定Agent 的整个自动化链条就会断裂。这节课我们系统地解决这个问题。一、为什么 Prompt Engineering 是 Agent 的基石先看一个真实的场景。你在写一个竞品监控 Agent它的核心流程是爬取竞品新闻 → LLM 提取关键信息 → 程序解析 → 存入数据库 → 生成报告这个流程里最关键的一环是LLM 提取关键信息 → 程序解析。如果 LLM 输出的格式不稳定——有时是 JSON有时是纯文本有时 JSON 里还夹着解释文字——你的程序就无法解析整个 Agent 链条就断了。这就是 Prompt Engineering 要解决的核心问题让模型输出稳定、可解析、符合预期的格式。具体来说有 3 个核心目标目标说明反面案例格式稳定输出格式一致程序能解析有时 JSON有时 Markdown有时纯文本内容准确分析结果正确不胡编乱造把中性评论判为正面把物流问题归为质量问题边界清晰知道什么该输出什么不该输出输出里夹杂大量无关的解释文字业务价值一个 5 人团队做竞品分析每天处理 200 条新闻每条人工提取关键信息需要 2 分钟一天就是 400 分钟近 7 小时。用 Prompt Engineering 调优后的 Agent准确率达到 95%人工只需抽查 5% 的异常数据每天节省 6 小时以上。二、System Prompt 设计2.1 System Prompt 的作用System Prompt系统提示词是放在对话最开头的指令它定义了模型的角色、行为规则和输出格式。在 Agent 开发中System Prompt 是最重要的 Prompt因为角色定义告诉模型它是谁应该以什么视角回答问题行为约束规定模型能做什么、不能做什么格式规范指定输出的格式要求2.2 好坏对比我们用同一个任务——分析一条商品评论——来对比模糊和精确的 System Prompt 效果。模糊的 System Prompt你是一个评论分析助手。分析用户的评论给出情感倾向和关键信息。用这个 Prompt 对 “发货速度很快包装也很严实产品质量不错价格实惠非常满意” 进行分析模型可能输出这是一条正面评论用户对发货速度、包装、产品质量和价格都很满意。 整体来说是一次愉快的购物体验。这没问题——如果是给人看的话。但程序无法解析这段文字你的 Agent 不知道从哪里提取正面、“物流”、发货快这些信息。精确的 System Prompt你是一个专业的电商评论分析专家。分析规则 1. 情感倾向正面明确满意/ 负面明确不满/ 中性无明显倾向 2. 分类物流/质量/价格/服务/外观/使用/描述/包装/售后/品牌/复购/综合 3. 关键词2-4 个简洁准确 你必须严格按照 JSON 格式输出不要添加任何额外的文字说明。用这个 Prompt输出就变成了{sentiment:正面,category:物流,keywords:[发货快,包装好,质量好,价格实惠]}程序可以直接json.loads()解析。这就是 System Prompt 的威力。2.3 设计原则从实践中总结出 4 条 System Prompt 设计原则角色明确不是你是一个助手而是你是一个有 5 年经验的电商评论分析专家规则具体不是判断情感而是正面明确满意负面明确不满中性无明显倾向边界清晰明确告诉模型什么该做、什么不该做格式强制要求 JSON 输出并指定 JSON 结构三、Few-shot用示例教会模型3.1 Few-shot 的原理LLM 有一个很有趣的特性In-Context Learning——给它看几个示例它就能学会你的期望格式而不需要微调模型。Few-shot Prompting 就是利用这个特性在 Prompt 里加入 2-3 个示例让模型看到你期望的输入输出格式。3.2 示例选择策略示例的选择直接影响 Few-shot 的效果。好的示例应该满足多样性覆盖不同的情感倾向正面、负面、中性代表性选择常见的评论类型不要选极端案例边界案例最好包含 1 个模棱两可的案例教模型如何处理我们构造的 3 个 Few-shot 示例FEW_SHOT_EXAMPLES[{text:发货速度很快包装也很严实产品质量不错价格实惠非常满意,output:{sentiment: 正面, category: 物流, keywords: [发货快, 包装好, 质量好, 价格实惠]},},{text:用了三天就坏了质量太差了客服态度还不好退货退款处理中。,output:{sentiment: 负面, category: 质量, keywords: [质量差, 客服差, 退货]},},{text:还行吧中规中矩没有想象中那么好但也不差凑合用吧。,output:{sentiment: 中性, category: 综合, keywords: [中规中矩, 一般]},},]3.3 Zero-shot vs Few-shot 对比维度Zero-shotFew-shot格式正确率~70%~95%分类准确率~60%~90%关键词质量一般好Prompt 长度短较长适用场景简单任务格式要求严格结论如果你的任务格式要求严格Few-shot 是性价比最高的选择——不需要微调模型只需要在 Prompt 里加几个示例准确率就能大幅提升。四、JSON Mode让模型输出机器可读4.1 JSON Mode 的原理OpenAI 和大多数兼容 API 都支持 JSON Mode——通过response_format参数强制模型输出合法 JSONpayload{model:gpt-4o-mini,messages:[...],response_format:{type:json_object},}启用 JSON Mode 后模型会保证输出是合法的 JSON 字符串。但需要注意System Prompt 中必须包含 “json” 关键词否则可能报错模型仍然可能输出不符合 JSON Schema 的 JSON字段名不对、类型错误等JSON Mode 不能保证字段值的准确性只能保证格式合法4.2 JSON Schema 定义更高级的做法是定义 JSON Schema精确描述期望的输出结构{type:object,properties:{sentiment:{type:string,enum:[正面,负面,中性],description:评论的情感倾向},category:{type:string,enum:[物流,质量,价格,服务,外观,使用,描述,包装,售后,品牌,复购,综合],description:评论涉及的主要方面},keywords:{type:array,items:{type:string},minItems:2,maxItems:4,description:关键关键词}},required:[sentiment,category,keywords]}有了 JSON Schema模型就知道每个字段的类型、可选值和约束条件输出更稳定。4.3 容错处理即使做了这么多模型输出仍然可能出问题。生产环境中你必须有容错机制defparse_json_output(text:str)-Optional[dict]:从模型输出中提取 JSON支持多种容错策略# 策略 1直接解析try:returnjson.loads(text)exceptjson.JSONDecodeError:pass# 策略 2提取 json ... 代码块matchre.search(r(?:json)?\s*(\{.*?\})\s*,text,re.DOTALL)ifmatch:try:returnjson.loads(match.group(1))exceptjson.JSONDecodeError:pass# 策略 3提取文本中的 JSON 对象matchre.search(r\{.*?\},text,re.DOTALL)ifmatch:try:returnjson.loads(match.group(0))exceptjson.JSONDecodeError:pass# 策略 4查找最后一行 JSONlinestext.strip().split(\n)forlineinreversed(lines):ifline.strip().startswith({)andline.strip().endswith(}):try:returnjson.loads(line.strip())exceptjson.JSONDecodeError:continuereturnNone# 所有策略都失败返回 None这个容错函数会依次尝试 4 种策略把最常见的 JSON 格式问题都覆盖了。在生产环境中这能让你从 “模型输出偶尔不对” 变成 “99.9% 的情况下都能正确解析”。五、Chain-of-Thought让模型先思考再回答5.1 CoT 的原理Chain-of-Thought思维链的核心思想是让模型在输出最终答案之前先展示推理过程。这听起来反直觉——我们不是要精简输出吗但研究表明让模型先思考能显著提高复杂推理任务的准确率特别是数学、逻辑、多步分析等场景。5.2 CoT 的 Prompt 设计CoT 的 Prompt 设计关键是引导模型按步骤思考请按以下步骤分析评论 步骤 1先判断整体情感倾向并说明判断依据 步骤 2识别评论涉及的主要方面 步骤 3提取 2-4 个关键词 最后将分析结果汇总为 JSON 格式JSON 放在最后一行。这样设计后模型会先输出分析过程给人看或做日志然后输出 JSON给程序解析步骤 1情感倾向判断 评论中用户提到发货速度很快、包装也很严实、产品质量不错、价格实惠、 非常满意全是正面评价判断为正面。 步骤 2主要方面识别 评论涉及多个方面但核心是发货速度属于物流包装严实属于包装 产品质量不错属于质量价格实惠属于价格。综合判断用户最关注的是物流速度。 步骤 3关键词提取 发货快、包装好、质量好、价格实惠 {sentiment: 正面, category: 物流, keywords: [发货快, 包装好, 质量好, 价格实惠]}5.3 CoT 适用场景CoT 不是银弹它有明确的适用场景场景是否适合 CoT原因简单分类不适合增加 Token 消耗效果提升不明显复杂推理适合思维链能显著提升准确率多步分析适合分步思考减少遗漏情感判断不一定简单情感判断不需要 CoT结构化提取视情况如果字段关系复杂CoT 有帮助六、完整实战多策略对比评测code/prompt_compare.py提供了一个完整的评测脚本用 50 条真实商品评论对比 4 种 Prompt 策略的效果。6.1 测试数据我们从电商平台收集了 50 条真实评论涵盖不同情感倾向和类别统计项数值总评论数50正面评论22 条负面评论19 条中性评论9 条涉及类别12 个6.2 评测指标我们关注 3 个核心指标格式正确率输出是否能被json.loads()成功解析情感准确率情感判断是否与人工标注一致分类准确率类别判断是否与人工标注一致6.3 评测结果在 Ollama qwen2:7b 上的实测结果策略格式正确率情感准确率分类准确率说明基础 Prompt62%58%42%没有 System Prompt格式经常错System Prompt88%82%68%加了角色和规则效果明显提升Few-shot95%90%82%3 个示例效果最优Chain-of-Thought90%84%76%情感判断略好但 Token 消耗大关键发现基础 Prompt 几乎不能用格式正确率只有 62%意味着 38% 的输出程序无法解析System Prompt 是性价比最高的提升只需加一段角色定义和规则格式正确率从 62% 提升到 88%Few-shot 效果最好3 个示例就能让准确率提升到 90%是生产环境的首选CoT 在简单分类任务上优势不明显Token 消耗增加了 3 倍准确率提升却有限6.4 策略选择建议是否是否你的任务是什么格式要求严格需要复杂推理用 Few-shot准确率最高用 System Prompt性价比最高用 Chain-of-Thought提高推理准确率用 System Prompt或 Few-shot图 1Prompt 策略选择决策树七、小结与预告这节课我们系统学习了 Prompt Engineering 的 4 种核心策略System Prompt、Few-shot、JSON Mode、Chain-of-Thought。通过 50 条真实评论的对比评测我们验证了每种策略的实际效果。核心收获System Prompt 是基础定义角色、约束行为、指定格式是所有策略的基石Few-shot 最有效3 个高质量示例准确率提升 30%JSON 容错必须做模型输出不是 100% 可靠容错机制是生产环境的必需品CoT 要用对场景复杂推理用 CoT简单分类不要用从下一节课开始我们将进入向量检索的世界——嵌入模型和向量数据库。这是 RAG检索增强生成的核心技术也是构建知识库 Agent 的基础。我们下一课见。系列教程导航上一篇第 07 课 | 统一 LLM 客户端本地与云端 API 无缝切换下一篇第 09 课 | 嵌入模型 BGE 本地部署让机器理解语义本系列共 50 课持续更新中。关注我不迷路。