Sign inSign up

ly753/spring-ai-rag-demo

By ly753

Updated 10 days ago

Spring AI 2 ERP RAG 智能助手,支持 Tool Calling、PgVector 和多模型对话。

Image
Languages & frameworks
Machine learning & AI
Databases & storage
1

1.6K

ly753/spring-ai-rag-demo repository overview

Spring AI RAG Demo

基于 Spring Boot 4 和 Spring AI 2 构建的 ERP RAG 智能助手示例。

项目集成 Spring AI Tool Calling 和 RAG,支持实时 ERP 业务数据查询、产品手册知识检索、流式对话、会话记忆、多租户隔离和 Token 用量统计。

在 Tool Calling 查询到结构化业务数据后,系统可以自动生成相应的业务图表,并与文字回答一起返回前端展示。

ERP RAG 智能助手运行界面

镜像

推荐使用最新版本:

docker pull ly753/spring-ai-rag-demo:latest

技术栈

层级技术
运行环境Java 17
应用框架Spring Boot 4.0.7
AI 框架Spring AI 2.0.0
对话模型DeepSeek / 通义千问 / Google Gemini
向量数据库PostgreSQL 16 + PgVector
ERP 业务数据库MySQL 8
数据访问Spring JDBC + MyBatis-Plus
前端HTML / CSS / JavaScript
图表引擎Apache ECharts
流式传输SSE

一键启动完整环境

完整环境包含以下三个容器:

  • rag-demo:Spring Boot 应用,包含前端页面
  • pgvector:向量数据库
  • mysql-erp:ERP 业务数据、会话记录和用量数据
1. 准备 DeepSeek API Key

访问 DeepSeek API Keys,登录后创建一个 API Key。

请妥善保存 API Key,不要把它提交到 Git 仓库,也不要直接写入 docker-compose.yml

2. 创建 .env

在准备运行项目的目录中新建 .env 文件:

# 替换成刚刚创建的 DeepSeek API Key
DEEPSEEK_API_KEY=sk-your-real-deepseek-api-key

# 自行设置一个强数据库密码,建议使用至少 16 位随机字符
DB_PASSWORD=replace-with-a-strong-database-password

.env 包含敏感信息,请勿上传到 GitHub 或分享给其他人。

3. 创建 docker-compose.yml

在同一目录中新建 docker-compose.yml

name: spring-ai-rag-demo

services:
  app:
    image: ly753/spring-ai-rag-demo:latest
    container_name: rag-demo
    ports:
      - "8080:8080"
    environment:
      SPRING_DATASOURCE_PGVECTOR_URL: jdbc:postgresql://pgvector:5432/rag_demo
      SPRING_DATASOURCE_PGVECTOR_USERNAME: postgres
      SPRING_DATASOURCE_PGVECTOR_PASSWORD: ${DB_PASSWORD:?请在 .env 中设置 DB_PASSWORD}
      SPRING_DATASOURCE_ERP_URL: jdbc:mysql://mysql:3306/erp?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowPublicKeyRetrieval=true
      SPRING_DATASOURCE_ERP_USERNAME: root
      SPRING_DATASOURCE_ERP_PASSWORD: ${DB_PASSWORD:?请在 .env 中设置 DB_PASSWORD}
      DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:?请在 .env 中设置 DEEPSEEK_API_KEY}
    depends_on:
      pgvector:
        condition: service_healthy
      mysql:
        condition: service_healthy
    restart: unless-stopped

  pgvector:
    image: pgvector/pgvector:pg16
    container_name: pgvector
    environment:
      POSTGRES_DB: rag_demo
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: ${DB_PASSWORD:?请在 .env 中设置 DB_PASSWORD}
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres -d rag_demo"]
      interval: 5s
      timeout: 5s
      retries: 20
    restart: unless-stopped

  mysql:
    image: mysql:8.0
    container_name: mysql-erp
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:?请在 .env 中设置 DB_PASSWORD}
      MYSQL_DATABASE: erp
      MYSQL_CHARSET: utf8mb4
    volumes:
      - mysqldata:/var/lib/mysql
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    healthcheck:
      test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p$${MYSQL_ROOT_PASSWORD} --silent"]
      interval: 5s
      timeout: 5s
      retries: 30
    restart: unless-stopped

volumes:
  pgdata:
  mysqldata:
4. 启动

确保 Docker Desktop 已启动,然后在 docker-compose.yml 所在目录执行:

docker compose up -d

首次启动需要下载镜像并初始化数据库,请等待容器健康检查完成:

docker compose ps

启动完成后访问:

http://localhost:8080

常用命令

查看容器状态:

docker compose ps

查看应用日志:

docker compose logs -f app

停止服务并保留数据:

docker compose stop

重新启动:

docker compose start

删除容器但保留数据库数据卷:

docker compose down

docker compose down -v 会同时删除 MySQL 和 PgVector 数据,请谨慎使用。

