使用LangChain、CrewAI、AutoGen搭建数据分析Agent。
微信搜索关注《AI科技论谈》
如今这个数据驱动的时代,企业都依赖数据分析师解读复杂数据,挖掘可操作的信息以助力决策。若用AI提升此过程的效率与扩展性会怎样呢?数据分析智能体便应运而生了。
数据分析智能体能自动开展分析任务、执行代码,还能对数据查询做出自适应回应。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()
while True:
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("----------------------------------------")
结果如下所示:
3 结语
文章详细介绍了运用 LangGraph、CrewAI 和 AutoGen 构建数据分析智能体的方法。借助这些框架,智能体具备生成、执行和分析代码的能力,能够高效应对数据查询。
由于这些工具可将重复性任务自动化,大大加快了数据分析速度,增强了其可扩展性。而且,其模块化的设计便于按照特定需求进行定制,这对于数据专业人员而言极具应用价值。这
些智能体充分展现了人工智能在简化工作流程以及便捷提取数据见解方面的巨大潜力,为数据处理工作带来了新的思路与方法,有望推动相关领域的进一步发展与创新。
推荐书单
《一本书读懂AI Agent:技术、应用与商业》
这是一部从技术原理、行业应用、商业价值、投资创业、发展趋势5个维度讲解AI Agent的著作,具有科普书和商业书的双重属性。本书首先详细介绍了AI Agent的技术路径及其在11大领域的应用,丰富的应用案例可以帮助读者深度理解AI Agent产品形态与服务方式;然后深入探讨了AI Agent的商业价值与商业生态,并对AI Agent的企业级应用和投资创业做了很多思考与总结,能够带给读者应用与创业方面的启发。本书将技术、应用及商业理念融会贯通,理论性与实用性兼具,是一本适合业内外人士快速了解AI Agent、提升行业认知的综合指南,得到了很多行业人士、专家及创业者的一致好评。全书共15章,分为四个部分: 第一部分(第1~3章) 技术认知 首先,介绍AI Agent的概念、特征、定义、发展历程、分类方式,以帮助读者全面认知AI Agent;然后,介绍AI Agent核心技术,展示其技术原理、形等。
购买链接:https://item.jd.com/14306237.html
精彩回顾
QwQ-32B本地部署教程来了,全新开源推理大模型,性能比肩DeepSeek满血版