使用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大模型商业化落地方案

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

相关推荐
刘什么洋啊Zz2 小时前
MacOS下使用Ollama本地构建DeepSeek并使用本地Dify构建AI应用
人工智能·macos·ai·ollama·deepseek
goodmao2 小时前
【DeepSeek】-macOS本地终端部署后运行DeepSeek如何分析图片
gpt·macos·大模型·ollama·deepseek·本地图片分析
奔跑草-3 小时前
【拥抱AI】GPT Researcher 源码试跑成功的心得与总结
人工智能·gpt·ai搜索·deep research·深度检索
禁默3 小时前
【第四届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2025】网络安全,人工智能,数字经济的研究
人工智能·安全·web安全·数字经济·学术论文
AnnyYoung5 小时前
华为云deepseek大模型平台:deepseek满血版
人工智能·ai·华为云
INDEMIND6 小时前
INDEMIND:AI视觉赋能服务机器人,“零”碰撞避障技术实现全天候安全
人工智能·视觉导航·服务机器人·商用机器人
慕容木木6 小时前
【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体的替代品,可本地部署+知识库,注册即可有750w的token使用
人工智能·火山引擎·deepseek·deepseek r1
南 阳6 小时前
百度搜索全面接入DeepSeek-R1满血版:AI与搜索的全新融合
人工智能·chatgpt
企鹅侠客6 小时前
开源免费文档翻译工具 可支持pdf、word、excel、ppt
人工智能·pdf·word·excel·自动翻译
冰淇淋百宝箱7 小时前
AI 安全时代:SDL与大模型结合的“王炸组合”——技术落地与实战指南
人工智能·安全