使用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方法,从而触发报错。修复步骤:
- 修改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) - 在初始化Retriever后,需要将Retriever绑定到DocumentStore,并生成并存储文档的向量:
# 为文档生成向量并更新到Pinecone document_store.update_embeddings(retriever)
- 修改DensePassageRetriever的初始化代码,将
额外优化点:
- 你同时使用了
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
相关产品推荐
相关产品推荐

