智能体(AI Agent、Deepseek、硅基流动)落地实践Demo——借助大模型生成报表,推动AI赋能企业决策

文章目录

  • 一、 引言
  • 二、 系统设计与技术细节
    • 2.1 系统架构
    • 2.2 核心组件说明
  • 三、 Demo 代码
    • 推荐博客:
  • 四、输出
      • 年度营销报告
        • 1. 总销售额 根据提供的数据,年度总销售额为:740.0。
        • 2. 各产品销售额
        • 3. 各地区销售额
        • 4. 各产品在各地区的销售情况
      • 分析与建议
  • 五、 总结

一、 引言

在当前数字化转型和大数据时代,企业对实时数据分析和自动化决策的需求不断增加分享一个智能体 Demo,该 Demo 通过调用硅基流动 DeepSeek API 实现了自动生成 SQL 查询、执行数据库统计,并最终利用大模型生成详细营销报告的完整流程。

此外,硅基流动提供免费的模型服务,用户只需生成相应的 API Key,即可体验低成本高效能的 AI Infra 平台。


二、 系统设计与技术细节

本智能体 Demo 的目标是:

  1. 根据自然语言描述生成个性化 SQL 查询;
  2. 执行 SQL 查询获取数据库统计数据;
  3. 利用大模型根据查询结果生成详细的年度营销报告。

2.1 系统架构

系统整体由三个主要模块构成:

  • 文本解析与 SQL 生成模块:调用硅基流动 DeepSeek API,根据自然语言生成符合业务逻辑的 SQL 查询。
  • 数据库交互模块:通过生成的 SQL 语句与 MySQL 数据库交互,获取统计数据。
  • 报告生成模块:将查询结果传入大模型,再次生成完整的营销报告。

2.2 核心组件说明

  • 硅基流动 DeepSeek API
    DeepSeek 是硅基流动公司推出的大模型产品,支持文本生成和任务执行。此 Demo 使用的是 “deepseek-ai/DeepSeek-V3”,通过调用 API 并传入自然语言提示,获得 SQL 语句或报告文本。
    官网地址:硅基流动
  • LangChain 工具包
    利用 LangChain 提供的 SQLDatabaseToolkit、create_sql_agent 等组件,实现数据库交互与自动化任务管理。
  • 日志调试与正则表达式清洗
    为确保生成的 SQL 语句正确,我们在代码中详细记录了日志,并使用正则表达式剔除模型返回中可能存在的代码块格式标记(例如 sql 和)。

三、 Demo 代码

话不多说,注解很详细了,本代码以思路为主,不涉及开发。
sql建库(test)表:


SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for products
-- ----------------------------
DROP TABLE IF EXISTS `products`;
CREATE TABLE `products`  (`product_id` int NOT NULL,`product_name` text CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL,PRIMARY KEY (`product_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of products
-- ----------------------------
INSERT INTO `products` VALUES (1, 'Product A');
INSERT INTO `products` VALUES (2, 'Product B');
INSERT INTO `products` VALUES (3, 'Product C');-- ----------------------------
-- Table structure for sales_records
-- ----------------------------
DROP TABLE IF EXISTS `sales_records`;
CREATE TABLE `sales_records`  (`sale_id` int NOT NULL,`product_id` int NULL DEFAULT NULL,`sale_date` date NULL DEFAULT NULL,`customer_region` text CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL,`sales_amount` double NULL DEFAULT NULL,PRIMARY KEY (`sale_id`) USING BTREE,INDEX `product_id`(`product_id`) USING BTREE,CONSTRAINT `sales_records_ibfk_1` FOREIGN KEY (`product_id`) REFERENCES `products` (`product_id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_bin ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of sales_records
-- ----------------------------
INSERT INTO `sales_records` VALUES (1, 1, '2024-01-15', 'North', 100);
INSERT INTO `sales_records` VALUES (2, 1, '2024-02-20', 'South', 150);
INSERT INTO `sales_records` VALUES (3, 2, '2024-03-25', 'East', 200);
INSERT INTO `sales_records` VALUES (4, 2, '2024-04-10', 'West', 120);
INSERT INTO `sales_records` VALUES (5, 3, '2024-05-05', 'North', 90);
INSERT INTO `sales_records` VALUES (6, 3, '2024-06-18', 'South', 180);SET FOREIGN_KEY_CHECKS = 1;

Python:

import logging
import requests
import re
import time# 更新后的导入路径
from langchain_community.agent_toolkits.sql.base import create_sql_agent
from langchain_community.agent_toolkits.sql.toolkit import SQLDatabaseToolkit
from langchain_community.utilities import SQLDatabasefrom langchain.llms import BaseLLM
from langchain.callbacks.manager import CallbackManagerForLLMRun
from langchain.schema import LLMResult, Generation# 配置日志输出(DEBUG 级别)
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')def clean_sql(raw_text: str) -> str:"""清洗返回的 SQL 文本,去除代码块标记(例如 ```sql 开头和 ```结尾)。"""# 去除开头的代码块标记(例如 ```sql 或 ```)cleaned = re.sub(r"^```(?:sql)?\s*", "", raw_text, flags=re.IGNORECASE)# 去除结尾的代码块标记cleaned = re.sub(r"\s*```$", "", cleaned, flags=re.IGNORECASE)return cleaned.strip()class SiliconeFlowDeepSeek(BaseLLM):api_url: strapi_key: strdef _call(self, prompt: str, run_manager: CallbackManagerForLLMRun | None = None) -> str:logging.debug("调用硅基流动 DeepSeek API,输入提示:%s", prompt)headers = {"Authorization": f"Bearer {self.api_key}","Content-Type": "application/json"}# 构造请求 payload,按正确格式传递参数data = {"model": "deepseek-ai/DeepSeek-V3","messages": [{"role": "user", "content": prompt}],"stream": False,"max_tokens": 512,"stop": ["null"],"temperature": 0.7,"top_p": 0.7,"top_k": 50,"frequency_penalty": 0.5,"n": 1,"response_format": {"type": "text"},"tools": [{"type": "function","function": {"description": "<string>","name": "<string>","parameters": {},"strict": False}}]}try:response = requests.post(self.api_url, headers=headers, json=data)if response.status_code == 200:result = response.json()logging.debug("DeepSeek API 返回原始结果:%s", result)# 提取返回的文本内容return result["choices"][0]["message"]["content"]else:logging.error("DeepSeek API 请求失败,状态码:%s,响应内容:%s",response.status_code, response.text)return "请求失败"except Exception as e:logging.exception("调用 DeepSeek API 时发生异常:")return "请求失败"def _generate(self, prompts, stop=None, run_manager: CallbackManagerForLLMRun | None = None) -> LLMResult:all_generations = []for prompt in prompts:text = self._call(prompt, run_manager)all_generations.append([Generation(text=text)])return LLMResult(generations=all_generations)@propertydef _llm_type(self) -> str:return "silicone_flow_deepseek"if __name__ == '__main__':# 1. 初始化自定义大模型api_url = "https://api.siliconflow.cn/v1/chat/completions"api_key = "使用你的秘钥"  # 使用你的秘钥logging.debug("初始化硅基流动 DeepSeek 模型实例。")llm = SiliconeFlowDeepSeek(api_url=api_url, api_key=api_key)# 2. 连接 MySQL 数据库db_uri = "mysql+mysqlconnector://账号:密码@localhost:3306/test"#账号密码logging.debug("尝试连接 MySQL 数据库,URI:%s", db_uri)try:db = SQLDatabase.from_uri(db_uri)logging.debug("数据库连接成功,且已自动完成表结构自检。")except Exception as e:logging.exception("连接数据库失败:")raise e# 3. 初始化 SQL 工具包logging.debug("初始化 SQLDatabaseToolkit,整合数据库与大模型。")toolkit = SQLDatabaseToolkit(db=db, llm=llm)# 4. 创建 SQL Agent 执行器logging.debug("创建 SQL Agent 执行器,使用 zero-shot-react-description 模型。")agent_executor = create_sql_agent(llm=llm,toolkit=toolkit,verbose=True,agent_type="zero-shot-react-description")# 5. 生成并校验 SQL 语句(最多重试 3 次)nl_query = "统计每个产品在过去一年的总销售金额和按客户地区统计的销售金额分布"logging.debug("自然语言查询:%s", nl_query)# 附加数据库表结构信息schema_info = ("Table: products (product_id int primary key, product_name text)\n""Table: sales_records (sale_id int primary key, product_id int, sale_date date, customer_region text, sales_amount double)")max_attempts = 3attempts = 0valid_sql = Noneraw_sql_text = ""# 用于正则提取 SQL 语句,匹配以 SELECT 或 WITH 开头的部分(不区分大小写)sql_pattern = re.compile(r"(?i)^(SELECT\s+.*?;?)\s*$", re.DOTALL)while attempts < max_attempts:attempts += 1logging.debug("第 %d 次生成 SQL 语句", attempts)sql_prompt = (f"请仅生成针对下面查询的 MySQL SQL 语句,不要输出其他内容。\n"f"查询:{nl_query}\n"f"数据库表结构:\n{schema_info}")logging.debug("生成 SQL 语句提示:%s", sql_prompt)try:sql_llm_result = llm.invoke(sql_prompt)if isinstance(sql_llm_result, str):raw_sql_text = sql_llm_result.strip()else:raw_sql_text = sql_llm_result.generations[0][0].text.strip()logging.debug("模型原始返回的 SQL 内容:%s", raw_sql_text)except Exception as e:logging.exception("生成 SQL 语句时发生异常:")raise e# 清洗返回的 SQL 文本,去除代码块标记raw_sql_text = clean_sql(raw_sql_text)logging.debug("清洗后的 SQL 内容:%s", raw_sql_text)# 尝试用正则表达式提取合理的 SQL 语句match = sql_pattern.search(raw_sql_text)if match:sql_query = match.group(1).strip()logging.debug("正则表达式提取后的 SQL 语句:%s", sql_query)else:sql_query = raw_sql_textlogging.debug("未匹配到合理 SQL,直接使用清洗后的返回:%s", sql_query)# 校验 SQL 语句checker_prompt = (f"请检查下面的 SQL 语句是否正确:\n{sql_query}\n""只返回“正确”或者具体的错误信息。")logging.debug("SQL 查询校验提示:%s", checker_prompt)try:checker_llm_result = llm.invoke(checker_prompt)if isinstance(checker_llm_result, str):checker_output = checker_llm_result.strip()else:checker_output = checker_llm_result.generations[0][0].text.strip()logging.debug("模型原始返回的校验信息:%s", checker_output)except Exception as e:logging.exception("校验 SQL 语句时发生异常:")raise eif checker_output == "正确":valid_sql = sql_querylogging.debug("SQL 查询校验通过。")breakelse:logging.error("SQL 查询校验失败:%s", checker_output)time.sleep(1)if valid_sql is None:logging.error("经过多次重试后,未能生成有效 SQL。原始返回为:%s", raw_sql_text)raise Exception("经过多次重试后,仍未生成有效的 SQL 语句。")# 6. 执行 SQL 查询try:logging.debug("执行 SQL 查询:%s", valid_sql)query_result = db.run(valid_sql)logging.debug("SQL 查询执行结果:%s", query_result)except Exception as e:logging.exception("执行 SQL 查询时发生异常:")raise e# 7. 利用大模型生成年度营销报告report_prompt = f"根据以下销售数据生成一份详细的年度营销报告:\n{query_result}"logging.debug("生成报表提示:%s", report_prompt)try:report_llm_result = llm.invoke(report_prompt)if isinstance(report_llm_result, str):report_content = report_llm_result.strip()else:report_content = report_llm_result.generations[0][0].text.strip()logging.debug("生成的年度营销报告内容:%s", report_content)except Exception as e:logging.exception("生成报表时发生异常:")raise e# 8. 输出生成的 SQL 语句、原始模型返回和年度营销报告print("==== 生成的 SQL 查询 ====")print(valid_sql)print("\n==== 模型返回的原始 SQL 内容 ====")print(raw_sql_text)print("\n==== 年度营销报告 ====")print(report_content)logging.debug("整个流程执行完毕。")

此外也可以多加提示词等等,阅读精选文章,会更有启发!

推荐博客:

主页:小胡说技书
精选文章:小胡说技书博客分类(部分目录):服务治理、数据治理与安全治理对比表格

四、输出

有调试信息,这里太多了,去掉了。

==== 生成的 SQL 查询 ==== SELECT
p.product_id,
p.product_name,
SUM(sr.sales_amount) AS total_sales_amount,
sr.customer_region,
SUM(sr.sales_amount) OVER (PARTITION BY sr.customer_region) AS region_sales_amount FROM
products p JOIN
sales_records sr ON p.product_id = sr.product_id WHERE
sr.sale_date >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR) GROUP BY
p.product_id, sr.customer_region;

==== 模型返回的原始 SQL 内容 ==== SELECT
p.product_id,
p.product_name,
SUM(sr.sales_amount) AS total_sales_amount,
sr.customer_region,
SUM(sr.sales_amount) OVER (PARTITION BY sr.customer_region) AS region_sales_amount FROM
products p JOIN
sales_records sr ON p.product_id = sr.product_id WHERE
sr.sale_date >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR) GROUP BY
p.product_id, sr.customer_region;

