“我报销四千八,问知识库要不要总经理签字,它说不用,部门经理签就行。结果财务退回来了,说超过四千五就得总经理签。”
说这话的是我朋友老潘,在吴中一家做精密零件的公司管采购。他们的本地知识库是我去年帮着搭的,放了采购、财务、行政这些制度文件。
图:Coyau / Wikimedia Commons / CC BY-SA 3.0
我先找到那条制度。费用报销办法里写的是:“单笔金额超过人民币肆仟伍佰元(含本数)的,须经总经理审批。”检索其实把这条找回来了,问题出在后面:模型要判断“四千八”是不是超过“肆仟伍佰元”,它把大写金额读成了五千四百元,于是得出了不需要的结论。
我又把所有制度文件里的金额过了一遍,写法五花八门:有的写大写“伍仟元”,有的写“5000元”,有的写“0.5万元”,还有“三千元以下”这种中文小写。同事提问时又是另一套,“四千八”“4.8k”“四八零零”都有。
老潘问:“是不是换个更聪明的模型就好了?”我说聪明一点也许会好些,但金额判断这种事不该靠模型心算。我们改了三处。
第一处,入库时统一金额写法。入库前用一个小程序把文件里的金额全部识别出来,在原文后面括注阿拉伯数字,比如“肆仟伍佰元(4500元)”,原文保留不动,方便核对。
第二处,金额比较交给计算步骤。提问里出现金额时,先换算成阿拉伯数字,再和检索到的门槛逐条比较,“含本数”“以下”“超过”这些边界词按规则表处理,比较结果再交给模型组织回答。模型只负责把话说清楚,不负责算。
图:佚名(1920 年收据,作者不详) / Wikimedia Commons / 公有领域
第三处,回答写明比较过程。比如“你说的4800元,超过制度规定的4500元(含本数),须经总经理审批,依据某某办法第几条”,提问的人一眼能看出结论是怎么来的,错了也容易发现。
验收我们准备了四十道金额题,特意放了很多边界值:正好等于门槛的、差一块钱的、用大写问的、用“k”问的。改之前,四十道里错了十一道,大部分错在大写金额和边界值上;改之后全部答对。原来的一百道普通题重跑一遍,结果没有变化。
图:CEphoto, Uwe Aranas / Wikimedia Commons / CC BY-SA 3.0
老潘说,现在财务退单少多了。
你们公司的制度里金额是怎么写的?知识库遇到金额判断靠谱吗?欢迎在评论区聊聊。
金额统一写法和边界规则表的做法,我整理在 evafang.com 上。