LlamaIndex对接PostgreSQL异常:生成空表且返回空响应求助
问题
使用AzureOpenAI + PostgreSQL + LlamaIndex + Python技术栈,尝试对接已存储向量的PostgreSQL数据库。数据库中存在cars表,包含字段:ID(字符串类型)、verbatim(字符串类型)、embedding(verbatim的嵌入向量),表内已有24条完整数据。
尝试查询生成客户负面评论文本摘要,代码实现如下:
from llama_index.llms.azure_openai import AzureOpenAI from llama_index.embeddings.azure_openai import AzureOpenAIEmbedding from llama_index.core import Settings from llama_index.core import VectorStoreIndex, SimpleDirectoryReader llm = AzureOpenAI( model="gpt-4", deployment_name="gpt-4", api_key=api_key, azure_endpoint=azure_endpoint, api_version=api_version, ) embed_model = AzureOpenAIEmbedding( model="text-embedding-ada-002", deployment_name="text-embedding-ada-002", api_key=api_key, azure_endpoint=azure_endpoint, api_version=api_version, ) Settings.llm = llm Settings.embed_model = embed_model vector_store = PGVectorStore.from_params( database="DATABASE", host="HOST", password="PASSWORD", port=5432, user="USERNAME", table_name="cars", embed_dim=1536, debug=True ) index = VectorStoreIndex.from_vector_store(vector_store=vector_store) query_engine = index.as_query_engine() response = query_engine.query("Resume negative verbatim of my client")
执行后,数据库生成空表data_cars,且返回结果为Response(response='Empty Response', source_nodes=[], metadata=None),修改字段名和from_params参数后问题仍存在。
原因分析与解决方案
1. PGVectorStore默认字段映射不匹配
LlamaIndex的PGVectorStore默认使用的字段名与你的cars表不匹配:
- 默认主键字段为小写
id,但你的表使用大写ID - 默认存储文本的字段为
text,但你的表使用verbatim - 向量字段
embedding虽匹配,但主键和文本字段不匹配会导致无法读取数据
解决方法:初始化PGVectorStore时显式指定字段映射参数:
vector_store = PGVectorStore.from_params( database="DATABASE", host="HOST", password="PASSWORD", port=5432, user="USERNAME", table_name="cars", embed_dim=1536, debug=True, id_column="ID", # 指定自定义主键字段名 text_column="verbatim", # 指定存储文本的字段名 embedding_column="embedding" # 可选,明确指定向量字段增强可读性 )
2. data_cars空表生成的原因
当PGVectorStore无法正确识别现有表结构时,会尝试创建默认辅助表data_<table_name>存储元数据,但因原表数据无法读取,所以该表为空。解决字段映射问题后,此表不会再生成或会正确关联数据。
3. 查询语句的优化
原查询语句"Resume negative verbatim of my client"表述不够明确,可能导致向量检索无匹配结果。可先测试基础查询验证数据是否能正常读取:
response = query_engine.query("Summarize all client verbatim")
若能返回结果,再优化查询语句精准筛选负面评论:
response = query_engine.query("Summarize all negative client verbatim, focusing on complaints about the cars")
4. 向量维度一致性验证
确认cars表中embedding字段的向量维度确实为1536(与text-embedding-ada-002输出维度一致),维度不匹配会导致检索失败。可在数据库执行SQL验证:
SELECT length(embedding) FROM cars LIMIT 1;
确保返回结果为1536。
内容的提问来源于stack exchange,提问作者valentin garreau

