AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


使用RAG技术构建企业级文档问答系统:检索优化(3)RAG Fusion
发布日期:2024-08-21 06:04:04 浏览次数: 1706 来源:超乎想象的科技圈


原理

在使用RAG技术构建企业级文档问答系统:检索优化(2)Multi Query中介绍了如何借助大语言模型生成相似问,从而避免query中由于措辞原因导致检索失败,熟悉搜索推荐的小伙伴应该能看出来,这其实是做了扩召回,通常情况下,只要后续的粗排、精排、重排性能扛得住,扩召回总是能提高搜推效果的,但我们在上次的实验中却发现,在RAG中,使用MultiQuery却并没有带来检索性能的提升,我们在文末也分析了原因,主要是在当前Langchain实现中,只是把结果做了去重,其实并没有排序,当然也与问题、文档有关,也可以调节每个相似问召回的数量,和最终总的召回数量,在部分项目中,是可以超过baseline的,但不进行排序只去重终究是一种浪费。本文介绍一种新的检索优化技术,RAG Fusion,这种技术会对多路召回的结果通过一个称为RRF(Reciprocal Rank Fusion)的简单公式进行排序,RRF排序计算简单,并不会大幅增加线上开销,却在不少场景中可以取得很好的效果,原理如下图:

来源:https://medium.com/@kbdhunga/advanced-rag-rag-fusion-using-langchain-772733da00b7

总体流程如下:

  • 首先使用原始问题,生成多个相似问题:这一步,在我们的示例中使用LLM生成相似问,但在有些企业中,可能会结合业务,通过对query进行改写、纠错等生成其他问题

  • 然后拿多个(图中是3个)相似问题分别检索文档,这一步其实相当于扩召回

  • 然后拿这多个相似问题检索到的文档片段,统一使用RRF排序,最后根据RRF的得分截断知识片段

  • 基于问题和知识片段生成最终答案

RRF的应用,不止本文所介绍的对相似问检索的文档进行排序,还可以对混合检索结果进行排序,下一篇文章会介绍到

公式

RRF的计算通常使用以下公式:

其中:

  •  表示文档的最终评分

  • 表示文档  在第  个检索系统中的排名,一共个检索系统

  • 是一个常数,用于平滑排名,防止排名过高的文档过于主导结果,文献中常见的值为60,某些情况下也常设置为1,用于强调排名较高的文档

举例说明

假如原始问题是“报告的发布机构是什么?”,生成的3个相似问分别是:

  • 报告是由哪个组织发布的?

  • 谁能找到报告的来源?

  • 什么实体负责公布这份报告?

为方便计算,假设RRF公式中的设置为1,设置每个相似问题检索5个文档片段,最终进入LLM生成时截断为3个文档片段,他们三个相似问召回的文档片段分别如下:

  • 报告是由哪个组织发布的?→ [A, B, C, D, E]

  • 谁能找到报告的来源?→ [A, D, C, E, B]

  • 什么实体负责公布这份报告?→ [A, B, D, E, C]

分别计算这5篇文档的RRF分:

RRF(A)=1/(1+1)+1/(1+1)+1/(1+1)=1.5

RRF(B)=1/(2+1)+1/(5+1)+1/(2+1)=0.833

RRF(C)=1/(3+1)+1/(3+1)+1/(5+1)=0.666

RRF(D)=1/(4+1)+1/(2+1)+1/(3+1)=0.783

RRF(E)=1/(5+1)+1/(4+1)+1/(4+1)=0.566

根据RRF的得分,最终进入LLM的知识片段为A, B, D

效果对比

与前几次实验的综合效果对比如下图所示:
分别对应如下几篇文章:使用RAG技术构建企业级文档问答系统之基础流程
使用RAG技术构建企业级文档问答系统:检索优化(1)Embedding微调
使用RAG技术构建企业级文档问答系统:检索优化(2)Multi Query

