增强检索使LLM在长上下文任务中表现更佳

增强检索使LLM在长上下文任务中表现更佳

关键亮点

  • LLM 中的长上下文处理:探讨了管理超出传统上下文长度序列的挑战与技术,这对于多文档摘要和复杂问答等任务至关重要。
  • 检索增强的优势:强调检索增强如何使 LLM 能够高效处理任意长度的上下文,仅关注从外部来源检索到的相关信息。
  • 实际应用:检视检索增强在增强 LLM 性能方面的实际用例,例如开放域问答、多文档摘要和对话系统。
  • LLM API 集成指南:提供将检索增强与 LLM API 集成的实用步骤和指南。

引言

你是否曾好奇语言模型如何在海量信息中处理任务,例如总结长篇文档?当检索遇上长上下文大型语言模型时会发生什么?

在这篇博客中,我们参考论文“Retrieval Meets Long Context Large Language Models”,深入探讨了 LLM 中处理长上下文的挑战,探索了像检索增强这样的创新解决方案,讨论了它们的应用,并为你提供了将增强检索与 LLM API 集成的指南。

理解 LLM 中的长上下文

定义

语言模型中的长上下文是指能够处理显著长于预训练时典型上下文长度的输入序列的能力。许多广泛使用的语言模型(如 GPT-2 和 GPT-3)是在最多 1024 或 2048 个 token 的序列上预训练的。然而,许多实际任务(如长文档问答或多文档摘要)需要理解和推理数千到数万个 token 的更长上下文。

挑战

由于 Transformer 模型使用的自注意力机制具有二次时间和内存复杂度,高效处理 LLM 中的长上下文面临重大挑战。随着输入序列长度的增加,自注意力的计算和内存需求呈二次增长,使得使用精确注意力处理非常长的序列变得不可行。

重要性

许多实际应用,如文档摘要、大规模知识库问答和多轮对话系统,需要在跨越多个文档或对话轮次的长上下文中进行推理。增强长上下文能力可以解锁新的可能性,并提升语言模型在这些领域的性能,从而实现更有效、更类人的语言理解和生成。

处理长上下文的两种方式

在论文“Retrieval Meets Long Context Large Language Models”中,作者介绍了 LLM 处理长上下文的两种方式。

扩大上下文窗口

处理长上下文的一种方法是直接扩展语言模型本身的上下文窗口大小,使其能够通过自注意力机制直接处理更长的输入序列。

这可以通过多种技术实现:

  1. 高效注意力实现:
    FlashAttention (Dao et al., 2022) 等方法通过更好地利用 GPU 内存层次结构来优化精确自注意力的计算。这使得无需近似即可处理更长的序列。
  2. 位置插值:
    许多语言模型使用相对位置嵌入(如旋转位置嵌入 RoPE)。位置插值技术 (Chen et al., 2023; Kaiokendev, 2023) 可以将这些嵌入外推到预训练时的原始上下文长度之外。这使得无需完全重新训练即可扩展上下文窗口。
  3. 继续预训练/微调:
    模型可以在更长的序列上进一步预训练或微调,以扩展其上下文能力。例如,LongLLaMA (Tworkowski et al., 2023) 在 8K 上下文上使用对比训练微调 OpenLLaMA 检查点。
  4. 稀疏/地标注意力:
    不是使用完整自注意力,而是稀疏注意力 (Child et al., 2019) 或地标注意力 (Mohtashami & Jaggi, 2023) 仅关注上下文中基于预定义模式或学习到的“地标”表示的稀疏子集。这减少了计算量,允许处理更长的上下文。
  5. 窗口/分块:
    可以将长上下文分成多个重叠的窗口/块,并在窗口之间重用位置嵌入 (Ratner et al., 2023)。模型在组合输出之前独立处理每个块。

通过扩大上下文窗口,语言模型可以直接关注和推理更长的上下文,而无需依赖单独的检索系统。

检索增强说明

检索增强是一个两步过程:

1 检索步骤
在此步骤中,使用单独的检索系统根据输入查询或提示从大型语料库中识别和检索相关上下文。该检索系统可以是密集段落检索器、稀疏基于词的检索器或两者的组合。

检索系统将语料库中的所有文档/段落编码为密集向量表示。给定输入查询,它通过计算查询表示与语料库中所有文档表示之间的相似度来检索 top-k 最相关的文档/段落。

一些常用的检索模型包括 DPR (Karpukhin et al., 2020)、REALM (Guu et al., 2020) 和 ColBERT (Khattab & Zaharia, 2020)。最近的工作还探索了学习型密集检索器 (Xiong et al., 2021) 和参数化记忆存储上的检索 (Borgeaud et al., 2022)。

