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开源产品)等选择,没有本质的差别。
