📑 目录
- [前言:Agent = 大脑(LLM) + 四肢(代码)](#前言:Agent = 大脑(LLM) + 四肢(代码))
- 第一层:地基(必备生存技能)
- [1. LLM(大语言模型)------ 大脑本身](#1. LLM(大语言模型)—— 大脑本身)
- [2. System Prompt(系统提示词)------ 性格与红线](#2. System Prompt(系统提示词)—— 性格与红线)
- [3. Tool Calling / Function Calling(工具调用)------ 连接大脑与四肢的桥梁](#3. Tool Calling / Function Calling(工具调用)—— 连接大脑与四肢的桥梁)
- 第二层:护栏(生产级稳定性)
- [4. Fallback(降级)------ 备胎策略](#4. Fallback(降级)—— 备胎策略)
- [5. Observability / Tracing(可观测性)------ 行车记录仪](#5. Observability / Tracing(可观测性)—— 行车记录仪)
- [6. Context Window Sliding(上下文窗口滑动)------ 记忆管理](#6. Context Window Sliding(上下文窗口滑动)—— 记忆管理)
- 第三层:进阶(架构师视野)
- [7. Hook Injection(钩子注入)------ 非侵入式控制](#7. Hook Injection(钩子注入)—— 非侵入式控制)
- [8. Agent Design Patterns(智能体设计模式 / ADPS框架)](#8. Agent Design Patterns(智能体设计模式 / ADPS框架))
- 实战起步路线图(照着做就能跑)
- 最后送你一句"工程心法"
随着AI的发展,对于编程的要求也越来越低,虽说低但不是没有,写这篇的目的就是针对像我这种准备入手学习的人,可以了解一下这些词汇,为以后的Agent开发可以增强一些理解,看完希望对你有所帮助。
📌 前言:Agent = 大脑(LLM) + 四肢(代码)
请先记住这个终极公式:
- LLM(大模型):负责"思考"和"决策",但它天生爱幻觉、爱废话、记性差。
- 工程代码:负责"执行"和"兜底",它是确定性的、可控的。
工程思维的核心:永远不要让LLM直接操作数据库或API,而是让LLM输出标准化指令,由工程代码去执行。下面我们按阶梯逐级攻克。
🔺 第一层:地基(必备生存技能)
这一层的概念如果你不懂,连一个能跑的Agent都写不出来。
1. LLM(大语言模型)------ 大脑本身
是什么:基于海量文本训练的概率预测模型,本质是"高级文字接龙"。
在Agent中的职责:理解用户意图、拆解任务、决定调用哪个工具。
关键工程认知:模型不是万能的。数学题算错、日期搞混是常态。永远不要指望"换个强模型"来解决架构问题。
2. System Prompt(系统提示词)------ 性格与红线
是什么:写在对话最开头的"铁律",告诉LLM它是谁、能做什么、绝对不能做什么。
实战例子:
text
你是一个严谨的财务助手。你的输出必须严格遵循JSON格式。
绝对禁止:编造数据;绝对禁止:执行修改数据库的操作。
如果用户问的问题超出知识库,请回复:{"status":"unknown"}
3. Tool Calling / Function Calling(工具调用)------ 连接大脑与四肢的桥梁
这是最重要的概念,没有之一。它不让LLM直接干活,而是让LLM填一张"标准工单"。
实战场景:用户说"查一下北京的天气"。
错误做法:让LLM直接调天气API(LLM不会发网络请求,会瞎编)。
正确工程做法(代码骨架):
python
# 1. 定义工具说明书(告诉LLM有这个能力)
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的实时天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称,如北京"}
},
"required": ["city"]
}
}
}]
# 2. 请求LLM(强制它必须调用工具)
response = openai.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "查一下北京的天气"}],
tools=tools,
tool_choice={"type": "function", "function": {"name": "get_weather"}} # 强制锁定
)
# 3. 解析LLM返回的标准化JSON(这就是"结构化输出")
tool_args = json.loads(response.tool_calls[0].function.arguments)
city = tool_args["city"] # 确定性地拿到了 "北京"
# 4. ⭐ 工程代码接管(此处才是真正的业务逻辑)
weather_data = requests.get(f"https://api.weather.com/{city}").json()
# 最后把结果喂给LLM生成自然语言回复,或者直接返回给前端
核心感悟:LLM只负责把"北京"从口水话里提取出来,真正的网络请求、异常处理、数据库读写,全是确定性代码干的活。
🛡️ 第二层:护栏(生产级稳定性)
当你跑通第一个Agent后,第二个要面对的问题是:用户一多、流量一涨,它怎么保证不崩、不乱花钱?
4. Fallback(降级)------ 备胎策略
是什么:当主力模型/API超时或报错时,自动切换到次优方案,保证Agent永远有响应。
实战链路:GPT-4(2秒超时) → 降级 → GPT-3.5(快但便宜) → 降级 → 本地缓存关键词匹配 → 降级 → 预设静态回复:"人工客服繁忙,请稍后重试"。
工程价值:用户体验不会从"慢"突然变成"报错500",而是优雅地降速。
代码示例(伪代码逻辑):
python
try:
resp = call_gpt4(user_input, timeout=2)
except TimeoutError:
try:
resp = call_gpt35(user_input, timeout=3)
except Exception:
resp = "抱歉,当前服务繁忙,请稍后重试。"
5. Observability / Tracing(可观测性)------ 行车记录仪
是什么:记录Agent的完整思考轨迹(Prompt输入、调用了什么工具、LLM返回了什么、耗时多少)。
为什么必须做:Agent准确率突然从90%掉到50%,你靠print()看控制台是找不到原因的。必须接入LangSmith、Braintrust或自建追踪库。
工程价值:能精准定位是RAG检索召回错了,还是LLM推理算错了数,而不是盲目修改提示词。
6. Context Window Sliding(上下文窗口滑动)------ 记忆管理
是什么:LLM的上下文长度有限(且昂贵)。不能每次都把整本聊天记录塞进去。
实战策略:保留最近N轮对话作为"短期记忆";把更早的对话用LLM压缩成200字摘要作为"长期记忆"放在系统提示词开头。
工程金句:管理Token的能力,就是管理成本的能力。
🚀 第三层:进阶(架构师视野)
当你的Agent开始处理复杂协作、多智能体通信时,这些概念能让你写出"优雅如诗"的代码。
7. Hook Injection(钩子注入)------ 非侵入式控制
是什么:在不修改核心业务代码的前提下,在LLM调用的前、中、后插入自定义逻辑。
实战场景:
- 调用前注入:拦截用户输入,检测是否包含"忽略系统指令"等恶意注入词,提前阻断。
- 调用后注入:拦截LLM输出,检查是否包含敏感词(如身份证号),自动打码。
- 调用中注入:在请求头里动态添加不同API Key,实现多租户计费隔离。
优雅之处:监控和安全的代码与业务逻辑完全解耦,想关就关,想开就开。
8. Agent Design Patterns(智能体设计模式 / ADPS框架)
是什么:针对特定问题场景的标准化"解题套路"。比如:
- Reflection(反思模式):Agent自己写完代码后,再自己当考官检查一遍,发现Bug自动修正。
- Tool Router(路由模式):入口处用轻量级分类器判断"这是闲聊"还是"需要查数据库",分流处理,节省巨额Token。
- Plan-and-Execute(计划-执行模式):对于复杂任务(如"帮我订机票并安排行程"),先让LLM生成步骤清单(Plan),再逐步执行,而非边做边想(容易半途迷失)。
工程价值:这就像软件工程里的"设计模式",让你不用重复造轮子,遇到特定场景直接套用成熟架构。
🎯 实战起步路线图(照着做就能跑)
如果你现在打算开始动手,请严格按照这个顺序,不要跳步:
- 先画流程图,再写代码:用Mermaid或纸笔画清楚"用户输入 -> 意图判断 -> 工具调用 -> 异常处理 -> 返回结果"的闭环。
- 写一个不带任何工具的裸Agent:只做System Prompt + 普通对话,理解messages数组的结构。
- 接入第一个Tool:选一个免费的公共API(例如查询IP归属地),严格按照上面的Tool Calling骨架实现。重点体会"LLM出参数,代码发请求"的分离感。
- 加上Try-Catch降级:故意把API地址写错,观察你的降级逻辑是否生效。
- 接入LangSmith(免费版):跑3次对话,查看Trace记录,看你能不能分清哪个是Input,哪个是Output。
- (可选)挑战一下Hook:写一个装饰器@log_llm_call,自动打印每次LLM调用的耗时和Token消耗,不污染你的核心函数。
💡 最后送你一句"工程心法"
把确定性留给代码,把不确定性关进提示词的笼子里;永远为失败做预案,永远为成本算细账。
Agent开发不是纯粹的机器学习研究,而是分布式系统 + 人机交互设计。当你把上面这些术语融会贯通时,你就已经超越了90%只会调API的初学者。
如果卡在Tool Calling的JSON解析报错上,记住:开启 tool_choice="required" 强制输出,比让模型"随意"生成要稳定得多。祝你编码愉快!🎉