通过提示工程在法律文件数据提取中实现 95% 的准确率

用于数据提取的提示工程:如何在法律文件中实现 95% 的准确率

从法律文件中提取结构化元数据,是受监管行业里极具挑战性的人工智能任务之一。成都长风云Drupal开发团队通过使用GPT - 4o - mini和OpenAI的结构化输出,进行精心的提示工程,在对复杂的监管文件按照多个分类法进行分类时,能够实现95%以上的准确率。本技术指南将揭示成都长风云Drupal开发团队如何构建生产级提示模板,从英国/爱尔兰法律文本中可靠地提取文件类型、组织、主题领域和法律义务,把每份文件的手动校正时间从15分钟减少到3分钟。


本文内容:

  • 挑战:从非结构化法律文本中提取结构化数据
  • 为什么用人工智能处理法律文件如此困难?
  • 分类法注入如何提高提取准确率?
  • 如何通过JSON模式强制执行一致的输出?
  • 语义匹配如何用于实体引用?
  • 如何优化提示以提高准确率?
  • 如何从文件中提取法律义务?
  • 代码示例和提示模板
  • 用于数据提取的提示工程——结论
  • 您的人工智能项目需要专业的提示工程服务吗?

一、挑战:从非结构化法律文本中提取结构化数据

法律文件是埋藏在冗长复杂散文中的结构化信息宝库,就像下面这句话:

“金融行为监管局特此依据2000年《金融服务和市场法》(经2012年《金融服务法》修订)第139A条发布本指南,自2024年1月1日起生效,适用于根据1974年《消费者信贷法》第二部分运营的所有消费者信贷贷款人和出租人……”

在这一句话中隐藏着:

  • 文件类型:指南说明
  • 组织:金融行为监管局
  • 立法:2000年《金融服务和市场法》
  • 年份:2024年
  • 受影响方:消费者信贷贷款人和出租人

人类律师可以立即提取这些信息,而人工智能则需要精心的指令,这就是提示工程发挥作用的地方。

本文将向您展示如何编写提示,从法律文件中可靠地提取结构化数据,在生产环境中实现95%以上的准确率。

二、为什么用人工智能处理法律文件如此困难?

在深入探讨解决方案之前,我们必须了解使法律文件提取困难的具体挑战。法律文本呈现出独特的障碍,标准的文本处理方法无法有效应对。

1. 复杂的语言

法律写作使用:

  • 古旧术语 – “在此”、“鉴于”、“上述”
  • 嵌套从句 – 句子跨越多个段落
  • 专业术语 – “不可抗力”、“事实自证”
  • 模糊引用 – “上述法规”(是哪一个?)

2. 多个分类法

一份文件可能需要从以下多个方面进行分类:

  • 文件类型(法规、条例、指南、判例法)
  • 组织(发布机构)
  • 主题领域(银行、数据保护、就业)
  • 司法管辖区(英国、欧盟、特定国家)
  • 立法(适用哪些法案/条例)
  • 年份、生效日期、修订历史

每个分类法有10 - 400个术语。这意味着有数百种可能的分类。

3. 可变格式

没有两份法律文件以相同的方式构建信息,以下是不同类型文件的示例:

法规:

  2023年银行法
一项规范……的法案
议会颁布:2023年3月15日

指南说明:

  金融行为监管局指南咨询文件CP23/15
发布时间:2023年12月
适用对象:银行和建筑协会

判例法:

  女王诉金融行为监管局 [2023] UKSC 42
最高法院,2023年11月8日

相同的信息(类型、组织、日期)以完全不同的格式呈现。

4. 隐性信息与显性信息

有时信息是直接陈述的,比如:
> “本条例适用于所有消费者信贷贷款人……”

其他时候信息是隐含的,比如:
> “根据《消费者信贷法》第二部分……”(意味着:影响信贷贷款人)

人工智能必须从上下文中推断。

三、分类法注入如何提高提取准确率?

准确提取的基础是提前告知人工智能您的分类法。

1. 在上下文中包含完整的分类法列表

不要这样做: “按类型、组织和领域对这份文件进行分类。”

