让一个模型自己拆任务、调工具、找同伴复核,最后交出可运行的项目骨架——这套玩法已经从演示走向生产。真正卡住工程师的不是概念,而是选哪个框架、怎么把多个角色串起来、出错时从哪儿查。
智能体的四层骨架
不管套哪个框架,一个能用的Agent系统基本逃不开四层结构。感知层负责把用户那句模糊的话拆成可执行目标;规划层决定先做什么后做什么、哪些步骤可以并行;执行层真正去调搜索、跑代码、写文件;反思层拿结果回头校验,不对就退回重来。
这四层里最容易做薄的是反思层。很多项目跑通了主流程就收工,结果一个工具调用返回空值,整条链静默失败。工程上更稳的做法是把每层的输入输出都落日志,反思层至少校验结构完整性,而不是只让模型自己说“完成了”。
框架选型先看约束条件
LangChain生态最厚,插件和社区方案多,适合快速拼装原型。但它的抽象层数也最深,出问题时调用栈能翻好几屏。新版把OpenAI集成拆到了独立的langchain-openai包,旧的from langchain.llms import OpenAI写法已经失效,代理初始化也从initialize_agent迁移到create_react_agent配合AgentExecutor。照老教程抄代码,第一行导入就会报错。
AutoGPT的强项是长周期自主执行,代价是token消耗不可控,适合演示和实验,不适合直接上计费环境。CrewAI把角色、任务、团队三个概念做得很干净,多角色协作场景上手快。MetaGPT走SOP路线,模拟软件公司分工,文档产出质量高,但代码准确性要靠人工兜底。LangGraph用图结构管状态,条件分支和断点回溯是它的杀手锏,复杂流程首选。AutoGen背靠微软,对话式协作加人类介入机制成熟。Semantic Kernel面向企业多语言栈,C#和Java团队集成Azure服务时更顺。OpenAI Swarm极轻,适合验证编排思路。CAMEL偏学术,可解释性研究用得多。剩下一种选择是自研,前提是现有框架确实卡住了你的特殊业务。
多角色协作的真实坑位
CrewAI的示例代码看着顺,实际跑起来有两处必踩。第一,process设为hierarchical时必须显式传入manager_llm,否则Crew构造阶段直接抛校验异常,报错信息还不指向根因。第二,任务间的context字段只把上游任务的输出文本拼进提示词,不会传结构化对象。下游角色想拿JSON里的某个字段,得自己在description里约定解析方式,或者在上游任务的output_pydantic上做约束。
from crewai import Agent, Task, Crew, Process
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.2)
researcher = Agent(
role="研究员",
goal="收集主题相关的最新信息并结构化输出",
backstory="资深信息研究专家,擅长验证来源与归纳要点",
llm=llm,
verbose=True,
)
writer = Agent(
role="技术作家",
goal="依据研究结论撰写可读性强的技术文章",
backstory="资深技术作者,擅长把复杂概念讲清楚",
llm=llm,
verbose=True,
)
research_task = Task(
description="研究AI Agent框架现状,输出JSON,字段包含frameworks与trends",
expected_output="结构化研究报告JSON",
agent=researcher,
)
writing_task = Task(
description="基于研究报告撰写3000字技术文章,需引用报告中的frameworks字段",
expected_output="Markdown格式文章",
agent=writer,
context=[research_task],
)
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, writing_task],
process=Process.hierarchical,
manager_llm=llm,
verbose=True,
)
result = crew.kickoff()
这段代码里manager_llm那行不是可选项。去掉它,构造Crew的瞬间就会失败。
状态图思路解决流程失控
当任务需要条件跳转——比如审核不通过就退回重写——线性任务链就不够用了。LangGraph把每个处理步骤定义成节点,用边描述跳转,状态在节点间传递。好处是流程可视化、可断点、可回溯;代价是要自己定义状态结构,节点函数必须返回状态增量而不是整体替换。
from typing import TypedDict, List
from langgraph.graph import StateGraph, END
class AgentState(TypedDict):
messages: List[str]
current_step: str
def research_node(state: AgentState):
return {"messages": state["messages"] + ["研究完成"], "current_step": "write"}
def write_node(state: AgentState):
return {"messages": state["messages"] + ["写作完成"], "current_step": "review"}
def review_node(state: AgentState):
return {"messages": state["messages"] + ["审核完成"], "current_step": "end"}
graph = StateGraph(AgentState)
graph.add_node("research", research_node)
graph.add_node("write", write_node)
graph.add_node("review", review_node)
graph.add_edge("research", "write")
graph.add_edge("write", "review")
graph.add_edge("review", END)
app = graph.compile()
result = app.invoke({"messages": [], "current_step": "research"})
条件边用add_conditional_edges挂路由函数,返回值决定下一节点。这套机制在需要人工审核卡点的场景里特别顺手。
内容生产系统的拼装方式
拿一个真实需求练手:输入主题,自动产出技术文章。拆成四个角色——研究员、策划、作家、审核员。研究员输出结构化要点,策划据此定大纲,作家按大纲成文,审核员做事实与格式检查。
选型上可以混搭:CrewAI管角色编排和任务依赖,MetaGPT的思路借鉴到文档规范约束上。关键是把每个角色的expected_output写死,别让模型自由发挥格式。审核环节不要只让模型自评,加一条规则校验:代码块是否闭合、引用的事实是否在研究报告里出现过。规则能拦下的错误,不要浪费一次模型调用。
性能上三个手段见效最快。LLM调用加缓存,相同prompt直接命中;独立子任务用线程池并行;非关键环节换小模型。实测把研究员和审核员换成gpt-4o-mini、作家保留gpt-4o,成本能压掉近一半,质量损失在可接受范围。
上线前怎么验证
多智能体系统最难测的是不确定性。可行的做法是两层验证。离线层用mock LLM替换真实调用,固定每个节点的返回,跑回归确认编排逻辑、状态传递、异常分支都正确。这层不花token,可以进CI。在线层用小流量真实调用,统计三个指标:任务完成率、工具调用成功率、平均重试次数。完成率低于预期先查提示词和上下文截断,工具成功率低先查参数schema。
上下文管理单独说一句。长对话里模型遗忘关键信息,根因往往是历史消息无限追加导致超出窗口后被静默截断。显式维护一个token预算,超限时保留系统提示和最近若干轮,中间摘要压缩,比放任追加可靠得多。
选型没有标准答案
需要快速验证想法,LangChain或Swarm起步最快。流程有分支和回退,直接上LangGraph。角色分工明确、要模拟团队协作,CrewAI和MetaGPT更对路。企业多语言栈且深度绑定Azure,Semantic Kernel省心。特殊业务约束现有框架兜不住,再考虑自研,且先想清楚维护成本。
最后一条经验:别指望一个模型包打所有环节。把任务拆到每个子步骤都有明确输入输出契约,比换更强的模型更能提升整体稳定性。
ID:7707