向量化和向量数据库redisstack使用

109 阅读3分钟

向量化和向量数据库

向量存储官网地址: java2ai.com/docs/1.0.0.…

向量是什么

向量: 表示具有大小和方向的量

文本向量化 Embedding Model

嵌入(Embedding)的工作原理是将文本、图像和视频转换为称为向量(Vectors)的浮点数数组。这些向 量旨在捕捉文本、图像和视频的含义,嵌入数组的长度称为向量的维度(Dimensionality)。

文本向量化(Text Vectorization)是指将人类可读的文本(如单词、句子、段落或整篇文档)转换为计算机可以处理的数值向量(通常是实数数组)的过程。这是自然语言处理(NLP)和机器学习中的关键预处理步骤,因为算法无法直接理解文字,但可以高效处理数字

为什么需要文本向量化?

  • 机器学习模型只能处理数值型输入。
  • 文本本身是离散符号,需映射到连续或离散的数值空间。
  • 向量化还能保留语义、语法或统计信息,提升模型效果。

向量数据库

向量存储官网地址: java2ai.com/docs/1.0.0.…

阿里巴巴官网: help.aliyun.com/zh/model-st…

向量存储(VectorStore)是一种用于存储和检索高维向量数据的数据库或存储解决方案,它特别适用于处理那些经过嵌入模型转化后的数据。在 VectorStore 中,查询与传统关系数据库不同。它们执行相似性搜索,而不是精确匹配。向量数据库维度越高,查询精准度也越高,查询效果越好。

本次使用Redis8(RedisStack)作为向量数据库存储。

RedisStack当作向量存储

官网地址: docs.spring.io/spring-ai/r…

RedisStack免费云数据库地址: cloud.redis.io/#/databases

RedisStack: 是Redis Labs推出的 增强版Redis,不是Redis替代品,是基于原生Redis基础功能的拓展包,专为构建现代实时应用而生。

功能Redis(标准版)Redis Stack
基础数据结构(String, List, Hash 等)✅ 支持✅ 支持
持久化、复制、集群✅ 支持✅ 支持
全文搜索(类似 Elasticsearch)❌ 不支持✅ 内置 RediSearch 模块
JSON 文档存储与查询❌ 需用 String + 应用层解析✅ 内置 RedisJSON 模块
概率数据结构(布隆过滤器、Top-K 等)✅ 内置 RedisBloom 模块
时序数据处理❌(可用 Sorted Set 模拟)✅ 内置 RedisTimeSeries 模块
向量相似性搜索(用于 AI/语义搜索)✅ 内置 RedisVL / Vector Similarity Search (VSS)
图形数据库能力✅(通过 RediGraph 模块,部分版本包含)
可视化管理工具❌(需第三方工具)✅ 自带 Redis Insight(Web UI,可查数据、监控、调试)

开发步骤

阿里巴巴官网: help.aliyun.com/zh/model-st…

创建module

image.png

改POM

引入spring-ai-starter-vector-store-redis依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.miao</groupId>
        <artifactId>SpringAIAlibaba-test01</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>SAA-08Embedding</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--  模型服务灵积  调用alibaba生态的协议 对标openai协议   -->
        <dependency>
            <groupId>com.alibaba.cloud.ai</groupId>
            <artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
            <version>1.0.0.2</version>
        </dependency>

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

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.38</version>
        </dependency>
    </dependencies>
</project>
改yml
server:
  port: 8082
  servlet:
    encoding:
      enabled: true
      force: true
      charset: UTF-8

spring:
  application:
    name: SAA-07
  ai:
    dashscope:
      api-key: ${qwen-api-key}
      chat:
        options:
          model: qwen3-vl-flash
      emedding:
        options:
          model: text-embedding-v4
    vectorstore:
      redis:
        initialize-schema: true
        index-name: custom-indexhaha
        prefix: custom-index
  data:
    redis:
      host: redis-16002.c1.us-east1-2.gce.cloud.redislabs.com
      port: 16002
      password: password
启动类
package com.miao;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SAA08EmbeddingApplication {
    public static void main(String[] args) {
        SpringApplication.run(SAA08EmbeddingApplication.class, args);
    }
}
业务类
package com.miao.controller;

import com.alibaba.cloud.ai.dashscope.embedding.DashScopeEmbeddingOptions;
import jakarta.annotation.Resource;
import org.springframework.ai.document.Document;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.embedding.EmbeddingOptions;
import org.springframework.ai.embedding.EmbeddingRequest;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

@RestController
public class EmbeddingController {
    public static final String EMBEDDING_MODEL = "text-embedding-v4";
    @Resource
    private EmbeddingModel dashScopeEmbeddingModel;

    @Resource
    private VectorStore vectorStore;

    // 向量化文本
    @GetMapping(value = "/embedding")
    public Object embedding(@RequestParam(name = "text") String text) {
        // 向量化文本
        List<String> inputText = Arrays.asList(text);

        // 设定模型参数
        EmbeddingOptions embeddingOptions = DashScopeEmbeddingOptions.builder()
                .withModel(EMBEDDING_MODEL)
                .build();

        // 构建请求
        EmbeddingRequest embeddingRequest = new EmbeddingRequest(inputText, embeddingOptions);
        return dashScopeEmbeddingModel.call(embeddingRequest).getResult();
    }


    @GetMapping(value = "/addVectorStore")
    public String addVectorStore(@RequestParam(name = "text") String text) {
        vectorStore.add(List.of(new Document(text)));
        return "Text vector stored successfully.";
    }


    @GetMapping(value = "/getVectors")
    public List<Document> getVectors(@RequestParam(name = "text") String text) {
        SearchRequest searchRequest = SearchRequest.builder()
                .query(text)
                .topK(2)
                .build();
        return vectorStore.similaritySearch(searchRequest);
    }


}