简介
通过简单的主观测试发现,即使是相对简单的NER任务,原始的llama3-8b量化模型也不能满足信息抽取的需求。
我们从DeepKE项目中找到了面向信息抽取的微调好的LoRA,加载该模型测试效果。检查已经开源的微调模型能否满足需求并决定是否需要进行下一步的微调工作。
过程
- 加载模型
与 测试llama3-8b的信息抽取能力1 相同 - 构建提示词
与 测试llama3-8b的信息抽取能力1 相同 - 加载LORA
from peft import PeftModel, PeftConfig
peft_model_path = "J:\llm_model\llama3-8b-iepile-lora"
peft_config = PeftConfig.from_pretrained(peft_model_path)
model_with_lora = PeftModel.from_pretrained(model, peft_model_path)
lora_output = model_with_lora.generate(input_ids = input_ids,
generation_config = GenerationConfig(
max_length=512,
max_new_token=256,
return_dict_in_generate = True
),
pad_token_id = tokenizer.eos_token_id,
eos_token_id = tokenizer.eos_token_id,
repetition_penalty=1.0,
)
lora_output = lora_output.sequences[0][input_length:]
tokenizer.decode(lora_output,skip_special_tokens=True)
- 模型输出
>>> '[{"person": ["Fischler"], "location": ["France", "Britain"]}'
使用langchain提供的工具调整一下输出格式
from langchain_core.output_parsers import JsonOutputParser
parser = JsonOutputParser()
parser.invoke('[{"person": ["Fischler"], "location": ["France", "Britain"]}')
>>> [{'person': ['Fischler'], 'location': ['France', 'Britain']}]
可以看到,加载了LoRA后, 模型基本算是正确完成了此条数据的NER任务
- 领域数据
person、location是常见的NER实体类型,针对抽取微调后的LoRA能很好的对其进行抽取并不意外。 为了支持实际应用,我们还需要测试下此LoRA针对领域特定对象的抽取效果如何。
# 构建输入
data = [{"text": "基于Spring Boot框架、Layui前端框架以及内置H2数据库,iYqueCode为企业提供了一套高效、便捷的开箱即用的活码应用解决方案。"},
{"text":"If you're interested in learning how to use Mesop, please read our main docs."},
{"text":"LiveKit is an open source software that provides scalable, multi-user conferencing based on WebRTC."}]
schema = ['software']
input_texts = [prompt_template.format(schema=schema, text=item['text']) for item in data]
tokenizer.pad_token = tokenizer.eos_token
input_ids = tokenizer(input_texts, padding=True,return_tensors='pt').to(device)
input_ids = input_ids['input_ids']
# 获取输出
lora_output = model_with_lora.generate(input_ids = input_ids,
generation_config= generation_config,
pad_token_id = tokenizer.eos_token_id,
eos_token_id = tokenizer.eos_token_id,
repetition_penalty=1.0,
)
output = tokenizer.batch_decode(lora_output.sequences, skip_special_tokens=True)
length = [len(x) for x in input_texts]
results = [output[i][length[i]:] for i in range(len(output))]
results
>>> ['["iYqueCode"]\'', '://www.google.com/url?sa=t&source=web&cd=1&ved=0ahUKEwi0uJq0...', '://www.livekit.org/']
结论:
现在已经有部分针对信息抽取的开源微调模型可以使用;
针对常见实体类型,直接使用这些开源的微调模型即可完成任务;
仍不能完成特定领域数据的抽取目标,在领域数据上进行微调仍是有必要的。