智能体架构 -- 多智能体系统,组专家团队
别再让一个AI打杂了!组个专家团队,效率碾压“全能型”选手
想象一下,你接了个活:给一家热门公司(比如英伟达)写一份全面的市场分析报告,要涵盖新闻情绪、技术走势、财务表现三个维度。你会怎么办?是把任务丢给一个“什么都会一点”的全能助手,让他从头查到尾,给你一份“大杂烩”式的报告;还是组一个精干的团队:一个新闻分析师负责盯舆情,一个技术分析师专攻K线图,一个财务分析师死磕财报,最后让主编整合出一份专业、深入、结构清晰的终稿?
答案显而易见。但在AI智能体的世界里,我们常常不自觉地选择了前者——构建一个拥有“万能工具”的单一智能体,让它去处理所有事情。结果呢?就像我们今天的基线测试一样,报告能用,但总感觉差了点意思。
今天,我们来聊聊一种更强大、更符合人类协作模式的架构:多智能体系统(Multi-Agent System)。我们将从一个“通才型”AI开始,看它如何勉强完成任务;然后,我们将亲手组建一支由新闻分析师、技术分析师、财务分析师和报告撰写人组成的“AI专家团队”,看看专业分工带来的“降维打击”究竟有多震撼。
推荐阅读:
智能体架构 -- 反思性元认知智能体,让AI学会“三省吾身”
什么是多智能体系统?
在技术世界里,多智能体系统就是把一个复杂任务,拆解给多个各有专长的AI智能体去协同完成。就像我们开篇说的团队作战一样。
它如何工作?
任务分解:一个“指挥官”或用户提供一个复杂任务,比如“为英伟达生成市场分析报告”。 角色分工:系统根据每个智能体预定义的专业角色(如“新闻专家”“技术图表专家”“财报专家”),把任务分派下去。 协作执行:各个专家智能体并行或按顺序执行自己的任务。它们可能独立工作,也可能互相传递信息。 结果合成:最后,一个“主编”或“合成器”智能体,将所有专家的输出整合成一份结构完整、逻辑清晰的最终报告。
它擅长做什么?
复杂报告生成:需要融合财务、技术、政策等多领域知识的报告。 软件开发流程模拟:构建一个包含程序员、代码审查员、测试员和项目经理的虚拟开发团队。 创意头脑风暴:让几个“性格”迥异的AI(一个乐观派,一个悲观派,一个天马行空派)一起碰撞,产生更丰富的创意。
优势与局限
优势:
专业与深度:每个智能体可以为其专业领域深度优化,产出质量远超“通才”。 模块化与扩展性:想增加新的分析维度?直接加一个专家智能体就行,不用动整个系统。 并行处理:多个专家可以同时开工,理论上能缩短任务总耗时。
局限:
协调复杂:管理多个智能体之间的通信和工作流,设计上比单一智能体复杂。 成本与延迟:多次调用LLM意味着更高的API成本和更长的处理时间。
动手实战:从“单兵作战”到“专家团队”
我们开始写代码。整个流程分为四步:先搭建基线(单一智能体),再构建多智能体团队,最后让它们PK并量化评估。
阶段 0:准备工作
老规矩,先安装依赖,配置好API密钥(Nebius、LangSmith、Tavily)。
# 安装依赖库
# !pip install -q -U langchain-nebius langchain langgraph rich python-dotenv langchain-tavily
import os
from typing import List, Annotated, TypedDict, Optional
from dotenv import load_dotenv
# LangChain 核心
from langchain_nebius import ChatNebius
from langchain_tavily import TavilySearch
from langchain_core.messages import BaseMessage, SystemMessage, HumanMessage
from pydantic import BaseModel, Field
from langchain_core.prompts import ChatPromptTemplate
# LangGraph 工作流
from langgraph.graph import StateGraph, END
from langgraph.graph.message import AnyMessage, add_messages
from langgraph.prebuilt import ToolNode, tools_condition
# 美化打印
from rich.console import Console
from rich.markdown import Markdown
# --- API密钥和追踪 ---
load_dotenv()
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_PROJECT"] = "Agentic Architecture - Multi-Agent (Nebius)"
for key in ["NEBIUS_API_KEY", "LANGCHAIN_API_KEY", "TAVILY_API_KEY"]:
ifnot os.environ.get(key):
print(f"⚠️ 未找到 {key},请检查.env文件。")
else:
print(f"✅ {key} 已加载")
console = Console()
print("\n🚀 环境就绪!")
阶段 1:基线测试 - 一个“通才型”智能体
我们先造一个什么都能干一点的“万能”AI,给它一个网络搜索工具,让它去完成我们的分析任务。
# 定义共享状态
classAgentState(TypedDict):
messages: Annotated[list[AnyMessage], add_messages]
# 定义工具和LLM
search_tool = TavilySearch(max_results=3, name="web_search")
llm = ChatNebius(model="meta-llama/Meta-Llama-3.1-8B-Instruct", temperature=0)
llm_with_tools = llm.bind_tools([search_tool])
# 定义单一智能体节点
defmonolithic_agent_node(state: AgentState):
console.print("--- 🤔 单一智能体:思考中... ---")
response = llm_with_tools.invoke(state["messages"])
return {"messages": [response]}
# 构建ReAct图
tool_node = ToolNode([search_tool])
mono_graph_builder = StateGraph(AgentState)
mono_graph_builder.add_node("agent", monolithic_agent_node)
mono_graph_builder.add_node("tools", tool_node)
mono_graph_builder.set_entry_point("agent")
# 条件边:根据是否调用工具,决定下一步
mono_graph_builder.add_conditional_edges("agent", tools_condition, {"tools": "tools", "__end__": END})
mono_graph_builder.add_edge("tools", "agent")
monolithic_agent_app = mono_graph_builder.compile()
print("✅ 单一'通才型'智能体编译成功。")
让它试试水
给它一个包含三个维度的任务,看看它的表现。
company = "英伟达 (NVIDIA, NVDA)"
monolithic_query = f"为 {company} 创建一份简洁但全面的市场分析报告。报告应包含三个部分:1. 近期新闻和市场情绪摘要。2. 对该股价格趋势的基础技术分析。3. 审视公司近期的财务表现。"
console.print(f"\n🎯 [bold yellow]测试单一智能体处理多层面任务:[/bold yellow]\n'{monolithic_query}'\n")
final_mono_output = monolithic_agent_app.invoke({
"messages": [
SystemMessage(content="你是一位资深的单一金融分析师。你必须创建一份全面的报告,涵盖用户请求的所有方面。"),
HumanMessage(content=monolithic_query)
]
})
console.print("\n--- [bold red]单一智能体最终报告[/bold red] ---")
console.print(Markdown(final_mono_output['messages'][-1].content))
结果怎么样? 这份报告可能还行,但大概率存在这些硬伤:
结构模糊:新闻、技术、财务几个部分可能搅在一起,没有清晰的分界和专业的格式。 分析浅尝辄止:试图面面俱到,导致每个部分都只是泛泛而谈,缺乏领域深度。 语气“万金油”:语言风格统一,缺少不同专业领域应有的术语和关注点。
这就是我们的“基准线”。能用,但不够好。接下来,我们换“团队作战”。
阶段 2:进阶方法 - 组建AI专家团队
现在,我们来打造一个明星团队。每个成员都是某个领域的专家,并且有自己独特的“人设”和输出格式要求。
# 多智能体系统的专用状态,用来存放各个专家的报告
classMultiAgentState(TypedDict):
user_request: str
news_report: Optional[str] # 新闻分析师产出
technical_report: Optional[str] # 技术分析师产出
financial_report: Optional[str] # 财务分析师产出
final_report: Optional[str] # 最终整合报告
defcreate_specialist_node(persona: str, output_key: str):
"""工厂函数,快速创建专业智能体节点。"""
system_prompt = persona + "\n\n你可以使用网络搜索工具。你的输出必须是一份简洁的报告章节,使用 markdown 格式,并且只关注你自己的专业领域。"
# 使用 ChatPromptTemplate 让提示更清晰
prompt_template = ChatPromptTemplate.from_messages([
("system", system_prompt),
("human", "{user_request}")
])
agent = prompt_template | llm_with_tools
defspecialist_node(state: MultiAgentState):
console.print(f"--- 📊 调用 {output_key.replace('_report','').upper()} 分析师 ---")
result = agent.invoke({"user_request": state["user_request"]})
# 处理可能只有工具调用、没有直接文本输出的情况
content = result.content if result.content elsef"无直接内容,工具调用: {result.tool_calls}"
return {output_key: content}
return specialist_node
# 创建三位专家
news_analyst_node = create_specialist_node(
"你是一位资深的新闻分析师。你的专长是搜索网络,寻找关于一家公司的最新新闻、文章和社交媒体情绪。",
"news_report"
)
technical_analyst_node = create_specialist_node(
"你是一位资深的技术分析师。你专门分析股票价格图表、趋势和技术指标。",
"technical_report"
)
financial_analyst_node = create_specialist_node(
"你是一位资深的财务分析师。你专门解读财务报表和业绩指标。",
"financial_report"
)
defreport_writer_node(state: MultiAgentState):
"""主编节点:负责整合专家报告。"""
console.print("--- 📝 调用报告撰写人 ---")
prompt = f"""你是一位资深的金融编辑。你的任务是将以下专家报告合并成一份专业、连贯、完整的市场分析报告。请添加简短的开头和结尾段落。
新闻与情绪报告:
{state['news_report']}
技术分析报告:
{state['technical_report']}
财务表现报告:
{state['financial_report']}
"""
final_report = llm.invoke(prompt).content
return {"final_report": final_report}
print("✅ 专业智能体节点和报告撰写人节点定义完成。")
组装团队工作流
我们将这四位成员(三位专家 + 一位主编)按顺序串联起来。在实际应用中,专家们甚至可以并行工作,这里为了演示清晰,我们按顺序执行。
multi_agent_graph_builder = StateGraph(MultiAgentState)
# 添加所有节点
multi_agent_graph_builder.add_node("news_analyst", news_analyst_node)
multi_agent_graph_builder.add_node("technical_analyst", technical_analyst_node)
multi_agent_graph_builder.add_node("financial_analyst", financial_analyst_node)
multi_agent_graph_builder.add_node("report_writer", report_writer_node)
# 定义工作流顺序:新闻 -> 技术 -> 财务 -> 主编
multi_agent_graph_builder.set_entry_point("news_analyst")
multi_agent_graph_builder.add_edge("news_analyst", "technical_analyst")
multi_agent_graph_builder.add_edge("technical_analyst", "financial_analyst")
multi_agent_graph_builder.add_edge("financial_analyst", "report_writer")
multi_agent_graph_builder.add_edge("report_writer", END)
multi_agent_app = multi_agent_graph_builder.compile()
print("✅ 多智能体专家团队编译成功。")
阶段 3:对比测试
现在,让我们的专家团队执行和之前一模一样的任务,然后对比两份报告的差异。
multi_agent_query = f"为 {company} 创建一份简洁但全面的市场分析报告。"
initial_multi_agent_input = {"user_request": multi_agent_query}
console.print(f"\n🎯 [bold green]测试多智能体团队处理相同任务:[/bold green]\n'{multi_agent_query}'\n")
final_multi_agent_output = multi_agent_app.invoke(initial_multi_agent_input)
console.print("\n--- [bold green]多智能体团队最终报告[/bold green] ---")
console.print(Markdown(final_multi_agent_output['final_report']))
结果会是什么? 差异是肉眼可见的:
结构清晰:报告被清晰地分为“新闻情绪”“技术分析”“财务表现”三大块,每部分都有专业小标题。 分析深入:新闻分析师会引用具体消息源,技术分析师会提到“移动平均线”“支撑位”等术语,财务分析师会聚焦“营收”“毛利率”等关键指标。每个部分都更有“专家味”。 专业感强:最终报告由主编整合后,有引言、正文、结论,读起来像一份正式的机构研报,而非AI的简单拼凑。
阶段 4:让AI评委打分
为了更客观地证明差异,我们让“大语言模型”作为评委,从结构清晰度、分析深度、内容完整性三个维度,给两份报告打分。
classReportEvaluation(BaseModel):
clarity_and_structure_score: int = Field(description="报告的组织、结构和清晰度,1-10分。")
analytical_depth_score: int = Field(description="每个部分的分析深度和质量,1-10分。")
completeness_score: int = Field(description="报告满足用户所有需求的程度,1-10分。")
justification: str = Field(description="打分理由。")
judge_llm = llm.with_structured_output(ReportEvaluation)
defevaluate_report(query: str, report: str):
prompt = f"""你是一位金融分析报告评审专家。请根据结构、深度和完整性,对以下报告进行1-10分的评估。
**原始用户请求:**
{query}
**待评估报告:**\n
{report}
"""
return judge_llm.invoke(prompt)
console.print("--- 📊 评估单一智能体报告 ---")
mono_agent_evaluation = evaluate_report(monolithic_query, final_mono_output['messages'][-1].content)
console.print(mono_agent_evaluation.model_dump())
console.print("\n--- 📊 评估多智能体团队报告 ---")
multi_agent_evaluation = evaluate_report(multi_agent_query, final_multi_agent_output['final_report'])
console.print(multi_agent_evaluation.model_dump())
打分结果毫无悬念:多智能体团队的报告在结构清晰度和分析深度上会获得压倒性高分。评委的理由也会很直接:因为每个部分都由真正的“专家”完成,所以细节更扎实、逻辑更自洽。
写在最后
通过这场“单兵”与“团队”的实战对比,我们清晰地看到了专业分工的力量。就像人类社会中,你不会让一个外科医生去审计财务报表一样,在AI世界里,把复杂任务拆解给多个专家,是获得高质量、结构化结果的必然选择。
核心回顾
原理:多智能体系统通过“分而治之”的思想,模拟了人类专家的协作模式。 实践:我们亲手构建了一支由新闻、技术、财务分析师和主编组成的AI专家团队,并证明了其产出远胜单一“通才”AI。 避坑:这种架构的代价是更高的设计复杂度和运行成本。但在需要专业深度和严谨结构的场景下,这个投入是完全值得的。
架构选择没有银弹。但当你的任务需要跨越多个专业领域、追求深度与权威性时,请记住:是时候给你的AI系统,也组建一支“专家团队”了。
在你的工作或项目中,有没有遇到哪些任务,你觉得让一个“万能AI”去做就是大材小用,或者根本做不好的?你会怎么给它设计一个“专家团队”?欢迎在评论区展开你的脑洞!
🏴☠️宝藏级🏴☠️ 原创公众号『数据STUDIO』内容超级硬核。公众号以Python为核心语言,垂直于数据科学领域,包括可戳👉Python|MySQL|数据分析|数据可视化|机器学习与数据挖掘|爬虫等,从入门到进阶!
长按👇关注- 数据STUDIO -设为星标,干货速递