当前位置: 首页 > news >正文

Spring AI + RAG

对于基础大模型来说, 他只具备通用信息,他的参数都是拿公网进行训练,并且有一定的时间延迟, 无法得知一些具体业务数据和实时数据, 这些数据往往在各种文件中(比如txt、word、html、数据库...)

虽然function-call、SystemMessage可以用来解决一部分问题

但是它只能少量,并且针对的场景不一样

如果你要提供大量的业务领域信息, 就需要给他外接一个知识库:

比如

  1. 我问他退订要多少费用
  2. 这些资料可能都由产品或者需求编写在了文档中:
    1. 所以需要现在需求信息存到向量数据库(这个过程叫Embedding, 涉及到文档读取、分词、向量化存入)
  3. 去向量数据库中查询“退订费用相关信息”
  4. 将查询到的数据和对话信息再请求大模型
  5. 此时会响应退订需要多少费用

概念

向量:

向量通常用来做相似性搜索,比如语义的一维向量,可以表示词语或短语的语义相似性。例如,“你好”、“hello”和“见到你很高兴”可以通过一维向量来表示它们的语义接近程度。

然而,对于更复杂的对象,比如小狗,无法仅通过一个维度来进行相似性搜索。这时,我们需要提取多个特征,如颜色、大小、品种等,将每个特征表示为向量的一个维度,从而形成一个多维向量。例如,一只棕色的小型泰迪犬可以表示为一个多维向量 [棕色, 小型, 泰迪犬]。

如果需要检索见过更加精准, 我们肯定还需要更多维度的向量, 组成更多维度的空间,在多维向量空间中,相似性检索变得更加复杂。我们需要使用一些算法,如余弦相似度或欧几里得距离,来计算向量之间的相似性。向量数据库会帮我实现。

文本向量化

通过向量模型即可向量化, 这里我们学到了一种新的模型, 叫“向量模型” 专门用来做文本向量化的。

大语言模型不能做向量化, 所以需要单独找一个向量模型

  1. deepseek不支持向量模型
  2. 阿里百炼有大量向量模型
    1. 默认模型DashScopeEmbeddingProperties#DEFAULT_EMBEDDING_MODEL="text-embedding-v1"

<span style="color:#000000"><span style="background-color:#fefef2"><code class="language-properties"><span style="color:#015692">spring.ai.dashscope.embedding.options.model</span>= <span style="color:#54790d">text-embedding-v4</span> </code></span></span>
  1. ollama有大量向量模型, 自己拉取

以ollama为例:

