RAG 文本向量化:文本转向量、向量入库、相似度查询全过程

前言

在 AI 应用开发中,文本向量化(Embedding) 和向量相似度搜索是实现 RAG(检索增强生成)、语义搜索等功能的核心技术。Spring AI Alibaba 提供了与阿里云 DashScope 模型的无缝集成,配合 Redis Stack 的向量存储能力,可以快速搭建一个从文本转向量再到相似度检索的完整流程。

本文将带你从零搭建一个 Spring Boot 项目,使用 spring-ai-alibaba-starter-dashscope 完成文本嵌入,并通过 spring-ai-starter-vector-store-redis 实现向量存储与相似度查询。

一、项目依赖

在 pom.xml 中引入以下依赖:

复制代码
<!-- Spring Boot Web -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- Spring AI Alibaba DashScope 核心 Starter -->
<dependency>
    <groupId>com.alibaba.cloud.ai</groupId>
    <artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
</dependency>

<!-- Redis 向量数据库依赖 -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-vector-store-redis</artifactId>
</dependency>

**注意:**确保 Spring AI 版本与 Alibaba 版本兼容,建议通过 Spring Initializr 或官方 BOM 统一管理版本。

二、application.properties 配置文件

复制代码
server.port=8011
# 设置响应的字符编码
server.servlet.encoding.charset=utf-8
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true

spring.application.name=SAA-11Embed2vector

# ====SpringAIAlibaba DashScope配置=============
# 填入你的阿里云通义api-key,也可以使用环境变量占位符
spring.ai.dashscope.api-key=${aliQwen-api}
# chat大模型
spring.ai.dashscope.chat.options.model=qwen-plus
# 向量化模型 text‑embedding‑v3
spring.ai.dashscope.embedding.options.model=text-embedding-v3


# =======Redis Stack向量库配置==========
spring.data.redis.host=localhost
spring.data.redis.port=6379
spring.data.redis.username=default
spring.data.redis.password=
# 程序启动自动创建向量索引schema
spring.ai.vectorstore.redis.initialize-schema=true
# 自定义向量索引名称
spring.ai.vectorstore.redis.index-name=custom-index
# redis key前缀
spring.ai.vectorstore.redis.prefix=custom-prefix

⚠️注意:必须安装 Redis Stack,普通原版 Redis 没有向量检索模块,启动直接报错。本地可以 docker 快速拉起 Redis‑Stack。

三、核心代码实现

3.1 注入 EmbeddingModel 与 VectorStore

Spring AI 提供了统一的抽象层,我们只需要注入两个核心组件:

  • EmbeddingModel:负责将文本转换为向量。

  • VectorStore:负责向量的持久化与相似度搜索。

    @Resource
    private EmbeddingModel embeddingModel;

    @Resource
    private VectorStore vectorStore;

3.2 文本向量化接口

编写 /text2embed 接口,调用 EmbeddingModel 将输入文本转化为向量。

复制代码
@GetMapping("/text2embed")
public EmbeddingResponse text2Embed(String msg) {
    // 方式一:使用默认配置
    // EmbeddingResponse response = embeddingModel.call(
    //         new EmbeddingRequest(List.of(msg), null));

    // 方式二:明确指定模型
    EmbeddingResponse response = embeddingModel.call(
            new EmbeddingRequest(List.of(msg),
                    DashScopeEmbeddingOptions.builder()
                            .withModel("text-embedding-v3")
                            .build()));

    System.out.println(Arrays.toString(response.getResult().getOutput()));
    return response;
}

请求示例:

GET http://localhost:8011/text2embed?msg=射雕英雄传

返回的 EmbeddingResponse 中包含浮点数数组,即文本的向量表示。

3.3 将文本写入 Redis 向量库

通过 VectorStore.add(List<Document>) 方法,可以直接将文本转为向量并存入 Redis。

