记录学习RAG的核心逻辑
版本情况(已验证可兼容)
- Spring Boot 3.5.9
- Spring AI 1.1.2
- Milvus 2.6.7
流程
代码切片 -- Embedding -- TopK + Rerank检索 -- 构建Prompt -- Chat Model回答问题
1. 代码切片
- 使用
JavaParser,对Java代码进行AST解析,获取类名和方法名,对于每一个函数进行切分,放入Chunk,并加入相关元数据 - 对于每一个Chunk做一个Document适配,加入Chunk的一些基本信息和元数据,准备将Document存入向量数据库。
2. Embedding
将上一步获取的Document,Embedding到milvus,这一步是Spring AI配置好就可以做。
- 配置向量数据库的一些东西,如数据库名,Collection name等
- 配置所选用的Embedding Model
3. TopK + Rerank检索
- 粗排: 先从Milvus中选取一些文档(这步用Spring AI的SearchRequest即可)
- Rerank: 构建Prompt,问LLM用户的问题和每一个文档的相关性,并给出评分,最终排序。
4. 构建Prompt
使用前一步给出的文档,加上一些“你是一个专业的Java高级工程师,请分析···,思考步骤···,回答规范···”
5. 调用Chat Model
使用前一步的Prompt,在Spring AI的 application.yml配置好Chat Model的API key,调用相关的ChatModel.create()等获取回答。
遇到的问题
Q: 在直接使用Embedding model Embedding 到向量数据库中,再用向量数据库中搜索出来的东西相似度不高。
A: 第一,通过思考是否是提问的问题有关,我将同一问题翻译成成英文,相似度提高了很多,但是最相关的逻辑相似度还是低;第二,考虑换一个Embedding模型,下载了ollama的manutic/nomic-embed-code:latest,大小有7个GB,三千多维,Claude说不是embedding的model,我原来的是768维,通用文本的Embedding模型,肯定不如专业代码的Embedding model,种种原因,最终没有换;第三,使用Rerank重新排列,我为最小的重构代码的成本,选用了LLM在分析一次的Rerank策略,这样做不会增加学习成本,没有增加模型,符合学习RAG流程的目的,最多就是增加回答问题的时间和多调用一次的token,这次的Rerank效果较好,每一个符合用户问题的文档都是最高的评分。
收获
学习了RAG的整体流程,可能在每一个环节的优化策略没有进行到最好,还有就是只针对了Java语言做的AST切分,没有针对多编程语言的切分。