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(),可用于为您创建具有正确模式的表。
有关自定义模式,请参阅 创建自定义向量存储 或 使用现有表创建向量存储。
可选提示:💡
您还可以通过传递schema_name 来指定模式名称,与传递 table_name 时一样。例如:
创建嵌入类实例
您可以使用任何 LangChain 嵌入模型。初始化默认的 PGVectorStore
使用默认表模式连接到向量存储。 有关自定义模式,请参阅 创建自定义向量存储 或 使用现有表创建向量存储。管理向量存储
添加文档
将文档添加到向量存储。元数据存储在 JSON 列中,请参阅“创建自定义向量存储”以存储用于过滤的元数据。添加文本
直接将文本添加到向量存储,如果未结构化为 Document。删除文档
可以使用 ID 删除文档。查询向量存储
搜索文档
使用自然语言查询搜索相似文档。按向量搜索文档
使用向量嵌入搜索相似文档。添加索引
通过应用向量索引来加速向量搜索查询。了解有关 向量索引 的更多信息。 如果未提供名称,索引将使用默认索引名称。要添加多个索引,需要不同的索引名称。重新索引
使用索引表中存储的数据重建索引,替换索引的旧副本。某些索引类型在添加大量新数据后可能需要重新索引。删除索引
删除向量索引。创建自定义向量存储
使用特殊列名或自定义元数据列自定义向量存储。ainit_vectorstore_table
- 使用字段
content_column、embedding_column、metadata_columns、metadata_json_column、id_column来重命名列。 - 使用
Column类创建自定义 ID 或元数据列。列由名称和数据类型定义。可以使用任何 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,用于存储电子商务企业的产品详细信息。
以下是此表如何映射到 PGVectorStore:
-
id_column="product_id":ID 列唯一标识产品表中的每一行。 -
content_column="description":description列包含每个产品的文本描述。此文本由embedding_service用于创建进入 embedding_column 的向量,表示每个描述的语义含义。 -
embedding_column="embed":embed列存储从产品描述创建的向量。这些向量用于查找具有相似描述的产品。 -
metadata_columns=["name", "category", "price_usd", "quantity", "sku", "image_url"]:这些列被视为每个产品的元数据。元数据提供有关产品的附加信息,例如其名称、类别、价格、可用数量、SKU(库存单位)和图像 URL。此信息对于在搜索结果中显示产品详细信息或用于过滤和分类非常有用。 -
metadata_json_column="metadata":metadata列可以以灵活的 JSON 格式存储有关产品的任何附加信息。这允许存储不适合标准列的多样化和复杂数据。
-
可选:如果
embed列是新创建的或维度与嵌入模型支持的不同,则需要一次性为旧记录添加嵌入,如下所示:ALTER TABLE products ADD COLUMN embed vector(768) DEFAULT NULL -
对于通过
VectorStore添加的新记录,会自动生成嵌入。
清理
⚠️ 警告:此操作无法撤销 删除向量存储表。用于检索增强生成的用法
有关如何将此向量存储用于检索增强生成 (RAG) 的指南,请参阅以下部分:API 参考
有关所有PGVectorStore 功能和配置的详细文档,请前往 API 参考
连接这些文档 到 Claude、VSCode 等,通过 MCP 获取实时答案。