==== 年度营销报告 ==== 为了生成一份详细的年度营销报告,我们需要对销售数据进行分析,包括总销售额、各产品销售额、各地区销售额等。以下是基于提供的数据生成的年度营销报告:


年度营销报告

1. 总销售额 根据提供的数据,年度总销售额为:740.0。
2. 各产品销售额
  • Product A: 150.0
  • Product B: 320.0 (200.0 + 120.0)
  • Product C: 270.0 (90.0 + 180.0)
3. 各地区销售额
  • East: 200.0
  • North: 90.0
  • South: 330.0 (150.0 + 180.0)
  • West: 120.0
4. 各产品在各地区的销售情况
  • Product A:
  • South: 150.0
  • Product B:
  • East: 200.0
  • West: 120.0
  • Product C:
  • North: 90.0
  • South: 180.0

分析与建议

  1. 产品表现:
  • Product B的销售额最高,达到320.0,显示出较强的市场竞争力。
  • Product C和Product A的销售额分别为270.0和150.0,需要进一步分析其市场定位和推广策略。
  1. 地区表现:
  • South地区的销售额最高,达到330.0,表明该地区市场需求旺盛。
  • East和West地区的销售额分别为200.0和120.0,需要加强市场推广活动。
  • North地区的销售额最低,仅为90.0,建议进行市场调研以了解原因并制定相应的营销策略。

3.建议:

  • 产品推广:
    • Product B的成功经验可以复制到其他产品上。
    • Product A和Product C需要加强品牌宣传和市场推广。
  • 地区策略:
    • South地区继续保持并优化销售策略。
    • East和West地区增加市场推广力度。
    • North地区进行深入的市场调研,制定针对性的营销计划。

这份报告基于提供的数据进行了详细的分析和建议,希望能为您的年度营销策略提供有价值的参考。

五、 总结

本文以一个智能体 Demo 为例,展示了如何利用硅基流动 DeepSeek API 生成 SQL 查询、执行数据库统计,并进一步自动生成详细的营销报告。硅基流动提供的免费模型服务为企业和开发者降低了 AI 应用门槛,使得智能体系统在各行业落地成为可能。

希望这篇博客文章能为您在智能体及大模型应用方面提供新的思路,并激发更多开发者探索 AI 技术的无限可能!

封面图:在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/21087.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

半遮挡检测算法 Detecting Binocular Half-Occlusions

【1. 背景】&#xff1a; 本文分析【Detecting Binocular Half-Occlusions&#xff1a;Empirical Comparisons of Five Approaches】Geoffrey Egnal和Richard P. Wildes于2002年发表在IEEE Transactions on Pattern Analysis and Machine Intelligence上&#xff0c;这是1篇中…

