AFAC2024 金融工具Tools识别竞赛总结

  • 赛题名称:AFAC2024挑战组-赛题一:金融工具学习

  • 赛题类型:大模型、Tools

  • 赛题任务:将用户问题转化为可执行的APIs

比赛链接:https://tianchi.aliyun.com/competition/entrance/532193/information

鄙人也参加了这个比赛,最终获得三等奖,现在记录学习一下前排的方案吧!

赛题背景

在金融对话领域,问答系统通过意图识别和检索召回来承接用户的问题,在长期的迭代过程中系统会沉淀各种各样的API接口,大部分API都可以作为独立的原子服务,用户问题可以根据问题的解决过程拆分为多个子问题(CoT),每个子问题可能需要调用一个或多个原子API来解决,这种问题定义的方式使得我们可以将结构化和非结构化QA抽象为API的组合调用问题,同时让正面回答用户问题成为可能。

图片

那么如何把这些丰富的API充分利用起来,将用户的自然语言问题转化为可执行的APIs List并端到端的解决正成为我们越来越重要的议题。

因此,我们构建了一个金融场景多API工具学习的评测任务,希望推动大模型在金融场景应用落地,可以产出更高效、跨场景泛化性更强的工具学习方案,推动该方向的技术演进。大模型工具学习的过程如下图所示:

赛题任务

在本任务中,参赛者需要根据用户Query,从API集合中筛选出合适的API列表,生成正确的api调用逻辑和答案。参赛者可以充分利用给定的数据集,使用大模型设计最优指令以得到最好的生成结果。

任务数据

数据集包含基金、股票类,按照API的出参类型可以分为类别型和数值型两种,按照API的组合来看可以划分为两大类:单API调用和组合API调用。根据能力项可以分为:多条件、区间类、聚合类、比较类、计算类、时间类、排序类、嵌套类和推理类等九大类。

图片

  • 训练数据样例

{
    "query": "我如果一年前购买了2000元浙商智选先锋A基金,并且在6个月前追加了3000元,我到现在总的收益是多少",
    "relevant APIs": [{"api_id": "0", "api_name": "查询代码", "required_parameters": [["浙商智选先锋一年持有期混合型证券投资基金A类"]], "rely_apis": [], "tool_name": "基金查询"}, {"api_id": "1", "api_name": "查询近期收益率", "required_parameters": ["api_0的结果", "1年"], "rely_apis": ["0"], "tool_name": "基金查询"}, {"api_id": "2", "api_name": "查询近期收益率", "required_parameters": ["api_0的结果", "6个月"], "rely_apis": ["0"], "tool_name": "基金查询"}, {"api_id": "3", "api_name": "乘法计算", "required_parameters": ["api_1的结果", "2000"], "rely_apis": ["1"], "tool_name": "数值计算"}, {"api_id": "4", "api_name": "乘法计算", "required_parameters": ["api_2的结果", "3000"], "rely_apis": ["2"], "tool_name": "数值计算"}, {"api_id": "5", "api_name": "加法计算", "required_parameters": ["api_3的结果", "api_4的结果"], "rely_apis": ["3", "4"], "tool_name": "数值计算"}], 
    "result": ["api_5的结果"]
}
  • 数据分布

数据集数量

train

5k

dev

1k

test-A

1k

test-B

1k

  • 提交文件

提交文件命名为"参赛选手_result.jsonl",每行是一个json,utf-8编码。

{"relevant APIs": [{"api_id": "0", "api_name": "查询代码", "required_parameters": [["浙商智选先锋一年持有期混合型证券投资基金A类"]], "rely_apis": [], "tool_name": "基金查询"}, {"api_id": "1", "api_name": "查询近期收益率", "required_parameters": ["api_0的结果", "1年"], "rely_apis": ["0"], "tool_name": "基金查询"}, {"api_id": "2", "api_name": "查询近期收益率", "required_parameters": ["api_0的结果", "6个月"], "rely_apis": ["0"], "tool_name": "基金查询"}, {"api_id": "3", "api_name": "乘法计算", "required_parameters": ["api_1的结果", "2000"], "rely_apis": ["1"], "tool_name": "数值计算"}, {"api_id": "4", "api_name": "乘法计算", "required_parameters": ["api_2的结果", "3000"], "rely_apis": ["2"], "tool_name": "数值计算"}, {"api_id": "5", "api_name": "加法计算", "required_parameters": ["api_3的结果", "api_4的结果"], "rely_apis": ["3", "4"], "tool_name": "数值计算"}], "result": ["api_5的结果"]}
...

评分规则和脚本

评测为测试数据集上的静态自动评估。

  • 评价指标:Score= 主指标 * 80%+ 副指标*20%

  • API List的执行准确率(主指标):将api_list执行后得到结果的准确率;

  • API List的逻辑准确率(副指标):api_list中APIs和出入参的逻辑准确率,排除顺序的影响;

优胜方案

https://github.com/AFAC2024/AFAC2024-Advanced-Fintech-AI-Competition

一等奖:Shoreline Dawn

  • 📃 分享文章:https://mp.weixin.qq.com/s/U7BI_cR79yy5KpAx9VKXdQ

  • 🎬 答辩视频:https://www.bilibili.com/video/BV1x524Y3E5u/

  • 💻 分享代码:https://pan.baidu.com/s/1vLAdXG3kEFhc0jRT3E7RdA?pwd=pgrf

图片

