Chapter 06–07 · Framework Internals

别先学框架 API,先看懂框架替你封装了什么

LangGraph、AutoGen、AgentScope 看起来差异很大,但拆到最后都会落回几个核心抽象:LLM、Message、Tool、State、Agent、Runtime。真正学会这些,你以后换任何框架都不会从零开始。

LLM做决策
Reason / Choose / Respond
State存当前进度
任务状态机
Tool连接外部能力
执行真实动作
Runtime负责真正运行
Loop / Error / Retry

1. Agent Framework 到底在封装什么?

Agent Framework ≈ LLM + Message + Tool + State + Agent Loop + Runtime
User Goal LLM Decision Maker Agent Strategy / Policy State Progress / History Runtime Execute / Retry / Loop Message 统一交换格式 Tools Files / Web / Shell / DB
核心思想:框架不是让模型“突然更聪明”,而是把大量通用工程能力标准化:状态管理、工具调用、控制流、持久化、重试、消息结构、日志、并发、检查点。

2. LangGraph:把 Agent 看成状态图

LangGraph 最重要的抽象不是 API,而是:State + Node + Edge

Graph = State + Node + Edge
State messages / plan / result LLM Node 做判断 Tool Node 执行动作 Router Conditional Edge END 完成
📦

State

当前运行状态,例如消息、任务进度、工具结果。

⚙️

Node

本质就是函数:调用模型、执行工具、处理数据。

↔️

Edge

决定下一步去哪里,相当于显式控制流。

为什么不是直接 while True?简单 Agent 可以,但复杂系统有分支、回退、人工确认、检查点、并发时,Graph 能把控制流显式化。

3. AutoGen:重点理解 Multi-Agent 协作

AutoGen 最值得学的不是接口,而是:多个 Agent 如何通过消息与团队结构协作。

Research Agent 找资料 Manager / Team 调度与协作 Code Agent 执行与调试 Reviewer Agent 验证结果
Multi-Agent ≠ 自动更强。更多 Agent 会增加 Token、延迟、协调成本和错误传播。只有职责、工具、上下文确实需要分离时才值得拆。

4. AgentScope:观察“消息”和“工具箱”的设计

AgentScope 适合用来理解一个成熟 Agent 框架为什么会把 Message 和 Toolkit 单独抽象出来。

💬

Message

Message( role="user", content="分析这个报错", metadata={...} )

统一 Agent、LLM、工具之间的数据交换格式。

🧰

Toolkit

Toolkit( tools=[ search, run_python, read_file ] )

统一管理工具的 Schema、调用方式与执行能力。

5. 自己搭一个 Agent Framework,需要哪几个核心组件?

🧠

LLM

统一封装不同模型供应商。上层 Agent 不应该关心 OpenAI、Qwen 还是 Gemini。

💬

Message

统一消息结构:role、content、tool_calls、metadata。

🛠

Tool

定义 name、description、parameters 和 run()。

🤖

Agent

定义控制策略,例如 ReAct、Reflection、Plan-and-Solve。

📦

State

保存当前任务的进度、计划、工具结果与临时信息。

Runtime

负责真正执行循环、工具、错误处理、重试、终止条件。

最小目录结构

hello_agents/ ├── core/ │ ├── llm.py │ ├── message.py │ ├── agent.py │ └── state.py ├── agents/ │ ├── react_agent.py │ ├── reflection_agent.py │ └── plan_solve_agent.py ├── tools/ │ ├── base.py │ └── registry.py └── runtime/ └── executor.py

6. Runtime / Harness:Agent 系统真正“干活”的地方

这是最容易被忽略、但最关键的概念之一。

LLM = Decision Maker  Runtime = Execution Engine
while step < max_steps: response = llm.chat( messages=state.messages, tools=tool_schemas ) if response.final: return response.answer tool_call = response.tool_call result = runtime.execute_tool(tool_call) state.update(result) step += 1

LLM 负责

理解任务、选择动作、生成参数、判断是否完成。

Runtime 负责

调用模型、执行工具、维护状态、处理异常、限制最大步数、重试、记录日志。

关键区分:“Agent 想执行命令”和“系统真的允许并执行命令”是两件事。权限、沙箱、超时、重试,都属于 Runtime / Harness 层。

7. State ≠ Memory

概念含义例子
State当前这次运行中的状态现在执行到第 3 步、最新报错、当前计划
Memory跨步骤甚至跨会话保留的信息过去失败经验、用户偏好、长期知识
记忆口诀:State 回答“现在做到哪”,Memory 回答“以前发生过什么”。第 8~9 章会进一步展开。

8. 映射到“科研论文复现 Agent”

Reproduction Agent 总体策略 Runtime Loop / Retry / Execute Paper Tool PDF / 实验设置 Repo Tool GitHub / README Shell Tool install / run / test Evaluator 指标与结果验证 State
Agent:决定当前要解决“环境问题、代码问题还是实验问题”。
Runtime:真正执行 read / clone / install / run / retry。
Tools:负责 PDF、GitHub、Shell、测试与指标提取。
State:保存当前步骤、环境信息、错误日志、实验结果。
Evaluator:判断是否达到复现目标,必要时触发下一轮。

9. 一页总结

LangGraph = State + Node + Edge
AutoGen = Agent + Team + Message
AgentScope = Agent + Message + Toolkit
Agent Framework = LLM + Message + Tool + State + Agent + Runtime
LLM 决策;Runtime 执行
你真正要会的含义
为什么需要 Message统一模块之间的数据交换格式
为什么需要 State保存当前任务运行状态
为什么需要 Tool Registry统一发现与执行工具
为什么需要 Runtime把模型决策变成真实执行
为什么需要 Graph复杂控制流显式化
下一份:第 8~9 章——Memory、RAG、State、Context Engineering。重点把四个最容易混淆的概念彻底区分,并画出 GSSC:Gather → Select → Structure → Compress。