检测网络安全漏洞 工具

实验一的名称为信息收集和漏洞扫描 实验环境&#xff1a;VMware下的kali linux2021和Windows7 32&#xff0c;网络设置均为NAT&#xff0c;这样子两台机器就在一个网络下。攻击的机器为kali,被攻击的机器为Windows 7。 理论知识记录&#xff1a; 1.信息收集的步骤 2.ping命令…

PostgreSQL的学习心得和知识总结(一百六十九)|深入理解PostgreSQL数据库之 Group By 键值消除 的使用和实现

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

Nacos学习(一)——基本介绍、安装与负载均衡策略

目录 一、Nacos基本介绍 二、安装与使用 (一)Nacos安装 1.上传到linux上解压 2.按需修改配置文件 3.单机启动 4.查看Nacos启动日志 5.浏览器访问Nacos服务 6.关闭Nacos服务 (二)Nacos使用 1.新建一个项目 2.最外部依赖如下 3.provider-service包的依赖 4.配置文件…

第3章 3.2 配置系统 .NET Core配置系统

3.2.1 配置系统的基本使用 .NET Core中的配置系统支持非常丰富的配置源&#xff0c;包括文件&#xff08;JSON、XML、INI等&#xff09;、注册表、环境变量、命令行、Azure Key Vault等&#xff0c;配置系统还支持自定义配置源。 用配置系统开发包Microsoft.Extensions.Confi…

JVM 类加载器深度解析(含实战案例)

上期文章内容&#xff1a;JVM类加载过程详解&#xff1a;从字节码到内存的蜕变之旅 目录 一、类加载器的本质是什么&#xff1f; 二、类加载机制全景 1.1 三阶段生命周期 1.2 关键数据结构 三、类加载器体系架构 2.1 四层标准类加载器 2.2 类加载器树形结构 四、双亲委派…

仿 Sora 之形,借物理模拟之技绘视频之彩

来自麻省理工学院、斯坦福大学、哥伦比亚大学以及康奈尔大学的研究人员携手开源了一款创新的3D交互视频模型——PhysDreamer&#xff08;以下简称“PD”&#xff09;。PD与OpenAI旗下的Sora相似&#xff0c;能够借助物理模拟技术来生成视频&#xff0c;这意味着PD所生成的视频蕴…

业务架构、数据架构、应用架构和技术架构

TOGAF(The Open Group Architecture Framework)是一个广泛应用的企业架构框架&#xff0c;旨在帮助组织高效地进行架构设计和管理。 TOGAF 的核心就是由我们熟知的四大架构领域组成:业务架构、数据架构、应用架构和技术架构。 企业数字化架构设计中的最常见要素是4A 架构。 4…

【开源免费】基于SpringBoot+Vue.JS善筹网站(JAVA毕业设计)

本文项目编号 T 205 &#xff0c;文末自助获取源码 \color{red}{T205&#xff0c;文末自助获取源码} T205&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

vue+elementplus创建初始化安装

项目创建初始化 D:\Tool\mysql\education_vue 这个路径下cmd 或打开vscode&#xff0c;把项目丢进code中打开 安装element plus Container 布局容器 | Element Plus npm install element-plus --save 把项目初始文件Homeview AboutView删了&#xff0c;Router index.js中删一…

Word接入DeepSeek(API的作用)

