gradio生成阅读理解界面

这里通过1个例子来看下微调的BERT与DeepSeek-R1:1.5b两种模型在阅读理解上的差异。
相关代码如下:

def predict(doc, query):
    item = tokenizer.encode_plus(doc, query, max_length=512, padding="max_length", truncation=True, return_tensors="pt")
    with torch.no_grad():
        input_ids = item["input_ids"].to(device)
        attention_mask = item["attention_mask"].to(device)
        output = model(input_ids[:,:512],attention_mask[:,:512])
        start_pred = torch.argmax(output.start_logits,dim=1)
        end_pred = torch.argmax(output.end_logits,dim=1)
    try:
        start_pred = item.token_to_chars(start_pred)
        end_pred = item.token_to_chars(end_pred)
    except:
        return "无法找到答案"
    if start_pred is None or end_pred is None:
        return "无法找到相应答案"
    if start_pred.start > end_pred.end:
        return "无法从中找到答案"
    else:
        return doc[start_pred.start:end_pred.end]

def convert(paragraph,query,option):
    if option == "BERT":
        return predict(paragraph, query)
    full_prompt = "请根据以下内容:{}回答问题:{}".format(paragraph,query)
    response = client.generate(
            model='deepseek-r1:1.5b',
            prompt=full_prompt,
            options={
                "temperature": 0.3,
                "max_tokens": 512,
                "stop": ["</s>", "<|endoftext|>"]
        }
    )
    return response['response']

demo = gradio.Interface(fn=convert,inputs=[
    gradio.Textbox(label="上下文"),
    gradio.Textbox(label="问题"),
    gradio.Radio(["BERT","DeepSeek-R1"])
],outputs=gradio.Textbox(label="答案"))
demo.launch()

关于BERT可以下载JeremyFeng/chinese-question-answering中的模型。而DeepSeek-R1则采用本地部署的方式。
要求从给定文本中回答如下的问题,上下文为:

东辽(1213-1269年),金宣宗时期契丹人以今中国东北部为中心建立的君主制政权。1212年,辽朝宗室耶律留哥、耶律耶的在隆安(今吉林省农安县)、韩州(吉林省梨树县)一带起军叛乱,数月聚合十数万人。受到蒙古帝国的庇护,与金朝分庭抗礼。金派完颜胡沙、蒲鲜万奴讨伐耶律留哥,耶律留哥向蒙古救援,在蒙古军支援下,耶律留哥在迪吉脑儿(今辽宁省昌图县)撃破金兵。1213年三月,耶律留哥称王,定国号辽,改元元统。后称其为东辽政权。耶律留哥以姚里氏为皇后、弟耶律厮不为郡王,坡沙、僧家奴、耶律的、李家奴等为丞相、元帅、尚书,建立国家体制。1214年,金再度派蒲鲜万奴率军侵入东辽,东辽在归仁县(今辽宁省昌图县)北河撃破蒲鲜万奴,耶律留哥占据辽东州郡,定都咸平(今辽宁省开原市),称中京。东辽国内制度因缺乏文献资料,大部分不明晰。1213年,建国时,有皇后、郡王、丞相、元帅、尚书官职名出现,说明它是模仿金朝的国家制度,不过这仅仅是推测。1215年,耶律留哥攻占了金东京(今辽阳市),不久众人劝留哥称帝,留哥拒绝。耶律留哥投靠了成吉思汗,成吉思汗仍封他为辽王。成吉思汗不满耶律留哥的副手可特哥娶了蒲鲜万奴之妻,打算向可特哥问罪,可特哥惧,与耶律厮不等人宣布留哥已死,举兵背叛。1216年,耶律厮不在澄州(今辽宁省海城市)称帝,国号辽,史称后辽。1218年,耶律留哥在蒙古帝国和高丽王朝的支援下攻撃后辽。1219年春,后辽王耶律喊舍兵败自杀,后辽灭亡。耶律留哥恢复旧地。1220年,耶律留哥死后,其妻姚里氏统治辽东。东辽政权一直到1233年,由于蒲鲜万奴的东夏灭亡,才被蒙古取消。不过,耶律留哥的后代依然是蒙古帝国经略东北的世袭地方官。

问题分别为:

1. 耶律耶在哪起军叛乱?
2. 耶律留哥在哪里击破金兵?

下面是第1个问题的对比图,首先是BERT模型的:
image

接着是DeepSeek的:
image

之后是第2个问题的对比图,首先是BERT模型的:
image

而DeepSeek-R1的回答完全就是搞错关系:
image

其中蒲鲜万奴在历史上是金国大将。
为什么会出现这样的问题,实际上还是由于DS、GPT这类模型架构是基于自回归的模型,是通过前面文字预测后面下一个字。而BERT是基于自编码的模型,可以从前后上下文进行推理,因此对于问答类的任务准确率会更高一些。
当然如果用满血版的DS,还是挺准确的。而BERT一般可用于小学三年级以下的阅读理解,如果想更好的效果,还是得上T5这种耗资源的模型。

posted @ 2025-03-25 18:16  月薪几千的牛马  阅读(27)  评论(0)    收藏  举报