| 向量存储 | 索引类型 | 最低版本 | 最佳用途 |
|---|---|---|---|
CouchbaseQueryVectorStore | Hyperscale 向量索引 或 复合向量索引 | Couchbase Server 8.0+ | 大规模纯向量搜索或结合向量相似性与标量过滤器的搜索 |
CouchbaseSearchVectorStore | 搜索向量索引 | Couchbase Server 7.6+ | 结合向量相似性与全文搜索 (FTS) 和地理空间搜索的混合搜索 |
设置
要访问 Couchbase 向量存储,您首先需要安装langchain-couchbase 合作伙伴包:
凭据
访问 Couchbase 网站 并创建一个新连接,确保保存您的数据库用户名和密码。 您还需要一个用于嵌入的 OpenAI API 密钥。从 OpenAI 获取一个。创建 Couchbase 连接对象
我们首先创建一个到 Couchbase 集群的连接,然后将集群对象传递给向量存储。 在这里,我们使用上面的用户名和密码进行连接。您也可以使用任何其他支持的方式连接到您的集群。 有关连接到 Couchbase 集群的更多信息,请查看 文档。CouchbaseQueryVectorStore
CouchbaseQueryVectorStore 支持使用查询和索引服务在 Couchbase 中进行向量搜索。它支持两种不同类型的向量索引:
- Hyperscale 向量索引 - 针对大规模数据集(数十亿文档)的纯向量搜索进行了优化。最适合内容发现、推荐以及需要高精度和低内存占用的应用。Hyperscale 向量索引同时比较向量和标量值。
- 复合向量索引 - 将全局二级索引 (GSI) 与向量列相结合。非常适合结合向量相似性与标量过滤器的搜索,其中标量过滤器会过滤掉数据集的大部分。复合向量索引首先应用标量过滤器,然后在过滤后的结果上执行向量搜索。
初始化
下面,我们使用集群信息和距离度量创建向量存储对象。 首先,设置嵌入(如果尚未设置):距离策略
CouchbaseQueryVectorStore 通过 DistanceStrategy 枚举支持以下距离策略:
| 策略 | 描述 |
|---|---|
DistanceStrategy.DOT | 点积相似性 |
DistanceStrategy.COSINE | 余弦相似性 |
DistanceStrategy.EUCLIDEAN | 欧几里得距离(等同于 L2) |
DistanceStrategy.EUCLIDEAN_SQUARED | 平方欧几里得距离(等同于 L2_SQUARED) |
指定文本和嵌入字段
您可以选择使用text_key 和 embedding_key 字段为文档指定文本和嵌入字段。
管理向量存储
创建向量存储后,我们可以通过添加和删除不同项来与之交互。 向向量存储添加项 我们可以使用add_documents 函数向向量存储添加项。
create_index() 方法以启用高效的向量搜索。
查询向量存储
相似性搜索 执行简单的相似性搜索如下所示:where_str 参数过滤结果:
similarity_search_with_score 方法获取结果的距离分数。距离越小表示文档越相似。
异步操作
CouchbaseQueryVectorStore 支持异步操作:
用作检索器
您可以将向量存储转换为检索器:从文本创建
您可以直接从文本列表创建CouchbaseQueryVectorStore:
CouchbaseSearchVectorStore
CouchbaseSearchVectorStore 支持使用 搜索向量索引 在 Couchbase 中进行向量搜索。搜索向量索引将 Couchbase 搜索索引与向量列相结合,允许结合向量搜索与全文搜索 (FTS) 和地理空间搜索的混合搜索。
要求: Couchbase Server 版本 7.6 及以上。
有关如何创建支持向量字段的搜索索引的详细信息,请参阅文档:
本教程的搜索索引字段映射
要遵循本文档中的示例,您的搜索索引应包含以下字段的映射:| 字段 | 类型 | 描述 |
|---|---|---|
text | text | 文档文本内容 |
embedding | vector | 向量嵌入字段(维度:text-embedding-3-large 为 3072) |
metadata | object (子映射) | 包含子字段(如 source、author、rating、date)的元数据对象 |
- 向量字段维度必须与您的嵌入模型匹配(本教程中使用的
text-embedding-3-large为 3072) - 元数据子字段(
source、author、rating、date)是混合查询示例所必需的 - 您可以在初始化向量存储时使用
text_key和embedding_key参数自定义字段名称
初始化
下面,我们使用集群信息和搜索索引名称创建向量存储对象。 首先,设置嵌入:指定文本和嵌入字段
您可以选择使用text_key 和 embedding_key 字段为文档指定文本和嵌入字段。
管理向量存储
创建向量存储后,我们可以通过添加和删除不同项来与之交互。 向向量存储添加项 我们可以使用add_documents 函数向向量存储添加项。
查询向量存储
创建向量存储并添加相关文档后,您很可能希望在运行链或代理时查询它。 相似性搜索 执行简单的相似性搜索如下所示:similarity_search_with_score 方法获取结果的分数。
过滤结果
您可以通过指定文档中文本或元数据的任何过滤器来过滤搜索结果,这些过滤器由 Couchbase 搜索服务支持。filter 可以是 Couchbase Python SDK 支持的任何有效的 SearchQuery。这些过滤器在执行向量搜索之前应用。
如果您想根据元数据中的某个字段进行过滤,需要使用 . 指定它。
例如,要获取元数据中的 source 字段,您需要指定 metadata.source。
请注意,过滤器需要由搜索索引支持。
指定要返回的字段
您可以使用搜索中的fields 参数指定要从文档返回的字段。这些字段作为返回文档的 metadata 对象的一部分返回。您可以获取存储在搜索索引中的任何字段。文档的 text_key 作为文档 page_content 的一部分返回。
如果您不指定要获取的字段,则会返回索引中存储的所有字段。
如果您想获取元数据中的某个字段,需要使用 . 指定它。
例如,要获取元数据中的 source 字段,您需要指定 metadata.source。
通过转换为检索器进行查询
您还可以将向量存储转换为检索器,以便在链中更轻松地使用。 以下是如何将向量存储转换为检索器,然后使用简单查询和过滤器调用检索器。混合查询
Couchbase 允许您通过将向量搜索结果与文档的非向量字段(如metadata 对象)的搜索相结合来进行混合搜索。
结果将基于向量搜索和搜索服务支持的搜索的结果组合。每个组件搜索的分数相加得到结果的总分。
要执行混合搜索,有一个可选参数 search_options 可以传递给所有相似性搜索。
您可以在 Couchbase 搜索请求参数文档 中找到 search_options 的不同搜索/查询可能性。
为混合搜索创建多样化的元数据
为了演示混合搜索,让我们创建具有多样化元数据的文档。我们向元数据添加三个字段:date 在 2010 年和 2020 年之间,rating 在 1 到 5 之间,author 设置为 John Doe 或 Jane Doe。
metadata 对象中的 author)的精确匹配。
metadata.date)上日期范围查询内的文档。
metadata.rating)范围内的文档。
filter 参数代替混合搜索。
将混合搜索查询与过滤器结合
混合搜索可以与过滤器结合使用,以获得混合搜索和过滤器的最佳效果,以匹配要求的结果。
在此示例中,我们检查评分在 3 到 5 之间且文本字段中匹配字符串 “market” 的文档。
search_options 参数中使用任何支持的查询方法,如地理距离、多边形搜索、通配符、正则表达式等。请参阅文档以获取有关可用查询方法及其语法的更多详细信息。
用于检索增强生成的用法
有关如何将这些向量存储用于检索增强生成 (RAG) 的指南,请参阅以下部分:常见问题
问题:我应该在创建 CouchbaseSearchVectorStore 对象之前创建搜索索引吗?
是的,您需要在创建CouchbaseSearchVectorStore 对象之前创建搜索索引。
问题:我应该在向 CouchbaseQueryVectorStore 添加文档之前还是之后创建索引?
对于CouchbaseQueryVectorStore,您应该在添加文档后使用 create_index() 方法创建索引。这与 CouchbaseSearchVectorStore 不同。
问题:CouchbaseSearchVectorStore 和 CouchbaseQueryVectorStore 有什么区别?
| 功能 | CouchbaseSearchVectorStore | CouchbaseQueryVectorStore |
|---|---|---|
| 最低版本 | Couchbase Server 7.6+ | Couchbase Server 8.0+ |
| 索引类型 | 搜索向量索引 | Hyperscale 或复合向量索引 |
| 索引创建 | 在向量存储创建之前 | 在添加文档之后 |
| 过滤 | SearchQuery 对象 | SQL++ WHERE 子句 (where_str) |
| 最佳用途 | 混合搜索(向量 + FTS + 地理) | 大规模纯向量搜索或向量 + 标量过滤器 |
问题:我看不到搜索结果中指定的所有字段
在 Couchbase 中,我们只能返回存储在搜索索引中的字段。请确保您尝试在搜索结果中访问的字段是搜索索引的一部分。 处理此问题的一种方法是在索引中动态索引和存储文档的字段。- 在 Capella 中,您需要转到“高级模式”,然后在“常规设置”下拉菜单下,选中“[X] 存储动态字段”或“[X] 索引动态字段”
- 在 Couchbase Server 中,在索引编辑器(非快速编辑器)中,在“高级”下拉菜单下,选中“[X] 存储动态字段”或“[X] 索引动态字段”
问题:我无法在搜索结果中看到元数据对象
这很可能是由于文档中的metadata 字段未被 Couchbase 搜索索引索引和/或存储。为了在文档中索引 metadata 字段,您需要将其作为子映射添加到索引中。
如果您选择映射映射中的所有字段,您将能够按所有元数据字段进行搜索。或者,为了优化索引,您可以选择 metadata 对象内的特定字段进行索引。您可以参考 文档 了解有关索引子映射的更多信息。
创建子映射:
问题:过滤器和 search_options / 混合查询有什么区别?
过滤器是 预过滤器,用于限制在搜索索引中搜索的文档。它在 Couchbase Server 7.6.4 及更高版本中可用。 混合查询是可用于调整从搜索索引返回的结果的附加搜索查询。 过滤器和混合搜索查询具有相同的功能,但语法略有不同。过滤器是 SearchQuery 对象,而混合搜索查询是 字典。API 参考
有关所有功能和配置的详细文档:通过 MCP 将这些文档连接到 Claude、VSCode 等 以获取实时答案。

