如何将多个 FAISS 索引合并为一个以获得单个检索器

问题描述 投票:0回答:1
pdf = load_pdf(help_doc_name)
faiss_index_ft9Help = FAISS.from_documents(pdf, OpenAIEmbeddings())
faiss_index_ft9Help.save_local(index_path + "/" + help_doc_name)

# load newsletters
pdf = load_pdf(newsletters_doc_name)
faiss_index_newsletters = FAISS.from_documents(pdf, OpenAIEmbeddings())
faiss_index_newsletters.save_local(index_path + "/" + newsletters_doc_name)

# load support cases
pdf = load_pdf(supportCases_doc_name)
faiss_index_supportCases = FAISS.from_documents(pdf, OpenAIEmbeddings())
faiss_index_supportCases.save_local(index_path + "/" + supportCases_doc_name)

retriever = MultiIndexRetriever(
    [faiss_index_ft9Help, faiss_index_newsletters, faiss_index_supportCases])

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=retriever,
    verbose=False
)

MultiIndexRetriever 方法不存在,我需要从三个 faiss 索引创建一个检索器。因为我需要随后分别使用这三个索引来通过相似性搜索来获取参考页面。有什么方法可以做到这一点或有比这更好的替代方法吗? 这是我使用这条链条的部分。

while True:
    question = input("You: ")

    if question.lower() == "exit":
        print("Bot: Goodbye!")
        break

    response = qa_chain.run(question)

    print("Bot: " + response + "\n\n")

请注意,我仍然没有实现参考获取部分。

chatbot openai-api langchain faiss py-langchain
1个回答
1
投票

您正在寻找的是

merge_from

你可以这样使用它

pdfs = [help_doc_name, newsletters_doc_name, supportCases_doc_name]

for index, pdf in enumerate(pdfs):
   content = load_pdf(pdf)
   if index == 0:
       faiss_index = FAISS.from_documents(content, OpenAIEmbeddings())
   else:
      faiss_index_i = FAISS.from_documents(content, OpenAIEmbeddings())
      faiss_index.merge_from(faiss_index_i)

faiss_index.save_local(index_path)

retriever = faiss_index.as_retriever(
        search_type="similarity", search_kwargs={"k": 3}
    )
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=retriever,
    verbose=False
)

遍历 PDF 列表。第一次创建 faiss 索引,然后合并其余索引。

© www.soinside.com 2019 - 2024. All rights reserved.