个人随笔
目录
SpringAI2.0嵌入模型(Embeddings Model)的简单使用
2026-11-04 20:22:07

Embeddings Model(嵌入模型):嵌入技术通过将文本、图像和视频转换为浮点数数组(称为向量)来实现。这些向量旨在捕捉文本、图像和视频的语义信息。嵌入数组的长度被称为向量的维度。

通过计算两段文本的向量表示之间的数值距离,应用程序可以确定用于生成嵌入向量的对象之间的相似性。这里通常可以用向量的余弦相似度来计算,结果越大越相似。

一、简单例子

1、配置嵌入模型

要在配置文件中指定,这里用的是openai的但是配置用的是千问的,他们兼容。

  1. spring:
  2. application:
  3. name: spring-ai-test
  4. ai:
  5. openai:
  6. api-key: ${AI_BAILIAN_API_KEY}
  7. base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
  8. chat:
  9. model: qwen3.8-flash
  10. temperature: 0.7
  11. embedding:
  12. model: qwen3.7-text-embedding-flash
  13. dimensions: 2048

2、余弦相似度工具类

  1. public class VectorSimilarityUtil {
  2. /**
  3. * 余弦相似度 cosine similarity
  4. * @param vecA embedding向量
  5. * @param vecB embedding向量
  6. * @return [-1,1],越接近1越相似
  7. */
  8. public static float cosineSimilarity(float[] vecA, float[] vecB) {
  9. if (vecA == null || vecB == null || vecA.length != vecB.length) {
  10. throw new IllegalArgumentException("向量不能为空且维度必须一致");
  11. }
  12. float dot = 0f;
  13. float normA = 0f;
  14. float normB = 0f;
  15. for (int i = 0; i < vecA.length; i++) {
  16. dot += vecA[i] * vecB[i];
  17. normA += vecA[i] * vecA[i];
  18. normB += vecB[i] * vecB[i];
  19. }
  20. if (normA == 0 || normB == 0) {
  21. return 0f;
  22. }
  23. return dot / ( (float) Math.sqrt(normA) * (float) Math.sqrt(normB) );
  24. }
  25. }

3、简单例子

  1. @RestController
  2. public class TestController {
  3. @Autowired
  4. private OpenAiEmbeddingModel embeddingModel;
  5. @GetMapping("/em")
  6. public String em(){
  7. float[] results1 = embeddingModel.embed(new Document("我爱java"));
  8. float[] results2 = embeddingModel.embed(new Document("我爱php"));
  9. float[] results3 = embeddingModel.embed(new Document("我爱小猫咪"));
  10. float a = VectorSimilarityUtil.cosineSimilarity(results1,results2);
  11. float b = VectorSimilarityUtil.cosineSimilarity(results1,results3);
  12. //越大越像
  13. System.out.println("我爱java和我爱php的余弦相似度:"+a);
  14. System.out.println("我爱java和我爱小猫咪的余弦相似度:"+b);
  15. //我爱java和我爱php的余弦相似度:0.69244385
  16. // 我爱java和我爱小猫咪的余弦相似度:0.644336
  17. return "ok";
  18. }
  19. }

嵌入向量返回的是一个2048维度的数组,根据上面的输出结果可以知道,我爱java和我爱php是比较相似的。

二、为啥要用嵌入模型

嵌入模型就是把文本转成定长向量,让计算机可以用余弦相似度判断语义是否相近。解决了传统关键词检索(如Elasticsearch)无法理解语义关联的问题(例如查询“治疗感冒的药”,可匹配“缓解伤风症状的药物”这类语义相似但关键词不同的文档),是RAG系统中“检索”环节的核心支撑。

 3

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2