构建多智能体系统时,通信机制与状态管理是决定系统效能的核心要素。当智能体数量超过 3 个时,系统常面临通信延迟、状态冲突等挑战。本文将系统化解析 LangGraph 中智能体交互的技术细节,帮助开发者构建高效稳定的多智能体协作体系。
一、智能体通信的四大核心维度
1.1 通信模式选择:交接与工具调用的技术分野
智能体间通信存在两种基础模式,其选择取决于状态传递需求:
交接(Handoffs)模式适用于复杂状态传递场景,通过 Command 对象实现控制流与状态的协同转移:
python
from langgraph.types import Command
def agent_a(state) -> Command[Literal["agent_b"]]:
return Command(
goto="agent_b", # 目标智能体
update={"task_context": state["ctx"]}, # 状态载荷
graph=Command.PARENT # 导航至父图
)
工具调用模式适合无状态单次任务,通过 ReAct 机制封装智能体为工具:
python
from langgraph.prebuilt import create_react_agent
def agent_b_tool(state: dict) -> str:
return model.invoke(f"处理数据:{state['input']}").content
supervisor = create_react_agent(model, [agent_b_tool])
两种模式的核心差异如下表:
维度 | 交接模式 | 工具调用模式 |
---|---|---|
状态传递能力 | 强(完整状态) | 弱(参数级传递) |
实现复杂度 | 中 | 低 |
适用场景 | 多轮对话 | 单次功能调用 |
1.2 消息传递策略:全量共享与结果共享的权衡
消息传递机制直接影响智能体协作效率,存在两种典型策略:
完整思考过程共享适合需要深度协作的场景,如科研辅助系统:
python
def agent_share_full(state: MessagesState):
thought = model.invoke(
"详细分析问题...",
stop=["\n总结:"]
)
return {
"messages": state["messages"] + [
{"role": "thinking", "content": thought}
]
}
该模式优势在于可追溯性强,但需实现消息修剪机制应对数据膨胀:
python
def message_pruner(state: MessagesState):
if len(state["messages"]) > 50:
return {"messages": state["messages"][-50:]}
return state
仅共享最终结果适用于大型分布式系统,如客服多智能体网络:
python
def agent_share_result(state: dict):
private = state.get("private", [])
private.append("中间步骤")
final = model.invoke("生成结果", messages=private)
return {
"messages": state["messages"] + [{"role": "result", "content": final}],
"private": private
}
1.3 消息身份标识:多智能体对话的 "门牌系统"
在长消息历史中标识智能体身份有两种主流方案:
LLM 原生支持方案(以 OpenAI 为例):
python
response = model.invoke(
"生成报告",
function_call={"name": "analyst_agent"} # 利用name参数标识
)
手动注入方案(兼容非原生支持 LLM):
python
def format_msg(agent_name, content):
return f"<agent>{agent_name}</agent><text>{content}</text>"
response = model.invoke("风险评估")
formatted = format_msg("risk_agent", response)
1.4 交接消息规范化:多智能体通信的 "交通规则"
交接操作需遵循统一消息规范以确保可追溯性:
python
def create_handoff_msg(from_agent, to_agent, context):
return {
"type": "handoff",
"from": from_agent,
"to": to_agent,
"context": context,
"timestamp": datetime.now().isoformat()
}
# 在智能体中生成交接消息
handoff = create_handoff_msg(
"planner", "executor",
{"task_id": "T-123", "params": state["params"]}
)
二、子智能体状态管理的技术实现
2.1 状态隔离的两种架构模式
共享列表 + 过滤模式类似多团队共用白板但用不同颜色标记:
python
def filter_agent_msgs(state, agent_name):
return [
msg for msg in state["messages"]
if f"<agent>{agent_name}</agent>" in msg.get("content", "")
]
# 在智能体中使用过滤后的消息
agent_b_msgs = filter_agent_msgs(state, "agent_b")
response = model.invoke(f"基于{agent_b_msgs}分析")
独立状态列表模式为每个智能体分配专属状态空间:
python
class AgentState(TypedDict):
private: list[str]
public: list[str]
def agent_c(state: AgentState):
state["private"].append("内部分析")
state["public"].append(
model.invoke("生成公开结果", messages=state["private"])
)
return state
2.2 不同状态模式的工程实现
当智能体需要独立状态模式时,可通过子图机制实现:
python
# 定义子图智能体的独立状态
class SearchState(TypedDict):
queries: list[str]
results: list[dict]
def search_agent(state: SearchState):
new_query = state["queries"][-1]
result = perform_search(new_query)
return {
"queries": state["queries"] + [new_query],
"results": state["results"] + [result]
}
search_subgraph = StateGraph(SearchState).add_node(search_agent).compile()
# 主图中调用子图的状态转换
def call_search(state: dict):
subgraph_state = {
"queries": state.get("search_queries", []),
"results": state.get("search_results", [])
}
output = search_subgraph.invoke(subgraph_state)
return {
"search_queries": output["queries"],
"search_results": output["results"],
"global_ctx": state["global_ctx"]
}
2.3 状态持久化与恢复机制
在金融、医疗等场景中,状态持久化是关键需求:
python
from langgraph.checkpoint.memory import InMemorySaver
# 主图持久化配置
checkpointer = InMemorySaver()
main_graph = StateGraph(GlobalState).add_node(...).compile(checkpointer=checkpointer)
# 子图独立持久化
subgraph = StateGraph(SubState).add_node(...).compile(checkpointer=True)
持久化状态可通过以下方式访问:
- 主图状态:
graph.get_state(config)
- 包含子图状态:
graph.get_state(config, subgraphs=True)
三、状态管理高级技巧
3.1 状态冲突检测机制
随着智能体数量增加,需实现状态冲突检测:
python
def detect_conflict(state, agent_name):
if "locked_by" in state and state["locked_by"] != agent_name:
return True
return False
def agent_d(state: dict):
if detect_conflict(state, "agent_d"):
return {"error": "状态被锁定"}
state["locked_by"] = "agent_d"
# 正常处理逻辑
return state
3.2 动态状态调整策略
复杂任务中需根据场景动态调整状态策略:
python
def adaptive_state(state: dict):
complexity = calculate_complexity(state)
if complexity > 0.7:
state["use_independent"] = True # 复杂任务用独立状态
else:
state["use_independent"] = False # 简单任务用共享状态
return state
3.3 多状态模式协同方案
实际应用中常需混合使用多种状态模式:
python
class HybridState(TypedDict):
shared: list[str]
agents: dict[str, list[str]] # 各智能体私有状态
def hybrid_agent(state: HybridState, agent_name: str):
# 访问共享状态
shared_ctx = state["shared"]
# 访问私有状态
private_ctx = state["agents"].setdefault(agent_name, [])
private_ctx.append("agent专属思考")
# 生成结果并更新状态
result = model.invoke("处理任务", messages=shared_ctx + private_ctx)
return {
"shared": state["shared"] + [result],
"agents": state["agents"]
}
结语
多智能体系统的通信与状态管理是 AI 工程化的核心挑战,其设计质量直接影响系统的可扩展性与可靠性。本文系统梳理了 LangGraph 中相关的技术细节与实践方案,希望能为开发者提供实用的技术参考。
如果本文对你有帮助,别忘了点赞收藏,关注我,一起探索更高效的开发方式~