Use Case Accelerant: Extraction Service

用例加速器:提取服务

7 分钟阅读

今天我们很高兴地宣布我们最新的 OSS 用例加速器:一个 提取 服务。 法学硕士 (LLM) 是从非结构化来源提取结构化数据的强大工具。在过去的几个版本中,我们改进了开源 LangChain 库中 对数据提取的支持,现在我们更进一步,提供了一个入门仓库,以帮助您构建自己的提取应用程序。

入门仓库 包含一个最简化的 Web 应用程序,可以扩展以构建自助式提取应用程序,供组织中的非技术用户利用法学硕士 (LLM) 的强大功能进行数据提取。

我们将在下面更详细地讨论提取服务,但首先,让我们讨论提取用例以及法学硕士 (LLM) 如何提供帮助。

提取用例

企业花费大量资源和精力从非结构化数据源中获取有价值的见解,这些数据源包括 PDF 和 PowerPoint 演示文稿等文档、网站以及其他文本信息,如产品评论和客户反馈。

常用的部署提取解决方案倾向于依赖多种方法的混合,这些方法包括人工完成的手动工作,以及使用手工制作的规则或自定义微调的 ML 模型完成的自动化提取。

对于自动化解决方案,公司已经从基于规则的方法转向基于机器学习 (ML) 的解决方案,认识到 ML 驱动的方法通常在其系统中提供更高的可扩展性和可维护性。

先前几代基于 ML 的解决方案的主要问题是,它们通常需要大量工作来构建和维护,以及大量标记数据来训练模型。

大型语言模型 (LLM) 已成为一种有能力的新型 ML 技术,可以帮助驱动信息提取应用程序。 只需向法学硕士 (LLM) 提供适当的指令(以提示的形式)和适当的参考示例,就可以将其调整用于特定的提取任务。 因此,法学硕士 (LLM) 显著降低了采用人工智能优先方法进行信息提取的门槛。

新一代信息提取解决方案将建立在法学硕士 (LLM) 的基础上。 此类解决方案仍将涉及人工在环,以向法学硕士 (LLM) 提供反馈和指导,以及一些自定义规则和启发式方法来处理边缘情况。 此类解决方案仍然需要工作流工具来管理数据提取和验证过程。 但此类解决方案将比前几代解决方案更具可扩展性和可维护性。

法学硕士 (LLM) 来救援

如何使用法学硕士 (LLM) 进行信息提取? 在这里,我们将概述构建提取服务的必要组件和高级别和高级别注意事项。

原始数据

使用法学硕士 (LLM) 提取信息始于您希望从中提取的数据,首先需要将其转换为文本格式。 LangChain 包含 数百个文档加载器,您可以使用它们来解析 PDF 等文件并转换为文本格式。

加载文本后,您需要决定如何将其呈现给法学硕士 (LLM)。 最简单的方法是将整个文本呈现给法学硕士 (LLM)。 这对于小段文本非常有用,但对于较长的文本有几个缺陷。 首先,它可能无法全部放入上下文窗口。 其次,假设它可以,大多数语言模型在较长的输入上表现更差,因此将所有内容都放入上下文中可能会产生更差的结果。 第三,即使结果相当,推理时间也会花费一段时间。

更复杂的方法涉及将文本分段成块,并且仅通过法学硕士 (LLM) 处理相关的块。 当然,这引入了必须决定哪些块是相关的复杂性。 或者,您可以并行地从所有块中提取内容,这将保证您不会错过任何相关的块。 无论哪种方式,您都需要决定如何最好地组合来自各个块的结果,以及如何处理已在单独块中被分解的信息。

描述您想要什么

如果您希望法学硕士 (LLM) 有效地提取信息,您需要向其提供您想要提取的内容的描述。

这样的描述可以分解为三个关键组成部分

1. 描述您要提取的数据结构的模式。

2. 为提取提供上下文并启动法学硕士 (LLM) 的提示。

3. 显示从文本中提取示例的参考示例。

如何使其工作

所以这些是组件,但是您实际上如何使其工作? 

这里我们想介绍两个简单但强大的想法。

第一个关键思想是确保法学硕士 (LLM) 以正确的格式响应。 如果您指示法学硕士 (LLM) 在其提示中输出 JSON,它可能并不总是这样做。 函数调用已成为一种新的且相对可靠的方式,可以强制法学硕士 (LLM) 输出特定格式。 我们建议使用此方法来提高性能。 

查看 结构化输出文档,了解高级 LangChain API,其中展示了使用不同法学硕士 (LLM) 的工具/函数调用。

提高性能的另一个技巧是使用参考示例。 虽然您可以在没有任何参考示例的情况下设置提取问题,但我们发现在实践中,包含输入和相应输出的示例非常有益。 在展示法学硕士 (LLM) 如何处理特定情况方面,这些通常比指令更有帮助。

我们在 提取用例文档 中包含了更多详细信息,这将帮助您从法学硕士 (LLM) 中榨取性能。

服务

考虑到这一点,我们的 提取服务 到底提供了什么?

该服务构建在 FastAPI 和 Postgresql 之上。 它公开了一个标准的 REST API,并附带一个 docker-compose 文件,以帮助您快速启动堆栈。 该服务是一个最简化的 Web 应用程序,可以扩展以创建供组织中非技术用户使用的提取应用程序。 这本质上是您可以用来快速启动应用程序开发的样板代码。 或者,您可以直接将其用于您自己的提取工作流程,而无需进行任何进一步的开发。

该 API 允许定义和持久化“提取器”,其中包含将法学硕士 (LLM) 配置为提取所需的关键组件。 这些组件包括描述您要提取的数据结构的模式、为提取提供上下文并启动模型的提示,以及向模型展示一些提取示例的参考示例。 

此外,该 API 公开了一个提取端点,允许您提交文件以使用现有提取器进行提取,以及该端点的第二个变体,允许您使用 RemoteRunnable 以轻松地将该服务用作更大的 LangChain 表达式语言 (LCEL) 链的一部分。

该服务预配置了基于 MIME 类型的解析器,并支持解析 PDF 和 HTML 文件。 您可以使用现有的 LangChain 文档加载器和解析器 轻松扩展它以支持其他类型的文件(例如,PowerPoint)。

我们为提取 API 做出的一个关键决定是,我们已将其设计为始终提取多个实体。 这通常是从文本中提取时所需的行为,因为它允许模型在存在多个实体时提取多个实体,并且还因为它允许模型在文本不包含任何相关信息时提取零个实体。

您实际上如何使用此服务? 

基于以上内容,有一些使用注意事项。 您可以使用 JSON 模式来精确定义要提取的内容。 您可以指定将合并的示例以提高提取结果的质量。 您可以在调用 API 时指定这些示例,也可以在数据库中创建和保存提取器和示例。 这将使保存和共享提取器变得容易。 在传入文本方面,您可以传入原始文本或二进制文件。

示例

让我们看一个如何使用此服务的示例。

首先,您可以 创建一个提取器

curl -X 'POST' \
  'http://localhost:8000/extractors' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "name": "Personal Information",
  "description": "Use to extract personal information",
  "schema": {
      "type": "object",
      "title": "Person",
      "required": [
        "name",
        "age"
      ],
      "properties": {
        "age": {
          "type": "integer",
          "title": "Age"
        },
        "name": {
          "type": "string",
          "title": "Name"
        }
      }
    },
  "instruction": "Use information about the person from the given user input."
}'

这是在做什么?

首先,我们正在向服务发送一个 name 参数 - 这只是我们正在创建的提取器的简单人类可读名称,而不是供法学硕士 (LLM) 使用。 同样,description 参数仅用于跟踪目的,不以任何方式使用。

schema 参数由服务使用。 这是 JSON 模式,表示我们尝试提取的对象的模式。 我们正在提取 Person 模式,其中包含两个属性,这两个属性都是必需的:年龄(整数)和姓名(字符串)。

instruction 参数也由服务使用。 这些指令与模式和文本一起发送到法学硕士 (LLM),并且可以为法学硕士 (LLM) 的行为方式提供额外的上下文和指令。

当我们发送此内容时,我们会收到与我们刚刚创建的提取器的 ID 相对应的响应

{
  "uuid": "32d5324a-8a48-4073-b57c-0a2ebfb0bf5e"
}

注册后,我们可以 调用它

curl -s -X 'POST' \
'http://localhost:8000/extract' \
-H 'accept: application/json' \
-H 'Content-Type: multipart/form-data' \
-F 'extractor_id=32d5324a-8a48-4073-b57c-0a2ebfb0bf5e' \
-F 'text=my name is chester and i am 20 years old. My name is eugene and I am 1 year older than chester.' \
-F 'mode=entire_document' \
-F 'file=' | jq .

我们正在传入一个 extractor_id - 这是上一步返回的 ID。

我们还传入 text - 这是要从中提取信息的文本。

我们指定 mode=entire_document。 这告诉服务从整个文档中提取。 如果我们要提取的文本更大,我们可能需要以不同的方式处理它 - 这是我们控制该参数的地方。

最后,我们传递一个值为空的文件。 此服务还接受文件上传,但我们在此处未使用它

我们收到了以下响应

{
  "data": [
    {
      "name": "chester",
      "age": 20
    },
    {
      "name": "eugene",
      "age": 21
    }
  ]
}

结论

在本博客中,我们介绍了使用法学硕士 (LLM) 从非结构化文本中提取结构化数据的想法,介绍了我们完全 开源存储库,该存储库公开了一个执行此操作的服务,并运行了一个相对简单的示例来说明如何使用它。 有关更复杂的示例,您可以查看该服务的 readme。 有关如何使用 LangChain 进行提取而不使用此服务的信息,您可以查看我们更新的 用例文档。 在接下来的一周左右,我们将为此服务添加一个相对简单的前端并公开其托管版本。 我们欢迎任何反馈!

其他资源