Skip to content

Latest commit

 

History

History
212 lines (148 loc) · 14.8 KB

0-前言.md

File metadata and controls

212 lines (148 loc) · 14.8 KB

电商问数:前言


欢迎来到「电商问数」项目,正式开启「AI 智能体实战速成指南」的实战项目学习~~ ✨

如果你正在找一个真正适合入门进阶的 AI 项目,而不是只调用一次大模型接口、写几个 Prompt、演示一下 SQL 生成结果,那么这套「电商问数」教程非常适合你。

它把 MySQL、LangGraph、Qdrant、Elasticsearch、Embedding、FastAPI、SSE 和前端联调放进同一条业务链路里,用一个自然语言问数场景,把智能体项目开发中最关键的知识点串起来:

  • 用 MySQL 模拟教学数仓和元数据库
  • 用 Qdrant 做字段和指标的语义向量检索
  • 用 Elasticsearch 做字段真实取值的全文检索
  • 用 LangGraph 编排多阶段问数智能体工作流
  • 用 FastAPI + SSE 把后端能力交付给前端页面

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

一句话概括:「电商问数」不是一个只会让大模型裸写 SQL 的 Demo,而是一套围绕“先构建元数据知识库,再检索、推理、生成、校验和执行 SQL”展开的智能问数实战项目。

它可能不是一个完整的企业级生产系统,但非常适合作为入门到进阶阶段的项目实战课程。你可以在这里系统学习一套智能体应用从“数据准备”到“检索增强”,再到“工作流编排”和“接口交付”的完整主链路。

配套源码仓库地址:https://github.com/didilili/shopkeeper-agent


1、为什么说它适合入门进阶

很多 AI 项目教程容易走向两个极端:

  • 要么太轻,只演示一次模型调用,学完之后不知道怎么做真实项目
  • 要么太重,一上来就塞进大量生产级能力,新手很容易迷失在工程复杂度里

「电商问数」选择的是中间更适合学习的一条路:保留真实问数系统最核心、最必要的工程链路,但不一开始追求大而全。

你会看到一个智能问数项目为什么不能只靠大模型直接生成 SQL,而要先解决下面这些问题:

  • 面对多张事实表和维度表,系统怎么知道该查哪些表
  • 用户说“华北”“黄金会员”“苹果品牌”时,系统怎么定位到真实字段和值
  • 字段、指标、字段取值为什么要分开建索引
  • 元数据库、向量索引、全文索引分别负责什么
  • 召回出来的信息为什么不能直接丢给模型,还要合并、过滤和补全
  • SQL 生成后为什么还要校验、纠错,再执行
  • 后端接口为什么要用流式返回,让前端看到执行过程

这也是它非常适合学习 MySQL、LangGraph、Qdrant 等技术的原因:这些技术不是孤立出现的,而是都被放进了一个清楚的业务目标里。

你不是单独学一个数据库、一个向量库、一个框架 API,而是在学习它们如何配合完成一个真实的智能体应用。


2、这套课程的另一个亮点

这套实战项目不只是“最终代码 + 一篇说明文档”。它的每个关键章节,都配有对应的代码分支。

也就是说,你不用一上来面对完整项目的最终形态,而是可以按章节一步一步切换代码:

  • 第 3 章先准备环境和基础服务
  • 第 4 章理解项目结构和配置管理
  • 第 5、6 章接入 Qdrant、Elasticsearch、MySQL、Embedding 和日志
  • 第 7 到 9 章构建元数据知识库和检索能力
  • 第 10 到 14 章逐步搭建 LangGraph 问数智能体
  • 第 15 到 17 章把能力通过 FastAPI、SSE 和前端页面交付出去

每个阶段都有明确的学习目标、代码实现和知识讲解。你可以先看章节理解设计,再切换到对应分支对照代码,也可以先跑代码,再回到文档理解为什么这么写。

这对入门进阶非常友好。因为真正难的不是“看懂最终项目里有哪些文件”,而是知道这些文件是怎么一步步长出来的,为什么要这样拆层,为什么这一章只做这一部分,下一章又在前一章基础上补了什么能力。

