數(shù)據(jù)驅(qū)動與 LLM 微調(diào):打造 E2E 任務(wù)型對話 Agent
作者 | Thought Agent 社區(qū)
在對話系統(tǒng)的設(shè)計和實現(xiàn)中,傳統(tǒng)的基于 Rasa-like 框架的方法往往需要依賴于多個模塊的緊密協(xié)作,例如我們在之前的文章中提到的基于大模型(LLM)構(gòu)建的任務(wù)型對話 Agent,Thought Agent,其由自然語言理解(NLU)、對話管理(DM)和對話策略(DP)等模塊共同協(xié)作組成。這種模塊化的設(shè)計雖然在理論上具有靈活性,但在實踐中卻帶來了諸多挑戰(zhàn),尤其是在系統(tǒng)集成、錯誤傳播、維護(hù)更新以及開發(fā)門檻等方面。

為了克服這些挑戰(zhàn),構(gòu)建一個端到端(E2E)的模型顯得尤為關(guān)鍵。E2E 的模型通過將對話的各個階段集成到一個統(tǒng)一的框架中,極大地簡化了系統(tǒng)架構(gòu),提高了處理效率,并減少了錯誤傳遞的可能性。此外,由于其簡化的架構(gòu),也更易于維護(hù)和更新,從而降低了開發(fā)和維護(hù)的成本。
在我們看來,端到端的對話 Agent 不僅在技術(shù)上更具優(yōu)勢,而且在實際應(yīng)用中也展現(xiàn)了其獨特的價值和潛力,例如能夠快速構(gòu)建幫助用戶查詢信息、調(diào)度技能的 Agent。
本文將指導(dǎo)讀者如何采用蒙特卡洛方法(Monte Carlo)模擬用戶行為并結(jié)合 LLM 的方法來構(gòu)建訓(xùn)練數(shù)據(jù)集;使用 LLaMA Factory 對多種 LLM 進(jìn)行高效微調(diào)構(gòu)建任務(wù)型對話 Agent。該方案允許用戶快速創(chuàng)建出能夠精準(zhǔn)調(diào)用外部工具的 Agent。
挑戰(zhàn)
任務(wù)型對話系統(tǒng)的核心需求包括意圖識別、槽位填充、狀態(tài)管理和策略決策。我們識別了以下幾個關(guān)鍵挑戰(zhàn):
- 微調(diào)后的 LLM 需要從用戶的問題中識別到用戶意圖和關(guān)鍵信息(槽位)
- 微調(diào)后的 LLM 需要對用戶的問題有判斷邊界的能力,容易混淆的內(nèi)容將觸發(fā)意圖確認(rèn),完全無關(guān)的內(nèi)容將觸發(fā)兜底話術(shù)
- 微調(diào)后的 LLM 需要根據(jù)槽位填充狀態(tài)判斷合適的觸發(fā)功能調(diào)用(Function calling)的時機(jī)
- 微調(diào)后的 LLM 需要對根據(jù)上下文正確的識別到需要用于調(diào)用功能的關(guān)鍵信息
構(gòu)造數(shù)據(jù)集
為了應(yīng)對上述挑戰(zhàn),首先我們需要構(gòu)造能夠覆蓋大部分場景的對話數(shù)據(jù)集,我們面臨的核心難點是如何模擬真實世界中用戶的多樣化行為和對話系統(tǒng)的有效響應(yīng)。但是對于任務(wù)型對話 Agent 來說,用戶和 Agent 之間的對話域是有限的,因為 Agent 只需要處理業(yè)務(wù)范圍內(nèi)的用戶意圖,超出處理范圍的內(nèi)容,只需要返回一些固定的兜底話術(shù)即可。
因此我們可以采用了狀態(tài)圖對對話的過程進(jìn)行建模,使用蒙特卡洛方法對真實的對話過程進(jìn)行模擬,接著使用 LLM 的生成能力來創(chuàng)建符合狀態(tài)、角色定義的對話內(nèi)容從而達(dá)到構(gòu)建數(shù)據(jù)集的目的。
1.基于圖的對話流程圖的建模
我們使用有向圖(Directed Graph)的數(shù)據(jù)結(jié)構(gòu)來對通用的任務(wù)型對話流程進(jìn)行建模,這比傳統(tǒng)的有限狀態(tài)機(jī)更加靈活和通用。在構(gòu)建對話流程圖時,我們首先定義了一組節(jié)點,每個節(jié)點代表了對話中的一個關(guān)鍵狀態(tài)。例如,一個理想的對話過程至少包含以下節(jié)點:
- Start: 對話開始
- IntentAcquire: Agent 詢問用戶意圖
- UserInquiry: 用戶發(fā)起新的提問
- IntentConfirm: Agent 向用戶確認(rèn)意圖 (用戶意圖不明確時)
- UserConfirm: 用戶確認(rèn)意圖
- UserDeny: 用戶否認(rèn)意圖
- AskSlot: 追問用戶關(guān)于該意圖的關(guān)鍵信息(槽位)
- ProvideSlot: 用戶提供或更新關(guān)鍵信息
- FunctionCalling: 調(diào)用功能,傳遞槽位信息
- Chitchat: 用戶閑聊
- End: 對話結(jié)束
在定義了節(jié)點之后,我們使用邊將可以進(jìn)行狀態(tài)轉(zhuǎn)移的節(jié)點連接起來,從而構(gòu)建一個有向圖用來表征對話過程中所有可能的轉(zhuǎn)移關(guān)系,如下圖。在這個圖中,主要的變量是用戶對話內(nèi)容,Agent 的回復(fù)內(nèi)容是隨著用戶的對話意圖和槽位狀態(tài)發(fā)生的變化而變化。對于每個原子對話來說,我們認(rèn)為在用戶提供了清晰的意圖以及提供了全部的必填槽位信息之后,這個原子對話就算結(jié)束了,即可以觸發(fā) Function Calling 的指令。

