@langchain/redis 包提供了两种实现方式:FluentRedisVectorStore(推荐,支持高级过滤)和 RedisVectorStore(遗留方案)。
概述
集成细节
设置
要使用 Redis 向量存储,请设置一个已启用 RediSearch 的 Redis Stack 实例,并安装@langchain/redis 和 @langchain/core。当您将自定义的 createClient 实例传递给 RedisVectorStore 时,请安装 redis Node.js 客户端。
本指南以 OpenAI 嵌入 为例。您也可以使用 其他支持的嵌入模型。
凭证
设置REDIS_URL 环境变量:
实例化
管理向量存储
向向量存储添加项
查询向量存储
在您的链或智能体运行期间,一旦创建了向量存储并添加了相关文档,您很可能需要对其进行查询。直接查询
执行简单的相似度搜索如下:将其转换为检索器进行查询
您还可以将向量存储转换为 检索器,以便在您的链中更方便地使用。用于检索增强生成
有关如何使用此向量存储进行检索增强生成(RAG)的指南,请参阅以下部分:删除文档
您可以通过两种方式从向量存储中删除文档:删除所有文档
您可以使用以下命令删除整个索引及其所有文档:通过 ID 删除特定文档
您还可以通过提供其 ID 来删除特定文档。请注意,配置的键前缀将自动添加到您提供的 ID:关闭连接
完成操作后,请确保关闭客户端连接,以避免过度消耗资源:高级功能
使用 Redis 向量存储进行高级预过滤
@langchain/redis 包提供了两种向量存储实现:
FluentRedisVectorStore(推荐):新的实现,具有类型安全的流畅过滤 API、基于数组的customSchema、GEO 字段和时间戳过滤RedisVectorStore(遗留方案):原始实现,具有基于对象的模式和基本过滤功能
我应该使用哪一个?对于新项目或在需要以下功能时,请使用
FluentRedisVectorStore:- 使用类型安全的流畅 API 进行高级过滤(
Tag、Num、Text、Geo、Timestamp过滤器) - 地理查询
- 时间戳/日期过滤
- 具有与/或逻辑的复杂过滤组合
- 更清洁的基于数组的模式定义
RedisVectorStore:- 需要向后兼容的现有项目
- 无需高级过滤需求的简单用例
使用 FluentRedisVectorStore
FluentRedisVectorStore 提供了一个现代、类型安全的 API,用于高级元数据过滤。
使用 FluentRedisVectorStore 定义模式:
customSchema 是必需的;推理仅用于验证:FluentRedisVectorStore 需要一个 customSchema。当您使用文档创建索引时,它还会从文档元数据中推断模式,并在推断的模式与您的 customSchema 不同时记录警告。用于此比较的推理规则:- “经度,纬度” 格式的字符串(例如,
"-122.4194,37.7749")→ GEO 字段 - 数字或日期对象 → NUMERIC 字段
- 任何类型的数组 → TAG 字段
- 所有其他类型 → TEXT 字段
sortable、weight 或 caseSensitive 等选项。使用 RedisVectorStore(遗留方案)
原始RedisVectorStore 使用基于对象的模式格式:
模式字段类型
FluentRedisVectorStore 支持四种模式字段类型:- TEXT:支持可选词干处理、加权排序的全文可搜索字段
- TAG:用于精确匹配的分类字段,支持多个值和自定义分隔符
- NUMERIC:支持范围查询和排序的数字字段。用于时间戳(存储 Unix 纪元秒;
Date值将自动转换) - GEO:用于基于位置查询的地理坐标字段(存储为
[longitude, latitude])
Timestamp() 过滤器辅助函数针对 numeric 时间戳字段。
RedisVectorStore(遗留方案)支持三种字段类型:
- TEXT:全文可搜索字段
- TAG:用于精确匹配的分类字段
- NUMERIC:支持范围查询的数字字段
字段配置选项
FluentRedisVectorStore(基于数组的模式):name: 字段名称(必填)type: 字段类型 -"text"、"tag"、"numeric"或"geo"(必填)options: 可选配置对象:sortable: 在此字段上启用排序(布尔值)separator: 对于 TAG 字段,指定多个值的分隔符(字符串,默认:”,”)caseSensitive: 对于 TAG 字段,启用区分大小写的匹配(布尔值)noStem: 对于 TEXT 字段,禁用词干提取(布尔值)weight: 对于 TEXT 字段,指定搜索权重(数字,默认:1.0)
required: 字段是否必须存在于元数据中(默认:false)SORTABLE: 在此字段上启用排序(默认:undefined)SEPARATOR: 对于 TAG 字段,指定多个值的分隔符(默认:”,”)CASESENSITIVE: 对于 TAG 字段,启用区分大小写的匹配(Redis 需要true,而不是布尔值)NOSTEM: 对于 TEXT 字段,禁用词干提取(Redis 需要true,而不是布尔值)WEIGHT: 对于 TEXT 字段,指定搜索权重(默认:1.0)
带模式验证的文档添加
在使用RedisVectorStore 或 FluentRedisVectorStore 时,如果创建了索引,则在添加文档时,会将其元数据与提供的自定义模式进行比较。
FluentRedisVectorStore (基于数组的模式):
如果定义的模式与从文档中推断的元数据字段之间存在不匹配,控制台将记录警告消息:
- 将字段定义为
numeric,而您的文档包含字符串值 - 将字段定义为
geo,而您的文档未使用 “lon,lat” 字符串格式 - 模式中缺少而文档中存在的字段
- 模式定义与实际数据之间的类型不匹配
- 如果标记为 required: true 的字段缺失(未定义或 null),则抛出错误
- 如果字段类型与模式类型不匹配,则抛出错误,例如,NUMERIC 模式字段期望数字元数据字段
使用 fluent API 进行高级过滤
重要提示: fluent 过滤 API(
Tag、Num、Text、Geo、Timestamp、Custom)仅在使用 FluentRedisVectorStore 时可用。遗留的 RedisVectorStore 使用不同的过滤方法。FluentRedisVectorStore 提供了一个强大的 fluent API 用于构建复杂的元数据过滤器。此 API 支持类型安全的过滤器构建,并支持各种字段类型和逻辑操作。
导入过滤器构建器:
使用 FluentRedisVectorStore 的完整过滤示例
以下是一个全面示例,展示了使用FluentRedisVectorStore 的各种过滤功能:
使用遗留 API 进行高级过滤
遗留的RedisVectorStore 使用 similaritySearchVectorWithScoreAndMetadata 方法提供元数据过滤功能:
数值范围查询选项
对于数值字段,您可以指定各种范围查询:性能优势
使用自定义模式和 fluent 过滤 API 提供了多种性能优势:- 索引元数据字段:单独索引每个元数据字段,在向量搜索之前启用快速预过滤
- 类型优化的查询:数值、TAG、地理和文本字段使用优化的 RediSearch 查询结构
- 减少向量比较:在向量相似度计算之前应用过滤器,减少计算开销
- 更好的查询规划:Redis 可以根据字段类型和索引优化查询
- 类型安全:fluent API 提供过滤器构建的编译时类型检查
向后兼容性
RedisVectorStore 和 FluentRedisVectorStore 目前都受支持并维护。然而,RedisVectorStore 被视为遗留功能,未来可能在主要版本中弃用。使用 RedisVectorStore 的现有代码将继续正常工作,无需任何更改。
迁移注意事项:
- 保留
customSchema配置键,但将基于对象的格式切换为{ name, type, options }字段的数组 - 用 fluent 过滤表达式(
Tag、Num、Text、Geo、Timestamp、Custom)替换对象或字符串过滤器 - GEO 模式字段和
Timestamp()过滤辅助工具仅在FluentRedisVectorStore上可用 - 元数据存储不同:
FluentRedisVectorStore将元数据作为单独的字段索引,与遗留的 JSON-blob 元数据不兼容。创建新索引并重新导入文档,而不是将FluentRedisVectorStore指向现有的遗留索引
API 参考
有关所有功能和配置的详细文档:官方原文:src/oss/javascript/integrations/vectorstores/redis.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。