You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LangChain中PGVectorStore带元数据列的初始化、文档添加及过滤查询问题咨询

LangChain中PGVectorStore带元数据列的初始化、文档添加及过滤查询问题咨询

我来帮你一步步解决这个PGVectorStore元数据列的问题~你遇到的ValueError: Metadata column, country, does not exist错误原因非常明确:你只在创建PGVectorStore实例时指定了元数据列,但初始化数据库表的关键步骤里,根本没创建这些列,数据库里的表没有country、city这些字段,系统自然找不到,就报错了。下面是完整的正确操作流程:

一、初始化表时必须同步创建元数据列

你之前的engine.init_vectorstore_table调用只指定了向量大小,没有包含元数据列定义。这一步是创建数据库表的核心,必须把需要的元数据列在这里提前声明,后续才能正常使用。

修改后的表初始化代码:

engine.init_vectorstore_table(
    table_name=TABLE_NAME,
    vector_size=VECTOR_SIZE,
    metadata_columns=[
        "country",
        "city",
        "address"
    ]  # 这里必须同步添加元数据列!
)

如果需要指定元数据列的数据库类型(比如整数、日期,默认是TEXT),可以用元组形式声明,例如:

metadata_columns=[
    "country",
    ("year", "INTEGER"),
    ("created_at", "TIMESTAMP")
]

二、正确创建带元数据列的PGVectorStore实例

现在数据库表已经有了对应的元数据列,再创建PGVectorStore时指定metadata_columns就不会报错了:

store = PGVectorStore.create_sync(
    engine=engine,
    table_name=TABLE_NAME,
    embedding_service=embedding,
    metadata_columns=[
        "country",
        "city",
        "address"
    ]
)

三、添加带元数据的Document对象

每个Document需要通过metadata字段传入对应键值对,注意键名要和你定义的元数据列完全匹配:

docs = [
    Document(
        page_content="Apples and oranges",
        metadata={"country": "USA", "city": "New York", "address": "123 Fruit St"}
    ),
    Document(
        page_content="Cars and airplanes",
        metadata={"country": "Germany", "city": "Berlin", "address": "456 Auto Ave"}
    ),
    Document(
        page_content="Train",
        metadata={"country": "Japan", "city": "Tokyo", "address": "789 Rail Rd"}
    )
]
store.add_documents(docs)

四、带元数据过滤的相似性查询

现在你可以用filter参数精准筛选符合元数据条件的文档,比如只查询来自美国的文档,或者多条件组合过滤:

query = "I'd like a fruit."

# 单条件过滤:只查美国的文档
filtered_docs = store.similarity_search(
    query,
    filter={"country": "USA"}
)
print("带美国过滤的查询结果:", filtered_docs)

# 多条件过滤:同时指定国家和城市
filtered_docs = store.similarity_search(
    query,
    filter={"country": "Japan", "city": "Tokyo"}
)
print("带日本东京过滤的查询结果:", filtered_docs)

额外注意事项

  1. 如果你的表已经提前创建过(没有元数据列),需要先删除旧表再重新执行engine.init_vectorstore_table,或者手动在数据库中添加元数据列(更推荐重建表,避免字段不匹配的问题)。
  2. 元数据列的键名要前后保持一致,比如表初始化、store创建、Document的metadata里的键必须完全相同,大小写敏感。

完整可运行示例代码

把所有步骤整合在一起,你可以直接复制替换自己的连接字符串运行:

from langchain_core.documents import Document
from langchain_core.embeddings import DeterministicFakeEmbedding
from langchain_postgres import PGEngine, PGVectorStore

# 替换成你的Postgres连接字符串
CONNECTION_STRING = "postgresql+psycopg3://langchain:langchain@localhost:6024/langchain"
engine = PGEngine.from_connection_string(url=CONNECTION_STRING)

VECTOR_SIZE = 768
embedding = DeterministicFakeEmbedding(size=VECTOR_SIZE)
TABLE_NAME = "my_doc_collection"

# 初始化带元数据列的表
engine.init_vectorstore_table(
    table_name=TABLE_NAME,
    vector_size=VECTOR_SIZE,
    metadata_columns=[
        "country",
        "city",
        "address"
    ]
)

# 创建PGVectorStore实例
store = PGVectorStore.create_sync(
    engine=engine,
    table_name=TABLE_NAME,
    embedding_service=embedding,
    metadata_columns=[
        "country",
        "city",
        "address"
    ]
)

# 添加带元数据的文档
docs = [
    Document(
        page_content="Apples and oranges",
        metadata={"country": "USA", "city": "New York", "address": "123 Fruit St"}
    ),
    Document(
        page_content="Cars and airplanes",
        metadata={"country": "Germany", "city": "Berlin", "address": "456 Auto Ave"}
    ),
    Document(
        page_content="Train",
        metadata={"country": "Japan", "city": "Tokyo", "address": "789 Rail Rd"}
    )
]
store.add_documents(docs)

# 普通相似性查询
query = "I'd like a fruit."
normal_docs = store.similarity_search(query)
print("普通查询结果:", normal_docs)

# 带元数据过滤的查询
filtered_docs = store.similarity_search(
    query,
    filter={"country": "USA"}
)
print("带美国过滤的查询结果:", filtered_docs)

这样整个流程就完全通顺了,你可以按照这个逻辑替换自己的业务数据,就能正常使用PGVectorStore的元数据功能啦~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 07:19:35