背景与问题

使用多种检索类型的方式,取长补短,动态适配混合检索。使用技术:

  • 向量检索:语义相似度
  • 关键词/全文检索:精准匹配
  • SQL检索利用数据库检索:结构化数据

适用场景

  • 异构数据场景:处理多类型、多格式数据
  • 复杂查询场景:兼顾精确匹配与语义理解

基本思路

  1. 用户输入问题
  2. 重写
  3. 向量检索器/关键词检索器
  4. 重排序
  5. LLM

使用langchain的检索器 EnsembleRetriever BM25Retriever

... ...
# 向量检索
vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
doc_vector_retriever = vector_retriever.invoke(question)
print("-------------------向量检索-------------------------")
pretty_print_docs(doc_vector_retriever)

# 关键词检索
BM25_retriever = BM25Retriever.from_documents(split_docs)
BM25_retriever.k = 3
doc_BM25Retriever = BM25_retriever.invoke(question)
print("-------------------BM25检索-------------------------")
pretty_print_docs(doc_BM25Retriever)

# 混合检索 EnsembleRetriever混合检索器
#EnsembleRetriever是Langchain集合多个检索器的检索器。 weights  1 表示权重
ensembleRetriever = EnsembleRetriever(retrievers=[BM25_retriever, vector_retriever], weights=[0.3, 0.7])
retriever_doc = ensembleRetriever.invoke(question)
print("-------------------混合检索-------------------------")
print(retriever_doc)
... ...

参考