要这样做: “将这份文件与以下确切的分类法进行匹配:”

  ### 文件类型分类法:
- 法规
- 条例
- 指南说明
- 行为准则
- 判例法

### 组织分类法:
- 金融行为监管局
- 英格兰银行
- 竞争与市场管理局
- 信息专员办公室
[... 完整列表 ...]

### 文件领域分类法:
- 银行与金融
  - 消费者信贷
  - 银行监管
- 数据保护
[... 完整列表 ...]

为什么这样做有效:

  1. 明确的边界 – 人工智能确切知道存在哪些选项
  2. 语义匹配 – 人工智能理解“FCA” = “金融行为监管局”
  3. 返回分类法名称 – 人工智能返回术语名称(例如, ["数据保护", "金融服务", "通用数据保护条例"]),系统随后通过Drupal的分类法查找将这些名称映射到术语ID
  4. 无幻觉 – 人工智能不会编造类别

工作原理:

人工智能返回分类法术语名称:

    ["数据保护", "金融服务", "通用数据保护条例"]
  

Drupal系统进行分类法查找: - “数据保护” → 找到术语ID:42 - “金融服务” → 找到术语ID:87 - “通用数据保护条例” → 找到术语ID:156

文件被分配: [42, 87, 156]

这种方法利用了人工智能的语义理解能力,同时通过Drupal的分类法系统保持精确的实体引用。在Drupal开发中,这种分类法查找功能是非常重要的,能有效提升数据处理的准确性和效率。

2. 代币成本值得吗?

“但这样不会使用太多代币吗?”

是的,会使用代币,但这是值得的。

成都长风云Drupal开发团队的数据:

  • 文件文本:35,000个代币(典型的50页PDF)
  • 分类法上下文:5,000个代币(所有分类法)
  • 指令:1,000个代币
  • 总计:41,000个代币
  • 上下文限制:128,000个代币(GPT - 4o - mini)
  • 余量:87,000个代币(有足够的空间)

成本:

  • 使用分类法:每份文件0.21英镑
  • 不使用分类法(假设):每份文件0.18英镑
  • 额外成本:每份文件0.03英镑

价值:

  • 准确率提高:从75%提高到95%
  • 手动校正时间:从15分钟减少到3分钟
  • 节省时间的价值:每份文件2英镑以上

投资回报率:分类法代币投资的回报率为70倍。

四、如何通过JSON模式强制执行一致的输出?

一旦为人工智能提供了分类法,下一个关键步骤是确保它以一致、可解析的格式返回数据。OpenAI的结构化输出功能保证每次响应都与您确切的JSON模式匹配。

1. 定义确切的输出结构

模糊的指令: > “提取文件类型、组织和年份。”

人工智能可能返回:

  文件类型是指南说明
组织:金融行为监管局
年份:2024

无法解析。 格式每次都不同。

更好的方法:使用OpenAI的结构化输出:

OpenAI提供 结构化输出,保证模型的响应将精确匹配您的JSON模式。这比JSON模式更强大——您不仅能得到有效的JSON,还能得到保证与您确切的模式结构匹配的JSON。

有两种可用方法:

  1. JSON模式 (type: "json_object") – 保证有效的JSON,但不强制执行您的特定模式
  2. 结构化输出(JSON模式 + strict: true) – 保证输出与您确切的模式匹配(这是成都长风云Drupal开发团队使用的方法)

使用结构化输出的API配置:

    $response = $client->chat()->create([
  'model' => 'gpt-4o-2024-08-06',  // 结构化输出需要 gpt - 4o 模型
  'messages' => [
    ['role' => 'user', 'content' => $prompt]
  ],
  'response_format' => [
    'type' => 'json_schema',
    'json_schema' => [
      'name' => 'document_metadata',
      'strict' => true,  // ← 强制执行严格的模式合规性
      'schema' => [
        'type' => 'object',
        'properties' => [
          'document_type' => [
            'type' => 'array',
            'items' => ['type' => 'string']
          ],
          'organization' => [
            'type' => 'array',
            'items' => ['type' => 'string']
          ],
          'document_area' => [
            'type' => 'array',
            'items' => ['type' => 'string']
          ],
          'year' => ['type' => 'string'],
          'title' => ['type' => 'string'],
          'source_url' => ['type' => 'string']
        ],
        'required' => ['document_type', 'organization', 'document_area', 'year', 'title'],
        'additionalProperties' => false
      ]
    ]
  ],
  'temperature' => 0.1,
]);
  

提示文本(指令):

  分析文件并提取:
- document_type:主要文件类型(以数组中的字符串形式返回分类法术语名称)
- organization:发布组织(以数组中的字符串形式返回分类法术语名称)
- document_area:所有相关主题领域(以数组中的字符串形式返回分类法术语名称)
- year:以YYYY格式表示的发布年份
- title:文件标题
- source_url:如果在文件中找到,返回完整的URL

仅使用提供的分类法列表中的分类法术语名称。系统将自动将这些名称映射到术语ID。

使用结构化输出,人工智能始终返回:

    {
  "document_type": ["指南说明"],
  "organization": ["金融行为监管局"],
  "document_area": ["消费者信贷", "银行监管"],
  "year": "2024",
  "title": "金融行为监管局关于消费者信贷实践的指南",
  "source_url": "https://www.fca.org.uk/publication/guidance/gc24-1.pdf"
}
  

注意: 系统随后进行分类法查找,将术语名称转换为ID: - “指南说明” → 术语ID:14 - “金融行为监管局” → 术语ID:23 - “消费者信贷” → 术语ID:35 - “银行监管” → 术语ID:36

文件被分配: document_type: [14]organization: [23]document_area: [35, 36]

结果:保证100%符合模式。 成都长风云Drupal开发团队使用结构化输出处理了数千份文件,没有出现任何模式验证失败的情况。模型不能返回与JSON模式不匹配的数据——OpenAI在API级别强制执行这一点,消除了在代码中进行大量输出验证的需要。

Better Regulation 实现文档分类的人工智能工作流程示例

Better Regulation基于人工智能的文档分类案例

五、语义匹配如何用于实体引用?

在实现结构化输出后,下一个挑战是确保人工智能正确地将文档内容映射到您特定的分类法术语。这就是语义匹配——人工智能理解超越精确文本匹配的含义的能力——变得至关重要的地方。

1. 人工智能如何将术语与分类法匹配

神奇之处: 人工智能理解含义,而不仅仅是文本。

示例:

分类法术语: “消费者信贷贷款人和出租人”

人工智能成功匹配的文档短语:

  • “消费者贷款业务”
  • “个人贷款提供商”
  • “提供租购服务的信贷公司”
  • “从事消费者金融业务的公司”
  • “向个人提供贷款的机构”

如何做到的? 大型语言模型在训练过程中学习语义关系。它们知道:

  • “贷款” ≈ “贷款人”
  • “个人贷款” ≈ “消费者信贷”
  • “租购” → “出租人”

传统的关键字匹配在大多数这些变体上都会失败

2. 名称到ID的映射机制

关键设计决策: 人工智能返回分类法术语名称,系统随后通过Drupal的分类法查找将这些名称映射到术语ID。在Drupal模块开发中,这种映射机制是非常实用的功能。

为什么这种方法有效:

    // ✅ 好的做法:人工智能返回术语名称
{
  "organization": ["金融行为监管局"],
  "document_area": ["数据保护", "金融服务"]
}

// 系统进行分类法查找
$organization_terms = \Drupal::entityQuery('taxonomy_term')
  ->condition('name', '金融行为监管局')
  ->condition('vid', 'organization')
  ->execute();

$area_terms = \Drupal::entityQuery('taxonomy_term')
  ->condition('name', ['数据保护', '金融服务'], 'IN')
  ->condition('vid', 'document_area')
  ->execute();

// 将名称映射到 ID
$organization_id = reset($organization_terms); // 例如,23
$area_ids = array_values($area_terms); // 例如,[42, 87]

// 将 ID 分配给文档
$node->set('field_organization', ['target_id' => $organization_id]);
$node->set('field_document_area', array_map(function($id) {
  return ['target_id' => $id];
}, $area_ids));
  

