四智能体协作系统
基于 LangGraph 的 Planner(规划)- RuleMaker(标准制定)- Executor(执行)- Evaluator(评估) 通用四智能体协作框架,支持持久化、人工审批、模型分层、错误降级、可观测性、外部工具调用与多场景验证。
目录
项目简介
本项目将单一 LLM 调用逐步演进为一个结构化的多智能体协作系统:
- PlannerAgent:根据用户目标生成可执行计划与专业角色。
- RuleMakerAgent:在任务执行前独立制定结构化评分表,确保评估标准客观、可量化。
- ExecutorAgent:根据计划生成具体执行结果(如文案、代码、报告等)。
- EvaluatorAgent:依据 RuleMaker 生成的评分表对执行结果打分,决定通过或触发重规划。
整个流程由 LangGraph 的 StateGraph 编排,支持重试循环、人工审批、状态持久化与模型分层策略。框架已在研报生成、代码审查、课程设计、客户投诉处理、竞品分析、合同审查六个垂直场景下验证通用性。
核心特性
| 特性 | 说明 |
|---|
| 四智能体闭环 | planner → rule_maker → executor → evaluator,评估失败后自动重规划。 |
| LangGraph 编排 | 使用 StateGraph、conditional_edges 与 interrupt 实现工作流。 |
| 模型分层策略 | 规划/标准制定使用强模型,执行/评估使用轻量模型,兼顾质量与成本。 |
| 持久化 | 支持 MemorySaver(内存)、SqliteSaver(SQLite)与 PostgresSaver,可断点续跑。 |
| 人工审批(HITL) | evaluator 后可插入人工审批节点,默认使用 LangGraph functional interrupt。 |
| 错误处理与降级 | 每个节点被 _robust_node_wrapper 包裹,异常时返回降级状态并记录日志。 |
| 可观测性 | 内置本地 GraphRunObserver 追踪节点事件;支持 JSON/simple 结构化日志。 |
| 外部工具调用 | ExecutorAgent 支持 web_search、file_reader 等工具,可扩展自定义工具。 |
| 多场景验证 | 提供研报生成、代码审查、课程设计、客户投诉处理、竞品分析、合同审查 6 个垂直场景示例。 |
| 可交互 Demo | 提供 Gradio 可视化界面与 FastAPI HTTP 服务。 |
| RAG 向量检索 | VectorSearchTool 基于 ChromaDB 实现本地知识库检索。 |
| MCP 协议接入 | MCPClientTool 可连接外部 MCP Server,复用其暴露的工具。 |
| A2A 协议接入 | A2AClientTool 支持 Agent 之间互相委托任务,并提供 /a2a 端点。 |
| 效果量化基准 | benchmark.py 对比单 Agent 与四智能体,支持关键词覆盖、ROUGE、BERTScore、LLM-as-judge。 |
| 流式输出 | StreamingExecutor 与 /workflow/stream 接口实现 Agent 工作流 token 级 SSE。 |
| CI / 代码规范 | GitHub Actions 自动运行 pytest + ruff。 |
| Docker 部署 | 支持 Dockerfile 与 docker-compose 一键启动。 |
| 端到端验证 | 提供基于真实 LLM API 的端到端测试,默认跳过,手动开启后验证全流程。 |
架构设计
1┌─────────┐ ┌─────────────┐ ┌──────────┐ ┌───────────┐
2│ Planner │───▶│ RuleMaker │───▶│ Executor │───▶│ Evaluator │
3└─────────┘ └─────────────┘ └──────────┘ └───────────┘
4 ▲ │
5 │ 评估失败且未达最大重试次数 │
6 └──────────────────────────────────────────────────┘
在启用 enable_human_review=True 时,evaluator 后会插入 human_review 节点:
Evaluator ──▶ HumanReview ──(retry/end)──▶ Planner / END
项目结构
1.
2├── agents.py # 四个 Agent 的实现
3├── state.py # FourAgentState 状态定义
4├── four_agent_graph.py # LangGraph StateGraph 编排核心
5├── tools.py # 外部工具抽象与默认实现(搜索、文件读取)
6├── llm_service.py # 底层 LLM 调用服务(百炼/智谱)
7├── template_manager.py # Prompt 模板管理
8├── thinking_animation.py # 思考动画组件
9├── model_strategy.py # 模型分层策略
10├── persistence.py # 持久化工厂(memory/sqlite/postgres)
11├── observability.py # 本地观测器与 LangSmith 配置
12├── error_handling.py # 异常类型与节点降级包装器
13├── human_in_the_loop.py # 人工审批 interrupt 节点
14├── logging_config.py # 结构化日志配置
15├── conftest.py # 测试公共 fixture(FakeLLM 等)
16├── test_agents.py # Agent 真实 API 测试(手动运行)
17├── test_llm_service.py # LLMService 真实 API 测试(手动运行)
18├── test_graph.py # StateGraph 单元测试
19├── test_tools.py # 工具模块单元测试
20├── test_model_strategy.py # 模型策略单元测试
21├── test_persistence.py # 持久化单元测试
22├── test_observability.py # 可观测性单元测试
23├── test_error_handling.py # 错误处理单元测试
24├── test_human_in_the_loop.py # 人工审批单元测试
25├── test_logging.py # 日志单元测试
26├── test_e2e.py # 真实 LLM 端到端测试(默认跳过)
27├── examples/ # 6 个垂直场景示例
28│ ├── research_report/ # 研报生成
29│ ├── code_review/ # 代码审查
30│ ├── course_design/ # 课程设计
31│ ├── customer_service/ # 客户投诉处理
32│ ├── competitive_analysis/ # 竞品分析
33│ ├── contract_review/ # 合同审查
34│ └── a2a_collaboration/ # A2A 跨 Agent 协作示例
35├── demo_gradio.py # Gradio 交互式 Demo
36├── api_server.py # FastAPI 服务
37├── benchmark.py # 效果量化基准
38├── benchmark/ # benchmark 评估指标模块
39│ └── metrics.py # 关键词覆盖、ROUGE、BERTScore、LLM-as-judge
40├── streaming_executor.py # Agent 工作流 token 级流式执行器
41├── app.py # Hugging Face Spaces 入口
42├── Dockerfile # Docker 构建
43├── docker-compose.yml # Docker Compose 启动
44├── requirements_hf.txt # Hugging Face Spaces 精简依赖
45├── .github/workflows/ci.yml # GitHub Actions CI
46├── .env # 本地环境变量(真实 API key,不提交)
47├── .env.example # 环境变量模板
48├── 开发规划.md # 项目演进路线图
49└── 优化方案.md # 竞争力分析与优化路径
环境准备
1. Python 版本
- Python 3.11+(CI 在 3.11 / 3.12 上验证)
2. 安装依赖
1pip install \
2 langgraph==0.3.34 \
3 langchain-core \
4 langchain-openai \
5 python-dotenv \
6 requests \
7 pytest \
8 "langgraph-checkpoint-sqlite<3.0.0"
注意:langgraph-checkpoint-sqlite 需选择与当前 langgraph 版本兼容的 2.x。
工具依赖:ddgs(网页搜索)、pypdf(PDF)、python-docx(Word)已包含在 requirements.txt 中。如不需要真实工具调用,可暂不安装。
3. 配置环境变量
复制模板并填入真实 key:
编辑 .env:
1API_KEY_QWEN=your-bailian-api-key
2MODEL_QWEN=qwen-plus
3MODEL_QWEN_FAST=qwen-turbo
4
5API_KEY_GLM=your-zhipu-api-key
6MODEL_GLM=glm-5.2
使用方法
基础调用
1from llm_service import LLMService
2from four_agent_graph import build_four_agent_graph
3from persistence import create_memory_saver
4
5llm = LLMService({
6 "provider": "bailian",
7 "model": "qwen-plus",
8 "api_key": "your-api-key",
9 "base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
10})
11
12app = build_four_agent_graph(
13 llm,
14 checkpointer=create_memory_saver(),
15 enable_human_review=False,
16)
17
18final = app.invoke({
19 "user_goal": "为团队分享准备一份关于 AI Agent 的 PPT 大纲",
20 "professional_role": "",
21 "plan": [],
22 "evaluation_rubric": {},
23 "execution_result": None,
24 "execution_trace": [],
25 "evaluation_result": None,
26 "current_step": "plan",
27 "should_react": False,
28 "retry_count": 0,
29 "max_retries": 3,
30 "error_message": None,
31 "human_decision": None,
32 "history": [],
33})
34
35print(final["plan"])
36print(final["execution_result"])
37print(final["evaluation_result"])
使用模型分层策略
1from llm_service import LLMService
2from four_agent_graph import build_four_agent_graph
3from model_strategy import create_default_model_strategy
4
5strong = LLMService({"provider": "bailian", "model": "qwen-plus", ...})
6fast = LLMService({"provider": "bailian", "model": "qwen-turbo", ...})
7
8strategy = create_default_model_strategy(strong, fast)
9app = build_four_agent_graph(model_strategy=strategy)
使用外部工具
build_four_agent_graph 默认注入 web_search 与 file_reader。ExecutorAgent 会根据计划决定调用哪些工具,并将工具结果追加到 execution_result。
1from four_agent_graph import build_four_agent_graph
2
3app = build_four_agent_graph(llm)
4final = app.invoke(initial_state)
5
6print(final["execution_result"]) # 包含工具返回内容
7print(final["execution_trace"]) # 工具调用记录
自定义工具
实现 BaseTool 接口即可扩展工具:
1from tools import BaseTool
2
3class CalculatorTool(BaseTool):
4 name = "calculator"
5 description = "执行简单数学计算"
6 input_schema = {
7 "type": "object",
8 "properties": {"expression": {"type": "string", "description": "数学表达式"}},
9 "required": ["expression"],
10 }
11
12 def run(self, expression: str, **kwargs) -> str:
13 try:
14 return str(eval(expression))
15 except Exception as exc:
16 return f"计算失败: {exc}"
17
18app = build_four_agent_graph(llm, tools=[CalculatorTool()])
使用 RAG 向量检索
1from tools import VectorSearchTool
2
3# 从文本列表构建索引
4rag = VectorSearchTool(
5 documents=["Python 是一种解释型语言...", "LangGraph 是多智能体编排框架..."],
6 collection_name="kb",
7 top_k=2,
8)
9
10app = build_four_agent_graph(llm, tools=[rag])
接入 MCP Server
1from tools import MCPClientTool
2
3mcp = MCPClientTool(server_command=["python", "my_mcp_server.py"])
4app = build_four_agent_graph(llm, tools=[mcp])
A2A 跨 Agent 协作
1from tools import A2AClientTool
2
3a2a = A2AClientTool(agent_url="http://localhost:8000/a2a")
4app = build_four_agent_graph(llm, tools=[a2a])
运行自带示例(默认 FakeLLM,不消耗 token):
python examples/a2a_collaboration/run.py
运行场景示例
1python examples/research_report/run.py
2python examples/code_review/run.py
3python examples/course_design/run.py
4python examples/customer_service/run.py
5python examples/competitive_analysis/run.py
6python examples/contract_review/run.py
启动 Gradio Demo
启动 FastAPI 服务
uvicorn api_server:app --reload --port 8000
主要接口:
POST /invoke:端到端调用
POST /stream:SSE 流式返回节点事件
POST /workflow/stream:Agent 工作流 token 级 SSE,实时输出每个智能体的生成 token
POST /chat/stream:原始 LLM token 流式输出
POST /plan:仅运行 Planner
POST /execute:仅运行 Executor
POST /evaluate:仅运行 Evaluator
Docker 一键启动
docker-compose up --build
将同时启动 FastAPI(http://localhost:8000)与 Gradio(http://localhost:7860)。
部署到 Hugging Face Spaces
项目根目录已提供
app.py 作为 Hugging Face Spaces 入口。手动部署步骤:
- 在 Hugging Face 新建一个 Space,SDK 选择 Gradio。
- 将本项目所有文件上传到 Space(可通过 Git 或 Web UI 上传)。
- 在 Space 的 Settings > Secrets 中添加:
API_KEY_QWEN(以及可选的 MODEL_QWEN)。
- 等待构建完成,即可通过 Space 链接在线体验。
注意:Hugging Face Spaces 免费版为 CPU 环境,启动时可能需要几分钟安装依赖。为减少构建时间,可上传
requirements_hf.txt 并改名为
requirements.txt。
启用人工审批
1from persistence import create_memory_saver
2
3app = build_four_agent_graph(
4 llm,
5 checkpointer=create_memory_saver(),
6 enable_human_review=True,
7)
8
9# 使用 stream 运行,捕获 interrupt 事件
10for chunk in app.stream(initial_state, config):
11 if "__interrupt__" in chunk:
12 print("等待人工审批:", chunk["__interrupt__"][0]["value"])
13 break
14
15# 人工决策后恢复
16from langgraph.types import Command
17list(app.stream(Command(resume={"decision": "retry"}), config))
Postgres 持久化
1from persistence import create_checkpointer
2
3saver = create_checkpointer(
4 "postgres",
5 conn_string="postgresql://postgres:postgres@localhost:5432/four_agent",
6)
7app = build_four_agent_graph(llm, checkpointer=saver)
或使用环境变量 DATABASE_URL:
1export DATABASE_URL="postgresql://postgres:postgres@localhost:5432/four_agent"
2python -c "from persistence import create_checkpointer; create_checkpointer('postgres')"
场景示例
本项目通过 7 个差异较大的垂直场景与协作模式验证框架通用性:
| 场景 | 目录 | 输入示例 | 验证能力 |
|---|
| 研报生成 | examples/research_report/ | 写一份新能源汽车行业研报 | 长文本规划、Web 搜索、结构化输出 |
| 代码审查 | examples/code_review/ | 审查 sample_code.py | 文件读取、技术评估、安全审计 |
| 课程设计 | examples/course_design/ | 为初中生设计 8 课时 Python 课程 | 教育角色适配、评分维度自定义 |
| 客户投诉处理 | examples/customer_service/ | 处理订单延迟投诉 | 服务角色适配、情绪识别、回复生成 |
| 竞品分析 | examples/competitive_analysis/ | 比亚迪海豹 vs 特斯拉 Model 3 | 对比分析、多维度评分、Web 搜索 |
| 合同审查 | examples/contract_review/ | 审查软件开发合同 | 文件读取、法律风险识别 |
| A2A 协作 | examples/a2a_collaboration/ | 父 Agent 委托子 Agent 完成竞品分析 | A2A 协议、跨 Agent 任务委托 |
每个场景包含 input.json(输入)、output.md(典型输出样例)、run.py(一键运行)。
效果量化基准
benchmark.py 提供单 Agent vs 四智能体的对比:
1# 快速 FakeLLM 模式
2python benchmark.py
3
4# 真实 LLM 模式(消耗 API token)
5RUN_BENCHMARK=1 python benchmark.py
6
7# 真实 LLM + LLM-as-judge(额外消耗 token)
8RUN_BENCHMARK=1 RUN_BENCHMARK_JUDGE=1 python benchmark.py
评估指标包括:关键词覆盖率、结构得分、长度得分、ROUGE、BERTScore(可选依赖)、LLM-as-judge。报告输出到 benchmark_report.json。
真实 LLM 对比结果(6 个场景)
基于 qwen-plus 运行 6 个垂直场景,启用 LLM-as-judge(1-10 分制):
| 场景 | 单 Agent 评分 | 四智能体评分 | 四智能体耗时 | 备注 |
|---|
| 研报生成 | 9 | 9 | 102.75s | 两者均覆盖四大模块,四智能体额外产出计划与评分表 |
| 代码审查 | 10 | 10 | 108.19s | 四智能体结构化分类更系统 |
| 课程设计 | 10 | 10 | 111.08s | 四智能体提供课时总表与教师支持项 |
| 客户投诉处理 | 9 | 9 | 55.50s | 两者均生成专业回复 |
| 竞品分析 | 10 | 9 | 148.66s | 四智能体调用搜索并输出三维对比矩阵 |
| 合同审查 | 9 | 4 | 95.64s | 四智能体读取文件后产生幻觉,需改进工具结果合成 |
平均 LLM-as-judge 评分:单 Agent 9.5 / 四智能体 8.5。
说明:四智能体在多数场景下与单 Agent 质量相当,并额外提供可解释的计划、评分表与评估轨迹;合同审查场景暴露出工具调用后未充分基于真实文件内容合成答案的问题,是当前最大改进点。
详细评分理由与原始输出见 benchmark_report.json。
测试说明
单元测试(默认,不消耗真实 API)
使用 FakeLLM 固定返回 JSON,覆盖图编排、策略、持久化、错误处理、HITL、日志等。
预期:48 passed, 6 skipped(跳过项含 E2E 测试、真实工具/向量/MCP/Postgres 依赖测试)
真实工具测试(可选)
1# Windows
2$env:RUN_TOOL_TESTS="1"
3python -m pytest test_tools.py -v
4
5# Linux/macOS
6RUN_TOOL_TESTS=1 python -m pytest test_tools.py -v
Postgres 持久化测试(可选)
需要启动本地 Postgres 并设置 DATABASE_URL:
1# Windows
2$env:RUN_POSTGRES_TESTS="1"
3python -m pytest test_persistence.py::test_postgres_saver_persists_final_state -v
4
5# Linux/macOS
6RUN_POSTGRES_TESTS=1 python -m pytest test_persistence.py::test_postgres_saver_persists_final_state -v
端到端测试(消耗真实 API)
1# Windows
2$env:RUN_E2E_TESTS="1"
3python -m pytest test_e2e.py -v
4
5# Linux/macOS
6RUN_E2E_TESTS=1 python -m pytest test_e2e.py -v
预期:2 passed
CI 自动化
项目已配置
.github/workflows/ci.yml,每次 push/PR 自动运行 pytest 与 ruff。
真实 API 手动测试
1python test_agents.py
2python test_llm_service.py
阶段演进
本项目按照规划分阶段演进:
| 阶段 | 目标 | 关键交付 |
|---|
| 阶段一 | 基础重构 | LLMService、TemplateManager、ThinkingAnimation 模块化拆分 |
| 阶段二 | 三智能体原型 | Planner → Executor → Evaluator 基础循环 |
| 阶段三 | 四智能体完善 | 引入独立 RuleMakerAgent,实现公平评估闭环 |
| 阶段四 | 生产级增强 | 持久化、HITL、模型分层、错误降级、可观测性、端到端验证 |
| 阶段五 | 竞争力优化 | 多场景验证、工具层扩展、Gradio/FastAPI/Docker 演示化 |
当前已完成全部五个阶段。
设计亮点
1. 无知之幕:RuleMaker 与 Evaluator 分离
RuleMaker 在任务执行前制定评分表,不知道执行器的能力;Evaluator 只依据评分表打分,不知道执行器的意图。这种结构避免了"既当运动员又当裁判员"的评估偏差。
2. 成本控制:模型分层策略
- 强模型(qwen-plus):用于 Planner 和 RuleMaker,确保规划质量和评分标准严格。
- 轻量模型(qwen-turbo):用于 Executor 和 Evaluator,降低高频调用成本。
3. 稳定性:错误处理与降级
每个节点通过 _robust_node_wrapper 包装:
- API 错误 → 记录日志 + 返回 fallback 状态,流程继续。
- 解析错误 → 返回默认结构,避免中断。
- LangGraph interrupt → 透传,不吞异常。
4. 可观测性
GraphRunObserver 记录每个节点的进入/退出事件与关键状态变量。
- 结构化日志支持 JSON 输出,便于接入外部日志系统。
- 可选 LangSmith 集成。
5. 生产化开关
enable_human_review:显式控制是否启用人工审批。
RUN_E2E_TESTS:显式控制是否运行真实 API 测试。
FOUR_AGENT_LOG_FORMAT:切换日志格式。
注意事项
- API Key 安全:
.env 文件包含真实 key,请勿提交到 Git。.env 已在 .gitignore 中忽略。
- 端到端测试成本:
test_e2e.py 默认跳过,开启后会调用真实 LLM,请注意 token 消耗。
- 工具依赖:
WebSearchTool 依赖 ddgs,FileReaderTool 依赖 pypdf 与 python-docx。未安装时工具会抛出友好提示,不会中断整个工作流。
- 依赖版本:当前锁定
langgraph==0.3.34,配套使用 langgraph-checkpoint-sqlite<3.0.0,避免版本冲突。
许可证
MIT