圖 1. 對話流程轉(zhuǎn)移圖示例(可能沒有覆蓋全部場景)
2.初始狀態(tài)隨機(jī)生成
在對話系統(tǒng)的開始階段,用戶的首次提問可能包含從零到全部所需槽位的不同信息量。為了模擬這種多樣性,我們可以使用蒙特卡洛方法來隨機(jī)決定哪些槽位在用戶的首次提問中被提及。具體來說,對于一個意圖中的所有槽位,我們可以生成一個由 0 或 1 組成的隨機(jī)數(shù)組,其中 0 表示該槽位不能再首次提問中提及,而 1 表示需要被提及。
例如,考慮一個酒店預(yù)訂任務(wù),可能的關(guān)鍵信息包括「入住日期」、「退房日期」 和 「房間類型」。利用上述的方法,我們可以為每個槽位生成一個對應(yīng)的隨機(jī)值,從而決定用戶的首次提問中需要包含哪些信息。這不僅增加了對話樣本的多樣性,也使得訓(xùn)練數(shù)據(jù)集更加貼近真實世界的對話情況。
3.隨機(jī)游走模擬用戶行為
初始狀態(tài)生成了之后,我們需要生成生成多樣化的對話路徑,這里采用蒙特卡洛方法使得當(dāng)前的對話狀態(tài)在建立好的對話轉(zhuǎn)移狀態(tài)圖中隨機(jī)游走。在每個狀態(tài)完成之后,將隨機(jī)選擇下一個狀態(tài),各狀態(tài)的轉(zhuǎn)移概率可以根據(jù)經(jīng)驗進(jìn)行定義,從而模擬用戶可能采取的不同行動。例如,用戶在首問中沒有提供全部的必填槽位, Agent 將發(fā)起槽位的追問,對于 Agent 的追問,用戶可能認(rèn)真的回答槽位信息,也有可能發(fā)起閑聊,還有可能改變了主意,問了一個新的問題,不同的轉(zhuǎn)移路徑我們可以設(shè)置不同的概率,例如上面的轉(zhuǎn)移路徑我們根據(jù)經(jīng)驗分為設(shè)置概率為 [0.8, 0.1, 0.1]。
通過這種隨機(jī)游走的方式,可以生成不同的對話狀態(tài)路徑,每條路徑都代表了一種可能的用戶行為和 Agent 響應(yīng)。這些路徑為我們提供了豐富的訓(xùn)練數(shù)據(jù),幫助對話系統(tǒng)學(xué)習(xí)如何處理各種情況。
4.對上下文理解能力的增強(qiáng)
在實際對話中,用戶通常不會在每個回合都重復(fù)提供所有相關(guān)信息。相反,他們會根據(jù)上下文,利用代詞、省略或簡化的表述來替代之前已經(jīng)提及過的內(nèi)容。為了讓對話系統(tǒng)能夠正確理解這種上下文依賴的表達(dá)方式,我們需要在訓(xùn)練數(shù)據(jù)中模擬這種用戶行為模式。
具體來說,我們將對話分為多個階段,每個階段對應(yīng)不同的任務(wù)意圖。在后續(xù)階段生成語料時,我們會考慮之前階段已經(jīng)提供的槽位信息。如果用戶的新問題與之前的問題存在槽位重疊,且該槽位已在先前回合中提供過,那么在生成新問題時,我們將有意識地省略這部分信息,只保留用戶需要補(bǔ)充的新信息。
例如,假設(shè)用戶之前已經(jīng)詢問過「成都市內(nèi)哪家火鍋好吃」,這句話中包含了用戶想要了解的位置和餐廳類型兩個槽位信息。在后續(xù)對話中,如果用戶想詢問這些餐館的價格區(qū)間,可能會使用「它們的價格大概是多少?」這樣的省略式表述,而非重復(fù)提供完整的問句。通過模擬這種情況,我們可以增強(qiáng)模型對于上下文依賴的理解能力。
5.基于 LLM 的對話內(nèi)容生成
LLM 在這一過程中扮演了至關(guān)重要的角色。我們利用 LLM 的強(qiáng)大生成能力來模擬用戶的提問和系統(tǒng)的追問,生成接近真實對話的數(shù)據(jù)。例如,以推薦餐廳這個意圖為例, 用于生成首問的 Prompt 可以這樣寫:
你是一個用戶,你現(xiàn)在想要「根據(jù)自己的位置、興趣和預(yù)算,讓智能客服推薦當(dāng)?shù)氐牟蛷d」,請向智能客服尋求幫助。
你的問題需要滿足以下幾個條件:
- 1在問題中需要提到具體的用戶當(dāng)前的區(qū)域或希望探索的區(qū)域。
- 在問題中一定不要提到具體的用戶感興趣的餐廳類型,中餐,日料,西餐等。
- 在問題中一定不要提到具體的用戶的最大預(yù)算。
請生成一句滿足當(dāng)前的場景和設(shè)定的問題。
LLM 廣闊的知識面為我們提供了豐富的語言資源,支持我們模擬各種場景的對話。此外,LLM 還能夠根據(jù)上下文生成連貫且邏輯性強(qiáng)的回復(fù),進(jìn)一步提高了數(shù)據(jù)集的質(zhì)量。
為了增強(qiáng)任務(wù)型對話 Agent 對領(lǐng)域信息的理解以及提高對話的多樣性, RAG 技術(shù)將被用于為對話內(nèi)容注入領(lǐng)域相關(guān)的知識。特別是在處理涉及特定領(lǐng)域業(yè)務(wù)的時候,領(lǐng)域知識在這一過程中至關(guān)重要。為了在實現(xiàn)領(lǐng)域信息的注入,以辦理業(yè)務(wù)這個意圖為例,可以采取以下實施步驟:
- 首先,提前準(zhǔn)備好所有可以辦理的業(yè)務(wù)列表以及每個業(yè)務(wù)對應(yīng)的描述信息作為我們的候選信息源。
- 接著,在每次需要再對話中提及具體的業(yè)務(wù)功能的時候從這個槽位列表中隨機(jī)選擇一個或多個功能。例如,我們可以構(gòu)建這樣的 Prompt 「請生成一個用戶想要辦理 A 業(yè)務(wù)的話術(shù),A 業(yè)務(wù)是一個 xxx 的功能」來生成不同的用戶問題,一方面注入了我們想要 Agent 學(xué)習(xí)的領(lǐng)域知識,另一方面保證了對話語料的多樣性。
通過這種方法,任務(wù)型對話代理可以更好地理解和響應(yīng)用戶需求,提供更精準(zhǔn)和個性化的服務(wù)。
6.易擴(kuò)展的意圖配置
對于任務(wù)型 Agent 來說,對話的目標(biāo)是一致,即收集足夠的信息幫助用戶執(zhí)行任務(wù)。我們可以通過一個 YAML 文件來對任務(wù)的詳細(xì)內(nèi)容和槽位信息進(jìn)行描述,用戶意圖增加和減少都可以通過編輯一系列 YAML 配置文件來實現(xiàn),而無需對有狀態(tài)轉(zhuǎn)移圖或生成流程進(jìn)行復(fù)雜的更改。這種設(shè)計提高了本文方案的可擴(kuò)展性。例如想生成一個根據(jù)地點,餐廳類型,最大預(yù)算推薦餐廳任務(wù)相關(guān)的數(shù)據(jù)集,只需要編寫如下配置文件即可:
name: recommend_restaurant
description: 根據(jù)自己的位置、興趣和預(yù)算,讓智能客服推薦當(dāng)?shù)氐牟蛷d
parameters:
- name: destination
description: 用戶當(dāng)前的區(qū)域或希望探索的區(qū)域。
type: text
required: True
- name: cuisine_type
description: 用戶感興趣的餐廳類型,中餐,日料,西餐等
type: text
required: True
- name: budget
description: 用戶的最大預(yù)算
type: float
required: False目標(biāo)為任務(wù)型對話 Agent 的 LLM 微調(diào)
我們選擇 LLaMA Factory 作為我們的微調(diào)工具,這是一個開源的高效微調(diào)框架,專為 LLMs 設(shè)計,能夠適應(yīng)各種下游任務(wù),并且兼容大部分主流模型,同時提供一個圖形界面 LLaMA Board 幫助用戶更友好的執(zhí)行和管理微調(diào)任務(wù)。
對于本文的任務(wù),對 LLM 按照任務(wù)型 Agent 方向進(jìn)行微調(diào),因為需要學(xué)習(xí)的知識較少,并且不會對模型整體的回答能力進(jìn)行大的變化,這里我們采用 LoRA 微調(diào)技術(shù)對模型進(jìn)行 SFT。在基礎(chǔ)模型的選擇上,沒有經(jīng)過指令微調(diào)的 Base 模型和有過指令微調(diào)后的 Chat 模型(e.g., Qwen 1.5 和 ChatGLM3)都會被納入選擇范圍。

