欢迎来到《Python + AI Agent 实战开发完全指南》专栏!
在前面的课程中,我们成功让大模型跑通了ReAct循环。但在实际开发中,很多开发者会遇到一个令人抓狂的现象:明明代码逻辑没问题,但Agent就是会"发疯"——比如它忘记调用工具直接瞎编答案,或者输出的JSON格式缺胳膊少腿导致程序崩溃。
这其实是因为:大模型本质上是一个概率预测机器,而不是一个严格的执行引擎。
今天这一讲,我们就来聊聊如何给Agent装上"严谨的大脑",通过Prompt工程和结构化输出,让它乖乖按照我们的规矩办事。
一、为什么你的Agent总是"不听话"?
在编写Agent的提示词(System Prompt)时,新手最容易犯的错误是指令模糊。
错误示范:
“你是一个助手,请帮用户解决问题,如果需要查资料就用搜索工具。”
大模型的困惑:
“什么时候算’需要’?我是不是应该先自己猜一下再搜?搜完的结果要不要告诉用户?”
核心问题:
Agent的System Prompt不是用来"聊天"的,它是用来写代码逻辑的。你必须像写if-else一样,把边界条件和行为规范写得清清楚楚。
二、打造Agent专属的"黄金Prompt"模板
一个优秀的Agent系统提示词,通常需要包含以下四个核心模块:
💡 实战:一份工业级的AgentPrompt示例
你是一个专业的数据分析Agent。你的任务是帮助用户分析数据并给出结论。
【可用工具】
– search_database: 用于查询历史销售数据。
– calculator: 用于复杂的数学运算。
【工作准则】
1. 永远不要凭空捏造数据。如果不知道答案,必须调用search_database。
2. 每次只能调用一个工具,等待Observation结果后再决定下一步。
3. 当且仅当你确信已经掌握了所有必要信息时,才能输出Final Answer。
4. 你的回复必须严格遵循Thought/Action/Observation/Final Answer的格式。
三、致命痛点:结构化输出(Structured Output)
在第3讲的代码中,我们用split("\\n")来提取大模型输出的Action和参数。说实话,这种字符串解析方式非常脆弱。只要大模型稍微调皮一点(比如多加个换行符),整个Agent就会崩溃。
真正的企业级做法是:强制大模型返回标准的JSON格式。
目前主流的大模型(如智谱GLM、通义千问等)都支持在API层面开启response_format={"type": "json_object"},或者通过Function Calling机制直接返回结构化数据。
🧩 代码演示:告别脆弱的字符串解析
让我们用更优雅的方式重构上一讲的Agent核心逻辑:
import json
from openai import OpenAI
client = OpenAI(api_key="your-api-key", base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")
def get_agent_next_step(messages):
"""
强制大模型以标准JSON格式返回决策结果
"""
response = client.chat.completions.create(
model="qwen-turbo",
messages=messages,
# 【核心魔法】:强制要求输出合法的JSON对象
response_format={"type": "json_object"}
)
content = response.choices[0].message.content
try:
return json.loads(content)
except json.JSONDecodeError:
return {"error": "大模型未返回合法JSON", "raw_content": content}
# 模拟测试
system_prompt = """你是一个决策引擎。请以纯JSON格式返回你的下一步动作。
格式要求:{"thought": "你的思考过程", "action": "工具名称或null", "final_answer": "最终答案或null"}"""
test_messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": "帮我查一下北京的天气"}
]
result = get_agent_next_step(test_messages)
print(result)
运行这段代码,你会得到一个极其干净的字典:
{
"thought": "用户需要查询北京的天气,我需要使用天气查询工具来获取信息。",
"action": "weather_query",
"final_answer": None
}
有了这个标准的字典,你在Python里只需要简单地判断if result["action"]:就可以精准路由,再也不用去苦苦split字符串了!
四、本节小结与避坑指南
📌 核心要点总结
⚠️ 生产环境避坑指南
五、课后思考与实践
🧠 思考题
💻 实践任务
六、下一讲预告
下一讲,我们将正式进入Agent的"手脚"部分——工具调用(Tool Calling)底层机制。我们会带你手写一个真实的联网搜索工具,并接入到我们的Agent系统中。准备好让你的智能体真正"连接世界"了吗?





