108 lines
2.9 KiB
Markdown
108 lines
2.9 KiB
Markdown
|
|
# Notes: LangGraph 多智能体研究
|
|||
|
|
|
|||
|
|
## 核心概念
|
|||
|
|
|
|||
|
|
### LangGraph 基础
|
|||
|
|
- **StateGraph**: 有向无环图(DAG),节点是 Agent/函数,边是流转逻辑
|
|||
|
|
- **State**: 贯穿整个图流动的状态对象
|
|||
|
|
- **Node**: 执行单元(可以是 Agent、函数、条件判断)
|
|||
|
|
- **Edge**: 连接节点的边,支持条件边(conditional edges)
|
|||
|
|
|
|||
|
|
### Supervisor + Workers 模式参考
|
|||
|
|
|
|||
|
|
#### 1. LangChain 官方 Supervisor 示例
|
|||
|
|
```python
|
|||
|
|
from langgraph.prebuilt import create_react_agent
|
|||
|
|
from langgraph.graph import StateGraph, END
|
|||
|
|
|
|||
|
|
# 定义 Workers
|
|||
|
|
research_agent = create_react_agent(llm, tools=[search])
|
|||
|
|
coder_agent = create_react_agent(llm, tools=[write_file])
|
|||
|
|
|
|||
|
|
# 定义 Supervisor 节点
|
|||
|
|
def supervisor_node(state):
|
|||
|
|
# LLM 决定下一步调用哪个 Agent
|
|||
|
|
response = llm.with_structured_output(SupervisorOutput).invoke(
|
|||
|
|
[SystemMessage(content=SUPERVISOR_PROMPT)] + state["messages"]
|
|||
|
|
)
|
|||
|
|
return {"next": response.next_agent}
|
|||
|
|
|
|||
|
|
# 构建图
|
|||
|
|
graph = StateGraph(AgentState)
|
|||
|
|
graph.add_node("supervisor", supervisor_node)
|
|||
|
|
graph.add_node("research", research_agent)
|
|||
|
|
graph.add_node("code", coder_agent)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2. 状态定义
|
|||
|
|
```python
|
|||
|
|
from typing import TypedDict, Annotated
|
|||
|
|
import operator
|
|||
|
|
|
|||
|
|
class AgentState(TypedDict):
|
|||
|
|
messages: Annotated[list, operator.add]
|
|||
|
|
task: str
|
|||
|
|
plan: list
|
|||
|
|
results: dict
|
|||
|
|
iteration: int
|
|||
|
|
next: str # 控制下一步流向
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3. 条件边实现
|
|||
|
|
```python
|
|||
|
|
def should_continue(state):
|
|||
|
|
if state["iteration"] >= MAX_ITERATIONS:
|
|||
|
|
return "end"
|
|||
|
|
if state.get("task_complete"):
|
|||
|
|
return "end"
|
|||
|
|
return "continue"
|
|||
|
|
|
|||
|
|
graph.add_conditional_edges(
|
|||
|
|
"review",
|
|||
|
|
should_continue,
|
|||
|
|
{
|
|||
|
|
"continue": "supervisor",
|
|||
|
|
"end": END
|
|||
|
|
}
|
|||
|
|
)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 设计决策
|
|||
|
|
|
|||
|
|
### 架构优势
|
|||
|
|
1. **清晰的分层**: Supervisor 负责任务规划,Workers 负责执行
|
|||
|
|
2. **可扩展**: 容易添加新的 Worker 类型
|
|||
|
|
3. **可控**: 迭代次数全局配置
|
|||
|
|
4. **灵活**: 支持条件分支和循环
|
|||
|
|
|
|||
|
|
### 需要解决的问题
|
|||
|
|
1. **Supervisor 如何做规划**: 需要设计 prompt 让 LLM 生成任务列表
|
|||
|
|
2. **任务队列**: 需要支持并行分发多个 Worker
|
|||
|
|
3. **共享上下文**: 需要设计数据结构在 Agent 间共享状态
|
|||
|
|
4. **Review 机制**: 需要定义检查标准和重试逻辑
|
|||
|
|
|
|||
|
|
## 关键 Prompt 设计
|
|||
|
|
|
|||
|
|
### Supervisor System Prompt
|
|||
|
|
```
|
|||
|
|
你是一个任务规划专家(Supervisor)。用户的任务是:{task}
|
|||
|
|
|
|||
|
|
请按以下步骤执行:
|
|||
|
|
1. 分析任务需求和约束
|
|||
|
|
2. 将任务分解为可执行的子任务
|
|||
|
|
3. 为每个子任务选择合适的执行 Agent:
|
|||
|
|
- research: 信息搜索和调研
|
|||
|
|
- coder: 代码编写和修改
|
|||
|
|
- review: 结果检查和评审
|
|||
|
|
4. 确定执行顺序和依赖关系
|
|||
|
|
|
|||
|
|
当前任务进度:{progress}
|
|||
|
|
共享上下文:{context}
|
|||
|
|
|
|||
|
|
请输出你的决策,格式如下:
|
|||
|
|
- 需要执行的子任务列表
|
|||
|
|
- 每个任务的执行 Agent
|
|||
|
|
- 任务执行顺序
|
|||
|
|
- 是否需要汇总结果
|
|||
|
|
```
|