Zero-shot、One-shot以及Few-shot讓人傻傻分不清,讀了很多文章,也沒搞清楚他們的差別,究竟什么叫zero-shot,其在應(yīng)用過程中的no gradient update是什么含義,zero-shot是否為一個(gè)偽命題,成為了一些有趣的問題。???????
目前,直接使用以chatgpt為代表的大模型進(jìn)行nlp任務(wù)處理成為了一個(gè)潮流,直接拼接prompt進(jìn)行問答,就可拿到相應(yīng)答案,例如最近的文章《ChatGPT+NLP下的Prompt模板工具:PromptSource、ChatIE代表性開源項(xiàng)目介紹》中所介紹的chatie,直接來解決zeroshot的任務(wù)。
但是,我們發(fā)現(xiàn),如果引入incontext-learning這一思想,作為一個(gè)fewshot任務(wù)來提升ChatIE這類模型的性能,可能是一個(gè)很好的思路,在此基礎(chǔ)上個(gè)配上一個(gè)開源項(xiàng)目進(jìn)行解釋能夠增強(qiáng)了解。?????????????????????????????????????????
因此,帶著這個(gè)問題,本文先談?wù)刏ero-shot、One-shot以及Few-shot、從ChatIE:面向REEENER三種任務(wù)的偽zero-shot prompt說起、從偽zeroshot看In-Context Learning類比學(xué)習(xí)、將In-Context Learning引入偽zero-shot完成信息抽取任務(wù)四個(gè)方面進(jìn)行介紹,供大家一起參考。
一、先談?wù)刏ero-shot、One-shot以及Few-shot
1、Zero-shot
Zero-shot就是希望模型能夠?qū)ζ鋸臎]見過的類別進(jìn)行分類,是指對(duì)于要分類的類別對(duì)象,一次也不學(xué)習(xí)。
也就是說,只有推理階段,沒有訓(xùn)練階段。這個(gè)常見于chatgpt中qa形式,直接通過問題prompt,基于已訓(xùn)練好的大模型,進(jìn)行直接預(yù)測(cè)。
2、Few-shot與One-shot
如果訓(xùn)練集中,不同類別的樣本只有少量,則成為Few-shot,如果參與訓(xùn)練學(xué)習(xí),也只能使用較少的樣本數(shù)。?????????
如果訓(xùn)練集中,不同類別的樣本只有一個(gè),則成為One-shot, 屬于Few-shot的一種特殊情況。
但其中的“no gradient update讓人費(fèi)解”,后面想了想,有2種理解:
1)單次微調(diào),參數(shù)更新,但微調(diào)后模型不保存。???????????
LLM由于參數(shù)量巨大,導(dǎo)致更新起來困難(費(fèi)錢--費(fèi)卡)。因此很少對(duì)訓(xùn)練好的LLM做微調(diào)。但是為了在特殊任務(wù)上有較好的表現(xiàn)(微調(diào)效果肯定要好于不微調(diào)的),但是又不固定微調(diào)后的模型,所以提出了one-shot、few-shot的方式,通過加入偏置,影響模型的最終輸出。
而one-shot、few-shot可以變相的理解成用一個(gè)/多個(gè)example進(jìn)行模型微調(diào),但是微調(diào)后的模型不保存。每次提供inference都要微調(diào)一遍(輸入一個(gè)example或者多個(gè)example來模擬微調(diào)過程),No gradient updates are performed.就是說提供inference的模型參數(shù)保持不變,但這其實(shí)是tuning的范疇。
2)直接不微調(diào),參數(shù)直接不更新??????
如果不更新參數(shù),那么這種學(xué)習(xí)就是瞬間的,不構(gòu)成learning。預(yù)訓(xùn)練模型自身訓(xùn)練完后本身有一套參數(shù),finetune就是在預(yù)訓(xùn)練基礎(chǔ)上繼續(xù)訓(xùn)練,肯定會(huì)有梯度更新,因?yàn)閒inetune后參數(shù)會(huì)變,參數(shù)變了梯度必然會(huì)更新。直接推理出答案,后臺(tái)梯度也不更新。
不過,需要注意的是,如果以這個(gè)模型到底有沒有見過標(biāo)注樣本,來劃分zero-shot與其他的差別,就是主要見過,無論是在推理階段(作為prompt)用【不更新梯度】,還是加入finetune階段參與訓(xùn)練【更新參數(shù)】,那就肯定不是zero-shot,否則就是數(shù)據(jù)泄漏。
這也就是說,如果在prompt中是否加入一個(gè)或者多個(gè)正確的例子,例如分類任務(wù)中,加入一些正確的任務(wù)描述例子,都不能算作是zero-shot,但是問題是你怎么能保證模型訓(xùn)練沒有用過這些數(shù)據(jù),他們當(dāng)時(shí)訓(xùn)練就可能搜集到了,模型說不定都見過,也就是說至少不存在嚴(yán)格意義的zero shot。
二、從ChatIE:面向REEENER三種任務(wù)的偽zero-shot prompt說起
最近有篇文章《Zero-Shot Information Extraction via Chatting with ChatGPT》很有趣,該工作將零樣本IE任務(wù)轉(zhuǎn)變?yōu)橐粋€(gè)兩階段框架的多輪問答問題(Chat IE),并在三個(gè)IE任務(wù)中廣泛評(píng)估了該框架:實(shí)體關(guān)系三元組抽取、命名實(shí)體識(shí)別和事件抽取。在兩個(gè)語言的6個(gè)數(shù)據(jù)集上的實(shí)驗(yàn)結(jié)果表明,Chat IE取得了非常好的效果,甚至在幾個(gè)數(shù)據(jù)集上(例如NYT11-HRL)上超過了全監(jiān)督模型的表現(xiàn)。
其實(shí)現(xiàn)基本原理為,通過制定任務(wù)實(shí)體關(guān)系三元組抽取、命名實(shí)體識(shí)別和事件抽取,并為每個(gè)任務(wù)設(shè)計(jì)了2個(gè)步驟的prompt-pattern,第一步用于識(shí)別類型,第二步用于識(shí)別指定類型的值。將抽取的任務(wù)定義(抽取要素)進(jìn)行prompt填充,然后調(diào)用chatgpt接口,在取得結(jié)果后進(jìn)行規(guī)則解析,結(jié)構(gòu)化相應(yīng)答案。
例如,關(guān)系抽取的具體執(zhí)行步驟包括:針對(duì)每類prompt,分別調(diào)用prompt-pattern,得到相應(yīng)結(jié)果,以事件抽取prompt為例,
1)任務(wù)要素定義:
df_eet={ 'chinese':{'災(zāi)害/意外-墜機(jī)':['時(shí)間','地點(diǎn)','死亡人數(shù)','受傷人數(shù)'],'司法行為-舉報(bào)':['時(shí)間','舉報(bào)發(fā)起方','舉報(bào)對(duì)象'],'財(cái)經(jīng)/交易-漲價(jià)':['時(shí)間','漲價(jià)幅度','漲價(jià)物','漲價(jià)方'],'組織關(guān)系-解雇':['時(shí)間','解雇方','被解雇人員'],'組織關(guān)系-停職':['時(shí)間','所屬組織','停職人員'],'財(cái)經(jīng)/交易-加息':['時(shí)間','加息幅度','加息機(jī)構(gòu)'],'交往-探班':['時(shí)間','探班主體','探班對(duì)象'],'人生-懷孕':['時(shí)間','懷孕者'],'組織關(guān)系-辭/離職':['時(shí)間','離職者','原所屬組織'],'組織關(guān)系-裁員':['時(shí)間','裁員方','裁員人數(shù)'],'災(zāi)害/意外-車禍':['時(shí)間','地點(diǎn)','死亡人數(shù)','受傷人數(shù)'], '人生-離婚':['時(shí)間','離婚雙方'],'司法行為-起訴':['時(shí)間','被告','原告'],'競(jìng)賽行為-禁賽':['時(shí)間','禁賽時(shí)長(zhǎng)','被禁賽人員','禁賽機(jī)構(gòu)'],'人生-婚禮':['時(shí)間','地點(diǎn)','參禮人員','結(jié)婚雙方'],'財(cái)經(jīng)/交易-漲停':['時(shí)間','漲停股票'],'財(cái)經(jīng)/交易-上市':['時(shí)間','地點(diǎn)','上市企業(yè)','融資金額'],'組織關(guān)系-解散':['時(shí)間','解散方'],'財(cái)經(jīng)/交易-跌停':['時(shí)間','跌停股票'],'財(cái)經(jīng)/交易-降價(jià)':['時(shí)間','降價(jià)方','降價(jià)物','降價(jià)幅度'],'組織行為-罷工':['時(shí)間','所屬組織','罷工人數(shù)','罷工人員'],'司法行為-開庭':['時(shí)間','開庭法院','開庭案件'], '競(jìng)賽行為-退役':['時(shí)間','退役者'],'人生-求婚':['時(shí)間','求婚者','求婚對(duì)象'],'人生-慶生':['時(shí)間','生日方','生日方年齡','慶祝方'],'交往-會(huì)見':['時(shí)間','地點(diǎn)','會(huì)見主體','會(huì)見對(duì)象'],'競(jìng)賽行為-退賽':['時(shí)間','退賽賽事','退賽方'],'交往-道歉':['時(shí)間','道歉對(duì)象','道歉者'],'司法行為-入獄':['時(shí)間','入獄者','刑期'],'組織關(guān)系-加盟':['時(shí)間','加盟者','所加盟組織'],'人生-分手':['時(shí)間','分手雙方'],'災(zāi)害/意外-襲擊':['時(shí)間','地點(diǎn)','襲擊對(duì)象','死亡人數(shù)','襲擊者','受傷人數(shù)'],'災(zāi)害/意外-坍/垮塌':['時(shí)間','坍塌主體','死亡人數(shù)','受傷人數(shù)'], '組織關(guān)系-解約':['時(shí)間','被解約方','解約方'],'產(chǎn)品行為-下架':['時(shí)間','下架產(chǎn)品','被下架方','下架方'],'災(zāi)害/意外-起火':['時(shí)間','地點(diǎn)','死亡人數(shù)','受傷人數(shù)'],'災(zāi)害/意外-爆炸':['時(shí)間','地點(diǎn)','死亡人數(shù)','受傷人數(shù)'],'產(chǎn)品行為-上映':['時(shí)間','上映方','上映影視'],'人生-訂婚':['時(shí)間','訂婚主體'],'組織關(guān)系-退出':['時(shí)間','退出方','原所屬組織'],'交往-點(diǎn)贊':['時(shí)間','點(diǎn)贊方','點(diǎn)贊對(duì)象'],'產(chǎn)品行為-發(fā)布':['時(shí)間','發(fā)布產(chǎn)品','發(fā)布方'],'人生-結(jié)婚':['時(shí)間','結(jié)婚雙方'],'組織行為-閉幕':['時(shí)間','地點(diǎn)','活動(dòng)名稱'], '人生-死亡':['時(shí)間','地點(diǎn)','死者年齡','死者'],'競(jìng)賽行為-奪冠':['時(shí)間','冠軍','奪冠賽事'],'人生-失聯(lián)':['時(shí)間','地點(diǎn)','失聯(lián)者'],'財(cái)經(jīng)/交易-出售/收購(gòu)':['時(shí)間','出售方','交易物','出售價(jià)格','收購(gòu)方'],'競(jìng)賽行為-晉級(jí)':['時(shí)間','晉級(jí)方','晉級(jí)賽事'],'競(jìng)賽行為-勝負(fù)':['時(shí)間','敗者','勝者','賽事名稱'],'財(cái)經(jīng)/交易-降息':['時(shí)間','降息幅度','降息機(jī)構(gòu)'],'組織行為-開幕':['時(shí)間','地點(diǎn)','活動(dòng)名稱'],'司法行為-拘捕':['時(shí)間','拘捕者','被拘捕者'],'交往-感謝':['時(shí)間','致謝人','被感謝人'],'司法行為-約談':['時(shí)間','約談對(duì)象','約談發(fā)起方'], '災(zāi)害/意外-地震':['時(shí)間','死亡人數(shù)','震級(jí)','震源深度','震中','受傷人數(shù)'],'人生-產(chǎn)子/女':['時(shí)間','產(chǎn)子者','出生者'],'財(cái)經(jīng)/交易-融資':['時(shí)間','跟投方','領(lǐng)投方','融資輪次','融資金額','融資方'],'司法行為-罰款':['時(shí)間','罰款對(duì)象','執(zhí)法機(jī)構(gòu)','罰款金額'],'人生-出軌':['時(shí)間','出軌方','出軌對(duì)象'],'災(zāi)害/意外-洪災(zāi)':['時(shí)間','地點(diǎn)','死亡人數(shù)','受傷人數(shù)'],'組織行為-游行':['時(shí)間','地點(diǎn)','游行組織','游行人數(shù)'],'司法行為-立案':['時(shí)間','立案機(jī)構(gòu)','立案對(duì)象'],'產(chǎn)品行為-獲獎(jiǎng)':['時(shí)間','獲獎(jiǎng)人','獎(jiǎng)項(xiàng)','頒獎(jiǎng)機(jī)構(gòu)'],'產(chǎn)品行為-召回':['時(shí)間','召回內(nèi)容','召回方']}, 'english':{'Justice:Appeal':['Defendant','Adjudicator','Crime','Time','Place'],'Justice:Extradite':['Agent','Person','Destination','Origin','Crime','Time'],'Justice:Acquit':['Defendant','Adjudicator','Crime','Time','Place'],'Life:Be-Born':['Person','Time','Place'],'Life:Divorce':['Person','Time','Place'],'Personnel:Nominate':['Person','Agent','Position','Time','Place'],'Life:Marry':['Person','Time','Place'],'Personnel:End-Position':['Person','Entity','Position','Time','Place'], 'Justice:Pardon':['Defendant','Prosecutor','Adjudicator','Crime','Time','Place'],'Business:Merge-Org':['Org','Time','Place'],'Conflict:Attack':['Attacker','Target','Instrument','Time','Place'],'Justice:Charge-Indict':['Defendant','Prosecutor','Adjudicator','Crime','Time','Place'],'Personnel:Start-Position':['Person','Entity','Position','Time','Place'],'Business:Start-Org':['Agent','Org','Time','Place'],'Business:End-Org':['Org','Time','Place'], 'Life:Injure':['Agent','Victim','Instrument','Time','Place'],'Justice:Fine':['Entity','Adjudicator','Money','Crime','Time','Place'],'Justice:Sentence':['Defendant','Adjudicator','Crime','Sentence','Time','Place'],'Transaction:Transfer-Money':['Giver','Recipient','Beneficiary','Money','Time','Place'],'Justice:Execute':['Person','Agent','Crime','Time','Place'],'Justice:Sue':['Plaintiff','Defendant','Adjudicator','Crime','Time','Place'], 'Justice:Arrest-Jail':['Person','Agent','Crime','Time','Place'],'Justice:Trial-Hearing':['Defendant','Prosecutor','Adjudicator','Crime','Time','Place'],'Movement:Transport':['Agent','Artifact','Vehicle','Price','Origin'],'Contact:Meet':['Entity','Time','Place'],'Personnel:Elect':['Person','Entity','Position','Time','Place'],'Business:Declare-Bankruptcy':['Org','Time','Place'],'Transaction:Transfer-Ownership':['Buyer','Seller','Beneficiary','Artifact','Price','Time','Place'], 'Justice:Release-Parole':['Person','Entity','Crime','Time','Place'],'Conflict:Demonstrate':['Entity','Time','Place'],'Contact:Phone-Write':['Entity','Time'],'Justice:Convict':['Defendant','Adjudicator','Crime','Time','Place'],'Life:Die':['Agent','Victim','Instrument','Time','Place']}, }
2)構(gòu)造prompt的pattern:
ee_s1_p={ 'chinese':'''給定的句子為:"{}" 給定事件類型列表:{} 在這個(gè)句子中,可能包含了哪些事件類型? 請(qǐng)給出事件類型列表中的事件類型。 如果不存在則回答:無 按照元組形式回復(fù),如(事件類型1, 事件類型2, ……):''', 'english':'''Thegivensentenceis"{}" Givenalistofeventtypes:{} Whateventtypesinthegivenlistmightbeincludedinthisgivensentence? Ifnotpresent,answer:none. Respondasatuple,e.g.(eventtype1,eventtype2,......):''' } ee_s2_p={ 'chinese':'''事件類型"{}"對(duì)應(yīng)的論元角色列表為:{}。 在給定的句子中,根據(jù)論元角色提取出事件論元。 如果論元角色沒有相應(yīng)的論元內(nèi)容,則論元內(nèi)容回答:無 按照表格形式回復(fù),表格有兩列且表頭為(論元角色,論元內(nèi)容):''', 'english':'''Thelistofargumentrolescorrespondingtoeventtype"{}"is:{}. Inthegivensentence,extracteventargumentsaccordingtotheirrole. Iftheargumentroledoesnothaveacorrespondingargumentcontent,thentheargumentcontentanswer:None Respondintheformofatablewithtwocolumnsandaheaderof(argumentrole,argumentcontent):''' }
三、從偽zeroshot看In-Context Learning類比學(xué)習(xí)
In Context Learning(ICL)的關(guān)鍵思想是從類比中學(xué)習(xí)?!禔 Survey on In-context Learning》一文(https://arxiv.org/pdf/2301.00234.pdf)對(duì)In Context Learning(ICL)進(jìn)行了綜述。
該工作認(rèn)為,ICL的強(qiáng)大性能依賴于兩個(gè)階段:(1)培養(yǎng)LLMsICL能力的訓(xùn)練階段,以及LLMs根據(jù)特定任務(wù)演示進(jìn)行預(yù)測(cè)的推理階段。就訓(xùn)練階段而言,LLMs直接接受語言建模目標(biāo)的訓(xùn)練,如從左到右的生成,并將整個(gè)研究分成了訓(xùn)練和推理兩個(gè)部分,如下圖所示。
如下圖所示:給出了一個(gè)描述語言模型如何使用ICL進(jìn)行決策的例子。首先,ICL 需要一些示例來形成一個(gè)演示上下文。這些示例通常是用自然語言模板編寫的。然后 ICL 將查詢的問題(即你需要預(yù)測(cè)標(biāo)簽的 input)和一個(gè)上下文演示(一些相關(guān)的 cases)連接在一起,形成帶有提示的輸入,并將其輸入到語言模型中進(jìn)行預(yù)測(cè)。
值得注意的是,首與需要使用后向梯度來更新模型參數(shù)的訓(xùn)練階段的監(jiān)督學(xué)習(xí)不同,ICL不進(jìn)行參數(shù)更新,而是直接對(duì)語言模型進(jìn)行預(yù)測(cè)。
四、將In-Context Learning引入偽zero-shot完成信息抽取任務(wù)
開源項(xiàng)目中,借鑒In-Context Learning思想,給出了一個(gè)基于GLM-6B的zero-shot信息抽取方案,最終效果如下:
其本質(zhì)思想在于,針對(duì)zero-shot問題,使用同一個(gè)大模型,對(duì)不同任務(wù)設(shè)計(jì)其獨(dú)有的 prompt,以解決不同的任務(wù)問題針對(duì)信息抽取任務(wù),則采用2輪問答的方式進(jìn)行抽取,首先進(jìn)行實(shí)體類型分類,給定句子以及實(shí)體類別,要求識(shí)別出其中的實(shí)體類型,其次根據(jù)識(shí)別出的實(shí)體類型,再進(jìn)行實(shí)體屬性要素抽取。在構(gòu)造prompt的過程中,通過列舉一些正確的例子,作為In-Context Learning學(xué)習(xí)的上下文。(按照第一節(jié)的理解,這其實(shí)不能算作zero-shot,已經(jīng)是fewshot)
因此,如何設(shè)計(jì)指定任務(wù)的promt,以及如何合理的引入In-Context是整個(gè)工作的一個(gè)核心。
1、調(diào)用chatglm6b進(jìn)行推理抽取
加載chatglm-6b模型,對(duì)模型進(jìn)行預(yù)測(cè),下面是使用huggingface調(diào)用chatglm6b的代碼:
fromtransformersimportAutoTokenizer,AutoModel tokenizer=AutoTokenizer.from_pretrained("THUDM/chatglm-6b",trust_remote_code=True) model=AutoModel.from_pretrained("THUDM/chatglm-6b",trust_remote_code=True).half().cuda() response,history=model.chat(tokenizer,"你好",history=[]) print(response) response,history=model.chat(tokenizer,"晚上睡不著應(yīng)該怎么辦",history=history) print(response)
其中,整個(gè)history會(huì)作為一個(gè)部分,拼接進(jìn)行prompt當(dāng)中,從中可以看到,多輪對(duì)話最多做到8輪。
defbuild_prompt(history): prompt="歡迎使用ChatGLM-6B模型,輸入內(nèi)容即可進(jìn)行對(duì)話,clear清空對(duì)話歷史,stop終止程序" forquery,responseinhistory: prompt+=f" 用戶:{query}" prompt+=f" ChatGLM-6B:{response}" returnprompt defmain(): history=[] print("歡迎使用ChatGLM-6B模型,輸入內(nèi)容即可進(jìn)行對(duì)話,clear清空對(duì)話歷史,stop終止程序") whileTrue: query=input(" 用戶:") ifquery=="stop": break ifquery=="clear": history=[] os.system(clear_command) print("歡迎使用ChatGLM-6B模型,輸入內(nèi)容即可進(jìn)行對(duì)話,clear清空對(duì)話歷史,stop終止程序") continue count=0 forresponse,historyinmodel.stream_chat(tokenizer,query,history=history): count+=1 ifcount%8==0: os.system(clear_command) print(build_prompt(history),flush=True) os.system(clear_command) print(build_prompt(history),flush=True)
最后,我們對(duì)模型進(jìn)行推理,將上述構(gòu)造的兩個(gè)任務(wù)作為history
definference(sentence,custom_settings): withconsole.status("[boldbright_green]ModelInference..."): sentence_with_cls_prompt=CLS_PATTERN.format(sentence) cls_res,_=model.chat(tokenizer,sentence_with_cls_prompt,history=custom_settings['cls_pre_history']) ifcls_resnotinschema: print(f'Thetypemodelinferenced{cls_res}whichisnotinschemadict,exited.') exit() properties_str=','.join(schema[cls_res]) schema_str_list=f'“{cls_res}”({properties_str})' sentence_with_ie_prompt=IE_PATTERN.format(sentence,schema_str_list) ie_res,_=model.chat(tokenizer,sentence_with_ie_prompt,history=custom_settings['ie_pre_history']) ie_res=clean_response(ie_res) print(f'>>>[boldbright_red]sentence:{sentence}') print(f'>>>[boldbright_green]inferenceanswer:') print(ie_res) deftest(): console=Console() device='cuda:0' tokenizer=AutoTokenizer.from_pretrained("THUDM/chatglm-6b",trust_remote_code=True) model=AutoModel.from_pretrained("THUDM/chatglm-6b",trust_remote_code=True).half() model.to(device) sentence='張譯(原名張毅),1978年2月17日出生于黑龍江省哈爾濱市,中國(guó)內(nèi)地男演員。1997年至2006年服役于北京軍區(qū)政治部戰(zhàn)友話劇團(tuán)。2006年,主演軍事勵(lì)志題材電視劇《士兵突擊》。', custom_settings=init_prompts() inference(sentence,custom_settings )
2、第一步:實(shí)體類型識(shí)別
先做實(shí)體類型識(shí)別(這個(gè)有點(diǎn)像事件抽取中的事件檢測(cè)),其中需要構(gòu)造
1)sentence_with_cls_prompt
sentence_with_cls_prompt = CLS_PATTERN.format(sentence),先對(duì)句子進(jìn)行實(shí)體類型識(shí)別,構(gòu)造prompt:
CLS_PATTERN=f"“{{}}”是{class_list}里的什么類別?"
例如,針對(duì)句子:“張譯(原名張毅),1978年2月17日出生于黑龍江省哈爾濱市,中國(guó)內(nèi)地男演員。1997年至2006年服役于北京軍區(qū)政治部戰(zhàn)友話劇團(tuán)。2006年,主演軍事勵(lì)志題材電視劇《士兵突擊》?!?/p>
構(gòu)造prompt后變?yōu)椋?/p>
“張譯(原名張毅),1978年2月17日出生于黑龍江省哈爾濱市,中國(guó)內(nèi)地男演員。1997年至2006年服役于北京軍區(qū)政治部戰(zhàn)友話劇團(tuán)。2006年,主演軍事勵(lì)志題材電視劇《士兵突擊》。”是 ['人物','書籍','電視劇']里的什么類別?
2)cls_pre_history實(shí)體類型識(shí)別的例子
利用cls_pre_history作為incontext-learning學(xué)習(xí)的上下文,進(jìn)行拼接,例如,cls_pre_history形式為:
cls_pre_history: [ ("現(xiàn)在你是一個(gè)文本分類器,你需要按照要求將我給你的句子分類到:['人物', '書籍', '電視劇']類別中。",'好的。'), ( "“岳云鵬,本名岳龍剛,1985年4月15日出生于河南省濮陽市南樂縣,中國(guó)內(nèi)地相聲、影視男演員。2005年,首次登臺(tái)演出。2012年,主演盧衛(wèi)國(guó)執(zhí)導(dǎo)的喜劇電影《就是鬧著玩的 》。2013年在北京舉辦相聲專場(chǎng)?!笔荹'人物', '書籍', '電視劇']里的什么類別?", '人物' ), ( "“《三體》是劉慈欣創(chuàng)作的長(zhǎng)篇科幻小說系列,由《三體》《三體2:黑暗森林》《三體3:死神永生》組成,第一部于2006年5月起在《科幻世界》雜志上連載,第二部于2008年5 月首次出版,第三部則于2010年11月出版?!笔荹'人物', '書籍', '電視劇']里的什么類別?", '書籍' ), ( "“《狂飆》是由中央電視臺(tái)、愛奇藝出品,留白影視、中國(guó)長(zhǎng)安出版?zhèn)髅铰?lián)合出品,中央政法委宣傳教育局、中央政法委政法綜治信息中心指導(dǎo)拍攝,徐紀(jì)周執(zhí)導(dǎo),張譯、 張頌文、李一桐、張志堅(jiān)、吳剛領(lǐng)銜主演,倪大紅、韓童生、李建義、石兆琪特邀主演,李健、高葉、王驍?shù)戎餮莸姆春谛虃蓜??!笔荹'人物', '書籍', '電視劇']里的什么類別?", '電視劇' ) ]
3、第2步:實(shí)體屬性抽取
根據(jù)識(shí)別的實(shí)體類型結(jié)果做實(shí)體屬性抽?。ㄟ@個(gè)有點(diǎn)像事件抽取中的事件要素抽?。?/p>
根據(jù)上一步得到的實(shí)體類型,進(jìn)一步生成問句sentence_with_ie_prompt和in-context learning上下文,其中:
1)sentence_with_ie_prompt
sentence_with_ie_prompt指的是對(duì)任務(wù)的描述,其中需要用到不同實(shí)體對(duì)應(yīng)的屬性schema以及問題的promt模版。
schema如下:
schema={ '人物':['姓名','性別','出生日期','出生地點(diǎn)','職業(yè)','獲得獎(jiǎng)項(xiàng)'], '書籍':['書名','作者','類型','發(fā)行時(shí)間','定價(jià)'], '電視劇':['電視劇名稱','導(dǎo)演','演員','題材','出品方'] }
屬性抽取的prompt如下:
IE_PATTERN="{} 提取上述句子中{}類型的實(shí)體,并按照J(rèn)SON格式輸出,上述句子中不存在的信息用['原文中未提及']來表示,多個(gè)值之間用','分隔。"
變成:
張譯(原名張毅),1978年2月17日出生于黑龍江省哈爾濱市,中國(guó)內(nèi)地男演員。1997年至2006年服役于北京軍區(qū)政治部戰(zhàn)友話劇團(tuán)。2006年,主演軍事勵(lì)志題材電視劇《士兵突擊》。 提取上述句子中“人物”(姓名,性別,出生日期,出生地點(diǎn),職業(yè),獲得獎(jiǎng)項(xiàng))類型的實(shí)體,并按照J(rèn)SON格式輸出,上述句子中不存在的信息用['原文中未提及']來表示,多個(gè)值之間用','分隔。
2)ie_pre_history屬性抽取的例子
ie_pre_history屬性抽取的例子給定了一些正確抽取的實(shí)際例子,如下所示:
[ ( "現(xiàn)在你需要幫助我完成信息抽取任務(wù),當(dāng)我給你一個(gè)句子時(shí),你需要幫我抽取出句子中三元組,并按照J(rèn)SON的格式輸出,上述句子中沒有的信息用['原文中未提及']來表示,多 個(gè)值之間用','分隔。", '好的,請(qǐng)輸入您的句子。' ), ( "岳云鵬,本名岳龍剛,1985年4月15日出生于河南省濮陽市南樂縣,中國(guó)內(nèi)地相聲、影視男演員。 提取上述句子中“人物”(姓名, 性別, 出生日期, 出生地點(diǎn), 職業(yè), 獲得獎(jiǎng)項(xiàng))類型的實(shí)體,并按照J(rèn)SON格式輸出,上述句子中不存在的信息用['原文中未提及']來表示,多個(gè)值之間用','分隔。", '{"姓名":["岳云鵬"],"性別":["男"],"出生日期":["1985年4月15日"],"出生地點(diǎn)":["河南省濮陽市南樂縣"],"職業(yè)":["相聲演員","影視演員"],"獲得獎(jiǎng)項(xiàng)": ["原文中未提及"]}' ), ( "《三體》是劉慈欣創(chuàng)作的長(zhǎng)篇科幻小說系列,由《三體》《三體2:黑暗森林》《三體3:死神永生》組成,第一部于2006年5月起在《科幻世界》雜志上連載,第二部于2008年5月首 ,第三部則于2010年11月出版。 提取上述句子中“書籍”(書名, 作者, 類型, 發(fā)行時(shí)間, 定價(jià))類型的實(shí)體,并按照J(rèn)SON格式輸出,上述句子中不存在的信息用['原文中未提及']來表示,多個(gè)值之間用','分隔。", '{"書名":["《三體》"],"作者":["劉慈欣"],"類型":["長(zhǎng)篇科幻小說"],"發(fā)行時(shí)間":["2006年5月","2008年5月","2010年11月"],"定價(jià)":["原文中未提及"]}' ) ]
3、第三步:對(duì)模型輸出進(jìn)行后處理
defclean_response(response:str): if'```json'inresponse: res=re.findall(r'```json(.*?)```',response) iflen(res)andres[0]: response=res[0] response.replace('、',',') try: returnjson.loads(response) except: returnresponse
總結(jié)
本文先談?wù)刏ero-shot、One-shot以及Few-shot、從ChatIE:面向REEENER三種任務(wù)的偽zero-shot prompt說起、從偽zeroshot看In-Context Learning類比學(xué)習(xí)、將In-Context Learning引入偽zero-shot完成信息抽取任務(wù)四個(gè)方面進(jìn)行介紹,供大家一起參考。
審核編輯:劉清
-
icl
+關(guān)注
關(guān)注
0文章
28瀏覽量
17203 -
CLS
+關(guān)注
關(guān)注
0文章
9瀏覽量
9680 -
nlp
+關(guān)注
關(guān)注
1文章
481瀏覽量
21932 -
ChatGPT
+關(guān)注
關(guān)注
28文章
1517瀏覽量
6909
原文標(biāo)題:基于GLM-6B對(duì)話模型的實(shí)體屬性抽取項(xiàng)目實(shí)現(xiàn)解析:對(duì)Zero-shot與In-Context Learning的若干思考
文章出處:【微信號(hào):zenRRan,微信公眾號(hào):深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論