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

基于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)

关键说明

  1. 原始句子存储位置:你upsert时把{'content': v['content']}作为元数据传入,所以原始句子存在每个向量的metadata['content']里。
  2. QA模型输入格式:nlp函数必须接收{'question': 'xxx', 'context': 'xxx'}格式的字典,不能用拼接字符串,否则会报错或返回无效结果。
  3. 效率建议:优先用方式1,一次查询就能拿到所有需要的数据,减少API调用次数。

内容的提问来源于stack exchange,提问作者serlingpa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 07:10:27