如果你想做一个后续能写进简历、面试里也聊得起来的 AI 项目,「电商问数」会比单纯的模型调用 Demo 更有代表性。它不只是展示效果,而是能让你讲清楚:数据层、检索层、智能体层、服务层和前端交付层分别做了什么。


3、这个项目到底在做什么

在真实企业里,业务同学通常不会写 SQL,数据分析同学也不可能随时记住所有表结构、字段含义和指标口径。于是就会出现一个非常典型的需求:

  • 能不能直接用自然语言提问?
  • 系统能不能自动找到相关表、字段和指标?
  • 能不能自动生成 SQL,并返回可以真正拿来分析的结果?

「电商问数」要解决的,就是这个问题。

下面这张图可以先帮助你建立整体印象:用户提出自然语言问题后,系统会经过后端调度、字段和表结构召回、自然语言转 SQL、数据库查询、SSE 流式推送,最后把结果展示给用户。

电商问数 NL2SQL 系统架构:用户提问、后端调度、字段表召回、SQL 生成、数据库查询与前端展示

从使用者视角看,它就是一个“会查数的智能数据分析助手”:

  1. 用户先用自然语言提问
  2. 系统理解问题,并抽取适合检索的关键信息
  3. 再到元数据知识库中召回相关表、字段、指标和字段取值
  4. 把这些信息整理成更适合大模型理解的上下文
  5. 再由大模型生成 SQL,并做必要的校验和纠错
  6. 最后到数据仓库执行 SQL,并把过程和结果返回给前端

当一次查询真正跑起来时,前端不只是等待最后结果,而是可以看到 LangGraph 工作流的执行过程:抽取关键词、召回字段信息、召回指标信息、召回字段取值、合并召回信息、过滤上下文、生成 SQL、校验 SQL、执行 SQL,最后展示查询结果。

电商问数查询结果页:展示 LangGraph 执行流程、SQL 闭环进度和最终 GMV 查询结果

所以,这个项目的重点从来不只是“大模型”,而是下面这整条链路:

  • 数据仓库怎么设计和模拟
  • 元数据知识库怎么构建
  • 字段、指标、字段取值怎么做混合检索
  • 智能体怎么基于上下文生成更可靠的 SQL
  • 后端服务怎么把智能体能力交付给前端
  • 日志和异常怎么帮助排查一条完整请求链路

后面的章节都会围绕这条主线展开:先把数仓里的表、字段、指标和字段取值整理成元数据知识库,再让问数智能体基于这套知识库完成检索、推理、SQL 生成、校验、执行和结果返回。


4、适合学什么,也不刻意覆盖什么

这套项目非常适合学习下面这些内容:

学习方向 在项目里的体现
MySQL 模拟教学数仓、保存元数据库、执行最终 SQL 查询
数仓基础 理解事实表、维度表、指标、字段角色和分析型查询
元数据建模 构建 table_info、column_info、metric_info、column_metric 等结构化元数据
Qdrant 保存字段和指标向量,用于语义召回
Elasticsearch 保存字段真实取值,用于关键词和值域检索
Embedding 将字段、指标、问题等文本转成向量
LangGraph 编排关键词抽取、并行召回、上下文合并、SQL 生成、校验和执行
FastAPI 提供查询接口,组织依赖注入和生命周期管理
SSE 将问数过程、执行结果和异常信息实时返回前端
工程分层 学习配置、客户端、仓储层、服务层、智能体节点和接口层如何协作

同时也要把边界说清楚:

「电商问数」适合入门到进阶阶段学习,不是完整企业级生产系统。

它重点覆盖问数系统最核心的主链路:教学数仓、元数据知识库、混合检索、LangGraph 工作流、SQL 生成校验执行、FastAPI 接口、SSE 返回、前后端联调和日志追踪。

但它不会在第一个项目里展开所有生产级能力,比如:

  • 用户权限和数据权限控制
  • 多租户隔离
  • 复杂 SQL 安全审计
  • 查询缓存和性能治理
  • 完整评测体系
  • 监控告警和链路追踪平台
  • 灰度发布和生产部署治理
  • 更复杂的多轮问数记忆系统

这些能力当然重要,但如果全部放进第一个实战项目里,学习成本会非常高,主线反而容易被淹没。

所以这套项目更适合承担一个清晰角色:先帮你把智能问数项目最关键、最必要、最值得学习的主链路跑通,并且讲透。


