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模型的:

接着是DeepSeek的:

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

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

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