Skip to content

EVEDensity/Data-Commerce-Agent

Repository files navigation

「电商问数」智能数据分析 Agent

Data Commerce Agent

AI Python LangGraph FastAPI React

它不是只调用一次大模型接口,也不是写几个 Prompt 演示 SQL 生成结果。这个项目围绕电商数仓问数场景,先构建元数据知识库,再做字段、指标、字段取值的混合检索,随后用 LangGraph 编排多阶段问数流程,完成 SQL 生成、校验、修正、执行和前端流式展示。你学到的不是某一个框架 API,而是一条 AI 应用从数据准备、检索增强、智能体编排、接口交付到前端联调的完整项目主线。

电商问数前端首页:样例问题、自然语言输入和智能数据分析 Agent 界面

📖 项目介绍

在真实问数场景里,业务同学通常不会写 SQL,数据分析同学也很难随时记住所有表结构、字段含义、指标口径和字段取值。单纯把自然语言问题直接交给大模型,很容易出现表选错、字段选错、指标理解错和 SQL 幻觉等问题。

电商问数 要解决的就是这个问题:

  • 用户用自然语言提问
  • 系统自动召回相关字段、指标和字段取值
  • 大模型基于上下文进行分步推理
  • 生成 SQL 并查询数据仓库
  • 以流式方式返回分析结果

✨ 项目亮点

  • 检索 + 推理 + 生成,而不是模型直出 SQL
    • 先围绕问题召回相关字段、指标和值域,再组织上下文生成 SQL,整体链路更稳、更可控。
  • 面向企业问数场景的混合检索
    • Qdrant 负责字段和指标的语义召回。
    • Elasticsearch 负责字段取值的全文检索。
    • MySQL 负责保存完整、权威的结构化元数据。
  • 支持字段、指标、取值三类信息协同召回
    • 比单纯做表级或字段级检索更贴近真实企业分析流程。
  • 从检索到执行的完整可运行链路
    • 不停留在 Prompt 设计,而是会真实生成 SQL、执行查询,并以流式方式返回结果。
  • 工程化后端结构清晰
    • 基于 FastAPI + LangGraph + Repository + Client Manager 组织配置、客户端、仓储层、服务层与智能体流程,便于维护和扩展。
  • 不仅有实战代码,还有完整配套教程文档
    • 项目配有一套系统化、持续更新、完全免费的教程讲义,适合按章节从数仓基础、元数据知识库到问数智能体流程逐步学习。
  • 兼顾学习价值与可扩展性
    • 既可以按教程章节逐步理解,也可以在此基础上继续扩展权限控制、SQL 审核、结果可视化等能力。

这套课程十分适合这些场景:

  • 想系统学习 LangGraph,但不想只停留在几个玩具节点。
  • 想把 MySQLQdrantElasticsearch 和大模型放到同一个业务场景里理解。
  • 想做一个比简单模型调用更接近实际开发的 AI Agent 项目。
  • 想把项目写进简历,并且能说清楚数据层、检索层、智能体层、服务层和前端层分别做了什么。

🏗️ 系统架构

电商问数系统架构图:前端通过 FastAPI 和 SSE 连接后端,LangGraph 问数智能体基于 Jieba、MySQL、Qdrant、Elasticsearch 和 LLM 完成召回、SQL 生成校验执行与结果返回

项目围绕两条主线展开:

主线 做什么 涉及模块
元数据知识库构建 抽取教学数仓中的表、字段、指标和字段取值,写入结构化库、向量库和全文索引 MySQL / Qdrant / Elasticsearch / TEI
自然语言问数 基于用户问题完成召回、上下文整理、SQL 生成校验执行,并把过程流式返回前端 LangGraph / FastAPI / SSE / React

电商问数查询结果页:LangGraph 执行流程、SQL 校验执行和查询结果表格

🛠️ 技术栈

模块 技术 作用
教学数仓 MySQL 模拟事实表、维度表和分析型查询环境
元数据库 MySQL / SQLAlchemy 保存表、字段、指标、字段指标关系等结构化元数据
向量检索 Qdrant 保存字段和指标向量,支持语义召回
全文检索 Elasticsearch 保存字段真实取值,支持关键词和值域检索
Embedding TEI / BAAI/bge-large-zh-v1.5 将字段、指标、问题等文本转成向量
智能体编排 LangGraph 组织多阶段问数工作流
模型接入 LangChain 封装 LLM 与 Embedding 调用
后端接口 FastAPI 提供问数 API、依赖注入和生命周期管理
流式协议 SSE 实时返回节点进度、查询结果和错误消息
前端 React / Vite / Tailwind CSS 提供聊天式问数界面和流程展示
日志追踪 ContextVar / loguru 为并发请求注入 request_id,便于排查链路
依赖管理 uv / pnpm 管理 Python 后端和前端依赖

📁 项目结构

