导航

大语言模型优化方法简介:Prompt、RAG、Fine-tuning

Posted on 2024-01-05 16:41  蝈蝈俊  阅读(1249)  评论(0编辑  收藏  举报

GPT、LLama、Gemini等大语言模型虽展现出强大能力,但在实际应用中仍有问题,例如在准确性、知识更新速度和答案透明度方面,仍存在挑战。

论文“Retrieval-Augmented Generation for Large Language Models: A Survey(面向大语言模型的检索增强生成技术:调查)
https://arxiv.org/abs/2312.10997 对解决这些问题的模型优化方法做了分类,如下图:

图:模型优化方法的比较,两个坐标轴分别是:对外部知识的需求和模型的适配复杂度。

附:这篇论文的中文翻译推荐看宝玉翻译的版本:
https://baoyu.io/translations/ai-paper/2312.10997-retrieval-augmented-generation-for-large-language-models-a-survey

一、Prompt Engineering 提示词工程

提示词工程可以分三个层次:

  • 标准提示词
  • Few-shot 少量示例提示词,通过提供少量的示例来让模型回答的更精准。
  • XoT 提示词,例如 CoT(思维链),ToT(思维树),参看 使用思维链写Prompt

下面是一个 Few-shot prompt的示例:

A "whatpu" is a small, furry animal native to Tanzania. An example of a sentence that uses
the word whatpu is:
“whatpu”是坦桑尼亚的一种小型毛茸茸的动物。一个使用whatpu这个词的句子的例子是:

We were traveling in Africa and we saw these very cute whatpus.
我们在非洲旅行时看到了这些非常可爱的whatpus。

To do a "farduddle" means to jump up and down really fast. An example of a sentence that uses the word farduddle is:
“farduddle”是指快速跳上跳下。一个使用farduddle这个词的句子的例子是:

输出:

When we won the game, we all started to farduddle in celebration.
当我们赢得比赛时,我们都开始庆祝跳跃。

二、RAG 检索增强生成

检索增强生成(Retrieval-Augmented Generation, RAG) 特指一种模式:模型在回答问题或生成文本时,首先从广阔的文档库中寻找相关信息。然后,模型使用这些找到的信息来生成回答或文本,从而提高其预测的准确度。

论文中把RAG分成三种范式:

  • Naive RAG 朴素RAG, 添加相关上下文
  • Advanced RAG 高级RAG,在索引/检索前/检索后做优化
  • Modular RAG 模块化RAG,有机组合多种模块

下图是三种RAG范式的比较

2.1、Naive RAG 朴素RAG

Naive RAG 的准备流程如下:

  • 将文本分割成小块;
  • 然后使用某种 Transformer Encoder 模型将这些小块转换为向量;
  • 把这些向量汇总到一个索引中;

在使用时,创建一个针对大语言模型的提示,指导模型根据我们在搜索步骤中找到的上下文回答用户的查询。

下面是一个RAG例子,中文的prompt在注释里:

def question_answering(context, query):
    # 请回答后面用三个反引号 ```{query}``` 包围的问题,
    # 回答时参考用三个反引号 ```{context}``` 包围的参考信息。
    # 如果提供的上下文中没有相关信息,尝试自己回答,但要告诉用户你没有相关的上下文作为回答的依据。
    # 回答要简洁,输出的答案少于80个token。
    prompt = f"""
Give the answer to the user query delimited by triple backticks ```{query}```\
using the information given in context delimited by triple backticks ```{context}```.\
If there is no relevant information in the provided context, try to answer yourself,
but tell user that you did not have any relevant context to base your answer on.
Be concise and output the answer of size less than 80 tokens.
"""

    response = get_completion(instruction, prompt, model="gpt-3.5-turbo")
    answer = response.choices[0].message["content"]
    return answer

这种原始RAG在三个方面面临挑战:检索质量、回应生成质量和增强过程。

挑战1:检索质量

该方面的问题多方面。最主要的问题是低精度,即检索集中的文档块并不都与查询内容相关,这可能导致信息错误或不连贯。

其次是低召回率问题,即未能检索到所有相关的文档块,使得大语言模型无法获取足够的背景信息来合成答案。

此外,过时信息也是一个挑战,因为数据冗余或过时可能导致检索结果不准确。

挑战2:回应生成质量:

这方面的问题同样多样。最突出的问题是制造错误信息,即模型在缺乏足够上下文的情况下虚构答案

另一个问题是回答不相关,即模型生成的答案未能针对查询问题。

进一步来说,生成有害或偏见性回应也是一个问题。

挑战3:增强过程:

最终,增强过程面临几个重要挑战。特别重要的是,如何将检索到的文段的上下文有效融入当前的生成任务。如果处理不得当,生成的内容可能显得杂乱无章。当多个检索到的文段包含相似信息时,冗余和重复成为问题,这可能导致生成内容的重复。

此外,如何判断多个检索到的文段对生成任务的重要性或相关性非常有挑战性,增强过程需要恰当地评估每个文段的价值。检索到的内容可能具有不同的写作风格或语调,增强过程需调和这些差异,以确保最终输出的一致性。

最后,生成模型可能会过度依赖于增强信息,导致生成的内容仅是重复检索到的信息,而缺乏新的价值或综合信息

2.2、Advanced RAG 高级RAG

为了克服 Naive RAG 的局限性,高级 RAG 进行了针对性的改进。


比起 Naive RAG,增加了下面优化:

  • “Pre-Retrieval”(检索前)优化,例如:细粒度数据清洗、添加文件结构以及查询重写/澄清等。
  • “Post-Retrieval”(检索后)优化,从向量数据库检索后的优化,例如:重排序、过滤和提示压缩等。

2.3、Modular RAG 模块化RAG

高级 RAG 的实现比较复杂,因为需要额外开发很多功能,模块化 RAG 将这些功能模块解耦,并将其作为一个独立的模块,这样大大降低实现的复杂性,提升灵活性、效率、可扩展性。

具体来说,包含下面这些模块和模式:

2.3.1、Modules 新模块

  • 图中外层包括“Search 搜索”、“Predict 预测”、“Memory 记忆”、“Criticize 评估”、“Demonstrate 验证”、“Fusion 对齐” 这六个模块。
  • 内层是包括“Retrieve 检索”、“Rerank 重排序”、“Rewrite 重写”和“Read 阅读”过程的RAG(检索增强生成)模块。

2.3.2、Patterns 新模式

涉及多种信息处理流程,这些显示了系统处理信息并响应用户查询的不同路径。

  • Navie RAG : Retrieve 检索 → Read 阅读
  • Advanced RAG : Rewrite 重写 → Retrieve 检索 → Rerank 重排序 → Read 阅读
  • DSP : Demonstrate 验证 → Search 搜索 → Predict 预测
  • ITER - RETGEN : Retrieve 检索 → Read 阅读 → Retrieve 检索 → Read 阅读

三、Fine-tuning 微调

比RAG更复杂的就是微调了,微调方法是为了提高模型在特定任务上的表现,根据关注的焦点不同,分三种:

  • 检索器微调专注于改进信息查找过程,
  • 生成器微调专注于改进输出的质量,
  • 协同微调则旨在优化这两个组件之间的协作。

3.1、Retriever Fine-tuning(检索器微调)

检索器是指模型中用来从大量数据中检索信息的部分,通常用于处理需要查找和利用外部知识的任务,如问答系统。

微调检索器就是对这部分模型进行特殊训练,使其更擅长从数据集中找到相关信息。

举个例子,就像在图书馆中训练一个图书管理员,使其更快地找到你需要的书。

3.2、Generator Fine-tuning(生成器微调):

生成器是模型中负责产生响应或输出的部分,如文本生成模型中创建新文本的部分。

微调生成器意味着特别训练这个部分,使其在产生输出时更准确、更符合目标任务的要求。

例如,如果你想让模型写诗,你会特别训练它理解和使用诗歌的结构和韵律。

3.3、Collaborative Fine-tuning(协同微调)

这是一种更复杂的微调方法,涉及到模型中的检索器和生成器同时被调整,以更好地协同工作完成任务。

在协同微调过程中,检索器和生成器相互学习,以提高整体性能。检索器提供的信息可以帮助生成器产生更准确的输出,而生成器的需求可以引导检索器寻找更相关的信息。

可以想象成一个团队工作的情况,团队中的每个成员(检索器和生成器)都在相互学习,以更好地协作完成任务。

四、总结

大型语言模型(如GPT、LLama、Gemini)在准确性、知识更新速度和答案透明度方面存在挑战,常用的解决优化方法:Prompt Engineering(提示词工程)、Retrieval-Augmented Generation(RAG,检索增强生成)和Fine-tuning(微调)。每种方法都有不同的层次和特点。

Prompt Engineering:通过使用标准提示词、Few-shot提示词和XoT提示词(如CoT和ToT),来提高模型的回答精准度。

RAG:模型首先从文档库中寻找相关信息,然后使用这些信息来生成回答或文本。RAG分为三种类型:

  • Naive RAG:添加相关上下文。
  • Advanced RAG:在索引/检索前后进行优化。
  • Modular RAG:组合多种模块。

Fine-tuning:涉及检索器微调、生成器微调和协同微调,旨在提高模型在特定任务上的表现。检索器微调专注于改进信息查找过程,生成器微调专注于改进输出质量,协同微调则优化这两个组件间的协作。