目 录CONTENT

文章目录

Embedding模型与向量数据库-RAG技术

成培培
2025-03-14 / 0 评论 / 0 点赞 / 15 阅读 / 0 字

在上篇博文中使用Spring Boot整合DeepSeek实现了AI对话,目前如果我们要构建一个个性化的具有私有领域知识的专用AI助手,一般会有两种方式:

  1. 大模型微调:一种在预训练大模型的基础上,使用特定任务的数据对模型进行进一步训练,以使其更好地适应特定任务的技术
  2. RAG技术:一种结合了检索和生成两种技术的框架,它通过从外部知识库中检索相关信息,并将其作为生成模型的输入,以生成更准确、更相关的回答

本篇博文着重介绍一些RAG技术相关的内容

概念介绍

RAG技术的基本原理如图:
https://www.chengpei.top/upload/RAG.png
这里比较关键的两个技术点是Embedding模型向量数据库

Embedding

Embedding模型可以将文本、图像、音频、视频等数据类型表示为数学空间中的向量。通过计算向量之间的距离或夹角,可以量化数据的相似度,从而作用于分类、检索、推荐等任务

向量数据库

向量数据库是一种专门用于存储和处理向量数据的数据库系统。它以向量作为基本数据类型,支持向量的存储、索引、查询和计算

RAG原理介绍

如上图,RAG经过了以下几个步骤

  1. 我们事先需要初始化知识库,这里的知识库是使用向量数据库存储,需要将知识文本分割为一句一句话,将这些话通过Embedding模型向量化后写入到向量数据库中。
  2. 用户提问,同样将提问使用Embedding模型向量化,向量化的数据可以使用向量数据库来进行相似查询
  3. 查询结果放放入一个提问的提示词模版里,同样放入模版的还有一开始的原始提问
  4. 将整个提示词模版生成的提问发送给大预言模型处理,这时输出的结果就与我们的知识库相关了

代码演示

我们如果要实现以上的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

0

评论区