Spring AI + RAG

发布时间:2026/7/1 1:42:44
Spring AI + RAG 对于基础大模型来说 他只具备通用信息他的参数都是拿公网进行训练并且有一定的时间延迟 无法得知一些具体业务数据和实时数据 这些数据往往在各种文件中比如txt、word、html、数据库...虽然function-call、SystemMessage可以用来解决一部分问题但是它只能少量并且针对的场景不一样如果你要提供大量的业务领域信息 就需要给他外接一个知识库比如我问他退订要多少费用这些资料可能都由产品或者需求编写在了文档中所以需要现在需求信息存到向量数据库这个过程叫Embedding 涉及到文档读取、分词、向量化存入去向量数据库中查询“退订费用相关信息”将查询到的数据和对话信息再请求大模型此时会响应退订需要多少费用概念向量向量通常用来做相似性搜索比如语义的一维向量可以表示词语或短语的语义相似性。例如“你好”、“hello”和“见到你很高兴”可以通过一维向量来表示它们的语义接近程度。然而对于更复杂的对象比如小狗无法仅通过一个维度来进行相似性搜索。这时我们需要提取多个特征如颜色、大小、品种等将每个特征表示为向量的一个维度从而形成一个多维向量。例如一只棕色的小型泰迪犬可以表示为一个多维向量 [棕色, 小型, 泰迪犬]。如果需要检索见过更加精准 我们肯定还需要更多维度的向量 组成更多维度的空间在多维向量空间中相似性检索变得更加复杂。我们需要使用一些算法如余弦相似度或欧几里得距离来计算向量之间的相似性。向量数据库会帮我实现。文本向量化通过向量模型即可向量化, 这里我们学到了一种新的模型 叫“向量模型” 专门用来做文本向量化的。大语言模型不能做向量化 所以需要单独找一个向量模型deepseek不支持向量模型阿里百炼有大量向量模型默认模型DashScopeEmbeddingProperties#DEFAULT_EMBEDDING_MODELtext-embedding-v1span stylecolor:#000000span stylebackground-color:#fefef2code classlanguage-propertiesspan stylecolor:#015692spring.ai.dashscope.embedding.options.model/span span stylecolor:#54790dtext-embedding-v4/span /code/span/spanollama有大量向量模型, 自己拉取以ollama为例span stylecolor:#000000span stylebackground-color:#fefef2code classlanguage-propertiesspan stylecolor:#015692spring.ai.ollama.embedding.model/span span stylecolor:#54790dnomic-embed-text/span /code/span/spanspan stylecolor:#000000span stylebackground-color:#fefef2code classlanguage-javaspan stylecolor:#015692SpringBootTest/span span stylecolor:#015692public/span span stylecolor:#015692class/span span stylecolor:#b75501EmbaddingTest/span { span stylecolor:#015692Test/span span stylecolor:#015692public/span span stylecolor:#015692void/span span stylecolor:#b75501testEmbadding/span(span stylecolor:#015692Autowired/span OllamaEmbeddingModel ollamaEmbeddingModel) { span stylecolor:#656e77// .embed() 转换为向量模型/span span stylecolor:#b75501float/span[] embedded ollamaEmbeddingModel.embed(span stylecolor:#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.可以结合结构化图谱查询与向量检索大规模嵌入检索如千万—亿级高维向量性能明显落后于 MilvusOpenSearch 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种SimpleVectorStore教学版向量数据库Milvus Vector StoreMilvus国产团队、文档友好、社区国内活跃、性能最佳、市场占用率大。 实战中使用的向量数据库.匹配检索在这个示例中 我分别存储了预订航班和取消预订2段说明到向量数据库中然后通过退票要多少钱 进行查询代码执行结果为OllamaEmbedding结果span stylecolor:#000000span stylebackground-color:#fefef2code classlanguage-javaspan stylecolor:#015692Bean/span span stylecolor:#015692public/span VectorStore span stylecolor:#b75501vectorStore/span(OllamaEmbeddingModel embeddingModel) { span stylecolor:#656e77// 绑定一个向量大模型进行将数据信息向量化/span SimpleVectorStore.span stylecolor:#b75501SimpleVectorStoreBuilder/span span stylecolor:#54790dbuilder/span span stylecolor:#ab5656/span SimpleVectorStore.builder(embeddingModel); span stylecolor:#015692return/span builder.build(); } /code/span/spanSearchRequest可以利用searchRequest设置检索请求query 代表要检索的内容topK 设置检索结果的前N条通常我们查询所有结果查出来 因为查询结果最终要发给大模型 查询过多的结果会过多的token意味着更长延迟 更多的费用 并且过多上下文会超限研究表明过多的内容会降低 LLM 的_**召回性能**_similarityThreshold 设置相似度阈值 可以通关设置分数限制召回内容相似度. 从而过滤掉废料。 中文语料要适当降低分数 所以应遵循**始终以“业务召回效果”为主而不是追求网上常说的高分阈值。span stylecolor:#000000span stylebackground-color:#fefef2code classlanguage-javaspan stylecolor:#015692BeforeEach/span span stylecolor:#015692public/span span stylecolor:#015692void/span span stylecolor:#b75501init/span( span stylecolor:#015692Autowired/span VectorStore vectorStore) { span stylecolor:#656e77// 1. 声明内容文档/span span stylecolor:#b75501Document/span span stylecolor:#54790ddoc/span span stylecolor:#ab5656/span Document.builder() .text(span stylecolor:#54790d 预订航班: - 通过我们的网站或移动应用程序预订。 - 预订时需要全额付款。 - 确保个人信息姓名、ID 等的准确性因为更正可能会产生 25 的费用。/span/code/span/span