第 10 章 · Embedding、VectorStore 与 RAG

RAG检索优化实战:Embedding选型与Vectorstore配置指南 向量检索是RAG系统的核心能力,其本质是在高维语义空间中实现近似最近邻搜索(ANN)。理解Embedding如何将文本映射为可计算的向量表示,以及Vectorstore如何高效组织和索引这些向量,是构建高质量问答系统的基础。技术价值在于突破关键词匹配局限,实现语义层面的理解与召回;典型应用场景包括智能客服、法律合同审查、医疗知识库等需精准理解用户意图的领域。本文聚焦生产环境中Embedding模型选型与Vectorstore配置两大关键决策点,结合bge-zh-v1.5、Faiss等主流工具,提供语言适配性 阅读详情

版本:Spring AI 2.0.1

目标:走通「文档进库 → 检索增强生成」,分清经典 QA Advisor 与 Modular RAG,写出可运行的最小 ingest / 问答代码。

大模型训练语料里没有你的私有手册与工单。RAG 把「能检索的私有片段」在回答前塞进 Prompt,让模型基于材料说话,而不是凭空编。

整条链可以拆成两段:

  1. 离线 ingest:文档 → 切分 → Embedding → 写入向量库

  2. 在线问答:问题 → Embedding → 相似检索 → 片段进入 Prompt → Chat

Embedding 负责语义距离,VectorStore 负责存与搜,Advisor 负责把搜到的内容接进 ChatClient。


10.1 文档进库:ETL 三件套

DocumentReader → DocumentTransformer(s) → DocumentWriter / VectorStore

Document 带文本、id、metadata;检索命中后还可能带 score。元数据会进入过滤条件,入库前就要定好 tenantId、source、version 等键。

输入类型常见 Reader
MarkdownMarkdownDocumentReader
HTML / 网页JsoupDocumentReader
PDFPagePdfDocumentReader / ParagraphPdfDocumentReader
Office 杂糅TikaDocumentReader
JSON / 纯文本JsonReader / TextReader

不要把用户任意 URL 直接丢进 Reader(SSRF、本地文件读取风险)。上传先落到受控存储,再由服务端选 Reader。

最小 ingest(Markdown → 切分 → 写入):

Resource resource = new ClassPathResource("docs/handbook.md");
​
List<Document> docs = new MarkdownDocumentReader(
        resource,
        MarkdownDocumentReaderConfig.builder()
                .withAdditionalMetadata("tenantId", "acme")
                .withAdditionalMetadata("source", "handbook")
                .build()
).get();
​
TokenTextSplitter splitter = TokenTextSplitter.builder()
        .withChunkSize(800)
        .withMinChunkSizeChars(200)
        .build();
​
List<Document> chunks = splitter.apply(docs);
vectorStore.add(chunks);

切分优先用 TokenTextSplitter.builder();中文语料注意把 。?! 等标点纳入切分规则(按所用 splitter 的配置项)。父文档 metadata 会复制到 chunk。

更新语料时先按条件删旧再写入,避免过期片段残留:

vectorStore.delete(
        FilterExpressionBuilder.builder()
                .eq("source", "handbook")
                .build()
);
vectorStore.add(chunks);

各 VectorStore 实现的 delete / filter API 略有差异,语义都是「按条件清旧再灌新」。


10.2 EmbeddingModel

float[] embed(String) / embed(Document)
EmbeddingResponse call(EmbeddingRequest)
int dimensions()

常见来源:OpenAI、Ollama、Mistral、Google、Vertex、Bedrock、PostgresML、Transformers 等。OpenAI 配置示例:

spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}
      embedding:
        options:
          model: text-embedding-3-small

约束:

  • 维度必须与向量索引一致;换 Embedding 模型通常等于重建索引

  • 入库与查询必须用同一套 Embedding,不要「入库用 A、查询用 B」

  • Chat 与 Embedding 可以来自不同供应商,但同一语料只能共用一套向量空间

  • 大批量 ingest 走批处理,并观察限流与重试

