欢迎来到《Python + AI Agent 实战开发完全指南》专栏!

在上一讲中,我们用原生 Python 手搓了一个基础的 Agent。但在真实的工程落地中,如果所有的意图识别、工具解析、状态流转都由我们自己手写,不仅开发效率低,还容易遇到各种边界 Bug。因此,引入成熟的开源框架成为了必然选择。

目前市面上的 Agent 框架百花齐放,对于新手和企业开发者来说,最大的痛点就是: “不知道该怎么选” 。今天我们就来深度剖析当前主流的几款 Agent 框架,帮你避开选型陷阱,找到最适合你的技术路线。


️ 一、 核心框架全景图:谁才是你的“天菜”?

1. LangChain:生态最全的“瑞士军刀”

  • 定位:最流行的大模型应用开发框架,拥有极其庞大的插件生态(文档加载器、各类向量数据库集成等)。
  • 优势:开箱即用,社区庞大,遇到问题几乎都能搜到答案;支持绝大多数主流大模型。
  • 劣势:抽象层级过高,经常“过度封装”。当你需要修改底层逻辑时,往往像在黑盒里找东西一样痛苦。
  • 适用场景:快速搭建原型、简单的 RAG(检索增强生成)问答系统、标准单步工具调用。

2. LangGraph:复杂工作流的“精密齿轮” ️

  • 定位:LangChain 团队推出的进阶框架,专为解决 LangChain 无法处理的复杂循环和状态管理而生。
  • 核心亮点:基于有向无环图(DAG)理念,将 Agent 的执行过程抽象为节点(Nodes)和边(Edges)。它原生支持循环边,这意味着你可以轻松实现多轮对话回溯、条件分支跳转以及人工审核节点。
  • 劣势:学习曲线陡峭,需要手动定义严格的状态模式(如 TypedDict),代码编写相对繁琐。
  • 适用场景:金融风控分析、医疗诊断辅助等对流程可控性、可审计追踪要求极高的企业级复杂任务。

3. AutoGen & CrewAI:多智能体协作的“虚拟公司”

  • CrewAI:主打“低代码/提示词驱动”。你只需要通过提示词设定不同的角色(如研究员、写手、主编),就能在 10 分钟内搭出一个多 Agent 协作流。非常适合做演示 Demo。但它的缺点是不适合高并发场景,且底层黑盒较重。
  • AutoGen (微软出品):以动态代码沙箱和人机协同接口著称。它将多智能体系统抽象为一个群聊,Agent 之间可以互相发消息,并且可以在安全的沙箱环境中实时执行 Python 代码进行调试。
  • 适用场景:自动化软件开发团队、复杂的跨部门业务流转、需要实时调试的科研数据分析。

4. PydanticAI & OpenAI Swarm:特定领域的“特种兵”

  • PydanticAI:专注于类型安全和结构化输出。如果你的业务要求 Agent 必须返回严格的 JSON 格式(如对接下游 API),它能利用 Pydantic 保证数据校验,防止运行时错误。
  • OpenAI Swarm:极简的多智能体协调框架,主打轻量级的交接模式,适合处理简单的多智能体路由分发。

二、 选型指南:从四个维度评估你的需求

不要盲目追求最新或最火的框架,建议结合以下四个核心维度进行评估:

考量维度 核心关注点 选型建议
任务复杂度 是否需要分支、循环、多步推理? 简单任务用 LangChain;复杂状态流转必选 LangGraph。
可控性与可观测性 能否清晰追踪每一步决策? 涉及资金或敏感数据的业务,优先选择能记录完整轨迹的框架。
多Agent协作 是否需要角色分工、任务分配? 快速验证选 CrewAI;重度代码交互选 AutoGen。
Token成本 自治度越高,冗余调用越多 生产环境需考虑 Token 消耗,避免不必要的反思循环。

三、 实战演练:用原生 Python 理解 Tool Calling 机制

为了让你不被框架的“魔法”迷惑,我们继续采用原生 Python,带你手写一段标准的工具注册与分发逻辑。这也是所有高级框架(如 LangChain)底层的运行原理。

import json

# ========== 1. 模拟大模型的 Function Calling 响应 ==========
# 在实际开发中,这个字典是由 LLM API 返回的 JSON 结构
llm_response = {
    "tool_calls": [
        {
            "id": "call_abc123",
            "function": {
                "name": "get_weather",
                "arguments": "{\"city\": \"北京\", \"date\": \"2026-06-08\"}" 
            }
        }
    ]
}

# ========== 2. 定义真实可调用的工具函数 ==========
def get_weather(city: str, date: str) -> str:
    """查询天气的实际业务逻辑"""
    return f"{city}{date}的天气为晴,气温28℃"

# ========== 3. 构建安全可靠的工具分发器 ==========
TOOL_MAP = {
    "get_weather": get_weather
}

def execute_tool_calls(llm_response: dict) -> list[dict]:
    """
    解析大模型的意图并安全执行
    """
    results = []
    if not llm_response.get("tool_calls"):
        return results
        
    for tool_call in llm_response["tool_calls"]:
        func_name = tool_call["function"]["name"]
        # 安全地将字符串参数解析为字典
        try:
            func_args = json.loads(tool_call["function"]["arguments"])
        except json.JSONDecodeError:
            results.append({"error": "参数解析失败"})
            continue
            
        # 匹配并执行工具
        if func_name in TOOL_MAP:
            result = TOOL_MAP[func_name](**func_args)
            results.append({
                "tool_call_id": tool_call["id"],
                "result": result
            })
        else:
            results.append({"error": f"未知工具: {func_name}"})
            
    return results

# 测试执行
if __name__ == "__main__":
    execution_results = execute_tool_calls(llm_response)
    print(json.dumps(execution_results, ensure_ascii=False, indent=2))

本节小结

今天我们理清了主流框架的定位:LangChain 适合快速起步,LangGraph 掌控复杂状态,CrewAI/AutoGen 玩转多智能体。同时,通过手写的 execute_tool_calls 函数,你应该已经明白了 Agent 是如何把大模型的“自然语言意图”转化为“真实代码执行”的。

下一讲,我们将正式接入大模型 API,让这套原生的工具分发系统真正“活”起来,跑通第一个具备自主规划能力的 ReAct Agent!准备好迎接真正的智能了吗?

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