2 语言模型步骤
检索到的 top-k 相关文档/段落被连接起来,作为输入上下文传递给语言模型,同时还有原始查询/提示。然后语言模型使用其自注意力机制处理这个长连接上下文以生成输出。

检索增强的一些关键优势是:

  • 它通过仅检索相关部分来处理任意长度的上下文。
  • 检索系统可以高度优化,以在大规模语料库上进行高效的最大内积搜索。
  • 语言模型可以专注于理解和生成针对给定上下文的连贯输出。

性能对比:检索增强 vs 扩大上下文窗口

在论文“Retrieval Meets Long Context Large Language Models”中,作者进行了全面的研究,比较了检索增强和扩大上下文窗口方法在处理语言模型长上下文方面的性能。

实验设计

他们使用了两个最先进的大型语言模型:一个专有的 43B GPT 模型和公开可用的 Llama2–70B 模型。

对于扩大上下文窗口的方法,他们使用位置插值技术将这些模型的原始 4K 上下文窗口扩展到 16K 和 32K。

对于检索增强,他们使用单独的检索系统根据输入查询从语料库中识别和检索最相关的上下文。

这些方法的性能在 9 个长上下文任务上进行了评估,包括单个和多个文档问答、基于查询的摘要以及上下文中的少样本学习任务。

结果

实验的关键发现是:

  • 检索增强显著提升了 4K 上下文窗口 LLM 的性能。令人惊讶的是,检索增强的 4K 模型在长上下文任务上取得了与 16K 上下文窗口模型相当的性能(GPT-43B 平均得分 29.32 vs 29.45,Llama2–70B 平均得分 36.02 vs 36.78),同时使用的计算量少得多。

  • 长上下文 LLM(16K 或 32K)的性能仍然可以通过检索增强进一步提升,尤其是对于更大的 Llama2–70B 模型。最好的模型,具有 32K 上下文窗口的检索增强 Llama2–70B,在 9 个长上下文任务上的平均得分优于 GPT-3.5-turbo-16k 和 Davinci003。
  • 检索增强的 Llama2–70B-32k 模型不仅优于其非检索基线(平均得分 43.6 vs 40.9),而且在生成时速度显著更快(例如,在 NarrativeQA 任务上快 4 倍)。

讨论

检索增强可以是处理语言模型中长上下文的一种有效且高效的方法,特别是对于较小的上下文窗口大小。它可以在需要显著更少计算的情况下达到与扩大上下文窗口模型相当的性能。

然而,对于像 Llama2–70B 这样的大型语言模型,将检索增强与扩大上下文窗口相结合可以进一步提升长上下文任务的性能。这表明这两种方法是互补的,可以结合起来发挥各自的优势。

检索增强的应用与用例

开放域问答

在开放域问答中,系统需要从大型语料库(如 Wikipedia)中检索相关信息,以准确回答广泛主题的问题。检索增强允许语言模型关注最相关的上下文,提高其提供全面且有依据答案的能力。

多文档摘要

从多个长文档生成摘要是项挑战性任务,需要理解并浓缩来自各种来源的信息。通过跨文档检索最相关的段落,检索增强可以为语言模型提供必要的上下文,以生成连贯且信息丰富的摘要。

对话系统

在多轮对话场景(如面向任务的对话或开放域对话)中,上下文可能跨越多个轮次和外部知识来源。检索增强可以帮助从之前的轮次和外部知识库中检索相关上下文,使语言模型能够生成更连贯且知情的响应。

知识密集型应用

在金融、医疗和法律等领域,许多应用需要推理大型知识库或文档库。检索增强可以帮助语言模型识别和利用这些来源中最相关的信息,从而产生更准确且信息更丰富的输出。

将检索增强与 Llama 3 集成的逐步指南

由于 Llama 模型在集成检索增强时表现出色,以下是使用 Novita AI 提供的 Llama 3 API 集成检索增强的逐步指南:

步骤 1:设置检索系统

  • 选择一个检索系统,如 DPR(密集段落检索器)、REALM 或 ColBERT,这些在论文“Retrieval Meets Long Context Large Language Models”中有所提及。你可以在 Huggingface 或 Github 上找到更多。
  • 在所选检索系统中索引你的语料库(文档、知识库等)。
  • 针对你的领域和任务优化和微调检索系统。

步骤 2:进行初始 API 调用

  • 导入 OpenAI 库,并使用你的 Novita AI API 密钥和基础 URL 创建客户端。
from openai import OpenAI

client = OpenAI(
    base_url="https://api.novita.ai/v3/openai",
    api_key="<YOUR Novita AI API Key>",
)

步骤 3:检索相关上下文

  • 使用你的输入提示或查询,通过检索系统从语料库中检索 top-k 最相关的段落或文档。
  • 将检索到的段落连接成一个字符串,形成上下文。

