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