复制代码
@GetMapping("/embed2vector/add")
public void add() {
    List<Document> documents = List.of(
            new Document("i study LLM"),
            new Document("i love java")
    );
    vectorStore.add(documents);
}

内部流程:Spring AI 自动调用 EmbeddingModel 将 Document 的内容转为向量,再存入 Redis 的向量索引中。

3.4 相似度检索

根据查询文本,在向量库中检索语义最相近的 TopK 条记录。

复制代码
@GetMapping("/embed2vector/get")
public List<Document> getAll(@RequestParam("msg") String msg) {
    SearchRequest searchRequest = SearchRequest.builder()
            .query(msg)
            .topK(2)
            .build();

    List<Document> results = vectorStore.similaritySearch(searchRequest);
    System.out.println(results);
    return results;
}

请求示例:

GET http://localhost:8011/embed2vector/get?msg=programming

预期返回内容语义最接近的文档,例如 "i love java"。

四、运行与测试

  1. 启动 Redis Stack (确保已安装 RediSearch 模块):

    复制代码
    docker run -d --name redis-stack -p 6379:6379 redis/redis-stack:latest
  2. 设置阿里云 DashScope API Key:在启动参数或环境变量中配置 aliQwen-api。

  3. 启动 Spring Boot 应用

  4. 测试步骤
    调用 /text2embed 查看文本转向量结果。
    调用 /embed2vector/add 写入测试数据。
    调用 /embed2vector/get?msg=java 验证检索结果。

五、常见问题

Q1:启动报错 Redis command not allowed 或 unknown command

A1:请确认 Redis 为 Redis Stack 版本,或已加载 RediSearch 模块。

Q2:向量维度不匹配

A2:text-embedding-v3 模型输出的向量维度默认为 1024,请确保索引维度与之匹配(由 initialize-schema 自动创建索引时处理)。

Q3:存入向量库时是否需要手动调用 Embedding?

A3:不需要,VectorStore.add(Document) 内部会自动调用 EmbeddingModel 完成转向量操作。

六、总结

本文通过一个简单实例演示了 Spring AI Alibaba + Redis Stack 的完整工作流:

  • 使用 DashScope text-embedding-v3 模型进行文本向量化;
  • 借助 spring-ai-starter-vector-store-redis 实现向量的自动存储与相似度搜索;
  • 全部代码基于 Spring Boot 标准开发模式,依赖注入、配置简洁。

这为构建 RAG 智能问答、语义搜索等上层应用打下了坚实的基础。你可以在此基础上引入大模型对话、Prompt 模板等功能,快速搭建属于自己的 AI 应用。

相关推荐
Java成神之路-2 天前
Spring AI Alibaba 实现多轮对话记忆:ChatMemory 与 Redis 持久化实战
java·springaialibaba
Java成神之路-3 天前
Spring AI 统一结构化返回:ChatModel / ChatClient 两种实现方式
java·springaialibaba
MinggeQingchun8 天前
AI - Java之Spring AI Alibaba
ai·springai·springaialibaba
中间件XL1 个月前
ai-agent框架spring ai/alibaba 原理源码分析(五)graph III 图执行
graph·ai agent·spring ai·springaialibaba
中间件XL3 个月前
ai-agent框架spring ai/alibaba原理源码分析(三) 外部调用III-skills
ai agent·calling·spring ai·springaialibaba·skills
dddaidai1235 个月前
SpringAI Alibaba(一)
ai·springai·springaialibaba
大傻^5 个月前
Spring AI Alibaba 快速入门:基于通义千问的AI应用开发环境搭建
java·人工智能·后端·spring·springai·springaialibaba
大傻^5 个月前
Spring AI Alibaba Function Calling:外部工具集成与业务函数注册
java·人工智能·后端·spring·springai·springaialibaba
大傻^5 个月前
Spring AI Alibaba 项目初始化:Maven依赖与YAML配置全解析
人工智能·spring·maven·springai·springaialibaba·评估框架