今天是2023年10月22日,星期日,北京,天气晴。
我们前面都在讲RAG的一些理论层面的事情,我们今天来看看实践。
今天早上看到一个很有意思的行业知识问答评测项目,SMP2023 ChatGLM金融大模型挑战赛,整体看了一遍,其中公开的一些方案也很有启发,因此,分享出来,供大家一起参考。
虽然是打比赛的trick,但其中的一些思路,以及为了微调模型而设定的prompt优化,以及微调数据的生成方式,尤其值得重视。
1、任务概述
本次比赛要求参赛选手以ChatGLM2-6B模型为中心制作一个问答系统,回答用户的金融相关的问题,不允许使用其他的大语言模型。参赛选手可以使用其他公开访问的外部数据来微调模型,也可以使用向量数据库等技术。
本次比赛评估模型能力的赛题按照涉及模型的能力和复杂程度大体分为初级、中级、高级三种类型,每种类型的题目拥有不同的分值:
初级:数据基本查询(40分)
参赛者需要利用提供的ChatGLM2-6B开源模型和上市公司年报原始数据,并以此为基础创建信息问答系统。系统需能够解决基本查询,如:某公司2021年的研发费用是多少?等问题。
中级:数据统计分析查询(30分)
在初级阶段的基础上,参赛者需要进行金融数据的统计分析和关联指标查询。系统需基于各类指标,提供问题和答案,如:某公司2021年研发费用增长率为多少?等问题。
高级:开放性问题(30分)
如:某公司2021年主要研发项目是否涉及国家创新领域,如新能源技术、人工智能等?
评测任务的任务形式为:给定一组参考文档和问题,要求模型按照指定格式生成答案。问题包含多种类型。
2、任务示例
{"ID": 1,
"question": "2019年中国工商银行财务费用是多少元?",
"answer":"2019年中国工商银行财务费用是12345678.9元。"}
{"ID": 2,
"question": "工商银行2019年营业外支出和营业外收入分别是多少元?",
"answer": "工商银行2019年营业外支出为12345678.9元,营业外收入为2345678.9元。"}
{"ID":3","question": "中国工商银行2021年净利润增长率是多少?保留2位小数。","answer": "中国工商银行2020年净利润为12345678.90元,2021年净利润为22345678.90元,根据公式,净利润增长率=(净利润-上年净利润)/上年净利润,得出结果中国工商银行2021年净利润增长率81.00%。"}
3、数据集
从上海证券交易所和深圳证券交易所收集的2019-2021年期间部分上市公司的年报作为数据源。2019年至2021年期间的部分上市公司年度报告数据集,该数据集包含了11588个详尽的PDF文件。
地址:https://modelscope.cn/datasets/modelscope/chatglm_llm_fintech_raw_dataset/summary
4、评价方式
评测示例:
{"question": "2019年中国工商银行财务费用是多少元?",
"prompt": {"财务费用": "12345678.9元", "key_word":"财务费用、2019", "prom_answer": "12345678.9元"},
"answer": [
"2019年中国工商银行财务费用是12345678.9元。",
"2019年工商银行财务费用是12345678.9元。",
"中国工商银行2019年的财务费用是12345678.9元。" ]
}
评测计算示例:
答案一:工商银行2019年财务费用是12345678.9元。****
most similar sentences:
2019年工商银行财务费用是12345678.9元。 (Score: 0.9915)
中国工商银行2019年的财务费用是12345678.9元。 (Score: 0.9820)
2019年中国工商银行财务费用是12345678.9元。 (Score: 0.9720)
评分:0.25+0.25+0.9915*0.5=0.9958分。
评分解释:prom_answer正确、包含所有key_word、相似度最高0.9915。
答案二:2019年中国工商银行财务费用是335768.91元。
评分:0分。
评分解释:prom_answer错误不得分。
答案三:12345678.9元。
most similar sentences:
2019年工商银行财务费用是12345678.9元。 (Score: 0.6488)
2019年中国工商银行财务费用是12345678.9元。 (Score: 0.6409)
中国工商银行2019年的财务费用是12345678.9元。 (Score: 0.6191)
评分:0.25+0+0.6488*0.5=0.5744分。
评分解释:prom_answer正确、未包含所有key_word、相似度最高0.6488。
整体方案如下:
其中,在表格抽取方面,用多种第三库提取表格,让提取的数据全面且准确
在问题分类阶段,使用正则进行处理,
在关键词提取阶段,使用基于LLM的关键词抽取,并采用In-Context Learning的关键词抽取方案,无需微调,保留大模型的通用能力,拓展性和灵活性更好;通过构造history,模拟多轮对话的方式进行,让模型能稳定输出json,对于异常json通过调整temperature=1加上retry多次,使其更稳定输出。
此外,LLM抽取可以抽取到正则词典没覆盖的关键词,泛化性强。
在基于LLM的文档问答阶段,采用常规方式进行处理:
其中,有趣的是,针对表格问题,通过找到左、上表头生成表格句子,解决表格数据难召回以及LLM理解表格困难的问题,可兜底回答数据库没有抽取的表格字段信息。
与上一个方案不同,该队伍重点采用了基于微调的方案。
其中,针对问题分类这一阶段:
构建微调训练集(900+数量的标记数据)。
根据赛题信息,构造6分类,
然后通过微调模型生成答案:
在查询阶段,该工作认为chatGLM2本身有一定的NL2SQL能力,但是难以在项目中稳定输出有效正确的SQL格式的语句。 线上的GLM-130B有良好的NL2SQL的性能,所以判断应该可以透过微调训练来增强ChatGLM2-6B的SQL能力。
早期尝试用公共的NL2SQL训练集(2019年NL2SQL大赛的公开标注数据集),大概40000多道题目(包含电影、书 籍、评价、金融等等五花八门的题目类型)。结果发现,不仅没有能够很好对题目进行SQL生成(loss在0.36-0.50摇 摆下不去),而且丧失了基本的对话能力,自认为是题目里出现过的张三。
再次尝试公共NL2SQL训练集,这次加上了比赛题目的题型,希望强化SQL后可以对比赛题目也能有比较好的表现。训练后发现,小规模的标注60-100道题难以对原来较大规模的题目造成影响,而且发现原来的训练集虽然大,但其实也 是有很多问题会对本次项目有负面影响,最后放弃掉公共的NL2SQL的训练集。
据前面两个尝试结果,该团队认为要想稳定生产准确有效SQL语言,是需要根据实际的任务情况和方向来设定训练目标,最后决定自己来标注训练集,为了加快效率,使用ChatGPT/Bard来协助生成该写出不同提问模板,再透过字段的随机条件填充。
构建针对其模版格式的问题训练集,根据比赛早期提供的四个模版扩充了24种不同问法,并且强化了除了查询以外的SQL语句, 如排序,输出范围,统计计数,条件求和,单字段检索,多字段检索,多字段检索多字段,字段的过滤等,不同比较级的语言描述(高低,大小,多少,否定词+理想,中文数字和阿拉伯数字)。
在关键词提取阶段,也采用有监督的方案:
本文主要介绍了面向真实金融场景问答的几个方案,其中与大模型应用于行业文档问答的方案很有启发意义,对于方案更详细的了论述,可前往参考文献,做更细致的体会。
虽然是打比赛的trick,但其中的一些思路,以及为了微调模型而设定的prompt优化,以及微调数据的生成方式,尤其值得重视。
很有启发意义的实践工作,推荐大家关注。
1、https://www.bilibili.com/video/BV1Gm4y1V7LD/?vd_source=d670de3e996c9a3b795a0e40e028adeb
老刘,刘焕勇,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。
老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。
对于想加入更优质的知识图谱、事件图谱、大模型AIGC实践、相关分享的,可关注公众号,在后台菜单栏中点击会员社区->会员入群加入。