搭建基于LLM的客服系統(tǒng)的實(shí)踐2

搭建基于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ù)中保證以下四個原則:

  1. 不允許直接發(fā)送任何消息直接給輸出(user)
  2. 只能通過構(gòu)造prompt的內(nèi)容來調(diào)整input
  3. 不允許截獲和修改模型的output內(nèi)容
  4. 除了構(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í)行:

  1. 根據(jù)場景定義好分類
  2. 按照業(yè)務(wù)場景預(yù)先生成分類的例子
  3. 構(gòu)建prompt作為pre_history送到模型參數(shù)中
  4. 把要做分類的句子輸給模型垫挨,模型根據(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)品咨詢', '故障報修', '投訴', '報價單'] 里的什么類別?

Screenshot 2023-05-03 at 11.29.59.png

總結(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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末她按,一起剝皮案震驚了整個濱河市牛隅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酌泰,老刑警劉巖媒佣,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異陵刹,居然都是意外死亡默伍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來也糊,“玉大人炼蹦,你說我怎么就攤上這事∠陨瑁” “怎么了框弛?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捕捂。 經(jīng)常有香客問我瑟枫,道長,這世上最難降的妖魔是什么指攒? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任慷妙,我火速辦了婚禮,結(jié)果婚禮上允悦,老公的妹妹穿的比我還像新娘膝擂。我一直安慰自己,他們只是感情好隙弛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布架馋。 她就那樣靜靜地躺著,像睡著了一般全闷。 火紅的嫁衣襯著肌膚如雪叉寂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天总珠,我揣著相機(jī)與錄音屏鳍,去河邊找鬼。 笑死局服,一個胖子當(dāng)著我的面吹牛钓瞭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淫奔,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼山涡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了唆迁?” 一聲冷哼從身側(cè)響起佳鳖,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎媒惕,沒想到半個月后系吩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妒蔚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年穿挨,在試婚紗的時候發(fā)現(xiàn)自己被綠了月弛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡科盛,死狀恐怖帽衙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贞绵,我是刑警寧澤厉萝,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站榨崩,受9級特大地震影響谴垫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜母蛛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一翩剪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧彩郊,春花似錦前弯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至违帆,卻和暖如春浙巫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背前方。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留廉油,地道東北人惠险。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像抒线,于是被迫代替她去往敵國和親班巩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容