PGVectorStore 是一个使用 postgres 作为后端的 LangChain 向量存储实现。
本笔记本介绍如何使用 PGVectorStore API。
代码位于一个名为 langchain-postgres 的集成包中。
设置
此包需要一个启用了pgvector 扩展的 PostgreSQL 数据库。
您可以运行以下命令来启动一个启用了 pgvector 的 Postgres 实例容器:
安装
安装集成库langchain-postgres。
设置您的 Postgres 值
设置您的 Postgres 值,以便针对 Postgres 实例测试本笔记本中的功能。初始化
PGEngine 连接池
建立 PostgreSQL 作为向量存储的要求和参数之一是PGEngine 对象。PGEngine 配置了与 Postgres 数据库的共享连接池。这是管理连接数量并通过缓存数据库连接减少延迟的行业最佳实践。
PGVectorStore 可以与 asyncpg 和 psycopg3 驱动程序一起使用。
要使用 PGEngine.from_connection_string() 创建 PGEngine,您需要提供:
url:使用postgresql+asyncpg驱动程序的连接字符串。
PGEngine.from_engine() 创建 PGEngine,您需要提供:
engine:一个AsyncEngine对象
初始化表
PGVectorStore 类需要一个数据库表。PGEngine 引擎有一个辅助方法 ainit_vectorstore_table(),可用于为您创建具有适当模式的表。
有关自定义模式,请参阅创建自定义向量存储或使用现有表创建向量存储。
可选提示:💡
您还可以通过在传递table_name 的任何地方传递 schema_name 来指定模式名称。例如:
创建嵌入类实例
您可以使用任何 LangChain 嵌入模型。初始化默认 PGVectorStore
使用默认表模式连接到向量存储。 有关自定义模式,请参阅创建自定义向量存储或使用现有表创建向量存储。管理向量存储
添加文档
将文档添加到向量存储。元数据存储在 JSON 列中,有关存储用于过滤的元数据,请参阅“创建自定义向量存储”。添加文本
如果未结构化为 Document,可直接将文本添加到向量存储。删除文档
可以使用 id 删除文档。查询向量存储
搜索文档
使用自然语言查询搜索相似文档。按向量搜索文档
使用向量嵌入搜索相似文档。添加索引
通过应用向量索引加速向量搜索查询。了解更多关于向量索引的信息。 如果未提供名称,索引将使用默认索引名称。要添加多个索引,需要不同的索引名称。重新索引
使用存储在索引表中的数据重建索引,替换旧的索引副本。某些索引类型在添加大量新数据后可能需要重新索引。删除索引
移除向量索引。创建自定义向量存储
使用特殊列名或自定义元数据列自定义向量存储。ainit_vectorstore_table
- 使用字段
content_column、embedding_column、metadata_columns、metadata_json_column、id_column重命名列。 - 使用
Column类创建自定义 id 或元数据列。Column 由名称和数据类型定义。可以使用任何 Postgres 数据类型。 - 使用
store_metadata创建 JSON 列以存储额外的元数据。
可选提示:💡
要使用非 uuid id,您必须自定义 id 列:PGVectorStore
- 使用字段
content_column、embedding_column、metadata_columns、metadata_json_column、id_column重命名列。 ignore_metadata_columns忽略不应用于 Document 元数据的列。当使用预先存在的表且并非所有数据列都必要时,这很有帮助。- 使用不同的
distance_strategy进行向量搜索期间的相似度计算。 - 使用
index_query_options在向量搜索期间调整本地索引参数。
使用元数据过滤器搜索文档
向量存储可以利用关系数据来过滤相似性搜索。向量存储支持一组可以应用于文档元数据字段的过滤器。有关如何迁移到使用元数据列的详细信息,请参阅迁移指南。PGVectorStore 目前支持以下运算符和所有 Postgres 数据类型。
| 运算符 | 含义/类别 |
|---|---|
| $eq | 等于 (==) |
| $ne | 不等于 (!=) |
| $lt | 小于 (<) |
| $lte | 小于或等于 (<=) |
| $gt | 大于 (>) |
| $gte | 大于或等于 (>=) |
| $in | 特殊情况 (in) |
| $nin | 特殊情况 (not in) |
| $between | 特殊情况 (between) |
| $exists | 特殊情况 (is null) |
| $like | 文本 (like) |
| $ilike | 文本 (不区分大小写的 like) |
| $and | 逻辑 (and) |
| $or | 逻辑 (or) |
使用现有表创建向量存储
可以在现有表上构建向量存储。 假设 PG 数据库中有一个预先存在的表:products,它存储电子商务企业的商品详情。

