我遇到了以下错误:
"AttributeError: 'list' object has no attribute 'similarity'"
当我尝试编译我的代码时。我正在运行一个使用Haystack的NLP问答流程。我最近尝试实现了pinecone向量数据库,这导致了错误的发生。
在错误发生之前的流程大致如下:初始化Pinecone数据存储 -> 将数据传递给转换为Haystack兼容的文档 -> 预处理文档 -> 传递给Haystack的dense passage retriever。
为了简化情况,我收集了各种模块,并将所有代码放在一个可执行的Python文件中,并在下面分享:
import loggingimport osfrom haystack.document_stores import InMemoryDocumentStorefrom haystack.pipelines.standard_pipelines import TextIndexingPipelineimport asyncioimport time> #from kai.pinecone_system import initiate_pineconefrom haystack import Pipelinefrom haystack.document_stores import PineconeDocumentStore> ####REMOVEdef 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> ####REMOVELOGGINGlogging.basicConfig(format="%(levelname)s - %(name)s - %(message)s", level=logging.WARNING> )logging.getLogger("haystack").setLevel(logging.INFO)DOC STOREdocument_store = initiate_pinecone()from haystack.nodes import TextConverter, PDFToTextConverter, DocxToTextConverter, PreProcessorfrom haystack.utils import convert_files_to_docsDATA to DOCSdoc_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-PROCESSORfrom haystack.nodes import PreProcessorpreprocessor = 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 storeimport osfrom haystack.pipelines.standard_pipelines import TextIndexingPipelinefiles_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 DensePassageRetrieverretriever = 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 READERfrom haystack.nodes import FARMReaderreader = FARMReader(model_name_or_path="michiyasunaga/BioLinkBERT-large", use_gpu=True)> ##GET PIPELINE UP (RETRIEVER / READER)from haystack.pipelines import ExtractiveQAPipelinepipe = ExtractiveQAPipeline(reader, retriever)prediction = ""
非常感谢您提前提供的任何建议。
我尝试过将pinecone向量数据库更改为cosine和dotproduct。调整了预处理,并且还删除了预处理,但这些都没有效果。我理解文档存储需要一个名为similarity的属性,但我并不确定那到底是什么。
回答:
出于安全原因,我修改了您的问题。
无论如何,我认为您在实例化retriever时出现了错误。
如您所见在文档中,DensePassageRetriever.__init__
期望document_store
参数,该参数由要查询的文档存储组成;相反,您错误地使用了预处理的文档。
您应该尝试以下retriever初始化方式:
retriever = DensePassageRetriever(document_store=document_store,...)