Day 003:Prompt 不是玄学,写好工业级 Agent 指令的稳定框架
系列:100 天系统学习 AI Agent 开发
当前阶段:01 - Agent 基础与环境搭建
今日目标:彻底搞懂 Agent System Prompt 的核心骨架(角色、目标、边界、工具规则、输出格式、异常处理)。
标签:AI Agent大模型Agent开发Prompt Engineering
很多刚接触 Agent 开发的同学,写 System Prompt 就像在“求神拜佛”——疯狂堆砌形容词,一旦模型输出不稳定,就继续往里加约束条件,最后变成了一篇小作文。
今天是咱们 100 天系列的第 3 天,咱们要把地基打牢:Prompt 不是玄学,而是工程。如果 Agent 指令没有清晰地界定角色、边界、工具使用规则和异常兜底方案,后面做工具调用、长文本记忆和效果评测都会变成“凭感觉盲调”。
今天咱们不贪多,就讲透这一件事,并手撕一个你明天就能直接复制进项目里的工业级 Prompt 框架。
一、 核心认知:Agent 指令到底在解决什么问题?
在写代码之前,我们需要先理清几个容易踩坑的概念边界。
1. 提示词越长 ≠ 越稳定
新手常有的误解是:只要我把每一种情况都写进 Prompt 里,Agent 就不会出错。
正解:真正重要的是规则可执行、指令无冲突、输出能验证。Prompt 是用来设定“工作流”,而不是用来穷举“所有异常”的。
2. 责任划分:模型与代码的边界
把普通聊天机器人叫成 Agent,往往是因为分不清谁该干什么。在真实的 Agent 开发中,务必记住这个原则:
- 大模型(LLM)负责:意图理解、逻辑推理、工具参数生成、最终文本润色。
- 代码负责:权限控制、数据校验、API 状态维护、报错重试(兜底)。
千万别让大模型去硬算精确的数学题,或者判断数据库的权限,这些是工程代码该干的事。
二、 今日实战:为“资料整理助手”写一份标准 System Prompt
为了让理论落地,今天的主任务是为一个【资料整理助手 Agent】编写 System Prompt。一个稳定的工业级 Agent 指令,必须包含以下几个核心模块。
你可以把这个模板直接保存,作为以后开发 Agent 的基座:
# Role (角色定位) 你是一个专业、严谨的「资料整理助手」。你的主要职责是从杂乱的文本、链接或文档中,提取核心信息并进行结构化归纳。 # Objective (核心目标) 1. 快速理解用户输入的冗长资料。 2. 识别并提取关键数据(时间、地点、人物、核心结论)。 3. 使用指定工具查证缺失的背景信息。 4. 输出格式统一、没有废话的摘要报告。 # Constraints (边界与约束 - 极其重要) - 绝对忠实于原文:如果不确定某项信息,请明确标记为“未提及”或调用搜索工具,禁止自行捏造(幻觉)。 - 权限限制:仅执行资料整理与信息检索任务,拒绝回答与该领域无关的闲聊问题。 - 中立客观:不要在总结中加入你个人的主观评价。 # Tools & Strategy (工具策略) 你有权调用以下工具: 1. `web_search`: 当用户资料中存在明显的信息断层或需要最新数据佐证时调用。 2. `format_validator`: 在最终输出前,必须确保你的输出符合规定的 JSON 或 Markdown 格式。 - 工具使用原则:先理解原文,如信息足够则不调用工具;如遇“不确定信息”,必须先调用 `web_search`。 # Output Format (输出格式) 请严格按照以下 Markdown 格式输出最终结果: ## 1. 核心摘要 (100字以内) ## 2. 关键实体提取 (列表形式) ## 3. 待核实信息 (如无则写“无”)三、 最小闭环:Prompt 是如何在工程中跑通的?
前面写的 Prompt 如果只是停留在概念上,很容易出现“Demo 跑得通,一上生产就崩溃”的问题。
Agent 的核心在于输入 -> 决策 -> 工具调用 -> 观察 -> 输出这五步。我用一段伪代码,帮你直观理解这个最小闭环中,Prompt 和代码是如何配合的:
defrun_agent_loop(user_input,system_prompt):# 1. 初始化对话历史 (载入今天写好的框架)messages=[{"role":"system","content":system_prompt},{"role":"user","content":user_input}]whileTrue:# 2. 模型决策 (LLM 负责推理)response=llm.generate(messages)# 3. 解析模型输出,判断是否需要调用工具ifresponse.wants_to_call_tool:tool_name=response.tool_name tool_args=response.tool_args# 4. 代码执行工具 & 异常兜底 (工程代码负责)try:observation=execute_tool(tool_name,tool_args)exceptExceptionase:observation=f"工具执行失败,错误信息:{e}。请调整参数后重试。"# 将观察结果喂给模型,继续循环messages.append({"role":"tool_observation","content":observation})else:# 5. 任务完成,输出最终结果returnresponse.final_text这段伪代码揭示了 Agent 开发中最重要的一点:Prompt 决定了wants_to_call_tool的准确率,而execute_tool的 try-catch 决定了系统的下限。
四、 今日总结与反思
今天的内容可以浓缩成一张结构化的学习卡片,欢迎收藏:
{"Day":3,"Topic":"Agent 指令应该如何写才稳定","Core_Principle":"角色定位清晰 + 边界约束严格 + 工具策略明确 + 输出格式可解析","Pitfall":"试图用超长的 Prompt 解决所有工程 Bug。记住,逻辑错误用代码兜底,而不是加长提示词。","Next_Step":"明天我们把这个 Prompt 放进真实的开发环境中,看看模型在实际调用工具时会遇到什么坑。"}100 天系列最有价值的地方,不是每天换一个新名词,而是每天都能留下可以复用的工程产物。今天这套 Prompt 框架和伪代码逻辑,我们会在后面的实战项目中反复用到。
明天,我们将进入 Agent 的记忆与状态管理环节。咱们 Day 004 见!
💡 讨论时间:
大家在写 Prompt 的时候,遇到过哪些“模型死活听不懂指令”的崩溃瞬间?欢迎在评论区聊聊,我来帮你诊断一下是不是“责任划分”出了问题。