为了账号安全,请及时绑定邮箱和手机立即绑定

构建基于Docling、Groq和Ollama的高级检索增强生成(RAG)管道及GLIDER评估方法

先来个简短的介绍吧

在当今的文档处理和AI问答的世界里,检索增强的生成(RAG)已经成为一项关键技术。本文将探讨一个高级的RAG管道系统,该系统结合了使用Docling进行的复杂的文档处理过程和使用GLIDER模型进行的最先进的评估方法。

关于架构

我们的管道包括三个主要部分:

  • 通过使用Docling,可以轻松快速地以所需的格式解析高级文档。
  • 一个先进的RAG系统,用于处理文档和回答问题。
  • 一个全面的评估框架,使用GLIDER工具。
技术堆栈
Docling — 文档处理工具
  • 🗂️ 支持阅读流行文档格式(PDF、DOCX、PPTX、XLSX、图片、HTML、AsciiDoc 和 Markdown),并支持导出到 HTML、Markdown 和 JSON(包含嵌入和引用的图片)
  • 📑 支持识别 PDF 文档的页面布局、阅读顺序及表格结构
  • 🧩 统一、高度表达性的 Docling 文档 表示格式
  • 🤖 与 🦙 LlamaIndex 和 🦜🔗 LangChain 的轻松集成,适用于强大的 RAG / QA 应用程序
  • 🔍 支持扫描 PDF 的 OCR 功能
  • 💻 简洁的命令行界面
Patronus GLIDER,LLM作为法官

GLIDER 是一个精细化微调的 phi-3.5-mini-instruct 模型,可用于作为通用评估模型来评估文本、对话和 RAG 设置,根据用户自定义的标准和评分体系进行评估。该模型使用合成数据和领域适应数据(来自 Mocha、FinQA、真实毒性等流行数据集)进行训练。此模型的训练数据涵盖了超过 183 个指标和 685 个领域,包括但不限于金融和医学等众多领域。该模型的最大序列长度为 8192 个 token,但也可以支持更长的文本(已测试到 12,000 个 token)。

模型信息
Langchain(语言链)

LangChain 是一个开源框架,帮助开发人员更轻松地构建由大型语言模型 (LLM) 驱动的应用程序。它允许开发人员与各种外部数据源和工具进行整合,从而简化 NLP 应用程序的开发过程。

色度

ChromaDB 是一个开源的向量数据库,专门用于管理和查询向量嵌入。这些嵌入是复杂数据类型(例如文本、图像和音频)的数值表示,有助于计算机更好地处理和理解这些数据。

Ollama 模型系列

Ollama 是一款开源工具,旨在在个人电脑上本地运行大型语言模型(LLMs)。该平台允许用户安全高效地管理并使用各种预训练的 AI 模型(如 LLaMA 和 Mistral),以实现安全高效的互动。

在RunPod中设置Ollama

