Skip to main content
版权归属于 LangChat Team
官网:https://langchat.cn

08 - EmbeddingStore 向量存储

版本说明

本文档基于 LangChain4j 1.10.0 版本编写。

学习目标

通过本章节学习,你将能够:
  • 理解 EmbeddingStore 的作用和重要性
  • 掌握不同类型的 EmbeddingStore 实现
  • 学会基本的 CRUD 操作(增删改查)
  • 理解向量索引和搜索策略
  • 掌握持久化向量存储的方法
  • 实现一个完整的向量检索系统

前置知识

  • 完成《01 - LangChain4j 简介》章节
  • 完成《02 - 你的第一个 Chat 应用》章节
  • 完成《03 - 深入理解 ChatModel》章节
  • 完成《07 - EmbeddingModel 和向量》章节

核心概念

什么是 EmbeddingStore?

EmbeddingStore 是专门用于存储和检索 Embedding 向量的存储系统。它就像是一个专门为向量操作优化的数据库。 为什么需要 EmbeddingStore?
  1. 快速检索 - 支持高效的向量相似度搜索
  2. 元数据管理 - 除了向量,还存储文档的元数据(标题、内容、创建时间等)
  3. 大规模支持 - 可以处理百万甚至数十亿级别的向量数据
  4. 高级搜索 - 支持过滤、排序、分页等高级功能
类比理解: 如果把 Embedding 比作书籍的经纬度坐标,那么 EmbeddingStore 就像是地图索引系统,可以快速找到与查询位置最接近的所有书籍。

Embedding 接口

LangChain4j 中的 Embedding 接口表示一个存储的向量:

EmbeddingStore 接口

EmbeddingStore 提供了向量存储的核心功能:

常见的 EmbeddingStore 实现

1. InMemoryEmbeddingStore

内存中的向量存储,适合小型应用和原型开发。

2. 向量数据库集成

生产环境中,通常需要将向量存储到专门的向量数据库,如:

Milvus

Pinecone

Weaviate

向量索引和搜索策略

搜索参数

核心参数: 搜索策略:

混合搜索

结合向量搜索和传统关键词搜索:

完整示例:文档检索系统

测试代码示例

注意: 以下代码示例使用了最新的 LangChain4j API。完整的测试代码请参考 src/test/java/cn/langchat/learning/embeddingstore/EmbeddingStoreTest.java

关键 API 变化总结

完整测试示例

实践练习

练习 1:实现增量索引

实现一个支持增量索引的文档检索系统:

练习 2:实现向量缓存

实现一个向量缓存层以减少 Embedding 计算:

练习 3:实现多租户向量存储

实现一个支持多租户的向量存储系统:

总结

本章要点

  1. EmbeddingStore 的作用
    • 专门存储和检索向量
    • 支持高效的相似度搜索
    • 管理文档元数据
  2. 常用实现
    • InMemoryEmbeddingStore - 内存存储,适合小型应用
    • 向量数据库集成(Milvus、Pinecone、Weaviate 等)- 适合生产环境
  3. CRUD 操作
    • 添加(add)- 添加单个或批量嵌入
    • 查询(findRelevant)- 根据向量相似度搜索
    • 删除(removeAll)- 清空存储
  4. 搜索策略
    • 参数控制(maxResults、minScore、scoreThreshold)
    • 混合搜索(向量 + 关键词)
    • 高级过滤
  5. 实际应用
    • 文档检索系统
    • 增量索引
    • 向量缓存
    • 多租户支持

下一步

在下一章节中,我们将学习:
  • Tool 工具调用基础
  • 如何定义和创建自定义工具
  • 工具参数和返回值
  • 工具执行和错误处理

常见问题

Q1:InMemoryEmbeddingStore 什么时候够用? A:
  • 开发和测试阶段
  • 小型应用(文档数 < 10,000)
  • 原型验证
  • 数据量不大的场景
Q2:如何选择向量数据库? A:考虑以下因素:
  • 数据量:小数据用内存,大数据用向量数据库
  • 性能要求:高并发场景需要专业数据库
  • 成本考虑:开源 vs 商业方案
  • 功能需求:特定功能(如元数据过滤、分页等)
Q3:向量搜索的时间复杂度是多少? A:
  • 线性搜索:O(N),其中 N 是向量数量
  • 带索引的搜索:O(log N)
  • 近似最近邻(ANN)算法:O(1) 或 O(log N),但可能牺牲一定精度
Q4:如何提高向量搜索的性能? A:
  • 使用专业的向量数据库(如 Milvus、Pinecone)
  • 启用索引(HNSW、IVF 等)
  • 批量处理
  • 缓存查询结果
  • 设置合适的参数(maxResults、minScore)
Q5:如何处理向量更新? A:
  • 重新生成并替换旧向量
  • 使用版本控制避免并发问题
  • 实现增量更新策略
  • 考虑使用软删除(标记而非物理删除)

参考资料


版权归属于 LangChat Team
官网:https://langchat.cn