当前位置: 首页 > news >正文

基于 Python 的自然语言处理系列(61):RAG Fusion介绍

        RAG Fusion 是一种检索方法,旨在弥合传统搜索范式与人类查询的多维特性之间的差距。本项目受 Retrieval Augmented Generation (RAG) 的启发,进一步采用 多查询生成互惠排序融合 (Reciprocal Rank Fusion, RRF) 来重新排名搜索结果,以提升检索效果。

        本实现基于 该 GitHub 仓库 进行重构,所有贡献归原作者所有。

环境设置

        本示例使用 Pinecone 作为向量数据库,并构造一组示例数据。

import pinecone
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Pinecone

pinecone.init(api_key="...", environment="...")

all_documents = {
    "doc1": "Climate change and economic impact.",
    "doc2": "Public health concerns due to climate change.",
    "doc3": "Climate change: A social perspective.",
    "doc4": "Technological solutions to climate change.",
    "doc5": "Policy changes needed to combat climate change.",
    "doc6": "Climate change and its impact on biodiversity.",
    "doc7": "Climate change: The science and models.",
    "doc8": "Global warming: A subset of climate change.",
    "doc9": "How climate change affects daily weather.",
    "doc10": "The history of climate change activism."
}

vectorstore = Pinecone.from_texts(
    list(all_documents.values()), OpenAIEmbeddings(), index_name="rag-fusion"")

查询生成器

        我们将定义一个 LangChain 查询生成链,该链可以基于单个查询生成多个相关查询。

from langchain.chat_models import ChatOpenAI
from langchain.schema.output_parser import StrOutputParser
from langchain import hub

prompt = hub.pull("langchain-ai/rag-fusion-query-generation")

generate_queries = (
    prompt | ChatOpenAI(temperature=0) | StrOutputParser() | (lambda x: x.split("\n"))
)

定义完整检索链

        该检索链的执行流程如下:

  1. 生成多个查询。

  2. 使用检索器查询每个子查询。

  3. 使用 互惠排序融合 (RRF) 对结果重新排名。

注意:此过程不会执行最终的生成步骤,仅进行检索和融合。

original_query = "impact of climate change"
vectorstore = Pinecone.from_existing_index("rag-fusion", OpenAIEmbeddings())
retriever = vectorstore.as_retriever()

from langchain.load import dumps, loads

def reciprocal_rank_fusion(results: list[list], k=60):
    fused_scores = {}
    for docs in results:
        # 假设检索结果已按相关性排序
        for rank, doc in enumerate(docs):
            doc_str = dumps(doc)
            if doc_str not in fused_scores:
                fused_scores[doc_str] = 0
            fused_scores[doc_str] += 1 / (rank + k)

    reranked_results = [
        (loads(doc), score)
        for doc, score in sorted(fused_scores.items(), key=lambda x: x[1], reverse=True)
    ]
    return reranked_results

chain = generate_queries | retriever.map() | reciprocal_rank_fusion

# 执行查询
results = chain.invoke({"original_query": original_query})

结论

RAG Fusion 通过 多查询生成 + 互惠排序融合,提升了传统 RAG 框架的检索效果,适用于需要高精度检索的应用,如 科研论文、法律文档、技术资料 等。如果你有任何问题或改进建议,欢迎交流!

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

相关文章:

  • Rust从入门到精通之精通篇:26.性能优化技术
  • 软件性能效率测试工具有哪些?专业第三方软件检测机构推荐
  • Linux上位机开发实践(访问IPCam设备)
  • 23种设计模式-责任链(Chain of Responsibility)设计模式
  • Redis的三种集群模式
  • TDengine 3.3.2.0 集群报错 Post “http://buildkitsandbox:6041/rest/sql“
  • 过滤器的执行顺序
  • Python 字符串正则表达式详解
  • 第 1 章 | 开篇词:Dapp安全 区块链安全 Web3安全 区块链合约一旦部署,安全就是生死线
  • AI加速,制造企业如何用数据驱动质量管理数字化变革?
  • 18 C语言标准头文件
  • Linux 挂载磁盘操作指南
  • React-Router路由跳转、传参、抽象封装以及嵌套路由
  • MySQL - 索引【index】
  • Axure项目实战:智慧城市APP(一)首页(动态面板、拖动效果)
  • 聚水潭商品信息集成MySQL的高效解决方案
  • React 中React.memo的作用,如何利用它进行组件性能优化?
  • Harbor镜像仓库迁移与高可用集群搭建HTTPS实现实战指南
  • 【Python】pillow库学习笔记1-Image类
  • SpringCould微服务架构之Docker(2)
  • 襄阳做网站 优帮云/沈阳seo搜索引擎
  • 美团外卖网站开发/seo技术团队
  • 找个人做网站还是找企业做网站/关键词怎样做优化排名
  • 长沙旅游文案/关键字优化
  • wordpress下载站插件/在线crm系统
  • 嘉兴建设规划网站/域名注册网站查询