基于 LLM 的应用架构 RAG

RAG(Retrieval Augmented Generation),是指“检索增强生成”,它主要通过检索已有文档(如,企业内部,或者某一领域,或者某个垂直行业等等的内容)的方式,进而将得到的结果作为输入 LLM 的 Prompt 更相关的上下文 Context 来给出更好的回答。
我们都知道,对于一些通用的 LLM,它们所能回答的内容是基于训练该 LLM 时使用的数据集,而且由于模型超大所以使用的训练数据的时效性也是会差一些。而对于某个特定的领域内的内容, LLM 它可能没有或者“知道”得不够精细,甚至对一些最新变化的内容它也不一定包含,所以,需要通过一些方法将 LLM 所不包含的内容“增强”进去,这样就有了类似 RAG 之类的方法,能够解决我们所面临的一些问题。
具体来说,使用 RAG 能够获得的好处,可以概括成如下 4 点(来自 databricks,详见文末参考链接):

  1. Providing up-to-date and accurate responses
  2. Reducing inaccurate responses, or hallucinations
  3. Providing domain-specific, relevant responses
  4. Being efficient and cost-effective

使用 RAG 构建基于 LLM 的应用,基本流程如下图所示:
RAG
通过上图可以看到,主要流程包含三个部分:

  • 基于已有文档构建 Vector DB

将已有的各种文档进行分块处理,它们会作为输入 LLM 的 Context,这时需要将其转换成 Embedding,保存到 Vector DB。为了方便终端用户输入 Prompt 时进行匹配得到对应的最相关分块,同时,还要保存分块文本到对应 Embedding 的映射,这样就能快速得到分块文本作为输入 LLM 的 Context。
该步骤的更详细处理流程,参考如下图所示:
Vector-DB-Creation

  • 构建 LLM 输入上下文 Context

终端用户输入 Prompt 提示词,通过从 Vector DB 查询得到最相关的 top-K 分块文本,作为 LLM 输入的上下文 Context。构建 Context 的详细处理流程,如下图所示:
Building-LLM-Query-Context

  • 通过 Prompt+Context 从 LLM 获取查询结果

我们可以使用一个 LLM,也可以使用多个 LLM;可以通过 API 接口远程调用一些现成的 LLM,如 ChatGPT,也可以使用本地的 LLM。具体选择哪些 LLM 以及使用何种方式,要根据我们实际的应用需求来确定。
确定好了要使用的 LLM,然后将 Prompt 和 Context 输入给 LLM,得到用户查询的结果。

关于如何在实际中使用 RAG 构建基于 LLM 的应用,快速了解构建的整个流程可以参考 Guide to Building a RAG Based LLM Application。对于更详细的,可以参考这篇文章 Building RAG-based LLM Applications for Production,给出了非常详细的说明和实践。

参考资源

Creative Commons License

本文基于署名-非商业性使用-相同方式共享 4.0许可协议发布,欢迎转载、使用、重新发布,但务必保留文章署名时延军(包含链接:http://shiyanjun.cn),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>