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导入依赖dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-vector-store-redis/artifactId /dependency配置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 文本向量化要存入向量数据库首先需要吧文本向量化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 存储RestController public class EmbedToVectorController { Autowired private VectorStore vectorStore; GetMapping(/add) public void add() { ListDocument documents List.of( new Document(火影忍者), new Document(海贼王) ); vectorStore.add(documents); } }这里VectorStore内部会自己先对数据向量化再存入调用之后可以看到redis中已经出现了key类型是ReJSONReJSON常用命令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 查询RestController public class EmbedToVectorController { Autowired private VectorStore vectorStore; GetMapping(/get) public ListDocument get(String msg) { SearchRequest searchRequest SearchRequest .builder() .query(msg)//查询词 .topK(2)//取前2个 .build(); ListDocument list vectorStore.similaritySearch(searchRequest); System.out.println(list); return list; } }先使用SearchRequest创建一个查询对象然后传入VectorStore的similaritySearch进行查询score代表相关性数字越大相关性越高