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)
额外注意事项
- 如果你的表已经提前创建过(没有元数据列),需要先删除旧表再重新执行
engine.init_vectorstore_table,或者手动在数据库中添加元数据列(更推荐重建表,避免字段不匹配的问题)。 - 元数据列的键名要前后保持一致,比如表初始化、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
相关产品推荐
相关产品推荐

