智谱AI变现攻略:如何轻松赚到10,000元 - 附实战案例解析
你会如何构建Agent以应对下述多轮问答?
1.安井食品在2019年第一季度的最高价、最低价分别是多少?差价是多少?
2.创一季度最高价那一天,该股票是否创下了近一年新高?
3.分析该股票2019年1月份的成交量特征:哪几天的成交量超过月均量的2倍?具体是多少比例?这些放量日的收盘价相比前一日分别上涨/下跌了多少?
如果是400道涉及77张表、3000+字段、涵盖了58个二级市场各个领域(股权、交易、基金、财务、行业、港股、美股等)的类似题目呢?
这些题目来源于由智谱和清华大学联合举办的“地狱级”黑客松 -《2024金融行业·大模型挑战赛》。该黑客松颇为艰困,完全复刻了金融行业二级市场的真实需求。
而经过数月奋战,我,作为一名金融市场“门外汉”,在1300+名选手中“杀出一条血路”,最终获得了全国第七名以及10,000元的奖金。
图1: 老于得奖了
所以,我的Agent是凭何挣了智谱10,000块?
咱们先聊2,500块的。
2,500块
本次赛事一个颇为有趣的设置是:提交一个“能跑”的开源Baseline即可获得2500块奖金,而“能跑”则意味着Agent具备了完整回答多轮问答的水准。为了达成该水准,在初赛,我的Agent采用了以下设计思路:
图2: 初赛设计思路
- 分而治之。Agent会逐条处理多轮对话中的每个问题。此外,基于GLM将实体关系相对简单(涉及三、四张表以内,外键关系直白)的自然语言直接转化为SQL能力还不错,每个问题也会被拆解为子问题以降低复杂度;
- 实体识别。识别业务实体所属的库、表和字段是确定场景归属(例如,区分国内市场、美股或港股)和SQL生成(例如,“安井食品”隶属于中文简称字段)的“锚”。而在实际业务环境中,鉴于Agent几乎没有可能从高度管控的业务数据库中“扒”出数据进行Embedding Search,因此使用SQL进行实体召回更为实际;
- 大模型驱动的决策体系。由GLM依据Memory中的数据状态决定子查询要采取的Action(Search或者Coding),例如,当“最高价”和“最低价”已经存在时,Agent会自主决定通过Coding,而非Search,进行差值计算;
- Zero-Shot NL2SQL。在初赛中我们利用了Schem_Links机制实现Zero-Shot NL2SQL,而剔除Few-Shot方案(SQL Template)的原因在于样例召回的小概率偏差会严重影响SQL的生成质量;
- 查询增强。用于补齐上下文中指代不清或者遗漏的实体信息,例如厘清“那一天”或“该股票”的指代关系。
感谢大模型日渐强悍的Code Gen能力,我在初赛只花了5天时间便基于Multi-Agent和Plan/Reflection框架实现了上述设计思路。
但是,上述思路还不足以挣到10,000块,Agent总要展示点“绝活”。
10,000块的绝活
初赛之后我进行了复盘。复盘结果揭示,除了对业务本身的误解外,90%Agent所产生错误都源于以下两个方面(图3):
- 稳定性。在转化有些复杂的子问题时(例如,涉及统计、复杂条件或者三张以上的表关系),基于Schema_Links的NL2SQL的转化成功率不稳定;
- 适配性。因为高业务复杂度导致无法穷举Few-Shot,当数据集发生变化后,推理任务(例如,问题拆解、厘清指代)对于新问题的适配度较低。
图3:Agent产生错误的来源
为此,我在复赛引进了两项“绝活”以解决上述问题。
绝活一, XML-based NL2SQL。 过往黑客松的实践已经证明大模型对封闭标签内(例如<Tag>...</Tag>)文字的理解和处理相当友好,因此,我尝试使用封闭标签格式的鼻祖XML替代基于JSON的Schema_Links作为NL2SQL的中介(图4):
图4:XML替代JSON作为NL2SQL的中介
而XML替代的效果显著:在10X10测试中,XML-based NL2SQL提升SQL转化稳定性达14%(图5)!。
10X10测试是指一组10道问题连续运行10次,通过正确率衡量NL2SQL的稳定性。
图5:10X10测试结果表明XML显著提升了NL2SQL的稳定性
绝活二,<think>式CoT 。传统CoT已经可以诱导大模型进行思考。而在CoT基础之上,以<think>为框架的分类->推理->结论模式,可以进一步以Few-Shot的方式要求大模型进行DeepSeek式的思考,让Agent理解业务细微差异而非记住规则,从而增强面临新问题时的适配性(图6)。
图6: DeepSeek <think>式CoT
例如,当对以下问题进行拆解时:
603290的公司全称、A股中文简称、法人、法律顾问、会计师事务所(答案需包含特殊普通合伙说明)及董秘是?
在不提供近似案例的情况下,使用传统Few-Shot的Agent很容易将该问题拆分为6个子问题(分别查询公司全称、法人等),从而导致时间和资源的浪费。
而<think>式CoT可以引导Agent对问题进行分类,通过判断公司全称、法人等属性归属于同一实体,从而决定问题不需要拆分(图7)。
图7: <think>式CoT思考不拆分案例
而在下面案例中,<think>则可以通过判断“股东大会”和“股东减持”并非同一实体,而将问题拆分为子问题从而分而治之(图8):
图8: <think>式CoT思考拆分案例
基于分类规则可穷举,Agent可以利用相同推理模式有效适配新的数据集,从而提升输出质量。
而这些绝活在复赛中得到了印证。
印证
复赛一共包含3轮:复赛A榜(R2A)、复赛B榜(R2B)、智谱验证轮(R2B-智谱,图9),而看似繁琐的复赛机制恰巧为验证Agent的稳定性和适配性提供了数据基础。如果我们以R2B-智谱的得分为基准,那么:
图9:复赛轮次设置
- 稳定性:可以用R2B-智谱和R2B得分的差值表示Agent在相同数据集下稳定输出的能力;
- 适配性:可以用R2B-智谱和R2A得分的差值表示Agent衡量不同数据集下输出质量。
在所有Top选手中,我的Agent在上述两方面的综合表现为最优(图10):
图10:Top选手的综合表现
遗憾的是,对二级市场业务理解的缺失没能让我走的更远,例如,直至今日,我还是不知道“连续跳空低开”的SQL规则。但这些从2,500块到10,000块的绝活,却可能为提升Agent的泛化性提供新思路,而这种基于行业实践的“日拱一卒”,也许是本次黑客松以及我参与本次黑客松的意义。
后续我将开源XML-Based N2LSQL,敬请期待。
发表评论