gpt4 book ai didi

LLMRAG系列

转载 作者:撒哈拉 更新时间:2024-04-01 10:44:21 55 4
gpt4 key购买 nike

RAG系列

本文介绍了RAG以及RAG pipeline的整个流程,包括请求转换、路由和请求构造、索引和检索、生成和评估等,其中引用了大量有价值的论文.

参考Advanced RAG Series: Generation and Evaluation中的5篇文章,并丰富了相关内容.

image

请求转换

请求转换是为了提高查询结果的准确性而对用户请求进行重构、优化的过程.

为什么需要RAG?

  • 问题1:LLMs并不了解你的数据,且无法获取与此相关的最新数据,它们是事先使用来自互联网的公共信息训练好的,因此并不是专有数据库的专家也不会针对该数据库进行更新.

    image
  • 问题2:上下文窗口-每个LLM都有一个tokens的最大限制(通常平均为100tokens,约75个单词),用于限制用户每次提交的tokens数据,这会导致丢失上下文窗口之外的上下文,进而影响准确性、产生检索问题和幻觉等.

    image
  • 问题3:中间遗失-即使LLMs可以一次性接收所有的数据,但它存在根据信息在文档中的位置来检索信息的问题。研究表明如果相关信息位于文档中间(而非开头或结尾时)时就会导致严重的性能降级.

因此,我们需要RAG.

请求转换

请求分解

由于用户问题可能太含糊、太特殊或缺少上下文,因此LLM可能无法很好地处理这些问题。通常会建议在将请求发送到嵌入模型之前对其进行重构。下面是一些重构方式:

  • 重写-检索-读取: 这种方式注重对用户的查询进行重构(而不仅仅是采用retriever或reader,左侧图示)。它使用一个LLM生成一个查询,然后使用web查询引擎来检索内容(中间图示)。此外还需要在pipeline中使用一个小型语言模型来进一步对齐结果(右侧图示).

    image
  • 对问题进行浓缩或改写:通常用于会话中,通过把对话改写成一个好的独立问题来给聊天机器人提供上下文。Langchain的一个提示模板示例如下:

    "Given the following conversation and a follow up question, rephrase the follow up \ question to be a standalone question.
    
    Chat History: {chat_history}
    
    Follow Up Input: {question}
    
    Standalone Question:"
    
  • RAG Fusion: 将RAG和倒数排名融合(RRF)结合。生成多个查询(从多个角度添加上下文),并使用倒数分数对查询结果重新排序,然后将文档和分数进行融合,从而得到更全面和准确的回答.

    image
  • Step-Back Prompting:这是一种更加技术性的提示技术,通过LLM的抽象来衍生出更高层次的概念和首要原则。这是一个对用户问题的迭代过程,用于生成一个"后退一步"的问题(step back question),然后使用该问题对应的回答来生成最终的回答.

  • Query Expansion:这是一个通过为LLM提供一个查询并生成新的内容来扩展查询的过程。适用于文档检索,特别是Chain-of-Thought(CoT 思维链)提示.

    使用生成的答案进行扩展:该方式中,让LLM基于我们的查询生成一个假设的回答,然后将该回答追加到我们的查询中,并执行嵌入搜索。通过使用假设的答案来扩展查询,这样在进行嵌入搜索时可以检索到其他相关向量空间,进而可以提供更准确的回答.

    使用多个查询进行扩展:使用LLM基于我们的查询来生成额外的类似查询,然后将这些额外的查询和原始查询一起传给向量数据库进行检索,从而可以大大提升准确性。注意需要通过对提示进行迭代来评估哪些提示会产生最佳结果.

    image

伪文档(Psuedo documents)

伪文档嵌入 (HyDE):当向向量数据库询问问题时,该数据库有可能不会很好地标记相关性。因此更好的方式是先创建一个假设的回答,然后再查询匹配的向量。需要注意的是,虽然这比直接查询到答案的嵌入匹配要好,但对于高度不相关的问题和上下文,产生幻觉的可能性也会更高,因此需要对过程进行优化,并注意这些边缘情况.