作者:丰阳露,单位:中国移动智慧家庭运营中心
随着大语言模型的日益成熟,基于模型生成内容的AI原生互联网应用也在蓬勃发展。然而,我们也需要意识到,大模型本身的输出往往难以直接应用于工程实践。为了让大模型的应用真正落地,我们需要在保证输出质量的同时,也要注意格式化结果,使其更易于被软件系统使用。
本文试图从输出格式化的角度,为大语言模型应用提供一些格式对齐方法。我们将讨论输出结果的可预测性、一致性等问题,以及可能的解决方案。此外,本文中的所有例子以智慧家庭运营中心安全大模型为例,同时参考了LangChain实现的部分常见的格式化输出提示的用法。
Part 01● 输出列表/集合 ●
列表和集合是程序中最常见也最重要的数据结构之一,会在许多场合被广泛应用,因此让大型语言模型能够稳定输出列表,将在多种情况下发挥重要作用。
例如,我们希望语言模型能输出中国省份的名称列表,以提供后续程序调用使用。要实现这一目标,我们需要如何具体操作呢?
如果我们直觉性地构造提示词,可能会这样提示:
或者这样:
上述格式都不易于后续程序处理使用。那么,我们应该如何构造提示,才能让大型语言模型稳定输出List格式呢?经过反复试验,我们发现正确的方法是:
请随机列出10个中国的省级行政区。你的回答应该是一个逗号分隔值的列表,不带任何其他描述信息,例如:[A, B, C] , 以'```json'开头,并以'```'结尾。
通过这种方式,我们就可以直接加载该JSON格式进行后续处理。
同理,输出集合的提示可以这样构造:
请随机列出10个中国的省级行政区。你的回答应该是一个逗号分隔值的无重复元素的集合,不带任何其他描述信息,例如:{'甲', '乙', '丙'} ,以'```json'开头,并以'```'结尾。
Part 02● 输出标准化时间日期 ●
当需要按时间或日期对数据进行筛选或查询时,让大型语言模型输出标准化的时间日期格式尤为重要。以想获取中国移动的成立时间为例,我们可能会直觉地这样操作:
但是,上述回复虽提供了正确信息,但日期格式不标准,不便机器读取处理。为获得标准化日期,我们应该这样提示:
请回答用户的问题:
中国移动的成立时间?
编写一个与以下模式匹配的日期时间字符串:'%Y-%m-%d',例如:1970-08-09,此外不要输出任何描述信息。
通过明确要求“标准日期格式”,模型便可生成可机器解析的结果。
在需要定量时间信息的场景下,提示语言模型输出标准化时间日期,可显著提升后续自动化处理效率。
Part 03● 输出结构化字典 ●
结构化字典是我们在传统应用中交换数据最常用的格式之一,key-value结构便于程序根据key获取相应的value,也是代码与语言模型交互的主流方式。而对于某些复杂结构,想让语言模型稳定输出对齐的结果较为困难,这凸显了提示工程的重要性。
仍以前面获取中国省份信息为例,如果我们想通过语言模型获得某省名称、省会、面积、人口、区号等结构化字典,需要如何操作呢?
借鉴前面的经验,我们可以这样提示:
虽然基本实现了按照要求的输出,但是该实现方式存在没有明确指定字段名称和类型的问题。在某些复杂场景下,字段之间可能未能正确对齐,从而导致程序执行错误。结合我们的经验,参考类似Langchain的实现,一个更具鲁棒性的方法是明确指定字段名称和值类型,以避免上述问题:
请随机输出中国一个省份的信息,包括
名称:该省的名称
省会:该省的省会名称
人口:该省的人工数
面积:该省的面积,以平方公里为单位
区号:该省的区号
输出应该是按以下模式格式化的标记代码片段,包括开头和结尾的" ```json"和"```",此外不要包含任何描述性信息。
```json
{
"名称": string // 省份名称
"省会": string // 省会名称
"人口": int// 该省的人口
"面积": float// 该省的面积,浮点数表示,不要带单位
"区号": string // 该省的区号
}
```
Part 04● 输出结构化字典的列表 ●
显然,构建单个字典是相对容易的。然而,当需要构建多个字典时,应该如何实现呢?遗憾的是,在LangChain中并没有提供这种结构的实现方法,而在实际应用场景中,通常会频繁遇到这种需求。
我们继续以之前的例子为例,假设我们需要列出三个省份的信息,应该如何操作呢?
在开发威胁情报IOC提取工具过程中,我们总结出一套可靠的提示模板。只需按照以下方式输入即可:
请随机输出中国3个省份的信息,他们均包含
名称:该省的名称
省会:该省的省会名称
人口:该省的人工数
面积:该省的面积,以平方公里为单位
区号:该省的区号
输出应该是按以下模式格式化的标记代码片段,包括开头和结尾的"```json"和"```",此外不要包含任何描述性信息。
{
"省份": array // 包含各个身份信息的列表
[
{
"名称": string // 省份名称
"省会": string // 省会名称
"人口": int// 该省的人口
"面积": float// 该省的面积,浮点数表示,不要带单位
"区号": string // 该省的区号
}
]
Part 05● 输出结构化字典 ●
在大语言模型应用开发过程中,我们发现模型直接的自由生成输出,很难满足工程化的需求。为了发挥模型的最大价值,提示工程变得尤为关键。经过实践探索,我们归纳出了以下输出格式化的方法论:
1.使用列表、表格等结构化格式,组织模型输出,提高可读性。
2.在输出中添加必要的标题、标记,清晰表示内容结构。
3.支持多级别的内容格式,如嵌套列表等。
4.兼顾格式的一致性,美观度等全局因素。
5.输出支持直接转换为HTML、Markdown等结构化格式。
当前大模型能力仍有限,优化提示非常必要。以上格式化输出经验来自开发IOC提取工具的实践,基本满足了工程需求。希望这些简单的方法论,能对各位开发者有一定参考价值。