摘要:在本文中,我将分享一种解决这一问题的方法。通过将 LLM 生成的每个答案链接到文档中的源文本,我们可以建立透明度和信任。这种方法不仅为答案提供了明确的证据,还允许用户直接在 PDF 中验证结果。
现在,你正在构建一个 RAG 系统或使用 LLM 与文档聊天。但用户经常问:我们如何信任答案?
此外,我们经常听到有关幻觉的消息,这会破坏用户的信任。
如果我们构建了一个应用程序,但未能向用户展示答案的来源,那么该应用程序在某些情况下可能会变得无法使用。
在本文中,我将分享一种解决这一问题的方法。通过将 LLM 生成的每个答案链接到文档中的源文本,我们可以建立透明度和信任。这种方法不仅为答案提供了明确的证据,还允许用户直接在 PDF 中验证结果。
有时,生成的答案可能不是完全准确的,但能够找到正确的源文本对用户来说已经很有帮助了。
让我们以 arxiv.org 上的这篇论文(https://arxiv.org/pdf/2410.05229)为例。我们可以想象这个用例:
作者提供的图片——文档展示
这种方法的第一步是以结构化格式从 PDF 中提取文本。
我们必须将文档分解为更小、更易于管理的部分,例如行或段落,并且捕获页码和边界框等元数据也很重要。
这些结构化数据是将答案链接回文档的基础。
在下面的示例中,我仅使用pymupdf,因为它轻量、快速,并且支持字体和布局保存等高级 PDF 文本提取功能。
现在将文本存储在 DataFrame 中。这是我经常向别人重复的一条建议——也是我自己的建议:始终对数据进行结构化。使用 DataFrame,其中每行代表一小段信息,每列包含明确的属性或元数据。
作者提供的图片——从 pdf 中提取文本
对于更复杂的文档,还有其他用于转换文档的包,例如:MarkItDown,Unstructured.io,Docling,MegaParse,LayoutParser和DeepDoctection。
对于表格提取,有专门的包,例如:Camelot、Tabula、Pdfplumber 和 Pdftables。
一旦文档被解析,下一步就是定义您想要回答的问题。
以下是一些建议:
假设我们有一份要向文档提出的问题列表。同样,问题应该存储在……一个数据框中!我们可以使用一个名为“字段名称”的列来明确标识我们要提取的信息,并使用一个名为“提取提示”或“问题”的列来描述它。它们将直接用于 LLM 的提示中。明确、具体的问题可确保 LLM 专注于检索相关信息。例如,不要问“我们如何联系家庭紧急保险索赔?”,你可以问“家庭紧急保险索赔的电话号码是多少?”如果需要,请添加属性:例如,如果您需要电话号码,并且您知道格式,则可以指定。如果您想要日期,那么您可以要求以某种格式获取日期,例如 YYYY-MM-DD。我们可以自动添加一个名为 ID 的列,这将帮助 LLM 跟踪所有问题,而不会忘记其中的一些问题。特别是当我们将问题子集化以进行并行化时。现在,文本已解析,问题结构清晰,我们可以使用 LLM(例如 Open AI API)来提取答案。
以下是一些要点:
图片来自作者 — LLM 提取答案
一旦我们得到 JSON 格式的答案,我们就可以将其转换为数据框并与问题数据框合并。
对于每个答案,我们还有将在以下步骤中使用的源段落。
现在,我们可以使用前面的答案来注释原始 PDF。
图片来自作者 — 带注释的 PDF:可点击的摘要和注释
这是一个简单的原型,用于展示如何查找和突出显示源段落。
如果文档太长,则无法将整个数据框提供给 LLM。初级 AI 开发人员会采用标准的 RAG 流程:对文档进行分块,并进行一些重叠。但是,这种方法是有风险的,因为这种标准分块不太可能达到最佳效果。正如我们在前面的例子中看到的:有些问题只需要一行,而其他问题则需要很多页。
解析 PDF:提取 Markdown 格式的文本,同时使用边界框获取位置信息。根据文档结构进行分块:中间数据框中包含章节、节和其他组织元素。检索:使用余弦相似度并不总是最佳的,下面是一个 GIF 用简单的例子来演示,我们将探索提高检索过程性能的方法。作者图片——余弦相似度与问答相关性
使用 LLM 从文档中提取信息也存在一些挑战。通过实施将答案直接链接到源文本的工作流程,我们可以解决幻觉等问题并建立对这些系统的信任。
这种方法可确保答案在保险、法律或研究等领域清晰、可追溯且可信。突出显示源文本并提供注释不仅是为了清晰度,还为了可靠性,并帮助用户自信地浏览文档。
带注释的 PDF 具有可点击摘要、边界框和工具提示等功能,使用户更容易验证信息并找到所需内容。
来源:冰镇火锅聊AI