Llama 2文法约束实现精准信息提取

0 阅读4分钟

Llama 2 + 语法约束:实现精准信息提取

发表于 2023年10月9日,作者:mattt

大语言模型虽然功能强大,但要让其精确按照预期输出却颇具挑战。对于某些生成任务而言,这或许可以接受,但在需要语法完美性的场景下就会成为问题。提示工程、少样本示例和微调技术都能帮助优化输出格式,而语法约束则是确保每次都能获得预期结果的可靠方法。

本文将探讨一系列内置语法支持功能的Llama 2模型,并展示如何将其应用于信息提取任务。

上个月,某机构在旧金山举办了首次黑客马拉松。活动精彩纷呈,我与与会者相谈甚欢,与远道而来的同事也度过愉快时光。然而,一封确认返程航班的邮件却打破了这份美好——它竟然没有附带日历事件!要知道现在已经是2023年了,难道还需要我手动...阅读邮件?(或者更糟,接受Siri的帮助让它自动创建事件?)

邮件内容摘录:

是时候办理航班值机了。
使用[已编辑]应用享受顺畅旅程,我们很快见面!
确认码:ABCDEF
值机
行程详情

座位 10D
17:00 18:30
SFO PDX
旧金山 波特兰

出发日期:2023/9/20
到达日期:2023/9/20

技术方案

我的灵感来源于某机构联合创始人在黑客马拉松上的演示项目。他通过使用Llama.cpp的语法解码器,将8位合成器音乐作品的输出约束为有效的单行格式。

借鉴这一思路,我可以通过定义语法规则,将模型输出约束为符合特定JSON Schema的JSON文档。

以下是提取航班信息的简单JSON Schema:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "origin": {
      "type": "string",
      "description": "出发机场的三字母ICAO代码"
    },
    "destination": {
      "type": "string",
      "description": "到达机场的三字母ICAO代码"
    },
    "date": {
      "type": "string",
      "format": "date"
    },
    "departure_time": {
      "type": "string",
      "format": "time"
    },
    "arrival_time": {
      "type": "string",
      "format": "time"
    }
  },
  "required": ["origin", "destination", "date", "departure_time", "arrival_time"],
  "additionalProperties": false
}

使用某机构的JavaScript客户端库,运行该模型,传入JSON Schema和航班确认邮件的原始文本:

import Replicate from "replicate";

const replicate = new Replicate();

const model = "andreasjansson/codellama-34b-instruct-gguf:f1091fa795c142a018268b193c9eea729e0a3f4d55d723df0b69f17b863bf5ea"
const input = {
  prompt: `
    从以下邮件中提取航班信息。
    使用RFC 3339日期时间格式。

    [...]
  `,
  jsonschema: `{...}`,
  max_tokens: 256
};
const output = await replicate.run(model, { input });

运行效果

模型输出的结果非常理想:

{
  "origin": "SFO",
  "destination": "PDX",
  "date": "2023-09-20",
  "arrival_time": "17:30",
  "departure_time": "15:00"
}

虽然需要一些引导才能让模型准确生成RFC 3339格式的日期时间,但整体运行过程非常顺利。

技术启示

多年前,我曾对TripIt的行程规划流程着迷。将航班和酒店确认邮件转发至指定邮箱,它们就会自动转换为个人日历中的事件。在2000年代,这无疑是魔法般的存在。但在人工智能时代,几分钟内就能构建出这样的原型。

需要明确的是,大语言模型并不能完全替代传统的自然语言处理工具。专业开发者使用传统工具可能比通用AI模型表现更出色。然而,解决问题的过程可能需要超出个人能力的时间和专业知识。多年来,我一直梦想构建自己的TripIt导入器,却始终未能实现可靠运行。

现在,了解了Llama 2与语法约束的可能性后,或许你也能从中获得启发,重新审视那些曾经难以攻克的创意。

扩展学习

  • 探索支持语法约束的Llama 2模型系列
  • 阅读llama.cpp中基于语法约束的采样功能实现的PR
  • 参考Llama 2提示指南,成为驯服大语言模型的专家
  • 通过数据集微调Llama 2,让模型掌握新技能FINISHED