手工调用(调试 / 预热):

EmbeddingResponse response = embeddingModel.call(
        new EmbeddingRequest(List.of("订单退款规则是什么?"), null));
float[] vector = response.getResult().getOutput();
int dim = embeddingModel.dimensions();

10.3 VectorStore

VectorStore 同时是 Writer 与 Retriever:

add / delete / similaritySearch(SearchRequest)
List<Document> hits = vectorStore.similaritySearch(
        SearchRequest.builder()
                .query("如何申请退款?")
                .topK(5)
                .similarityThreshold(0.75)
                .filterExpression("tenantId == 'acme'")
                .build());

SearchRequest 常见字段:query、topK、similarityThreshold、filterExpression。

进程内可用 SimpleVectorStore 做演示与单测。生产按已有基础设施选:

基础设施倾向
已有 PostgreSQLPgVector
已有 RedisRedis VectorStore
本地实验Chroma / Qdrant / SimpleVectorStore
托管省运维Pinecone / 云厂商向量能力
图 + 向量同库Neo4j

PgVector 依赖印象:

<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-starter-vector-store-pgvector</artifactId>
</dependency>

个别实现可能没有 dedicated starter,需直接依赖实现模块。语义缓存用的向量库不是业务知识库,不要混成同一个 Store。

多租户硬规则:

写入:服务端注入 tenantId,不信客户端
检索:filter 必须带同一 tenantId
删除:按租户 + 业务键,禁止无条件全表扫

filter 字符串若拼接了用户输入,字段与取值都要白名单,防止过滤条件被篡改。


10.4 两条 RAG 装配路径

QuestionAnswerAdvisor(经典短路径)

检索 → 注入 Prompt → 对话。适合 FAQ、手册问答。

@Bean
ChatClient ragChatClient(ChatModel chatModel, VectorStore vectorStore) {
    return ChatClient.builder(chatModel)
            .defaultAdvisors(
                    QuestionAnswerAdvisor.builder(vectorStore)
                            .searchRequest(SearchRequest.builder()
                                    .topK(5)
                                    .similarityThreshold(0.7)
                                    .build())
                            .build())
            .build();
}
​
String answer = ragChatClient.prompt()
        .user("退货几日内可申请?")
        .advisors(a -> a.param(
                QuestionAnswerAdvisor.FILTER_EXPRESSION,
                "tenantId == 'acme'"))
        .call()
        .content();

FILTER_EXPRESSION 的常量名以依赖版本为准;要点是按请求注入租户过滤,不要把租户写死在全局默认里却忘了多租户场景。

RetrievalAugmentationAdvisor(Modular RAG)

把查询改写、多路扩展、检索、拼接、后处理拆成可插拔积木,适合要精细控制流水线的场景。

Advisor modularRag = RetrievalAugmentationAdvisor.builder()
        .documentRetriever(VectorStoreDocumentRetriever.builder()
                .vectorStore(vectorStore)
                .topK(5)
                .similarityThreshold(0.7)
                .build())
        // 可选:QueryRewriter / QueryExpander / DocumentPostProcessor …
        .build();
​
ChatClient client = ChatClient.builder(chatModel)
        .defaultAdvisors(modularRag)
        .build();
QA AdvisorModular RAG
复杂度低中高
可插拔改写 / 多路检索弱强
适合FAQ、手册多集合、压缩上下文、可控流水线

流式接口通常是先检索再 stream:首 token 前会有一小段静默,可用 status=retrieving 一类事件提示前端。

另有 VectorStoreChatMemoryAdvisor:用向量库做长期对话记忆,和本章业务知识库 RAG 不是同一条产品线——一个记「这个用户说过什么」,一个记「公司手册写了什么」。


10.5 完整最小问答骨架

@Service
public class HandbookQaService {
​
    private final ChatClient chatClient;
​
    public HandbookQaService(ChatModel chatModel, VectorStore vectorStore) {
        this.chatClient = ChatClient.builder(chatModel)
                .defaultAdvisors(
                        QuestionAnswerAdvisor.builder(vectorStore)
                                .searchRequest(SearchRequest.builder().topK(5).build())
                                .build())
                .build();
    }
​
    public String ask(String tenantId, String question) {
        return chatClient.prompt()
                .user(question)
                .advisors(a -> a.param(
                        QuestionAnswerAdvisor.FILTER_EXPRESSION,
                        "tenantId == '" + sanitize(tenantId) + "'"))
                .call()
                .content();
    }
​
    private String sanitize(String tenantId) {
        return tenantId.replaceAll("[^a-zA-Z0-9_-]", "");
    }
}

sanitize 只是示范:禁止把原始用户输入直接拼进 filter。生产环境用枚举租户、预编译表达式或参数化 filter API。


10.6 质量与运维

  • 空检索率、过期 chunk、错误的 tenant filter,往往比「换更大模型」更影响体感

  • 换 Embedding 维度要有重建索引的 runbook

  • 打开 VectorStore observation,才能分清慢在检索还是慢在 Chat

  • 语义缓存可省钱,错误答案也要有 TTL / 失效手段

  • 对比实验:同一问题开关 RAG,记录是否引用到文档 id


10.7 小结

RAG 主链是 ingest → Embedding → VectorStore → Advisor 注入 → Chat。先用 QuestionAnswerAdvisor 跑通带租户过滤的手册问答;流水线要改写、多路检索或压缩上下文时,再上 RetrievalAugmentationAdvisor。向量维度一致、过滤条件可信、语料可更新,这三件事比纠结 Advisor 类名更决定能不能上线。

Embedding与Vectorstore:构建高精度文档问答系统的实战指南 向量检索是现代文档智能的核心基础,其本质是将非结构化文本映射为语义向量,并在高维空间中实现近似最近邻搜索。这一技术突破了传统全文检索在词形变化、上下文缺失和响应延迟上的固有局限,尤其适用于法律合同、合规手册等强语义依赖场景。Embedding模型负责语义编码,Vectorstore则承担高效索引与召回,二者构成RAG流程中‘理解-记忆-检索’闭环的关键支柱。实际落地需兼顾中文语义准确性、推理成本与工程可维护性,典型选型如text-embedding-ada-002与ChromaDB已在多个企业级文档问答系统 阅读详情

相关推荐

LlamaIndex数据框架七层架构与RAG索引设计原理

向量检索是RAG系统的核心能力之一,其效果高度依赖底层数据组织方式。LlamaIndex并非简单封装向量库的工具,而是以‘索引即契约’为设计哲学构建的数据中间件框架,强调从Document到QueryEngine的可追溯、可审计、可干预的全链路控制。它通过NodeParser实现语义感知的分块策略,借助Embedding Model完成高维空间映射,依托VectorStore提供协议级检索能力,并利用StorageContext解耦存储与计算,最终由QueryEngine完成用户意图到结构化查询的翻译。这种

aigui1439的博客 371

【LangChain|Day05】深入 RAG 全流程基础笔记:Embedding 向量化与、VectorStore 向量存储,LCEL 链式串联实战

本文笔记围绕RAG的文本嵌入与向量存储环节。讲解如何将文档转为语义向量并存入向量数据库进行高效相似检索。演示了Chroma等向量库的统一接口用法,并详解了如何通过as_retriever()将检索器融入LCEL链,结合数据透传与格式化,串联起完整的检索增强生成流程。

m0_73999950的博客 485

深入理解Embedding与Transformer:从原理到RAG系统优化实践

Embedding技术作为自然语言处理的核心基础,通过将文本映射为高维向量,实现了对语义信息的数学化表示。其底层原理依赖于Transformer架构中的自注意力机制,该机制能够动态计算词元间的关联权重,从而捕获复杂的上下文依赖关系。这种技术价值在于为语义相似度计算、信息检索等任务提供了高效、可度量的解决方案,广泛应用于搜索、推荐、问答等场景。在检索增强生成(RAG)系统中,Embedding模型的质量直接决定了检索精度,而Transformer架构同时承担了编码(理解)与生成(创作)的双重角色。理解Embe

