返回学习路线

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:

python
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:

python
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:

python
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:

python
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:

python
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:

python
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 快速上手

过关:能说出多 Agent 为什么强 = Section 12 完成。


Section 13 · 实战:做一个"查资料 + 计算"的综合 Agent

Subsection 1 · 组装 新建 my_agent.py:组合 Tavily(Part 9 Section 11)+ 计算工具 + 记忆:

python
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)。