要实现 RAG 和知识图谱的结合,可以参考以下步骤:
此外,通用语言模型通过微调能完成常见任务,而对于更复杂和知识密集型任务,可基于语言模型构建系统并访问外部知识源。Meta AI 研究人员引入的 RAG 方法把信息检索组件和文本生成模型结合,能接受输入并检索相关文档,组合上下文和原始提示词送给文本生成器得到输出,适应事实变化,无需重新训练模型就能获取最新信息并产生可靠输出。Lewis 等人(2021)提出通用的 RAG 微调方法,使用预训练的 seq2seq 作为参数记忆,用维基百科的密集向量索引作为非参数记忆。
首先,我们需要加载我们的数据。我们可以使用数据加载器来实现这一步,根据数据源的类型选择合适的数据加载器。例如,如果我们的数据源是一个网页,我们可以使用WebBaseLoader,它可以使用urllib和BeautifulSoup()来加载和解析网页,返回一个文档对象。然后,我们需要将我们的文档对象分割成较小的文档对象。我们可以使用文本分割器来实现这一步,根据文本的特点选择合适的文本分割器。例如,如果我们的文本是一个博客文章,我们可以使用RecursiveCharacterTextSplitter,它可以递归地使用常见的分隔符(如换行符)来分割文本,直到每个文档对象的大小符合要求。接下来,我们需要将我们的文档对象转换为嵌入,并存储到向量存储器中。我们可以使用文本嵌入器和向量存储器来实现这一步,根据嵌入的质量和速度选择合适的文本嵌入器和向量存储器。例如,如果我们想要使用OpenAI的嵌入模型和Chroma的向量存储器,我们可以使用OpenAIEmbeddings()和ChromaVectorStore。然后,我们需要创建一个检索器,用于根据用户的输入检索相关的文档对象。我们可以使用向量存储器检索器来实现这一步,-传递一个向量存储器对象和一个文本嵌入器对象作为参数,创建一个向量存储器检索器对象。最后,我们需要创建一个聊天模型,用于根据用户的输入和检索到的文档对象生成一个输出消息。我们可以使用LangChain提供的聊天模型来实现这一步,根据模型的性能和成本选择合适的聊天模型。例如,如果我们想要使用OpenAI的GPT-3模型,我们可以使用OpenAIChatModel。下面是一个使用LangChain构建RAG应用的示例代码:
首先,我们需要加载我们的数据。我们可以使用数据加载器来实现这一步,根据数据源的类型选择合适的数据加载器。例如,如果我们的数据源是一个网页,我们可以使用WebBaseLoader,它可以使用urllib和BeautifulSoup来加载和解析网页,返回一个文档对象。然后,我们需要将我们的文档对象分割成较小的文档对象。我们可以使用文本分割器来实现这一步,根据文本的特点选择合适的文本分割器。例如,如果我们的文本是一个博客文章,我们可以使用RecursiveCharacterTextSplitter,它可以递归地使用常见的分隔符(如换行符)来分割文本,直到每个文档对象的大小符合要求。接下来,我们需要将我们的文档对象转换为嵌入,并存储到向量存储器中。我们可以使用文本嵌入器和向量存储器来实现这一步,根据嵌入的质量和速度选择合适的文本嵌入器和向量存储器。例如,如果我们想要使用OpenAI的嵌入模型和Chroma的向量存储器,我们可以使用OpenAIEmbeddings和ChromaVectorStore。然后,我们需要创建一个检索器,用于根据用户的输入检索相关的文档对象。我们可以使用向量存储器检索器来实现这一步,-传递一个向量存储器对象和一个文本嵌入器对象作为参数,创建一个向量存储器检索器对象。最后,我们需要创建一个聊天模型,用于根据用户的输入和检索到的文档对象生成一个输出消息。我们可以使用LangChain提供的聊天模型来实现这一步,根据模型的性能和成本选择合适的聊天模型。例如,如果我们想要使用OpenAI的GPT-3模型,我们可以使用OpenAIChatModel。下面是一个使用LangChain构建RAG应用的示例代码:
通用语言模型通过微调就可以完成几类常见任务,比如分析情绪和识别命名实体。这些任务不需要额外的背景知识就可以完成。要完成更复杂和知识密集型的任务,可以基于语言模型构建一个系统,访问外部知识源来做到。这样的实现与事实更加一性,生成的答案更可靠,还有助于缓解“幻觉”问题。Meta AI的研究人员引入了一种叫做[检索增强生成(Retrieval Augmented Generation,RAG)(opens in a new tab)](https://ai.facebook.com/blog/retrieval-augmented-generation-streamlining-the-creation-of-intelligent-natural-language-processing-models/)的方法来完成这类知识密集型的任务。RAG把一个信息检索组件和文本生成模型结合在一起。RAG可以微调,其内部知识的修改方式很高效,不需要对整个模型进行重新训练。RAG会接受输入并检索出一组相关/支撑的文档,并给出文档的来源(例如维基百科)。这些文档作为上下文和输入的原始提示词组合,送给文本生成器得到最终的输出。这样RAG更加适应事实会随时间变化的情况。这非常有用,因为LLM的参数化知识是静态的。RAG让语言模型不用重新训练就能够获取最新的信息,基于检索生成产生可靠的输出。Lewis等人(2021)提出一个通用的RAG微调方法。这种方法使用预训练的seq2seq作为参数记忆,用维基百科的密集向量索引作为非参数记忆(使通过神经网络预训练的检索器访问)。这种方法工作原理概况如下:图片援引自:[Lewis et el.(2021)(opens in a new tab)](https://arxiv.org/pdf/2005.11401.pdf)