SpringAI用嵌入模型操作向量数据库!

嵌入模型(Embedding Model)和向量数据库(Vector Database/Vector Store)是一对亲密无间的合作伙伴,也是 AI 技术栈中紧密关联的两大核心组件,两者的协同作用构成了现代语义搜索、推荐系统和 RAG(Retrieval Augmented Generation,检索增强生成)等应用的技术基础。

PS:准确来说 Vector Database 和 Vector Store 不完全相同,前者主要用于“向量”数据的存储,而 Vector Store 是用于存储和检索向量数据的组件。

在 Spring AI 中,嵌入模型 API 和 Spring AI Model API 和嵌入模型的关系如下:

alt 系统整体交互流程如下:

alt

接下来我们使用以下技术:

  • Spring AI
  • 阿里云文本嵌入模型 text-embedding-v3
  • SimpleVectorStore(内存级别存储和检索向量数据组件)

实现嵌入模型操作内存级别向量数据库的案例。

1.添加项目依赖

我们使用阿里云百炼平台的嵌入模型 text-embedding-v3 是兼容 OpenAI 的 SDK 的,因此,我们只需要添加 OpenAI 依赖即可:

<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>

2.配置嵌入模型

阿里云百炼平台支持的向量模型:

alt

项目配置文件配置向量模型:

spring:
  ai:
    openai:
      api-key: ${aliyun-ak}
      embedding:
        options:
          model: text-embedding-v3
      chat:
        options:
          model: deepseek-r1

3.配置向量模型

将 EmbeddingModel 和 VectorStore 进行关联,如下代码所示:

@Bean
public VectorStore vectorStore(EmbeddingModel embeddingModel) {
return SimpleVectorStore.builder(embeddingModel).build();
}

4.向量数据库添加数据

VectorStore 提供的常用方法如下:

  • add(List documents) :添加文档。
  • delete(List idList) :按 ID 删除文档。
  • delete(Filter.Expression filterExpression) :按过滤表达式删除文档。
  • similaritySearch(String query) 和 similaritySearch(SearchRequest request) :相似性搜索。

向数据库添加向量数据的方法如下:

// 构建测试数据
List<Document> documents =
List.of(new Document("I like Spring Boot"),
        new Document("I love Java"));
// 添加到向量数据库
vectorStore.add(documents);

当然,向量数据的数据源可以是文件、图片、音频等资源,这里为了简单演示整体执行流程,使用了更简单直观的文本作为数据源。

5.查询数据

@RestController
@RequestMapping("/vector")
public class VectorController {

    @Resource
    private VectorStore vectorStore;

    @RequestMapping("/find")
    public List find(@RequestParam String query) {
        // 构建搜索请求,设置查询文本和返回的文档数量
        SearchRequest request = SearchRequest.builder()
        .query(query)
        .topK(3)
        .build();
        List<Document> result = vectorStore.similaritySearch(request);
        System.out.println(result);
        return result;
    }
}

执行结果如下:

alt

从上述结果可以看出,和“java”相似度最高的向量为“I love Java”,相似度评分为 0.77,如果我们 SearchRequest 对象中的 topK 设置为 1 的话,只会查询“I love Java”这条数据,如下图所示:

alt

小结

嵌入模型和向量数据库是实现 RAG(检索增强生成)的技术基础,当然除了以上案例外,你可以使用 Redis 或 ES 来存储向量数据,并尝试加入 DeepSeek 实现 RAG 功能,这种形式更符合企业真实的技术应用。我是磊哥,如果觉得文章有帮助欢迎点赞、转发支持一下,我们下期再见。

#聊聊我眼中的AI##java#
Java面试精讲 文章被收录于专栏

Java常见面试题、场景题、企业真题精讲。

全部评论

相关推荐

星纵物联8.8&nbsp;硬件工程师技术面面试官挺好的,问的基本都是项目相关1.自我介绍2.你的研究方向讲一下,为什么想做硬件3.挑一个你最熟悉的项目讲一下4.你在里面做了什么内容5.为什么用这个拓扑,拓扑原理讲一下,这个拓扑有什么优势吗6.器件选型怎么考虑的7.电路板怎么调试的,考虑到负载了吗,怎么联调的8.功率这么大,做了哪些注意措施9.项目创新点是什么10.产品投入生产使用了吗11.板子之间数据怎么传输的,通讯协议是什么12.为什么用这个主控13.有备选方案吗。反问1.培养方案2.工作强度3.产品方向4.多久出结果星纵物联25届校园招聘进行中&nbsp;以下岗位仍有缺口公司简介:厦门星纵物联科技有限公司是专业的数字感知产品提供商,专注于智能物联网设备的研发,生产与销售招聘岗位:行业产品、海外市场、开发、测试、产品经理、技术支持、项目经理、售前工程师、单片机开发、硬件薪酬福利:极富竞争力的薪酬待遇、一年两次的调薪机会、半年奖、年终奖、项目奖金、团队奖金、营销奖金、职级晋升、多元化激励、员工商业公寓、健康保障、工会福利、五险一金、安居计划、快乐活动、健身俱乐部、人才基金、生活补贴、贴心礼金、年度旅游、落户厦门、五折租房、节日关怀、温馨假期等投递链接:https://milesight.zhiye.com/campus/jobs推荐码:ESVMBS(内推简历优先筛选,加速流程推进)大家投递完可以在评论区打上姓名缩写+岗位,我来确认有没有内推成功喽 #春招#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#内推码#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#秋招#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#提前批#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#星纵物联#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务