5、这套项目的核心技术栈

为了把这条链路真正落成一个可运行的项目,当前这套实战项目主要使用了下面这些技术:

模块 技术栈 作用说明
教学数仓 MySQL 在教学环境中模拟数据仓库,保存事实表和维度表
元数据库 MySQL 保存结构化元数据,如 table_info、column_info、metric_info、column_metric
向量数据库 Qdrant 保存字段和指标的语义向量索引
全文检索 Elasticsearch 保存部分字段真实取值,支持关键词和值域检索
向量化服务 TEI + BAAI/bge-large-zh-v1.5 负责文本向量化
智能体编排 LangGraph 组织问数智能体的多阶段工作流
大模型调用 LangChain 封装模型调用与部分链路能力
后端接口 FastAPI 提供后端服务与接口能力
ORM 与数据访问 SQLAlchemy 管理元数据库和数据仓库相关访问
流式返回 SSE 将查询过程与结果实时返回前端
中文分词 Jieba 支撑部分文本预处理和关键词处理
环境与依赖管理 uv 管理 Python 项目环境和依赖
前端项目 React + Vite + Tailwind CSS 承载问数前端页面与交互展示

后端用 FastAPI + LangGraph 组织问数流程,用 MySQL + Qdrant + Elasticsearch 搭建元数据知识库,再由大模型完成 SQL 生成、校验和纠错,最后通过 SSE 把执行过程和结果返回给前端。


6、项目目录结构

shopkeeper-agent/
├── app/                  # 后端源码主目录
│   ├── agent/            # 问数智能体与 LangGraph 图流程
│   │   └── nodes/        # 关键词抽取、召回、过滤、SQL 生成、校验、执行等节点
│   ├── api/              # 对外 HTTP 接口层,对应 FastAPI 路由、依赖注入和请求参数结构
│   ├── clients/          # 各类基础服务客户端,例如 MySQL、ES、Qdrant、Embedding 服务
│   ├── conf/             # 配置类与配置加载工具,把 YAML 配置转换成代码可直接使用的对象
│   ├── core/             # 通用基础能力,例如日志、生命周期管理、请求上下文等
│   ├── entities/         # 业务实体定义,承接比 ORM 更贴近业务含义的数据结构
│   ├── models/           # ORM 模型,主要对应 MySQL 中的表结构
│   ├── prompt/           # 提示词加载工具,负责读取和组织静态 Prompt 资源
│   ├── repositories/     # 数据访问层,封装 MySQL / Qdrant / ES 的具体读写逻辑
│   ├── scripts/          # 工具脚本,例如构建元数据知识库、初始化或同步数据
│   └── services/         # 业务逻辑层,负责把客户端、仓储层和智能体能力真正串起来
├── conf/                 # 项目级 YAML 配置文件,例如数据库、向量库、ES、LLM、日志等配置
├── docker/               # 本地开发环境相关文件,例如 docker-compose 和自定义镜像资源
│   ├── elasticsearch/    # Elasticsearch 相关文件,例如 Dockerfile、插件或初始化资源
│   ├── embedding/        # Embedding 服务相关文件,例如模型目录或推理服务配置
│   └── mysql/            # MySQL 初始化 SQL、建表脚本或测试数据导入文件
├── frontend/             # React + Vite + Tailwind CSS 前端项目
├── logs/                 # 本地运行时日志输出目录
└── prompts/              # 静态提示词文件,和 app/prompt 中的加载工具配合使用

如果你已经准备好了,就从下一章开始,正式进入「电商问数」的项目学习。

后面的内容会按照 “项目概述与数仓基础 -> 整体架构与智能体流程 -> 环境准备 -> 元数据知识库 -> 问数链路实现 -> API 接口与前后端联调” 这条主线,逐步把整套项目拆开讲清楚。

学完之后,你收获的不只是“我跑通了一个 AI Demo”,而是能真正讲清楚:一个智能问数系统为什么要这样设计,代码为什么要这样拆,MySQL、Qdrant、Elasticsearch、LangGraph 和 FastAPI 在一条完整业务链路里分别解决什么问题。

电商问数智能数据分析助手概念图:自然语言问题经过智能体理解后连接商品、数据表和分析图表