搭建基于LLM的客服系統(tǒng)的實(shí)踐2
隨著 ChatGPT 和 GPT-4 等強(qiáng)大生成模型出現(xiàn)沦疾,自然語言處理任務(wù)方式正在逐步發(fā)生改變。鑒于大模型強(qiáng)大的任務(wù)處理能力造虎,未來我們或?qū)⒉辉贋槊恳粋€具體任務(wù)去 finetune 一個模型傅蹂,而是使用同一個大模型,對不同任務(wù)設(shè)計其獨(dú)有的 prompt算凿,以解決不同的任務(wù)問題份蝴。
在該實(shí)驗(yàn)中,我們將基于清華開源大模型 ChatGLM-6B氓轰, 提供多個自然語言處理任務(wù)如何通過 prompt 來實(shí)現(xiàn) zero-shot 的案例婚夫,本案例擬虛擬一個公司的客服系統(tǒng)。
本實(shí)驗(yàn)中提出幾個任務(wù)署鸡,并采用代碼完成任務(wù)
- 任務(wù)1:客服打招呼任務(wù)
- 任務(wù)2:實(shí)現(xiàn)交談任務(wù)分類
- 任務(wù)3:實(shí)現(xiàn)交談內(nèi)容相似度任務(wù)
- 任務(wù)4:實(shí)現(xiàn)交談內(nèi)容結(jié)構(gòu)化提取任務(wù)
- 任務(wù)5:實(shí)現(xiàn)本地知識庫和網(wǎng)絡(luò)搜索的增強(qiáng)任務(wù)
- 任務(wù)6:實(shí)現(xiàn)自動化任務(wù)
任務(wù)中保證以下四個原則:
- 不允許直接發(fā)送任何消息直接給輸出(user)
- 只能通過構(gòu)造prompt的內(nèi)容來調(diào)整input
- 不允許截獲和修改模型的output內(nèi)容
- 除了構(gòu)造history案糙,不允許干涉模型的輸出
本實(shí)驗(yàn)中,ChatGLM-6B模型以API方式調(diào)用靴庆,當(dāng)然也可以本地方式調(diào)用时捌,只要將ChatGLM-6B模型做本地加載即可。采用API模式未來可以無縫切換到openAI炉抒,使用我們將可以使用ChatGPT 和 GPT-4奢讨,同樣可以切換到國內(nèi)的商業(yè)大模型的API上,比如百度的文心一言等焰薄。
2023-5-3 Gaoshine
2.實(shí)現(xiàn)交談任務(wù)分類
本次任務(wù)是對交談的內(nèi)容進(jìn)行分類:
在進(jìn)行客服電話中拿诸,除了讓模型能夠理解交談內(nèi)容外入录,對交談內(nèi)容進(jìn)行精確的分類也非常重要。 比如:
- 讓模型理解談話內(nèi)容屬于哪一部分佳镜?是問候,打招呼還是交談凡桥?
- 是和你討價還價還是想咨詢一下你的產(chǎn)品還是了解產(chǎn)品信息蟀伸,或者要一份報價?
- 是怒氣沖沖投訴還是買的產(chǎn)品不會用需要客服咨詢缅刽?
如果不能精確對談話內(nèi)容進(jìn)行分類啊掏,模型的回答的也就似是而非,如果能夠精確分類衰猛,就可以精確了解客戶意圖迟蜜。
可以根據(jù)精確分類和客戶意圖進(jìn)行,為模型提供相應(yīng)的prompt啡省。讓模型可以更好的回答下一個問題娜睛。
首先我們對客戶服務(wù)的類別進(jìn)行分類,我們是模擬場景卦睹,對實(shí)際業(yè)務(wù)分類可能不準(zhǔn)確畦戒。
我們可以先分為如下類別:
- '問候'
- '議價'
- '產(chǎn)品咨詢'
- '故障報修'
- '投訴'
- '報價單'
我們可以列出如下內(nèi)容判斷每句話屬于哪種類別:
'店里有幾種華為手機(jī)?能給我看看嗎结序?',
'這款筆記本別家才賣6000障斋,你們價格再便宜一點(diǎn)吧。',
'我才買的手機(jī)徐鹤,沒有用幾天就壞了垃环,是不是你們買假貨。',
'這個筆記本怎么連4G網(wǎng)絡(luò)返敬?',
'這款黑色P60給個報價吧',
'你好遂庄,在嗎?'
如果我們直接拋給LLM救赐,讓它做分類涧团,效果肯定不是太好,那么如何能夠提升LLM的判斷精度呢经磅? 答案當(dāng)然還是prompt泌绣,問題是如何構(gòu)造一個合適的prompt? 這個是我們現(xiàn)在要探討的主要問題预厌。
今天給大家介紹的是如何讓LLM更好的了解要輸出的內(nèi)容阿迈,當(dāng)然,你手中的魔法棒還是如何構(gòu)建prompt轧叽,一切的一切都需要你的咒語苗沧,即prompt刊棕。
當(dāng)然這個是 incontext learning的一個過程,我們針對這個分類任務(wù)待逞,需要先給LLM展示一下一些典型分類的例子甥角,這個就是我們的咒語。
# 提供所有類別以及每個類別下的樣例
class_examples = {
'問候': '先生/小姐识樱,您好嗤无。',
'議價': '我挺喜歡,也蠻好看的怜庸,便是我覺得這個價錢方面也有點(diǎn)貴当犯,能不能打外折什么的呀?價格再便宜一點(diǎn)',
'產(chǎn)品咨詢': '你們店里都有哪些商品啊割疾。',
'故障報修': '工作指示燈不亮嚎卫,無法開機(jī),不動作不反應(yīng)宏榕。',
'投訴': '產(chǎn)品質(zhì)量怎么這么差拓诸,沒用幾天就壞了。',
'報價單': '這部手機(jī)多少錢担扑?能給我一個報價嗎恰响?'
}
我們通過函數(shù)生成prompt:
def init_prompts():
"""
初始化前置prompt,便于模型做 incontext learning涌献。
"""
class_list = list(class_examples.keys())
pre_history = [
(
f'現(xiàn)在你是一個文本分類器胚宦,你需要按照要求將我給你的句子分類到:{class_list}類別中。',
f'好的燕垃。'
)
]
for _type, exmpale in class_examples.items():
pre_history.append((f'“{exmpale}”是 {class_list} 里的什么類別枢劝?', _type))
return {'class_list': class_list, 'pre_history': pre_history}
生成的prompt如下:
{
'class_list': ['問候', '議價', '產(chǎn)品咨詢', '故障報修', '投訴', '報價單'],
'pre_history': [
("現(xiàn)在你是一個文本分類器,你需要按照要求將我給你的句子分類到:['問候', '議價', '產(chǎn)品咨詢', '故障報修', '投訴', '報價單']類別中卜壕。", '好的您旁。'),
("“先生/小姐,您好轴捎『缀校”是 ['問候', '議價', '產(chǎn)品咨詢', '故障報修', '投訴', '報價單'] 里的什么類別?", '問候'),
("“我挺喜歡侦副,也蠻好看的侦锯,便是我覺得這個價錢方面也有點(diǎn)貴,能不能打外折什么的呀秦驯?價格再便宜一點(diǎn)”是 ['問候', '議價', '產(chǎn)品咨詢', '故障報修', '投訴', '報價單'] 里的什么類別尺碰?", '議價'),
("“你們店里都有哪些商品啊。”是 ['問候', '議價', '產(chǎn)品咨詢', '故障報修', '投訴', '報價單'] 里的什么類別亲桥?", '產(chǎn)品咨詢'), ("“工作指示燈不亮洛心,無法開機(jī),不動作不反應(yīng)题篷〈噬恚”是 ['問候', '議價', '產(chǎn)品咨詢', '故障報修', '投訴', '報價單'] 里的什么類別?", '故障報修'),
("“產(chǎn)品質(zhì)量怎么這么差番枚,沒用幾天就壞了偿枕。”是 ['問候', '議價', '產(chǎn)品咨詢', '故障報修', '投訴', '報價單'] 里的什么類別户辫?", '投訴'),
("“這部手機(jī)多少錢?能給我一個報價嗎嗤锉?”是 ['問候', '議價', '產(chǎn)品咨詢', '故障報修', '投訴', '報價單'] 里的什么類別渔欢?", '報價單')
]
}
我們將這個prompt作為pre_history送到模型中,告訴模型的分類的例子瘟忱,這樣模型通過 incontext learning會影響OUTPUT奥额,也就是我們的咒語起了作用。
小結(jié)一下访诱,交談分類的任務(wù)按照如下步驟執(zhí)行:
- 根據(jù)場景定義好分類
- 按照業(yè)務(wù)場景預(yù)先生成分類的例子
- 構(gòu)建prompt作為pre_history送到模型參數(shù)中
- 把要做分類的句子輸給模型垫挨,模型根據(jù)要求進(jìn)行分類,并輸出
全部代碼:
"""
客服任務(wù)分類
1.ChatGLM為API的客服系統(tǒng)代碼測試
2.實(shí)現(xiàn)交談任務(wù)分類
3.使用request庫触菜,使用web post獲取網(wǎng)站的api消息并打印結(jié)果九榔。此外,還要演示如何解析響應(yīng)消息:
"""
import requests
import json
url = '你自己的chatglm服務(wù)API地址'
mhistory = []
def GLM_chat(mtxt,mhistory):
msg = {}
msg['prompt'] = mtxt
msg['history'] = mhistory
msg_json = json.dumps(msg)
headers = {'Content-Type': 'application/json; charset=UTF-8'}
r = requests.post(url, headers=headers, data=msg_json, timeout=120)
mjson = json.loads(r.text)
print('User: %s' % mtxt)
print('Rot: %s' % mjson['response'])
return mjson
# 提供所有類別以及每個類別下的樣例
class_examples = {
'問候': '先生/小姐涡相,您好哲泊。',
'議價': '我挺喜歡,也蠻好看的催蝗,便是我覺得這個價錢方面也有點(diǎn)貴切威,能不能打外折什么的呀?價格便宜一點(diǎn)吧',
'產(chǎn)品咨詢': '你們店里都有哪些商品啊丙号。',
'故障報修': '工作指示燈不亮先朦,無法開機(jī),不動作不反應(yīng)犬缨。',
'投訴': '產(chǎn)品質(zhì)量怎么這么差喳魏,沒用幾天就壞了。',
'報價單': '這部手機(jī)多少錢遍尺?能給我一個報價嗎截酷?'
}
def init_prompts():
"""
初始化前置prompt,便于模型做 incontext learning。
"""
class_list = list(class_examples.keys())
pre_history = [
(
f'現(xiàn)在你是一個文本分類器迂苛,你需要按照要求將我給你的句子分類到:{class_list}類別中三热。',
f'好的。'
)
]
for _type, exmpale in class_examples.items():
pre_history.append((f'“{exmpale}”是 {class_list} 里的什么類別三幻?', _type))
return {'class_list': class_list, 'pre_history': pre_history}
if __name__ == '__main__':
msg = '你的角色是客服人員就漾,你名字叫金牌小客服,負(fù)責(zé)回答客戶問題。我的名字是高啟強(qiáng),性別男,我的手機(jī)號碼是18688883102,我的微信號是gaoshine2008,開始回答.'
r = GLM_chat(msg,mhistory)
print(r['history'])
sentences = [
'店里有幾種華為手機(jī)念搬?能給我看看嗎抑堡?',
'這款筆記本別家才賣6000,你們價格再便宜一點(diǎn)吧朗徊。',
'我才買的手機(jī)首妖,沒有用幾天就壞了,是不是你們買假貨爷恳。',
'這個筆記本怎么連4G網(wǎng)絡(luò)有缆?',
'這款黑色P60給個報價吧',
'你好,在嗎温亲?'
]
custom_settings = init_prompts()
for sentence in sentences:
sentence_with_prompt = f"“{sentence}”是 {custom_settings['class_list']} 里的什么類別棚壁?"
r = GLM_chat(sentence_with_prompt, custom_settings['pre_history'])
輸出結(jié)果:
User: 你的角色是客服人員,你名字叫金牌小客服,負(fù)責(zé)回答客戶問題栈虚。我的名字是高啟強(qiáng),性別男,開始回答.
Rot: 你好袖外,高啟強(qiáng)先生。我是金牌小客服魂务,很高興為您服務(wù)曼验。請問您有什么問題需要我回答嗎?
[['你的角色是客服人員粘姜,你名字叫金牌小客服,負(fù)責(zé)回答客戶問題蚣驼。我的名字是高啟強(qiáng),性別男,開始回答.', '你好,高啟強(qiáng)先生相艇。我是金牌小客服颖杏,很高興為您服務(wù)。請問您有什么問題需要我回答嗎坛芽?']]
User: “店里有幾種華為手機(jī)留储?能給我看看嗎?”是 ['問候', '議價', '產(chǎn)品咨詢', '故障報修', '投訴', '報價單'] 里的什么類別咙轩?
Rot: 產(chǎn)品咨詢
User: “這款筆記本別家才賣6000获讳,你們價格再便宜一點(diǎn)吧』詈埃”是 ['問候', '議價', '產(chǎn)品咨詢', '故障報修', '投訴', '報價單'] 里的什么類別丐膝?
Rot: 議價
User: “我才買的手機(jī),沒有用幾天就壞了,是不是你們買假貨帅矗≠怂啵”是 ['問候', '議價', '產(chǎn)品咨詢', '故障報修', '投訴', '報價單'] 里的什么類別?
Rot: 投訴
User: “這個筆記本怎么連4G網(wǎng)絡(luò)浑此?”是 ['問候', '議價', '產(chǎn)品咨詢', '故障報修', '投訴', '報價單'] 里的什么類別累颂?
Rot: 產(chǎn)品咨詢
User: “這款黑色P60給個報價吧”是 ['問候', '議價', '產(chǎn)品咨詢', '故障報修', '投訴', '報價單'] 里的什么類別?
Rot: 報價單
User: “你好凛俱,在嗎紊馏?”是 ['問候', '議價', '產(chǎn)品咨詢', '故障報修', '投訴', '報價單'] 里的什么類別?
總結(jié):
我們通過這個任務(wù)蒲犬,實(shí)現(xiàn)了使用LLM做交談內(nèi)容的分類工作朱监,通過使用業(yè)務(wù)場景中的例子,讓模型通過 incontext learning方式學(xué)習(xí)原叮,達(dá)到準(zhǔn)確輸出的效果赌朋。
模型有了這個功能之后,我們可以更加精確的了解客戶對話的分類和客戶意圖篇裁,一邊通過內(nèi)在的數(shù)據(jù)庫或者知識庫再通過prompt正向反饋給LLM,讓模型的下一個輸出更加貼合客戶意圖赡若。
總之达布,代碼非常簡單,大家記住在LLM世界中逾冬,prompt就是魔法棒黍聂,一切的一切都需要你的咒語,即prompt身腻!
本次是我在今年五一假期的學(xué)習(xí)LLM的心得产还,通過客戶場景體驗(yàn)LLM的實(shí)驗(yàn),希望能夠拋磚引玉嘀趟,也希望我的心得對各位有所幫助脐区。
我的todo list:
- 任務(wù)1:客服打招呼任務(wù) (已完成)
- 任務(wù)2:實(shí)現(xiàn)交談任務(wù)分類 (已完成)
- 任務(wù)3:實(shí)現(xiàn)交談內(nèi)容相似度任務(wù)
- 任務(wù)4:實(shí)現(xiàn)交談內(nèi)容結(jié)構(gòu)化提取任務(wù)
- 任務(wù)5:實(shí)現(xiàn)本地知識庫和網(wǎng)絡(luò)搜索的增強(qiáng)任務(wù)
- 任務(wù)6:實(shí)現(xiàn)自動化任務(wù),一個autogpt的實(shí)現(xiàn)