weixin_33843409的博客 446

SpringAI系列|第4篇:Embedding与向量数据库

本文是《Spring AI 实战系列》第4篇,重点介绍语义搜索三大核心技术:Embedding(文本向量化)、向量数据库集成和文档分块策略。首先解析Embedding的概念与价值,展示如何将文本转换为语义向量并计算相似度;其次对比主流向量数据库特性,提供选型建议;最后详解文档分块策略对检索效果的影响。通过这三个核心组件的协同,为后续实现RAG(检索增强生成)奠定基础,使AI应用能够理解语义而非仅匹配关键词,显著提升搜索相关性。

weixin_45226411的博客 684

RAG与Embedding开发实战:从零搭建企业级知识库系统

Embedding技术作为自然语言处理的核心基础,通过将文本转换为高维向量空间中的数值表示,实现了语义层面的相似度计算。其原理基于深度学习模型学习词语和句子的分布式表示,使得语义相近的内容在向量空间中距离更近。这种技术在信息检索、推荐系统等领域具有重要价值,能够有效提升搜索准确性和个性化体验。在实际应用场景中,结合RAG(检索增强生成)架构,可以解决大模型知识陈旧和专业领域知识不足的问题。通过Embedding模型将文档向量化,配合向量数据库实现精准检索,再结合大语言模型生成准确答案,这种技术组合在企业知识

weixin_34396902的博客 482

Spring AI 08 · VectorStore 抽象与 pgvector 配置

多数情况自动配置够用。VectorStore 是统一的向量 DAO,pgvector 实现只需配好数据源 + 维度 + 距离 + 索引 + 是否自动建表;建出的表就是三件套,维度对齐是第一铁律。09-写入向量数据add.md,深入 Document、metadata 与批量写入的正确姿势。

u011962508的博客 85

Spring AI实战:5分钟搞定向量存储(VectorStore)与RAG应用开发

本文为Java开发者提供了一份基于Spring AI框架的快速实战指南,详细演示了如何在5分钟内搭建向量存储(VectorStore)与RAG应用。通过Spring Boot项目初始化、核心组件EmbeddingClient与VectorStore的配置,以及完整的代码示例,帮助开发者快速实现智能问答应用的开发与部署,大幅降低AI应用的技术门槛。

code8的博客 290

DeepSeek RAG环境搭建:避开Embedding与向量库的坑

检索增强生成(RAG)是大模型知识库问答的主流架构,其核心链路包括文档加载、文本切分、向量化存储与检索。在实际落地中,Embedding模型的选择与向量数据库的配置往往比大模型接口本身更易成为瓶颈。本文以DeepSeek为例,系统讲解如何搭建最小可用的RAG环境:从Python虚拟环境、本地Embedding模型(如bge-m3)、Chroma向量库到DeepSeek API接入,并给出关键参数配置与高频踩坑清单。无论是零基础搭建本地知识库,还是快速验证工程方案,都能通过这套实践方法跑通完整链路,实现私有文

weixin_30235225的博客 343

Embedding与LLM向量区别:RAG检索为何必须用Embedding

在AI应用开发中,向量是表示文本语义的基础数据结构,其核心原理是通过模型将文本映射为高维空间中的坐标点,使语义相似度可计算。Embedding模型基于对比学习训练,专门优化语义距离度量,而LLM的隐藏层向量是生成过程的中间产物,训练目标为预测下一个token,不保证语义相似度可靠。在RAG架构中,检索环节依赖向量距离反映语义相似性,因此必须使用Embedding向量,LLM向量则适用于Agent状态表示等生成任务。Spring AI通过EmbeddingModel和ChatModel分别封装两类模型,结合V

