JackWang666666/my-rag

AI 工程

一套前端加两个功能等价后端的 RAG 知识库系统,让人在共享数据上对比 Python/LangChain 与 Java/Spring AI。

158
6
Java
创建于 10 天前

这个项目是一个检索增强生成(RAG)知识库系统,由同一个 Next.js 前端和两个功能等价的后端组成:Python/FastAPI + LangChain 端与 Java/Spring Boot + Spring AI 端。两端共用同一个 SQLite 元数据文件、同一套 Milvus 向量集合、同一个 Neo4j 图数据库、同一个上传目录和同一个 JWT 密钥,因此可以在设置页切换后端,对同一个知识库问同一个问题,直接比较两种技术栈的实现。字段命名、路由取值和 SSE 事件格式等跨端约定写在契约文档里,改动任一端前应先阅读 跨端契约。

能做什么

用户可以建知识库,上传 PDF、Word、Markdown、文本、表格或源码,按目录导入整个项目(自动遵守 .gitignore),预览分块并全文检索。对话支持多会话、历史留存、流式回答、引用溯源、置信度,以及带评论的点赞点踩。文档还可以抽取实体与关系写入 Neo4j,用于可视化浏览和按实体检索邻居。

检索机制

两端实现同一条流水线。一次 LLM 调用同时完成路由判断和查询改写,产出的路由为 rag、graph、hybrid 或 direct 之一,外加若干改写子查询;作者说明这取代了早期三次串行调用,成本和首字延迟都降到原来的三分之一。每个子查询各自向量检索,结果按 id 去重合并,再按 RERANKER_PROVIDER 重排:交叉编码器(仅 Python)、LLM 打分,或直接沿用向量顺序;低于 RERANK_THRESHOLD 的片段会被丢弃。路由为 graph 或 hybrid 时,从 Neo4j 取相关实体及邻居拼入上下文。最后通过 SSE 流式输出答案、引用片段与置信度。

运行条件与各路径限制

基础设施用 Docker Compose 启动(etcd、MinIO、Milvus、Neo4j、Attu),应用可以全容器运行,也可以本地运行。本地运行需要 Python 3.11+ 或 JDK 17,README 明确说明 Java 8 和 11 都编不过。两端必须使用相同的 JWT_SECRET:留空时各自生成随机密钥,一端登录得到的令牌另一端不认,切换后端就会被踢回登录页 快速开始。部署、反向代理和生产环境注意事项另见部署文档 部署说明。

两端功能等价但不完全相同。Java 端通过 Tika 还能解析 .pptx、.odt、.rtf、.epub,前端只开放两端交集格式,保证同一文件在两端结果一致。基于 sentence-transformers 的本地重排和本地嵌入只有 Python 端支持,Java 端会告警并回退;火山引擎客户端也只在 Python 端存在。OPENAI_API_BASE 在两端约定不同,因此环境文件将其与 SPRING_OPENAI_API_BASE 分开配置。

两端的单元测试都不需要 Milvus、Neo4j 或真实 LLM;有几组成对测试被刻意保留,要求同一输入在两端得到相同的路由、表结构或鉴权结果。仓库提供的元数据中未声明许可证,若打算复用代码需要注意这一点。

本文由 AI 根据项目 README 生成,更新于 2026年10月28日,以项目官方文档为准。