Spring AI框架中,向量数据库与RAG如何实现高效搜索扩展?

摘要:本文代码: https:github.comJunTeamComai-demotreerelease-4.0 https:github.comJunTeamComai-demo-toolstreerelease-4.
本文代码: https://github.com/JunTeamCom/ai-demo/tree/release-4.0 https://github.com/JunTeamCom/ai-demo-tools/tree/release-4.0/data-loader 本章只讲解RAG整体流程、向量数据库、数据写入; 查询向量数据库、RAG应用在下一讲。 Spring with AI系列,只关注上层AI的应用程序(基于JAVA搭建),不关注底层的LLM原理、搭建等技术。 RAG能通过实时搜索数据库的方式,扩展已经训练固化的大模型的知识能力。 RAG(Retrieval-Augmented Generation)检索增强生成 retrieval /rɪˈtriːvl/ n.检索 augmented /ɔ:g'mentɪd/ adj.增强的 generation /ˌdʒenəˈreɪʃn/ n.生成 通过检索、增强大模型生成的内容。 在前文中,我们通过文本模板,补充了“规则”,进而增强了大模型生成的内容。 然而这只是简单的“文本匹配+配置文件”的方式,面对复杂问题和庞大的知识库,完全不具备现实意义。 RAG整体的流程和组成部分如下: flowchart LR subgraph VectorDB[向量数据库模块] VectorStore[(向量数据库)]:::db end subgraph DocumentLoader[文档加载模块] OriginalDocs[① 原始文档] --> Splitter[文档分割器]:::process Splitter --> DocChunks[② 文档分块] DocChunks --> CalcEmb[③ 计算向量嵌入]:::process CalcEmb -->|存入| VectorStore end subgraph RAGApp[支持RAG的应用] Question[问题] --> App[④ 应用]:::app App -->|搜索相似文档| VectorStore VectorStore -->|返回相似文档| App App --> Prompt[⑤ 组装提示词] Prompt --> LLM[大语言模型] LLM --> Answer[答案] Answer --> App App --> Output[输出答案] end classDef process fill:#a5d6a7,stroke:#388e3c,stroke-width:2px classDef app fill:#ffab91,stroke:#e64a19,stroke-width:2px classDef db fill:#bbdefb,stroke:#1976d2,stroke-width:2px classDef llm fill:#ffcc80,stroke:#f57c00,stroke-width:2px 1 引言 自然语言,是怎么变成向量、并且用于检索的呢? 将句子拆分为最小语义单元(token),再通过词汇表为每个token分配唯一ID;这样自然语言就编码变成了向量。例如:["我", "爱", "北京"] → [3, 54, 65]。再进行编码、降维等处理,自然语言就变成了向量。 如何检索呢?本质上是计算问题与答案直接的相关性,也就是“距离”;而这个距离,是通过向量的“余弦相似度”测算的,计算两个向量夹角的余弦值来衡量它们相似度的一种方法,值越接近1表示越相似,越接近-1表示越不相似。这种算法的优点是: 不受向量长度影响:只关注方向一致性,适合不同长度的文本或特征向量。 计算复杂度低:尤其适合稀疏向量,只需考虑非零分量。 2 安装向量数据库 本文以Qdrant(功能全部署相对简单)为例。当然还有Milvus(阿里云向量数据库基础)、ChromaDB(Python原生支持)、FAISS(Meta开源产品)等选择,没有本质的差别。
阅读全文