使用LangChain、CrewAI、AutoGen搭建数据分析Agent

数据分析智能体能自动开展分析任务、执行代码,还能对数据查询做出自适应回应。LangGraph、CrewAI 和 AutoGen 是构建此类人工智能智能体的三大热门框架。本文运用并对比这三个框架,来构建一个简易的数据分析智能体,看看它们在实际应用中的表现究竟如何。

1 数据分析智能体的工作原理

数据分析智能体首先接收用户的查询,据此生成读取和分析文件数据的代码。接着利用 Python REPL 工具执行该代码,并把执行结果回传至智能体。随后智能体对收到的结果加以分析,进而回复用户查询。鉴于大型语言模型(LLM)可生成任意代码,在本地环境执行其生成的代码时必须谨慎小心,确保整个过程安全可靠。

2 使用 LangGraph 构建数据分析智能体

  • 先决条件

在构建智能体之前,确保你已获取所需大型语言模型的必要 API 密钥,使用这些 API 密钥加载 .env 文件。

复制代码
from dotenv import load_dotenv
load_dotenv("./env")
  • 所需库

    • langchain --- 0.3.7
    • langchain - experimental --- 0.3.3
    • langgraph --- 0.2.52
    • crewai --- 0.80.0
    • Crewai - tools --- 0.14.0
    • autogen - agentchat --- 0.2.38

准备就绪后,开始构建智能体。

2.1 使用 LangGraph 构建数据分析智能体的步骤

1).导入必要的库

复制代码
import pandas as pd
from IPython.display import Image, display
from typing import List, Literal, Optional, TypedDict, Annotated
from langchain_core.tools import tool
from langchain_core.messages import ToolMessage
from langchain_experimental.utilities import PythonREPL
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode, tools_condition
from langgraph.checkpoint.memory import MemorySaver

2). 定义状态

复制代码
class State(TypedDict):
    messages: Annotated[list, add_messages]

graph_builder = StateGraph(State)

3). 定义大型语言模型和代码执行函数,并将该函数绑定到大型语言模型

复制代码
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.1)

@tool
def python_repl(code: Annotated[str, "filename to read the code from"]):
    """使用此函数执行从文件读取的 Python 代码。如果你想查看某个值的输出,
    请确保正确读取代码,并使用 `print(...)` 将其打印出来,这对用户是可见的。"""
    try:
        result = PythonREPL().run(code)
        print("RESULT CODE EXECUTION:", result)
    except BaseException as e:
        return f"执行失败。错误: {repr(e)}"
    return f"已执行:\n```python\n{code}\n```\n标准输出: {result}"

llm_with_tools = llm.bind_tools([python_repl])

4). 定义智能体回复的函数,并将其作为节点添加到图中

复制代码
def chatbot(state: State):
    return {"messages": [llm_with_tools.invoke(state["messages"])]}

graph_builder.add_node("agent", chatbot)

5). 定义工具节点并将其添加到图中

复制代码
code_execution = ToolNode(tools=[python_repl])
graph_builder.add_node("tools", code_execution)

如果大型语言模型返回工具调用,我们需要将其路由到工具节点;否则,可以结束。我们定义一个路由函数,然后添加其他边。

复制代码
def route_tools(state: State):
    """
    在条件边中使用,若最后一条消息包含工具调用,则路由到工具节点,否则路由到结束。
    """
    if isinstance(state, list):
        ai_message = state[-1]
    elif messages := state.get("messages", []):
        ai_message = messages[-1]
    else:
        raise ValueError(f"在输入状态中未找到消息用于工具边: {state}")

    if hasattr(ai_message, "tool_calls") and len(ai_message.tool_calls) > 0:
        return"tools"
    return END

graph_builder.add_conditional_edges(
    "agent",
    route_tools,
    {"tools": "tools", END: END},
)
graph_builder.add_edge("tools", "agent")

6). 添加内存以便与智能体聊天

复制代码
memory = MemorySaver()
graph = graph_builder.compile(checkpointer=memory)

7). 编译并显示图

复制代码
graph = graph_builder.compile(checkpointer=memory)
display(Image(graph.get_graph().draw_mermaid_png()))

8). 开始聊天

由于添加了内存,我们为每个对话分配唯一的线程 ID,并在该线程上开始对话。

复制代码
config = {"configurable": {"thread_id": "1"}}

def stream_graph_updates(user_input: str):
    events = graph.stream(
        {"messages": [("user", user_input)]}, config, stream_mode="values"
    )
    for event in events:
        event["messages"][-1].pretty_print()

whileTrue:
    user_input = input("用户: ")
    if user_input.lower() in ["quit", "exit", "q"]:
        print("再见!")
        break
    stream_graph_updates(user_input)

在循环运行时,我们首先提供文件路径,然后基于数据提出任何问题。

输出如下所示:

由于包含了内存,我们可以在聊天中就数据集提出任何问题。智能体将生成所需的代码,并执行该代码。代码执行结果将返回给大型语言模型。如下例所示:

2.2 使用 CrewAI 构建数据分析智能体

现在,我们使用 CrewAI 进行数据分析任务。

1).导入必要的库

复制代码
from crewai import Agent, Task, Crew
from crewai.tools import tool
from crewai_tools import DirectoryReadTool, FileReadTool
from langchain_experimental.utilities import PythonREPL

