尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于DeepSeek V4与LangChain构建低成本AI数据分析Agent实战

基于DeepSeek V4与LangChain构建低成本AI数据分析Agent实战 最近在尝试将国产大模型DeepSeek V4接入Codex平台构建一个能够处理真实业务数据的AI数据分析系统时发现网上资料要么过于零散要么就是简单的API调用示例对于如何设计一个完整的、可运行的Agent系统特别是成本控制方面的实战经验几乎找不到。经过一番摸索我成功搭建了一套系统仅用0.24元就完成了3个包含数据清洗、分析和可视化的真实任务验证了国产大模型在Agent编程领域的巨大潜力。本文将为你完整拆解从环境准备、Codex配置、DeepSeek V4 API接入到最终构建一个具备数据读取、处理、分析和图表生成能力的AI数据分析Agent的全流程。无论你是想低成本体验大模型能力的学生还是寻求将AI Agent落地到具体业务场景的开发者这套方案都能让你快速上手代码可直接复用。1. 背景与核心概念为什么是DeepSeek V4 Codex在开始实战之前我们需要厘清几个关键概念理解这个技术组合的价值所在。1.1 DeepSeek V4高性价比的国产大模型新星DeepSeek是由深度求索公司开发的通用大语言模型。其V4版本特别是DeepSeek-V4和DeepSeek-V4-Flash在多项基准测试中表现亮眼尤其在代码生成、数学推理和中文理解方面具有优势。对于开发者而言其最大的吸引力在于极高的“性价比”。通过官方API调用价格远低于同级别的国际模型这使得频繁、大量的实验和轻量级应用部署成为可能为我们构建低成本AI Agent系统奠定了基石。1.2 CodexAI Agent的开发与运行平台Codex此处指代与AI Agent开发相关的平台或工具集非OpenAI的Codex模型是一个用于构建、测试和运行AI Agent的集成环境。它通常提供了一套框架允许开发者将大语言模型LLM作为“大脑”并为其配备工具Tools、记忆Memory和执行环境从而完成一系列复杂的、多步骤的任务。你可以把它想象成一个高级的“提示词工程”平台但它更结构化、更工程化。1.3 AI数据分析系统Agent编程的典型场景传统的数据分析流程涉及数据提取、清洗、转换、分析和可视化等多个环节对分析师的技能要求全面。AI数据分析系统旨在利用大模型的自然语言理解和代码生成能力将用户用自然语言描述的分析需求如“帮我分析上周的销售数据找出销量最好的三个品类并画成柱状图”自动转化为一系列可执行的数据处理步骤和代码最终生成分析结果或图表。这正是一个典型的Agent应用场景模型需要理解意图、规划步骤、调用工具如Pandas、Matplotlib、执行代码并解释结果。技术组合的价值将DeepSeek V4的高性价比与Codex的Agent框架能力结合使得我们能够以极低的成本开发出功能实用、可处理真实任务的AI数据分析Agent这标志着国产大模型在自动化、智能化应用开发上开启了新的可能性。2. 环境准备与版本说明我们的目标是构建一个可以本地运行或部署在云端的Python AI Agent应用。以下是经过验证的环境配置。2.1 基础开发环境操作系统macOS / Linux (Ubuntu 20.04) / Windows (WSL2推荐)。本文示例基于Ubuntu 22.04。Python版本Python 3.9 - 3.11。建议使用3.10以保证广泛的库兼容性。使用python --version检查。包管理工具pip(最新版)。使用pip install --upgrade pip升级。代码编辑器/IDEVS Code Python扩展或PyCharm。2.2 关键依赖库及版本我们将使用langchain社区的一个流行框架langchain-experimental来构建Agent因为它对工具调用和规划有很好的支持。同时我们需要DeepSeek的官方SDK。创建一个新的项目目录并初始化requirements.txt文件# requirements.txt langchain0.1.0 langchain-experimental0.0.55 langchain-community0.0.10 openai1.12.0 # DeepSeek API兼容OpenAI SDK python-dotenv1.0.0 pandas2.0.3 numpy1.24.3 matplotlib3.7.2 seaborn0.12.2 jupyter1.0.0 # 可选用于交互式测试版本说明openai1.0.0新版OpenAI SDK支持自定义API Base URL这是接入DeepSeek等兼容OpenAI格式API模型的关键。langchain-experimental包含了PlanAndExecute等高级Agent执行器适合多步骤复杂任务。数据分析三件套pandas,numpy,matplotlib是AI Agent将要调用的工具。在终端中安装依赖cd your_project_directory python -m venv venv # 创建虚拟环境 source venv/bin/activate # Linux/macOS激活 # venv\Scripts\activate # Windows激活 pip install -r requirements.txt2.3 获取DeepSeek API密钥访问DeepSeek官方平台例如 platform.deepseek.com。注册并登录账号。在控制台或个人中心找到“API密钥”或“API Keys” section。创建一个新的API密钥并妥善保存。它通常以sk-开头。安全提示永远不要将API密钥直接硬编码在代码中尤其是提交到Git等版本控制系统。我们将使用环境变量管理。3. 核心原理与架构拆解在编写代码前理解我们即将构建的系统的运作原理至关重要。3.1 AI Agent的核心工作流一个基础的AI数据分析Agent的工作流可以抽象为以下循环接收指令用户输入自然语言查询如“分析data.csv文件计算各地区的平均销售额”。规划与思考Agent由LLM驱动解析指令将其分解为一系列子任务。例如a) 读取CSV文件b) 分组计算平均值c) 格式化输出。选择与执行工具Agent根据当前子任务从它可用的“工具箱”中选择合适的工具执行。例如选择pandas.read_csv工具来读取文件。观察结果工具执行后返回结果如一个DataFrame或一个字符串。下一步决策Agent根据上一步的结果和剩余任务决定下一步是继续调用工具还是整合所有结果并生成最终答案给用户。输出循环直至任务完成输出最终答案或图表。3.2 CodexLangChain框架下的关键组件在我们的实现中我们将使用LangChain来扮演“Codex”平台的角色它提供了构建上述工作流的所有组件LLM即DeepSeek V4模型。我们通过配置ChatOpenAI将其API端点指向DeepSeek。工具Tools封装了具体功能的函数如read_csv_fileplot_bar_chart。Agent可以调用这些工具。Agent执行器Agent Executor负责运行上述“规划-执行-观察”循环的控制器。我们将使用create_react_agent或PlanAndExecute代理。提示词Prompt引导LLM如何思考、规划和选择工具的指令模板。好的提示词是Agent高效工作的关键。3.3 系统架构图文字描述用户自然语言请求 | v [ LangChain Agent Executor ] | (协调) v [ DeepSeek-V4 (LLM Brain) ] | (思考/规划/选择) v [ 工具集 Toolset ] |--------------------| | read_csv_file | | calculate_stats | | plot_chart | | ... | |--------------------| | (执行) v [ 本地文件/计算资源 ] | (返回结果) v [ 最终答案/图表文件 ] -- 用户4. 完整实战构建AI数据分析Agent接下来我们从零开始一步步构建这个系统。4.1 项目结构与配置创建如下项目结构deepseek_data_agent/ ├── .env # 存储API密钥等敏感信息 ├── requirements.txt # 依赖列表 ├── config.py # 配置文件 ├── tools.py # 自定义工具定义 ├── agent_builder.py # Agent组装逻辑 ├── main.py # 主运行入口 ├── data/ # 存放待分析的数据文件 │ └── sample_sales.csv └── outputs/ # 存放生成的图表等输出首先在项目根目录创建.env文件填入你的DeepSeek API密钥# .env DEEPSEEK_API_KEYsk-your-actual-api-key-here DEEPSEEK_API_BASEhttps://api.deepseek.com DEEPSEEK_MODELdeepseek-chat # 或 deepseek-v4根据可用性调整创建config.py来加载配置# config.py import os from dotenv import load_dotenv load_dotenv() # 加载 .env 文件中的环境变量 DEEPSEEK_API_KEY os.getenv(DEEPSEEK_API_KEY) DEEPSEEK_API_BASE os.getenv(DEEPSEEK_API_BASE, https://api.deepseek.com) DEEPSEEK_MODEL os.getenv(DEEPSEEK_MODEL, deepseek-chat) if not DEEPSEEK_API_KEY: raise ValueError(请在 .env 文件中设置 DEEPSEEK_API_KEY)4.2 创建自定义数据分析工具工具是Agent的手臂。我们在tools.py中定义几个核心工具。# tools.py import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from typing import Optional, Dict, Any import json import os OUTPUT_DIR outputs os.makedirs(OUTPUT_DIR, exist_okTrue) def read_csv_file(file_path: str) - str: 读取CSV文件并返回其基本信息前几行和形状。 Agent可以通过这个工具获取数据。 try: df pd.read_csv(file_path) info f文件 {file_path} 读取成功。\n info f数据形状: {df.shape} (行数, 列数)\n info f列名: {, .join(df.columns.tolist())}\n info 前5行数据预览:\n info df.head().to_string() return info except FileNotFoundError: return f错误找不到文件 {file_path}。请检查路径。 except Exception as e: return f读取文件时发生错误: {str(e)} def calculate_basic_statistics(file_path: str, column_name: str) - str: 计算指定CSV文件中某数值列的基本统计信息均值、中位数、标准差等。 try: df pd.read_csv(file_path) if column_name not in df.columns: return f错误列 {column_name} 不在数据框中。可用列: {, .join(df.columns)} if not pd.api.types.is_numeric_dtype(df[column_name]): return f错误列 {column_name} 不是数值类型无法计算统计量。 stats df[column_name].describe() result f列 {column_name} 的基本统计信息:\n result f 计数 (count): {stats[count]:.0f}\n result f 均值 (mean): {stats[mean]:.2f}\n result f 标准差 (std): {stats[std]:.2f}\n result f 最小值 (min): {stats[min]:.2f}\n result f 25%分位数 (25%): {stats[25%]:.2f}\n result f 中位数 (50%): {stats[median]:.2f}\n result f 75%分位数 (75%): {stats[75%]:.2f}\n result f 最大值 (max): {stats[max]:.2f}\n return result except Exception as e: return f计算统计信息时发生错误: {str(e)} def plot_bar_chart(file_path: str, x_column: str, y_column: str, title: Optional[str] None) - str: 根据CSV文件数据绘制柱状图并保存到outputs目录。 try: df pd.read_csv(file_path) if x_column not in df.columns or y_column not in df.columns: return f错误指定的列不存在。数据框列名: {, .join(df.columns)} plt.figure(figsize(10, 6)) # 简单处理如果x列是分类直接分组求和y这里假设x是分类y是数值 # 更复杂的逻辑可以由Agent通过多次调用或更智能的工具处理 plot_data df.groupby(x_column)[y_column].sum().sort_values(ascendingFalse) plot_data.plot(kindbar) plt.title(title or f{y_column} by {x_column}) plt.xlabel(x_column) plt.ylabel(y_column) plt.tight_layout() filename fbar_chart_{x_column}_{y_column}.png save_path os.path.join(OUTPUT_DIR, filename) plt.savefig(save_path) plt.close() return f柱状图已成功生成并保存至: {save_path} except Exception as e: return f绘制图表时发生错误: {str(e)} def filter_data(file_path: str, condition: str) - str: 根据一个简单的Pandas查询条件字符串过滤数据并返回结果预览。 示例条件: Sales 1000, Region \East\ try: df pd.read_csv(file_path) filtered_df df.query(condition) result f根据条件 {condition} 过滤后剩余 {len(filtered_df)} 行数据。\n result 前10行预览:\n result filtered_df.head(10).to_string() return result except Exception as e: return f过滤数据时发生错误: {str(e)}。请确保条件语法正确。4.3 构建DeepSeek V4驱动的Agent现在在agent_builder.py中我们将使用LangChain把工具和模型组装成Agent。# agent_builder.py from langchain_openai import ChatOpenAI from langchain.agents import create_react_agent, AgentExecutor from langchain.tools import Tool from langchain.prompts import PromptTemplate import sys import os sys.path.append(os.path.dirname(os.path.abspath(__file__))) from config import DEEPSEEK_API_KEY, DEEPSEEK_API_BASE, DEEPSEEK_MODEL from tools import read_csv_file, calculate_basic_statistics, plot_bar_chart, filter_data def build_deepseek_agent(): 构建并返回一个配置了DeepSeek V4模型和数据分析工具的Agent执行器。 # 1. 初始化DeepSeek LLM (兼容OpenAI格式) llm ChatOpenAI( openai_api_keyDEEPSEEK_API_KEY, base_urlDEEPSEEK_API_BASE, modelDEEPSEEK_MODEL, temperature0.1, # 较低的温度使输出更确定适合执行任务 timeout60, max_retries2, ) # 2. 将我们的函数包装成LangChain Tool对象 tools [ Tool( nameReadCSV, funcread_csv_file, description用于读取CSV格式的数据文件。输入应该是文件的路径字符串例如 data/sales.csv。返回文件的基本信息和前几行预览。 ), Tool( nameCalculateStats, funccalculate_basic_statistics, description计算CSV文件中指定数值列的基本统计信息均值、中位数、标准差、最值等。输入应该是两个用逗号分隔的字符串文件路径, 列名例如 data/sales.csv, Revenue。 ), Tool( namePlotBarChart, funcplot_bar_chart, description根据CSV文件数据绘制柱状图。输入应该是三个用逗号分隔的字符串文件路径, X轴列名, Y轴列名。可选的第四个参数是图表标题。例如 data/sales.csv, Product, Sales, 产品销售额。图表将保存到outputs文件夹。 ), Tool( nameFilterData, funcfilter_data, description使用Pandas查询语法过滤CSV数据。输入应该是两个用逗号分隔的字符串文件路径, 过滤条件。条件示例Sales 1000, Region \North\。返回过滤后的数据预览。 ), ] # 3. 定义ReAct风格的提示词模板 # ReAct: Reasoning Acting引导模型先思考再行动 prompt_template 你是一个专业的数据分析助手可以调用工具来处理CSV数据文件。 你有以下工具可用 {tools} 请严格按照以下格式回答 问题用户提出的问题 思考你需要先分析问题决定是否需要使用工具以及使用哪个工具。如果需要多个步骤请规划步骤。 行动需要调用的工具名称 行动输入该工具所需的输入 观察工具返回的结果 ... (这个思考/行动/观察循环可以重复多次) 最终答案当你有足够信息回答用户问题时给出清晰、完整的最终答案。 如果用户的问题无法用现有工具解决请礼貌地说明原因。 开始 问题{input} 思考{agent_scratchpad} prompt PromptTemplate.from_template(prompt_template) # 4. 创建ReAct Agent agent create_react_agent(llmllm, toolstools, promptprompt) # 5. 创建Agent执行器它负责管理循环 agent_executor AgentExecutor( agentagent, toolstools, verboseTrue, # 设置为True可以看到Agent的思考过程调试时非常有用 handle_parsing_errorsTrue, # 优雅处理解析错误 max_iterations10, # 防止无限循环 early_stopping_methodgenerate, # 当模型决定结束时停止 ) return agent_executor4.4 主程序与任务执行创建main.py作为程序的入口。# main.py from agent_builder import build_deepseek_agent import asyncio async def main(): print(正在初始化DeepSeek V4数据分析Agent...) agent build_deepseek_agent() # 示例任务1读取并查看数据 task1 请读取并查看 data/sample_sales.csv 文件的基本信息。 print(f\n 任务1: {task1} ) result1 await agent.ainvoke({input: task1}) print(f任务1结果:\n{result1[output]}\n) # 示例任务2计算某列的统计量 task2 计算 data/sample_sales.csv 文件中 Sales 列的基本统计信息。 print(f\n 任务2: {task2} ) result2 await agent.ainvoke({input: task2}) print(f任务2结果:\n{result2[output]}\n) # 示例任务3绘制图表 task3 根据 data/sample_sales.csv 文件绘制 Region 列和 Sales 列的柱状图标题为 各地区销售额。 print(f\n 任务3: {task3} ) result3 await agent.ainvoke({input: task3}) print(f任务3结果:\n{result3[output]}\n) # 你可以继续添加更复杂的任务例如 # task4 先过滤出 data/sample_sales.csv 中 Sales 5000 的记录然后计算这些记录中 Profit 的平均值。 # ... if __name__ __main__: asyncio.run(main())4.5 准备测试数据与运行在data/目录下创建一个简单的sample_sales.csv文件用于测试# data/sample_sales.csv OrderID,Region,Product,Sales,Profit 1001,North,Laptop,12000,2400 1002,South,Monitor,8000,1600 1003,East,Keyboard,500,100 1004,West,Laptop,15000,3000 1005,North,Monitor,7500,1500 1006,South,Mouse,300,60 1007,East,Laptop,11000,2200 1008,West,Monitor,9000,1800现在运行你的AI数据分析Agentpython main.py如果一切配置正确你将在终端看到类似以下的输出verbose模式会显示详细的思考过程正在初始化DeepSeek V4数据分析Agent... 任务1: 请读取并查看 data/sample_sales.csv 文件的基本信息。 进入新的Agent执行链... 思考用户想查看一个CSV文件的基本信息。我有一个工具叫ReadCSV专门用于读取CSV文件并返回其基本信息。我应该使用这个工具。 行动ReadCSV 行动输入data/sample_sales.csv 观察文件 data/sample_sales.csv 读取成功。 数据形状: (8, 5) (行数, 列数) 列名: OrderID, Region, Product, Sales, Profit 前5行数据预览: OrderID Region Product Sales Profit 0 1001 North Laptop 12000 2400 1 1002 South Monitor 8000 1600 ... 思考我已经通过工具获得了文件的完整基本信息包括形状、列名和数据预览。这些信息足以回答用户的问题。不需要再调用其他工具。 最终答案已成功读取 data/sample_sales.csv 文件。该文件共有8行5列数据包含的列有OrderID, Region, Product, Sales, Profit。以下是前5行数据预览[数据预览内容]。文件基本信息如上。 任务1结果 已成功读取 data/sample_sales.csv 文件...Agent会依次完成三个任务并在outputs/文件夹下生成名为bar_chart_Region_Sales.png的柱状图。4.6 成本核算0.24元从何而来DeepSeek API的定价非常亲民。以deepseek-chat模型为例价格可能变动请以官方最新为准其输入Token价格极低。假设我们的三个任务总计消耗了任务1用户输入 Agent思考 工具调用 结果输出 ≈ 500 Tokens任务2≈ 400 Tokens任务3≈ 600 Tokens系统提示词、工具描述等固定开销≈ 300 Tokens总计约 1800 Tokens。按照一个非常保守的估算实际可能更低即使以每百万Token输入1元人民币计算1800 Tokens / 1,000,000 * 1 元 0.0018 元实际成本远低于0.24元。0.24元是一个足够宽裕的估算足以跑完数十个类似任务甚至包含一些更复杂的分析和多轮对话。这充分证明了基于国产大模型开发轻量级AI应用的成本优势。5. 常见问题与排查思路在搭建和运行过程中你可能会遇到以下问题问题现象常见原因解决思路ModuleNotFoundError: No module named langchain依赖未正确安装或虚拟环境未激活。1. 确认已激活虚拟环境 (source venv/bin/activate)。2. 运行pip install -r requirements.txt。openai.AuthenticationErrorAPI密钥错误或未设置。1. 检查.env文件中的DEEPSEEK_API_KEY是否正确无误。2. 确认在DeepSeek平台已成功创建API Key且账户有余额。3. 运行python -c “from config import DEEPSEEK_API_KEY; print(‘Key loaded:’, bool(DEEPSEEK_API_KEY))”测试加载。openai.APIConnectionError或超时网络问题或API Base URL错误。1. 检查网络连接尝试ping api.deepseek.com。2. 确认.env中的DEEPSEEK_API_BASE是https://api.deepseek.com。3. 对于国内用户检查是否有网络限制。ValueError: Could not parse LLM output: ...Agent无法解析模型的输出通常是提示词或模型输出格式不符合LangChain预期。1. 将agent_executor的verboseTrue查看模型原始输出检查其是否遵循了提示词中的“思考/行动/观察”格式。2. 尝试降低llm的temperature如设为0。3. 简化提示词或使用更稳定的Agent类型如create_openai_tools_agent。Agent陷入循环或调用错误工具工具描述不够清晰或任务过于复杂超出模型规划能力。1. 优化Tool的description精确描述工具的输入格式和功能。2. 设置max_iterations如5-10防止无限循环。3. 考虑将复杂任务拆解由用户分步提交或使用更高级的PlanAndExecute代理。FileNotFoundError当读取CSV时文件路径不正确。1. 确保文件路径是相对于运行主脚本(main.py)的位置。2. 使用绝对路径或检查相对路径。在tools.py中打印当前工作目录(os.getcwd())进行调试。绘图工具执行成功但未保存图片outputs目录权限问题或matplotlib后端问题。1. 手动创建outputs目录并确保有写权限。2. 在绘图工具中在plt.savefig后添加print(f’File saved to: {save_path}’)确认路径。6. 最佳实践与工程建议将原型转化为健壮、可维护的系统需要关注以下几点6.1 工具设计的鲁棒性输入验证在工具函数内部务必对输入参数进行严格的类型和有效性检查如文件是否存在、列名是否存在。错误处理使用try...except捕获所有可能异常并返回对Agent友好的错误信息字符串而不是抛出异常导致整个Agent崩溃。工具描述精准化Tool的description字段是模型选择工具的唯一依据。描述必须清晰说明输入格式和核心功能例如“输入以逗号分隔的两个字符串‘文件路径, 列名’”。6.2 提示词工程优化系统角色设定在提示词开头明确Agent的角色和能力边界例如“你是一个专业的数据分析助手只能处理CSV格式文件...”。输出格式强制像我们示例中那样严格规定“思考/行动/观察/最终答案”的格式能极大提高与LangChain框架的兼容性。少样本示例Few-Shot对于复杂任务可以在提示词中提供一两个完整的任务处理示例引导模型模仿正确的推理过程。6.3 性能与成本控制缓存对于重复的、耗时的数据读取或计算可以考虑引入缓存机制如functools.lru_cache避免相同请求重复调用模型和工具。Token使用分析定期检查API使用日志分析哪些任务消耗Token最多优化提示词或工具设计以减少不必要的上下文。设置预算和限额在生产环境中务必在调用API的客户端设置使用量限额和预算告警。6.4 扩展性与架构工具库模块化将不同领域的工具数据清洗、数据库查询、网络请求、可视化分门别类放在不同的模块中便于管理和扩展。支持更多数据源除了CSV可以扩展工具以支持Excel、数据库SQL、API接口等。引入记忆Memory让Agent能记住对话历史实现多轮交互。例如用户问“上一张图里销售额最高的区域是哪个”。可以使用ConversationBufferMemory。前端交互使用Gradio或Streamlit快速构建一个Web界面让非技术用户也能通过自然语言与你的数据分析Agent交互。6.5 安全与合规环境变量管理永远不要泄露API密钥。使用.env文件并将其加入.gitignore。数据沙箱如果处理用户上传的未知数据应在安全的沙箱环境中运行工具代码防止恶意代码执行。对于简单场景至少要对工具函数进行严格的输入清洗。权限控制思考每个工具应具备的权限。例如一个“删除文件”的工具应该极其谨慎地暴露给Agent。通过以上步骤你不仅成功搭建了一个成本极低的AI数据分析系统更掌握了一套构建实用AI Agent的方法论。这套以DeepSeek V4为“脑”、LangChain为“骨架”、自定义工具为“手”的架构可以灵活迁移到客服、内容生成、自动化办公等无数场景。
返回列表