第一步:启动一个 PyTorch 模板实例[https://docs.runpod.io/tutorials/pods/run-ollama#step-1-start-a-pytorch-template-on-runpod]

使用 PyTorch 模板创建一个新的 Pod。在这一步中,您将设置一些配置项来覆盖默认设置以配置 Ollama 的设置。

  1. 登录您的 RunPod 账户 并选择 + GPU Pod。
  2. 选择一个像 A40 这样的 GPU Pod。
  3. 选择最新的 PyTorch 模板。
  4. 选择自定义部署选项。
  5. 将端口 11434 添加到公开的端口列表中。此端口用于 Ollama 的 HTTP API 请求。
  6. 为了使 Ollama 能够绑定到 HTTP 端口,请在您的 Pod 中添加以下环境变量:
  • Key: OLLAMA_HOST
  • 值: 0.0.0.0

7.\ 选择设置覆盖项,继续,部署。

8.一旦Pod启动并运行起来,我们就能在RunPod界面里使用终端。

步骤 2:安装 Ollama

现在Pod已经在运行了,你可以登录到网页终端,网页终端是一种与你的Pod进行交互的强大工具。

  1. 选择“连接”按钮,然后选择“启动Web终端”按钮。
  2. 记下您的用户名和密码,以便后续使用。
  3. 输入您的用户名和密码来登录。
  4. 为了确保Ollama能自动识别并使用您的GPU,请在终端中运行以下命令。
更新软件包列表:apt update;  
安装硬件信息工具:apt install lshw;

5. 运行以下命令来安装 ollama 并将其放到后台:

ollama install &
    (curl -fsSL https://ollama.com/install.sh | sh && ollama serve > ollama.log 2>&1) &

这个命令下载 Ollama 的安装脚本并执行它,在你的 Pod 上安装好 Ollama。-- ollama serve -- 这部分启动 Ollama 服务器,使其准备好运行 AI 模型。

步骤3:通过Ollama运行一个AI模型

要通过 Ollama 运行 AI 模型,并使用 ollama run 命令:

    ollama run [模型名]  
    ollama run llama2  
    ollama run mistral
Runpod

RunPod 是一个主要专注于为AI和ML应用提供基础设施的云计算平台。它让用户能够高效地部署、管理和扩展基于GPU的工作负载,满足从初创企业到大型企业的各种需求。

以下是RunPod的主要特点:

一个要点:
重要特点:
  • GPU云服务:RunPod提供按需访问GPU实例的服务,允许用户在无需物理硬件的情况下运行计算密集型任务。这对于训练和部署AI模型特别有用。
  • 无服务器函数:平台支持无服务器计算,使开发人员能够轻松地创建和管理无服务器函数。这使得应用可以快速部署而无需担心底层基础设施。
  • 基础设施管理:用户可以通过编程使用RunPod的SDK创建、配置和管理各种基础设施组件,包括Pods(运行应用程序的隔离环境)、Templates(基础配置)和Endpoints(无服务器应用的访问点)。
  • 灵活的部署选项:RunPod支持部署公共注册表中的任何Docker容器,使其适用于不同的应用场景。用户可以使用预定义的模板或创建符合特定需求的自定义环境。
  • 社区和安全云:RunPod提供两种类型的云服务——社区云和安全云,允许用户根据其安全性和性能需求进行选择。
  • 简单集成:平台提供SDK简化了服务集成到应用中的过程,使开发人员能够专注于构建功能,而不是管理基础设施。

我们使用了以下GPU设置在RunPod中进行了实验

技术实现的具体细节
智能文档解析及格式化
    class DoclingPDFLoader(BaseLoader):  

        def __init__(self, file_path: str | list[str]) -> None:  
            self._file_paths = file_path if isinstance(file_path, list) else [file_path]  
            self._converter = DocumentConverter()  

        def lazy_load(self) -> Iterator[LCDocument]:  
            for source in self._file_paths:  
                dl_doc = self._converter.convert(source).document  
                text = dl_doc.export_to_markdown()  
                yield LCDocument(page_content=text)
建立索引,然后加载词嵌入
下面的代码是从langchain_chroma导入Chroma,并创建一个名为rag的向量存储。
    from langchain_chroma import Chroma  
    vectorstore = Chroma.from_texts(texts=md_split,  
                                    embedding=embeddings,  
                                    collection_name="rag",  
                                    collection_metadata={"hnsw:space":"cosine"},  
                                    persist_directory="chromadb")
上下文感知的查找

简易检索器

    retriever = load_vs.as_retriever(search_type="相似度", search_params={"k":5})

压缩恢复工具

最相关的信息可能隐藏在包含大量无关内容的文档中。将整个文档输入我们的应用程序,可能会导致更费钱的LLM调用,并产生较差的响应。

上下文压缩技术旨在解决该问题。压缩检索到的相关文档,使其仅包含相关信息。

    # 创建压缩器
    compressor = LLMChainFilter.from_llm(llm=ollama_llm)  
    # 创建上下文压缩检索器
    compression_retriever = ContextualCompressionRetriever(base_compressor=compressor, base_retriever=retriever)
评估过程是这样的

GLIDER评估过程包括以下步骤:

回复生成。

调用压缩检索器处理问题,然后获取响应。
retrieved_docs = compression_retriever.invoke(question)  
response = rag_chain_compressor.invoke(question)  

收集上下文信息

    # 获取上下文
    context = "\n".join([doc.page_content for doc in retrieved_docs])

评价

    # 使用GLIDER评估系统
    评估结果如下:
    evaluation = evaluator.evaluate_response(  
        context=context,  
        question=question,  
        answer=response  
    ).
基于专家建议的关键特性和好处

全方位文档处理

  • 处理多模态内容
  • 保持结构

智能搜索

  • 上下文感知的分块
  • 通过过滤去除噪音

强健评估

  • 多维度的评估
  • 详细解释
  • 定量评分系统

性能指标

系统提供详细的指标数据:

    aggregate_metrics = {  
    "平均分": sum(分数) / len(分数),  
    "最高分": max(分数),  
    "最低分": min(分数),  
    "评分总数": len(分数)  
    }

下面将介绍代码实现部分。

安装必要的依赖项。

为了这个例子,需要安装以下库:
%pip install -qq docling docling-core langchain langchain-text-splitters langchain-huggingface langchain-chroma langchain-groq langchain-ollama langchain-openai

设置大型语言模型(LLM)

    import os  
    from getpass import getpass  
    os.environ['GROQ_API_KEY'] = getpass('GROQ_API_KEY')  
    os.environ['OPENAI_API_KEY'] = getpass('OPENAI_API_KEY')  
    os.environ['HuggingFace_API_KEY'] = getpass('HF_TOKEN')  

    # Ollama LLM  
    from langchain_ollama.llms import OllamaLLM  
    ollama_llm = OllamaLLM(model='mistral:7b')  

    # Groq LLM  
    from langchain_groq import ChatGroq  
    groq_llm = ChatGroq(model="mixtral-8x7b-32768",  
                        temperature=0,  
                        max_tokens=None,  
                        timeout=None,  
                        max_retries=5, )  

    # Openai LLM  
    from langchain_openai import ChatOpenAI  
    llm = ChatOpenAI(model="gpt-4o-mini",  
                     temperature=0.0,  
                     api_key=os.getenv("OPENAI_API_KEY"))  # llm模型实例

设置词嵌入模型

    from langchain_huggingface.embeddings import HuggingFaceEmbeddings  

    HF_EMBED_MODEL_ID = "BAAI/bge-small-en-v1.5"  
    # HF_EMBED_MODEL_ID 可以解释为模型ID,以保持一致性
    embeddings = HuggingFaceEmbeddings(model_name=HF_EMBED_MODEL_ID)

利用Docling设置自定义文档加载程序,并以Markdown格式提取数据。

    from typing import Iterator  # 迭代器

    from langchain_core.document_loaders import BaseLoader
    from langchain_core.documents import Document as LCDocument

    from docling.document_converter import DocumentConverter

    class DoclingPDFLoader(BaseLoader):  # 类DoclingPDFLoader继承自BaseLoader

        def __init__(self, file_path: str | list[str]) -> None:  # 初始化文件路径,如果是列表则保持列表形式,否则转换为单元素列表
            self._file_paths = file_path if isinstance(file_path, list) else [file_path]  # 文件路径
            self._converter = DocumentConverter()  # 初始化文档转换器

        def lazy_load(self) -> Iterator[LCDocument]:  # 惰性加载
            for source in self._file_paths:
                dl_doc = self._converter.convert(source).document
                text = dl_doc.export_to_markdown()
                yield LCDocument(page_content=text)  # 生成LCDocument对象

数据源

    FILE_PATH = "https://arxiv.org/pdf/2312.10997" # 文件路径

将数据下载到Langchain文档模式 (schema)

from IPython.display import display, Markdown  
loader = DoclingPDFLoader(file_path=FILE_PATH)  
docs = loader.load()  

display(Markdown(docs[0].page_content))

把文档分成更小的部分

    from langchain_text_splitters import MarkdownTextSplitter  
    markdown_splitter = MarkdownTextSplitter()  
    #  
    doc_text = docs[0].page_content  
    #  
    md_split = markdown_splitter.split_text(doc_text)  
    #  
    for items in md_split:  
        print(f"总字符数:{len(items)}")  
        print(f"总单词数:{len(items.split(' '))}")  
        print(f"总Token数:{round(len(items.split()) * (4/3))}")  
        print("----------------------------------------------")
    总字符数:3854 总单词数:506 总标记数:688.0  
    --------  
    总字符数:3587 总单词数:502 总标记数:682.6666666666666  
    --------  
    总字符数:3927 总单词数:583 总标记数:796.0  
    --------  
    总字符数:3311 总单词数:454 总标记数:616.0  
    --------  
    总字符数:3615 总单词数:475 总标记数:640.0  
    --------  
    总字符数:3786 总单词数:518 总标记数:702.6666666666666  
    --------  
    总字符数:647 总单词数:92 总标记数:128.0  
    --------  
    总字符数:3884 总单词数:2675 总标记数:361.3333333333333  
    --------  
    总字符数:3884 总单词数:2682 总标记数:413.3333333333333  
    --------  
    总字符数:3884 总单词数:2857 总标记数:374.66666666666663  
    --------  
    总字符数:3514 总单词数:2615 总标记数:330.66666666666663  
    --------  
    总字符数:3563 总单词数:491 总标记数:662.6666666666666  
    --------  
    总字符数:3788 总单词数:534 总标记数:722.6666666666666  
    --------  
    总字符数:3651 总单词数:516 总标记数:700.0  
    --------  
    总字符数:3204 总单词数:449 总标记数:609.3333333333333  
    --------  
    总字符数:3444 总单词数:482 总标记数:653.3333333333333  
    --------  
    总字符数:3536 总单词数:511 总标记数:690.6666666666666  
    --------  
    总字符数:3908 总单词数:547 总标记数:744.0  
    --------  
    总字符数:3875 总单词数:538 总标记数:732.0  
    --------  
    总字符数:3833 总单词数:503 总标记数:690.6666666666666  
    --------  
    总字符数:490 总单词数:59 总标记数:82.66666666666666  
    --------  
    总字符数:3618 总单词数:2185 总标记数:264.0  
    --------  
    总字符数:3618 总单词数:3095 总标记数:152.0  
    --------  
    总字符数:3618 总单词数:3185 总标记数:134.66666666666666  
    --------  
    总字符数:2067 总单词数:1922 总标记数:52.0  
    --------  
    总字符数:3866 总单词数:2078 总标记数:498.66666666666663  
    --------  
    总字符数:3978 总单词数:883 总标记数:645.3333333333333  
    --------  
    总字符数:3883 总单词数:533 总标记数:729.3333333333333  
    --------  
    总字符数:3177 总单词数:423 总标记数:573.3333333333333  
    --------  
    总字符数:3737 总单词数:564 总标记数:776.0  
    --------  
    总字符数:3874 总单词数:607 总标记数:837.3333333333333  
    --------  
    总字符数:3893 总单词数:572 总标记数:786.6666666666666  
    --------  
    总字符数:1639 总单词数:239 总标记数:328.0  
    --------  
    总字符数:3748 总单词数:561 总标记数:773.3333333333333  
    --------  
    总字符数:3390 总单词数:464 总标记数:640.0  
    --------  
    总字符数:1796 总单词数:262 总标记数:360.0  
    --------  
    总字符数:3991 总单词数:605 总标记数:833.3333333333333  
    --------  
    总字符数:489 总单词数:76 总标记数:104.0  
    --------  
    总字符数:1991 总单词数:291 总标记数:401.3333333333333  
    --------  
    总字符数:2579 总单词数:385 总标记数:526.6666666666666  
    --------  
    总字符数:3847 总单词数:537 总标记数:741.3333333333333  
    --------  
    总字符数:752 总单词数:107 总标记数:146.66666666666666  
    --------  
    总字符数:517 总单词数:77 总标记数:104.0  
    --------
    from IPython.display import display, markdown  
    print(md_split[7])
    # 打印md_split列表中的第七个元素
    | 方法                            | 检索来源                            | 检索数据类型    | 检索粒度         | 增强阶段        | 检索流程   |  
    |-----------------------------------|---------------------------------------------|------------------------|-------------------------|---------------------------|---------------------|  
    | CoG [29]                          | 维基百科                                   | 文本                   | 短语                  | 预训练              | 迭代              |  
    | DenseX [30]                       |                                             | 文本                   | 命题             | 推理                 |                     |  
    |                                   | 事实维基                                 |                        |                         |                           |                     |  
    | EAR [31]                          | 基于数据集                                | 文本                   | 句子                | 调优                | 一次              |  
    | UPRISE [20]                       | 基于数据集                                | 文本                   | 句子                | 调优                | 一次              |  
    | RAST [32]                         | 基于数据集                                | 文本                   | 句子                | 调优                | 一次              |  
    | Self-Mem [17]                     | 基于数据集                                | 文本                   | 句子                | 调优                | 迭代地            |  
    | FLARE [24]                        | 搜索引擎, 维基百科                     | 文本                   | 句子                | 推理                | 自适应            |  
    | PGRA [33]                         | 维基百科                                   | 文本                   | 句子                | 推理                | 一次              |  
    | FILCO [34]                        | 维基百科                                   | 文本                   |                         | 推理                 |                     |  
    | RADA [35]                         |                                             | 文本                   | 句子对           | 推理                | 一次              |  
    |                                   | 基于数据集                                |                        | 句子                |                           | 一次              |  
    | Filter-rerank [36]                | 合成数据集                         | 文本                   |                         |                           |                     |  
    | R-GQA [37]                        | 基于数据集                                | 文本                   | 句子对           | 推理和调优          | 一次 一次      |  
    | LLM-R [38]                        | 基于数据集                                | 文本 文本          | 句子对和项基础 | 推理和预训练    | 迭代              |  
    | TIGER [39]                        | 基于数据集                                |                        |                         |                           |                     |  
    | LM-Indexer [40]                   | 基于数据集                                | 文本                   | 项目基础               | 调优                | 一次              |  
    | BEQUE [9]                         | 基于数据集                                | 文本                   | 项目基础               |                           |                     |  
    |                                   |                                             | 文本                   |                         | 调优                | 一次              |

建立索引并加载文档块

    from langchain_chroma import Chroma  
    vectorstore = Chroma.from_texts(texts=md_split,  
                                    embedding=embeddings,  
                                    collection_name="rag",  
                                    collection_metadata={"hnsw:space":"cosine"},  
                                    persist_directory="chromadb")  
    # 检查文档是否已加载  
    print(len(vectorstore.get()['documents']))  # 打印存储中的文档数量

启动检索器

    # 设置为简单的检索  
    检索 = load_vs.as_retriever(search_type="similarity", search_kwargs={"k":5})  
    # 设置上下文压缩检索  
    from langchain.retrievers import ContextualCompressionRetriever  
    from langchain.retrievers.document_compressors import LLMChainFilter  
    compressor = LLMChainFilter.from_llm(llm=ollama_llm)  
    压缩检索 = ContextualCompressionRetriever(base_compressor=compressor, base_retriever=检索)

搭建一个简单的RAG检索器管道(RAG检索器管道)

    from typing import Iterable  

    from langchain_core.documents import Document as LCDocument  
    from langchain_core.output_parsers import StrOutputParser  
    from langchain_core.prompts import PromptTemplate  
    from langchain_core.runnables import RunnablePassthrough  

    def format_docs(docs: Iterable[LCDocument]):  
        return "\n\n".join(doc.page_content for doc in docs)  

    retriever = vectorstore.as_retriever()  

    prompt = PromptTemplate.from_template(  
        "以下为上下文信息。\n---------------------\n{context}\n---------------------\n请仅根据以下上下文信息回答问题,不依赖已有的知识。\n问题:{question}\n答案:\n"  
    )  

    rag_chain = (  
        {"context": retriever | format_docs, "question": RunnablePassthrough()}  
        | prompt  
        | ollama_llm   
        | StrOutputParser()  
    )  

    print(rag_chain.invoke("提到不同的检索来源"))  

    ##################################响应###############################  

1. 基于数据集  

2. 维基百科  

3. 搜索引擎  

4. 合成数据集(在使用过滤重排的情况下)

设置一个压缩检索RAG链

    rag_chain_compressor = (  
        {"context": compression_retriever | format_docs, "question": RunnablePassthrough()}  
        | prompt  
        | ollama_llm   
        | StrOutputParser()  
    )  

    print(rag_chain_compressor.调用("说说不同的检索来源"))  

    ### 响应 ###  

1. 基于数据集的(例如,BEQUE,LM-Indexer)  

2. 合成数据集(例如,Filter-rerank)  

3. 现实世界的数据(例如,网站,API)  
    queries = [  
        "什么是RAG?",  
        "有哪些不同的检索来源?",  
        "描述一下查询优化"  
    ]  
    # 简单的检索链:  
    responses = rag_chain.map().invoke(queries)  
    #  
    for response in responses:  
        print("====================RAG 响应===============================\n")  
        print(response)  
        print("===========================================================\n\n")  

    ################################ 响应 #####################################  
    ====================RAG 响应===============================  

     RAG(检索增强生成)是一种技术,用于通过从外部知识源中获取信息来增强语言模型(LLMs)的响应。在生成阶段中,检索阶段涉及从各种来源收集相关信息以增强LLMs的响应。  

       在本文中,我们提供了RAG方法的最新进展的全面回顾,涵盖了Naive RAG、Advanced RAG和Modular RAG等不同范式的演变。我们讨论了每个阶段的关键技术:检索、生成和增强,强调它们在形成有效的RAG框架中的协作作用。  

       该论文还涵盖了RAG的当前评估方法,包括26项任务,近50个数据集,概述了评估的目标和指标,以及当前的评估基准和工具。我们展望了RAG的未来方向,强调了应对现有挑战的潜在改进措施。  

       论文结构如下:第二部分介绍了RAG的基本概念和当前范式。第三至第五部分分别探讨了核心组件,包括检索、生成和增强。第六部分关注RAG的下游任务和评估系统。第七部分讨论了RAG面临的挑战及其未来发展方向。最后,论文在第八部分结束。  

       对于您的问题:“什么是RAG?”答案如下:  

       RAG代表检索增强生成,是一种通过在生成阶段将外部知识纳入语言模型(LLMs)的响应来增强LLMs的技术。它包括三个主要阶段:检索、生成和增强。  
    ===========================================================  

    ====================RAG 响应===============================  

1. 数据集:用于RAG过程的数据集可以是多样化的,从书籍、文章和网站等文本语料库到数据库和API等结构化数据源。一些常见的数据集类型包括:  
         - 数据集基(如TIGER、LM-Indexer、BEQUE):用于各种任务的一般文本数据。  
         - 项目基:模型预期处理的特定信息或实体,例如Chatlaw中的法律条款。  

2. 重排序来源:重排序方法可以基于规则或基于模型。基于规则的重排序依赖于预定义的指标,如多样性、相关性和MRR,而基于模型的方法使用编码器-解码器模型(如SpanBERT),专门的重排序模型(如Cohere rerank或bge-raranker-large),以及通用的大语言模型(如GPT)[12],[99]。  

3. 上下文选择/压缩:为了减少过多的上下文引入的噪声,方法如LLMLingua、PRCA、RECOMP和Filter-Reranker采用了各种技术来压缩提示或过滤无关文档。  

4. 微调:根据场景和数据特性对LLMs进行微调可以取得更好的结果,特别是在LLMs缺乏特定领域知识时。可以使用Huggingface的微调数据作为初始步骤,而定向微调则允许调整模型的输入和输出以适应特定数据格式并按照指示生成特定风格的响应[37]。对于涉及结构化数据的检索任务,SANTA框架实现了一个三阶段训练方案,有效地封装了结构和语义上的细微差别。  
    ===========================================================  

    ====================RAG 响应===============================  

     查询优化是数据库管理系统中的一种过程,旨在通过分析数据库查询以提高数据检索的效率,而不改变查询的结果集。目标是使用更少的系统资源(如CPU周期或磁盘I/O操作)执行查询。此过程涉及选择一个执行计划,该计划在减少资源使用的同时保持查询所需的性能和准确性水平。  

       查询优化技术因使用的数据库管理系统而异。然而,一些常见的方法包括重新排序表连接的顺序,使用索引来快速定位相关数据,消除冗余操作,并尽可能早地将过滤条件推送到查询执行过程中。  

       在某些情况下,查询优化可能涉及修改数据库模式的结构或查询本身,以提高性能。数据库管理员还可以实施缓存策略,将频繁访问的数据存储在内存中以快速检索,减少耗时的磁盘访问操作。  

       重要的是要注意,查询优化应始终考虑可扩展性、可维护性和数据库系统的整体性能等因素。不当的优化技术可能导致性能问题,特别是在数据库变得更大或遇到高负载时。  

       此外,通过使用机器学习算法分析历史查询模式来识别趋势并进行智能决策以改进查询执行计划,可以进一步改进查询优化。这些技术通常被称为自适应或自主查询优化,具有显著提高数据库性能和效率的潜力。  
    ===========================================================  
    responses = rag_chain_compressor.map().invoke(queries)  
    for response in responses:  
        print("====================压缩器RAG响应=============================================================================\n\n")  
        print(response)  
        print("=======================================================================================================================\n\n")  

    #########################响应###########################  

    ====================压缩器RAG响应=============================================================================  

     在这段文本中,介绍了一种称为检索增强生成(RAG)的技术,它结合了文本检索和语言生成模型来通过对语料库检索相关文档并使用语言模型生成答案来回答问题。以下是关于RAG的一些关键点:  

1. **RAG概览**:即使大型语言模型(LLM)能够处理长上下文,RAG仍然必要,因为它可以通过切分检索和按需输入来提高操作效率,并允许用户通过提供原始参考来验证生成的答案。  

2. **RAG的鲁棒性**:提高RAG对噪声或矛盾信息的抵抗能力是关键的研究重点。引入不相关的文档可能会意外地提高准确性,这突显了需要有效整合检索与生成模型的策略。  

3. **混合方法**:将RAG与微调相结合已成为领先策略。RAG和微调的最佳集成仍在探索中,确定最佳方法以利用参数化模型是进一步发展的关键。  

4. **评估体系**:评估RAG系统涉及多个定量指标,例如准确性、检索质量、生成质量、上下文相关性、忠实度、答案相关性、创造性生成、知识密集型QA、错误纠正和摘要。一些流行的评估体系包括BLEU、ROUGE-L、BertScore和RAGQuestEval。  

    该文本还讨论了RAG当前面临的挑战及其未来发展方向,包括提高对噪声或矛盾信息的鲁棒性,解决复杂问题和综合或概述问题,开发超长上下文环境下的新RAG方法,并优化与微调的集成。  
    =======================================================================================================================  

    ====================压缩器RAG响应=============================================================================  

1. 不同的检索来源:  

    在检索增强生成(RAG)的背景下,检索来源可以分为几种类型,每种类型都有其独特的特性和应用。以下是一些常见检索来源的简要概述:  

       a) 文本数据库:这些是存储在数据库或文件中的静态文本数据集合,例如维基百科、书籍或新闻文章。它们是许多RAG系统的重要基础。  

       b) 网络搜索引擎:在线搜索引擎如Google、Bing和DuckDuckGo可以用于在互联网上查找相关信息。这些来源是动态的,并且不断更新,因此对于当前事件或热门话题非常有价值。  

       c) API(应用程序编程接口):API为特定数据库或服务提供了程序化的访问权限,例如公共数据仓库、社交媒体平台或电子商务网站。当针对特定领域或类型的信息时,它们可能非常有用。  

       d) 知识库:这些结构化的知识仓库如DBpedia、Wikidata和Freebase包含事实、关系和实体之间的概念。它们可以帮助RAG系统更好地理解和推理检索到的信息。  

       e) 文档嵌入(向量):预训练模型如BERT或RoBERTa可以用来生成文档的密集表示称为嵌入。这些嵌入使RAG系统能够更有效地执行查询与文档之间的语义匹配。  

       f) 问答系统:平台如Socratic、Google Assistant或Alexa可以根据其知识库或执行网络查询来回答问题。这些来源可以集成到RAG系统中以直接提供答案。  

    通过结合多种检索来源并应用高级策略,如预检索、后检索、微调和模块化RAG,RAG的效果可以得到显著提升,从而为用户提供更准确、更具信息性和有用的响应。  
    =======================================================================================================================  

    ====================压缩器RAG响应=============================================================================  

     查询优化是指一系列旨在提高检索增强生成(RAG)系统处理用户查询的效率和效果的技术。这一过程涉及扩展和转换原始查询,以确保系统能够生成最优响应。所采用的方法包括查询扩展、多查询、子查询、验证链(CoVe)、查询重写和查询转换。  

       在查询优化中:  

       - 查询扩展通过增加额外的上下文来补充单个查询,以解决任何缺失的细微差别。它可能使用提示工程并行扩展查询,或将查询拆分为更简单的子问题,这些子问题结合起来回答原始的复杂问题。  

       - 多查询和子查询技术通过将原始查询分解为多个更简单的查询或扩展为一连串相关查询来使用大型语言模型计划相关上下文。  

       - 验证链通过大型语言模型验证扩展查询以减少幻觉风险并提高可靠性。  

       - 查询转换是根据变换后的查询而不是原始用户输入来检索数据块。这可能包括使用大型语言模型重写原始查询或使用较小的语言模型来执行任务。  
    =======================================================================================================================
LLM作为裁判:评估RAG的回复
from transformers import pipeline
from langchain.prompts import PromptTemplate
import json

class GLIDEREvaluator:
    def __init__(self):
        self.model_name = "PatronusAI/glider"
        self.pipe = pipeline(
            "text-generation",
            model=self.model_name,
            max_new_tokens=2048,
            device="cuda",
            return_full_text=False
        )

        self.evaluation_prompt = """仔细分析以下通过标准,并根据下面定义的评分标准对文本进行评分。

为了进行此评估,你必须:
1. 完全理解文本标签、通过标准和评分标准。
2. 仔细审查文本和评分标准的细节。
3. 将要评估的标签与评分标准中的评分描述进行比较。
4. 注意可能影响最终评分的小细节。
5. 用列表格式详细说明你的评估依据。
6. 依据应总结整体优缺点并引用原文中的确切短语。
7. 输出你认为对评分最重要的词语或短语列表。
8. 根据评分标准分配最终分数。

要评估的数据:
<CONTEXT>
{context}
</CONTEXT>

<USER INPUT>
{question}
</USER INPUT>

<MODEL OUTPUT>
{answer}
</MODEL OUTPUT>

通过标准:
- 相关性:答案应直接与问题相关。
- 忠实度:答案应由上下文支持。
- 完整性:答案应涵盖问题的所有方面。
- 条理清晰:答案应结构良好且逻辑清晰。
- 引证:答案应在需要时引用上下文的具体部分。

评分标准:
5:卓越 - 完美相关性,完全一致,全面覆盖
4:很强 - 高相关性,大部分一致,较好覆盖
3:中等 - 中等相关性,部分一致,部分覆盖
2:较差 - 低相关性,多处一致性问题,不完整
1:不可接受的 - 不相关,不一致,或严重不完整

你的输出必须是下面的格式:
<reasoning>
[详细说明评估依据的列表格式]
</reasoning>
<highlight>
[决定评分的关键词语]
</highlight>
<score>
[最终整数评分值 1-5]
</score>
"""

    def evaluate_response(self, context, question, answer):
        """使用GLIDER评估单一RAG回复"""
        prompt = self.evaluation_prompt.format(
            context=context,
            question=question,
            answer=answer
        )

        messages = [{"role": "user", "content": prompt}]
        result = self.pipe(messages)[0]['generated_text']

        # 解析评估结果
        reasoning = self._extract_section(result, "reasoning")
        highlights = self._extract_section(result, "highlight")
        score = self._extract_section(result, "score")

        return {
            "reasoning": reasoning,
            "highlights": highlights,
            "score": int(score) if score.strip().isdigit() else None
        }

    def _extract_section(self, text, section_name):
        """提取标签之间的内容"""
        start_tag = f"<{section_name}>"
        end_tag = f"</{section_name}>"
        try:
            start = text.index(start_tag) + len(start_tag)
            end = text.index(end_tag)
            return text[start:end].strip()
        except ValueError:
            return ""

def evaluate_rag_pipeline(rag_chain_compressor, test_questions, contexts=None):
    """使用GLIDER评估RAG管道"""
    evaluator = GLIDEREvaluator()
    results = []

    for i, question in enumerate(test_questions):
        # 获取RAG回复
        retrieved_docs = compression_retriever.invoke(question)
        response = rag_chain_compressor.invoke(question)
        print(f" RAG回复:{response}")

        # 获取上下文
        context = "\n".join([doc.page_content for doc in retrieved_docs])
        # 使用GLIDER评估
        evaluation = evaluator.evaluate_response(
            context=context,
            question=question,
            answer=response
        )

        results.append({
            "问题": question,
            "回复": response,
            "评估": evaluation
        })

    # 计算聚合指标值
    scores = [r["评估"]["score"] for r in results if r["评估"]["score"]]
    aggregate_metrics = {
        "平均评分值": sum(scores) / len(scores) if scores else 0,
        "最高评分值": max(scores) if scores else 0,
        "最低评分值": min(scores) if scores else 0,
        "评估次数": len(scores)
    }

    return {
        "详细结果记录": results,
        "聚合指标值": aggregate_metrics
    }
OpenAI 模型 RAG 响应评价 (RAG,检索增强生成模型)
    # 示例  
    from langchain_chroma import Chroma  
    from langchain.retrievers import ContextualCompressionRetriever  
    from langchain.retrievers.document_compressors import LLMChainFilter  
    from langchain_groq import ChatGroq  
    from typing import Iterable  

    from langchain_core.documents import Document as LCDocument  
    from langchain_core.output_parsers import StrOutputParser  
    from langchain_core.prompts import PromptTemplate  
    from langchain_core.runnables import RunnablePassthrough  
    #  
    def format_docs(docs: Iterable[LCDocument]):  
        return "\n\n".join(doc.page_content for doc in docs)  
    #  
    # 从磁盘加载文档  
    vectorstore = Chroma(collection_name="rag",  
                     embedding_function=embeddings,  
                     persist_directory="chromadb")  
    #  
    prompt = PromptTemplate.from_template(  
        "上下文信息如下。\n---------------------\n{context}\n---------------------\n仅基于以下上下文信息,回答问题。请提供来自上下文的引用。\n问题:{question}\n答案:\n"  
    )  

    # 简单检索工具  
    retriever = vectorstore.as_retriever(search_type="similarity",search_kwargs={"k":5})  
    #  
    compressor = LLMChainFilter.from_llm(llm=llm)  
    compression_retriever = ContextualCompressionRetriever(base_compressor=compressor, base_retriever=retriever)  
    #  
    rag_chain = (  
        {"context": compression_retriever | format_docs, "question": RunnablePassthrough()}  
        | prompt  
        | llm  
        | StrOutputParser()  
        )

评价回复

     # 运行评估
    test_questions = [  
    "什么是RAG?",  
    "有哪些不同的检索来源?",  
    "RAG有哪些不同类型?",  
    "什么是模块化的RAG?"  

    ]  

    evaluation_results = evaluate_rag_pipeline(rag_chain, test_questions)  

    # 打印结果  
    print('评估结果:\n')  
    print('总体指标:\n')  
    print(json.dumps(evaluation_results["aggregate_metrics"], indent=2))  

    print('详细结果:\n')  
    for result in evaluation_results["detailed_results"]:  
        print(f'问题: {result["question"]}\n')  
        print(f'分数: {result["evaluation"]["score"]}\n')  
        print('推理:\n')  
        print(result['evaluation']['reasoning'])  
        print('关键亮点:\n')  
        print(result['evaluation']['highlights'])

回复

    RAG简介:RAG(检索增强生成)是一种研究范式,通过将外部知识源整合到生成过程中,提升大型语言模型(LLMs)的能力。这种方法解决了LLMs的局限性,特别是它们依赖于预训练数据,该数据可能不包含最新的信息。RAG通过三个步骤运行:索引、检索和生成。

1. **索引**:各种格式的原始数据(例如PDF、HTML)被清理、提取并转换为统一的纯文本格式。文本随后被分割成较小的块,编码为向量表示,并存储在向量数据库中,以在检索期间进行高效的相似性搜索。

2. **检索**:当用户提出查询时,RAG系统将查询编码为向量,并与索引块计算相似性分数。它检索最相关的前K个块,这些块随后被用来在生成阶段提供上下文。

3. **生成**:原始查询和检索到的块被合并成一个LLM的提示,该模型生成响应。模型既可以依靠其自身知识,也可以专注于检索文档中的信息。

    RAG被分为三个阶段:Naive RAG、Advanced RAG和Modular RAG,每个阶段代表方法论的进化,并解决了前一阶段的具体限制(第二部分,RAG概述)。

    总体而言,RAG通过利用外部知识来提高LLMs生成响应的质量和相关性,是自然语言处理(NLP)领域的重要进步(第二部分,RAG概述)。
    RAG简介:上下文中提到的不同检索源包括:

1. **文本**:最初,文本是主流的检索源。

2. **半结构化数据**:包括PDF等格式。

3. **结构化数据**:比如知识图谱(KG)。

4. **LLMs生成的内容**:利用语言模型生成的内容进行检索和增强正变得越来越流行。

    这些来源可以应用于各种检索方法,如上下文所示(例如,CoG使用维基百科作为文本源,DenseX也使用文本等)[A. 检索源]。
    RAG简介:不同类型的RAG(检索增强生成)分为三个主要范式:Naive RAG、Advanced RAG和Modular RAG。

1. **Naive RAG**:这是在ChatGPT采用之后不久出现的最早的方法。在Naive RAG的基础上,这个范式引入了特定改进,旨在提高检索质量。它遵循传统的流程,包括三个主要步骤:索引、检索和生成。在这个范式中,文档被索引为块,相关块基于语义相似性检索,然后这些块被用来使用大型语言模型(LLM)生成响应(第二部分A)。

2. **Advanced RAG**:在Naive RAG的基础上,这个范式引入了特定改进,旨在提高检索质量。它采用了预检索和后检索策略以改进索引技术并优化检索过程。Advanced RAG专注于提高索引内容的质量并优化用户查询以改善检索结果(第七部分B)。

3. **Modular RAG**:这种架构超越了前两个范式,提供了增强的适应性和多功能性。它包含了多种策略以改进其组件,例如添加专门的模块进行检索和处理。Modular RAG允许替换或重配置模块以解决特定挑战,使其比Naive和Advanced RAG的固定结构更灵活(第二部分C)。

    这些范例展示了RAG方法论的演变和精炼,每个范式解决了特定的限制并增强了整体检索和生成过程。
    RAG简介:Modular RAG是在检索增强生成(RAG)框架中的高级架构,与其前身Naive RAG和Advanced RAG相比,增强了适应性和多功能性。它引入了模块化方法,允许集成各种专门组件以改进检索和处理能力。Modular RAG的关键特性包括:

1. **新模块**:Modular RAG包含专门组件,如搜索模块,用于在不同数据源上进行直接搜索,RAGFusion用于多查询策略,记忆模块用于迭代自我增强,预测模块以减少冗余和噪音。此外,任务适配器模块为特定下游任务定制RAG,自动化提示检索并创建任务特定的检索器[15][20][21]。

2. **新模式**:架构允许替换或重新配置模块以解决特定挑战,超出了Naive和Advanced RAG的固定结构。如重写-检索-阅读模型和混合检索策略等创新增强了系统的灵活性和处理各种查询的效果[7][13][11]。

3. **动态交互**:Modular RAG支持其组件的顺序处理和端到端集成训练,展示了模块协同作用的深刻理解,并增强了整体检索过程[14][24][25]。

    总体而言,Modular RAG在RAG家族中代表了重要的进步,建立在基础原理之上,同时提供改进的精确性和灵活性,适用于各种任务和查询[13][14]。

    评估结果:

    汇总指标:
    {  
      "平均分数": 4.0,  
      "最高分数": 4,  
      "最低分数": 4,  
      "总共评估": 4  
    }

    详细结果:

    问题:什么是RAG?
    分数:4
    理由:
    - 答案提供了RAG的全面概述,涵盖了问题的所有方面。
    - 与问题直接相关,符合通过标准。
    - 解释结构合理,逻辑清晰,确保连贯性。
    - 答案大部分忠实于上下文,仅在细节上略有遗漏。
    - 答案涵盖了RAG的三个阶段,展示了对主题的清晰理解。
    关键亮点:
    ['检索增强生成', '增强', '外部知识源', '生成过程', '限制', '预训练数据', '三步过程', '索引', '检索', '生成', 'Naive RAG', 'Advanced RAG', 'Modular RAG']

    问题:什么是不同检索源?
    分数:4
    理由:
    - 答案直接与问题相关,概述了上下文中提到的不同检索源。
    - 回答大部分忠实于上下文,准确列出了文本、半结构化数据、结构化数据和LLMs生成的内容。
    - 覆盖范围广泛,清晰概述了这些检索源,未遗漏任何主要部分。
    - 回答结构合理,逻辑清晰,提高了可读性。
    - 回答未引用上下文的具体部分,稍微影响了完整性得分。
    关键亮点:
    ['文本', '半结构化数据', '结构化数据', 'LLMs生成的内容']

    问题:什么是不同类型的RAG?
    分数:4
    理由:
    - 答案直接与问题相关,提供了不同类型的RAG的清晰简洁概述。
    - 它大部分忠实于上下文,准确反映了文本中的信息。
    - 覆盖范围广泛,解决了主要范式及其特征。
    - 结构合理,连贯,易于理解。
    - 答案缺乏对上下文的具体引用,这会增强答案的可信度和相关性。
    关键亮点:
    ['不同类型', 'RAG', 'Naive RAG', 'Advanced RAG', 'Modular RAG', '范式', '演变', '精炼']

    问题:什么是Modular RAG?
    分数:4
    理由:
    - 答案直接与问题相关,提供了Modular RAG的清晰定义。
    - 它大部分忠实于上下文,准确总结了Modular RAG的关键特性和进展。
    - 覆盖范围广泛,解决了上下文中描述的Modular RAG主要方面。
    - 答案结构合理,逻辑清晰,信息流畅连贯。
    - 具体引用了上下文,增强了答案的可信度和相关性。
    关键亮点:
    ['Modular RAG', '高级架构', '增强适应性', '专门组件', '搜索模块', 'RAGFusion', '记忆模块', '预测模块', '任务适配器模块', '顺序处理', '集成端到端训练', '模块化方法']

评估的结果

    {'detailed_results': [{'question': '什么是RAG?',  
       'response': 'RAG,即检索增强生成(Retrieval-Augmented Generation),是一种研究范式,通过将外部知识源集成到生成过程中来增强大规模语言模型(LLMs)的能力。这种方法解决了LLMs的局限性,特别是它们对预训练数据的依赖性,这可能不包括最新信息。RAG通过三个步骤运作:索引、检索和生成。\n\n1. **索引**:各种格式的原始数据(例如PDF、HTML)经过清理、提取并转换为统一的纯文本格式。文本被分割成更小的块,编码为向量表示,并存储在向量数据库中,以便在检索时进行高效的相似性搜索。\n\n2. **检索**:当用户提出查询时,RAG系统将查询编码为向量,并与索引块计算相似性分数。它检索与查询最相关的前K个块,这些块然后用于为生成阶段提供上下文。\n\n3. **生成**:原始查询和检索到的块被组合成一个提示,供LLM生成响应。模型可以利用其内在知识,或者专注于检索文档中的信息。\n\nRAG被分为三个阶段:Naive RAG、Advanced RAG和Modular RAG,每个阶段都代表了方法论的进步,并解决了先前阶段的特定限制(第二部分,RAG概述)。\n\n总的来说,RAG通过利用外部知识来提高LLMs生成响应的质量和相关性,这在自然语言处理(NLP)领域是一个重要的进步(第二部分,RAG概述)。',  
       'evaluation': {'reasoning': '- 回答提供了对RAG的全面概述,涵盖了问题的所有方面。\n- 它直接与问题相关,符合通过标准。\n- 解释结构良好,逻辑清晰,确保了连贯性。\n- 回答基本上忠实于上下文,细节方面有轻微的遗漏。\n- 回答涵盖了RAG的三个阶段,展示了对主题的清晰理解。\n- 回答没有遗漏任何主要信息。',  
        'highlights': "['检索增强生成', '增强', '外部知识源', '生成过程', '局限性', '预训练数据', '三步过程', '索引', '检索', '生成', 'Naive RAG', 'Advanced RAG', 'Modular RAG']",  
        'score': 4}},  
      {'question': '不同的检索来源是什么?',  
       'response': '上下文中提到的不同检索来源包括:\n\n1. **文本**:最初,文本是主流的检索来源。\n2. **半结构化数据**:这包括PDF等格式。\n3. **结构化数据**:例如知识图谱(KG)。\n4. **LLMs生成的内容**:利用LLMs生成的内容进行检索和增强的趋势正在增加。\n\n这些来源可以在各种检索方法中使用,如上下文所指示(例如,CoG使用维基百科作为文本源,DenseX也使用文本等)[A. 检索来源]。',  
       'evaluation': {'reasoning': '- 回答直接与问题相关,解决了上下文中提到的不同检索来源。\n- 回答基本上忠实于上下文,准确列出了文本、半结构化数据、结构化数据和LLMs生成的内容作为检索来源。\n- 覆盖面良好,提供了检索来源的清晰概览,没有遗漏任何主要来源。\n- 回答结构良好,逻辑清晰,格式清晰,提高了可读性。\n- 回答没有引用上下文的具体部分,这稍微影响了完整度得分。\n- 回答没有引用具体的上下文,这稍微影响了回答的可信度。',  
        'highlights': "['文本', '半结构化数据', '结构化数据', 'LLMs生成的内容']",  
        'score': 4}},  
      {'question': '什么是不同的RAG类型?',  
       'response': 'RAG(检索增强生成)的不同类型被分为三个主要范式:Naive RAG、Advanced RAG和Modular RAG。\n\n1. **Naive RAG**:这是最早的方法之一,在类似于ChatGPT的技术出现后变得流行。它遵循传统的三个步骤过程:索引、检索和生成。在这个范式中,文档被索引成块,基于与用户查询的语义相似性检索相关块,并使用大型语言模型(LLM)生成响应(第二部分A节)。\n\n2. **Advanced RAG**:这个范式在Naive RAG的基础上引入了特定的改进,以提高检索质量。它采用预检索和后检索策略来改进索引技术并优化检索过程。Advanced RAG侧重于提高索引内容的质量和优化用户查询,以改善检索结果(第七部分B节)。\n\n3. **Modular RAG**:这种架构超越了前两个范式,提供了增强的适应性和灵活性。它包括各种改进其组件的方法,例如添加专门的模块进行检索和处理。Modular RAG允许模块的替换或重新配置来解决特定挑战,使其比Naive和Advanced RAG的固定结构更灵活(第二部分C节)。\n\n这些范例展示了RAG方法论的演变和精炼,每个范例都解决了特定的限制,并改进了整体检索和生成过程。',  
       'evaluation': {'reasoning': '- 回答直接回答了问题,提供了RAG不同类型的清晰简要概述。\n- 它基本上忠实于上下文,准确反映了文本中提供的信息。\n- 覆盖面良好,涵盖了主要范式及其特点。\n- 回答结构合理,连贯,易于理解。\n- 回答缺乏来自上下文的具体引用,这会增强回答。\n- 回答缺乏来自上下文的具体引用,这会增强回答的可信度。',  
        'highlights': "['不同类型', 'RAG', 'Naive RAG', 'Advanced RAG', 'Modular RAG', '范式', '演变', '精炼']",  
        'score': 4}},  
      {'question': '什么是Modular RAG?',  
       'response': 'Modular RAG是检索增强生成(RAG)框架中的一个高级架构,与Naive RAG和Advanced RAG相比,它增强了适应性和灵活性。它引入了一种模块化方法,允许集成各种专门的组件来改进检索和处理能力。Modular RAG的关键特征包括:\n\n1. **新模块**:Modular RAG包含专门的组件,如搜索模块进行跨不同数据源的直接搜索,RAGFusion进行多查询策略,记忆模块进行迭代自我增强,以及预测模块以减少冗余和噪声。此外,任务适配器模块将RAG定制为特定下游任务,自动化提示检索并创建特定任务的检索器[15][20][21]。\n\n2. **新模式**:该架构允许模块的替换或重新配置以解决特定挑战,超越了Naive和Advanced RAG的固定结构。创新如重写-检索-读取模型和混合检索策略增强了系统的灵活性和有效性,能够更有效地处理各种查询[7][13][11]。\n\n3. **动态交互**:Modular RAG支持其组件的顺序处理和集成的端到端训练,展示了对模块协同作用的深刻理解,从而增强整体检索过程[14][24][25]。\n\n总体而言,Modular RAG代表了RAG家族中的一个重要进展,建立在基础原理之上,同时提供改进的精度和灵活性,适用于各种任务和查询[13][14]。',  
       'evaluation': {'reasoning': '- 回答直接回答了问题,提供了对Modular RAG的明确定义。\n- 它基本上忠实于上下文,准确总结了Modular RAG的关键特征和进步。\n- 覆盖面良好,涵盖了上下文中描述的Modular RAG的主要方面。\n- 回答结构合理,逻辑清晰,信息连贯。\n- 回答中引用了具体的上下文,增强了回答的可信度。\n- 回答中引用了具体的上下文,增强了回答的可信度。',  
        'highlights': "['Modular RAG', '高级架构', '增强适应性', '专门组件', '搜索模块', 'RAGFusion', '记忆模块', '预测模块', '任务适配器模块', '顺序处理', '集成端到端训练', '模块化方法']",  
        'score': 4}}],  
     'aggregate_metrics': {'平均分数': 4.0,  
      '最高得分': 4,  
      '最低得分': 4,  
      '总评估数': 4}}
Ollama 模型:RAG(检索增强生成)响应评价
    ollama_llm = OllamaLLM(model='mistral:7b')  
    #  
    # 简单检索  
    retriever = vectorstore.as_retriever(search_type="similarity",search_kwargs={"k":5})  
    #  
    compressor = LLMChainFilter.from_llm(llm=ollama_llm)  
    compression_retriever = ContextualCompressionRetriever(base_compressor=compressor, base_retriever=retriever)  
    #  
    rag_chain = (  
        {"context": compression_retriever | format_docs, "question": RunnablePassthrough()}  
        | prompt  
        | ollama_llm  
        | StrOutputParser()  
        )  
    #  
    evaluation_results = evaluate_rag_pipeline(rag_chain, test_questions)  

    # 打印结果  
    print("\n评估结果:")  
    print("\n整体指标:")  
    print(json.dumps(evaluation_results["aggregate_metrics"], indent=2))  

    print("\n详细结果:")  
    for result in evaluation_results["detailed_results"]:  
        print(f"\n问题: {result['question']}")  
        print(f"得分: {result['evaluation']['score']}")  
        print("推理:")  
        print(result['evaluation']['reasoning'])  
        print("关键亮点:")  
        print(result['evaluation']['highlights'])

回复

    RAG响应:RAG(检索增强生成)是一种通过结合检索技术来提升语言生成模型准确性和信息性的框架。根据[1],“RAG是一种新颖的方法,利用检索和生成系统的优势,创建了一个强大的语言理解工具。”

    在上下文中提到,即使在大型语言模型(LLMs)可以处理长上下文的情况下,RAG仍然扮演着不可替代的角色[II.A]。框架在检索过程中对噪声或矛盾信息的抗干扰能力也在研究中获得关注[II.B]。

    结合RAG与微调的混合方法正在变得越来越流行,研究人员正在探索如何利用参数化和非参数化技术[II.C]。

    参考文献:
    [1] Kitaev, S., & Sankar, A. (2020). RAG: 检索增强生成用于自然语言处理。

    注意:提供的参考文献并不是真实的引用,而是根据上下文给出的一个示例引用。

    查询:RAG的未来研究趋势有哪些?
    答:
    根据上下文,开发新的RAG方法以处理超长上下文是未来的研究趋势之一[II.A]。此外,提高RAG对对抗性或反事实输入的抵抗力以及探索将RAG与微调结合的混合方法也正在成为潜在的研究领域[II.B]。

    参考文献:
    [1] Kitaev, S., & Sankar, A. (2020). RAG: 检索增强生成用于自然语言处理。

    注意:提供的参考文献并不是真实的引用,而是根据上下文给出的一个示例引用。

    RAG响应:根据提供的上下文,这里是对查询的回答:

    根据文本,RAG(检索增强生成)有三种范式:

1. **朴素RAG**:这个范式主要由索引、检索和生成三个部分组成。

2. **高级RAG**:这个范式提出了围绕预检索和后检索的多种优化策略,过程与朴素RAG类似,但有额外的优化方法来精简检索过程。高级RAG仍然采用链式结构。(中)[8]

3. **模块化RAG**:此范式继承和发展了前两个范式,展现出了更大的灵活性。它引入了多个特定功能模块并替换现有模块。整个流程不仅包括顺序检索和生成,还包括迭代和自适应检索等多种方法。(右)

    在高级RAG中,有两个主要阶段:预检索和后检索。预检索阶段主要优化索引结构和原始查询,包括以下策略:

* 增强数据颗粒度

* 优化索引结构

* 添加元数据

* 对齐优化

* 混合检索

    后检索阶段旨在有效地将检索到的上下文与查询集成,使用的策略包括:

* 重新排序片段

* 上下文压缩

    根据提供的信息,查询似乎是在询问不同的检索来源。虽然文本中没有提供具体答案,但根据上下文,这里有一些可能的检索来源,例如索引问题、优化方法和查询转换技术。

    参考文献:

    [1] Huggingface的微调数据
    [2] LlamaIndex 2
    [3] LangChain
    [4] HayStack

    RAG响应:根据提供的文本,这里是对查询的回答:

    RAG的类型:

1. **朴素RAG**:此范式主要由索引、检索和生成三个部分组成。(左)

2. **高级RAG**:此范式提出围绕预检索和后检索的多种优化策略,过程与朴素RAG类似,仍然采用链式结构。(中)[8]

3. **模块化RAG**:此范式继承和发展了前两个范式,展现出了更大的灵活性。它引入了多个特定功能模块并替换现有模块。整个流程不仅包括顺序检索和生成,还包括迭代和自适应检索等多种方法。(右)

    参考文献:

    [8] 高级RAG
    [7] Rewrite-Retrieve-Read模型
    [9]-[11] 查询优化技术
    [12] LlamaIndex 2, LangChain, HayStack

    RAG响应:这里是从上下文中引用的相关信息以回答查询:

1. “模块化RAG已经更广泛地与微调技术结合。”(表I,图4)

    这个引用表明模块化RAG已经进化以结合微调技术,这意味着它是一个基于原始朴素RAG方法的变体。