根据对样本进行分析,再结合一些经验,我们可以总结出比赛的三个要点:
  1. 标准产品名提取 查询类别API需要传入标准产品名(e.g. 浦发银行)才能执行,但query中只有缩写(e.g. 浦发最近一月的最高价是多少),若不加入提示,大模型很难还原真实的标准名称。

  2. 用户意图识别 根据所需要调用的API,可以把用户意图分为4类:基金查询、股票查询、条件选基、条件选股。不同的意图用到的API有较大不同,规范也有差异。

  3. 相关例子召回 若要让大模型理解各种API的用法,需要给出相似的例子,让模型从例子中理解。例子与目标query的相关性极大程度的影响了模型表现,若只给标准例子,模型难以学会API的规范用法。

  • 具体样例

用户查询

产品名

用户意图

部分标签

我打算用100万元买三羊马的股票,如果按照三羊马的最高价来计算,我能买多少股呢

三羊马

股票查询

{"API_id": "0", "API_name": "查询代码", "required_parameters": [["三羊马"]], "rely_APIs": [], "tool_name": "股票查询"}

上周结束的时候,有哪些股票的收盘价是不超过0.47元的呢?

/

条件选股

{"API_id": "0", "tool_name": "条件选股", "API_name": "查询收盘价", "required_parameters": ["小于", "0.47", "上周"], "rely_APIs": []}

我今年5月1日用5000块买的国金金腾通C,如果我现在全部卖出,交易费用是多少

国金金腾通货币市场证券投资基金C类

条件选股

{"API_id": "0", "API_name": "查询代码", "required_parameters": [["国金金腾通货币市场证券投资基金C类"]], "rely_APIs": [], "tool_name": "基金查询"}

请问有哪些基金最近一个月中最长的解套期是20天,并且在今年已经创下新高达70次的?

/

条件选基

{"API_id": "0", "tool_name": "条件选基", "API_name": "查询近期最长解套天数", "required_parameters": ["等于", "20.0", "1个月"], "rely_APIs": []}

方案框架

图片

首先给出我们的整体框架。根据实现流程,我们可以将框架将分为三个部分:

Prompt构造 我们设计了三个核心子模块,以帮助模型规范其输出。这三个子模块分别是产品召回、意图识别和例子召回。这些模块相互配合,确保模型能够更准确地理解和执行任务。

图片

训练阶段 为了获得多样化的结果,我们对Prompt中的内容进行了部分删减,并调整了few-shot逻辑,从而得到五个不同的Lora微调模型。这种多样化的训练策略有助于模型在不同场景下的表现更加全面和可靠。

推理阶段 除了句子级别的多数投票外,我们还进行了许多其他尝试。同时,我们还实施了一些针对赛题的后处理技巧,如产品名称投票和错误API过滤,这些技巧对提升最终结果也有一定的帮助。同时,为了确保模型严格按照规定生成结果,我们的最终方案是使用五套差异化的Prompt对GLM进行Lora微调,然后对生成的五套执行语句进行句子级别的多数投票,以得出最终结果。

产品名召回-Text Match

图片

图片

  • 思路 因为用户的询问往往不够精准,比如用户可能会简称"平安银行"为"平安",但系统只能识别标准名称"平安银行"。所以我们设计了产品召回模块,其核心任务是针对用户查询,找到对应的标准产品名称。

  • 实现 具体来说,我们设计了四种字符串匹配算法,包括最长公共子序列匹配、最长公共子串匹配,以及我设计的一个变体算法(公共子串占总字符串比例的算法) 。每个算法找到多个候选结果,然后拼接到一起,再让大模型从中选出最符合意图的一个作为最终结果。

  • 细节 之所以需要召回多个结果,是因为整个系统中涉及的产品总数超过三万个,单靠简单的匹配算法很难精准捕捉到用户真正提及的对象。我们的思路是先用这些算法先召回十几个可能正确的候选产品,接着再让大模型从中挑选。

意图识别-KNN

图片

图片

图片

图片

  • 思路 具有相同意图的查询往往具有许多共性。在API链中,我们将第一条API定义为用户意图识别的节点。根据分析,用户查询主要有四类意图:股票查询、基金查询、条件选股以及条件选基。

  • 实现 这里的意图识别方法不同于传统的NLP任务,我们有大量的同源训练样本。所以我们使用了KNN算法来处理用户请求,取最邻近的20个样本的意图的众数作为该请求的最终意图。

  • 细节 为了找到最邻近的20个样本,我们选择了四种方法:编辑距离、SimCSE嵌入相似度、E5嵌入相似度和Bge嵌入相似度。每种方法分别召回5个最邻近的样本,最终将这20个邻居样本混合起来,通过投票来确定用户请求的意图。

例子召回-RAG

图片

图片

  • 思路 在大模型的提示词中加入少量示例能够帮助模型更好地理解任务,few-shot是大模型比赛中非常常用的技巧。

  • 实现 我们采用了与意图识别类似的思路来实现few-shot。首先,使用多种嵌入算法找到与当前查询相似的邻居并将其对应的问答作为例子,放入Prompt中作为few-shot提示。我们最终选取了三套嵌入方法,并使用蛇形召回算法来逐步从每个模型中提取结果,最终排出了六个示例。

图片

图片

图片

图片

图片

二等奖:FNO_

图片

图片

图片

图片

图片

图片

图片

二等奖:financial_agent
  • 🎬 答辩视频:https://www.bilibili.com/video/BV1R92xYREKF

图片

图片

图片

图片

图片

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值