每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。
欢迎关注公众号(NLP Research),及时查看最新内容
原文标题:Visualize your RAG Data — EDA for Retrieval-Augmented Generation
原文地址:https://medium.com/itnext/visualize-your-rag-data-eda-for-retrieval-augmented-generation-0701ee98768f
Github: https://github.com/Renumics/rag-demo/blob/main/notebooks/visualize_rag_tutorial.ipynb
如何使用 UMAP 降维技术对嵌入进行降维,以展示使用 OpenAI、Langchain 和 ChromaDB 的问题、答案及其与源文件的关系
像 GPT-4 这样的大型语言模型(LLM)在文本理解和生成方面表现出了令人印象深刻的能力。但它们在处理特定领域信息时面临挑战。当查询超出训练数据范围时,它们往往会产生错误的答案。此外,LLMs 的推理过程缺乏透明度,用户很难理解结论是如何得出的。
为解决这些挑战,一种被称为检索增强生成(Retrieval-Augmented Generation,RAG)的技术已经被开发出来。RAG 在语言大模型(LLM)的工作流中添加了一个检索步骤,使其能够在响应查询时从额外的源(例如您的私人文本文档)中查询相关数据。这些文档可以事先被划分为小片段,为这些片段生成嵌入(紧凑的向量表示),使用类似于 OpenAI 的 embedding-ada-002 的机器学习模型。具有相似内容的片段将具有相似的嵌入。当 RAG 应用程序收到一个问题时,它将该查询投影到相同的嵌入空间,并检索与查询相关的相邻文档片段。然后,LLM 使用这些文档片段作为上下文来回答问题。这种方法可以提供回答查询所需的信息,同时通过向用户呈现使用的片段来实现透明度。
在开发 RAG 应用程序时,正如许多其他领域所认识到的那样,对数据有一个良好的概览非常重要。对于 RAG 而言,可视化嵌入空间尤其有用,因为 RAG 应用程序会使用这个空间来查找相关信息。由于查询与文档片段共享空间,因此考虑相关文档片段与查询之间的接近程度尤为重要。我们建议使用 UMAP 之类的可视化方法,将高维嵌入减少为更易于管理的二维可视化,同时保留重要属性,如片段和查询之间的关系和邻近性。虽然高维嵌入被简化为只有两个分量,但仍然可以识别问题及其相关文档片段在嵌入空间中形成的聚类。这有助于深入了解数据的本质。
在本文中,您将学习如何
-
准备文档:首先开始收集数据。本教程以维基百科中的一些HTML格式的一级方程式(Formula One)数据为例,用作构建RAG应用程序的数据集。当然,您也可以在这里使用自己的数据!
-
拆分和创建嵌入:将收集到的文档拆分成更小的片段,并使用嵌入模型将其转换为紧凑的向量表示。这需要使用分割器、OpenAI 的text-embedding-ada-002 和作为向量存储的 ChromaDB。
-
构建 LangChain:将用于创建上下文的提示生成器、用于获取相关片段的检索器和用于回答查询的 LLM(GPT-4)结合起来,建立 LangChain。
-
询问问题:学习如何向 RAG 应用程序提问。
-
可视化:使用 Renumics-Spotlight 可视化二维嵌入,并分析查询和文档片段之间的关系和邻近性。
本简化教程将引导您了解开发 RAG 应用程序的每个阶段,并特别关注可视化结果的作用。
准备
首先,安装所有必需的包:
pip install langchain langchain-openai chromadb renumics-spotlight
本教程使用 Langchain、Renumics-Spotlight python 包:
- Langchain:整合语言模型和 RAG 组件的框架,使设置过程更加顺畅。
- Renumics-Spotlight:交互式探索非结构化 ML 数据集的可视化工具。
将使用 OpenAI 提供的所需 ML 模型
-
GPT-4:最先进的语言模型,以其先进的文本理解和生成能力而著称。
-
embedding-ada-002:一个专门用于创建文本嵌入表示的模型。
设置你的 OPENAI_API_KEY;例如,你可以在笔记本中使用笔记本行魔术命令设置它:
%env OPENAI_API_KEY=<your-api-key>
准备文件
对于这个演示,你可以使用我们准备的维基百科所有一级方程式文章的数据集。该数据集是使用wikipedia-api和BeautifulSoup创建的。你可以下载这个数据集。
将提取的 html 文件放入 docs/ 子文件夹。
或者,您也可以创建 docs/ 子文件夹并将自己的文件复制到其中,从而使用自己的数据集。
拆分并为数据集创建嵌入
您可以跳过这一部分,下载包含一级方程式数据集嵌入式数据的数据库。
要自行创建嵌入模型,首先需要设置嵌入模型和向量存储。这里我们使用 OpenAIEmbeddings 的 text-embedding-ada-002,以及使用 ChromaDB 的向量存储:
from langchain_openai import OpenAIEmbeddings
from langchain.vectorstores.chroma import Chroma
embeddings_model = OpenAIEmbeddings(model="text-embedding-ada-002")
docs_vectorstore = Chroma(
collection_name="docs_store",
embedding_function=embeddings_model,
persist_directory="docs-db",
)
向量存储将保存在 docs-db/ 文件夹中。
为了填充向量存储,我们使用 BSHTMLLoader 加载 HTML 文档:
from langchain_community.document_loaders import BSHTMLLoader, DirectoryLoader
loader = DirectoryLoader(
"docs",
glob=