圖 2. 面向 LLM 微調(diào)的 LLaMA Board 系統(tǒng)
LLaMA Factory 支持 Alpaca 和 ShareGPT 兩種數(shù)據(jù)集的格式,這里我們將上面使用蒙卡 + LLM 生成的數(shù)據(jù)集處理為 ShareGPT 格式。下面就是個 ShareGPT 格式包含功能調(diào)用內(nèi)容的數(shù)據(jù)例子,其中 conversations 中是對話歷史,tools 是當(dāng)前對話中所有可用的工具。

為了保證不同的意圖和槽位能被相對準(zhǔn)確的識別到,根據(jù)實踐經(jīng)驗我們認(rèn)為訓(xùn)練數(shù)據(jù)量需要滿足意圖數(shù) x 槽位數(shù) x 500 的規(guī)模。這里我們構(gòu)造了 5 個任務(wù),分別是根據(jù)實時匯率轉(zhuǎn)換貨幣金額,了解某個地區(qū)的習(xí)俗和文化特點,根據(jù)用戶的位置或興趣,推薦附近的博物館,根據(jù)自己的位置、興趣和預(yù)算,推薦當(dāng)?shù)氐牟蛷d以及查詢?nèi)ツ硞€目的地的交通方式。每個意圖包含 2 至 3 個槽位,共生成了 6000 條左右的數(shù)據(jù),覆蓋了 5 個任務(wù)大部分用戶狀態(tài)變化路徑,接下來將對微調(diào)訓(xùn)練的部分進(jìn)行詳細(xì)的介紹。
實驗配置及結(jié)果
本文選擇在 A6000 顯卡上進(jìn)行微調(diào),微調(diào)精度選擇 fp16,LoRA Rank 設(shè)置為 4,訓(xùn)練 3 個 Epoch。在不使用 flash attention 加速時整個訓(xùn)練過程耗時 1.5h 左右,對于 6B - 7B 的模型,顯存占用在 20 - 22G 左右。實驗對象包括目前市面上主流的開源模型,ChatGLM3 6B,Qwen 1.5 7B,Yi 6B 系列的 Chat 模型和 Base 模型。在額外構(gòu)造了 100 個驗證對話集對模型進(jìn)行評估之后,這里將微調(diào)前的 Qwen 1.5 Chat 模型作為基線對比了不同模型微調(diào)后的表現(xiàn),
表 1. 不同基模型的微調(diào)結(jié)果對比

