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

使用Haystack+Pinecone时出现AttributeError: 'list'无'similarity'属性

问题:Haystack集成Pinecone时出现AttributeError: 'list' object has no attribute 'similarity'

运行基于Haystack搭建的NLP问答Pipeline,引入Pinecone向量数据库后触发以下错误:

AttributeError: 'list' object has no attribute 'similarity'

流程为:初始化Pinecone文档存储→转换数据为Haystack兼容文档→预处理文档→传入Dense Passage Retriever。已尝试修改Pinecone的相似度计算方式、调整预处理步骤,但均无效,不清楚文档存储所需的similarity属性具体所指。

完整代码如下:

import logging
import os
from haystack.document_stores import InMemoryDocumentStore
from haystack.pipelines.standard_pipelines import TextIndexingPipeline
import asyncio
import time
# from kai.pinecone_system import initiate_pinecone
from haystack import Pipeline

from haystack.document_stores import PineconeDocumentStore

def initiate_pinecone():
    print("Testing PInecone")
    ENV="eu-west1-gcp"
    API="fake-api-key"
    document_store = PineconeDocumentStore(
        api_key=API,
        index='esmo', 
        environment=ENV,
    )
    return document_store

# LOGGING
logging.basicConfig(
    format="%(levelname)s - %(name)s -  %(message)s", level=logging.WARNING
)
logging.getLogger("haystack").setLevel(logging.INFO)

# DOC STORE
document_store = initiate_pinecone()

from haystack.nodes import TextConverter, PDFToTextConverter, DocxToTextConverter, PreProcessor
from haystack.utils import convert_files_to_docs

# DATA to DOCS
doc_dir = "data/esmo"
# converter = TextConverter(remove_numeric_tables=True, valid_languages=["en"])
# doc_txt = converter.convert(file_path="data/esmo", meta=None)[0]
all_docs = convert_files_to_docs(dir_path=doc_dir)

# PRE-PROCESSOR
preprocessor = PreProcessor(
    clean_empty_lines=True,
    clean_whitespace=True,
    clean_header_footer=False,
    split_by="word",
    split_length=150,
    split_respect_sentence_boundary=True,
    split_overlap=0
)
processed_esmo_docs = preprocessor.process(all_docs)
print(f"n_files_input: {len(all_docs)}\nn_docs_output: {len(processed_esmo_docs)}")
print(processed_esmo_docs[0])

# write document objects into document store
files_to_index = [doc_dir + "/" + f for f in os.listdir(doc_dir)]
indexing_pipeline = TextIndexingPipeline(document_store)
indexing_pipeline.run_batch(file_paths=files_to_index)

from haystack.nodes import DensePassageRetriever
retriever = DensePassageRetriever(
    document_store=processed_esmo_docs,
    # document_store=all_docs,
    query_embedding_model="facebook/dpr-question_encoder-single-nq-base",
    passage_embedding_model="facebook/dpr-ctx_encoder-single-nq-base",
    max_seq_len_query=64,
    max_seq_len_passage=256,
    batch_size=2,
    use_gpu=True,
    embed_title=True,
    use_fast_tokenizers=True)

# INITIALIZE READER
from haystack.nodes import FARMReader
reader = FARMReader(model_name_or_path="michiyasunaga/BioLinkBERT-large", use_gpu=True)

# GET PIPELINE UP (RETRIEVER / READER)
from haystack.pipelines import ExtractiveQAPipeline
pipe = ExtractiveQAPipeline(reader, retriever)
prediction = ""

解决建议
  • 核心错误原因:DensePassageRetriever的document_store参数传入了processed_esmo_docs(这是预处理后的文档列表,类型为list),但该参数要求传入Haystack的DocumentStore实例(即你初始化的document_store对象)。Retriever需要和DocumentStore交互来管理向量索引、执行相似度检索,传入列表会导致它调用列表没有的similarity方法,从而触发报错。

  • 修复步骤:

    1. 修改DensePassageRetriever的初始化代码,将document_store=processed_esmo_docs改为document_store=document_store:
      retriever = DensePassageRetriever(
          document_store=document_store,
          query_embedding_model="facebook/dpr-question_encoder-single-nq-base",
          passage_embedding_model="facebook/dpr-ctx_encoder-single-nq-base",
          max_seq_len_query=64,
          max_seq_len_passage=256,
          batch_size=2,
          use_gpu=True,
          embed_title=True,
          use_fast_tokenizers=True)
      
    2. 在初始化Retriever后,需要将Retriever绑定到DocumentStore,并生成并存储文档的向量:
      # 为文档生成向量并更新到Pinecone
      document_store.update_embeddings(retriever)
      
  • 额外优化点:

    • 你同时使用了TextIndexingPipeline和手动预处理文档,这会导致重复处理文件。建议统一流程:要么用TextIndexingPipeline自动处理并索引文件,要么手动处理文档后直接写入DocumentStore(执行document_store.write_documents(processed_esmo_docs)),避免重复操作。
    • 初始化PineconeDocumentStore时,建议显式指定similarity参数(比如similarity="dot_product"),确保和DPR模型的输出匹配(DPR默认使用点积计算相似度):
      document_store = PineconeDocumentStore(
          api_key=API,
          index='esmo', 
          environment=ENV,
          similarity="dot_product"
      )
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 15:09:58