基于名称的方法的好处:

  1. 语义匹配 – 人工智能可以利用其理解能力进行语义概念匹配,即使确切的术语名称未出现在文档中
  2. 灵活性 – 如果分类法术语被重命名,查找仍然有效(只要名称匹配)
  3. 清晰性 – 术语名称是人类可读的,便于调试和验证
  4. 精确性 – 查找确保在分类法词汇表中进行精确匹配,防止歧义

工作原理:

  1. 人工智能根据对文档的语义理解返回术语名称
  2. 系统进行分类法查找以找到匹配的术语ID
  3. 文档字段用术语ID填充以进行实体引用

3. 如何处理模糊术语?

有些术语确实模糊不清:

“ICO” 可能指:

  • 信息专员办公室(数据保护)
  • 首次代币发行(加密货币)

策略1:提示中的上下文线索

  如果文档讨论数据保护,“ICO” 可能指 “信息专员办公室”。
如果文档讨论加密货币,“ICO” 可能指 “首次代币发行”。
利用文档上下文消除歧义。

策略2:允许多个选项

  如果有歧义,返回多个可能的术语名称:

{
  "organization": ["信息专员办公室", "首次代币发行"]
}

系统将查找这两个名称并返回它们的ID。然后人工审核员从选项中选择正确的一个。

策略3:置信度分数(高级)

  {
  "organization": [
    {"term_name": "信息专员办公室", "confidence": 0.8},
    {"term_name": "首次代币发行", "confidence": 0.2}
  ]
}

选择置信度最高的,标记置信度低(<0.7)的进行审核。选择后系统将术语名称映射到ID。

六、如何优化提示以提高准确率?

即使有了正确的结构和分类法,要实现高准确率也需要不断改进。以下是如何根据实际性能系统地改进您的提示。

1. 迭代改进过程

不要期望第一次尝试就能得到完美的提示,要进行迭代。

使用实际文档,而不是合成示例。

当不确定哪种方法更好时,两种方法都进行测试:

提示A:简洁版

  使用以下分类法进行分类:
[分类法]

文档:
[文档]

返回JSON:
[模式]

提示B:详细版

  你是一位专业的法律文档分析师。你的任务是仔细阅读提供的文档,并根据以下分类法对其进行分类。

指令:
- 彻底阅读文档
- 确定文档类型
- 确定发布组织
- 提取所有相关主题领域
[... 详细指令 ...]

分类法:
[分类法]

文档:
[文档]

请以JSON格式返回你的分析结果:
[模式]

七、如何从文件中提取法律义务?

提取义务比分类更困难,因为:

  1. 隐性义务 – 并不总是明确陈述
  2. 条件义务 – “如果X,则必须Y”
  3. 范围识别 – 谁必须遵守?
  4. 截止日期提取 – 必须在何时遵守?

1. 识别隐性义务

显性义务: > “所有银行必须向金融行为监管局提交季度报告。”

隐性义务: > “监管机构期望受监管实体进行季度报告。”

在监管语境中,“期望”意味着义务

提示指导:

  提取法律义务,包括:
- 必须/应当/要求(显性)
- 应该/期望/建议(强烈指导,通常视为义务)
- 监管语境中的隐性要求

对于每项义务,提取:
- 需要采取什么行动
- 谁必须执行(受影响方)
- 必须在何时完成(截止日期/频率)
- 如果不执行会发生什么(如果有说明,后果)


Better Regulation 实施的基于人工智能的自动化文档摘要工作流程

Better Regulation基于人工智能的自动化文档摘要和义务提取解决方案

2. 信息缺失

如果文档不包含预期信息怎么办?

提示指导:

  如果无法从文档中确定信息:
- 该字段返回空数组 []
- 不要猜测或编造信息
- 不要返回 null 或 undefined

示例:
{
  "source_url": ""  // 文档中未找到
}

不要这样:
{
  "source_url": "https://www.example.com"  // 不要编造 URL
}

3. 多种有效解释

有些文档确实适合多个类别。

示例: 文档同时讨论了银行监管和数据保护。

