在上篇博文中使用Spring Boot整合DeepSeek实现了AI对话,目前如果我们要构建一个个性化的具有私有领域知识的专用AI助手,一般会有两种方式:
- 大模型微调:一种在预训练大模型的基础上,使用特定任务的数据对模型进行进一步训练,以使其更好地适应特定任务的技术
- RAG技术:一种结合了检索和生成两种技术的框架,它通过从外部知识库中检索相关信息,并将其作为生成模型的输入,以生成更准确、更相关的回答
本篇博文着重介绍一些RAG技术相关的内容
概念介绍
RAG技术的基本原理如图:
这里比较关键的两个技术点是Embedding模型与向量数据库
Embedding
Embedding模型可以将文本、图像、音频、视频等数据类型表示为数学空间中的向量。通过计算向量之间的距离或夹角,可以量化数据的相似度,从而作用于分类、检索、推荐等任务
向量数据库
向量数据库是一种专门用于存储和处理向量数据的数据库系统。它以向量作为基本数据类型,支持向量的存储、索引、查询和计算
RAG原理介绍
如上图,RAG经过了以下几个步骤
- 我们事先需要初始化知识库,这里的知识库是使用向量数据库存储,需要将知识文本分割为一句一句话,将这些话通过Embedding模型向量化后写入到向量数据库中。
- 用户提问,同样将提问使用Embedding模型向量化,向量化的数据可以使用向量数据库来进行相似查询
- 查询结果放放入一个提问的提示词模版里,同样放入模版的还有一开始的原始提问
- 将整个提示词模版生成的提问发送给大预言模型处理,这时输出的结果就与我们的知识库相关了
代码演示
我们如果要实现以上的RAG过程,可以使用Spring AI框架提供的能力,其中大部分的过程都被高度封装了。
这里Embedding模型与向量数据库我们全部采用私有化部署的方式,大预言模型我们使用DeppSeek-V3的API
使用到的重点相关依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-milvus-store-spring-boot-starter</artifactId>
</dependency>
前面一个是openai的依赖主要是提供chat以及Embedding模型的调用能力,后面一个是向量数据库相关依赖,这里的向量数据库使用的是milvus,
配置如下:
spring:
application:
name: spring-ai-demos
ai:
openai:
api-key: 0
chat:
base-url: https://api.deepseek.com
api-key: sk-xxxxxxxxxxxx
options:
model: deepseek-chat
embedding:
base-url: http://localhost:11434
options:
model: nomic-embed-text:latest
vectorstore:
milvus:
client:
host: 192.168.3.96
port: 19530
username: root
password: milvus
embeddingDimension: 768
indexType: IVF_FLAT
metricType: COSINE
embedding-field-name: embedding
collection-name: vector_store
database-name: default
initialize-schema: true
主要代码其实只有下面一行:
Flux<String> output = chatClient.prompt()
.user(message) // 用户的提问
.advisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory())) // 历史对话保存
.advisors(new QuestionAnswerAdvisor(vectorStore, SearchRequest.builder().build())) // RAG支持
.stream()
.content();
其中RAG支持相关的这个QuestionAnswerAdvisor
类是关键,其中就封装了拦截用户提问、向量化查询、构建提示词模版等功能
具体Demo代码:
https://github.com/chengpei/spring-ai-demo
下一篇博文准备使用阿里百炼平台提供的多模向量模型multimodal-embedding-v1
实现一个图文搜索功能:Embedding模型与向量数据库-图文搜索
参考资料:
https://docs.spring.io/spring-ai/reference/api/retrieval-augmented-generation.html
https://java2ai.com/docs/dev/practices/rag/?spm=4347728f.320f0805.0.0.2d1b57c3Lu1fsd
评论区