shopkeeper-agent/
├── app/
│   ├── agent/            # LangGraph 图、状态、上下文和各类节点
│   ├── api/              # FastAPI 路由、依赖注入、生命周期和请求结构
│   ├── clients/          # MySQL、Qdrant、Elasticsearch、Embedding 客户端管理
│   ├── conf/             # 配置 dataclass 与配置加载工具
│   ├── core/             # 日志、request_id 上下文等通用能力
│   ├── entities/         # 更贴近业务语义的数据对象
│   ├── models/           # SQLAlchemy ORM 模型
│   ├── prompt/           # Prompt 加载工具
│   ├── repositories/     # MySQL、Qdrant、Elasticsearch 数据访问层
│   ├── scripts/          # 元数据知识库构建脚本
│   └── services/         # 元数据构建服务和问数查询服务
├── conf/                 # app_config.yaml、meta_config.yaml
├── docker/               # Docker Compose、MySQL 初始化 SQL、ES 插件、Embedding 挂载目录
├── frontend/             # React + Vite + Tailwind CSS 前端项目
├── prompts/              # SQL 生成、修正、过滤等 Prompt 模板
├── main.py               # FastAPI 应用入口
├── start.sh              # 一键启动脚本
└── pyproject.toml        # Python 项目依赖与工具配置

🚀 快速开始

1. 环境要求

  • Python >= 3.14(推荐用 uv python install 3.14
  • uv 包管理器
  • Docker 与 Docker Compose
  • Node.js 与 pnpm(前端)

2. 安装后端依赖

uv sync

3. 配置环境变量

cp .env.example .env

编辑 .env,必填项:

变量 说明
LLM_API_KEY 大模型 API Key(支持 DeepSeek / 硅基流动等 OpenAI 兼容服务)
MYSQL_ROOT_PASSWORD MySQL root 密码
MYSQL_PASSWORD 业务账号 didilili 密码(需与 DB_META_PASSWORD 一致)
DW_RO_PASSWORD 数仓只读账号密码(需与 DB_DW_PASSWORD 一致)
REDIS_PASSWORD Redis 密码

4. 配置大模型

编辑 conf/app_config.yaml 中的 llm 段,支持任意 OpenAI 兼容接口:

# DeepSeek 示例
llm:
  model_name: deepseek-chat          # 或 deepseek-reasoner
  api_key: ${oc.env:LLM_API_KEY}
  base_url: https://api.deepseek.com/v1

# 硅基流动 / GLM 示例
# llm:
#   model_name: Pro/zai-org/GLM-5.1
#   api_key: ${oc.env:LLM_API_KEY}
#   base_url: https://api.siliconflow.cn/v1

5. 下载 Embedding 模型

uv run hf download BAAI/bge-large-zh-v1.5 --local-dir docker/embedding/bge-large-zh-v1.5

6. 启动 Docker 基础服务

docker compose -f docker/docker-compose.yaml --env-file .env up -d

默认端口:

服务 端口
MySQL 3306
Elasticsearch 9200
Kibana 5601
Qdrant 6333
Embedding 8081
Jaeger 16686

docker/mysql/meta.sqldocker/mysql/dw.sql 会在 MySQL 容器首次启动时自动初始化元数据库和教学数仓。

7. 构建元数据知识库

uv run python -m app.scripts.build_meta_knowledge -c conf/meta_config.yaml

这一步会把表字段元数据写入 MySQL,把字段和指标向量写入 Qdrant,并把字段真实取值写入 Elasticsearch。

8. 启动后端

uv run fastapi dev main.py

后端接口:

POST http://127.0.0.1:9000/api/query

请求示例:

{
    "query": "统计华北地区的销售总额"
}

SSE 消息类型:

类型 含义
progress 节点执行进度
result 最终查询结果
error 全局异常消息

9. 启动前端

cd frontend
pnpm install
pnpm dev

前端默认通过 Vite 代理把 /api 转发到 http://127.0.0.1:9000。如需修改:

cd frontend
cp .env.example .env
VITE_DEV_PROXY_TARGET=http://127.0.0.1:9000

一键启动

首次配置完成后,后续可以直接用 start.sh 一键拉起所有服务:

bash start.sh

本项目基于尚硅谷「大模型智能体掌柜问数」项目,并在此基础上整理完善。

🚧 能力边界

这个项目主要关注智能问数的学习流程,不刻意覆盖生产治理能力,例如:

  • 用户登录、角色权限和数据权限控制
  • 多租户隔离
  • SQL 安全审计和执行白名单
  • 查询缓存、限流和性能治理
  • 系统化评测集与自动化回归评测
  • 监控告警、链路追踪平台和灰度发布
  • 更复杂的多轮问数记忆、追问改写和会话管理

这些能力适合在基础流程跑通之后继续扩展。Data Commerce Agent 更适合承担一个清晰角色:先把智能问数最关键、最必要、最值得学习的工程链路讲清楚、跑起来,并为后续扩展企业级能力打基础。

About

E-commerce data Q&A, smart data analysis agent

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages