

随着 Agent Skills 概念爆火,AI Agent 再次成为技术圈的焦点。今天我们暂且不深入讨论 skills,先回归基础,聊聊如何构建一个常规的 AI 智能体。你可能觉得这很复杂,但其实,我们只需 大约 100 行 Python 代码,就能构建起一个可运行的多智能体对话系统。
想象这样一个场景:你只需要说出“为我规划一份基于本周天气的健身计划并整理成PDF”,AI 就能自动查询天气、搜索健身教程、整合信息并最终生成文件——这已不再是科幻。这类能够自主规划、调用工具、执行复杂任务的系统,就是 AI Agent(智能体)。
大语言模型(LLM)本身如同一个“装在罐子里的大脑”,知识渊博却无法与环境互动。AI Agent 则为它赋予了“身体”和“手脚”(即工具),使其能够感知环境、进行决策规划并执行具体行动。而 AI Agent框架,正是构建这些智能系统的“脚手架”,它们将底层的复杂性封装起来,让开发者能够高效地搭建从简单助手到复杂协作系统的各类应用。
今天,我们直接通过代码实践,从零搭建一个真正能干活的多 AI 智能体(Multi-Agent)系统。你将看到:
- 如何用 AutoGen 让多个 AI 智能体通过“对话”进行协作。
- 如何用 LangGraph 像搭乐高一样编排复杂的工作流。
- 以及面对众多的框架,你究竟该如何做出选择。
一、AI Agent核心概念:从大脑到行动者
1.1 智能体的工作原理
一个 AI Agent 的核心工作流程是一个自主循环:
- 观察:接收用户输入或工具执行的结果。
- 思考:利用 LLM 分析当前状况,规划下一步行动。
- 行动:调用工具执行或直接生成回答。
- 重复以上步骤,直至任务完成。
其中,工具(Tools) 是 Agent 能力的延伸。任何具有明确定义的函数都可以作为工具,例如 API 调用、数据库查询、代码执行等。
1.2 为什么需要专用框架?
对于简单任务,直接编码调用 LLM 和工具或许可行。但一旦涉及 状态管理、复杂决策(在多工具中选择)、长流程编排 或 多智能体协作,代码会迅速变得难以维护。专业的框架为此提供了:
- 清晰抽象:如状态、节点、工作流等概念模型。
- 内置集成:对主流工具与模型提供开箱即用的支持。
- 调试支持:可视化的执行流程与状态追踪工具。
- 效率与可靠性:标准化的开发模式能减少错误,提升开发速度。
二、最佳 AI Agent框架横向对比
以下列表汇总了当前可用于构建 AI Agent 的主要框架,排序大致基于框架对流程控制的复杂度和精细度递增。最佳选择取决于前文所述的各项考量因素,本列表旨在帮助你根据自身需求和技能水平做出决策。
RelevanceAI
https://relevanceai.com
- 适用场景:非技术人员的选择。无需编写代码即可通过用户界面创建代理和工具。部署快速,商业友好且用户体验佳。
- 注意事项:不适合构建更复杂的系统,开发者社区规模有限。若你关注低延迟或最小化系统开销,此框架可能不适用。其为闭源框架,排查框架内部错误可能更为困难。
smolagents
https://smolagents.org
- 简介:由 Hugging Face 开发的极简 AI 代理框架。提供典型的工具调用和代码代理功能,代码代理可生成并执行代码。附有非常出色的教程。
- 适用场景:如果你是想开始构建代理的开发者,smolagents 是绝佳的起点。你可以深入了解代理的运作方式,验证其是否适合解决问题,后续再转向更高级的框架。其代理自主性很强,通常建议用于简单用例或作为学习工具。
PhiData
https://docs.phidata.com/introduction
- 简介:使你能够构建具备记忆、工具、知识、推理或多代理编排能力的 AI 助手。其设计旨在简化将大语言模型转化为助手的过程。相比自行编码,它能更轻松地处理记忆、工具和用户界面。
- 特点:社区正在兴起,框架为开源。
LangChain
https://www.langchain.com
- 现状:当前采用最广泛的代理框架。
- 功能:允许开发者链式组合提示、模型、记忆和工具。对主流 LLM 提供商提供原生支持,并拥有丰富的工具生态系统供代理使用。模块化程度高,是中等复杂度任务的良好解决方案。
- 学习曲线:需要理解一些抽象概念,如链、代理、提示设计、记忆、检索器等,但其社区已相当成熟,有大量教程可用。集成性和可扩展性亦是其强项。
LlamaIndex
https://www.llamaindex.ai
- 侧重点:高度专注于数据摄取、索引、检索、查询引擎和文档处理。
- 适用场景:用它构建 RAG(检索增强生成)应用相当容易,但对于需要众多不同角色代理进行复杂编排的场景,可能不太适合。性能取决于所提供文档的质量和嵌入模型。
- 扩展性:允许通过自定义索引、检索器等进行扩展。社区活跃,但该框架可能并非高度分支化或复杂工作流程的最佳解决方案。
CrewAI
https://www.crewai.com
- 设计目标:专为具有角色/团队的高层级多代理协作而设计,利用 LLM 来协调代理工作。
- 特点:虽比 LangChain 新,但同样受欢迎。可用其快速构建多代理 AI 系统。但对于非常庞大的任务,性能可能仍不理想,因为它不提供精细的流程控制,代理自行组织一切。不支持并行执行。
AutoGen
https://github.com/microsoft/autogen
- 核心概念:由微软开发的开源框架,其核心理念是通过 多智能体之间的对话与协作 来完成任务。它允许开发者定义具有不同角色(如助手、用户代理、代码执行器等)的代理,并让它们通过自然语言对话自主协商、规划和执行复杂工作流。
- 主要优点:
- 强大的多代理协作:专为模拟多角色、动态交互的复杂场景设计,代理间通过对话自主协调。
- 灵活的对话模式:支持自定义对话流程,可实现自动聊天、有条件分支和人类介入。
- 研究友好:因其对话机制,非常 适合科研、复杂系统模拟和探索性项目。
LangGraph
https://www.langchain.com/langgraph
- 定位:LangChain 的扩展,也是列表中最先进、控制力最强的 AI Agent 框架之一。
- 核心概念:允许你将代理工作流程定义为 有状态图(Stateful Graph) 。其中每个节点代表一个执行步骤,边则定义可能的转换。代理可以追踪除消息历史外的任何其他所需状态信息。
- 强大功能:提供条件边、循环、持久状态、易于调试、自定义工具、结构化输出等众多功能。它以 LangChain 为基础,与 LangSmith(观测工具)共同构成了构建高级代理的完整环境。其高精度的控制能力,使其非常适合对可扩展性和极低延迟有苛刻要求的生产级解决方案。
选择框架时需要综合考虑以下因素:
- 易用性:从无代码到需要图编程基础。
- 任务复杂度:简单的链式任务无需重型框架。
- 社区与生态:影响学习成本与问题解决效率。
- 性能与延迟:精细化控制通常意味着更低延迟。
- Token使用:自主性高的Agent可能因重复尝试而消耗更多Token。
- 可扩展性:复杂系统需考虑并发、状态管理与错误处理。
- 集成与安全:现有技术栈兼容性与数据隐私要求。
三、深度实战一:AutoGen —— 对话即协作
3.1 AutoGen核心理念
微软推出的 AutoGen 提出了一种优雅的范式:通过可编程的对话实现多智能体协作。它允许构建由多个专业 Agent(如规划者、开发者、执行者、质检员)组成的团队,它们通过自然语言交流协同解决复杂问题,且人类可随时介入。
3.2 实战:用AutoGen构建AI角色推理游戏
以下示例展示如何用不到 100 行代码创建一个多 AI 角色协作推理的趣味场景:
# 安装:pip install pyautogen
import os
from autogen import ConversableAgent, GroupChat, GroupChatManager
# 1. 配置LLM(以阿里云通义千问为例)
llm_config = {
"config_list": [
{
"model": "qwen-max-1201",
"api_key": os.getenv("QWEN_API_KEY"),
"base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1"
}
]
}
# 2. 创建历史人物AI Agent
aristotle = ConversableAgent(
name="亚里士多德",
system_message="""你是亚里士多德(公元前384-322),古希腊哲学家。思维严谨,注重逻辑与经验观察。在推理时善于层层追问,揭露矛盾。""",
llm_config=llm_config,
human_input_mode="NEVER"
)
mozart = ConversableAgent(
name="莫扎特",
system_message="""你是沃尔夫冈·阿马德乌斯·莫扎特(1756-1791),天才作曲家。感性敏锐,注意对话中的韵律与情感线索。""",
llm_config=llm_config,
human_input_mode="NEVER"
)
# 3. 创建人类玩家Agent(成吉思汗)
genghiskhan = ConversableAgent(
name="成吉思汗",
system_message="""你是成吉思汗(1162-1227),蒙古帝国创立者。你实际上是人类玩家,需要伪装成AI。避免暴露对人类现代知识的陌生。""",
llm_config=llm_config,
human_input_mode="ALWAYS" # 等待人类输入
)
# 4. 创建群聊与管理器
groupchat = GroupChat(
agents=[aristotle, mozart, genghiskhan], # 可添加更多角色
messages=[],
max_round=6,
speaker_selection_method="round_robin"
)
manager = GroupChatManager(groupchat=groupchat, llm_config=llm_config)
# 5. 列车员(主持人)启动游戏
guard = ConversableAgent(
name="列车员",
system_message="你是列车员,正在查票。你发现团体票上有5位历史伟人,但WiFi记录显示只有4个AI连接。",
llm_config=llm_config,
human_input_mode="ALWAYS"
)
guard.initiate_chat(
manager,
message="你们这张团体票上有五位历史上的伟人,但WiFi记录显示只有4个AI,也就是说你们中有一个是人类假扮的。请通过对话找出他。"
)
执行效果:AI 角色们将开始多轮对话,依据各自角色背景提问、推理,试图识别出人类玩家。此例清晰地展示了 AutoGen 在 动态多角色协作对话 场景中的天然优势。
四、深度实战二:LangGraph —— 图工作流编排
4.1 LangGraph核心优势
作为 LangChain 的扩展,LangGraph 将 Agent 工作流定义为 有状态图(Stateful Graph):
- 节点:代表执行步骤(如调用工具、处理数据)。
- 边:定义步骤间流转逻辑(支持条件分支、循环)。
- 状态:贯穿整个工作流的共享数据容器。
这种模式提供了无与伦比的 控制精度,适合需要严格流程、最小延迟与复杂错误处理的生产系统。
4.2 实战:用LangGraph构建天气新闻简报助手
# 安装:pip install langgraph langchain-openai langchain-community
import os
from dotenv import load_dotenv
from typing import TypedDict, Annotated, Sequence
import operator
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from langchain_community.tools import TavilySearchResults
from langchain_community.utilities import OpenWeatherMapAPIWrapper
from langchain_core.messages import BaseMessage, HumanMessage
# 1. 加载环境变量(需配置OPENAI_API_KEY、TAVILY_API_KEY、OPENWEATHER_API_KEY)
load_dotenv()
# 2. 初始化LLM与工具
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
search_tool = TavilySearchResults(api_key=os.getenv("TAVILY_API_KEY"), max_results=2)
weather_tool = OpenWeatherMapAPIWrapper(api_key=os.getenv("OPENWEATHER_API_KEY"))
# 3. 定义状态结构(共享白板)
class AgentState(TypedDict):
messages: Annotated[Sequence[BaseMessage], operator.add]
city: str
weather_info: str
news_info: str
final_report: str
# 4. 定义节点函数
def parse_input(state: AgentState):
"""解析用户输入,提取城市"""
user_input = state["messages"][-1].content
# 简化为固定城市,实际可用NLP解析
return {"city": "北京"}
def get_weather(state: AgentState):
"""调用天气工具"""
city = state["city"]
weather_result = weather_tool.run(city)
return {"weather_info": weather_result}
def get_news(state: AgentState):
"""调用新闻搜索工具"""
query = f"{state['city']} AI technology news today"
news_result = search_tool.run(query)
news_summary = "\n".join([f"- {res['title']}: {res['content'][:100]}..." for res in news_result])
return {"news_info": news_summary}
def generate_report(state: AgentState):
"""汇总信息生成最终报告"""
prompt = f"""
基于以下信息生成一份简洁的Markdown格式简报:
城市:{state['city']}
天气:{state.get('weather_info', '无')}
新闻:{state.get('news_info', '无')}
"""
response = llm.invoke(prompt)
return {"final_report": response.content}
# 5. 构建图工作流
def create_workflow():
workflow = StateGraph(AgentState)
workflow.add_node("parse_input", parse_input)
workflow.add_node("get_weather", get_weather)
workflow.add_node("get_news", get_news)
workflow.add_node("generate_report", generate_report)
workflow.set_entry_point("parse_input")
workflow.add_edge("parse_input", "get_weather")
workflow.add_edge("parse_input", "get_news")
# 并行执行天气与新闻查询,两者都完成后进入报告生成
workflow.add_edge("get_weather", "generate_report")
workflow.add_edge("get_news", "generate_report")
workflow.add_edge("generate_report", END)
return workflow.compile()
# 6. 运行Agent
app = create_workflow()
initial_state = {"messages": [HumanMessage(content="查询北京天气和AI新闻")], "city": "", "weather_info": "", "news_info": "", "final_report": ""}
result = app.invoke(initial_state)
print(result["final_report"])
LangGraph精妙之处:
- 清晰的状态管理:所有数据在
AgentState 中定义与传递,避免了全局变量的混乱。
- 可视化流程:图结构使工作流一目了然,易于调试与扩展。
- 内置并行与同步:
get_weather 与 get_news 节点可以并行执行,并自动同步后进入下一步 generate_report。
- 极强扩展性:新增步骤仅需定义新的节点函数并将其插入图中,整体架构能保持整洁。
五、框架选择终极指南与最佳实践
5.1 决策清单:你的场景匹配哪个框架?
| 你的身份与目标 |
推荐框架 |
关键理由 |
| 非技术背景,快速验证想法 |
RelevanceAI |
无代码可视化,最快上线 |
| 初学者,希望理解Agent核心概念 |
smolagents |
极简API,学习曲线平缓,官方教程优秀 |
| 构建中等复杂度应用,重视生态 |
LangChain |
丰富集成、工具与社区,文档案例海量 |
| 核心是文档问答/RAG系统 |
LlamaIndex |
专精数据处理与检索,性能优化到位 |
| 设计多角色协作虚拟团队 |
CrewAI |
角色、任务、流程抽象直观,适合内容生产等场景 |
| 需要动态对话协作与人类介入 |
AutoGen |
对话即协作,适合研究、创意类动态任务 |
| 构建复杂、稳定、可控的生产流程 |
LangGraph |
图模型提供最高控制精度,适合金融、运维等严肃场景 |
5.2 避坑与实践建议
- 避免过度设计:简单任务无需复杂框架。例如,仅调用1-2个API的任务,使用 LangChain 的
AgentExecutor 或 smolagents 即可。
- 优化Token消耗:Agent 的“思考-行动”循环会多次调用 LLM。利用框架的上下文管理功能(如 LangGraph 的状态选择)避免不必要的历史消息传入,是 Python 开发者优化成本的关键。
- 编写清晰的工具描述:工具的
description 字段是 LLM 决定是否及如何调用工具的关键。模糊的描述会导致错误的调用。
- 实现错误处理:工具调用可能失败。设计容错机制,例如在 LangGraph 中通过 条件边 检查结果并路由到重试或降级处理节点。
- 从小规模开始:先用简单框架或快速原型验证核心需求,观察哪些任务模式重复出现,再使用更高级的框架(如 LangGraph)将其固化为优化的工作流。
- 重视可观测性:利用框架提供的调试工具(如 LangSmith for LangChain)追踪执行流程、检查中间状态,这对复杂系统的开发和维护至关重要。
写在最后
AI Agent 技术正从“炫技”走向“实用”,成为开发者延伸能力的重要杠杆。无论是 AutoGen 通过对话实现的动态协作,还是 LangGraph 通过图编排提供的精密控制,都在推动 AI 从“被动问答”走向“主动执行”。
技术的本质是延伸人的能力。Agent 延伸的,正是我们规划、协调与执行的综合能力。选择适合的框架,从小处着手,你可以构建出能自动处理邮件、监控日志、生成报告甚至管理项目的数字员工。
你现在最希望哪个重复性任务被 AI Agent 自动化?是客服邮件处理、系统日志监控,还是个性化的信息筛选?欢迎在 云栈社区 分享你的场景和想法,让我们共同探索技术实现的更多可能。
参考资料
[1] LangGraph官方教程: https://langchain-ai.github.io/langgraph/
[2] AutoGen官方示例: https://microsoft.github.io/autogen/
[3] Hugging Face smolagents课程: https://huggingface.co/learn/agents-course/
[4] LangChain Agent概念指南: https://python.langchain.com/docs/concepts/#agents
