Appearance
一句话总结:把 Agent 从"调框架"升级为"能拆解"——从最简 30 行跑通,到手写 ReAct 核心循环理解每一行,再到 LangGraph 节点化与生产化清单,这是 2 小时上手、随后按需加深的动手主线。
为什么从零写一遍
- 用框架 5 分钟出 Demo,但面试与排障都要求懂底层:每个 Agent 框架都是"循环 + 工具 + 记忆"的封装
- 理解 ReAct 循环为什么能防死循环、如何优化 Lost-in-the-Middle,才算从 AI 的"用户"变成 AI 的"工程师"
- 学习路径:先跑通(最简实现)→ 拆解(手写循环)→ 升级(LangGraph)→ 上生产
环境与项目结构(15 分钟)
bash
python -m venv agent-env
agent-env\Scripts\activate # Windows
pip install openai python-dotenv requests- 国内 API:DeepSeek(
base_url=https://api.deepseek.com/v1,价格约 OpenAI 1/20,接口兼容)或智谱 GLM——改base_url即可 - 目录:
src/{core,tools,memory}(core 分 agent.py 核心循环 + llm_client.py 调用封装)+tests/+logs/+.env - 新手推荐:LangChain(文档全、例子多)或先纯手写理解再上框架
最简 Agent:先跑通(30 行)
python
from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
from langchain_community.tools import DuckDuckGoSearchRun
from langchain import hub
llm = ChatOpenAI(model="gpt-4o")
agent = create_react_agent(llm, [DuckDuckGoSearchRun()], hub.pull("hwchase17/react"))
executor = AgentExecutor(agent=agent, tools=[DuckDuckGoSearchRun()], max_iterations=5)
print(executor.invoke({"input": "北京今天天气?"}))跑通后删掉框架,手写一遍才能掌握核心。
手写 ReAct 核心循环(纯 Python)
核心思想:思考(Thought)→ 行动(Action)→ 观察(Observation)→ 再思考……直到 Final Answer。
python
def run_agent(user_input, tools, max_iterations=10):
messages = [{"role": "system", "content": SYSTEM_PROMPT}, # 规定 Thought/Action/Action Input/Final Answer 格式
{"role": "user", "content": user_input}]
for _ in range(max_iterations): # max_iterations 防死循环与 Token 爆炸
resp = llm.chat(messages) # 1. 决策:调工具 or 直接回答
if resp 是 Final Answer:
return resp
action, args = parse(resp) # 2. 解析工具名与参数
try:
result = tools[action](**args) # 3. 执行
except Exception as e:
result = {"error": str(e)} # 4. 错误作为新 Observation,让模型自纠
messages.append(tool_result(result)) # 5. 回注继续循环
return "当前无法完成,请尝试简化需求" # 兜底:达最大轮次强制结束关键工程点:
max_iterations:硬性轮次上限——Agent 可能死循环,无上限一次对话能烧数百万 Token- 错误自纠:工具报错不抛异常杀死流程,转成 LLM 能读的 Observation 让它改参重试
- 并行 Tool Calling:互不依赖的工具让 LLM 一次生成多个
tool_call,asyncio.gather并发执行 - 记忆:messages 列表即短期记忆;长期记忆另接向量库/摘要压缩(见 [AI-Agent-记忆系统](/学习笔记/AI技术/AI Agent/AI-Agent-记忆系统))
工具定义:一个工具一张契约
python
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的天气",
"parameters": {"type": "object",
"properties": {"city": {"type": "string", "description": "城市名"}},
"required": ["city"]}
}
}]- 描述写清"做什么、何时用、边界";用
enum约束取值 - 工具 > 20 个时准确率从约 95% 掉到 75-80%——按每级 5-8 个分组暴露,可恢复 90%+
- 细粒度工具可封装成粗粒度工具、内部二次路由
- 工具错误信息就是 Agent 的"新 Observation":能否自愈取决于你给它什么错误消息
LangGraph 升级:从循环到图
- 节点化:把"决策"(agent_brain)与"执行"(execute_tools)拆成两个节点,逻辑干净、可测
- 条件边:模型返回
tool_calls→ 走执行节点;否则 → 直接回答(官方 Quickstart 范式) - 持久化 + 断点:支持人机协同(人工介入确认后再继续)
- Agentic RAG:route(生成查询 or 直接答)→ retrieve → grade(相关性打分,不合格重查)→ generate
- 多 Agent:meta agent 做有状态路由(
Command(goto=...))分发给子 Agent,每个子 Agent 是一个子图(Lyft 客服平台即此模式) - 角色分层:不同 Agent 用不同模型档位(如编码用 Pro 版、检索用普通版)——成本分层
生产化清单(上线前逐项过)
| 面 | 措施 |
|---|---|
| 死循环 | max_iterations + Token 预算上限;达限强制结束并给降级回复 |
| 工具可靠性 | 工具调用超时(asyncio.wait_for)+ 指数退避重试;只重试幂等调用 |
| 可观测性 | 上线前必须接 Tracing(LangSmith/LangFuse)——Agent 排障不能靠猜 |
| 成本 | 模型分层(简单→小模型);相同 RAG 查询走缓存;Prompt 瘦身 |
| 安全 | 写操作二次确认 + 审计日志;SQL 工具内部解析拒绝 DELETE/DROP/TRUNCATE |
| 降级 | 备用模型(主挂→备);每步超时触发降级;健康检查 /ping;限流 |
推荐学习路线
- 2 小时保姆级:从零搭建第一个 Agent(环境→组件→手写循环)
- 体系课程:Datawhale《从零开始构建智能体》(十六章节 + 五阶段 + 配套源码)
- 官方文档:LangChain LangGraph Quickstart → Agentic RAG 教程
- 生产案例:Lyft 客服平台(Router Multi-Agent)、超级研究员(三角色循环图)
面试要点
- 能手写 ReAct 循环骨架(含 max_iterations、错误自纠、并行 tool_call)
- 能讲清 ReAct vs Plan-and-Execute 的选型(见 [AI-Agent-面试实战](/学习笔记/AI技术/AI Agent/AI-Agent-面试实战))
- 能报出工具数量与准确率的经验值(>20 个 → 75-80%,分组 → 90%+)
- 能说清为什么"工具错误信息=新 Observation"是智能的关键
相关概念
- [AI-Agent-工具调用](/学习笔记/AI技术/AI Agent/AI-Agent-工具调用) — Function Calling 闭环与错误分类
- [AI-Agent-工作流编排](/学习笔记/AI技术/AI Agent/AI-Agent-工作流编排) — Workflows vs Agents、九大设计模式
- [AI-Agent-生产部署](/学习笔记/AI技术/AI Agent/AI-Agent-生产部署) — 上线基线、可观测、成本治理
- [AI-Agent-记忆系统](/学习笔记/AI技术/AI Agent/AI-Agent-记忆系统) — 短期/长期记忆落地
- [AI-Agent-评估评测](/学习笔记/AI技术/AI Agent/AI-Agent-评估评测) — 怎么验证 Agent 变好