weixin_30952479的博客 281

生信实战:用bcftools玩转VCF文件处理(从压缩到注释全流程)

本文详细介绍了使用bcftools处理VCF文件的全流程实战指南。从数据准备、压缩索引、信息提取、质量统计到核心的变异过滤与功能注释,手把手教你高效管理基因组变异数据。重点阐述了如何利用bcftools进行VCF文件注释,整合外部数据库信息,为变异位点添加关键的生物学标签,是生物信息学数据分析的必备技能。

rgv23456789的博客 341

【NLG】(六)文本生成评价指标—— ROUGE原理及代码示例

前奏: 【NLG】(一)文本生成评价指标——BLEU原理及代码示例 【NLG】(二)文本生成评价指标—— METEOR原理及代码示例 【NLG】(三)文本生成评价指标—— ENTROPY原理及代码示例 【NLG】(四)文本生成评价指标—— diversity原理及代码示例 【NLG】(五)文本生成评价指标—— kl_divergence原理及代码示例 1.ROUGE原理 2.优缺点 3.如何算ROUGE ...

凝眸伏笔的博客 1万+

第16章-RAG

RAG(检索增强生成)通过在模型回答前检索外部可信知识,将相关证据融入Prompt,使回答更准确、可追溯。它解决私有知识缺失、知识更新频繁及来源不可靠等问题,核心流程包括文档加载、切分、向量化存储与在线检索增强。关键在于严格管理权限、确保引用真实、避免幻觉,并通过评估与优化提升质量。正确实现需兼顾检索、生成、引用与安全,而非仅依赖向量库接入。

不怕万人阻挡,只怕自己投降 65

Geant4 学习笔记(一):实现multi-thread多线程

简单修改实现Geant4多线程

weixin_52417815的博客 6084

第14章-Embedding

关键词搜索依赖字面匹配,“怎么退钱”和“退款流程”可能没有相同词,却表达相近意图。Embedding 模型把文本编码为向量,使应用可以比较语义距离。Embedding 把文本映射到可计算的向量空间,是语义检索的基础。生产使用必须保持模型和维度一致,并通过真实数据评估相似度与阈值。

不怕万人阻挡,只怕自己投降 215

Python广度优先搜索BFS - 蓝桥13届省赛污染海域

请问这片N * M海域中有几块是没被污染的独立海域(没被污染的独立海域是指该块海域上下左右被已污染的海域包围,且N * M以外的海域都为已被污染的海域)有一片海域划分为N * M个方格,其中有些海域已被污染(用0表示),有些海域没被污染(用1表示)。第二行开始输入N行,每行M个数字(数字只能为1或者0,1表示没被污染的海域,0表示已被污染的海域)这块4 * 5的海域,有3块海域(绿色)没被污染,因为每一块的上下左右都被污染的海域包围。输出一个整数,表示N * M的海域中有几块是没被污染的独立海域。

m0_69865359的博客 264

tcllib2.0 package - csv

tcl lib 的csv库

shin 860

[RAG在LangChain中的实现-03]利用向量存储实现基于自然语言的相似度检索

被分割的文本切片需要转换成向量保存在`VertorStore`中,才能实现基于自然语言的相似度检索。`VectorStore`是RAG架构的核心组件。它的主要作用是存储和检索非结构化数据的“语义特征”。

JaydenAI的博客 822

VCU128开发板上手记:搞定100G以太网IP核与QSFP光模块的那些坑

本文详细介绍了在VCU128开发板上实现100G以太网IP核与QSFP光模块调试的实战经验。从硬件准备、IP核配置到QSFP模块控制信号处理,文章揭示了数据手册中未提及的关键细节,并提供了优化参数和压力测试方案,帮助开发者快速解决UltraScale+平台下的高速以太网部署难题。

weixin_30740295的博客 520

Gel 的 ext::vectorstore 扩展:基于 pgvector 的向量存储与检索实战指南