從對比結(jié)果可以發(fā)現(xiàn),經(jīng)過我們微調(diào)后的 Qwen 1.5 Chat 模型在整體性能上表現(xiàn)最佳,相對于 Baseline(微調(diào)前的 Qwen 1.5 Chat 模型),除了微調(diào)不成功的 ChatGLM3 之外,性能上都有比較顯著的提升。Qwen 1.5 的意圖召回率略高于 Qwen 1.5 Chat 的原因是 Qwen 1.5 出現(xiàn)幻覺的概率較高,在給出 Tools 之后,沒有明顯調(diào)用工具的提問也較容易觸發(fā)工具調(diào)用。
對比一下 Qwen 1.5 Chat 微調(diào)前和微調(diào)后的表現(xiàn),下圖 3 為 Qwen 1.5 Chat 微調(diào)前的對話表現(xiàn),圖 4 為 Qwen 1.5 Chat 經(jīng)過微調(diào)后的對話表現(xiàn)。可以明顯發(fā)現(xiàn)微調(diào)后的模型對于槽位的識別方面提升很大,并且還附加了槽位追問的能力。

圖 3. Qwen 1.5 Chat 微調(diào)前的對話表現(xiàn)

圖 4. Qwen 1.5 Chat 微調(diào)后的對話表現(xiàn)
此外,Agent 對于用戶在對話中省略主語時也能正確的識別槽位信息,如下圖所示,用戶在說「5000 人民幣可以在當(dāng)?shù)剡€多少錢呢」的時候,模型能夠智能的將「當(dāng)?shù)亍购蜕衔闹刑岬降摹妇┒肌孤?lián)系起來,在上下文結(jié)合和理解上的表現(xiàn)上比傳統(tǒng)的 Rasa-like 對話 Agent 表現(xiàn)的更加智能和靈活,達(dá)到了我們的預(yù)期水平。

