:向量库选型 + SpringAI RAG 实现)
学习时整理如有错误欢迎指正。注本笔记只做入门作用代码仅为demo演示未作架构 及业务处理可能存在漏洞隐患向量数据库向量数据库的主要作用有两个存储向量数据基于相似度检索数据SpringAI支持很多向量数据库并且都进行了封装可以用统一的API去访问Azure Vector Search - The Azure vector store.Apache Cassandra - The Apache Cassandra vector store.Chroma Vector Store - The Chroma vector store.Elasticsearch Vector Store - The Elasticsearch vector store.GemFire Vector Store - The GemFire vector store.MariaDB Vector Store - The MariaDB vector store.Milvus Vector Store - The Milvus vector store.MongoDB Atlas Vector Store - The MongoDB Atlas vector store.Neo4j Vector Store - The Neo4j vector store.OpenSearch Vector Store - The OpenSearch vector store.Oracle Vector Store - The Oracle Database vector store.PgVector Store - The PostgreSQL/PGVector vector store.Pinecone Vector Store - PineCone vector store.Qdrant Vector Store - Qdrant vector store.Redis Vector Store - The Redis vector store.SAP Hana Vector Store - The SAP HANA vector store.Typesense Vector Store - The Typesense vector store.Weaviate Vector Store - The Weaviate vector store.SimpleVectorStore - A simple implementation of persistent vector storage, good for educational purposes.这些库都实现了统一的接口VectorStore因此操作方式一模一样不过除了最后一个库以外其它所有向量数据库都是需要安装部署的每个企业用的向量库都不一样向量数据库选型向量数据库选型不存在绝对最优解核心原则是结合自身业务特征在性能、运维成本、扩展性与技术生态之间找到平衡。其核心价值是支撑高维向量的高效相似度检索是 RAG 系统的核心基础组件。选型核心关注维度部署复杂度核心考量上手门槛与长期维护成本。轻量型方案如 Chroma可直接嵌入应用无需独立部署适合开发原型阶段快速验证。分布式架构方案如 Milvus需容器化部署与专业运维能力对团队 Kubernetes、云部署能力有要求。部署复杂度越高后期人力与资源维护成本越高选型需与团队技术能力匹配。检索性能向量数据库的核心硬指标直接决定用户体验与硬件成本。核心衡量维度查询延迟单次检索响应速度、吞吐量并发处理能力。需同步关注资源消耗尤其是内存占用 —— 绝大多数向量索引需要常驻内存性能上限与硬件成本直接挂钩。可扩展性决定了系统应对数据增长的能力分为两个方向垂直扩展通过提升单机硬件性能扩容。水平扩展通过分布式集群节点扩容。数据量持续增长的业务优先选择原生分布式架构的数据库中小规模、数据量稳定的项目轻量方案性价比更高。集成便利性企业场景中集成成本往往比极致性能更重要。优先复用现有技术栈已有 PostgreSQL 可直接使用 pgvector 扩展已有 Elasticsearch 可直接叠加向量能力。避免为单一向量功能引入全新技术栈是生产选型中非常务实的原则。高级特性是产品从 “能用” 到 “好用” 的分水岭直接决定复杂业务的适配能力。生产环境刚需能力元数据过滤缺失该功能基本可以排除生产使用。进阶能力混合检索、向量更新、版本管理、复杂过滤表达式。社区活跃度代表产品的长期生命力与风险可控性。活跃的开源社区意味着持续的功能迭代、稳定的 bug 修复与丰富的学习资料。成熟度高、经过大规模场景验证的产品长期稳定性远优于新兴工具。主流向量数据库详解pgvector定位PostgreSQL 的扩展插件为传统关系型数据库赋予向量存储与检索能力仅需执行CREATE EXTENSION vector;即可启用。核心优势无需引入新数据库完全复用 PostgreSQL 技术栈支持关系数据与向量数据同库事务查询数据一致性强。局限与适用场景性能与扩展性弱于原生向量数据库适合已有 PG 生态、数据量中等的业务是最低成本落地向量检索的方案。Chroma定位专为 AI 应用快速集成设计的轻量级向量数据库API 极简主打开箱即用。核心优势上手成本极低几行代码即可本地运行支持纯内存运行提供持久化能力与基础元数据过滤面向 RAG 场景与开发者优化。局限与适用场景不支持高并发与大规模数据无分布式能力与复杂索引适合教学实验、个人项目、小型原型与 Demo 开发。Milvus定位云原生分布式开源向量数据库面向海量向量检索场景设计是目前最成熟的开源向量数据库方案之一。核心优势面向亿级以上向量数据设计原生支持分布式存储与计算水平扩展能力强支持 HNSW、IVF 等多种索引类型兼容单机与集群部署提供 Python、Java、Go 等多语言 SDK生态完善原生支持混合检索2.5 版本后支持全文检索BM25 向量检索的组合模式。局限与适用场景部署运维复杂度高对硬件与内存要求高适合中大型 RAG 系统、推荐系统、多媒体检索等高性能、大规模场景。Qdrant定位开源高性能向量数据库基于 Rust 语言实现主打性能、易用性与 RESTful API 设计。核心优势高效 HNSW 索引与向量压缩能力内存管理效率优异部署灵活支持单机、Docker、Kubernetes 多种部署方式高性能元数据过滤复杂过滤条件对查询性能影响极小。局限与适用场景分布式能力弱于 Milvus社区生态规模稍小但增长迅速适合追求性能与简洁度平衡的团队覆盖小到中等规模项目。Elasticsearch定位并非原生向量数据库从 8.x 版本开始支持dense_vector向量字段可实现关键词 向量的混合检索。核心优势全文检索能力成熟支持结构化、全文、向量三种检索能力融合企业中部署普及率极高可直接复用现有 ES 集群集成成本极低。局限与适用场景纯向量检索性能低于 Milvus、Qdrant 等原生向量库整体架构偏重纯向量场景引入成本过高适合企业已有 ES 集群、需要快速叠加语义检索能力、主打混合检索的场景。索引构建流程概述索引构建流程与ETL类似ETL 是Extract抽取、Transform转换、Load加载的缩写是数据领域经典的流水线处理模型原本用于数据仓库的数据加工在 RAG 知识库场景中ETL 就是从原始文档到可检索的向量数据的完整加工链路之前的文档读取、清洗、元数据增强、文本分片都属于 ETL 的不同环节。ETL 流程在springai中文档中类比了etlDocumentReader 文档阅读器Provides a source of documents from diverse origins.提供了来自不同来源的文档资源。publicinterfaceDocumentReaderextendsSupplierListDocument{defaultListDocumentread(){returnget();}}DocumentTransformer 文档转换器Transforms a batch of documents as part of the processing workflow.作为处理工作流程的一部分对一批文档进行转换处理。publicinterfaceDocumentTransformerextendsFunctionListDocument,ListDocument{defaultListDocumenttransform(ListDocumenttransform){returnapply(transform);}}DocumentWriter 文档撰写器Manages the final stage of the ETL process, preparing documents for storage.负责 ETL 流程的最后阶段工作负责将文档准备妥当以便存储。publicinterfaceDocumentWriterextendsConsumerListDocument{defaultvoidwrite(ListDocumentdocuments){accept(documents);}}ETL 接口在DocumentReader中提供的就是我们阅读文档的各种工具在DocumentTransformer中对于元数据标准化与增强组件一、ContentFormatTransformer内容格式转换器核心定位解决多源文档元数据异构的问题将不同来源文档的元数据统一为标准键值对格式是元数据检索的前置基础。解决的痛点不同格式的文档提取出的元数据键名不统一例如PDF 合同作者字段为author日期字段为dateWord 报告作者字段为Author日期字段为CreatedMarkdown 文档作者字段为creator日期字段为timestamp字段命名不统一会导致后续无法通过统一条件做元数据过滤检索无法实现「按作者筛选」「按日期范围筛选」这类业务能力。核心能力通过字段映射规则将异构的元数据键名归一化为统一标准字段确保所有文档元数据结构一致为后续统一过滤、检索、处理提供标准化基础。二、KeywordMetadataEnricher关键词元数据增强器核心定位基于大语言模型的元数据增强组件自动为文档补充关键词标签。核心逻辑调用大模型分析文档正文的核心语义自动提取出文档的核心关键词将结果写入文档元数据的keywords字段中。业务价值提升检索效果关键词可参与混合检索配合向量检索实现「语义 关键词」双重匹配提升召回精准度。支撑过滤能力可基于关键词做标签化筛选实现按主题、领域快速过滤文档。优化结果展示检索结果页可直接展示关键词帮助用户快速判断文档相关性。三、SummaryMetadataEnricher摘要元数据增强器核心定位基于大语言模型的元数据增强组件自动为文档生成内容摘要。核心逻辑调用大模型对文档全文做语义压缩与摘要总结生成精简的内容概述将结果写入文档元数据的summary字段中。业务价值优化长文档召回长文档正文语义分散向量匹配时容易出现信号稀释摘要语义高度聚焦参与检索可提升长文档的召回命中率。提升用户体验检索结果可直接展示摘要用户无需点开全文即可快速了解文档核心内容。辅助分级检索可实现「先匹配摘要粗筛再匹配正文精排」的两级检索策略平衡性能与精度。各种transformerspilliterenricher在documentwritter中就是我们各种向量数据库的存储springai中实现检索增强ResourceresourcenewFileSystemResource(...pdf);// 1.创建PDF的读取器PagePdfDocumentReaderreadernewPagePdfDocumentReader(resource,// 文件源PdfDocumentReaderConfig.builder().withPageExtractedTextFormatter(ExtractedTextFormatter.defaults()).withPagesPerDocument(1)// 每1页PDF作为一个Document.build());// 2.读取PDF文档拆分为Document并加上元数据的名字ListDocumentdocumentsreader.read();documents.forEach(document-{document.getMetadata().put(file_name,图解mysql.pdf);});// 3.写入向量库vectorStore.add(documents);// 4、构建RAG提示词模板StringpromptTemplate 请基于以下提供的参考文档内容回答用户的问题。 如果参考文档中没有相关信息请直接说明没有找到相关信息不要编造内容。 参考文档: {question_answer_context} 用户问题: {query} ;ChatClientchatClientChatClient.builder(chatModel).defaultSystem(请根据提供的上下文回答问题不要自己猜测。).defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build(),QuestionAnswerAdvisor.builder(vectorStore).searchRequest(SearchRequest.builder().topK(1).similarityThreshold(0.6).filterExpression(file_name 图解MySQL.pdf).build()).promptTemplate(newPromptTemplate(promptTemplate)).build()).build();System.out.println(chatClient.prompt(MySQL 是怎么加⾏级锁的).call().content());}文档处理选型对比维度Spring AIAlibabaLangChain4J文档读取读取到内存中1. 本地文件格式Office 文档、PDF、Markdown、JSON 等2. 云存储服务腾讯云 COS、阿里云 OSS 等3. 数据库MySQL、MongoDB、SQLite、Elasticsearch 等4. 在线平台GitHub、GitLab、语雀、Notion、Bilibili、YouTube 等5. 其他数据源邮件、归档文件等支持 Amazon S3、Azure Blob、Google Cloud Storage、本地文件格式、Github、Selenium、COS、URL 等数据源文档解析转成 Document 对象1. 通用文档格式PDF、Markdown、YAML、HTML 等 2. 办公文档通过 Tika 支持多种 Office 格式 3. 多模态内容图像 OCR、语音转文字4. 特殊格式BibTeX、PDF 表格等5. 批量处理目录解析提供多种专用解析器TextDocumentParser、ApacheTikaDocumentParser、ApachePoiDocumentParser、ApachePdfBoxDocumentParser、MarkdownDocumentParser、YamlDocumentParser文本分段1. TokenTextSplitter按照固定长度分段 2. SentenceSplitter按照语义分段 3. RecursiveCharacterTextSplitter递归分段提供多种分割策略 DocumentByParagraphSplitter按段落分割、DocumentByLineSplitter按行分割、DocumentBySentenceSplitter按句子语义分割、DocumentByWordSplitter按单词分割、DocumentByCharacterSplitter按字符分割、DocumentByRegexSplitter按正则分割、DocumentSplitters.recursive递归分割文档清洗HtmlToTextDocumentTransformer将 HTML 内容转成纯文本对于正常的文本格式选择langchain4j可以利用其良好且灵活的分片功能对于多样的文本格式可以使用springai配合自定义的分片功能