<span style="color:#000000"><span style="background-color:#fefef2"><code class="language-properties"><span style="color:#015692">spring.ai.ollama.embedding.model</span>= <span style="color:#54790d">nomic-embed-text</span> </code></span></span>
<span style="color:#000000"><span style="background-color:#fefef2"><code class="language-java"><span style="color:#015692">@SpringBootTest</span> <span style="color:#015692">public</span> <span style="color:#015692">class</span> <span style="color:#b75501">EmbaddingTest</span> { <span style="color:#015692">@Test</span> <span style="color:#015692">public</span> <span style="color:#015692">void</span> <span style="color:#b75501">testEmbadding</span>(<span style="color:#015692">@Autowired</span> OllamaEmbeddingModel ollamaEmbeddingModel) { <span style="color:#656e77">// .embed() 转换为向量模型</span> <span style="color:#b75501">float</span>[] embedded = ollamaEmbeddingModel.embed(<span style="color:#54790d">"我叫徐庶"</span>); System.out.println(embedded.length); System.out.println(Arrays.toString(embedded)); } } </code></span></span>

从结果可以知道"我叫徐庶"这句话经过OllamaEmbeddingModel向量化之后得到的一个长度为768的float数组。注意,768是向量模型nomic-embed-text-v1.5固定的,不会随着句子长度而变化,不同的向量模型提供了不同的维度。

那么,我们通过这种向量模型得到一句话对应的向量有什么作用呢?非常有用,因为我们可以基于向量来判断两句话之间的相似度,举个例子:

查询跟秋田犬类似的狗, 在向量数据库中根据每个狗的特点进行多维向量, 你会发现秋田犬的向量数值和柴犬的向量数值最接近, 就可以查到类似的狗。 (当然我这里只是举例,让你对向量数据库有一个印象)

  • 向量模型的本质目标,就是把语义相似的内容用“相近”的向量表示,把“不相关”内容尽量拉远。
  • 所以好的向量模型能够更好的识别语义, 进行向量化.
向量数据库

对于向量模型生成出来的向量,我们可以持久化到向量数据库,并且能利用向量数据库来计算两个向量之间的相似度,或者根据一个向量查找跟这个向量最相似的向量。

在SpringAi中,VectorStore 表示向量数据库,目前支持的向量数据库有

  • Azure Vector Search- TheAzurevector store.
  • Apache Cassandra- TheApache Cassandravector store.
  • Chroma Vector Store- TheChromavector store.
  • Elasticsearch Vector Store - The Elasticsearch vector store. 可以“以向量+关键词”方式做混合检索。深度优化更多针对文本,不是专门“向量搜索引擎”。向量存储和检索容量有限制,查询延迟高于 Milvus。
  • GemFire Vector Store- TheGemFirevector store.
  • MariaDB Vector Store- TheMariaDBvector store.
  • Milvus Vector Store - The Milvus vector store.
  • MongoDB Atlas Vector Store- TheMongoDB Atlasvector store.
  • Neo4j Vector Store - The Neo4j vector store.可以结合结构化图谱查询与向量检索,大规模嵌入检索(如千万—亿级高维向量)性能明显落后于 Milvus
  • OpenSearch Vector Store- TheOpenSearchvector store.
  • Oracle Vector Store- TheOracle Databasevector store.
  • PgVector Store- ThePostgreSQL/PGVectorvector store.
  • Pinecone Vector Store-PineConevector store.
  • Qdrant Vector Store-Qdrantvector store.
  • Redis Vector Store - The Redis vector store. 低门槛实现小规模向量检索。对于高维大规模向量(如几百万到上亿条),性能和存储效率不如专用向量库。
  • SAP Hana Vector Store- TheSAP HANAvector store.
  • Typesense Vector Store- TheTypesensevector store.
  • Weaviate Vector Store- TheWeaviatevector store.
  • SimpleVectorStore - A simple implementation of persistent vector storage, good for educational purposes.

其中有我们熟悉的几个数据库都可以用来存储向量,比如Elasticsearch、MongoDb、Neo4j、Pgsql、Redis。

视频中我会讲解2种:

  1. SimpleVectorStore教学版向量数据库
  2. Milvus Vector StoreMilvus(国产团队)、文档友好、社区国内活跃、性能最佳、市场占用率大。 实战中使用的向量数据库.

匹配检索

在这个示例中, 我分别存储了预订航班和取消预订2段说明到向量数据库中
然后通过"退票要多少钱" 进行查询

代码执行结果为:

OllamaEmbedding结果

<span style="color:#000000"><span style="background-color:#fefef2"><code class="language-java"><span style="color:#015692">@Bean</span> <span style="color:#015692">public</span> VectorStore <span style="color:#b75501">vectorStore</span>(OllamaEmbeddingModel embeddingModel) { <span style="color:#656e77">// 绑定一个向量大模型,进行将数据信息向量化</span> SimpleVectorStore.<span style="color:#b75501">SimpleVectorStoreBuilder</span> <span style="color:#54790d">builder</span> <span style="color:#ab5656">=</span> SimpleVectorStore.builder(embeddingModel); <span style="color:#015692">return</span> builder.build(); } </code></span></span>
SearchRequest

可以利用searchRequest设置检索请求:

  • query 代表要检索的内容
  • topK 设置检索结果的前N条
    • 通常我们查询所有结果查出来, 因为查询结果最终要发给大模型, 查询过多的结果会:
      • 过多的token意味着更长延迟, 更多的费用, 并且过多上下文会超限;
      • 研究表明过多的内容会降低 LLM 的_**召回性能;**_
  • similarityThreshold 设置相似度阈值, 可以通关设置分数限制召回内容相似度. 从而过滤掉废料。 (中文语料要适当降低分数) , 所以应遵循**始终以“业务召回效果”为主,而不是追求网上常说的高分阈值。
<span style="color:#000000"><span style="background-color:#fefef2"><code class="language-java"><span style="color:#015692">@BeforeEach</span> <span style="color:#015692">public</span> <span style="color:#015692">void</span> <span style="color:#b75501">init</span>( <span style="color:#015692">@Autowired</span> VectorStore vectorStore) { <span style="color:#656e77">// 1. 声明内容文档</span> <span style="color:#b75501">Document</span> <span style="color:#54790d">doc</span> <span style="color:#ab5656">=</span> Document.builder() .text(<span style="color:#54790d">""" 预订航班: - 通过我们的网站或移动应用程序预订。 - 预订时需要全额付款。 - 确保个人信息(姓名、ID 等)的准确性,因为更正可能会产生 25 的费用。</span></code></span></span>
http://www.jsqmd.com/news/1099518/

相关文章:

  • 大模型服务弹性伸缩:从 GPU 利用率到 K8s HPA 的全链路实战
  • 告别Keil律师函!手把手教你用VSCode+GNU Arm+STM32CubeMX搭建免费单片机开发环境(Windows版)
  • 从零到一:基于Dify的AI应用开发全流程实践指南
  • 气泡特效的核心在于BubbleEffect类,它继承自Manim的Animation类,通过重写关键方法来实现气泡的上升、变大和透明度变化效果。
  • 操作系统缓存机制深度解析:从页缓存到内存映射,超越Redis的性能优化之道
  • 深智微:华润微官方授权代理商,如何让型号、库存交期与项目交付协同推进
  • 新用户福利,千问新用户福利怎么领,领取8元优惠券,附最新口令
  • Redis缓存:Python操作Redis实战
  • 行测申论试卷|公务员申论刷题|数量关系备考
  • 2026年人工智能发展的新风口:从“数字智能”到“物理智能”的范式革命
  • Qt——文本绘制技巧
  • 学习一门语言——Python(自学版)
  • 你的输出第一行肯定和我不一样,且每次运行的输出肯定不一样。
  • 乳牙蛀了不用管?避开护牙误区,科学守护孩子恒牙健康
  • info = {“k1“:1,“k2“:“222“,“k3“:“guohan“} 可变类型不可以做字典的键(列表,字典,集合) 因此键可以是整数什么的如 info = {1:2}公
  • 闪迪 x300 2.5-sata
  • 通用二进制协议分析:基于AST的Protobuf动态解析与容错设计
  • — 一款针对 IT 团队开发的文档管理系统,基于 Golang 开发,内置项目管理,用户管理,权限管理等功能,可以用来储存日常接口文档,数据库字典,手册说明等文档。功能特色:
  • 零基础使用VMware虚拟机安装CentOS Linux超详细教程
  • 硬件学习第三天(阅读芯片手册)
  • c语言项目驱动学习--实例化(图书管理)--005-代码对比
  • 基于51单片机RFID车位车库管理系统/RC522读卡/车库收费系统2(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)
  • [智能体-612]:AGENTS.md 完整详解(OpenClaw 体系,对应 workspace 里的工作规范文件)
  • 技术速递|通过全新开放数据集,加速研究人员和开发者构建多语言 AI
  • 中餐厅摆台 点击UI图片拖拽预制体到桌面并 实现预制体拖拽
  • 家庭精细化洗护怎么选?海信全家筒·棉花糖 U7S 四筒洗衣机深度体验
  • MHmarkets:把产品理解成本做扎实,更谨慎的使用者更容易感受到的清单
  • 基于STM32单片机甲醛温湿度烟雾火灾报警 空气质量检测PM2系统2(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)
  • 全国大学真实生活环境一键查询工具(在线免费)
  • Spring MVC的工作流程