大模型实践之浅尝prompt咒语设计:one-shot微调chatglm-6b实践信息抽取

今天是2023年11月13日,北京,天气晴。我们今天来谈谈实践。

近期以chatgpt等文生成LLMS爆火,国内也逐渐开源了中文版的chatgpt。

本文以清华大学开源的6b的chatglm为例,实践one-shot微调,设计prompt咒语在信息抽取领域的实验效果。

供大家一起参考。


​       

一、场景描述

给定一个JD的职位要求,需要从描述中抽取出相应的实体

例如:

'职位要求:1、硕士以上学历。2、计算机相关专业。33年以上工作经验。4、熟练掌握python或者c++语言。5、有自然语言处理获奖经历优先'

相应的schema的实体为:

'学历要求': ['硕士'],
'专业要求': ['计算机'],
'工作年限要求': ['3年以上'],
'编程语言': ['python', 'c++'],
'加分项': ['自然语言处理获奖经历'],

二、prompt咒语设计

prompt设计主要点:

  • 告知llms什么是信息抽取任务,以职位要求信息抽取为例:需要告知模型你需要抽取的实体类型有哪些
  • 告知模型输出格式要求,例如:json格式

三、实现

#!/usr/bin/env python
# _*_coding:utf-8_*_

import re
import json
from transformers import AutoTokenizer, AutoModel

# 根据需求补充
schema = {
    'JD岗位要求': ['学历要求''专业要求''工作年限要求''编程语言''加分项']
}

IE_PATTERN = "{}\n\n提取上述句子中{}类型的实体,输出JSON格式,上述句子中不存在的信息用['该JD未要求']来表示,多个值之间用','分隔。"

ie_examples = {
    'JD岗位要求':
        {
            'sentence''职位要求:1、硕士以上学历。2、计算机相关专业。3、3年以上工作经验。4、熟练掌握python或者c++语言。5、有自然语言处理获奖经历优先',
            'answers': {
                '学历要求': ['硕士'],
                '专业要求': ['计算机'],
                '工作年限要求': ['3年以上'],
                '编程语言': ['python''c++'],
                '加分项': ['自然语言处理获奖经历'],
            }
        }
}


def init_prompts():
    ie_prefix = [
        (
            "需要你协助完成信息抽取任务,当我给你一个JD职位要求时,帮我抽取出句子中三元组,并按照JSON的格式输出,上述句子中没有的信息用['该JD未要求']来表示,多个值之间用','分隔。",
            '请输入JD职位描述。'
        )
    ]
    properties_str = ', '.join(schema['JD岗位要求'])
    schema_str_list = f'“JD岗位要求”({properties_str})'
    sentence = ie_examples['JD岗位要求']['sentence']
    sentence_with_prompt = IE_PATTERN.format(sentence, schema_str_list)
    ie_prefix.append((
        f'{sentence_with_prompt}',
        f"{json.dumps(ie_examples['JD岗位要求']['answers'], ensure_ascii=False)}"
    ))

    return {'ie_prefix': ie_prefix}


def format_output(response: str):
    if '```json' in response:
        res = re.findall(r'```json(.*?)```', response)
        if len(res) and res[0]:
            response = res[0]
        response.replace('、'',')
    try:
        return json.loads(response)
    except:
        return response


def inference(sentences: list, custom_settings: dict):
    for sentence in sentences:
        properties_str = ', '.join(schema['JD岗位要求'])
        schema_str_list = f'“JD岗位要求”({properties_str})'
        sentence_with_ie_prompt = IE_PATTERN.format(sentence, schema_str_list)
        result, _ = model.chat(tokenizer, sentence_with_ie_prompt, history=custom_settings['ie_prefix'])
        result = format_output(result)
        print(sentence)
        print(result)


if __name__ == '__main__':
    tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
    model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()

    sentences = [
        '职位要求:1、本科以上学历。2、电子信息或软件工程专业。3、1-3年工作经验。4、熟练掌握java或者c++语言。5、有相关项目经验优先',
    ]

    custom_settings = init_prompts()
    inference(sentences,
        custom_settings
    )

输出结果:

{
    '学历要求': ['本科以上学历'],
    '专业要求': ['电子信息或软件工程专业'],
    '工作年限要求': ['1-3年'],
    '编程语言': ['熟练掌握java或者c++语言'],
    '加分项': ['有相关项目经验优先']
}

总结

本文通过one-shot微调chatglm-6b在信息抽取领域上的实验,输出效果还可以,当然如果有资源微调更大参数量的LLMS。

关于我们


老刘,刘焕勇,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。


老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。


对于想加入更优质的知识图谱、事件图谱、大模型AIGC实践、相关分享的,可关注公众号,在后台菜单栏中点击会员社区->会员入群加入。

相关推荐

  • 首发!文心一言「插件开发」中文教程,来了!
  • Node.js有多强?
  • Redis分布式锁存在哪些问题,该如何解决?
  • 2023年了,Java后端还能再战么?
  • 华为悬赏200万解答技术难题;“ChatGPT 之父”暗讽马斯克:你的Grok过时了;微软视窗操作系统诞生四十周年|极客头条
  • 一个前端非侵入式骨架屏自动生成方案
  • ​Pytest 高效测试 Python 代码
  • 润乾报表杀疯了,几十万的软件,卖1万!
  • 纯CSS实现魔法渐变边框卡片
  • ​前端代码一定要优雅,高端前端程序员都应该具备的 !
  • Git操作你还在用merge么?了解了解rebase吧!
  • 2300 万,35 岁腾讯员工准备提前退休了
  • 程序员被奖励 38g 黄金空格键,价值近 2 万元,网友:“每次敲击一下都是钱声!”
  • 【值得收藏】优秀前端必备:基本素养、代码规范、开发技巧!!!
  • Vue的@input怎么做到不监听输入法拼音的?90%人不知道~
  • 阿里云史诗级崩溃。。。
  • GitHub 官方开源的字体集「GitHub 热点速览」
  • 上海人开始假装上班了
  • 面试突击:为什么要使用读写锁?它有哪些优势?
  • ChatGPT版iPhone终面世!Sam Altman联手苹果前员工祭出苹果杀手