
一、检索相关的主要类与协作流程在 Spring AI 中向量检索Vector Search是构建 RAG检索增强生成应用的基础能力主要涉及以下核心接口/类类/接口职责说明EmbeddingModel向量化引擎负责将文本或带元数据的文档转换为向量嵌入Document数据载体表示一段待检索的文本片段不是完整的原始文件通常由 Reader 读取并分割得到VectorStore向量存储与检索的统一抽象负责向量的持久化、相似性搜索和删除操作SearchRequest封装检索参数包括查询文本、返回数量、相似度阈值、元数据过滤条件等整体协作流程原始数据 →Reader读取并切分为Document→TextSplitter可选进一步分割 →EmbeddingModel将Document向量化 → 写入VectorStore→ 检索时构造SearchRequest→ 通过VectorStore.similaritySearch获取语义相似的文档。二、核心类详解1. EmbeddingModel – 文本向量化模型Embedding 的本质是将自然语言映射到高维空间中的一个向量点。语义越接近的文本其向量在空间中的距离余弦相似度或欧氏距离也越近。EmbeddingModel接口提供了多种便捷方法public interface EmbeddingModel extends ModelEmbeddingRequest, EmbeddingResponse { EmbeddingResponse call(EmbeddingRequest request); default float[] embed(String text) { /* ... */ } float[] embed(Document document); default Listfloat[] embed(ListString texts) { /* ... */ } default Listfloat[] embed(ListDocument documents, EmbeddingOptions options, BatchingStrategy batchingStrategy) { /* ... */ } default EmbeddingResponse embedForResponse(ListString texts) { /* ... */ } default int dimensions() { return this.embed(Test String).length; } }可以直接将字符串向量化embed(String text)也可以为Document生成嵌入此时Document可携带额外元数据。调用call(EmbeddingRequest request)可获得完整的响应结果request中可指定使用的模型及参数。dimensions()返回向量维度常用于创建 VectorStore 时指定索引维度。2. Document – 文本数据载体Document是 Spring AI 中表示一段文本的最小单元结构如下public class Document { private String id; // 唯一标识 private String content; // 文本内容 private Media media; // 多模态内容可选 private MapString, Object metadata; // 元数据如来源、页码、标题等不参与向量化 private float[] embedding; // 对应的向量由 EmbeddingModel 生成 }常用 DocumentReader – 从不同数据源读取并生成 Document纯文本文件 – TextReaderTextReader reader new TextReader(classpath:data/readme.txt); ListDocument docs reader.read();PDF 文件PdfDocumentReader基于 PdfBox可指定页码范围PdfDocumentReader reader new PdfDocumentReader(classpath:data/sample.pdf); ListDocument docs reader.read();PagePdfDocumentReader按页拆分每页生成一个DocumentPagePdfDocumentReader reader new PagePdfDocumentReader(classpath:data/sample.pdf); ListDocument docs reader.read();JSON 格式 – JsonReader支持使用 JSONPath 提取指定字段作为文档内容。JsonReader reader new JsonReader(classpath:data/items.json, $.items[*].description); ListDocument docs reader.read();通用文档解析 – TikaDocumentReader支持 PDF、Word、Excel、PPT、HTML 等几乎所有常见格式。TikaDocumentReader reader new TikaDocumentReader(classpath:data/guide.docx); ListDocument docs reader.read();Markdown 文件 – MarkdownDocumentReader按标题层级、段落自动切分并将标题信息存入元数据。MarkdownDocumentReader reader new MarkdownDocumentReader(classpath:data/note.md); ListDocument docs reader.read();Reader支持格式切分方式元数据丰富度适用场景TextReader.txt 等纯文本单个文件作为一个 Document除非另行分割自动添加文件名等基础信息简单文本处理PdfDocumentReaderPDF可指定页码范围默认为整个文档包含页数、文件名等非结构化 PDF 提取PagePdfDocumentReaderPDF每页生成一个 Document自动添加页码、文件名需要按页检索 PDF 的场景JsonReaderJSON通过 JSONPath 指定字段每个匹配项为一个 Document可保留原始 JSON 键值作为元数据从 JSON 数据源提取结构化内容TikaDocumentReaderPDF、Word、Excel、PPT、HTML 等解析后整体返回可配合 TextSplitter 二次切分提取格式相关的元数据如作者、标题等多格式混合环境统一文档处理MarkdownDocumentReader.md按标题层级、段落自动切分记录标题层级、章节结构Markdown 知识库、技术文档索引文本分割器读取后的Document通常还需要进一步切分成更小的块以满足模型的 Token 限制、保持语义完整性和提高检索精度。Spring AI 提供了多种TextSplitter实现核心差异体现在分割策略、重叠设计和适用场景上。分割器分割策略重叠支持优点缺点适用场景TokenTextSplitter按 Token 数量切分基于分词器支持chunkOverlap重叠精确控制 Token 长度适配模型上下文窗口依赖分词器分割粒度较细可能割裂长句对 Token 敏感的大模型应用如 RAGCharacterTextSplitter按字符数切分支持chunkSize和chunkOverlap实现简单不依赖分词库性能高不考虑语义可能在词中断开Token 数不可控快速原型、粗略切分MarkdownTextSplitter按 Markdown 结构标题、段落切分支持段落间重叠保留文档层次结构维护语义完整性仅适用于 Markdown 格式灵活性较低Markdown 文档精细索引DocumentSplitter (基于 SpEL 表达式)自定义表达式如按 JSONPath、XML 节点等灵活配置极强的定制能力可针对结构化文档切割使用复杂度高需额外学习成本特殊数据结构如 API 文档处理选择建议通用 RAG 应用优先选择TokenTextSplitter配合chunkOverlap保留上下文衔接。对 Markdown 文档体系使用MarkdownTextSplitter可获得更优的语义保持。快速试验或性能要求高时可使用CharacterTextSplitter但需注意 Token 溢出风险。示例配置TokenTextSplitterTokenTextSplitter splitter TokenTextSplitter.builder() .withChunkSize(500) // 每块最大 Token 数 .withChunkOverlap(50) // 块之间重叠 Token 数 .build(); ListDocument chunks splitter.apply(documents);3. VectorStore – 向量存储与检索VectorStore接口统一了向量的写入、删除与检索操作public interface VectorStore extends DocumentWriter { // 添加文档 void add(ListDocument documents); // 按照ID删除 void delete(ListString idList); // 按照语义检索 default ListDocument similaritySearch(String query) { /* ... */ } // 增加参数检索 ListDocument similaritySearch(SearchRequest request); }4. SearchRequest – 检索请求封装SearchRequest用于构建语义检索条件支持设置返回数量、相似度阈值和元数据过滤。SearchRequest request SearchRequest.query(如何配置向量数据库) .withTopK(3) // 返回最相似的 3 条结果 .withSimilarityThreshold(0.75) // 相似度阈值 .withFilterExpression(author spring and year 2025);过滤表达式withFilterExpression作用于Document的metadata字段可以实现精确筛选。最终通过vectorStore.similaritySearch(request)执行检索。三、常用的 VectorStore 实现Spring AI 支持多种向量数据库均通过实现VectorStore接口与框架集成可按需选择。1. SimpleVectorStore类型纯内存存储基于Map实现特点无需外部依赖启动快适合原型开发和测试缺点数据不持久化重启即丢失示例VectorStore vectorStore new SimpleVectorStore(embeddingModel);2. PgVectorStore类型基于 PostgreSQL 的pgvector扩展特点与关系型数据库深度集成支持 ACID 事务元数据过滤可使用标准 SQL 语法适用已使用 PostgreSQL 的团队可复用现有运维能力spring: ai: vectorstore: pgvector: host: localhost port: 5432 database: vectordb username: user password: pass table-name: spring_ai_docs dimensions: 1536 # 需与 EmbeddingModel 的维度一致3. RedisVectorStore类型基于 Redis Stack 的向量相似性搜索特点低延迟、高吞吐支持 FLAT、HNSW 等索引算法适用对实时性要求高的场景如推荐系统、实时问答spring: ai: vectorstore: redis: host: localhost port: 6379 index: my-index4. ChromaVectorStore类型轻量级开源向量数据库专为 AI 应用设计特点部署简单Docker 或嵌入式提供 Web UI支持元数据过滤适用中小规模 RAG 应用追求开箱即用5. 专业向量数据库 – Milvus / Qdrant / Weaviate这三种均为高性能、分布式的专业向量数据库适合企业级大规模数据场景。产品特点适用场景Milvus分布式架构支持十亿级向量索引类型丰富大型知识库、图像搜索QdrantRust 编写高吞吐集成过滤与推荐能力高性能 RAG复杂过滤Weaviate原生支持 GraphQL内置向量化模块需要对象存储与向量结合的场景