创新项目实训-文本分类(给题目打上知识点标签)

数据集选择

目前选择处理的数据集是Ape210K,这是一个开源的中文小学数学题数据集。数据量为210K.后续根据模型微调需要,可能还会使用其他的数据集做补充。
任务概述

由于在模型的微调训练中需要用到知识点标签,在获得基础的数据集后,对数据集进行处理,打上知识点标签。

设计、编写了一个dataProcess程序来完成这个任务。这个程序主要由以下几个部分组成。

1.调用接口。

2.提示词与请求函数。

3.处理response的代码

4.异常捕捉与处理代码

将数据集分割为几部分,每人负责标记一部分数据。


任务难点与解决方案


1.调用接口

调用付费接口的成本相对高昂(标记一遍数据集gpt3.5预计成本150+RMB,gpt4昂贵到1600+RMB)

寻找了多个提供gpt免费接口的项目,尝试部署并对他们做出对比。

最终使用free_chatgpt_api这个项目提供的免费接口。此接口因为免费,所以限制每分钟调用次数不得超过20次,并且额度有限。这限制了高并发请求(但每个人借了几个舍友的key,慢慢跑到底跑完了)


2.模型标注知识点的准确度、幻觉问题,提示词的迭代设计

在实际测试gpt-3.5的知识点标注效果中,发现对于提前准备好的标签,gpt-3.5的分类效果很差,并且时常出现幻觉问题,虚构出不存在的、根本不符合题目的标签,并经常忽略指定的输出格式,输出无关内容。如果直接处理,数据集标签的质量将非常堪忧。

为了解决这个问题,重新设计了打标签的思路,不向模型提供现成标签,而令模型自己做一遍题后,从自己的做题过程中总结出题目涉及的知识点。这样一来,模型输出的知识点具体而切合题目,而当需要粗粒度的标签时,可以直接使用正则匹配甚至模糊匹配。达到了一举两得,同时拥有了粗粒度标签和细粒度标签。

为了提高模型标注的准确度,使模型的输出格式化并减小模型幻觉问题的影响,对提示词进行设计。思路:按步骤设计提示词,采取多轮,让模型做三遍题并总结三次知识点,将三次总结出的知识点以json格式输出。每次总结出知识点后,令模型进行一遍自问,(将总结出的知识点和自己的做题过程再次进行比较,只留下做题过程中确实出现的知识点),来减小幻觉问题。

在后续的代码中,将对输出的知识点进行整合,只保留模型三次都总结出来的知识点,来提高模型标注的准确度(这其实也降低了幻觉问题的印象)

提示词经过了多轮的迭代设计,以使得模型的输出效果最好。最终采取的提示词和请求函数如下:

def get_completion(text, model="gpt-3.5-turbo-0125"):
    prompt = f"""
    我将给你一个数学题,这个数学题被我用两个&符号分隔开。请你分析这个数学题涉及的知识点。
    你应当依次执行以下步骤:
    1.解答这道数学题,但不要输出解答过程。
    2.阅读上一步的解答过程,总结出所使用的数学知识点,但不要输出。这些知识点组成集合A。
    3.判断集合A中的每个知识点是否在第1步的解答过程中出现,如果没有出现,将其从集合A丢弃。
    4.解答这道数学题,但不要输出解答过程。
    5.阅读上一步的解答过程,总结出所使用的数学知识点,但不要输出。这些知识点组成集合B。
    6.判断集合B中的每个知识点是否在第4步的解答过程中出现,如果没有出现,将其从集合B丢弃。
    7.解答这道数学题,但不要输出解答过程。
    8.阅读上一步的解答过程,总结出所使用的数学知识点,但不要输出。这些知识点组成集合C。
    9.判断集合A中的每个知识点是否在第7步的解答过程中出现,如果没有出现,将其从集合C丢弃。
    输出格式为json格式,输出内容为A、B和C中的知识点,语言应当为中文。不要输出除了知识点以外的内容。
    &{text}&
    """
    messages = [{"role": "user", "content": prompt}]
    completion = openai.chat.completions.create(
        model=model,
        messages=messages,
        temperature=0,
        max_tokens=150
     )
    return completion.choices[0].message.content

3.异常情况的分析、捕捉和处理

在实际的数据标注中,因为免费接口的不稳定性等各种原因,在运行过程中程序偶尔会出现异常。

出现的异常主要有两种:

1.BadRequestError异常,由于免费接口的不稳定以及不规范的提示词导致。

2.题目标签为空。造成这个问题的原因是没有一个知识点同时在模型的三次总结中出现。若这种情况出现,那么降低要求,只需要两次总结出现,那么就承认这个知识点。如果降低要求后标签仍然为空,那么raise Exception请求模型重新标注。

3.模型没有按json格式输出,若出现这个问题,那么在response字符串转json过程中会引发异常被程序捕捉。

在全局变量中设置异常计数器,使用try-except as代码结构捕捉异常。若有异常产生,那么重新请求模型标注当前题目。若三次请求全部失败,那么放弃标注此题,转到下一题。


4.令牌额度消耗优化

免费的api接口对key的令牌额度做出了限制。根据测算估计,每个key的免费额度大约在7-9美刀。初版程序没有注意到额度损耗的问题,一个key只标注了约5000道左右的题目。通过具体的限制gpt模型(使用gpt-3.5-turbo-0125,而不是笼统的gpt-3.5-turbo),设置max_token来截断不符合要求的过长输出,以及优化提示词,令牌的使用效率得到了极大的提高。在第二版程序中,一个key大约可以处理15000道题目,是原来效率的3倍。

  • 19
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值