PGVectorStore 是 LangChain 向量存储的实现,使用 postgres 作为后端。 本 notebook 介绍了如何使用 PGVectorStore API。 代码位于一个名为 langchain-postgres 的集成包中。设置
此包需要一个安装了pgvector 扩展的 PostgreSQL 数据库。 您可以运行以下命令来启动一个启用 pgvector 的 Postgres 实例的容器:安装
安装集成库langchain-postgres。
设置您的 Postgres 值
设置您的 Postgres 值,以便在本 notebook 中针对 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 列中,请参阅“创建自定义向量存储”以存储用于过滤的元数据。添加文本
如果未结构化为文档,则直接将文本添加到向量存储中。删除文档
文档可以使用 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用于忽略不应作为文档元数据的列。这在使用现有表时很有用,其中所有数据列都不是必需的。- 在向量搜索期间使用不同的
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 参考
有关所有 VectorStore 功能和配置的详细文档,请参阅 API 参考:python.langchain.com/api_reference/postgres/v2/langchain_postgres.v2.vectorstores.PGVectorStore.html以编程方式连接这些文档到 Claude、VSCode 等,通过 MCP 获取实时答案。