圖 5. 本文微調(diào)的 Agent 模型超越普通 Rasa-like 對話 Agent 的能力
對比經(jīng)過指令微調(diào)的 Chat 模型和沒有指令微調(diào)過的 Base 模型我們還發(fā)現(xiàn),經(jīng)過指令微調(diào)的 Chat 模型得到的微調(diào)反饋最佳,特別是經(jīng)過 Agent 相關(guān)指令微調(diào)的 Chat 模型,這主要是這類模型已經(jīng)使用了大量包括 Function Calling 的語料進(jìn)行了訓(xùn)練,我們在此基礎(chǔ)上進(jìn)行微調(diào)實際上屬于同方向的增量學(xué)習(xí),需要 Agent 額外的學(xué)習(xí)成本更小。
結(jié)論
本文提出了一種利用蒙卡方法和 LLM 生成訓(xùn)練數(shù)據(jù)集,并將其與 LLaMA Factory 框架相結(jié)合,高效微調(diào)多種語言模型,構(gòu)建任務(wù)型對話 Agent 的新穎方案。該方案不僅保留了大語言模型強(qiáng)大的理解和生成能力,而且顯著提高了微調(diào)后模型在意圖識別、槽位填充等關(guān)鍵任務(wù)上的性能表現(xiàn)。
與傳統(tǒng)的模塊化對話系統(tǒng)相比,本文方法構(gòu)建的端到端 Agent 架構(gòu)更加簡潔高效,易于部署和維護(hù)。實驗結(jié)果表明,經(jīng)過微調(diào)的語言模型不僅能夠準(zhǔn)確識別用戶意圖和關(guān)鍵信息,還能根據(jù)上下文理解用戶的省略表達(dá),并在必要時主動追問槽位信息,相較于微調(diào)前的模型,展現(xiàn)出更強(qiáng)的理解和交互能力,相較于傳統(tǒng)的模型,展現(xiàn)出了更多的智能性。
盡管如此,該方案仍然存在一定的不足,首先在數(shù)據(jù)集的構(gòu)建方面,靠人腦整理的行為狀態(tài)圖很難考慮到所有可能的用戶路徑,建模的過程十分耗時。在 Agent 微調(diào)方面,準(zhǔn)確率還有待進(jìn)一步提高,因為是 E2E 的系統(tǒng),整體的可控性和可解釋性相對較差。
未來我們的工作重點將包括:
- 優(yōu)化數(shù)據(jù)集生成方法,例如結(jié)合蒙特卡羅樹搜索(MCTS)和評分模型的方案對對話狀態(tài)空間進(jìn)行探索和篩選。
- 進(jìn)一步優(yōu)化微調(diào)方法、探索提高模型可解釋性的技術(shù)路線等,以期在保持語言模型強(qiáng)大能力的同時,進(jìn)一步增強(qiáng)任務(wù)型對話 Agent 的性能和可靠性。


























