1. 项目概述
作为一名长期奋战在Java开发一线的工程师,最近在探索如何将大语言模型(LLM)能力整合到Spring Boot应用中时,遇到了一个典型问题:现成的通用大模型往往缺乏特定领域的专业知识,也无法访问企业内部数据。这促使我开始研究RAG(Retrieval-Augmented Generation)技术方案。
RAG的核心思想是为大模型配备一个外挂知识库,在回答问题时动态检索相关知识片段作为上下文。这种架构既能保持大模型的通用推理能力,又能突破其知识局限。下面我将分享在Spring Boot项目中实现RAG的完整过程,包括技术选型、实现细节和踩坑经验。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. RAG技术原理详解
2.1 知识库与上下文限制
大模型如GPT系列虽然表现惊艳,但存在两个硬伤:
- 知识更新滞后(训练数据通常截止于某个时间点)
- 无法访问非公开的专业领域数据
直接解决方案似乎是将知识库内容拼接到用户问题前作为提示词。但这里有个关键限制:主流大模型的上下文窗口有限(如GPT-4 Turbo约128k tokens),而企业知识库往往包含数百万文档。
实际案例:我们尝试将200页产品手册作为上下文,即使经过压缩也远超模型限制,导致API调用失败。
2.2 向量相似度检索
解决方案是采用"检索-生成"两阶段流程:
- 使用向量模型将知识库文档和用户查询转换为向量
- 通过向量相似度找出最相关的文档片段
- 仅将top K相关片段作为上下文提供给大模型
这种方案将上下文长度从GB级压缩到KB级,完美适配模型限制。关键在于如何准确衡量文本相似度。
2.2.1 向量空间模型
文本被向量模型(如text-embedding-3-large)映射为高维空间中的点(通常768或1024维)。语义相似的文本在向量空间中距离更近。我们通过计算向量距离来衡量相似度。
常用距离度量:
- 欧式距离:直接计算向量间的直线距离
math复制d = √(Σ(x_i - y_i)²) - 余弦相似度:计算向量夹角的余弦值
math复制similarity = (A·B) / (||A|| * ||B||)
实测对比:
- 余弦相似度更关注文本语义而非长度
- 欧式距离对文本长度变化更敏感
- 专业领域建议使用余弦相似度
2.3 向量模型实战
我们选用阿里云的通义千问Embedding模型,主要考虑:
- 支持中文场景优化
- 提供1024维高精度向量
- 与SpringAI生态良好集成
配置示例:
yaml复制spring:
ai:
openai:
embedding:
options:
model: text-embedding-v4
dimensions: 1024
测试代码:
java复制@SpringBootTest
class EmbeddingTest {
@Autowired
private OpenAiEmbeddingModel embeddingModel;
@Test
void testSimilarity() {
float[] vec1 = embeddingModel
