Agent 开发常见名词说明与类比
核心类比:Agent 公司化
按"Agent 公司化"来记会最顺:大模型是员工,Prompt 是口头交代,Skill 是 SOP,Tool 是手,MCP 是门禁卡,Graph 是流水线。
名词对照表
| 名词 | 说明 | 类比 |
|---|---|---|
| LLM | 推理引擎,负责理解、规划、决策 | 刚入职的天才员工,脑子好但不懂你公司 |
| Prompt | 给模型的临时指令和上下文 | 当面口头交代,一次性、用完即走 |
| Rules | 长期行为约束和输出规范 | 员工手册,保证它不跑偏 |
| Tool | 原子能力,如查库、调 API、搜网 | 工位上的扳手、螺丝刀,一个函数干一件事 |
| Function Calling | 模型输出结构化调用意图的协议 | 员工写"派工单",真正执行还是你代码 |
| Skill | 可复用的业务方案包:指令+流程+工具+输出规范 | SOP 手册,解决"这类活怎么干" |
| MCP | 标准化连接协议,让 Agent 安全访问外部系统 | 统一门禁卡/USB-C 插座,解决"怎么连进去" |
| Memory | 短期会话上下文 + 长期向量记忆 | 记事本 + 档案柜 |
| Planning | 任务分解、计划生成、反思修正 | 项目经理拆 TODO |
| ReAct | 想→做→看→再想的循环 | 边干边看、动态调整 |
| Router | 按意图分类后派发给对应分支/工具 | 前台分诊台 |
| Subagent | 独立上下文、可隔离/并行的子智能体 | 外包团队 |
| Graph | 状态机编排:Node + Edge + State | 流水线/调度中心 |
| Node | 执行单元:LLM 调用、工具执行、纯逻辑 | 工位 |
| Edge | 节点间流转,含条件边和循环边 | 传送带/分叉口 |
| State | 节点间共享的数据容器 | 黑板/工单夹 |
| Checkpoint | 状态快照,支持断点续跑 | 存档点 |
| Subgraph | 封装成节点的子图,主图视作黑盒 | 独立车间,主流水线只看输入输出 |
容易混淆的点
- Skill ≠ Tool:Tool 是原子动作,Skill 是"什么时候用哪些 Tool + 怎么用 + 输出什么"的完整方案。
- MCP ≠ Function Calling:Function Calling 是模型内部的调用约定;MCP 是 Agent 和外部系统之间的连接标准。
- Graph ≠ Skill:Graph 是编排器,Skill 是能力包。一个 Skill 可以落地为一个 Node、一个 Subgraph,或一组 Tool 的组合。
- Subgraph 的关键价值是状态隔离:主图只关心它进什么、出什么,内部流程自己管。
实践建议
模型识别不到指令时,很多时候不是 Prompt 不够,而是 Tool 描述不清 或 路由分支没结构化。Tool 的 docstring 要写得像给一个完全不懂的人看,Skill 的触发条件也要显式化,别全靠模型自己悟。
示例:用 LangGraph 搭建一个"技术调研 Agent"
下面用一个具体的代码示例,把上面提到的名词串起来看一遍。
场景描述
用户说:"帮我调研一下 LangGraph 的最新文档和最佳实践,整理成报告。"
Agent 需要:理解意图 → 拆任务 → 分别搜索 → 汇总输出。
代码示例
python
from langgraph.graph import StateGraph, START, END
from langchain_core.tools import tool
from langchain_anthropic import ChatAnthropic
import json
# --- 1. 定义 State(黑板/工单夹)---
from typing import TypedDict, Annotated
import operator
class ResearchState(TypedDict):
query: str
steps: list
results: dict
report: str
# --- 2. 定义 Tool(工位上的工具)---
@tool
def search_docs(query: str) -> str:
"""搜索 LangGraph 官方文档内容。参数 query 是搜索关键词。"""
# 实际场景中调用文档 API
return f"搜索结果: {query} 的文档内容..."
@tool
def search_best_practices(query: str) -> str:
"""搜索 LangGraph 最佳实践和社区经验。参数 query 是搜索关键词。"""
return f"搜索结果: {query} 的最佳实践..."
# --- 3. 定义 Node(工位)---
def plan_node(state: ResearchState) -> ResearchState:
"""Planning 节点:把用户请求拆成子任务"""
model = ChatAnthropic(model="claude-sonnet-4-20250514")
plan = model.invoke([
{"role": "system", "content": "你是一个调研助理。把用户的调研请求拆成3个具体的搜索子任务,返回JSON数组。"},
{"role": "user", "content": state["query"]}
])
steps = json.loads(plan.content)["steps"]
return {"steps": steps, "results": {}}
def search_node(state: ResearchState) -> ResearchState:
"""搜索节点:并行执行各个子任务"""
tools = {"docs": search_docs, "practices": search_best_practices}
results = {}
for i, step in enumerate(state["steps"]):
# 这里用 tool calling 实际执行搜索
results[i] = f"完成了 '{step}' 的搜索"
return {"results": results}
def report_node(state: ResearchState) -> ResearchState:
"""报告节点:汇总搜索结果,生成最终报告"""
model = ChatAnthropic(model="claude-sonnet-4-20250514")
report = model.invoke([
{"role": "system", "content": "你是一个技术写手。根据搜索结果生成一份结构化的调研报告。"},
{"role": "user", "content": f"调研请求: {state['query']}\n搜索结果: {state['results']}"}
])
return {"report": report.content}
# --- 4. 构建 Graph(流水线)---
graph = StateGraph(ResearchState)
# 添加 Node(工位)
graph.add_node("plan", plan_node)
graph.add_node("search", search_node)
graph.add_node("report", report_node)
# 添加 Edge(传送带/分叉口)
graph.add_edge(START, "plan")
graph.add_edge("plan", "search")
graph.add_edge("search", "report")
graph.add_edge("report", END)
# --- 5. 编译并运行 ---
app = graph.compile(
checkpointer=MemorySaver(), # Checkpoint 存档点
)
result = app.invoke(
{"query": "帮我调研一下 LangGraph 的最新文档和最佳实践,整理成报告"},
)
print(result["report"])
执行流程图解
用户请求
│
▼
┌─────────┐
│ plan │ ← Planning 节点:拆任务
│ (LLM) │
└────┬─────┘
│ steps: ["搜索文档API", "搜索状态管理", "搜索错误处理"]
▼
┌─────────┐
│ search │ ← Tool 调用节点:并行执行搜索
│ (Tools) │
└────┬─────┘
│ results: {0: "...", 1: "...", 2: "..."}
▼
┌─────────┐
│ report │ ← LLM 节点:生成报告
│ (LLM) │
└────┬─────┘
│ report: "LangGraph 调研报告..."
▼
输出结果
这个例子里的名词对应
| 名词 | 在本例中的体现 |
|---|---|
| Graph | StateGraph 构建的整个流水线 |
| Node | plan_node、search_node、report_node 三个工位 |
| Edge | START→plan→search→report→END 的流转路径 |
| State | ResearchState 字典,节点间传递工单 |
| Tool | search_docs、search_best_practices 两个原子工具 |
| Function Calling | LLM 输出调用工具的 JSON 结构化指令 |
| Planning | plan_node 把用户请求拆成 3 个子任务 |
| Checkpoint | MemorySaver() 保存状态快照,支持断点续跑 |
| Skill | 整个"技术调研"流程可封装为一个 Skill,供其他 Agent 复用 |
| Subgraph | 如果搜索逻辑很复杂,可以拆成子图,主图只调一个 search_subgraph 节点 |