參考https://cloud.tencent.com/developer/article/2426296
- chatglm2-6b,通過prompt來實現zero-shot/fewshot的自然語言處理任務
import json
import re
import os
from modelscope.utils.constant import Tasks
from modelscope import Model
from modelscope.pipelines import pipeline
model = Model.from_pretrained('ZhipuAI/chatglm2-6b', device_map='auto', revision='v1.0.12')
pipe = pipeline(task=Tasks.chat, model=model)
inputs = {'text':'你好', 'history': []}
result = pipe(inputs)
inputs = {'text':'介紹下清華大學', 'history': result['history']}
result = pipe(inputs)
print(result)
- 文本分類任務
text=f"""
1.加拿大(英語/法語:Canada),首都渥太華,位于北美洲北部。東臨大西洋,西瀕太平洋,西北部鄰美國阿拉斯加州,南接美國本土,北靠北冰洋。氣候大部分為亞寒帶針葉林氣候和濕潤大陸性氣候,北部極地區域為極地長寒氣候。
2.《瑯琊榜》是由山東影視傳媒集團出品, 由孔笙、李雪執導,海宴擔任編劇,胡歌、劉濤、王凱、黃維德、陳龍、丁勇岱、劉敏濤領銜主演,靳東、陳麗娜友情出演,劉奕君、王勁松、張齡心、吳磊、程皓楓、郭曉然、王永泉、高鑫、王鷗、周奇奇、張棪琰、寧文彤主演的古裝權謀劇
3.《滿江紅》是由張藝謀執導,沈騰、易烊千璽、張譯、雷佳音、岳云鵬、王佳怡領銜主演,潘斌龍、余皚磊主演,郭京飛、歐豪友情出演,魏翔、張弛、黃炎特別出演,許靜雅、蔣鵬宇、林博洋、飛凡、任思諾、陳永勝出演的懸疑喜劇電影。
4.布宜諾斯艾利斯(西班牙語:Buenos Aires,華人常簡稱為布宜諾斯),是阿根廷共和國(the Republic of Argentina,República Argentina)的首都和最大城市,位于拉普拉塔河南岸、南美洲東南部、河對岸為烏拉圭東岸共和國。
5.張譯(原名張毅),1978年2月17日出生于黑龍江省哈爾濱市,中國內地男演員。1997年至2006年服役于北京軍區政治部戰友話劇團。2005年,在電視劇《民工》中飾演郭振東一角正式開啟演藝生涯。2006年,在主演軍事勵志題材電視劇《士兵突擊》中飾演史今一角。
"""
prompt=f"""
識別以下5句話中,每一句話描述的是一個什么類型的物體。
{text}
將結果用數組形式表示,如['答案1','答案2', ..., '答案5'],此處的答案是你剛才識別的那5句話的答案。
"""
inputs = {'text': prompt, 'history': []}
result = pipe(inputs)
print(result['response'])
['地理', '電視劇', '電影', '城市', '演員']
- 文本匹配任務
text=f"""
('如何修改頭像', '可以通過上傳圖片修改頭像嗎'),
('王者榮耀司馬懿連招', '王者榮耀司馬懿有什么技巧'),
('王者榮耀司馬懿連招', '歷史上司馬懿真的被諸葛亮空城計騙了嗎'),
"""prompt=f"""
你需要識別文本對中的兩個句子是否描述的是相似的語言,示例如下:
問題: "('蘋果是水果嗎', '榴蓮是水果嗎'), ('小學生有游戲防沉迷系統嗎', '我還在上學,打游戲有時間限制嗎'), ('怎么做意大利面最好吃', '下雨了去哪買傘')"
答案: ['相似', '相似', '不相似']
上面的問答邏輯為:第一個句子對都是問某個東西是否是水果,所以識別為相似;第二個句子對都與學生玩游戲相關,所以是相似,第三個句子對一個是做飯、一個是買東西,因此不相似。
下面是你需要識別的文本對:
{text}
請以我給出的示例答案的回答方式給出結果,請注意只需要給出['相似/不相似',...]這樣的結構
"""
inputs = {'text': prompt, 'history': []}
result = pipe(inputs)
print(result['response'])
['相似', '相似', '不相似']
- 信息抽取任務
class_examples = {'人物': '岳云鵬,本名岳龍剛,1985年4月15日出生于河南省濮陽市南樂縣,中國內地相聲、影視男演員。2005年,首次登臺演出。2012年,主演盧衛國執導的喜劇電影《就是鬧著玩的》。2013年在北京舉辦相聲專場。','書籍': '《三體》是劉慈欣創作的長篇科幻小說系列,由《三體》《三體2:黑暗森林》《三體3:死神永生》組成,第一部于2006年5月起在《科幻世界》雜志上連載,第二部于2008年5月首次出版,第三部則于2010年11月出版。','電視劇': '《狂飆》是由中央電視臺、愛奇藝出品,留白影視、中國長安出版傳媒聯合出品,中央政法委宣傳教育局、中央政法委政法綜治信息中心指導拍攝,徐紀周執導,張譯、張頌文、李一桐、張志堅、吳剛領銜主演,倪大紅、韓童生、李建義、石兆琪特邀主演,李健、高葉、王驍等主演的反黑刑偵劇。',
}# few-shot examplesie_examples = {'人物': [{'content': '岳云鵬,本名岳龍剛,1985年4月15日出生于河南省濮陽市南樂縣,中國內地相聲、影視男演員。','answers': {'姓名': ['岳云鵬'],'性別': ['男'],'出生日期': ['1985年4月15日'],'出生地點': ['河南省濮陽市南樂縣'],'職業': ['相聲演員', '影視演員'],'獲得獎項': ['原文中未提及']}}],'書籍': [{'content': '《三體》是劉慈欣創作的長篇科幻小說系列,由《三體》《三體2:黑暗森林》《三體3:死神永生》組成,第一部于2006年5月起在《科幻世界》雜志上連載,第二部于2008年5月首次出版,第三部則于2010年11月出版。','answers': {'書名': ['《三體》'],'作者': ['劉慈欣'],'類型': ['長篇科幻小說'],'發行時間': ['2006年5月','2008年5月','2010年11月'],'定價': ['原文中未提及']}}]
}# 先對句子做分類,再進行信息提取
schema = {'人物': ['姓名', '性別', '出生日期', '出生地點', '職業', '獲得獎項'],'書籍': ['作者', '類型', '發行日期', '定價'],'電視劇': ['導演', '演員', '題材', '出品方'],
}class_list = list(schema.keys())CLS_PATTERN = f"“{{}}”是 {class_list} 里的什么類別?"cls_pre_history = [(f"現在你是一個文本分類器,你需要按照要求將我給你的句子分類到:{class_list}類別中。",f"好的。")
]for _type, example in class_examples.items():cls_pre_history.append((f"“{example}”是 {class_list} 里的什么類別?", _type))IE_PATTERN = "{}\n\n提取上述句子中{}類型的實體,并按照JSON格式輸出,上述句子中不存在的信息用['原文中未提及']來表示,多個值之間用','分隔。"ie_pre_history = [("現在你需要幫助我完成信息抽取任務,當我給你一個句子時,你需要幫我抽取出句子中三元組,并按照JSON的格式輸出,上述句子中沒有的信息用['原文中未提及']來表示,多個值之間用','分隔。",'好的,請輸入您的句子。')
]for _type, example_list in ie_examples.items():for example in example_list:sentence = example['content']properties_str = ','.join(schema[_type])schema_str_list = f'“{_type}”({properties_str})'sentence_with_ie_prompt = IE_PATTERN.format(sentence, schema_str_list)ie_pre_history.append((f'{sentence_with_ie_prompt}',f"{json.dumps(example['answers'], ensure_ascii=False)}"))
class_examples = {'人物': '岳云鵬,本名岳龍剛,1985年4月15日出生于河南省濮陽市南樂縣,中國內地相聲、影視男演員。2005年,首次登臺演出。2012年,主演盧衛國執導的喜劇電影《就是鬧著玩的》。2013年在北京舉辦相聲專場。','書籍': '《三體》是劉慈欣創作的長篇科幻小說系列,由《三體》《三體2:黑暗森林》《三體3:死神永生》組成,第一部于2006年5月起在《科幻世界》雜志上連載,第二部于2008年5月首次出版,第三部則于2010年11月出版。','電視劇': '《狂飆》是由中央電視臺、愛奇藝出品,留白影視、中國長安出版傳媒聯合出品,中央政法委宣傳教育局、中央政法委政法綜治信息中心指導拍攝,徐紀周執導,張譯、張頌文、李一桐、張志堅、吳剛領銜主演,倪大紅、韓童生、李建義、石兆琪特邀主演,李健、高葉、王驍等主演的反黑刑偵劇。',
}# few-shot examplesie_examples = {'人物': [{'content': '岳云鵬,本名岳龍剛,1985年4月15日出生于河南省濮陽市南樂縣,中國內地相聲、影視男演員。','answers': {'姓名': ['岳云鵬'],'性別': ['男'],'出生日期': ['1985年4月15日'],'出生地點': ['河南省濮陽市南樂縣'],'職業': ['相聲演員', '影視演員'],'獲得獎項': ['原文中未提及']}}],'書籍': [{'content': '《三體》是劉慈欣創作的長篇科幻小說系列,由《三體》《三體2:黑暗森林》《三體3:死神永生》組成,第一部于2006年5月起在《科幻世界》雜志上連載,第二部于2008年5月首次出版,第三部則于2010年11月出版。','answers': {'書名': ['《三體》'],'作者': ['劉慈欣'],'類型': ['長篇科幻小說'],'發行時間': ['2006年5月','2008年5月','2010年11月'],'定價': ['原文中未提及']}}]
}# 先對句子做分類,再進行信息提取
schema = {'人物': ['姓名', '性別', '出生日期', '出生地點', '職業', '獲得獎項'],'書籍': ['作者', '類型', '發行日期', '定價'],'電視劇': ['導演', '演員', '題材', '出品方'],
}class_list = list(schema.keys())CLS_PATTERN = f"“{{}}”是 {class_list} 里的什么類別?"cls_pre_history = [(f"現在你是一個文本分類器,你需要按照要求將我給你的句子分類到:{class_list}類別中。",f"好的。")
]for _type, example in class_examples.items():cls_pre_history.append((f"“{example}”是 {class_list} 里的什么類別?", _type))IE_PATTERN = "{}\n\n提取上述句子中{}類型的實體,并按照JSON格式輸出,上述句子中不存在的信息用['原文中未提及']來表示,多個值之間用','分隔。"ie_pre_history = [("現在你需要幫助我完成信息抽取任務,當我給你一個句子時,你需要幫我抽取出句子中三元組,并按照JSON的格式輸出,上述句子中沒有的信息用['原文中未提及']來表示,多個值之間用','分隔。",'好的,請輸入您的句子。')
]for _type, example_list in ie_examples.items():for example in example_list:sentence = example['content']properties_str = ','.join(schema[_type])schema_str_list = f'“{_type}”({properties_str})'sentence_with_ie_prompt = IE_PATTERN.format(sentence, schema_str_list)ie_pre_history.append((f'{sentence_with_ie_prompt}',f"{json.dumps(example['answers'], ensure_ascii=False)}"))
{"電視劇": {"導演": ["孔笙", "李雪"], "演員": ["胡歌", "劉濤", "王凱", "黃維德", "陳龍", "丁勇岱", "劉敏濤", "靳東", "陳麗娜", "吳磊", "程皓楓", "郭曉然", "王永泉", "高鑫", "王鷗", "周奇奇", "張棪琰", "寧文彤"], "題材": ["古裝權謀劇"], "出品方": ["山東影視傳媒集團"]}
{"姓名": ["張譯"], "性別": ["男"], "出生日期": ["1978年2月17日"], "出生地點": ["黑龍江省哈爾濱市"], "職業": ["中國內地男演員"], "獲得獎項": ["原文中未提及"]}