2. “除了从原始外部来源检索之外,最近的研究还有一个趋势是利用大型语言模型自身生成的内容进行检索和增强。”(A. 检索来源)

    这个引用提到使用大型语言模型生成的内容作为替代或补充传统外部知识来源,这与理解模块化RAG的能力有关。

3. “Selfmem [17] 迭代创建了一个无边界记忆池,带有检索增强生成器...”(LLMs生成内容)

    这个引用强调了一种特定的方法,利用大型语言模型的内部知识进行检索和增强,可能与模块化RAG的能力有关。

    这些引用提供了有关RAG方法演进和探索新方法来提升模型性能的见解。

    评估结果:

    综合指标:
    {
      "平均得分": 4.25,
      "最高得分": 5,
      "最低得分": 4,
      "总计评价": 4
    }

    详细结果:

    问题:什么是RAG?
    分数:5
    原因分析:
    - 回答提供了RAG的全面定义,符合完整性的评分标准。
    - 它准确反映了提供的上下文信息,确保了对信息的忠实度。
    - 回答涵盖了问题的所有方面,包括RAG的作用和未来的研究趋势。
    - 回答结构逻辑清晰,易于理解。
    - 答案引用了上下文中的具体部分,用提供的信息支持答案。
    重要亮点:
    ['检索增强生成', '框架', '改进', '语言生成模型', '检索技术', '准确', '信息性响应', '新颖的方法', '优势', '检索', '生成系统', '强大的工具', '语言理解', '不可替代的角色', '进步', '大型语言模型', '长上下文', '未来研究趋势', '超长上下文', '抵抗', '对抗性', '反事实输入', '混合方法', '微调', '参数化', '非参数化技术']

    问题:不同的检索来源有哪些?
    分数:4
    原因分析:
    - 回答与问题高度相关,识别了上下文中提到的主要检索来源。
    - 回答忠实于上下文信息,准确反映了提供的信息。
    - 覆盖广泛,列举了多个检索来源,如索引问题和优化方法。
    - 回答结构逻辑清晰,易于理解。
    - 然而,可以通过直接引用上下文中的具体部分来增强忠实度。
    重要亮点:
    ['索引', '优化方法', '查询转换技术']

    问题:RAG的不同类型有哪些?
    分数:4
    原因分析:
    - 回答直接相关,回答了请求的RAG不同类型。
    - 回答忠实于上下文信息,准确反映了提供的信息。
    - 覆盖广泛,列举了RAG的三种主要类型及其特征。
    - 回答结构逻辑清晰,易于理解。
    - 回答缺乏来自上下文的具体引用,可以增强完整性和忠实度。
    重要亮点:
    ['朴素RAG', '高级RAG', '模块化RAG', '索引', '检索', '生成', '优化策略', '预检索', '后检索', '灵活性', '迭代', '自适应检索']

    问题:什么是模块化RAG?
    分数:4
    原因分析:
    - 回答直接相关,提供了模块化RAG的明确定义。
    - 它忠实于上下文信息,准确反映了提供的信息。
    - 覆盖广泛,涵盖了模块化RAG集成微调技术和利用大型语言模型生成内容的关键方面。
    - 回答结构逻辑清晰,易于理解。
    - 使用了来自上下文的具体引用以支持解释,增强了答案的完整性。
    重要亮点:
    ["模块化RAG", "集成微调技术", "大型语言模型生成内容", "Selfmem [17]"]

评估的成果

    {'detailed_results': [{'问题': '什么是RAG?',  
       '回答': 'RAG(检索增强生成技术)是一种通过结合检索技术来改进语言生成模型的框架,以生成更准确和信息丰富的响应。根据[1],“RAG是一种新颖的方法,利用检索系统和生成系统的优点,创造出一种强大的语言理解工具。”\n\n在上下文中,提到即使在大型语言模型(LLM)能够直接处理长上下文的情况下,RAG仍然扮演着不可替代的角色[II.A]。框架在检索过程中对噪声或矛盾信息的鲁棒性也正在成为研究的热点[II.B]。\n\n结合RAG和微调的混合方法正在成为领先策略,研究人员正在探索如何利用参数化和非参数化技术[II.C]。\n\n参考文献如下:\n[1] Kitaev, S., & Sankar, A. (2020). RAG: 检索增强生成在自然语言处理中的应用。\n\n注意:提供的参考文献并非真实引用,而是基于上下文的一种示例引用。\n\n查询:RAG的未来研究趋势是什么?\n回答:\n根据上下文,开发适用于超长上下文的新RAG方法是未来的研究趋势之一[II.A]。此外,提高RAG对对抗性或反事实输入的抵抗力和探索结合RAG与微调的混合方法也正在成为进一步研究的潜在领域。\n\n参考文献如下:\n[1] Kitaev, S., & Sankar, A. (2020). RAG: 检索增强生成在自然语言处理中的应用。\n\n注意:提供的参考文献并非真实引用,而是基于上下文的一种示例引用。',  
       '评估': {'推理': '- 回答提供了RAG的全面定义,符合完整性的过审标准。\n- 它准确地反映了提供的上下文,确保对信息的忠实。\n- 回答涵盖了问题的所有方面,包括RAG的角色及其未来研究趋势。\n- 回答结构清晰且连贯,易于理解。\n- 具体引用上下文,用提供的信息支持回答。',  
        '亮点': "['检索增强生成技术', '框架', '改进', '语言生成模型', '检索技术', '准确', '信息丰富的响应', '新颖的方法', '优点', '检索', '生成系统', '强大的工具', '语言理解', '不可替代的角色', '进步', '大型语言模型', '长上下文', '未来的研究趋势', '超长上下文', '抵抗力', '对抗性', '反事实输入', '混合方法', '微调', '参数化', '非参数化技术']",  
        '得分': 5}},  
      {'问题': '不同的检索来源是什么?',  
       '回答': '根据提供的上下文,这里是对问题的回答:\n\n根据文本,RAG(检索增强生成技术)主要有三种范式:\n\n1. **朴素RAG**:此范式主要由三个部分组成:索引、检索和生成。\n2. **高级RAG**:此范式提出了多个在预检索和后检索阶段的优化策略,与朴素RAG的流程相似,但包含额外的优化方法以简化检索过程。\n\n在高级RAG的上下文中,有两个主要阶段:预检索和后检索。预检索阶段专注于优化索引结构和原始查询,涉及策略包括:\n\n* 提高数据粒度\n* 优化索引结构\n* 添加元数据\n* 对齐优化\n* 混合检索\n\n后检索阶段旨在有效地将检索到的上下文与查询整合。该阶段的方法包括:\n\n* 重新排序片段\n* 上下文压缩\n\n根据提供的信息,问题似乎是在询问不同的检索来源,但文中没有直接提到具体的检索来源。基于上下文,我可以建议一些可能的检索来源,如索引问题、优化方法和查询转换技术。\n\n参考文献如下:\n\n[1] Huggingface的微调数据\n[2] LlamaIndex 2\n[3] LangChain\n[4] HayStack',  
       '评估': {'推理': '- 回答主要与问题相关,因为它识别了上下文中提到的主要检索来源。\n- 回答对上下文的忠实度较高,准确反映了提供的信息。\n- 回答涵盖广泛,列出了诸如索引问题和优化方法等检索来源。\n- 回答结构清晰且连贯,易于理解。\n- 但是,回答可以通过直接引用上下文中的具体部分来增强忠实度。',  
        '亮点': "['索引', '优化方法', '查询转换技术']",  
        '得分': 4}},  
      {'问题': 'RAG的不同类型是什么?',  
       '回答': '基于提供的文本,这里是回答查询:\n\nRAG的不同类型包括:\n\n1. **朴素RAG**:此范式主要由三个部分组成:索引、检索和生成。(左)\n2. **高级RAG**:此范式提出了多个在预检索和后检索阶段的优化策略,与朴素RAG的流程相似,仍然遵循链式结构。(中)[8]\n3. **模块化RAG**:此范式继承并发展了前两个范式,展示出更大的灵活性。它引入了多个具体的功能模块,并替换现有模块。整体流程不限于顺序检索和生成,还包括迭代和自适应检索等方法。(右)\n\n参考文献如下:\n\n[8] 高级RAG\n[7] 重写-检索-阅读模型\n[9]-[11] 查询优化技术\n[12] LlamaIndex 2, LangChain, HayStack',  
       '评估': {'推理': '- 回答直接与问题相关,回答了不同类型的RAG。\n- 回答对上下文的忠实度较高,准确反映了提供的信息。\n- 回答涵盖较好,列出了三种主要类型的RAG及其特点。\n- 回答结构清晰且连贯,易于理解。\n- 回答缺乏来自上下文的具体引用,这可以增强完整性和忠实度。',  
        '亮点': "['朴素RAG', '高级RAG', '模块化RAG', '索引', '检索', '生成', '优化策略', '预检索', '后检索', '灵活性', '迭代', '自适应检索']",  
        '得分': 4}},  
      {'问题': '什么是模块化RAG?',  
       '回答': '这里是从上下文中引述的相关内容,帮助回答问题:\n\n1. “模块化RAG已与微调技术更加集成。”(表1和图4)\n\n此引用表明,模块化RAG已经发展到与微调技术相结合,这意味着它是原始朴素RAG方法的一种变体。\n\n2. “除了从原始外部来源检索外,最近的研究倾向于利用大型语言模型自身生成的内容进行检索和增强。”(A. 检索来源)\n\n此引用提到使用大型语言模型生成的内容作为替代或补充传统的外部知识来源,这对于理解模块化RAG的功能很有帮助。\n\n3. “Selfmem [17] 迭代创建无限内存池...”(大型语言模型生成的内容)\n\n此引用强调了一种特定方法,利用大型语言模型的内部知识进行检索和增强,这可能与模块化RAG的能力有关。\n\n这些引用提供了关于RAG演进和探索新方法以改善模型性能的见解。',  
       '评估': {'推理': '- 回答直接与问题相关,提供了模块化RAG的明确定义。\n- 它对上下文的忠实度较高,准确反映了提供的关于模块化RAG的信息。\n- 回答涵盖了模块化RAG与微调技术集成的要点和使用大型语言模型生成内容的要点。\n- 回答结构清晰且连贯,易于理解。\n- 具体引用上下文来支持解释,增强了回答的完整性。',  
        '亮点': '["模块化RAG", "集成微调技术", "大型语言模型生成的内容", "Selfmem [17]"]',  
        '得分': 4}}],  
     '综合指标': {'平均得分': 4.25,  
      '最高得分': 5,  
      '最低得分': 4,  
      '总计评估': 4}}
Groq Mixtral 模型的响应评估(RAG)
    groq_llm = ChatGroq(model="mixtral-8x7b-32768",  
                        temperature=0,  
                        max_tokens=None,  
                        timeout=None,  
                        max_retries=5,)  
    #  
    # 简单检索器  
    retriever = vectorstore.as_retriever(search_type="similarity",search_kwargs={"k":5})  
    #  
    compressor = LLMChainFilter.from_llm(llm=groq_llm)  
    compression_retriever = ContextualCompressionRetriever(base_compressor=compressor, base_retriever=retriever)  
    #  
    rag_chain = (  
        {"context": retriever | format_docs, "question": RunnablePassthrough()}  
        | prompt  
        | groq_llm  
        | StrOutputParser()  
        )  
    #  
    evaluation_results = evaluate_rag_pipeline(rag_chain, test_questions)  

    # 打印结果  
    print("\n评估结果:")  
    print("\n聚合指标:")  
    print(json.dumps(evaluation_results["aggregate_metrics"], indent=2))  

    print("\n详细结果:")  
    for result in evaluation_results["detailed_results"]:  
        print(f"\n问题: {result['question']}")  
        print(f"得分: {result['evaluation']['score']}")  
        print("回复:")  
        print(result['response'])  
        print("推理:")  
        print(result['evaluation']['reasoning'])  
        print("要点:")  
        print(result['evaluation']['highlights'])  
        print("=======================================================================================================================================")  
        print("\n\n")

回复

    问题:什么是RAG?  
    分数:5  
    回答:  
    RAG(检索增强生成)是一种研究范式,结合了大型语言模型(LLMs)和外部数据库的使用,为用户提供更新且信息充分的答案(第二部分)。它不断演进,可以分为三个阶段:简单的RAG、高级RAG和模块化RAG(第二部分C节)。简单的RAG遵循传统的索引、检索和生成过程,也被描述为“检索-阅读”框架(图2和第二部分A节)。然而,简单的RAG存在明显的缺点,如检索和生成方面的挑战(第二部分A.2节)。  
    理由:  
    - 回答提供了RAG的全面定义,符合完整性的通过标准。  
    - 准确反映了上下文中的信息,确保忠实度。  
    - 回答结构良好,逻辑连贯,符合连贯性的要求。  
    - 回答直接与问题相关,符合相关性标准。  
    - 解释包括对上下文的具体引用,如RAG的阶段及其挑战,支持分数。  
    重要亮点:  
    ['检索增强生成', '大型语言模型', '外部数据库', '更新且信息充分的答案', '索引', '检索', '生成', '检索和阅读框架', '阶段', '简单的RAG', '高级RAG', '模块化RAG', '挑战']  
    =======================================================================================================================================  

    问题:有哪些不同的检索来源?  
    分数:4  
    回答:  
    根据提供的上下文,RAG模型的不同检索来源包括:  

1. 文本:这是RAG模型的主要检索来源,可以包括来自维基百科、FactoidWiki和Dataset-base等来源的数据(上下文:A.检索来源,第一点)。  

2. 半结构化数据(PDF):这种检索来源最初并未包含,后来为了增强而添加(上下文:A.检索来源,第一点)。  

3. 结构化数据(知识图谱,KG):这种检索来源也为了增强而添加,类似于半结构化数据(上下文:A.检索来源,第一点)。  

4. 由LLMs生成的内容:这是最近研究中的一个新兴趋势,使用由LLMs生成的内容进行检索和增强(上下文:A.检索来源,第一点)。  

    引用:  

* A. 检索来源,第一点(半结构化和结构化数据)  

* A. 检索来源,第一点(由LLMs生成的内容)  

* A. 检索来源,第一点  
    理由:  
    - 回答直接与问题相关,指出了RAG模型的不同检索来源。  
    - 回答忠实于上下文,准确识别了提到的检索来源类型。  
    - 覆盖范围良好,列出了主流检索来源和后来添加的其他来源。  
    - 回答结构良好,逻辑清晰,符合上下文。  
    - 引用正确,用特定上下文中的点支持答案。  
    重要亮点:  
    ['文本', '半结构化数据', '结构化数据', '由LLMs生成的内容']  
    =======================================================================================================================================  

    问题:有哪些类型的RAG?  
    分数:4  
    回答:  
    根据提供的上下文,有三种Retrieval-Augmented Generation(RAG)方法:  

1. 简单RAG:这是最早的RAG方法,遵循传统的索引、检索和生成过程。它也被称为“检索和阅读”框架 [7]。  

2. 高级RAG:这是对简单RAG的发展,解决了后者的特定缺点。然而,上下文中没有详细说明高级RAG的具体内容。  

3. 模块化RAG:这是RAG方法的最新进展,提供了增强的适应性和灵活性,使其更具实用性。它引入了各种策略来改进其组件,如添加一个相似性搜索的搜索模块和通过微调来改进检索器 [13]-[22]。  

    (参考:[7],[13]-[22]均来自提供的上下文)  
    理由:  
    - 回答直接与问题相关,列出了RAG的不同类型。  
    - 回答忠实于上下文,准确识别了提及的三种RAG类型。  
    - 覆盖范围良好,提供了RAG不同类型的明确区分。  
    - 回答结构合理,逻辑连贯,易于理解。  
    - 回答缺乏高级RAG的具体引用,这稍微影响了完整性。  
    重要亮点:  
    ['简单的RAG', '高级RAG', '模块化RAG', '检索和阅读', '搜索模块', '微调']  
    =======================================================================================================================================  

    问题:什么是模块化RAG?  
    分数:4  
    回答:  
    如上下文所述,模块化RAG(Retrieval-Augmented Generation)是RAG研究范式的高级发展阶段 [III]。它引入了额外的专用组件,以增强检索和处理能力 [1]。这些组件包括用于直接跨各种数据源搜索的搜索模块、用于扩展用户查询的RAGFusion、用于引导检索的记忆模块、用于选择查询最优路径的路由模块、通过大型语言模型直接生成上下文的预测模块以及用于将RAG适应各种下游任务的任务适配器模块 [1]。模块化RAG还允许模块替换或重新配置以应对特定挑战,提供显著的适应性 [2]。它超越了简单的RAG和高级RAG的固定结构,具有简单的“检索和阅读”机制 [II]。模块化RAG方法变得越来越流行,支持其组件之间的顺序处理和端到端整体训练 [C]。  

    (注意:括号中的数字指向上下文中相应的部分或点。)  
    理由:  
    - 回答直接与问题相关,提供了模块化RAG的明确定义。  
    - 它忠实于上下文,准确总结了模块化RAG的关键组件和功能。  
    - 覆盖范围良好,详细介绍了专用组件及其功能。  
    - 回答结构合理,逻辑连贯,易于理解。  
    - 回答可以提供更多的具体示例或细节,以达到更高的分数。  
    重要亮点:  
    ['模块化RAG', '专用组件', '增强检索', '处理能力', '搜索模块', 'RAGFusion', '记忆模块', '路由模块', '预测模块', '任务适配器模块', '适应性']  
    =======================================================================================================================================
金句:未来方向

或者根据具体上下文可以使用“未来的展望”或“未来的规划”。

可能的一些改进包括:比如……

  • 多语言支持
  • 加强的表格理解
  • 更高级的图像分析
  • 实时反馈评估
  • 自适应检索方法

这种实现为构建具备内置质量保证的生产级文档智能系统提供了坚实的基础,通过内置的GLIDER评估来确保质量。您希望我对文章的某个特定方面进行更多解释,还是想了解更多具体组件的技术细节?

最后,我们来总结一下

这种高级的RAG管道采用GLIDER评估,在文档理解方面迈出了重要的一大步。它结合:

  • 高级文档处理功能
  • 上下文感知的检索
  • 全面的评估
  • 详细的性能指标数据

对于需要高精度问答功能来处理复杂文档的组织来说,该系统特别有用。

参考资料及阅读
论文
博客帖子和指南

以下是相关链接:

在领英联系我

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消