向量化和向量数据库
向量存储官网地址: 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

改POM
引入spring-ai-starter-vector-store-redis依赖
xml
<?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
yaml
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
启动类
typescript
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);
}
}
业务类
typescript
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);
}
}