从图中可以看出,相比MultiQuery,不同检索数量的结果都有提升,但却没有超过基础流程,但这并不意味着RAG Fusion这个方法无效,由于场景不同,涉及到的参数不同,文中只是对典型参数进行了实验,代码中将相关的参数都留了出来,感兴趣的小伙伴可以自行尝试

核心代码

本文代码已开源,完整流程和性能评估请查看源代码,地址在:https://github.com/Steven-Luo/MasteringRAG/blob/main/retrieval/03_rag_fusion.ipynb

RRF计算公式

   dumps, loads

 (results: [], k=):
    fused_scores = {}
 docs  results:

 rank, doc  (docs):
            doc_str = dumps(doc)
 doc_str   fused_scores:
                fused_scores[doc_str] = 

            fused_scores[doc_str] +=  / (rank + k)
    reranked_results = [
        (loads(doc), score)
 doc, score  (fused_scores.items(), key= x: x[], reverse=)
    ]
 reranked_results

RAG Fusion检索器

   ChatOllama
   PromptTemplate
 

llm = ChatOllama(base_url=, model=)

prompt = PromptTemplate(
    input_variables=[, ],
    template = 




)

 (top_k, n_sim_query=, trunc=):





    chain = (
        prompt.partial(n_sim_query=n_sim_query)
        | llm

        | ( x: [
            re.sub(, , item.strip()) 
 item  x.content.split()  item.strip() != ])
        | ( x: [vector_db.similarity_search(q, k=top_k)  q  x])
        | reciprocal_rank_fusion
        | ( docs: docs[:top_k]  trunc  docs)
    )
 chain

使用:

rag_fusion_chain = get_rag_fusion_chain(, trunc=)
rag_fusion_chain = invoke({: })

结果

[(Document(metadata={'page': 33, 'source': 'data/2024全球经济金融展望报告.pdf', 'uuid': '3e312dfa-dd43-4ab9-961f-a2e442c89cdd'}, page_content='全球经济金融展望报告\n中国银行研究院 32 2024年\n图19:美国联邦基金目标利率与全球MSCI指数\n资料来源:Wind,中国银行研究院\n表3:全球主要股指概览\n注:涨跌幅区间为2023年1月1日至2023年11月15日,收盘价和市盈\n率为2023年11月15日。\n资料来源:Wind,中国银行研究院'),
  0.04972677595628415),
 (Document(metadata={'page': 51, 'source': 'data/2024全球经济金融展望报告.pdf', 'uuid': 'ebf0d999-59f6-4fd3-941e-05a7a60c255a'}, page_content='免责声明\n本研究报告由中国银行研究院撰写,研究报告中所引用信息均来自公开资料。\n本研究报告中包含的观点或估计仅代表作者迄今为止的判断,它们不一定反映中国银行的观点。中国\n银行研究院可以不经通知加以改变,且没有对此报告更新、修正或修改的责任。\n本研究报告内容及观点仅供参考,不构成任何投资建议。对于本报告所提供信息所导致的任何直接的\n或者间接的投资盈亏后果不承担任何责任。\n本研究报告版权仅为中国银行研究院所有,未经书面许可,任何机构和个人不得以任何形式翻版、复\n制和发布。如引用发布,需注明出处为中国银行研究院,且不得对本报告进行有悖原意的引用、删节和修\n改。中国银行研究院保留对任何侵权行为和有悖报告原意的引用行为进行追究的权利。'),
  0.03278688524590164)]

为了方便调参,也可以使用下面这个函数:

 (llm, query, top_k=, n_sim_query=, include_original=, trunc=):









    chain = (
        prompt.partial(n_sim_query=n_sim_query)
        | llm

        | ( x: [
            re.sub(, , item.strip()) 
 item  x.content.split()  item.strip() != ])
        | ( x: [vector_db.similarity_search(q, k=top_k)  q  ([query]  include_original  []) + x[:n_sim_query]])
        | reciprocal_rank_fusion
        | ( docs: docs[:top_k]  trunc  docs)
    )
 chain.invoke(query)



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询