AI 学习路线 · 进阶
Part 10 · Agent 基础
让模型从"会聊天"变成"能干活":自己拆任务、调工具、看结果、再行动。
Section 1 · Agent 是什么(概念 + 亲身体验)
Subsection 1 · 概念
Agent(智能体)= 让大模型"闭环干活": 收到目标 → 自己规划 → 调工具 → 看结果 → 再决定下一步 → 直到完成对比: 普通对话:你问一句,它答一句(用完就停) Agent: 你给个目标,它自己一路干到底Subsection 2 · 看一个现成 Agent
- 打开 https://metagpt.com 或 https://github.com/geekan/MetaGPT 的 README,看它"模拟一家软件公司"的演示动图。
- 预期看到:多个"角色"(产品经理/程序员/测试)分工协作,自动产出文档和代码。
- 先建立一个直觉:多 Agent = 多个角色分工。
过关:能说清"Agent 和普通对话的区别" = Section 1 完成。
Section 2 · Agent 四要素
Subsection 1 · 记四要素
① 规划 Planning 拆任务:把大目标拆成小步骤,干一步想下一步② 记忆 Memory 短期=当前对话;长期=跨会话的知识/历史(存向量库)③ 工具 Tools 让模型能"动手":搜索/计算/查库/发请求④ 执行 Action 真的去调用工具、读取结果、决定下一步Subsection 2 · 对照Part 7 的成果
- 你Part 7 的 lc_agent.py 已经有"工具 + 执行"了。缺的是规划和记忆——正是Part 8 要补的。
过关:能说出四要素并对应到自己的代码 = Section 2 完成。
Section 3 · ReAct 框架(Agent 的"思考循环")
Subsection 1 · 记循环
ReAct = 思考(Reason) + 行动(Act) 交替循环: ① Thought 我想想现在该干嘛 ② Action 调用一个工具/动作 ③ Observation 观察工具返回结果 → 回到①,直到得出 Final Answer- 你Part 7 的
create_agent底层就是 ReAct。把它翻译成人话:“先想,再做,看了结果再想”。
Subsection 2 · 看模型"自言自语"
- 跑一遍Part 7 的 lc_agent.py(
debug=True会打印工具调用过程),仔细看日志。 - 预期看到:日志里明显有"思考→调用工具→观察→给答案"的步骤。
过关:能对着日志讲出 ReAct 循环 = Section 3 完成。
Section 4 · Function Calling 深入(多参数多工具)
Subsection 1 · 定义 3 个工具
新建 fc_multi.py:
import osfrom dotenv import load_dotenvfrom langchain_openai import ChatOpenAIfrom langchain_core.tools import toolload_dotenv()llm = ChatOpenAI(model="deepseek-chat", api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com")@tooldef add(a: float, b: float) -> float: """两个数相加。""" return a + b@tooldef multiply(a: float, b: float) -> float: """两个数相乘。""" return a * b@tooldef get_weather(city: str) -> str: """查询某城市天气(模拟数据)。""" data = {"北京": "晴 25℃", "上海": "多云 28℃", "苏州": "小雨 24℃"} return data.get(city, "暂无数据")print(add.invoke({"a": 1, "b": 2}))print(get_weather.invoke({"city": "苏州"}))- 预期看到:3 和 “小雨 24℃”。
- 工具越多,模型能干的活越多;docstring 要写清参数含义。
过关:三个工具都能 invoke = Section 4 完成。
Section 5 · 多工具自动选择(模型自己挑工具)
Subsection 1 · 组装 Agent
新建 fc_agent.py:
import osfrom dotenv import load_dotenvfrom langchain_openai import ChatOpenAIfrom langchain_core.tools import toolfrom langchain.agents import create_agentload_dotenv()llm = ChatOpenAI(model="deepseek-chat", api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com")@tooldef add(a: float, b: float) -> float: """两个数相加。""" return a + b@tooldef multiply(a: float, b: float) -> float: """两个数相乘。""" return a * b@tooldef get_weather(city: str) -> str: """查询某城市天气。""" data = {"北京": "晴 25℃", "苏州": "小雨 24℃"} return data.get(city, "暂无数据")tools = [add, multiply, get_weather]# LangChain 1.x:create_agent 统一了旧版 create_tool_calling_agent + AgentExecutoragent = create_agent( model=llm, tools=tools, system_prompt="你是全能助手,需要计算就调计算工具,需要天气就调天气工具。", debug=True,)result = agent.invoke({"messages": [{"role": "user", "content": "苏州天气怎么样?顺便算一下 15 乘以 32。"}]})print(result["messages"][-1].content)- 预期看到:debug 日志里模型连续调用两个工具(天气 + 乘法),最后汇总回答。
- 这就是"Agent 自动规划工具调用"——它自己决定先查天气、再算乘法。
过关:一个输入里模型自动调两个工具 = Section 5 完成。
Section 6 · 短期记忆 vs 长期记忆
Subsection 1 · 记区别
短期记忆 当前这次对话的上下文(拼在 messages 里)——站7 Day5 做过长期记忆 跨对话的知识:用户偏好、历史记录 → 存向量库/数据库,下次对话再检索Subsection 2 · 看 LangGraph 的 Checkpointer
- B 站搜
LangGraph memory checkpoint看 15 分钟。 - 记结论:LangGraph 用
MemorySaver存 Agent 每步状态,重启还能接上。知道有这机制即可,Section 7 手动实现长期记忆。
过关:能分清短期/长期记忆 = Section 6 完成。
Section 7 · 手动实现长期记忆(向量库存历史)
Subsection 1 · 跑代码
新建 long_memory.py:
import os, chromadbfrom dotenv import load_dotenvfrom langchain_openai import ChatOpenAIfrom sentence_transformers import SentenceTransformer, utilload_dotenv()llm = ChatOpenAI(model="deepseek-chat", api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com")model = SentenceTransformer("BAAI/bge-small-zh-v1.5")mem = chromadb.PersistentClient(path="mem_db").get_or_create_collection("user_memory")def remember(text): """把一句话存入长期记忆""" mem.upsert( ids=[f"m{mem.count()}"], embeddings=model.encode([text]).tolist(), documents=[text], )def recall(query, k=2): """按语义找相关的历史记忆""" qv = model.encode([query]).tolist() r = mem.query(query_embeddings=qv, n_results=k) return r["documents"][0]# 存几条"用户偏好"remember("用户叫小明,喜欢简洁的回答")remember("用户正在学AI Agent开发")remember("用户讨厌啰嗦的长文")# 模拟下次对话:只凭"这个人喜欢什么风格"来召回print("召回:", recall("这个用户喜欢什么回答风格"))- 预期看到:召回"喜欢简洁的回答"。
- 这就是长期记忆:跨对话记住用户,下次自动调出来。Agent 记住了"你"。
过关:长期记忆能召回 = Section 7 完成。
Section 8 · 规划:子任务拆解(Plan-and-Execute 第一步)
Subsection 1 · 让模型拆任务
新建 planner.py:
import osfrom dotenv import load_dotenvfrom langchain_openai import ChatOpenAIload_dotenv()llm = ChatOpenAI(model="deepseek-chat", api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com")goal = "我要转行AI Agent开发,三个月内达到能独立做产品的水平,帮我拆成周计划"resp = llm.invoke(f"你是资深学习规划师。请把目标拆成可执行的小任务清单,用编号列出,每项一句话:\n{goal}")print(resp.content)- 预期看到:模型输出 8~12 条有序小任务。
- 这就是 Planning:大目标 → 子任务。Agent 会先出计划,再逐步执行(Plan-and-Execute 框架)。
过关:能拆出清晰子任务 = Section 8 完成。
Section 9 · 规划:反思与改进(Reflection)
Subsection 1 · 跑"写→评→改"循环
新建 reflection.py:
import osfrom dotenv import load_dotenvfrom langchain_openai import ChatOpenAIload_dotenv()llm = ChatOpenAI(model="deepseek-chat", api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com")# 第一轮:写draft = llm.invoke("写一段关于'折叠思维'这个博客站点的介绍,50字以内。").contentprint("初稿:", draft, "\n")# 第二轮:Critic 批评critic = llm.invoke(f"这段文字有什么问题?从'是否通顺/是否有AI味/是否吸引人'三个角度批评:\n{draft}").contentprint("批评:", critic, "\n")# 第三轮:按批评重写revised = llm.invoke(f"根据这些意见重写,50字以内:\n{draft}\n\n意见:{critic}").contentprint("改后:", revised)- 预期看到:初稿 → 批评 → 改后,第三轮明显更好。
- 这就是 Reflection(反思):让模型自己当"审查员"再修改。高质量 Agent 都带这步。
过关:能跑通"写→评→改" = Section 9 完成。
Section 10 · 自定义工具集(Toolkits)
Subsection 1 · 打包一组工具
新建 toolkit.py:
import osfrom dotenv import load_dotenvfrom langchain_openai import ChatOpenAIfrom langchain_core.tools import toolfrom langchain.agents import create_agentload_dotenv()llm = ChatOpenAI(model="deepseek-chat", api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com")# 一组"数学工具箱"@tooldef add(a: float, b: float) -> float: """相加""" return a + b@tooldef subtract(a: float, b: float) -> float: """相减""" return a - b@tooldef multiply(a: float, b: float) -> float: """相乘""" return a * bmath_tools = [add, subtract, multiply] # 打包成工具集agent = create_agent( model=llm, tools=math_tools, system_prompt="你是计算器。", debug=True,)result = agent.invoke({"messages": [{"role": "user", "content": "计算 (35 - 8) * 2 + 100"}]})print(result["messages"][-1].content)- 预期看到:模型分步调用 subtract / multiply / add,算出 154。
- 工具集 = 一组相关工具,让 Agent 在这个领域"全能"。
过关:连算多步跑通 = Section 10 完成。
Section 11 · 认知框架对比
Subsection 1 · 记四个框架
ReAct 边想边做边看(站8主力,create_agent 底层就是这个)Plan-and-Execute 先出完整计划,再逐步执行(适合复杂长任务)Self-Ask 遇到不懂就先问自己小问题(链式拆解)Thinking/Reflection 做完反思改进(Day9 做过)Subsection 2 · 场景选择练习 判断:① 简单查天气 ② 三个月转行计划并执行 ③ 写文章要反复打磨 → 各用哪个框架? (答案:①ReAct ②Plan-and-Execute ③Reflection)
过关:能答对 = Section 11 完成。
Section 12 · 多 Agent 简介
Subsection 1 · 记四个多 Agent 项目
AutoGPT 一个目标自驱动的通用 agentCAMEL "两个 AI 互相角色扮演"协作AutoGen 微软的多 agent 对话编排MetaGPT 模拟软件公司:产品/开发/测试多角色分工- 思路统一:多个角色各司其职 + 互相传递结果 = 1+1>2。
Subsection 2 · 读 AutoGen 快速上手
- 打开 https://github.com/microsoft/autogen 看 README 前 1/3,理解"两个 agent 对话协作"长什么样。
过关:能说出多 Agent 为什么强 = Section 12 完成。
Section 13 · 实战:做一个"查资料 + 计算"的综合 Agent
Subsection 1 · 组装
新建 my_agent.py:组合 Tavily(Part 9 Section 11)+ 计算工具 + 记忆:
import osfrom dotenv import load_dotenvfrom langchain_openai import ChatOpenAIfrom langchain_core.tools import toolfrom langchain_community.tools import TavilySearchResultsfrom langchain.agents import create_agentload_dotenv()llm = ChatOpenAI(model="deepseek-chat", api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com")@tooldef add(a: float, b: float) -> float: """相加""" return a + b@tooldef multiply(a: float, b: float) -> float: """相乘""" return a * bsearch = TavilySearchResults(max_results=2)tools = [add, multiply, search]agent = create_agent( model=llm, tools=tools, system_prompt="你是研究助手:查资料用搜索,算数用计算工具。", debug=True,)result = agent.invoke({"messages": [{"role": "user", "content": "搜索一下2026年最火的AI编程工具,然后帮我算 3 个加起来是多少:如果每个订阅费分别是 20、15、18 美元。"}]})print(result["messages"][-1].content)- 预期看到:模型先调用搜索工具,再调用 add 多次算总和,最后汇总回答。
- 这就是一个能"研究 + 计算"的真实 Agent 了。你的作品集 +1。
过关:综合 Agent 跑通 = Section 13 完成。
Section 14 · 测试与坑
Subsection 1 · 记坑
坑1 工具调用循环卡死 → 给 create_agent 加 max_iterations=5 限制坑2 模型不调工具 → docstring 写清楚"何时用"坑3 长任务上下文爆炸 → 截断历史 / 用 LangGraph 状态管理坑4 工具抛异常 → 工具内 try/except 返回友好错误,别让整个 Agent 崩Subsection 2 · 测试
- 给 my_agent.py 的
create_agent(..., max_iterations=5),测 5 个不同任务,验证不卡死。
过关:坑笔记 + 测试通过 = Section 14 完成。
Section 15 · 站 8 验收
勾选
- 能说清 Agent vs 对话,四要素
- 能对着日志讲 ReAct 循环
- 多工具 Agent 自动选择工具跑通(Section 5)
- 长期记忆能召回(Section 7)
- 子任务拆解跑通(Section 8)
- 反思"写→评→改"跑通(Section 9)
- 工具集连算跑通(Section 10)
- 能说出四个认知框架 + 适用场景
- 能说出四个多 Agent 项目
- my_agent.py 综合 Agent 跑通(查资料+计算)
写 400 字Part 8 总结:你的 Agent 能干什么、用了哪些工具、遇到过什么坑。
全勾选 = Part 10 通过 = 第一段(0→1)完成
接下来做第一段总验收(见 21-llm-part1-0to1.md 的" 第一段总验收"):把聊天机器人、RAG 知识库、Agent 三个作品打磨上线、写 README、推 GitHub。
全部上线后,进入第二段 Part 11 · 多 Agent 与 Agent IDE)。
