Spring AI 学习篇(五)| 嵌入模型与向量表示的本质 Spring AI 学习篇五| 嵌入模型与向量表示的本质一、本章核心学习目标二、前置知识准备三、为什么我们需要嵌入模型嵌入的本质把文本变成机器可理解的数字向量四、向量相似度计算原理1. 余弦相似度最常用2. 点积相似度3. 欧氏距离五、Spring AI EmbeddingClient统一API详解1. 基础依赖配置(1) 对接DeepSeek商业嵌入API(2) 对接本地Ollama嵌入模型2. 基础配置(1) DeepSeek商业API配置(2) Ollama本地模型配置3. 基础调用示例4. 计算两个文本的相似度六、2026年主流嵌入模型对比与选型1. 嵌入模型核心参数说明2. 主流嵌入模型横向对比3. 嵌入模型选型决策树4. 本地Ollama部署BGE-M4七、嵌入模型的常见误区1. ❌ 误区一用聊天模型做嵌入2. ❌ 误区二混用不同嵌入模型的向量3. ❌ 误区三向量维度越高越好4. ❌ 误区四嵌入模型越新越好八、企业级性能优化技巧1. 批量生成嵌入向量2. 缓存嵌入向量3. 限制文本长度4. 选择合适的批量大小九、常见坑与解决方案1. ❌ 向量维度不匹配2. ❌ 中文效果差3. ❌ 批量调用报错4. ❌ 本地模型速度慢十、本章总结与下章预告本章总结下章预告十一、课后练习一、本章核心学习目标学完本章你将能够深刻理解嵌入Embedding的本质和核心原理掌握向量相似度计算的三种常用方法熟练使用Spring AIEmbeddingClient统一API独立完成主流嵌入模型的对比与选型实现本地Ollama嵌入模型与商业API的无缝切换避开嵌入模型使用中的常见误区掌握嵌入模型的企业级性能优化技巧二、前置知识准备已经完成前4篇的学习熟练掌握ChatClient和提示词工程了解大模型的知识截止和幻觉问题熟悉Spring Boot的配置和依赖注入三、为什么我们需要嵌入模型在前面的学习中我们已经能够让大模型回答问题但大模型有三个无法通过提示词工程解决的原生缺陷知识截止限制所有大模型都有训练数据截止日期无法回答训练之后发生的事情幻觉问题大模型会编造不存在的事实和数据私有数据不可用企业内部文档、客户数据等不能上传给大模型训练嵌入模型就是解决这三个问题的核心钥匙它是RAG检索增强生成技术的基础。嵌入的本质把文本变成机器可理解的数字向量通俗地说嵌入就是把人类语言的文本转换成一串固定长度的数字向量。它的神奇之处在于语义相似的文本生成的向量在空间中距离也会很近。举个直观的例子“我喜欢吃苹果” 和 “我爱吃苹果” → 向量距离非常近“我喜欢吃苹果” 和 “我喜欢吃香蕉” → 向量距离较近都是水果“我喜欢吃苹果” 和 “今天天气很好” → 向量距离非常远这样一来机器就可以通过计算向量之间的距离来判断两段文本的语义相似度。预告式提及下一章我们会学习向量数据库它就是专门用来存储这些向量并快速计算相似度的数据库。四、向量相似度计算原理向量相似度计算是检索的核心常用的有三种方法1. 余弦相似度最常用计算两个向量之间的夹角余弦值取值范围是[-1, 1]。值越接近1相似度越高越接近-1相似度越低0表示完全无关。特点不受向量长度的影响只关心向量的方向是文本相似度计算的首选方法。2. 点积相似度计算两个向量对应位置元素的乘积之和。取值范围没有限制值越大相似度越高。特点同时考虑向量的方向和长度适合需要考虑文本重要性的场景。3. 欧氏距离计算两个向量在空间中的直线距离。取值范围是[0, ∞)值越小相似度越高。特点适合比较向量的绝对差异在文本相似度计算中使用较少。企业级最佳实践中文RAG场景首选余弦相似度。五、Spring AI EmbeddingClient统一API详解和ChatClient一样Spring AI为所有嵌入模型提供了统一的EmbeddingClient接口。无论你使用的是商业API还是本地模型代码完全相同。1. 基础依赖配置(1) 对接DeepSeek商业嵌入APIdependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-model-deepseek/artifactId/dependency(2) 对接本地Ollama嵌入模型dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-model-ollama/artifactId/dependency2. 基础配置(1) DeepSeek商业API配置spring:ai:deepseek:api-key:你的DeepSeek API Keyembedding:options:model:deepseek-embedding(2) Ollama本地模型配置spring:ai:ollama:base-url:http://localhost:11434embedding:options:model:bge-m4重要说明只需要添加对应的依赖和配置Spring AI会自动为你创建EmbeddingClient实例不需要编写任何额外代码。3. 基础调用示例importorg.springframework.ai.embedding.EmbeddingClient;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importjava.util.List;RestControllerpublicclassEmbeddingController{privatefinalEmbeddingClientembeddingClient;publicEmbeddingController(EmbeddingClientembeddingClient){this.embeddingClientembeddingClient;}// 生成单个文本的嵌入向量返回 float[]GetMapping(/embed)publicfloat[]embed(RequestParamStringtext){returnembeddingClient.embed(text);}// 批量生成嵌入向量GetMapping(/embed/batch)publicListfloat[]embedBatch(RequestParamListStringtexts){returnembeddingClient.embed(texts);}// 获取嵌入向量的维度GetMapping(/embed/dimension)publicintgetDimension(){returnembeddingClient.dimensions();}}4. 计算两个文本的相似度Spring AI 不提供内置的向量计算工具类需要手动实现余弦相似度GetMapping(/similarity)publicdoublecalculateSimilarity(RequestParamStringtext1,RequestParamStringtext2){float[]vector1embeddingClient.embed(text1);float[]vector2embeddingClient.embed(text2);returncosineSimilarity(vector1,vector2);}/** * 手动实现余弦相似度cos(θ) (A·B) / (|A| × |B|) */privatedoublecosineSimilarity(float[]a,float[]b){doubledotProduct0,normA0,normB0;for(inti0;ia.length;i){dotProducta[i]*b[i];normAa[i]*a[i];normBb[i]*b[i];}returndotProduct/(Math.sqrt(normA)*Math.sqrt(normB));}测试示例输入text1“我喜欢吃苹果”text2“我爱吃苹果” → 相似度≈0.95输入text1“我喜欢吃苹果”text2“今天天气很好” → 相似度≈0.1六、2026年主流嵌入模型对比与选型这是本章最核心的内容也是你在实际开发中必须做出的决策。1. 嵌入模型核心参数说明参数含义影响向量维度向量包含的数字个数维度越高语义表达能力越强但存储和计算成本也越高最大序列长度模型一次能处理的最大token数超过这个长度的文本会被截断导致语义丢失中文性能模型对中文语义的理解能力直接决定RAG系统的检索准确率商用许可证是否可以免费用于商业用途关系到企业的法律风险2. 主流嵌入模型横向对比模型名称厂商/机构类型向量维度最大长度100万tokens成本中文评分商用许可BGE-M4智源研究院开源本地102481920元95Apache 2.0免费商用M3E-v2阿里达摩院开源本地10245120元90Apache 2.0Jina Embeddings v3Jina AI开源本地102481920元85Apache 2.0DeepSeek-embedding-v2深度求索商业API153640961元85商业智谱embedding-3智谱AI商业API102440965元88商业OpenAI text-embedding-3-smallOpenAI商业API153681910.14元80商业3. 嵌入模型选型决策树嵌入模型选型决策树 ├── 数据敏感绝对不能上传到第三方服务器 → 必须选择开源本地模型 │ ├── 有GPU4GB以上显存 → BGE-M4首选中文性能天花板 │ └── 只有CPU → M3E-v2推理速度快CPU友好 └── 数据不敏感可以上传 → 商业API ├── 预算有限 → DeepSeek-embedding-v2性价比之王 ├── 已经在使用智谱生态 → 智谱embedding-3 └── 多语言需求 → OpenAI text-embedding-3-small重要纠正之前有说法DeepSeek没有向量模型这是完全错误的。DeepSeek不仅有官方的嵌入API而且价格极低是商业API的首选。2026年最新进展BGE-M4已经内置了稀疏向量支持不需要再单独部署Splade等稀疏向量模型可以直接实现混合检索。我们会在第8篇详细讲解混合检索技术。4. 本地Ollama部署BGE-M4如果你选择本地部署BGE-M4只需要一行命令ollama pull bge-m4然后修改application.yml配置为Ollama模式不需要修改任何Java代码。七、嵌入模型的常见误区1. ❌ 误区一用聊天模型做嵌入很多新手会误以为同一个模型既可以聊天也可以做嵌入这是完全错误的。聊天模型和嵌入模型的训练目标完全不同聊天模型的训练目标是生成下一个token嵌入模型的训练目标是让语义相似的文本生成相似的向量用聊天模型生成的向量相似度计算结果会非常不准确。2. ❌ 误区二混用不同嵌入模型的向量每个嵌入模型生成的向量空间是完全不同的。你不能把BGE-M4生成的向量和DeepSeek生成的向量放在同一个向量数据库中进行比较结果会完全没有意义。企业级最佳实践一个RAG系统只能使用一个嵌入模型所有向量都必须由同一个模型生成。3. ❌ 误区三向量维度越高越好虽然维度越高语义表达能力越强但1024维已经足够应对绝大多数中文场景。更高的维度如1536维只会增加存储和计算成本带来的性能提升非常有限。4. ❌ 误区四嵌入模型越新越好不要盲目追求最新的嵌入模型。BGE-M4已经经过了大量企业的验证稳定性和效果都有保障。新模型可能存在各种问题不建议直接用于生产环境。八、企业级性能优化技巧1. 批量生成嵌入向量不要每次只生成一个文本的向量尽量批量生成这样可以大幅提升效率。importjava.util.Arrays;importjava.util.List;// 推荐批量生成ListStringtextsArrays.asList(文本1,文本2,文本3);Listfloat[]embeddingsembeddingClient.embed(texts);// 不推荐逐个生成for(Stringtext:texts){float[]embeddingembeddingClient.embed(text);}2. 缓存嵌入向量对于不会变化的文本如知识库文档生成一次向量后就缓存起来不要重复生成。可以使用Redis作为缓存。3. 限制文本长度不要把过长的文本直接传给嵌入模型应该先进行切分。我们会在第7篇详细讲解文本切分策略。4. 选择合适的批量大小商业API一般都有批量大小限制比如DeepSeek的最大批量大小是2048。超过这个限制会导致调用失败。九、常见坑与解决方案1. ❌ 向量维度不匹配问题嵌入模型生成的向量维度和向量数据库要求的维度不一致解决方案确保嵌入模型和向量数据库使用相同的维度。BGE-M4是1024维DeepSeek是1536维。2. ❌ 中文效果差问题使用OpenAI等国外模型中文检索准确率低解决方案中文场景优先使用BGE-M4、M3E-v2等国产模型它们的中文性能远超国外模型。3. ❌ 批量调用报错问题批量调用时提示请求过大解决方案减小批量大小一般每次处理10-100个文本比较合适。4. ❌ 本地模型速度慢问题使用CPU运行BGE-M4生成速度很慢解决方案如果有NVIDIA显卡Ollama会自动启用GPU加速推理速度大幅提升。十、本章总结与下章预告本章总结嵌入模型的本质是将文本转换为数字向量语义相似的文本向量距离更近余弦相似度是文本相似度计算的首选方法Spring AI提供了统一的EmbeddingClient接口支持商业API和本地模型中文RAG场景首选BGE-M4开源本地模型商业API首选DeepSeek-embedding-v2不要用聊天模型做嵌入不要混用不同模型的向量批量生成和缓存可以大幅提升嵌入模型的性能预告式提及我们现在已经学会了如何生成向量但如何高效地存储和检索这些向量呢下一章我们将学习向量数据库它是RAG系统的核心存储组件。下章预告下一章我们将深入学习向量数据库的选择与Spring AI集成。你将学会什么是向量数据库为什么不用MySQL存向量主流向量数据库对比Milvus vs Qdrant vs ChromaSpring AI向量数据库统一API详解本地向量数据库Chroma的快速上手向量的增删改查与批量导入导出十一、课后练习分别使用DeepSeek商业API和本地Ollama BGE-M4生成Java是最好的编程语言的向量观察它们的维度差异计算三对文本的相似度“Java开发和Java编程”、“Java开发和Python开发”、“Java开发和打篮球”实现一个批量生成嵌入向量的接口支持一次处理最多50个文本尝试修改Ollama配置使用M3E-v2模型对比它和BGE-M4的生成速度和相似度计算结果思考一下为什么嵌入模型能够捕捉到文本的语义信息