文章目录
- 场景说明
- 超参数调整
- 提示词优化
- 提取的后处理
- 评估提取性能
- Experiment
-
- 1、通过符号学定位原文信息
- [1.1 首位字符在原文中的index](#1.1 首位字符在原文中的index)
- [1.2 首尾N个字符,中间字符使用...代替](#1.2 首尾N个字符,中间字符使用...代替)
- 使用动态调整输出内容
- 参考资料
场景说明
需要让大模型从文本中提取出固定的字段,同时为了方便后续数据管理,要求大模型输出格式为json格式。会涉及的几个影响提取质量的流程:
- 待提取文本的质量。如果待提取文本是诸如图片、PDF等文件格式,那么就需要结合OCR技术,将图片文件转换为对应的字符串信息。
- 提示词模板的质量。能否正确描述该提取任务、格式说明是否正确、提示词的高级用法是否使用等均会影响大模型的输出质量
- 大模型的性能。即使有准备充分的待提取文本和任务表述清洗的提示词,大模型的提取质量也是会影响提取效果。大模型对提取任务的影响存在两个方面:一是大模型本身的性能,大模型推理能力、理解能力好,提取效果相对较好;二是在选定了基座大模型之后,对大模型接口参数的调整,比如top_p、top_k、temperature等超参数的调整
- 后处理的格式化输出。提取到了大模型的输出之后,还要进行必要的后处理,才能将提取到的结果进行流程化。比如对一些输出的json结果进行解析,由于大模型存在幻觉,可能会导致json格式的错误:比如大模型有时喜欢在jison中加入 注释
\\
;或者缺少了}
导致无法完全使用json.loads()
来格式化
超参数调整
top_k
top_k 越小
思路:从 tokens 里选择 k 个作为候选,然后根据它们的 likelihood scores 来采样模型从最可能的"k"个选项中随机选择一个,如果k=3,模型将从最可能的3个单词中选择一个。在很多情况下,这种抽样带来的随机性有助于提高生成质量。
top_p
思路:候选词列表是动态的,从 tokens 里按百分比选择候选词,模型从累计概率大于或等于"p"的最小集合中随机选择一个,如果p=0.9,选择的单词集将是概率累计到0.9的那部分。
影响输出文本的多样性,取值越大,生成文本的多样性越强
个人经验:
top_p 越强,比如设置top_p = 0.9, 大模型的自我表达越强,在提取任务中,大模型会输出很多非必要的旁白, 或者过早的停止提取任务,这个参数不好调,
tempareture
建议调整幅度不要过于剧烈,在± 0.15之间进行调整即可
response_format
千帆大模型提供了一个 response_format的超参数,估计是将这个超参数输入到提示词模板中。
不加response_format="json_object"
大模型输出的json是带有json...
前缀的
个人经验是:
- 默认参数是通用场景的最佳参数,因为大模型训练的时候就是按照这个默认参数进行训练的。
- 调整接口超参数应该尽可能遵循:调整个数少,调整幅度小, 进行消融实验
提示词优化
提取任务通用提示词模板
一个基础的提取任务的提示词模板,应该包含的四个要素:角色说明
、任务说明
、输出格式
、待提取区域
进一步的,如果提取的字段较少,可以设置一些few shot
提示词来提高模型对任务的服从性
text
# 任务简介
你是一个文本json转换器。从{category}报告文本内容中识别出信息元 {extract_target},并按照json格式进行提取。
# 任务说明
尽可能从原文提取出信息,不要修改字段值的原文内容。
把文中出现的时间和日期用ISO 8601格式表示。
由于该报告通过OCR进行识别,因此存在小部分字词错误和格式混乱的问题,你需要进行合理推断,从而尽可能完整地提取出相关信息。
信息元提取地越完善越能够帮助到用户管理自身健康信息。
文本中的报告内容全部都需要提取到对应字段中,不要输出原文没有的内容。
只返回那些成功提取的字段及其信息。如果某个字段没有提取到信息,请不要在返回的json结果中包含该字段。
输出结果不能进行简略输出,不可使用 "//" 注释,要求全部提取。
# 输出格式
请按以下json格式抽取文本中的内容:
{extract_json_demo}
# 开始提取
报告内容如下:
"""
{original_report}
"""
防止badcase的提示词
按照输出格式输出内容,不要输出非格式内容的其他旁白 请按以下json格式抽取文本中的内容
文本中的报告内容全部都需要提取到对应字段中,不要输出原文没有的内容
对于能够提取到的字段,不能对其提取结果进行简略输出,要求全部提取 尽可能从原文提取出信息,不要修改字段值的原文内容
把文中出现的时间和日期用ISO 8601格式表示。
输出结果不能进行简略输出,不可使用 "//" 注释,要求全部提取。
这是我研究出的一个提示词优化:只返回那些成功提取的字段及其信息。如果某个字段没有提取到信息,请不要在返回的json结果中包含该字段
该提示词能够减少大模型的无效输出,因为缺失的值,直接不反回这个字段即可,不需要额外返回类似 {"字段1":"未提取到该字段"}
等啰嗦,因为完全可以不返回这个字段,即可表示相同含义。
该提示词优点:
- 精简输出,减少输出耗时,降低token费用。啰嗦的内容越少,耗时越少,费用也越低
- 降低格式错误的概率。输出的内容少了,出现格式错误的机会就相对越低
该提示词缺点:
- 有概率导致大模型偷工减料,给了大模型不完全提取的一种豁免,尤其是大模型性能不佳的时候
- 大模型性能不佳时,不能服从该提示词,也就是缺失的值照样返回,那么这个提示词就是无效提示词
- 设置了该提示词之后,后处理为了确保格式统一,需要增加字段完整度检查逻辑,对于缺失的字段需要代码补全
特殊符合划分待提取内容
报告内容如下:
""" # 使用特殊符号来标识提示词和待提取内容
{original_report}
"""
提取的后处理
- 一些简单的预处理
- 使用
json.loads()
- 使用
json_repair()
- 定制 解析逻辑
如果使用json
输出格式不能很好地约束大模型进行提取任务,那么可以参考使用其他格式,比如使用jsonl
评估提取性能
- 统计返回的键的长度:
len(dict.keys())
- 统计提取到的数据长度:
sum(len(i) for i in dict.values())
- 统计格式服从度: 比如有无额外的旁白
Experiment
让大模型从原文中提取,按照给定的字段提取对应的原文内容,然而由于有些字段提取到的内容较长,一方面会影响完整输出的时间,另一方面会影响提高提取成本。
因此需要对提取Agent进行优化,从而提高Agent的提取效率,降低成本
本文对几个优化方案进行试验记录,
1、通过符号学定位原文信息
1.1 首位字符在原文中的index
优化逻辑
由于我们已经有了原文信息,所以我们可以将提取任务理解原文中的哪些片段需要被提取出来。
同时结合字符串的位置信息,我们可以将原文中冗长的片段映射为原文也就是原字符串中的位置信息,从而精简输出内容。并通过返回的位置信息,回到原文中,定位抽取出字符片段。该方案逻辑上可行,并且对于字段提取结果为长文本的场景,具有加速效果,对于较短的信息提取,如简单实体提取,则加速效果不明显。
# 任务说明
你是一个法律文档处理助手,负责将法律报告文本内容抽取并转换成JSON格式。
你需要以 JSON格式提取字段:['当事人姓名', '报告日期', '案件类型',]
# 提取模板
请按以下JSON格式抽取文本中的内容,只输出原文中存在的信息,其他信息不要输出。
字段的值是提取到的信息在原文中的位置信息,格式为[start_index,end_index]。
{
"当事人姓名": [位置信息],
"报告日期": [位置信息],
"案件类型": [位置信息],
}
例如,如果原文中包含以下信息:
> 民事案件报告,当事人姓名:张三,报告日期:2024-07-01,案件类型:合同纠纷,报告名称:案件分析报告,法律意见:建议和解,备注:无。
那么,提取的JSON格式内容将如下:
{
"当事人姓名": [12, 14],
"报告日期": [21, 31],
"案件类型": [39, 49],
}
原文:
1.2 首尾N个字符,中间字符使用...代替
# 任务说明
# 格式说明
原文: