通過與 GPT 對話實現(xiàn)零樣本信息抽取
目前通用大模型取代為特定任務定制訓練的專屬模型的趨勢逐漸顯露,這種方式使AI模型應用的邊際成本大幅下降。由此提出一個問題:不經過訓練來實現(xiàn)零樣本信息抽取是否可行?
信息抽取技術作為構建知識圖譜的重要一環(huán),如果完全不需要訓練就可以實現(xiàn),將使數(shù)據(jù)分析的門檻大幅降低,有利于實現(xiàn)自動化知識庫構建。
我們通過對GPT-3.5用提示工程的方法建立一個通用的零樣本IE系統(tǒng)——GPT4IE(GPT for Information Extraction),發(fā)現(xiàn)GPT3.5能夠自動從原始句子中提取結構化信息。支持中英文,工具代碼已開源。
工具網址:?https://cocacola-lab.github.io/GPT4IE/?
代碼:?https://github.com/cocacola-lab/GPT4IE?
1 背景介紹
信息抽?。↖nformation Extraction,IE)目標是從無結構文本中抽取結構化信息,包括實體-關系三元組抽?。‥ntity-relation Extract, RE)、命名實體識別(Named Entity Recognition, NER)和事件抽?。‥vent Extraction, EE)[1][2][3][4][5]。許多研究已經開始依賴IE技術來自動化進行零樣本/少樣本工作,例如clinical IE [6]。
近來大規(guī)模預訓練語言模型(Large Pre-trained Language Model, LLMs)在許多下游任務上都表現(xiàn)極佳,甚至僅僅通過幾個例子作為引導而不需要微調就能實現(xiàn)。由此我們提出一個問題:僅通過提示來實現(xiàn)零樣本IE任務是否可行? 我們嘗試對GPT-3.5用提示的方法建立一個通用的零樣本IE系統(tǒng)——GPT4IE(GPT for Information Extraction)。在與GPT3.5和提示的結合下,它能夠自動從原始句子中提取結構化信息。
2 技術框架
設計了特定任務的提示模板(task-specified prompt template), 然后將用戶的輸入填充模板中特定的槽值 (slot),形成提示(prompt),輸入GPT-3.5中,進行IE。支持的任務有三種:RE、NER和EE,且這三種任務均支持中英文雙語。用戶需要輸入句子和制定抽取類型列表(即關系列表、頭實體列表、尾實體列表、實體類型列表或者事件列表)。具體如下:
RE任務的目標是從文本中抽取三元組,比如“(China, capital, Beijing)”, “(《如懿傳》, 主演, 周迅)”。其要求的輸入格式如下(帶“*”的代表非必填項,我們?yōu)檫@些選項都設置了默認值,但是為了靈活性支持用戶自定義指定列表,后同):
- Input Sentence: 輸入文本
- Relation type list (rtl)* : ['關系類型1', '關系類型2', ...]
- Subject type list (stl)* : ['頭實體類型1', '頭實體類型2', ...]
- Object type list (otl)* : ['尾實體類型1', '尾實體類型2', ...]
- OpenAI API key: OpenAI API 密鑰(我們在Github中提供了部分可用key,以供示例使用。)
NER任務旨在從文本中抽取實體,例如“(LOC, Beijing)” , “(人物, 周恩來)”。在NER任務上,輸入格式如下:
- Input Sentence: 輸入文本
- Entity type list (etl)* : ['實體類型1', '實體類型2', ...]
- OpenAI API key: OpenAI API 密鑰
EE任務旨在從純文本中提取事件,例如“{Life-Divorce: {Person: Bob, Time: today, Place: America}}“ , “{競賽行為-晉級: {時間: 無, 晉級方: 西北狼, 晉級賽事: 中甲榜首之爭}}”。輸入格式如下:
- Input Sentence: 輸入文本
- Event type list (etl)* : {'事件類型1': ['論元角色1', '論元角色2', ...], ...}
- OpenAI API key: OpenAI API 密鑰
3 工具使用示例
3.1 RE示例一
輸入:
Input Sentence: Bob worked for Google in Beijing, the capital of China.
rtl: ['location-located_in', 'administrative_division-country', 'person-place_lived', 'person-company', 'person-nationality', 'company-founders', 'country-administrative_divisions', 'person-children', 'country-capital', 'deceased_person-place_of_death', 'neighborhood-neighborhood_of', 'person-place_of_birth']
stl: ['organization', 'person', 'location', 'country']
otl: ['person', 'location', 'country', 'organization', 'city']
輸出:
3.2 RE示例二
輸入:
Input Sentence: 《如懿傳》是一部古裝宮廷情感電視劇,由汪俊執(zhí)導,周迅、霍建華、張鈞甯、董潔、辛芷蕾、童瑤、李純、鄔君梅等主演。
rtl: ['所屬專輯', '成立日期', '海拔', '官方語言', '占地面積', '父親', '歌手', '制片人', '導演', '首都', '主演', '董事長', '祖籍', '妻子', '母親', '氣候', '面積', '主角', '郵政編碼', '簡稱', '出品公司', '注冊資本', '編劇', '創(chuàng)始人', '畢業(yè)院校', '國籍', '專業(yè)代碼', '朝代', '作者', '作詞', '所在城市', '嘉賓', '總部地點', '人口數(shù)量', '代言人', '改編自', '校長', '丈夫', '主持人', '主題曲', '修業(yè)年限', '作曲', '號', '上映時間', '票房', '飾演', '配音', '獲獎']
stl: ['國家', '行政區(qū)', '文學作品', '人物', '影視作品', '學校', '圖書作品', '地點', '歷史人物', '景點', '歌曲', '學科專業(yè)', '企業(yè)', '電視綜藝', '機構', '企業(yè)/品牌', '娛樂人物']
otl: ['國家', '人物', 'Text', 'Date', '地點', '氣候', '城市', '歌曲', '企業(yè)', 'Number', '音樂專輯', '學校', '作品', '語言']
輸出:
3.3 NER示例一
輸入:
Input Sentence: Bob worked for Google in Beijing, the capital of China.
etl: ['LOC', 'MISC', 'ORG', 'PER']
輸出:
3.4 NER示例二
輸入:
Input Sentence: 在過去的五年中,致公黨在鄧小平理論指引下,遵循社會主義初級階段的基本路線,努力實踐致公黨十大提出的發(fā)揮參政黨職能、加強自身建設的基本任務。
etl: ['組織機構', '地點', '人物']
輸出:
3.5 EE示例一
輸入:
Input Sentence: Yesterday Bob and his wife got divorced in Guangzhou.
etl: {'Personnel:Elect': ['Person', 'Entity', 'Position', 'Time', 'Place'], 'Business:Declare-Bankruptcy': ['Org', 'Time', 'Place'], 'Justice:Arrest-Jail': ['Person', 'Agent', 'Crime', 'Time', 'Place'], 'Life:Divorce': ['Person', 'Time', 'Place'], 'Life:Injure': ['Agent', 'Victim', 'Instrument', 'Time', 'Place']}
輸出:
3.6 EE示例二
輸入:
Input Sentence:: 在2022年卡塔爾世界杯決賽中,阿根廷以點球大戰(zhàn)險勝法國。
etl: {'組織行為-罷工': ['時間', '所屬組織', '罷工人數(shù)', '罷工人員'], '競賽行為-晉級': ['時間', '晉級方', '晉級賽事'], '財經/交易-漲停':['時間', '漲停股'] , '組織關系-解雇': ['時間', '解雇方', '被解雇人員']}
輸出:
3.7 EE示例三(一個有意思的錯誤示例)
輸入:
Input Sentence:: 我今天和他離婚了
etl: {'組織行為-罷工': ['時間', '所屬組織', '罷工人數(shù)', '罷工人員'], '競賽行為-晉級': ['時間', '晉級方', '晉級賽事'], '財經/交易-漲停':['時間', '漲停股'] , '組織關系-解雇': ['時間', '解雇方', '被解雇人員']}
輸出:
明顯上面的輸出使錯誤的,自定義etl為: {'離婚': ['時間', '人物']},輸出為: