提示词工程的底层逻辑:别再‘许愿‘了,这是一门工程学科
提示词工程的底层逻辑别再许愿了这是一门工程学科你在 Agent 代码里写的那几行 System Prompt决定了 Agent 是聪明还是智障。但大部分人写 Prompt 靠的是玄学——试到对为止。前言Prompt 是 Agent 的操作系统Agent 的 System Prompt 是什么它是 Agent 的系统指令定义了 Agent 的角色、行为、工具、规则。但多数人写 System Prompt 是这样system_prompt 你是一个有用的 AI 助手。 你可以使用以下工具 - get_weather(city) - send_email(to, subject, body) 然后跑了一遍发现 Agent 不听话就开始加请你务必“一定要”“注意”——越写越长越写越乱。问题出在哪你不是在写 Prompt你是在许愿。你没有理解模型到底是怎么理解你的文字的。一、模型如何理解提示词1.1 提示词是条件概率从技术角度看Prompt 的作用是设定条件概率的输入。P(回答 | Prompt)模型的任务是给定 Prompt生成最可能的 token 序列。这意味着Prompt 中的每个词都在影响输出的概率分布越靠近输入末尾的词影响越大重复出现的模式会被强化1.2 模型不是读你的文字是预测下一个词Prompt你是一个 AI 助手。 模型的处理 1. 在训练数据中搜索你是一个 AI 助手的上下文 2. 发现大量你是一个 AI 助手可以帮助用户的句子 3. 所以输出你可以帮助用户的概率很高关键洞察模型不是理解了你的 Prompt而是匹配到了训练数据中与你的 Prompt 最相似的模式。1.3 System Prompt 的工作原理System Prompt 之所以有效不是因为它是系统指令而是因为它占据了上下文窗口的前面位置设定了后续对话的语境。[System Prompt] → 设定角色、工具、规则 [User Message] → 受 System Prompt 影响 [Assistant Response] → 受 System Prompt User Message 共同影响 [User Message] → 进一步受之前对话影响 ...System Prompt 的位置优势在 Attention 中开头的 token 有全局可见性——它们可以影响所有后续的 token。二、提示词设计的三个层次2.1 层次一指令Instruction告诉模型做什么。翻译以下内容为英文 用 Python 写一个二分查找函数。 总结这篇文章的核心观点。关键指令要清晰、具体、唯一。模糊的指令得到模糊的输出。2.2 层次二上下文Context告诉模型在什么场景下。你是一个客服 Agent专门处理退换货问题。 用户刚购买了一个产品现在对产品不满意。 以下是公司的退换货政策...关键上下文不是装饰是模型生成的基础。没有上下文模型只能依赖训练数据中的通用模式。2.3 层次三约束Constraint告诉模型不能做什么。不要询问用户的个人信息。 如果不知道答案就说我不确定。 始终用中文回复。 输出格式必须为 JSON。关键约束要具体、可验证。模糊的约束“请友好回复”不如具体的约束“每句话都以’您好’开头”。三、提示词设计的核心原则3.1 原则一明确输出格式错误做法请告诉我北京今天的天气。模型可能输出一篇文章、一段话、一个列表正确做法请告诉我北京今天的天气。 输出格式{temperature: 温度, condition: 天气状况, humidity: 湿度}模型输出可解析的结构化数据3.2 原则二给出示例Few-shot零样本Zero-shot把以下句子翻译成英文今天天气很好。少样本Few-shot把以下句子翻译成英文 今天天气很好。 → The weather is nice today. 昨天下了雨。 → It rained yesterday. 明天会下雪。 → It will snow tomorrow. 现在刮风了。 → 为什么 Few-shot 有效因为模型在训练数据中见过示例 → 输出的模式。给 3 个示例就是在告诉模型我正在做这种任务。3.3 原则三位置越靠后影响越大# 错误做法把最重要的信息放前面system_prompt 你是 xx 公司的客服 Agent。 你可以使用以下工具 - search_knowledge_base(query) - check_order_status(order_id) - escalate_to_human(issue) 公司退换货政策... 注意如果用户询问退款请先查询订单状态。 注意不要透露公司内部信息。 # 正确做法把最重要的信息放最后system_prompt 你是 xx 公司的客服 Agent。 你可以使用以下工具 - search_knowledge_base(query) - check_order_status(order_id) - escalate_to_human(issue) 公司退换货政策... 最重要的规则 1. 如果用户询问退款请先查询订单状态。 2. 不要透露公司内部信息。 3.4 原则四减少歧义模糊请优化这段代码 # 优化什么性能可读性安全性清晰请优化这段代码的性能目标是将运行时间减少 50% 以上。3.5 原则五避免否定指令错误不要提到竞争对手的名字。 不要输出 Markdown 格式。正确只使用中文不提及任何公司名称。 以纯文本格式输出不要使用 Markdown。为什么模型在训练时更多看到的是应该做什么而不是不应该做什么。否定指令容易让模型混淆。四、提示词模板Agent 的 System Prompt 设计4.1 标准 System Prompt 模板【角色设定】 你是一个 [角色名称]专门负责 [任务描述]。 【核心能力】 你可以使用以下工具 1. [工具名称]([参数]): [工具描述] 2. [工具名称]([参数]): [工具描述] 【行为规则】 1. [规则 1] 2. [规则 2] ... 【输出格式】 [指定输出格式如 JSON] 【重要提醒】 [最关键的 1-2 条规则放在最后]4.2 Agent 专用示例system_prompt 你是一个智能助手 Agent专门负责协助用户完成各种任务。 【核心能力】 你可以使用以下工具来完成任务 1. search_web(query: str): 搜索网络获取最新信息 - 适合需要最新信息、不确定答案、需要验证事实 2. get_weather(city: str): 查询指定城市的天气 - 适合用户询问天气相关问题时 3. send_email(to: str, subject: str, body: str): 发送邮件 - 需要用户明确指定收件人、主题和内容 【工作流程】 1. 分析用户需求确定需要哪些工具 2. 按顺序调用工具每次都等待工具返回结果 3. 根据工具返回的结果决定下一步操作 4. 如果工具返回错误尝试修复或告诉用户 【重要规则】 1. 始终用中文回复 2. 如果不知道答案请使用搜索工具不要编造 3. 工具调用结果必须如实报告给用户 4. 不要执行任何可能对用户有害的操作 4.3 动态注入System Prompt 中的某些部分应该是动态的根据当前上下文生成defbuild_system_prompt(user_context,available_tools,session_info):promptf 你是一个帮助你完成任务的 AI Agent。 用户信息 - 名称{user_context.name}- 偏好{user_context.preferences}当前对话 - 已进行轮次{session_info.turn_count}- 已完成任务{session_info.completed_tasks}ifavailable_tools:promptf 你可以使用的工具当前对话中已加载{format_tools(available_tools)}returnprompt五、提示词优化的系统方法5.1 A/B 测试不要靠感觉判断哪个 Prompt 好做 A/B 测试prompt_a请把以下内容翻译成英文prompt_b现在需要你扮演一个翻译专家。请将以下中文内容准确翻译为英文保持原文风格和语气# 测试 100 个用例results_atest_translation(prompt_a,100)results_btest_translation(prompt_b,100)# 比较结果print(fPrompt A 准确率{results_a.accuracy})print(fPrompt B 准确率{results_b.accuracy})5.2 迭代优化V1初始 Prompt ↓ 评估找到薄弱环节 ↓ V2针对性修改 ↓ 评估对比 V1 和 V2 ↓ V3继续优化 ↓ ...每次只改一个变量同时改多个地方你不知道哪个改动的效果最好。5.3 反模式Prompt 越长越好不。有研究显示Prompt 超过一定长度后效果不再提升太长反而让模型迷失重点核心信息应该在 Prompt 末尾建议System Prompt 控制在 800-1500 字以内关键规则放在最后 200 字。六、Prompt 在 Agent 中的特殊考量6.1 工具调用 vs 自然回复Agent 的 Prompt 需要同时控制两种行为system_prompt 你的行为有两种模式 模式一工具调用 当你需要获取信息或执行操作时输出工具调用 {tool: search_web, params: {query: ...}} 模式二自然回复 当用户与你对话或你根据工具结果生成回复时以自然语言输出。 选择规则 1. 优先使用工具获取信息而不是凭记忆回答 2. 工具调用后根据结果生成回复 3. 如果工具返回错误分析原因并尝试修复 6.2 多轮对话中的 Prompt 设计在 Agent 的多轮对话中System Prompt 会逐渐在 Attention 中稀释。解决方案方案 1每轮重申关键规则defbuild_message(user_input,history):messages[{role:system,content:system_prompt},*history,# 在每轮用户输入前重申关键规则{role:system,content:提醒优先使用工具获取信息不要编造},{role:user,content:user_input},]returnmessages方案 2关键规则注入到用户消息中defbuild_message(user_input,history):messages[{role:system,content:system_prompt},*history,# 把关键规则放在用户消息末尾{role:user,content:f{user_input}\n\n[系统提示请使用工具获取信息不要凭记忆回答]},]returnmessages总结原则含义实践条件概率Prompt 设定输出概率精确措辞比模糊强调更有效位置优势末尾信息影响力最大关键规则放最后输出格式明确指定输出格式给定模板或示例配合 Structured Output API少样本示例比指令更有效给 2-3 个示例迭代优化每次改一个变量A/B 测试持续改进Prompt 不是玄学是工程。理解模型的工作原理然后系统性地设计、测试、优化。下一篇文章我们将深入结构化提示词——多角色、多段落、格式约束以及如何让 Agent 输出完全可控。思考题你现在的 Agent System Prompt 有多长哪些部分是可以精简的如果你要让 Agent 在 10 轮对话后仍然记得第一条规则你会怎么做少样本示例在 Agent 的工具调用中应该怎么用给一个具体的例子上一篇[08] 模型评估与基准测试下一篇[10] 结构化提示词多角色、多段落