提示策略:

  document_area 是一个多值字段。

如果文档涵盖多个领域,包括所有相关领域:

{
  "document_area": ["银行监管", "数据保护"]
}

优先包括所有相关领域,而不是强制选择单一领域。
系统将自动将这些术语名称映射到相应的 ID。

八、代码示例和提示模板

现在我们已经介绍了这些技术,以下是可用于您自己的法律文档提取项目的生产级提示模板。这些模板结合了上述所有策略。

1. 完整的分类提示

  你正在分析一份英国/爱尔兰的法律或监管文件。

使用以下确切的分类法进行提取和分类。

关键规则:
- 仅使用以下列表中的分类法术语名称(以字符串形式返回术语名称)
- 以指定格式返回有效的 JSON
- 按语义含义匹配,而不仅仅是关键字
- 如果多个术语适用,包括所有相关术语
- 如果不确定,返回空数组 []
- 系统将自动将术语名称映射到术语 ID

### 文件类型分类法:
- 法规
- 条例
- 指南说明
- 行为准则
- 判例法

### 组织分类法:
- 金融行为监管局
- 英格兰银行
- 竞争与市场管理局
- 信息专员办公室
- 英国财政部
[... 完整列表 ...]

### 文件领域分类法:
- 银行与金融
  - 消费者信贷
  - 银行监管
  - 支付服务
- 数据保护
- 竞争法
[... 完整列表 ...]

### 待分析文档:

{{ document_text }}

返回包含分类法术语名称(字符串)的 JSON,而不是 ID。
示例:
{
  "document_type": ["指南说明"],
  "organization": ["金融行为监管局"],
  "document_area": ["消费者信贷", "银行监管"]
}

2. 义务提取提示

  从这份文件中提取法律义务。

义务是特定方必须履行的要求。

对于每项义务,确定:
- 需要采取什么行动
- 谁必须执行(受影响方/许可证类型)
- 何时(截止日期或频率)

包括:
- 显性义务(必须、应当、要求)
- 强烈指导(应该、期望、建议)
- 监管语境中的隐性要求

### 许可证类型:
- 消费者信贷贷款人
- 消费者信贷出租人
- 支付服务提供商
[... 完整列表 ...]

以字符串形式返回许可证类型的分类法术语名称。系统将自动将这些名称映射到术语 ID。

### 文档:

{{ document_text }}

九、用于数据提取的提示工程 – 结论

有效的法律文档提取提示工程需要:

  • 分类法注入 – 包括完整的分类法列表(仅术语名称;系统将名称映射到 ID)
  • JSON 模式强制执行 – 定义确切的输出结构
  • 语义匹配 – 利用人工智能对含义的理解
  • 迭代改进 – 测试、测量、改进
  • 错误模式分析 – 系统地修复特定错误
  • 边缘情况处理 – 为大小限制、缺失数据、歧义做好规划

成都长风云Drupal开发团队的成果:

  • 字段准确率达 95% 以上
  • 编辑校正率低于 5%
  • 两个月的迭代改进(从 75% 提高到 95%)
  • 根据错误分析每月进行提示改进

关键教训: 提示工程不是一次性的,它是基于实际性能的持续改进。

从简单开始,彻底测试,系统地改进,您的提示会随着时间的推移而不断改善。

十、您的人工智能项目需要专业的提示工程服务吗?

本指南基于成都长风云Drupal开发团队为BetterRegulation进行的生产级提示工程工作,在那里我们经过两个月的开发和改进提示,在法律文档提取中实现了95%以上的准确率。关键在于系统的迭代:从准确率为75%的基本提示开始,分析错误模式,改进指令,逐步提高到生产级性能。这种迭代的提示工程方法将一个原型转变为一个每月处理数千份文档的可靠系统。

构建有效的提示需要技术专业知识和领域理解。成都长风云Drupal开发团队专门从事复杂数据提取任务的提示工程。我们处理完整的周期:初始提示设计、分类法集成、JSON模式定义、迭代测试。在Drupal11的开发和升级过程中,我们也能结合这些技术,为您提供更优质的服务。