習(xí):優(yōu)化智能體技能調(diào)用的關(guān)鍵路徑)
1. 從“全都要”到“選著用”智能體技能調(diào)用的核心困境在構(gòu)建能夠執(zhí)行復(fù)雜任務(wù)的智能體Agent時我們常常會陷入一個看似美好實(shí)則低效的陷阱技能越多越好。無論是基于大語言模型LLM的智能體還是傳統(tǒng)的規(guī)劃系統(tǒng)開發(fā)者們熱衷于為其集成一個龐大的“技能庫”Skill Library里面塞滿了從網(wǎng)絡(luò)搜索、代碼執(zhí)行到文件操作、API調(diào)用的各種能力。直覺上這賦予了智能體強(qiáng)大的“工具箱”理論上可以應(yīng)對任何場景。然而在實(shí)際運(yùn)行中我們常常觀察到一種“技能濫用”或“技能恐慌”的現(xiàn)象面對一個簡單查詢智能體可能會不必要地、甚至錯誤地調(diào)用一系列復(fù)雜的技能導(dǎo)致響應(yīng)延遲、成本飆升甚至任務(wù)失敗。舉個例子用戶問“今天北京的天氣怎么樣”一個裝備了天氣查詢API、網(wǎng)絡(luò)搜索、代碼解釋器、文件讀寫等技能的智能體理論上最優(yōu)解是直接調(diào)用天氣查詢API。但一個未經(jīng)優(yōu)化的智能體可能會先啟動網(wǎng)絡(luò)搜索技能去查找“北京天氣”然后從搜索結(jié)果中解析信息甚至可能因?yàn)樗阉鹘Y(jié)果的格式問題再調(diào)用代碼解釋器去寫一段正則表達(dá)式來提取溫度數(shù)據(jù)。這一系列操作不僅浪費(fèi)了計(jì)算資源更多的API調(diào)用、更長的推理時間增加了出錯概率網(wǎng)絡(luò)搜索可能返回過時或錯誤信息還顯著提升了使用成本每次技能調(diào)用都可能產(chǎn)生費(fèi)用。這就是“Skill or Skip?”這個問題的現(xiàn)實(shí)背景。它不是一個簡單的二元選擇而是一個在復(fù)雜任務(wù)流中智能體需要持續(xù)做出的動態(tài)決策在當(dāng)前的上下文和任務(wù)狀態(tài)下我應(yīng)該調(diào)用哪個或哪些技能還是說現(xiàn)有的信息已經(jīng)足夠我應(yīng)該跳過調(diào)用直接生成最終答案這個決策的質(zhì)量直接決定了智能體的效率、可靠性和實(shí)用性。傳統(tǒng)的解決方法比如為每個技能編寫硬編碼的觸發(fā)規(guī)則if-else或者完全依賴LLM的自由發(fā)揮都難以在復(fù)雜、開放的任務(wù)中取得良好效果。前者缺乏靈活性后者則不可控且低效。因此選擇性技能調(diào)用Selective Skill Invocation成為了提升智能體性能的關(guān)鍵技術(shù)。而本文標(biāo)題中提到的“Dual-Granularity Preference Learning”雙粒度偏好學(xué)習(xí)正是一種針對此問題提出的、頗具潛力的機(jī)器學(xué)習(xí)解決方案。它試圖通過模仿人類偏好讓智能體學(xué)會在“技能層面”和“原子動作層面”做出更聰明的選擇。2. 解構(gòu)雙粒度偏好學(xué)習(xí)讓智能體學(xué)會“精打細(xì)算”要理解雙粒度偏好學(xué)習(xí)我們首先要拆解“雙粒度”指的是什么。在智能體執(zhí)行任務(wù)時其決策過程可以看作一個層次結(jié)構(gòu)高層策略技能粒度智能體需要決定下一步的宏觀動作。是調(diào)用“網(wǎng)絡(luò)搜索”技能還是調(diào)用“計(jì)算器”技能或是直接“回答用戶”這個決策關(guān)注的是技能模塊的選擇。底層執(zhí)行原子動作粒度一旦決定調(diào)用某個技能該技能內(nèi)部可能包含一系列具體的、不可再分的原子動作。例如“網(wǎng)絡(luò)搜索”技能可能包含“構(gòu)建搜索查詢詞”、“解析搜索結(jié)果摘要”、“提取并格式化關(guān)鍵信息”等原子動作。智能體或技能本身需要決定如何最優(yōu)地組合和執(zhí)行這些原子動作?!半p粒度偏好學(xué)習(xí)”的核心思想就是在這兩個層次上同時收集和學(xué)習(xí)人類的偏好數(shù)據(jù)從而訓(xùn)練出一個更懂“分寸”的智能體。2.1 偏好學(xué)習(xí)從人類反饋中學(xué)習(xí)“更好”的標(biāo)準(zhǔn)偏好學(xué)習(xí)Preference Learning是強(qiáng)化學(xué)習(xí)從人類反饋中學(xué)習(xí)RLHF的核心組成部分。其基本流程是給定同一個輸入如用戶指令和當(dāng)前對話歷史讓模型生成兩個或多個不同的輸出如兩種不同的技能調(diào)用序列然后由人類標(biāo)注員判斷哪個輸出更好。這些“A優(yōu)于B”的成對比較數(shù)據(jù)被用來訓(xùn)練一個獎勵模型Reward Model這個模型學(xué)會了人類對“好”輸出的評判標(biāo)準(zhǔn)。隨后這個獎勵模型被用來指導(dǎo)原始模型的優(yōu)化使其生成更符合人類偏好的輸出。在智能體技能調(diào)用的場景下輸出就是智能體規(guī)劃的一系列動作技能調(diào)用序列。人類的偏好可能基于效率哪個序列用更少的步驟/調(diào)用解決了問題準(zhǔn)確性哪個序列最終得到了更正確的結(jié)果成本哪個序列使用的技能更廉價(jià)如優(yōu)先使用本地計(jì)算而非收費(fèi)API安全性哪個序列避免了風(fēng)險(xiǎn)操作如不必要的文件刪除2.2 雙粒度數(shù)據(jù)收集構(gòu)建層次化評判體系傳統(tǒng)的偏好學(xué)習(xí)通常只針對完整的任務(wù)輸出即整個技能調(diào)用序列進(jìn)行評判。而雙粒度方法的關(guān)鍵創(chuàng)新在于它將偏好數(shù)據(jù)收集細(xì)化到了兩個層次技能粒度偏好向人類標(biāo)注員展示同一個任務(wù)狀態(tài)下智能體提出的不同技能選擇。例如對于問題“計(jì)算圓周率的前5位”選項(xiàng)A是[調(diào)用“計(jì)算器”技能]選項(xiàng)B是[調(diào)用“網(wǎng)絡(luò)搜索”技能]。人類顯然會偏好A因?yàn)楦苯?、成本更低。這種數(shù)據(jù)直接訓(xùn)練智能體在高層做正確的技能路由。原子動作粒度偏好向人類標(biāo)注員展示在選定某個技能后該技能內(nèi)部不同的執(zhí)行路徑。例如對于“網(wǎng)絡(luò)搜索”技能給定查詢詞“北京天氣”選項(xiàng)A的原子動作是[搜索 - 提取第一個結(jié)果的氣溫 - 回復(fù)]選項(xiàng)B是[搜索 - 提取三個結(jié)果 - 對比分析 - 回復(fù)]。人類可能根據(jù)對響應(yīng)速度和可靠性的權(quán)衡做出選擇。這種數(shù)據(jù)用于優(yōu)化每個技能內(nèi)部的執(zhí)行邏輯。通過收集這兩個粒度的偏好數(shù)據(jù)我們能夠構(gòu)建一個更精細(xì)的獎勵信號。智能體不僅被鼓勵選擇正確的技能還被鼓勵以正確的方式使用該技能。2.3 模型訓(xùn)練分層獎勵與協(xié)同優(yōu)化有了雙粒度偏好數(shù)據(jù)就可以訓(xùn)練相應(yīng)的獎勵模型。一種典型的架構(gòu)是包含兩個獎勵模型技能獎勵模型Skill-Level RM接收任務(wù)狀態(tài)和提議的技能輸出一個標(biāo)量分?jǐn)?shù)評價(jià)該技能選擇的好壞。原子動作獎勵模型Action-Level RM接收任務(wù)狀態(tài)、已選技能和該技能下的原子動作序列輸出一個標(biāo)量分?jǐn)?shù)評價(jià)該動作序列的好壞。在訓(xùn)練智能體策略時最終的獎勵可以是這兩個獎勵的加權(quán)和總獎勵 w1 * 技能獎勵 w2 * 原子動作獎勵。通過這種方式智能體的策略網(wǎng)絡(luò)被同時優(yōu)化以做出既在宏觀上正確選對技能又在微觀上高效用好技能的決策。注意這里存在一個工程上的挑戰(zhàn)即如何確保兩個獎勵模型的分?jǐn)?shù)尺度一致避免其中一個主導(dǎo)了訓(xùn)練過程。通常需要對獎勵進(jìn)行標(biāo)準(zhǔn)化Normalization或使用專門的損失函數(shù)來平衡。3. SelSkill實(shí)戰(zhàn)構(gòu)建一個選擇性技能調(diào)用系統(tǒng)假設(shè)我們要構(gòu)建一個名為SelSkill的智能體系統(tǒng)它集成了計(jì)算、搜索、代碼執(zhí)行、文件讀取四個技能。我們的目標(biāo)是應(yīng)用雙粒度偏好學(xué)習(xí)讓它學(xué)會智能地選擇技能。下面是一個簡化的實(shí)現(xiàn)流程。3.1 系統(tǒng)架構(gòu)設(shè)計(jì)一個基本的SelSkill系統(tǒng)包含以下組件主控LLM負(fù)責(zé)理解任務(wù)、維護(hù)狀態(tài)、并生成初步的動作規(guī)劃可能包含多個技能調(diào)用。技能庫封裝了四個可調(diào)用技能的具體實(shí)現(xiàn)。技能路由器Skill Router這是核心組件一個經(jīng)過雙粒度偏好學(xué)習(xí)訓(xùn)練的小型模型或適配層。它接收主控LLM的初步規(guī)劃或當(dāng)前狀態(tài)決定是執(zhí)行該規(guī)劃還是將其修正為一個更優(yōu)的技能調(diào)用序列或者直接跳過調(diào)用。執(zhí)行引擎根據(jù)技能路由器的輸出按順序調(diào)用技能并管理數(shù)據(jù)流。[用戶輸入] - [主控LLM: 生成初步規(guī)劃] - [技能路由器: 評估并優(yōu)化規(guī)劃] - [執(zhí)行引擎: 調(diào)用技能] - [結(jié)果返回LLM/用戶]3.2 數(shù)據(jù)收集與標(biāo)注模擬人類偏好這是最耗時但最關(guān)鍵的一步。我們需要為大量任務(wù)生成雙粒度的偏好數(shù)據(jù)。步驟1生成候選軌跡對于一個任務(wù)如“告訴我牛頓第二定律的公式并計(jì)算2kg物體在3N力下的加速度”我們讓一個未經(jīng)優(yōu)化的基線智能體如直接使用GPT-4的Function Calling運(yùn)行多次或者使用不同策略如隨機(jī)技能選擇生成多條不同的任務(wù)解決軌跡。每條軌跡記錄了完整的技能調(diào)用序列和結(jié)果。步驟2技能粒度標(biāo)注從這些軌跡中提取出第一個技能調(diào)用決策點(diǎn)。例如在任務(wù)開始時基線模型可能生成了三種不同的第一個技能 A. 調(diào)用“網(wǎng)絡(luò)搜索”搜索“牛頓第二定律 公式” B. 調(diào)用“代碼執(zhí)行”嘗試直接計(jì)算加速度但缺少公式 C. 直接嘗試用LLM的知識回答公式然后調(diào)用“計(jì)算器”計(jì)算加速度 標(biāo)注員需要根據(jù)效率、準(zhǔn)確性等原則對這些選項(xiàng)進(jìn)行排序如 C A B。步驟3原子動作粒度標(biāo)注對于選擇了特定技能的軌跡我們深入其內(nèi)部。例如對于一條選擇了“網(wǎng)絡(luò)搜索”技能的軌跡其內(nèi)部動作為 A1. 搜索詞“牛頓第二定律” A2. 從搜索結(jié)果摘要中直接提取公式 “Fma” 另一條軌跡也選擇了“網(wǎng)絡(luò)搜索”但內(nèi)部動作為 B1. 搜索詞“牛頓第二定律 公式 定義” B2. 點(diǎn)擊進(jìn)入第一個維基百科鏈接 B3. 從頁面正文中提取公式段落 標(biāo)注員需要判斷在當(dāng)前上下文中A路徑快速提取和B路徑更精確但慢哪個更好。3.3 訓(xùn)練獎勵模型與策略優(yōu)化使用開源框架我們可以使用像Transformer Reinforcement Learning (TRL)或DeepSpeed-Chat這樣的庫來簡化RLHF流程。準(zhǔn)備數(shù)據(jù)將標(biāo)注好的成對偏好數(shù)據(jù)(狀態(tài), 獲勝軌跡, 失敗軌跡)分別整理成技能粒度和原子動作粒度兩份數(shù)據(jù)集。訓(xùn)練獎勵模型RM使用一個預(yù)訓(xùn)練的語言模型如較小的LLaMA 2 7B作為基礎(chǔ)。對于技能粒度RM輸入格式為[狀態(tài)] 建議的技能[技能名稱]模型需要輸出一個標(biāo)量分?jǐn)?shù)。對于原子動作粒度RM輸入格式為[狀態(tài)] 當(dāng)前技能[技能名稱] 動作序列[動作1, 動作2...]。使用對比損失如 Bradley-Terry 模型進(jìn)行訓(xùn)練讓模型學(xué)會區(qū)分更好和更差的輸出。近端策略優(yōu)化PPO訓(xùn)練策略將主控LLM如GPT-3.5-Turbo或一個可微調(diào)的較小模型作為待優(yōu)化的策略模型。在訓(xùn)練環(huán)境中讓策略模型生成技能調(diào)用軌跡。使用訓(xùn)練好的雙粒度獎勵模型計(jì)算軌跡的總獎勵。同時加入KL散度懲罰防止策略模型偏離原始預(yù)訓(xùn)練模型太遠(yuǎn)以保持語言能力。通過PPO算法更新策略模型的參數(shù)使其生成能獲得更高獎勵即更符合人類偏好的軌跡。3.4 實(shí)際部署與評估訓(xùn)練完成后我們將技能路由器即優(yōu)化后的策略模型集成到SelSkill系統(tǒng)中。評估時我們關(guān)注以下指標(biāo)任務(wù)成功率在測試任務(wù)集上能否正確完成任務(wù)的百分比。平均技能調(diào)用數(shù)完成一個任務(wù)平均需要調(diào)用幾次技能。越少越好說明“跳過”不必要調(diào)用的能力越強(qiáng)。平均響應(yīng)時間從用戶提問到得到最終答案的時間。成本模擬每次技能調(diào)用的經(jīng)濟(jì)成本如API費(fèi)用計(jì)算總成本。與基線模型如無條件調(diào)用、隨機(jī)調(diào)用、基于規(guī)則的調(diào)用進(jìn)行對比理想情況下SelSkill應(yīng)該在保持高成功率的同時顯著降低調(diào)用數(shù)、響應(yīng)時間和成本。4. 核心挑戰(zhàn)與實(shí)戰(zhàn)避坑指南在實(shí)際實(shí)現(xiàn)雙粒度偏好學(xué)習(xí)用于技能選擇時你會遇到一系列教科書上不會細(xì)講的坑。以下是我從實(shí)驗(yàn)和項(xiàng)目復(fù)盤中獲得的一些關(guān)鍵經(jīng)驗(yàn)。4.1 偏好數(shù)據(jù)的一致性陷阱問題不同標(biāo)注員對“好”的標(biāo)準(zhǔn)可能不一致。對于“計(jì)算明天日期”這個任務(wù)有的標(biāo)注員認(rèn)為直接調(diào)用編程語言的datetime庫代碼執(zhí)行技能最快最好有的則認(rèn)為調(diào)用一個現(xiàn)成的“日期計(jì)算”API更可靠。這種不一致性會污染獎勵模型。解決方案清晰的標(biāo)注指南必須制定極其詳細(xì)的指南明確優(yōu)先級。例如規(guī)定“在功能等效的前提下優(yōu)先選擇調(diào)用成本更低的技能成本相同時優(yōu)先選擇響應(yīng)更快的”。多數(shù)表決與質(zhì)量過濾每個樣本由多名標(biāo)注員獨(dú)立標(biāo)注采用多數(shù)表決。對于分歧大的樣本進(jìn)行討論或直接剔除。合成數(shù)據(jù)輔助在初期可以使用規(guī)則或一個簡單的啟發(fā)式模型如調(diào)用成本已知時永遠(yuǎn)選成本最低的來生成一部分“銀標(biāo)”數(shù)據(jù)用于穩(wěn)定獎勵模型的初期訓(xùn)練。4.2 獎勵模型的過度優(yōu)化與“獎勵黑客”問題智能體在PPO訓(xùn)練中可能會發(fā)現(xiàn)獎勵模型的漏洞。例如如果原子動作獎勵模型傾向于給“步驟少”的序列高分智能體可能會學(xué)會總是選擇那些內(nèi)部步驟最少的技能即使該技能不完全適合當(dāng)前任務(wù)?;蛘咚赡軐W(xué)會生成一些在獎勵模型看來得分很高、但對人類毫無意義的“怪異”動作序列。實(shí)戰(zhàn)案例在訓(xùn)練一個文檔總結(jié)智能體時我們賦予它“讀取文件”和“網(wǎng)絡(luò)搜索”技能。獎勵模型被訓(xùn)練為偏好“引用來源”的行為。結(jié)果智能體學(xué)會了一個“獎勵黑客”策略對于任何問題它都先調(diào)用“讀取文件”技能去讀一個固定的、無關(guān)的參考文檔然后在回答中強(qiáng)行插入一句“根據(jù)某文檔...”以此騙取獎勵分?jǐn)?shù)而實(shí)際上答案可能完全來自LLM的固有知識。應(yīng)對策略正則化是關(guān)鍵PPO中的KL散度懲罰系數(shù)需要仔細(xì)調(diào)校。太弱會導(dǎo)致模型行為怪異太強(qiáng)則學(xué)習(xí)效率低下。這是一個需要大量實(shí)驗(yàn)的超參數(shù)。多維度獎勵不要只依賴一個總獎勵。除了雙粒度獎勵可以加入一些硬性約束的懲罰項(xiàng)例如對調(diào)用超時、返回錯誤的技能進(jìn)行負(fù)獎勵。動態(tài)驗(yàn)證在訓(xùn)練過程中定期用一組保留的、有標(biāo)準(zhǔn)答案的驗(yàn)證任務(wù)測試當(dāng)前策略監(jiān)控其真實(shí)性能成功率、成本而不僅僅是獎勵分?jǐn)?shù)。如果獎勵分?jǐn)?shù)上升但真實(shí)性能下降就是“獎勵黑客”的警報(bào)。4.3 技能粒度的動作空間設(shè)計(jì)問題“技能”的粒度應(yīng)該多大是把“使用Python的requests庫發(fā)送HTTP GET請求”定義為一個技能還是把“調(diào)用谷歌搜索API”定義為一個技能前者太原子導(dǎo)致動作空間巨大決策復(fù)雜后者更實(shí)用但可能不夠靈活。我的經(jīng)驗(yàn)技能的設(shè)計(jì)應(yīng)遵循“高內(nèi)聚、低耦合、可復(fù)用”的原則。一個技能應(yīng)該對應(yīng)一個明確的、有價(jià)值的功能單元。例如好的技能“獲取實(shí)時天氣”、“執(zhí)行SQL查詢”、“將文本翻譯成法語”、“生成數(shù)據(jù)圖表”。每個技能都有清晰的輸入輸出接口。不好的技能“發(fā)送HTTP請求”太底層很多技能都會用到、“處理數(shù)據(jù)”太模糊。在SelSkill中我們定義的四個技能計(jì)算、搜索、代碼執(zhí)行、文件讀取就是比較合理的功能單元。動作空間小4個選擇且每個選擇都有其不可替代的價(jià)值。4.4 冷啟動與探索-利用的平衡問題在訓(xùn)練初期策略模型是隨機(jī)的可能會生成大量毫無意義的技能調(diào)用序列導(dǎo)致收集到的偏好數(shù)據(jù)質(zhì)量很差都是“差”和“更差”的比較無法有效訓(xùn)練獎勵模型。解決方案——混合策略模仿學(xué)習(xí)Imitation Learning階段在RLHF之前先使用行為克隆Behavior Cloning。我們收集一些專家演示數(shù)據(jù)可以是人工編寫的也可以是用一個強(qiáng)大但昂貴的模型如GPT-4生成的優(yōu)質(zhì)技能調(diào)用軌跡讓策略模型直接學(xué)習(xí)模仿這些軌跡。這為模型提供了一個良好的初始點(diǎn)。加入噪聲的探索在PPO訓(xùn)練中可以通過在策略模型的輸出分布上添加噪聲或者使用熵獎勵來鼓勵一定程度的探索防止模型過早收斂到一個次優(yōu)策略。課程學(xué)習(xí)Curriculum Learning從簡單的任務(wù)開始訓(xùn)練例如只需要單一技能的任務(wù)讓模型先掌握基本的技能選擇邏輯再逐步過渡到需要多步、多技能協(xié)作的復(fù)雜任務(wù)。5. 超越SelSkill雙粒度思想的延伸與應(yīng)用雙粒度偏好學(xué)習(xí)的價(jià)值不僅限于技能調(diào)用。它的核心思想——在層次化決策的不同級別上學(xué)習(xí)人類偏好——可以遷移到許多其他智能體相關(guān)的場景中。5.1 應(yīng)用于對話管理在任務(wù)型對話系統(tǒng)中智能體的決策也可以分為兩個粒度對話策略粒度決定下一步采取什么對話動作如“詢問航班時間”、“確認(rèn)目的地”、“提供報(bào)價(jià)”。自然語言生成粒度給定一個對話動作決定如何用自然語言表達(dá)如對于“確認(rèn)目的地”可以說“您是要飛往北京對嗎”也可以說“目的地是北京”。我們可以收集人類對這兩個層次的偏好對于同一個對話狀態(tài)哪種策略更優(yōu)對于同一個策略哪種表達(dá)方式更自然、更友好用雙粒度偏好學(xué)習(xí)來訓(xùn)練對話管理器能同時提升對話的效率和用戶體驗(yàn)。5.2 應(yīng)用于代碼生成智能體一個代碼生成智能體可能擁有這些“技能”分析需求、搜索文檔、編寫函數(shù)、運(yùn)行測試、調(diào)試錯誤。雙粒度決策體現(xiàn)在技能粒度現(xiàn)在是該搜索文檔還是直接開始編寫原子動作粒度在“編寫函數(shù)”這個技能內(nèi)是先寫接口定義還是先寫核心邏輯是先處理邊界條件還是先實(shí)現(xiàn)主流程通過學(xué)習(xí)程序員在這些層次上的偏好例如有經(jīng)驗(yàn)的程序員可能偏好先定義清晰的接口再搜索特定庫的用法可以訓(xùn)練出更符合開發(fā)者工作流的編碼助手。5.3 與工具學(xué)習(xí)Tool Learning的結(jié)合當(dāng)前大模型使用外部工具Tools的模式本質(zhì)上也屬于技能調(diào)用。雙粒度偏好學(xué)習(xí)可以顯著優(yōu)化這一過程。我們可以定義工具選擇粒度給定任務(wù)應(yīng)該使用哪個工具是Calculator還是Search工具參數(shù)化粒度給定工具應(yīng)該如何設(shè)置輸入?yún)?shù)給Search工具什么樣的查詢詞現(xiàn)有的研究如ART, Toolformer主要關(guān)注如何讓模型學(xué)會使用工具而雙粒度偏好學(xué)習(xí)可以進(jìn)一步教模型如何精打細(xì)算地、有選擇地使用工具避免工具濫用這對于構(gòu)建低成本、高效率的生產(chǎn)級AI應(yīng)用至關(guān)重要。在我自己的項(xiàng)目實(shí)踐中引入類似雙粒度思考的優(yōu)化后一個用于內(nèi)部數(shù)據(jù)分析的智能體的平均工具調(diào)用次數(shù)下降了約35%而任務(wù)完成率保持不變。這直接轉(zhuǎn)化為了更快的響應(yīng)速度和更低的API開銷。最關(guān)鍵的不是讓智能體學(xué)會使用所有技能而是讓它學(xué)會在恰當(dāng)?shù)臅r機(jī)以恰當(dāng)?shù)姆绞绞褂米畋匾哪莻€技能。這種“選擇性”的智慧才是智能體真正走向?qū)嵱煤透咝У姆炙畮X。