背景与问题
使用多种检索类型的方式,取长补短,动态适配混合检索。使用技术:
- 向量检索:语义相似度
- 关键词/全文检索:精准匹配
- SQL检索利用数据库检索:结构化数据
适用场景
- 异构数据场景:处理多类型、多格式数据
- 复杂查询场景:兼顾精确匹配与语义理解
基本思路
- 用户输入问题
- 重写
- 向量检索器/关键词检索器
- 重排序
- 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)
... ...