功能特性

  • Spring AI Tool Calling 查询 ERP 业务数据
  • Tool 查询结果自动生成业务图表
  • LLM 根据业务问题和数据特征选择图表类型与标题
  • 后端自动完成图表字段绑定、数据转换和安全选项生成
  • 单次助手回答最多返回一个图表,同一会话不限制图表总数
  • 图表与 Markdown 文字回答同时展示
  • 图表数据随助手消息持久化,支持历史会话重新展示
  • 图表不满足数据要求时自动降级为文本回答
  • 基于 PgVector 的产品手册 RAG 检索
  • 内置本地 ONNX Embedding 模型,生成向量时无需额外的 Embedding API
  • 支持 DeepSeek Chat 和 DeepSeek Reasoner
  • 支持通义千问与 Google Gemini
  • SSE 流式响应
  • 数据库持久化会话记忆
  • 基于 ent_code 的多租户隔离
  • Token 用量统计和套餐配额管理
  • 应用启动时幂等初始化 MySQL 表结构和演示数据

业务数据图表

当 Spring AI Tool Calling 查询到结构化 ERP 业务数据时,系统会在正常生成文字回答的同时尝试生成图表。

图表生成遵循以下规则:

  1. LLM 只负责选择图表类型和图表标题。
  2. 后端根据 Tool 返回的结构化业务数据自动绑定维度、指标和系列。
  3. 后端负责数据转换、字段校验和安全图表选项生成。
  4. 单次助手回答最多展示一个图表,但同一会话可以生成多个图表。
  5. 只有数据确实无法满足所选图表类型时,才降级为纯文本回答。
  6. 图表通过独立 SSE 事件返回,不影响文字内容的流式输出。
  7. 图表数据会随助手消息持久化,重新打开历史会话时可以恢复展示。
支持的图表类型

当前支持以下 23 种图表:

序号图表类型适用场景
1环形图状态、类别占比
2旭日图多层级分类数据
3条形图分类数据对比
4瀑布图数值增减及累计变化
5子弹图实际值、目标值和范围对比
6面积图连续时间趋势及累计变化
7阶梯图阶段性、离散时间变化
8雷达图多指标能力对比
9散点图两个指标之间的关系
10气泡图三个指标之间的关系
11直方图连续数值的频率分布
12箱线图分组数据分布及异常值
13热力图双维度数据密度和强度
14桑基图节点之间的流向与数量
15矩形树图层级数据及占比
16甘特图生产计划及任务排期
17漏斗图阶段转化和流程分布
18词云图关键词及类别频次
19仪表盘图单项指标及目标进度
20水位图单项指标占比或完成度
21平行坐标图多维指标综合对比
22折线图时间序列变化趋势
23饼图分类数据占比
图表示例
条形图:产品销售数量汇总

条形图示例

瀑布图:委外订单物料数量流转

瀑布图示例

子弹图:采购订购数量与收货数量对比

子弹图示例

面积图:销售金额变化趋势

面积图示例

阶梯图:出入库数量变化

阶梯图示例

甘特图:生产工单计划排期

甘特图示例

测试话术示例

启动项目后,可以在“智能”或“数据查询”模式中输入以下问题:

查询2026年3月1日至3月31日的售后工单,按处理状态统计工单数量,并使用环形图展示各状态占比。
查询2026年3月1日至3月31日的销售订单,按产品汇总销售数量,并使用条形图展示各产品销量。
查询委外订单OO20260301的来料、回货和退料记录,按产品展示数量变化,并使用瀑布图展示。
查询采购订单PO20260302的收货情况,使用子弹图对比温度传感器NTC10K的订购数量和已收数量。
查询2026年3月1日至3月31日的销售订单,按订单日期展示销售金额变化,并使用面积图展示销售金额趋势。
查询2026年3月1日至3月31日的出入库记录,按日期展示出入库数量变化,并使用阶梯图展示。
查询2026年3月1日至3月31日开始的生产工单,使用甘特图展示各产品生产工单的计划开始日期和计划结束日期。

RAG 知识库

系统支持上传 PDF、Word、Excel 和 TXT 文档,并将内容切分后写入 PgVector 向量数据库。

知识问答模式会优先检索已导入的知识库内容,并基于检索结果回答问题。

主要能力包括:

  • 支持 PDF、Word、Excel 和 TXT 文档
  • 单文件上传大小最高为 500MB
  • 单次请求大小最高为 550MB
  • 使用本地 ONNX Embedding 模型生成向量
  • 文档按 Token 进行分块,避免单个文档超过模型输入限制
  • 向量数据分批写入,降低大文件导入时的内存占用
  • 支持知识问答模式和智能模式检索知识库
  • 支持文档相似度搜索及结果展示

数据持久化

Docker Compose 会创建以下数据卷:

  • spring-ai-rag-demo_pgdata
  • spring-ai-rag-demo_mysqldata

停止或重新创建容器不会删除这些数据卷。

源码

GitHub:

https://github.com/ly1836/spring-ai-rag-demo

安全提示

  • 不要把真实 API Key 或数据库密码写入镜像、README 或 docker-compose.yml
  • 不要把 .env 文件提交到 Git 仓库
  • 本示例默认只向宿主机暴露 Web 端口 8080,数据库仅供 Compose 内部网络访问
  • 生产环境请使用独立数据库账号、Secret 管理服务、TLS 和反向代理

Tag summary

Content type

Image

Digest

sha256:aa8c1c0bd

Size

445.6 MB

Last updated

10 days ago

docker pull ly753/spring-ai-rag-demo