场景方案·数学判题
本文档主要以K12数学判题场景为例(非图形类题目),支持客户基于文心大模型快速构建业务实践,同样方法也适用于英语判题、程序题判题等场景。
一、传统判题场景现状
在没有应用大模型前,普遍的判题任务基本是用拍照搜索存量题库的方式处理的:
但此业务场景现状存在如下方面问题:
题目范围 | 准确率 | 过程与结果 | 复杂情况 |
---|---|---|---|
需要及时更新题库题目,维护成本较高。若不在题库范围内的题目,便无法判断结果。 | OCR解析准确率不高,影响结果准确率。 | 只能针对结果做判断,对解题过程通常无法判断对错,也无法引导学生解题。更多作为批改工具使用,释放老师/家长的批改作业时间。 | 在复杂题目/结果中的判断准确率不高,容易误判。尤其在结果不是一个标准的数字答案的情况下,误判率会更高。 |
二、大模型业务需求
基于以上业务场景现状,客户普遍期望大模型来解决的问题有以下几类
定义好了大模型在判题场景中需要满足的需求后,下面我们到业务可行性评估阶段。通常来说,基于大模型构建业务时,第一步都是业务的可行性评估,需要判断大模型是否具备处理此场景任务的能力。
三、业务可行性评估
以下为基于文心大模型的数学题判断场景方案,同时也为本文档的目录大纲,请您仔细阅读。可参考本页右侧目录,跳转至您需要看的文档位置。
要使用千帆ModelBuilder的模型及工具链能力,首先需要注册成为百度智能云的用户(如您已经是开发者,可直接登录使用)。
3.1 可行性评估方法
我们先用ERNIE-4.0作为baseline,进行业务可行性评估,您可以先到预置服务中开通付费。
ERNIE 4.0
百度自研的旗舰级超大规模大语言模型,相较ERNIE 3.5实现了模型能力全面升级,广泛适用于各领域复杂任务场景;支持自动对接百度搜索插件,保障问答信息时效。
3.2 判题场景评估过程
这里我们假定业务目标:处理小学五年级的数学判题任务
第一步,我们可以人工整理100道小学五年级的数学题目,作为业务可行性评估阶段的测试集。
测试样本需要保证一定的正负样本比例,如正确样本:错误样本 = 1:1,其中50道错误题目,也需要有解题过程错误或结果错误的分布,以此来评估大模型真实的判对、误判能力。
第二步,先通过批量评估的方法,跑出这100道测试集的结果,通过人工评估来粗略评估大模型的准确率能到多少。粗评过程可以不用将prompt写的太复杂,可以参考以下测试样本:
测试样本demo:
1 参考{题目}来批改{学生作业},需要判断解题结果和过程是正确还是错误,不需要返回题目,不需要解析过程
2
3 {题目}:小明在做一道减法题时,把被减数个位上的7看成了1,把减数十分位上的2看成了7,这时结果是 17.1 。这 道题的正确结果是多少?
{学生作业}:被减数减少:7-1=6, 减数增加:0.7-0.2=0.5, 17.1+0.5+6=23.6
4
5 请判断解题过程和结果是否正确
基于大模型返回结果,来进行人工评估,看是否正确
人工评估:
1 {大模型判断结果}:过程正确,结果正确
2 {人工标注结果}:过程正确,结果正确
这里我们100道题目测试结果,基于人工标注结果来统计准确率在60%。我们先把60%的准确率作为优化前的baseline,后续调优手段也会和这个数值进行对比
第三步,我们需要针对判对、判错的题目深入进行人工分析,分析模型是否真正具备该场景所需的能力:
这个阶段我们需要判断模型判错是不稳定性的概率性事件;还是模型能力没有被激发出来;还是因为模型本身就不具备该知识。
可以在我们测试的数据集里,找几类典型的题目,通过以下两种方式进行判断:
对问题进行追问 | 对知识进行续写 |
---|---|
主要判断大模型是否能理解问题及关联知识点;在多次追问下,如果大模型能有效的针对问题进行正确回答,我们认为大模型在对应任务的语义理解和知识关联能力具备能力 | 主要判断大模型的训练语料中是否包含了对应的知识;一般来说能完整&准确的续写,我们认为基础模型里已经把对应知识训练进去了 |
对问题进行追问示例如下:
题目提问 |
考点追问 |
对知识进行续写示例如下:
知识点续写 |
知识点续写 |
判断业务场景是否具备可行性:
如果从直接调用结果来看,准确性/稳定性很低,如40%-,且在评估过程中判断,有大量知识是模型不具备的,那我们认为此场景当前阶段暂不具备可行性,可能需要通过预训练等难度较大的方式才能解决,或需要等base model能力进一步迭代,建议当前阶段先不考虑 | 如果准确率/稳定性较高,且评估过程中判断,模型是掌握该场景知识的,那我们认为此场景具备可行性。效果指标是可以通过模型调优和业务适配等处理等方式提升的 |
从当前场景的批量测试结果来看,大模型初步的准确率已经较好 - 60%;同时,大模型对小学五年级的数学知识分析来看,对应数理知识和知识点的理解,大模型是充分具备的。因此我们判断,小学五年级的数学判题场景,现阶段使用大模型已经具备可行性
下面我们就针对准确率/效果来做进一步优化
优化的过程,建议针对模型的回复badcase进行统计和分析,总结出几类重点优化问题的方向,可以更高效、更有针对性的去优化大模型或整体业务的效果
因此下面我们总结了几类测试过程中的常见问题进行可优化点分析,同时对最终效果给出优化建议
四、优化点分析及优化方案
在优化效果前,我们把业务流程整体的完成了串联:OCR使用的是标准产品,大模型使用的是ERNIE 4.0,图片采用的是小学五年级的数学测试集内容。
在使用完成流程进行测试后,对结果进行分析,我们会从以下两大维度,总结分析可优化点:
OCR解析结果优化 | 大模型输出效果优化 |
---|---|
这部分直接影响大模型prompt的输入内容(在传统判题场景里也同样存在类似问题) | 这部分需要针对大模型本身能力去做激发和调优 |
4.1 OCR 优化点及优化方案
在测试过程中,OCR是整个业务流程的最前置的环节。判题业务逻辑依赖OCR将拍照内容解析后输入大模型,经测试发现,存在大量OCR解析内容质量不高的问题,很大程度上影响了大模型的输出效果。根据百度内部测试结果,因OCR效果不佳,可能影响最终业务整体准确性占比在20%~30%。
我们对测试样本的OCR结果做了逐条查看和分析,总结下来OCR模块存在以下3类可优化点:
手写体识别不准确 | 答题过程顺序识别不准确 | 照片拍摄问题 |
---|---|---|
包含文字本身识别不准确和字迹涂改等干扰因素造成的不准确 优化建议>> |
因学生答题习惯不同,会存在书写格式顺序导致的识别不准确问题 优化建议>> |
如题目不完整、题目重叠等问题,也会直接导致识别后的文字结果不可用 优化建议>> |
4.1.1 手写体识别不准确问题
在题目和解析过程的图片都比较清晰的情况下,我们发现手写体各类异常问题较多。这里举例了3类问题,包括整片内容擦除、手写体字迹潦草、答题内容有部分涂改。图例参考:
这里如果不对OCR的内容做任何处理,直接输入大模型,判错的几率会明显升高,下面是一些实际测试的case:
图片1 - OCR内容直接过大模型:
参考{题目}来批改{学生作业},需要判断解题结果和过程是正确还是错误,不需要返回题目,不需要解析过程
{题目}:甲、乙两人同时从A地出发前往B地,甲到达B地后立即调头返回,与乙在距离B地30千米处第一次迎面相遇。已知从出发到相遇共经过4小时,甲每小时行80千米,那么乙每小时行多少千米?
{学生作业}:
设:
海小时行x米
行x
80x4-4x=60
解:320-4x+4x=60+x
320=60+4x-60
320-60=4x
260=4x÷4
2÷4=65
答:每时行63千米。
请判断解题过程和结果是否正确
模型返回:
解题过程和结果都是错误的。
首先,学生在列方程时出现了错误。根据题目,甲和乙在距离B地30千米处相遇,所以甲行驶的距离是4小时乘以80千米/小时再减去30千米(因为甲已经返回了一段距离),乙行驶的距离是4x加上30千米。所以方程应该是 80*4 - 30 = 4x + 30,而不是学生写的80x4-4x=60。
其次,学生在解方程时也出现了错误。即使按照学生写的方程80x4-4x=60来看,解出来的x也不是65。而且,学生的解题步骤中出现了"260=4"这样的明显错误,说明学生在计算过程中出现了混乱。
最后,学生的答案x=65也是错误的。按照正确的方程和解法,应该得出乙每小时行驶55千米。
所以,学生的解题过程和结果都是错误的。
实际学生的答案是正确的,解题过程有一些问题。但模型都判为了错误
图片2 - ORC内容直接过大模型:
参考{题目}来批改{学生作业},需要判断解题结果和过程是正确还是错误,不需要返回题目,不需要解析过程
{题目}:甲、乙两人同时从A地出发前往B地,甲到达B地后立即调头返回,与乙在距离B地30千米处第一次迎面相遇。已知从出发到相遇共经过4小时,甲每小时行80千米,那么乙每小时行多少千米?
{学生作业}:
80x4-4x=60
解:320-4x+4x=60+x
320=60+4x-60
320-60=4x
260=4x÷4
2÷4=65
答:每时行63千米。
请判断解题过程和结果是否正确
模型返回:
解题过程和结果都是错误的。
首先,学生在列方程时出现了错误,应该是80x4-30=4x+30,因为甲和乙在距离B地30千米处相遇,所以甲行驶的距离是4小时乘以80千米/小时再减去30千米,乙行驶的距离是4x加上30千米。
其次,学生在解方程时也出现了错误,应该将方程化简为320-30=4x+30,然后移项得到4x=260,最后解得x=65,即乙每小时行驶65千米。
但是学生在解方程时出现了计算错误,导致最终答案错误。正确的答案应该是乙每小时行驶65千米。
实际学生的答案和过程都是正确的,但模型都判为了错误
图片3 -OCR内容直接过大模型:
参考{题目}来批改{学生作业},需要判断解题结果和过程是正确还是错误,不需要返回题目,不需要解析过程
{题目}:一个两位数恰好等于它各位数字之和的9倍,则这个两位数是多少?
{学生作业}:
解设这数为aB,得:
10a+B=9(a+B)
10a+B=9a+98
a=86
a881
请判断解题过程和结果是否正确
模型返回:
解题过程和结果都是错误的。
满足条件的两位数是81,而不是学生给出的答案。另外,学生的解题过程中也出现了无法理解的数字和表达式,如“98”和“a881”,这些都是错误的
实际学生的答案和过程都是正确的,但模型都判为了错误
我们对大模型的返回结果进行分析不难发现,大多问题都出现在了OCR的手写体解析准确性上面。如第一张图的”65“解析成了“63”,第三章图的“81”涂改答案解析成了“a881”,导致模型认为过程和结果都错了。因此在这个场景中,对OCR做优化会是提升准确率的核心工作之一。
手写体优化建议·区分识别对象调用不同OCR API
在上述手写体case中,我们发现试题解析准确率非常高,基本都出在手写体上。因此,首先我们可以根据不同场景选择不同的OCR策略。
可以在业务上对题目边缘进行检测,划分出哪些是题目内容,哪些是学生答题部分内容,如:
在题目部分,采用试卷分析与识别API,可对文档版面进行分析,输出图、表、标题、文本的位置,并输出分版块内容的OCR识别结果;在答题部分,建议使用手写文字识别API,针对不规则的手写字体进行专项优化,识别准确率可达90%以上;同时可以使用高精度含位置版,返回具体坐标信息,根据附带的坐标信息,做一些业务逻辑上的判断处理
手写体优化建议·数学公式单独识别
另外在解析结果中我们会发现,如果带有复杂数学公式,识别准确率也会降低。这里建议对公式部分,使用支持LaTex转换的OCR功能,保证公式不会丢失,不影响输出。如开源的LaTex-OCR。
当前试卷分析与识别API也能支持,可以对比效果。
补充说明:
文心大模型是能理解LaTex格式的公式的,如下图:
手写体优化建议·内容涂改部分过滤
学生解答过程中,往往会有涂改部分,这些内容很影响识别效果。因此可以先识别到划线数据后,过滤掉该部分内容,以提升效果
手写体优化建议·最终答案扣取
通过“答”等字眼,或根据解答过程最后一行文字,来提取和判断最终的答题答案,方便改写后以更标准的格式输入模型,提升大模型对答案判断的效果,如:
4.1.2 答题过程顺序问题及建议
除了文字本身识别的准确性存在上述问题外,我们还观察到,有大量的题目存在过程解析顺序有问题,导致了过程解析出错后,大模型判断解题过程出错。这里建议对答题的过程做数据块划分,划分后进行重新排序, 在业务策略上进行有效处理,保证按正确顺序解析解题过程,例如:
当前部分逻辑也已经做到了试卷分析与识别API中,后续会持续优化此类策略。
4.1.3 图片拍摄问题及建议
最后,我们还发现有大量的图片,是因为拍摄问题导致的识别问题,如题目不完整、多道题目重叠、拍摄图片质量低等问题,例如:
题目不完整 |
多题目重叠 |
这里建议在OCR之前,加上图片检测逻辑:
对印刷体格式的题目做边缘检测,若检测出的题目不完整或成像质量低,则直接返回拍摄失败,引导用户重新按要求拍摄。若检测到有多道题目,则根据答题位置去扣取最近的题目边缘内的内容,把关联性内容送入大模型处理。
4.2 大模型效果优化点及优化方案
在完成OCR模块的相关优化后,接下来,我们到大模型里分析和模型本身效果相关的可优化点
同样,在大模型的输出效果层面,我们还是根据大模型的输出内容进行分析,来观察和总结出对应的优化点。我们总结出以下几点:
输出冗余与一致性 | 模型偏差 | 复杂计算 |
---|---|---|
输出内容较为啰嗦,且每次输出格式不太固定 - 首先需要控制模型输出,才能和业务系统更好对接。从初步评估的结果来看,首先需要做的就是提升大模型在指令跟随上的稳定性 | 出现过程错误结果正确但模型都判错的情况 - 在评估过程中,还发现有大量误判题目,都是过程错误但结果正确的,进一步分析后发现在prompt层面没有明确对应任务,且同样也存在大模型没有按要求执行的问题,也存在指令跟随上的稳定性问题 | 复杂计算题目里,容易判断出错 - 对题型做完分类后,分析结果发现,在难度较高的题型里准确率较低,需要提升模型复杂数理推理能力 |
基于以上总结,我们抽象出了以下两大问题:
- 大模型的指令跟随问题 和 大模型的数理推理能力问题
通常我们优化效果,会从Prompt Engineering和SFT两个层面来进行效果优化。
另外,往往优化的方式是可以交叉的,如SFT后的模型,也会需要在Prompt Engineering上做优化。所以在效果优化上,我们建议从易到难尝试,优先尝试Prompt Engineering,如果有进一步的更高标准的需求,再到SFT等复杂优化范式上做进一步尝试。
接下来,我们会先从Prompt Engineering角度出发,结合上述3类具体的问题点去做优化和评估。最后通过SFT做进一步指令优化,对比Prompt Engineering的效果。
4.2.1 输出啰嗦&不按固定格式问题及优化方案
接下来的例子中,我们假定通过OCR各类优化手段已经能保证数据源的准确性,相关输入部分直接以标准的文字形态体现。
这里直接先以ERNIE 4.0尝试,一般而言,在ERNIE 4.0上验证过最优的prompt,也适用于EB系列的其他模型
用我们最初做业务可行性评估时候的prompt来进行举例, 可在体验中心进行初步尝试:
根据结果可以看到,大模型虽然完成了这次任务,但输出较为啰嗦,我们只需要看结果是"正确"还是"错误"。原因其实是我们在任务描述中,没有具体的定义要求。
一个好的Prompt,应该包含以下几点:
给大模型设定合适的身份 | 清晰、具体的任务描述 | 围栏限制 | 更完整的上下文信息 | 合理使用符号 | 明确定义输出结构 | Few shot | COT(Chain-of-Thought) |
---|---|---|---|---|---|---|---|
不同的身份视角往往能激发大模型不同的能力,可以根据场景要求进行设定 | 避免歧义,简洁易懂,和人交流一样,Prompt是和大模型的交流语言,人的视角如果判断任务要求清晰、具体,到大模型也是一样 | 不仅告诉模型要完成什么任务,也需要在一些具体的任务里,告知模型not do something,反向限制模型的输出 | 如果有背景信息,也需要放进prompt里帮助大模型理解,能更好的处理任务 | 清晰地表示输入的不同部分,或对特定内容进行标记加强。通过符号调整输入prompt结构,让大模型更容易理解。注意符号表达的一致性 | 如果对输出格式、类型有要求,一定要在prompt里明确定义,不然大模型能正确输出内容,但不能按业务预期格式,也可能导致在业务对接上不可用 | 若任务复杂或描述困难,可以在prompt中给模型提供少量成功执行任务的示例,帮助大模型理解,以及更好的控制输出预期。few shot不止能提升输出质量,也能更好的控制输出格式 | 如果涉及复杂的推理或有多个前后依赖执行步骤,COT往往能起到较好的效果。我们可以prompt中把多步骤分解为更多的中间步骤(think more steps),引导模型一步一步执行。也可以在prompt中简单的加入“请逐步思考”、“一步一步思考”(Let's think step by step)等字样 |
下面基于第一轮和大模型的交互来进行优化:
参考前文档介绍的一个好的Prompt格式,进行改写。这里我们加上了角色定义 - “资深的数学老师”、具体任务要求、规定格式输出 - “JSON格式”
同时,我们在prompt里加入了反向限制“不需要返回题目,不需要解析过程”,以强化模型的标准输出。最后,我们在输出的结果中,给出了一个输出格式的few shot - "[结果]:"正确/错误"" ,使大模型能更好的理解我们的指令格式
可以看到模型返回非常标准,也能稳定回复。下面可以扩大测试规模,评估结果是否有明显提升。具体评估方法可以参考效果评估部分
评估完可以发现,通过prompt调整,基本上解决了输出啰嗦&不按固定格式的问题,如果还想在稳定性上有进一步的提升,可以继续尝试SFT效果,可查看参考内容。
4.2.2 过程错误结果正确的误判问题及优化方案
在误判的case里,我们还观察到有很大一部分是因为过程错误结果正确的误判,拿之前COT优化后的prompt举例:
你是一位资深的数学老师,现在需要批改小学五年级的数学作业。接下来你会收到{题目}、{解析}以及{学生作业},批改需要按以下几点要求严格执行:
1. 只需要判断学生的答案和过程是正确还是错误,不需要返回题目,不需要解析过程
2. 若正确,则只返回"正确",若错误,则只返回"错误",若内容为空,返回"错误";不要返回任何其他结果
3. 返回内容需要以JSON格式
{题目}:若i为虚数单位,a,b∈R,且$\frac{a+2i}{i}$=b+i,则复数a+bi的模等于?
{解析}:把已知等式变形,利用复数代数形式的乘法运算化简,再由复数相等的条件求得a,b的值,则答案可求
{学生作业}:
由$\frac{a+2i}{i}$=b+i,得
a+2i=i(b+i)=1+bi,
因此a=-1,b=2,
则a+bi的模等于sqrt{5}$
#请输出结果
[结果]:"正确/错误"
[过程]:"正确/错误"
上面的例子,预期回答是,过程错误,结果正确
和之前测试过程一样,我们对大模型做一轮追问分析原因
发现本质原因是大模型认为过程错误推导出的结果也不能算是正确的。这种情况其实还是prompt里任务没有描述的非常清晰所导致的,接下来我们还是尝试去调整prompt,在任务要求里多加一条对过程错误的描述 - “答案判断时,不管过程是否正确,只看最终答案是否正确。若过程错误,但答案正确,也判断为"正确"”
你是一位资深的数学老师,现在需要批改小学五年级的数学作业。接下来你会收到{题目}、{解析}以及{学生作业},批改需要按以下几点要求严格执行:
1. 只需要判断学生的答案和过程是正确还是错误,不需要返回题目,不需要解析过程
2. 答案判断时,不管过程是否正确,只看最终答案是否正确。若过程错误,但答案正确,也判断为"正确"
3. 若正确,则只返回"正确",若错误,则只返回"错误",若内容为空,返回"错误";不要返回任何其他结果
4. 返回内容需要以JSON格式
{题目}:若i为虚数单位,a,b∈R,且$\frac{a+2i}{i}$=b+i,则复数a+bi的模等于?
{解析}:把已知等式变形,利用复数代数形式的乘法运算化简,再由复数相等的条件求得a,b的值,则答案可求
{学生作业}:
由$\frac{a+2i}{i}$=b+i,得
a+2i=i(b+i)=1+bi,
因此a=-1,b=2,
则a+bi的模等于sqrt{5}$
#请输出结果
[结果]:"正确/错误"
[过程]:"正确/错误"
调整prompt后简单测试结果
同样我们扩大测试规模,评估结果是否有明显提升。具体评估方法可以参考效果评估部分
批量评估后我们发现,虽然调整prompt有较大提升,但准确率还是不够理想。根据业务需求来判断是否还需要进一步优化,一方面可以持续在prompt上调整,另外可以尝试去做SFT训练来优化,SFT训练部分可查看参考内容。
4.2.3 复杂计算出错问题及优化方案
基于以上调整后的prompt,在测试一些较难的题目时,大模型可能还是会出错,如:
你是一位资深的数学老师,现在需要批改小学五年级的数学作业。接下来你会收到{题目}以及{学生作业},批改需要按以下几点要求严格执行:
1. 只需要判断学生的答案和过程是正确还是错误,不需要返回题目,不需要解析过程
2. 答案判断时,不管过程是否正确,只看最终答案是否正确。若过程错误,但答案正确,也判断为"正确"
3. 若正确,则只返回"正确",若错误,则只返回"错误",若内容为空,返回"错误";不要返回任何其他结果
4. 返回内容需要以JSON格式
{题目}:2000×1999-1999×1998+1998×1997-1997×1996+…+2×1=?
{学生作业}:
=(2000×1999-1999×1998)+(1998×1997-1997×1996)+…+2×1,
=2×1999+2×1997+…+2×1
=2×(1999+1997+…+1)
=(1999+1)×1000
=2000000
故答案为:2000000
#请分行输出结果
[结果]:"正确/错误"
[过程]:"正确/错误"
上面的例子,预期回答是,过程正确,结果正确
可以看到,在复杂过程中的计算,还是有概率出错。这里我们还可以对大模型进行追问,判断为什么模型会出错
从回答里可以看到,是大模型没有理解这个计算过程,计算能力激发不足导致的。这类case,可以考虑强化COT的能力,如果能带上过程实例或解析,可以进一步提升模型的推理能力。COT加入“一步步分析,仔细思考”等内容,进一步改写:
你是一位资深的数学老师,现在需要批改小学五年级的数学作业。接下来你会收到{题目}、{解析}以及{学生作业},批改需要按以下几点要求严格执行:
1. 只需要判断学生的答案和过程是正确还是错误,不需要返回题目,不需要解析过程
2. 过程判断时,参考{解析}部分,对学生作业中的解题步骤,一步步分析,仔细思考,判断步骤是否出错
3. 答案判断时,不管过程是否正确,只看最终答案是否正确。若过程错误,但答案正确,也判断为"正确"
4. 若正确,则只返回"正确",若错误,则只返回"错误",若内容为空,返回"错误";不要返回任何其他结果
5. 返回内容需要以JSON格式
{题目}:2000×1999-1999×1998+1998×1997-1997×1996+…+2×1=?
{解析}:本题考点是四则混合运算中的巧算。通过观察,根据数字特点,每两项结合,结合后运用乘法分配律简算,最终得出结果
{学生作业}:
=(2000×1999-1999×1998)+(1998×1997-1997×1996)+…+2×1,
=2×1999+2×1997+…+2×1
=2×(1999+1997+…+1)
=(1999+1)×1000
=2000000
故答案为:2000000
#请输出结果
[结果]:"正确/错误"
[过程]:"正确/错误"
这里可以看到,大模型正确输出了结果。同样,我们可以进一步追问,看大模型是否真正理解了判断逻辑
同样我们扩大测试规模,评估结果是否有明显提升。具体评估方法可以参考效果评估部分
对比后,我们明显发现,通过COT和解析输入,激发出了大模型的推理能力,很好的完成了复杂计算任务
这里涉及的是大模型的数学、推理能力是否能很好的完成任务。如果在其他更难的数学场景上,调整prompt充分激发base model能力后,还无法胜任任务。建议采用Post-Pre Train的训练方式去尝试提升大模型数理能力,因Post-Pre Train训练较为复杂,这里不展开介绍
4.2.4 整体指令跟随稳定性SFT优化方案
在完成以上优化后,整体准确率和有效性已经有明显提升。但在批量评估过程中,我们还是能发现有指令跟随稳定性低的各类问题,如:结果里还是带有解析内容、过程错误导致结果判错、输出格式不是JSON格式等
这一类大模型的输出,没有严格按照我们prompt指令中的要求,我们统一归类为指令跟随稳定性低的badcase。
根据经验,这里问题通过优化prompt提升的空间有限,想进一步提升,一般需要通过SFT的方式进行:
这里首先需要明确,SFT能优化提升的,更多在指令跟随、任务理解、人设要求、格式输出稳定性上,并不能将模型不知道的知识训练进去
一般SFT训练优化我们分下面几个步骤:
(1)数据准备:准备训练与评测数据,打造高质量数据,要保证数据分布和有效性;
(2)模型训练:确定基础模型、精调方法和训练参数,开始训练;
(3)模型评估:训练完成,人工或自动评估模型效果;
(4)发布服务:模型部署为公有云服务,应用正式集成调用。
训练数据集准备
数据集的质量非常关键,也是SFT能训出效果的关键因素。
建议对数据充分过滤、清洗,数据完成去重、错字处理,不缺失核心数据,保证每条数据的格式、内容都符合预期,是精标数据。其中问答对数据集中的问题,都是用户真实的提问数据;数据集中的回答,都是正确有效的标准答案,建议1000条数据起步,能到10000条数据规模预期效果会较好。
下面以数学判题场景举例,对应的SFT数据集应该如何整理:
数据格式:本实验是采用SFT调优方式,对于SFT调优,需要使用Prompt+Response数据格式
这里可以参考平台预置的数学训练数据集样式来做整理
在此场景中,可以将之前优化后的prompt一并带入,问题为任务prompt+题目+解析+学生作业,回答按预期输出格式整理:
序号 | 问题 | 回答 |
---|---|---|
1 | 你是一位资深的数学老师,现在需要批改小学五年级的数学作业。接下来你会收到{题目}、{解析}以及{学生作业},批改需要按以下几点要求严格执行:1. 只需要判断学生的答案和过程是正确还是错误,不需要返回题目,不需要解析过程2. 过程判断时,参考{解析}部分,对学生作业中的解题步骤,一步步分析,仔细思考,判断步骤是否出错3. 答案判断时,不管过程是否正确,只看最终答案是否正确。若过程错误,但答案正确,也判断为"正确"4. 若正确,则只返回"正确",若错误,则只返回"错误",若内容为空,返回"错误";不要返回任何其他结果5. 返回内容需要以JSON格式{题目}:工厂要加工 $150$ 个零件,张师傅单独完成需要 $15$ 天,李师傅单独完成需要 $30$ 天,则张师傅和李师傅平均每天分别加工多少个零件?{解析}:张师傅平均每天加工的零件数量 $=150÷15=10$ (个),李师傅平均每天加工的零件数量 $=150÷30=5$ (个){学生作业}: $=150÷15=10$ (个) $=150÷30=5$ (个)答:张师傅平均每天加工的零件数量10个,李师傅平均每天加工的零件数量5个#请输出结果[结果]:"正确/错误"[过程]:"正确/错误" | {结果:"正确"过程:"正确"} |
…… | …… | …… |
10000 | 你是一位资深的数学老师,现在需要批改小学五年级的数学作业。接下来你会收到{题目}、{解析}以及{学生作业},批改需要按以下几点要求严格执行:1. 只需要判断学生的答案和过程是正确还是错误,不需要返回题目,不需要解析过程2. 过程判断时,参考{解析}部分,对学生作业中的解题步骤,一步步分析,仔细思考,判断步骤是否出错3. 答案判断时,不管过程是否正确,只看最终答案是否正确。若过程错误,但答案正确,也判断为"正确"4. 若正确,则只返回"正确",若错误,则只返回"错误",若内容为空,返回"错误";不要返回任何其他结果5. 返回内容需要以JSON格式{题目}:鸡兔同笼,鸡和兔的只数一样多,共 $48$ 条腿。鸡和兔各几只?{解析}:将 $1$ 只鸡和 $1$ 只兔分成一组,一组有: $4+2=6$ (条)腿,组数: $48\div 6=8$ (组), $8\times 1=8$ (只),所以鸡和兔各 $8$ 只{学生作业}:1组中腿的数量为 2+4=6(条)一共48÷8=6(组)答: 鸡和兔各6只#请输出结果[结果]:"正确/错误"[过程]:"正确/错误" | {结果:"错误"过程:"错误"} |
以上建议10000条数据参与训练,这里训练数据集的正负样本需要保证合理的分布:
可以参照线上数据现状来做准备。如从线上数据看,学生的答题正确率在70%,过程准确率在60%。那训练数据集也需要按这个比例来做准备,训练出来的模型才能具备更好的判对错能力
在准备好数据集后,可以传到本平台数据集模块。
选择Prompt+Response数据类型,根据需求选择存在在BOS里或平台共享存储中。
创建SFT训练任务
SFT训练又分为全量更新与LoRA两种方式。
一般来说,SFT全量更新效果最优,在本次准备的训练数据集有1W的基础上,接下来我们直接选择SFT全量更新的训练方式
基于在Prompt Engineering环节的效果评估,我们认为数学判题场景对模型能力的要求较高,这里建议直接选择ERNIE-Speed模型来做SFT。
接下来是训练任务的参数选择,可以主要关注两个较为关键的参数:
- 迭代轮次(Epoch): 控制训练过程中的迭代轮数。轮数增加代表会使用训练集对模型训练一次。
- 学习率(Learning Rate): 是在梯度下降的过程中更新权重时的超参数,过高会导致模型难以收敛,过低则会导致模型收敛速度过慢,平台已给出默认推荐值,也可根据经验调整
在10000训练数据集的情况下,我们建议Epoch设置为2(若只有1000条数据时, Epoch建议设置为10),Learning Rate保持默认值即可
其他参数使用默认值进行训练即可,默认的参数是根据多次实际训练经验总结出的较为通用的设置建议。如果有丰富的训练经验,也可以根据需求自行调整参数,在【更多参数】栏里进行设置。训练数据配置,选择之前准备好的训练数据集即可,根据保存位置进行选择。
混合训练是支持将本平台预置的通用语料和准备好的训练数据进行混合训练,在增强模型特定能力时,保证基础能力不丢失。
但在本场景中,模型只需要处理单个判题问题,不需要做其他的对话或通用任务。因此这里不用勾选混合训练。
在测试集配置里,我们可以将训练集中部分数据拆分,作为测试集。也可以单独准备测试集,在后续评估过程中使用。这里要重点注意,需要把训练集和数据集区分开,保证测试集数据不参与训练,否则会导致评估分数过高,无法客观评估训练后的模型效果
接下来提交训练任务即可,提交后的任务可以在SFT任务列表中查看。训练过程需要一定的时间,可以在训练日志或训练过程可视化功能里,查询当前训练具体情况。
SFT训练过程评估
模型训练阶段,我们一般靠观察Loss曲线来判断模型是否具备更好效果。训练即是目标损失函数的优化过程,通常损失函数的值会随着优化算法的迭代不断变小,如下图就是标准的Loss收敛曲线
但也可能会有其他异常情况,如梯度不收敛,或过拟合
一般出现梯度不收敛或过拟合,需要适当调整参数
SFT模型发布
在观察到模型训练指标符合预期后,我们可以将SFT后的模型发布到线上使用
发布后的模型可以在我的模型中查看,接下来可以对训练好的模型做部署和评估。
SFT后的模型,需要部署后才能进行调用。
SFT模型部署
在观察到模型训练指标符合预期后,我们可以将SFT后的模型发布到线上使用。
可根据需求,选择版本部署至私有资源池进行调用。SFT微调后的模型,都需要进行部署后才可以调用
在观察到模型训练指标符合预期后,我们可以将SFT后的模型发布到线上使用。
指定API地址、选择付费方式和部署资源:
经评测,SFT后的模型在指令跟随上,较之前prompt优化结果还有明显的提升。
注意:Prompt Engineering、模型训练,是可以正交使用的,训练好的模型也可以持续优化prompt。
五、大模型效果评估
做完对应的调优后,我们可以对优化效果开始进行评估。这里先只针对大模型维度进行评估,评估过程一般包含以下阶段:
评估数据集准备 >> 建立评估体系 >> 大模型批量推理开始评估
5.1 评估数据集准备
这里和准备训练数据集阶段工作类似,需要准备出一定数量的评估数据集,如:
评估数据(prompt部分根据优化方式调整,以下为评估Prompt Engineering最终优化版效果的输入) | 正确回答 |
---|---|
你是一位资深的数学老师,现在需要批改小学五年级的数学作业。 接下来你会收到{题目}、{解析}以及{学生作业},批改需要按以下几点要求严格执行: 1. 只需要判断学生的答案和过程是正确还是错误,不需要返回题目,不需要解析过程 2. 过程判断时,参考{解析}部分,对学生作业中的解题步骤,一步步分析,仔细思考,判断步骤是否出错 3. 答案判断时,不管过程是否正确,只看最终答案是否正确。若过程错误,但答案正确,也判断为"正确" 4. 若正确,则只返回"正确",若错误,则只返回"错误",若内容为空,返回"错误";不要返回任何其他结果 5. 返回内容需要以JSON格式 {题目}:工厂要加工 $150$ 个零件,张师傅单独完成需要 $15$ 天,李师傅单独完成需要 $30$ 天,则张师傅和李师傅平均每天分别加工多少个零件? {解析}:张师傅平均每天加工的零件数量 $=150÷15=10$ (个),李师傅平均每天加工的零件数量 $=150÷30=5$ (个) {学生作业}: $=150÷15=10$ (个) $=150÷30=5$ (个) 答:张师傅平均每天加工的零件数量10个,李师傅平均每天加工的零件数量5个 #请输出结果 [结果]:"正确/错误" [过程]:"正确/错误" |
{结果:"正确"过程:"正确"} |
这里需要注意的是:
- 保证一定的评估数据集数量,如2000条以上。这样能更客观的统计出大模型的真实效果
- 保证评估数据集不在训练集中,在本场景中主要是选择不同的题目。若用训练集数据去评估,评估结果一般会表现的非常高
- 评估数据集中,输入大模型的内容,需要根据评估的手段去做调整(参考5.2中评估体系准备不同版本)。如2000道题目评估强化COT后prompt的效果,那在输入内容里就需要按强化COT后prompt的格式进行整理
- 评估数据集中,也需要保证合理题型分布比例,如计算题、应用题等
5.2 建立评估体系
开始评估前,需要建立对应的评估体系。在本次数学判题场景中,结果相对清晰明确。我们可以先定义以下两个关键结果指标:
- 整体结果准确率:准确率=判断正确的题目 / 2000*100% (大模型判断最终结果的对错,要求过程和结果都判断正确)
- 输出格式稳定性:稳定性=输出结果指令完全遵从的数量 / 2000*100% (这里不关注结果的正确性,只看是否和预期指令的输出要求一样)
另外,基于以上所有优化手段,我们可以加入以下过程指标展开细粒度的评估,来更好确定模型调优的方式:
正确结果判为对的比例
正确结果判为错的比例
错误结果判为对的比例
错误结果判为错的比例
这里分开评估的目的是,可以根据模型反馈结果,有效的评估Prompt或模型能力在哪些方面还有不足,可以有针对性的进行调优如:
- 输出格式稳定性差,可以多在prompt加强输出格式的要求,通过符号做加强;或者给出对应输出格式的few shot,让模型更好的跟随质量要求;或观察到Prompt修改对格式提升影响低,可以直接考虑到SFT环节去提升效果
- 正确过程判错记录高,可能原因是模型不会解该类型的题目,可以考虑在解析过程中带入解题思路,帮助模型更好理解过程;或在SFT环节,可以适当的提高正确过程的解题训练数据,有针对性的修正模型本身能力的不足
5.3 大模型批量推理评估
接下来,我们对准备好的评估数据集进行跑批评估。当前有两种方式跑批:
- 通过创建批量预测任务的API进行跑批,批量预测请求当前为异步请求,需要一定的时间才能返回全部结果
- 批量调用实时的API,可以选择对应的模型进行批量调用。为了简化开发流程并提高开发效率,可以使用百度提供的SDK。
在大模型的选择上,我们建议建议采用多个模型进行验证,可以观察在不同大模型上的表现差异,帮助确定最终模型选择,如:
ERNIE 4.0
ERNIE 3.5
ERNIE Lite
ERNIE Speed
Qianfan-Chinese-Llama-2-13b-v2
在优化手段的评估上,我们建议把之前所有的优化过程都纳入评估体系中,观察调优效果的变化,包含Prompt Engineering优化手段,以及SFT的优化手段,最终得出结论:
ERNIE 4.0 + 最终优化prompt版本 > ERNIE Speed + 10000条数据样本- 符合线上正负样本比例SFT版本 > ERNIE Speed + 10000条数据样本- 提高正样本比例版本 > ERNIE 3.5 + 最终优化prompt版本
整体总结
以上,我们基本完成了在数学判题场景里的大模型落地。总结一下,通用的落地流程基本可以分为:
业务可行性评估 -> 优化点分析 -> 周边业务系统&大模型效果优化 -> 效果评估 -> 确定大模型选择&优化手段选择 -> 部署上线
而在数学判题场景,我们在周边业务系统中,挑选了对效果影响最大的OCR模块,做了细粒度的优化
在大模型优化点分析环节,上述思路也适用于其他业务场景:通过和大模型的多轮交互和评估测试总结出几类问题 -> 分别分析问题根因 -> 判断大模型优化手段(Prompt Engineering/SFT/Post-PreTrain……)-> 验证优化结果 -> 根据需求多轮迭代
整体业务架构建议:
最后,如果以上优化后的效果,依旧达不到上线要求,可以参考其他优化建议。
补充说明:
模型效果迭代是一个持续的过程,建议设定不同准确率/稳定性下的业务阶段。 大模型做不到100%的正确率,解决不了100%的问题,需要有对应的兜底手段和产品/技术策略。 大模型是业务中的一个环节,需要结合其他组件/模块,完成业务整体效果落地。 |
其他优化建议
产品/业务优化建议:
- 在照片拍摄环节,加入更多优化策略,再判断出具备高质量的成像效果后,再传入后续逻辑处理
- 产品设计上,要有兜底策略,若用户多次反馈出错,人工进行介入兜底
- 建议加上用户反馈按钮,从真实数据里拿到反馈,进一步优化
OCR效果其他优化建议:
- 内容送入大模型前,先判断OCR内容质量是否OK,同样可以基于大模型来做辅助判断,若判断质量低,则要求用户重新拍照
- 可以考虑在OCR解析后,再单独过一次大模型,针对OCR的输出文字进行优化,降低OCR不准确性带来的干扰
- 可以考虑基于OCR后带噪音的数据来进行SFT,根据经验,SFT后的模型是能适应一定的OCR噪音,可以降低OCR识别不准确性的干扰
SFT建议:
- 持续提高SFT训练数据量
- 调整数据分布比例,观察效果变化
- 按需调整训练参数,观察Loss收敛效果
Prompt优化建议:
- 建议多尝试,Prompt还是有持续优化的空间。有时可能一字之差,对结果生成的概率也有很大的影响,要多做尝试才能找到更优秀的Prompt。往往需要多次尝试,才能获得到一个较为稳定的Prompt
- 多把大模型当人来沟通,找到最合适的沟通方式。在每一次调整Prompt后,分析大模型返回结果差异,判断不符合预期的原因,进一步调整Prompt
- 扩大测试样本/次数,一两次的结果可能不能反应真实情况,建议扩大测试样本基数评估准确性