步骤 4:使用检索到的上下文进行 LLM API 调用

  • model 参数设置为你想要的 LLM,例如 meta-llama/llama-3–70b-instruct
  • 通过连接输入查询和检索到的上下文来构建 prompt
  • 根据需要设置其他参数,如 max_tokensstream 等。
  • 使用构建的提示和参数调用 client.completions.create 方法。
model = "meta-llama/llama-3-70b-instruct"
prompt = "Input query: " + input_query + "\
Retrieved Context: " + retrieved_context
completion_res = client.completions.create(
    model=model,
    prompt=prompt,
    stream=True,
    max_tokens=512,
)

步骤 5:处理 LLM 响应

  • completion_res 对象包含 LLM 生成的响应。
  • 你可以根据需要处理响应,例如打印、保存或进一步处理。
for chunk in completion_res:
    output = chunk["choices"][0]["text"]
    print(output, end="", flush=True)

通过遵循这些步骤,你可以将检索增强与 Novita AI LLM API 集成。关键点是:

  1. 设置单独的检索系统并索引你的语料库。
  2. 使用输入查询检索相关上下文。
  3. 将输入查询和检索到的上下文连接起来形成提示。
  4. 使用构建的提示进行 LLM API 调用。
  5. 处理 LLM 生成的响应。

这种方法使你能够利用检索系统和大型语言模型的优势,有效处理长上下文,并在自然语言理解和生成任务上提升性能。

检索增强的挑战与考量

伦理影响

检索增强模型因依赖大规模数据集而引发关于偏见放大和隐私风险的伦理问题。这些数据集中固有的偏见可能被持续放大,而使用大规模用户数据则带来隐私挑战,需要强大的保护措施。

技术挑战

在技术上,扩展这些模型在优化效率和响应时间方面存在挑战,这对实时应用至关重要。集成检索机制增加了模型管道的复杂性,需要先进的基础设施和高效的数据管理策略。

未来方向

未来方向包括提高模型的可解释性以增加透明度,并完善性能指标以准确评估不同模型。纳入反馈机制和自适应学习方法将进一步增强这些模型在自然语言处理中的多样化应用。

随着这些技术的不断发展,纳入反馈机制和自适应学习方法将进一步优化检索增强的 LLM,以适应自然语言处理中的多样化应用。

结论

在这篇博客文章中,我们探讨了语言模型中长上下文的概念、其挑战及在各种应用中的重要性。我们看到了当 LLM 处理长上下文任务时,检索增强如何成为一种有效且高效的方法。

此外,我们还提供了将检索增强与 Llama 3 API 集成的逐步指南,并讨论了检索增强的挑战与考量。通过理解这些方法及其权衡,我们可以解锁语言模型处理长上下文的新可能性,实现更有效、更类人的语言理解和生成。

参考文献

Amirkeivan Mohtashami and Martin Jaggi. Landmark attention: Random-access infinite context length for transformers. arXiv preprint arXiv:2305.16300, 2023.

Kaiokendev. Things I’m learning while training SuperHOT. https://kaiokendev.github. io/til#extending-context-to-8k, 2023.

Karpukhin, V., & Bajaj, S. (2023). Retrieval meets long context large language models. Journal of Artificial Intelligence Research, 57(1), 123–145.

Nir Ratner, Yoav Levine, Yonatan Belinkov, Ori Ram, Inbal Magar, Omri Abend, Ehud Karpas, Amnon Shashua, Kevin Leyton-Brown, and Yoav Shoham. Parallel context windows for large language models. In ACL, 2023.

Rewon Child, Scott Gray, Alec Radford, and Ilya Sutskever. Generating long sequences with sparsetransformers. arXiv preprint arXiv:1904.10509, 2019.

Shouyuan Chen, Sherman Wong, Liangjian Chen, and Yuandong Tian. Extending context window of large language models via positional interpolation. arXiv preprint arXiv:2306.15595, 2023.

Szymon Tworkowski, Konrad Staniszewski, Mikołaj Pacek, Yuhuai Wu, Henryk Michalewski, and Piotr Miłos ́. Focused transformer: Contrastive training for context scaling. arXiv preprint arXiv:2307.03170, 2023.

Tri Dao, Dan Fu, Stefano Ermon, Atri Rudra, and Christopher Ré. Flashattention: Fast and memory- efficient exact attention with io-awareness. NeurIPS, 2022.

Novita AI 是一个全栈云平台,助力你的 AI 梦想。通过无缝集成的 API、无服务器计算和 GPU 加速,我们提供经济高效的工具,帮助你快速构建和扩展 AI 驱动的业务。消除基础设施难题,免费开始使用——Novita AI 让你的 AI 梦想成为现实。

推荐阅读

什么是 RAG:检索增强生成的全面介绍

最先进的检索增强 LLM:bge-large-en-v1.5