Spring AI Alibaba零基础速成(6) ---- 向量化

1. 原理介绍

什么是向量:一个有大小有方向的量。

向量化也叫 Embedding,是将文本、图片等非结构化数据,转换成固定维度浮点数字数组的过程。自然语言无法被计算机直接运算比对,转为向量数值后,就能通过数学算法计算文本间相似度。

核心原理:

  • 把每一段文字,变成一组固定长度的数字比如 1024 个数字组成一个数组。
  • 语义越接近的文字 → 数字排列越像
  • 语义差别越大 → 数字差别越大

数组里每一个小数,对应文本某一类语义特征,维度越多,刻画特征越精细。以简化 4 维向量举例,预设维度对应含义:

  • 第 1 位:场景建筑属性
  • 第 2 位:环境破败程度
  • 第 3 位:人物行动动作
  • 第 4 位:氛围情绪感受

示例文本对应向量赋值:

  • 主角走进了一间破旧的小屋

    0.85, 0.92, 0.78, 0.61

  • 主角进入了一间老旧的房子

    0.83, 0.90, 0.80, 0.59

  • 今日户外阳光明媚

    0.10, 0.05, 0.22, 0.95

数值区间一般在 - 1, 1 之间,数值越趋近,代表对应特征高度吻合;数值偏差越大,特征差异越大。真实业务中是 1024 维向量,全方位覆盖人物、剧情、场景、情绪等海量特征。

行业通用余弦相似度计算,把向量看作空间坐标点,通过两点夹角判定相似程度。几何逻辑每一组向量,等同于多维空间里的一个点位。语义相近的文本,对应空间点位距离近、夹角小;语义无关文本,点位距离远、夹角大。

2. 向量数据库使用

这里我们使用redis stack

导入依赖:

XML 复制代码
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-vector-store-redis</artifactId>
        </dependency>

配置

XML 复制代码
spring:
  application:
    name: SAA-08ChatMemory
  ai:
    dashscope:
      base-url: https://dashscope.aliyuncs.com/
      api-key: ${AliQWenAPIKey}
      chat:
        options:
          model: qwen-plus
      #用于向量化的大模型
      embedding:
        options:
          model: text-embedding-v3
    #Redis stack
    vectorstore:
      redis:
        #启用初始化
        initialize-schema: true
        #索引名
        index-name: custom-index
        #数据前缀
        prefix: custom-prefix
  #reids
  data:
    redis:
      host: 127.0.0.1
      port: 6379
      database: 0

不同类型的大模型擅长领域不同,索引这里我们单独配置了一个用于文本向量处理的大模型

2.1 文本向量化

要存入向量数据库首先需要吧文本向量化:

java 复制代码
@RestController
public class EmbedToVectorController {
    @Autowired
    private EmbeddingModel embeddingModel;
    @GetMapping("/textToEmbed")
    public EmbeddingResponse textToEmbed(String text) {
        EmbeddingResponse embeddingResponse = embeddingModel
                .call(
                        new EmbeddingRequest(
                                List.of(text),
                                DashScopeEmbeddingOptions
                                        .builder()
                                        .build()
                        )
                );
        System.out.println(Arrays.toString(embeddingResponse.getResult().getOutput()));
        return embeddingResponse;
    }
}

这里直接注入embeddingModel,调用其call方法,传入一个EmbeddingRequest对象(包含需要向量化的文本,DashScopeEmbeddingOptions为额外可设置参数)

2.2 存储

java 复制代码
@RestController
public class EmbedToVectorController {

    @Autowired
    private VectorStore vectorStore;

    @GetMapping("/add")
    public void add() {
        List<Document> documents = List.of(
                new Document("火影忍者"),
                new Document("海贼王")
        );
        vectorStore.add(documents);
    }
}

这里VectorStore内部会自己先对数据向量化再存入:

调用之后可以看到redis中已经出现了key,类型是ReJSON

ReJSON常用命令:

  • JSON.SET - 设置 JSON 值
  • JSON.GET - 获取 JSON 值
  • JSON.DEL - 删除 JSON 值
  • JSON.MGET - 批量获取多个键的 JSON 值
  • JSON.TYPE - 获取 JSON 值的类型
  • JSON.NUMINCRBY - 对 JSON 中的数字进行增量操作
  • JSON.STRAPPEND - 追加字符串到 JSON 字符串
  • JSON.STRLEN - 获取 JSON 字符串的长度

2.3 查询

java 复制代码
@RestController
public class EmbedToVectorController {

    @Autowired
    private VectorStore vectorStore;

    @GetMapping("/get")
    public List<Document> get(String msg) {
        SearchRequest searchRequest = SearchRequest
                .builder()
                .query(msg)//查询词
                .topK(2)//取前2个
                .build();
        List<Document> list = vectorStore.similaritySearch(searchRequest);
        System.out.println(list);
        return list;
    }
}

先使用SearchRequest创建一个查询对象,然后传入VectorStore的similaritySearch进行查询

score代表相关性,数字越大,相关性越高:

相关推荐
阿里云大数据AI技术12 分钟前
构建高转化海外电商搜索:阿里云OpenSearch行业算法版的全链路智能优化策略实战
人工智能·搜索引擎
Awu122725 分钟前
⚡从零开发 Agent CLI(五)实现一个可治理、可扩展的工具系统
前端·人工智能·claude
字节跳动视频云技术团队25 分钟前
让 Agent 成为音视频工作台:AI MediaKit CLI + Skill 发布
人工智能·音视频开发
魏祖潇29 分钟前
framework 整合实战——DDD/TDD/SDD 三件套在 framework 仓的真实落地
人工智能·后端
Token炼金师1 小时前
去噪扩散:从随机噪声到高保真图像的数学之路
人工智能·aigc
这个DBA有点耶1 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
阿里云大数据AI技术2 小时前
阿里云 EMR AI 助手正式发布:从问答工具到全栈智能运维助手
运维·人工智能
镜舟科技2 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Larcher2 小时前
从零搭建 MCP 服务——让 AI 拥有无限扩展能力
人工智能·程序员
zzzzzz3102 小时前
你的 AI 写的 React 烂透了?这个 8000+ Star 的开源工具能揪出 90% 的「Agent 屎山」
人工智能