数据分析智能体能自动开展分析任务、执行代码,还能对数据查询做出自适应回应。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大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。