2). 构建一个生成代码的智能体和一个执行代码的智能体

复制代码
coding_agent = Agent(
    role="Python 开发者",
    goal="编写设计精良、深思熟虑的代码来解决给定问题",
    backstory="你是一位资深 Python 开发者,在软件及其最佳实践方面拥有丰富经验。你擅长编写简洁、高效且可扩展的代码。",
    llm='gpt-4o',
    human_input=True
)

coding_task = Task(
    description="编写代码解决给定问题,并将代码输出分配给'result' 变量。问题: {problem}",
    expected_output="解决问题的代码,代码输出应分配给'result' 变量",
    agent=coding_agent
)

3). 定义执行代码的函数作为 CrewAI 工具

为了执行代码,我们将使用 PythonREPL(),并将其定义为 CrewAI 工具。

复制代码
@tool("repl")
def repl(code: str) -> str:
    """用于执行 Python 代码"""
    return PythonREPL().run(command=code)

4). 定义可访问 repl 和 FileReadTool() 的执行智能体和任务

复制代码
executing_agent = Agent(
    role="Python 执行者",
    goal="运行接收到的代码以解决给定问题",
    backstory="你是一位 Python 开发者,在软件及其最佳实践方面拥有丰富经验。你能够有效地执行代码、调试和优化 Python 解决方案。",
    llm='gpt-4o-mini',
    human_input=True,
    tools=[repl, FileReadTool()]
)

executing_task = Task(
    description="执行代码解决给定问题,并将代码输出分配给'result' 变量。问题: {problem}",
    expected_output='问题的结果',
    agent=executing_agent
)

5). 构建包含两个智能体和相应任务的团队

复制代码
analysis_crew = Crew(
    agents=[coding_agent, executing_agent],
    tasks=[coding_task, executing_task],
    verbose=True
)

6). 使用以下输入运行团队

复制代码
inputs = {'problem': "读取此文件并返回列名,同时计算平均年龄 /home/santhosh/Projects/Code/LangGraph/gym_members_exercise_tracking.csv"}
result = analysis_crew.kickoff(inputs=inputs)
print(result.raw)

输出如下所示:

2.3 使用 AutoGen 构建数据分析智能体

1).导入必要的库

复制代码
from autogen import ConversableAgent
from autogen.coding import LocalCommandLineCodeExecutor, DockerCommandLineCodeExecutor

2). 定义代码执行器和使用该执行器的智能体

复制代码
executor = LocalCommandLineCodeExecutor(
    timeout=10,  # 每次代码执行的超时时间(秒)
    work_dir='./Data'  # 用于存储代码文件的目录
)

code_executor_agent = ConversableAgent(
    "code_executor_agent",
    llm_config=False,
    code_execution_config={"executor": executor},
    human_input_mode="ALWAYS"
)

3). 定义编写代码的智能体并设置自定义系统消息

https://microsoft.github.io/autogen/0.2/docs/tutorial/code-executors/ 获取 code_writer 系统消息。

复制代码
code_writer_agent = ConversableAgent(
    "code_writer_agent",
    system_message=code_writer_system_message,
    llm_config={"config_list": [{"model": "gpt-4o-mini"}]},
    code_execution_config=False
)

4). 定义要解决的问题并启动聊天

复制代码
problem = "读取路径为 '/home/santhosh/Projects/Code/LangGraph/gym_members_exercise_tracking.csv' 的文件,并打印人员的平均年龄"

chat_result = code_executor_agent.initiate_chat(
    code_writer_agent,
    message=problem
)

聊天开始后,我们也可以就上述数据集提出任何后续问题。如果代码出现错误,我们可以要求修改代码;如果代码无误,我们只需按回车键继续执行代码。

5). 如有需要,还可以使用以下代码打印我们提出的问题及其答案

复制代码
for message in chat_result.chat_history:
    if message['role'] == 'assistant':
        if 'exitcode' not in message['content']:
            print(message['content'])
            print('\n')
    else:
        if 'TERMINATE' in message['content']:
            print(message['content'])
            print("----------------------------------------")

结果如下所示:

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

四、100+套大模型面试题库

五、AI大模型商业化落地方案

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

相关推荐
风象南16 小时前
Claude Code这个隐藏技能,让我告别PPT焦虑
人工智能·后端
KaneLogger16 小时前
【翻译】打造 Agent Skills 的最佳实践
agent·ai编程·claude
QCY17 小时前
「完全理解」1 分钟实现自己的 Coding Agent
前端·agent·claude
Mintopia17 小时前
OpenClaw 对软件行业产生的影响
人工智能
mCell18 小时前
从零构建一个 Mini Claude Code:面向初学者的 Agent 开发实战指南
typescript·agent·claude
雮尘18 小时前
如何在非 Claude IDE (TARE、 Cursor、Antigravity 等)下使用 Agent Skills
前端·agent·ai编程
陈广亮18 小时前
构建具有长期记忆的 AI Agent:从设计模式到生产实践
人工智能
会写代码的柯基犬18 小时前
DeepSeek vs Kimi vs Qwen —— AI 生成俄罗斯方块代码效果横评
人工智能·llm
Mintopia18 小时前
OpenClaw 是什么?为什么节后热度如此之高?
人工智能
爱可生开源社区18 小时前
DBA 的未来?八位行业先锋的年度圆桌讨论
人工智能·dba