如何在LlamaIndex结合Postgres(pgvector)创建向量表时添加自定义列
解决方案
完全可以实现将external_id这类字段作为Postgres表的自定义列存储,具体操作步骤如下:
1. 手动创建带自定义列的Postgres表
LlamaIndex默认生成的表结构不包含自定义列,所以需要先手动创建目标表,包含默认字段+自定义字段。执行以下SQL(替换external_id为你的实际字段,类型按需调整):
CREATE TABLE IF NOT EXISTS vectorstore ( id TEXT PRIMARY KEY, external_id VARCHAR(255) NOT NULL, -- 自定义列 embedding vector(1536) NOT NULL, metadata JSONB, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 创建HNSW向量索引(和你原配置的参数对应) CREATE INDEX IF NOT EXISTS hnsw_idx_vectorstore ON vectorstore USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 64);
2. 配置PGVectorStore时指定自定义列映射
修改你的PGVectorStore初始化代码,添加custom_metadata_columns和metadata_column_map参数,让LlamaIndex识别并写入自定义列:
self.vector_store = PGVectorStore.from_params( database=request.tenant, host=host, password=password, port=port, user=user, table_name="vectorstore", embed_dim=1536, hnsw_kwargs={ "hnsw_m": 16, "hnsw_ef_construction": 64, "hnsw_ef_search": 40, "hnsw_dist_method": "vector_cosine_ops", }, # 指定自定义列的名称和类型 custom_metadata_columns={"external_id": "VARCHAR(255)"}, # 映射文档metadata中的键到表的自定义列 metadata_column_map={"external_id": "external_id"} )
3. 处理文档的metadata
在构建Document对象时,将external_id放入metadata字典中,LlamaIndex会自动将其写入对应的自定义列,而不是塞进默认的metadata JSONB列:
from llama_index.core import Document # 示例文档 doc = Document( text="你的文档内容", metadata={"external_id": "doc_001"} # 这里的键要和metadata_column_map中的键对应 )
4. 构建索引(保持原有逻辑即可)
继续使用VectorStoreIndex.from_documents()构建索引,此时LlamaIndex会将external_id写入自定义列,而非默认的metadata JSON结构中:
from llama_index.core import VectorStoreIndex index = VectorStoreIndex.from_documents( [doc], vector_store=self.vector_store )
这样操作后,你就能在Postgres的vectorstore表中看到独立的external_id列,而非嵌套在metadata的JSON里。
内容的提问来源于stack exchange,提问作者dsmann
相关产品推荐
相关产品推荐