`ext::vectorstore` 是 Gel(原 EdgeDB)提供的向量存储扩展包,它在 pgvector 集成之上封装了一套简化的向量数据库工作流:预定义好常见维度的向量类型与记录基类,开箱即可用于 RAG(检索增强生成)等 AI 应用场景。读完本文,你将掌握如何安装并启用该扩展、理解其预置的向量类型与记录结构,以及如何配合 Gel AI 的 Python 绑定完成向量写入、检索与元数据过

gitblog_00476的博客 718

VECTOR硬件VN1600系列对比:VN1610、VN1611、VN1630A、VN1640A、VN1630log、VN1670

VN16系列说不清道不明的区别和关系

AmorRun的博客 2万+

【项目实战】TARA威胁分析和风险评估

TARA是信息安全领域中的一种风险评估方法,在汽车信息安全的上下文中,TARA分析特别重要,因为它可以帮助识别和管理与智能网联车辆相关的各种威胁,包括数据泄露、未经授权的访问、远程操控等。通过TARA分析,企业可以制定出针对性的安全目标、产品要求和产品安全声明,以确保汽车及其零部件符合相关的信息安全标准和法规。此外,TARA分析还可以与数字化建模系统结合,以更系统化和高效的方式进行风险评估和管理。

奶爸的编程之路,也就一周冷个三天 2710

手写完 RAG 之后,我终于看懂了 LangChain

本文通过手写最小RAG流程,对比LangChain组件化设计,详解其在文档加载、切分、向量化、检索与问答链中的作用。强调LangChain本质是统一AI应用组件规范,而非创新原理。结合TextLoader、RecursiveSplitter、HuggingFaceEmbeddings、Chroma向量库与Retriever、Chain等模块,演示如何构建可维护、可扩展的本地知识库问答系统,并提醒注意模型迁移与数据去重问题。

MMF博客园 458

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

中文Embedding模型技术选型指南:Dmeta-embedding-zh深度解析

在当今人工智能驱动的中文自然语言处理应用中,选择合适的**中文Embedding模型**对于构建高效的语义搜索、智能问答和RAG系统至关重要。Dmeta-embedding-zh作为一款专为中文优化的开源Embedding模型,在MTEB中文评测榜单上取得了优异的成绩,为技术决策者提供了新的选择。本文将深入分析该模型的技术架构、性能表现及实际应用价值,帮助您做出明智的技术选型决策。 ## 🔍

gitblog_00166的博客 1062

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Spring AI Alibaba 向量(VectorStore)

Spring AI Alibaba VectorStore 是 Spring AI 生态中用于向量数据库交互的核心组件,支持多种国产嵌入模型和主流向量数据库(如阿里云DashScope、Milvus等)。它提供统一API实现文档的存储、检索和管理,是检索增强生成(RAG)技术的关键基础设施。开发者可通过简单配置快速集成,利用相似度搜索和元数据过滤功能高效处理向量数据,适用于企业级AI应用开发。

GZ_TOGOGO的博客 322

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

RAG实战指南:从零搭建检索增强生成系统,详解Embedding与微调

检索增强生成(RAG)是一种将信息检索与大型语言模型生成能力相结合的技术架构,旨在解决大模型在处理私有或领域知识时存在的“幻觉”与知识更新滞后问题。其核心原理是通过Embedding模型将文档转换为向量表示并存入向量数据库,在用户提问时进行语义检索,并将相关上下文与大模型结合以生成有依据的答案。该技术能显著提升问答系统的准确性与可信度,广泛应用于企业知识库、智能客服、文档分析等场景。本文聚焦于RAG系统的实战搭建,深入探讨了Embedding模型的选择与微调策略,并提供了从环境配置、流程拆解到效果评估的完整

weixin_30550081的博客 327

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 224
上一篇: 第 9 章 · Model Context Protocol(MCP)
下一篇: 第 11 章 · 知识图谱 GraphRAG
AI深栈
博客等级 码龄14年 1粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值