# 电商问数:前言 --- 欢迎来到「电商问数」项目,正式开启「AI 智能体实战速成指南」的实战项目学习~~ ✨ 如果你正在找一个真正适合入门进阶的 AI 项目,而不是只调用一次大模型接口、写几个 Prompt、演示一下 SQL 生成结果,那么这套「电商问数」教程非常适合你。 它把 `MySQL`、`LangGraph`、`Qdrant`、`Elasticsearch`、`Embedding`、`FastAPI`、`SSE` 和前端联调放进同一条业务链路里,用一个自然语言问数场景,把智能体项目开发中最关键的知识点串起来: - 用 `MySQL` 模拟教学数仓和元数据库 - 用 `Qdrant` 做字段和指标的语义向量检索 - 用 `Elasticsearch` 做字段真实取值的全文检索 - 用 `LangGraph` 编排多阶段问数智能体工作流 - 用 `FastAPI + SSE` 把后端能力交付给前端页面 ![电商问数前端首页:支持样例问题、自然语言输入和智能数据分析 Agent 交互](./images/0/0-1.png) 一句话概括:**「电商问数」不是一个只会让大模型裸写 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 生成、数据库查询与前端展示](./images/0/0-2.jpg) 从使用者视角看,它就是一个“会查数的智能数据分析助手”: 1. 用户先用自然语言提问 2. 系统理解问题,并抽取适合检索的关键信息 3. 再到元数据知识库中召回相关表、字段、指标和字段取值 4. 把这些信息整理成更适合大模型理解的上下文 5. 再由大模型生成 SQL,并做必要的校验和纠错 6. 最后到数据仓库执行 SQL,并把过程和结果返回给前端 当一次查询真正跑起来时,前端不只是等待最后结果,而是可以看到 LangGraph 工作流的执行过程:抽取关键词、召回字段信息、召回指标信息、召回字段取值、合并召回信息、过滤上下文、生成 SQL、校验 SQL、执行 SQL,最后展示查询结果。 ![电商问数查询结果页:展示 LangGraph 执行流程、SQL 闭环进度和最终 GMV 查询结果](./images/0/0-3.png) 所以,这个项目的重点从来不只是“大模型”,而是下面这整条链路: - 数据仓库怎么设计和模拟 - 元数据知识库怎么构建 - 字段、指标、字段取值怎么做混合检索 - 智能体怎么基于上下文生成更可靠的 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、项目目录结构 ```text 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` 在一条完整业务链路里分别解决什么问题。 ![电商问数智能数据分析助手概念图:自然语言问题经过智能体理解后连接商品、数据表和分析图表](./images/0/0-4.png)