基于Pinecone与Sentence Transformers的开放书QA模型上下文召回问题
问题解决方法
错误原因
index.fetch(ids=ids)返回的是FetchResponse对象,不是可直接遍历的列表。这个对象里的vectors字段才是存储你要的向量和元数据的字典,直接遍历整个对象会触发属性错误。另外你的QA pipeline输入格式也不对,nlp函数需要接收包含question和context键的字典,不是拼接的字符串。
修正方案(两种方式,选其一即可)
方式1:检索时直接返回元数据(更高效,无需额外fetch)
修改查询代码,在query时指定include_metadata=True,直接拿到匹配结果的元数据,省去单独fetch的步骤:
xq = model.encode(query).tolist() # 查询时直接请求返回元数据 xc = index.query(xq, top_k=5, include_metadata=True) model_name = 'deepset/electra-base-squad2' nlp = pipeline(tokenizer=model_name, model=model_name, task='question-answering') # 遍历匹配结果,提取metadata中的原始句子 for match in xc['matches']: context_content = match['metadata']['content'] # 用正确格式传给QA模型 result = nlp({ 'question': query, 'context': context_content }) print(result)
方式2:修正fetch后的遍历逻辑
如果坚持要用fetch,需要从返回对象的vectors字典里提取数据:
xq = model.encode(query).tolist() xc = index.query(xq, top_k=5) ids = [x['id'] for x in xc['matches']] # 提取fetch结果里的vectors字典 contexts = index.fetch(ids=ids)['vectors'] model_name = 'deepset/electra-base-squad2' nlp = pipeline(tokenizer=model_name, model=model_name, task='question-answering') # 遍历vectors字典的value,提取metadata中的原始句子 for vec in contexts.values(): context_content = vec['metadata']['content'] result = nlp({ 'question': query, 'context': context_content }) print(result)
关键说明
- 原始句子存储位置:你upsert时把
{'content': v['content']}作为元数据传入,所以原始句子存在每个向量的metadata['content']里。 - QA模型输入格式:
nlp函数必须接收{'question': 'xxx', 'context': 'xxx'}格式的字典,不能用拼接字符串,否则会报错或返回无效结果。 - 效率建议:优先用方式1,一次查询就能拿到所有需要的数据,减少API调用次数。
内容的提问来源于stack exchange,提问作者serlingpa
相关产品推荐
相关产品推荐

