一个面向企业知识资产场景的初步 RAG 框架,当前版本已经具备文档接入、混合检索、Rerank、流式回答、会话记忆、Prompt 外置和 MCP 工具扩展能力。
项目重点不在“大而全”,而在先把一条可持续演进的企业化骨架搭起来。
- 面向内部知识库问答、制度库问答、FAQ、文档助手等场景
- 采用
Spring Boot + Spring AI作为应用框架 - 默认使用
PGVector + Elasticsearch组成“向量检索 + 关键词检索”的混合检索链路 - 默认模型供应商为
SiliconFlow兼容 OpenAI 接口 - 通过独立
MCP Server挂载工具能力,便于后续接入企业内部服务
- 文档接入
- 支持
DOC/DOCX/PDF/MD/MARKDOWN - 使用
Apache Tika提取正文 - 使用
TokenTextSplitter进行 Chunk 切分
- 支持
- 检索增强
- 查询改写
- PGVector 相似度检索
- Elasticsearch BM25 检索
- RRF 融合
- 外部 Rerank API 重排
- 生成回答
SseEmitter流式输出- 会话级
sessionId - 基于
MessageWindowChatMemory的窗口记忆 - 新会话自动生成标题
- 自动生成追问建议
- 工具扩展
- 通过
spring-ai-starter-mcp-client连接独立 MCP 服务 - 当前示例工具:天气查询、汇率查询
- 通过
- 内置前端
- 主应用启动后直接访问控制台
- 无需额外前端工程
主应用模块,负责:
- HTTP API
- RAG 编排
- 文档入库
- 混合检索
- 流式回答
- Prompt 管理
- 内置控制台
工具服务模块,负责:
- 对外暴露 MCP Endpoint
- 提供工具能力示例
- 作为后续接入企业系统的扩展入口
flowchart LR
U["User / Console"] --> API["/api/v1/chat/stream"]
API --> RW["Query Rewrite"]
RW --> VR["PGVector Retrieval"]
RW --> KR["Elasticsearch BM25"]
VR --> HF["RRF Fusion"]
KR --> HF
HF --> RR["Rerank API"]
RR --> LLM["LLM Generation"]
LLM --> SSE["SSE Stream"]
SSE --> U
DOC["Document Upload"] --> ING["/api/v1/knowledge/documents"]
ING --> TIKA["Apache Tika"]
TIKA --> SPLIT["Token Splitter"]
SPLIT --> VDB["PGVector"]
SPLIT --> ES["Elasticsearch"]
LLM --> MCP["MCP Client"]
MCP --> MCPServer["knowledge-rag-mcp-server:/mcp"]
主应用采用了初步的企业化分层:
interfacesrest- Controller 与 DTO
application- 业务编排服务
- 如问答、文档接入、建议生成、Rerank
infrastructure- 检索、重排、ES 访问、Query Rewrite、Tool Callback 封装
config- Spring Bean 装配与平台配置
目录概览:
knowledge-rag-platform
├── knowledge-rag-app
│ ├── src/main/java/com/nageoffer/ai/knowledgerag
│ │ ├── KnowledgeRagApplication.java
│ │ ├── application/service
│ │ ├── config
│ │ ├── infrastructure/rag
│ │ └── interfaces/rest
│ └── src/main/resources
│ ├── application.yaml
│ ├── prompts
│ └── static/index.html
└── knowledge-rag-mcp-server
└── src/main/java/com/nageoffer/ai/knowledgerag/mcp
- Java
17 - Spring Boot
4.0.1 - Spring AI
2.0.0-M2 - PostgreSQL + PGVector
- Elasticsearch
- Apache Tika
2.9.2 - SiliconFlow OpenAI 兼容接口
默认模型配置来自 knowledge-rag-app/src/main/resources/application.yaml:
- Chat Model:
deepseek-ai/DeepSeek-V3.2 - Embedding Model:
Qwen/Qwen3-Embedding-8B - Rerank Model:
Qwen/Qwen3-Reranker-8B
- JDK 17+
- PostgreSQL,并安装
pgvector - Elasticsearch
- 可用的
SiliconFlow API Key
Linux / macOS:
export SILICONFLOW_API_KEY=your-real-key
export PGVECTOR_URL=jdbc:postgresql://localhost:5432/knowledge_rag
export PGVECTOR_USERNAME=postgres
export PGVECTOR_PASSWORD=postgres
export ELASTICSEARCH_URL=http://localhost:9200Windows PowerShell:
$env:SILICONFLOW_API_KEY="your-real-key"
$env:PGVECTOR_URL="jdbc:postgresql://localhost:5432/knowledge_rag"
$env:PGVECTOR_USERNAME="postgres"
$env:PGVECTOR_PASSWORD="postgres"
$env:ELASTICSEARCH_URL="http://localhost:9200"Linux / macOS:
./mvnw -DskipTests compileWindows:
.\mvnw.cmd -DskipTests compile建议先启动工具服务:
./mvnw -pl knowledge-rag-mcp-server spring-boot:run默认端口:
8081
./mvnw -pl knowledge-rag-app spring-boot:run默认端口:
8080
http://localhost:8080/
主配置文件:
knowledge-rag-app/src/main/resources/application.yaml
MCP 服务配置文件:
knowledge-rag-mcp-server/src/main/resources/application.yaml
核心配置前缀:
knowledge.rag.rewrite-modelknowledge.rag.answer-modelknowledge.rag.rerank-modelknowledge.rag.rerank-endpointknowledge.rag.retrieve-top-kknowledge.rag.rerank-top-nknowledge.rag.rerank-max-document-charsknowledge.rag.chunk-sizeknowledge.rag.min-chunk-size-charsknowledge.rag.min-chunk-length-to-embedknowledge.rag.max-num-chunksknowledge.rag.memory-max-messagesknowledge.rag.keyword-top-kknowledge.rag.rrf-kknowledge.rag.keyword-analyzerknowledge.rag.elasticsearch-urlknowledge.rag.keyword-index-name
与文件上传相关的配置:
spring.servlet.multipart.max-file-sizespring.servlet.multipart.max-request-size
推荐路径:
POST /api/v1/knowledge/documents
兼容旧路径:
POST /api/rag/knowledge/upload
请求类型:
multipart/form-data
参数:
file:必填kb:可选,默认值为default
限制:
- 默认最大文件大小
20MB
示例:
curl -X POST "http://localhost:8080/api/v1/knowledge/documents" \
-F "file=@./docs/employee-handbook.md" \
-F "kb=hr"返回示例:
{
"fileName": "employee-handbook.md",
"kb": "hr",
"chunkCount": 12
}推荐路径:
POST /api/v1/chat/stream
兼容旧路径:
POST /api/rag/chat/stream
请求类型:
application/json
示例:
curl -N -X POST "http://localhost:8080/api/v1/chat/stream" \
-H "Content-Type: application/json" \
-d "{\"question\":\"年假最多可以累计多少天?\",\"kb\":\"hr\"}"请求体:
{
"question": "年假最多可以累计多少天?",
"kb": "hr",
"sessionId": null
}SSE 事件:
meta- 返回
sessionId
- 返回
title- 新会话标题
token- 模型流式输出 token
sources- 命中文档来源与分片数量
suggestions- 推荐追问,或 fallback 文本
done- 结束标记
error- 错误信息
Prompt 已全部外置,便于独立调优:
prompts/rewrite-system.stprompts/rewrite-user.stprompts/answer-system.stprompts/answer-user.stprompts/title-system.stprompts/title-user.stprompts/suggestions-system.stprompts/suggestions-user.st
对应位置:
knowledge-rag-app/src/main/resources/prompts
当前 MCP 服务内置两个示例工具:
queryWeatherForecast- 返回模拟天气数据
queryExchangeRate- 返回内置汇率表换算结果
这两个工具目前都是演示实现,不应直接视为生产级实时数据源。
domain层尚未拆分,当前仍以application + infrastructure为主- 会话记忆目前使用内存实现,尚未持久化
- MCP 工具为示例能力,不是正式企业集成
- 测试目录中保留了若干实验性质 Demo,用于模型、检索、Prompt 验证
- 权限模型、多租户隔离、审计和可观测性尚未落地
- 引入
domain层和明确的领域契约 - 接入 IAM、租户隔离、知识库权限与操作审计
- 增加离线评测、回归测试、Trace 和指标采集
- 增加文档元数据治理、标签、版本与生命周期管理
- 将 MCP 示例工具替换为真实企业系统接口
- 拆分知识库、检索、会话、工具调用等子模块
Apache License 2.0