1.打开”Word”&#xff0c;点击“文件”。 2.点击“选项”。 3.点击“信任中心”——“信任中心设置”。 4. 勾选”启用所有宏“&#xff0c;点击”确定“。 5.点击“自定义功能区”&#xff0c;勾选上“开发工具”&#xff0c;点击“确定”。 6.返回“文件——开发工具“下的…

Macos机器hosts文件便捷修改工具——SwitchHosts

文章目录 SwitchHosts软件下载地址操作添加方案切换方案管理方案快捷键 检测 SwitchHosts SwitchHosts 是一款 Mac 平台上的免费软件&#xff0c;它可以方便地管理和切换 hosts 文件&#xff0c;支持多种 hosts 文件格式。 软件下载地址 SwitchHosts 操作 添加方案 添加 …

Python的那些事第二十三篇:Express(Node.js)与 Python:一场跨语言的浪漫邂逅

摘要 在当今的编程世界里,Node.js 和 Python 像是两个性格迥异的超级英雄,一个以速度和灵活性著称,另一个则以强大和优雅闻名。本文将探讨如何通过 Express 框架将 Node.js 和 Python 结合起来,打造出一个高效、有趣的 Web 应用。我们将通过一系列幽默风趣的实例和表格,展…

汽车免拆诊断案例 | 2010 款路虎揽胜车空调偶尔出风异常

故障现象  一辆2010款路虎揽胜车&#xff0c;搭载5.0 L发动机&#xff0c;累计行驶里程约为16万km。车主反映&#xff0c;接通空调开关后&#xff0c;有时出风忽大忽小&#xff0c;有时不出风&#xff0c;有时要等2 min左右才出风&#xff1b;有时两三天出现一次&#xff0c;…

Django项目之订单管理part1

一.前言 我们前面把django的常用知识点给讲完了&#xff0c;现在我们开始项目部分&#xff0c;项目是一个订单管理系统&#xff0c;我们同时也会在项目之中也会讲一些前面没有用到的知识点。 项目大概流程如下&#xff1a; 核心的功能模块&#xff1a; 认证模块&#xff0c;用…

低代码与 Vue.js:技术选型与架构设计

在当下数字化转型的浪潮中&#xff0c;企业对应用开发的效率和质量有着极高的追求。低代码开发平台的兴起&#xff0c;为企业提供了一条快速构建应用的捷径&#xff0c;而 Vue.js 作为热门的前端框架&#xff0c;与低代码开发平台的结合备受关注。如何做好两者的技术选型与架构…

LlamaFactory可视化模型微调-Deepseek模型微调+CUDA Toolkit+cuDNN安装

LlamaFactory https://llamafactory.readthedocs.io/zh-cn/latest/ 安装 必须保证版本匹配&#xff0c;否则到训练时&#xff0c;找不到gpu cuda。 否则需要重装。下面图片仅供参考。因为cuda12.8装了没法用&#xff0c;重新搞12.6 cudacudnnpytorch12.69.612.6最新&#xf…

【GPT】从GPT1到GPT3

every blog every motto: Although the world is full of suffering&#xff0c; it is full also of the overcoming of it 0. 前言 从GPT1 到GPT3 1. GPT1 论文&#xff1a; https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/lan…

Jredis和SpringDataRedis学习笔记

jredis基础操作 jredis连接池 其中有个静态方法getJedis能够将练级池中的连接拿取出来并返回 通过setMaxWaitMitllis设置一个响应时间&#xff0c;如果连接池里面没有连接&#xff0c;那么请求连接方在等待超过响应时间时就会报错 springDataRedis 通过这样一个代码将redisTe…

【HarmonyOS Next】鸿蒙监听手机按键

【HarmonyOS Next】鸿蒙监听手机按键 一、前言 应用开发中我们会遇到监听用户实体按键&#xff0c;或者扩展按键的需求。亦或者是在某些场景下&#xff0c;禁止用户按下某些按键的业务需求。 这两种需求&#xff0c;鸿蒙都提供了对应的监听事件进行处理。 onKeyEvent 默认的…