習(xí):上下文學(xué)習(xí)原理及提示詞設(shè)計(jì)實(shí)戰(zhàn))
零樣本學(xué)習(xí)、少樣本學(xué)習(xí)這兩個(gè)詞在自然語(yǔ)言處理相關(guān)的話題里出現(xiàn)頻率越來(lái)越高而它們的底層機(jī)制就是上下文學(xué)習(xí)。所謂上下文學(xué)習(xí)簡(jiǎn)單說(shuō)就是把任務(wù)說(shuō)明、示范樣例、待處理內(nèi)容一起拼成一段輸入交給模型讓它在一次推理中完成“理解任務(wù)、模仿格式、生成答案”的全過(guò)程。你可能早就用過(guò)這種能力了——讓模型從一份會(huì)議紀(jì)要里提取待辦事項(xiàng)給它兩個(gè)已經(jīng)整理好的表格樣例它就能照著輸出這屬于少樣本不給樣例只交代一句“請(qǐng)?zhí)崛〈k事項(xiàng)并以表格形式輸出”這屬于零樣本。而兩者共同指向的能力恰恰是當(dāng)前大模型最值錢的部分通過(guò)上下文學(xué)習(xí)提升推理能力讓一個(gè)沒(méi)有為特定任務(wù)訓(xùn)練過(guò)的模型像老員工一樣拿著臨時(shí)需求就能上手干活。這篇文章適合誰(shuí)看如果你正在用大模型做文本抽取、數(shù)據(jù)清洗、格式轉(zhuǎn)換、邏輯推理或者你只是想知道為什么“在提示詞里塞幾個(gè)例子”比辛辛苦苦微調(diào)還管用那這篇內(nèi)容可以幫你省不少試錯(cuò)時(shí)間。我會(huì)從概念拆起講清楚上下文學(xué)習(xí)為什么能替代微調(diào)再給出模型行為背后的機(jī)制最后用一套可復(fù)現(xiàn)的實(shí)操流程說(shuō)完少樣本提示的設(shè)計(jì)、調(diào)參與避坑經(jīng)驗(yàn)。1. 從“訓(xùn)練一套模型”到“用一次推理”范式轉(zhuǎn)變1.1 零樣本、少樣本到底在說(shuō)什么傳統(tǒng)做自然語(yǔ)言任務(wù)的方式和現(xiàn)在完全不是一種思路。幾年前你想做一個(gè)“用戶評(píng)論情感分類”的功能流程基本是采集幾千條標(biāo)注評(píng)論選一個(gè)預(yù)訓(xùn)練模型在模型上加一個(gè)分類頭跑幾個(gè) epoch 的微調(diào)然后部署一個(gè)專屬于你這個(gè)任務(wù)的模型。換一個(gè)任務(wù)比如從“情感分類”換成“投訴類型識(shí)別”又是一輪新的數(shù)據(jù)標(biāo)注和訓(xùn)練。整個(gè)模式的核心是“每個(gè)任務(wù)訓(xùn)練一套模型”。大模型時(shí)代的思路完全不同。因?yàn)槟P鸵呀?jīng)在海量文本上做了預(yù)訓(xùn)練它內(nèi)部其實(shí)已經(jīng)積累了極其豐富的語(yǔ)言模式和任務(wù)模式。你現(xiàn)在要做的事情不是再教它一遍怎么分類而是想辦法把“想做哪個(gè)任務(wù)”這個(gè)意圖傳給它。零樣本學(xué)習(xí)就是你只給一段任務(wù)描述和待處理內(nèi)容不給任何輸入輸出樣例模型直接給出結(jié)果。比如任務(wù)判斷下面這條用戶反饋屬于“物流問(wèn)題”“質(zhì)量投訴”還是“其他”并給出理由。 反饋快遞到了三天還沒(méi)派送聯(lián)系客服也沒(méi)人理。 輸出模型會(huì)輸出“物流問(wèn)題。理由反饋中提到快遞未及時(shí)派送且客服未響應(yīng)?!边@是零樣本因?yàn)樗鼪](méi)有看過(guò)任何該任務(wù)的樣例。少樣本學(xué)習(xí)則是給模型幾個(gè)輸入輸出對(duì)作為示范再讓它處理新輸入。比如你先給它兩條已經(jīng)分好類的反饋再讓它對(duì)第三條進(jìn)行分類。同樣的任務(wù)多了兩個(gè)示例模型的輸出格式會(huì)穩(wěn)定很多分類依據(jù)也更貼近你期望的粒度。這種“給幾個(gè)例子就能接手任務(wù)”的能力本質(zhì)上就是上下文學(xué)習(xí)——你并沒(méi)有更新模型參數(shù)只是把示例和任務(wù)描述作為上下文放了進(jìn)去讓模型從條件概率分布中找到了你想要的輸出路徑。一個(gè)比較貼切的類比零樣本是讓一個(gè)新同事只聽(tīng)了目標(biāo)描述就直接干活少樣本是讓他看了兩份已經(jīng)完成的工作記錄再動(dòng)手。他沒(méi)有專門接受過(guò)你這套流程的培訓(xùn)但憑著過(guò)去積累的經(jīng)驗(yàn)基本能交出合格的東西。1.2 上下文學(xué)習(xí)為什么能替代微調(diào)很多人第一次看到少樣本效果時(shí)都會(huì)有一個(gè)疑問(wèn)模型參數(shù)都沒(méi)動(dòng)它憑什么“學(xué)會(huì)”了任務(wù)先說(shuō)成本。微調(diào)相當(dāng)于把一個(gè)人送去參加兩周封閉培訓(xùn)班貴、慢、而且每換一個(gè)任務(wù)就得重新培訓(xùn)。上下文學(xué)習(xí)相當(dāng)于開(kāi)工前給老員工做五分鐘情況說(shuō)明成本幾乎為零不需要準(zhǔn)備訓(xùn)練集也不需要重新部署模型只改提示詞就行。對(duì)于很多臨時(shí)性、格式多變的長(zhǎng)尾任務(wù)比如把用戶發(fā)來(lái)的雜亂截圖信息整理成結(jié)構(gòu)化 JSON、從合同文本里抽取關(guān)鍵條款、把一段口語(yǔ)轉(zhuǎn)寫成正式公文上下文學(xué)習(xí)的性價(jià)比遠(yuǎn)遠(yuǎn)超過(guò)微調(diào)。再說(shuō)機(jī)制。模型預(yù)訓(xùn)練階段見(jiàn)過(guò)的文本里存在大量“任務(wù)描述 示范 回答”的結(jié)構(gòu)。推理時(shí)提示詞把這些結(jié)構(gòu)重新激活了模型不是在獲取新知識(shí)而是在它已有的能力矩陣?yán)镎液线m的行為模式。你可以把上下文學(xué)習(xí)理解成一種“推理時(shí)的模式檢索”示例中的輸入輸出對(duì)定義了一個(gè)局部規(guī)律自注意力機(jī)制讓新的輸入與這些示例在表征空間里對(duì)齊從而把輸出分布拉向正確的方向。當(dāng)然上下文學(xué)習(xí)也不是萬(wàn)能的。如果業(yè)務(wù)邏輯需要持續(xù)穩(wěn)定地存在比如一個(gè)每天被調(diào)用幾百萬(wàn)次的固定抽取服務(wù)微調(diào)仍然是更穩(wěn)的選擇如果任務(wù)依賴大量私有領(lǐng)域知識(shí)比如內(nèi)部文檔規(guī)范、獨(dú)家產(chǎn)品信息上下文學(xué)習(xí)的效果會(huì)明顯受限這時(shí)候更適合接檢索增強(qiáng)或者做領(lǐng)域微調(diào)。搞清楚這個(gè)邊界你就知道什么時(shí)候該用提示詞什么時(shí)候該老老實(shí)實(shí)去訓(xùn)練。2. 上下文學(xué)習(xí)的工作原理與關(guān)鍵機(jī)制2.1 預(yù)訓(xùn)練和自注意力如何撐起上下文學(xué)習(xí)要理解上下文學(xué)習(xí)為什么有效得回到預(yù)訓(xùn)練的兩個(gè)核心產(chǎn)物語(yǔ)言知識(shí)和注意力機(jī)制。預(yù)訓(xùn)練的目標(biāo)很簡(jiǎn)單讓模型根據(jù)前文預(yù)測(cè)下一個(gè)詞。但就是這個(gè)簡(jiǎn)單的目標(biāo)讓模型被迫學(xué)會(huì)了海量文本中的結(jié)構(gòu)規(guī)律一段新聞后面可能跟著評(píng)論一個(gè)問(wèn)題后面可能跟著解答一份說(shuō)明書后面可能跟著操作步驟。當(dāng)你在提示詞里給出“任務(wù) 示例 待處理內(nèi)容”時(shí)模型看到的不是一串孤立的句子而是和它預(yù)訓(xùn)練時(shí)見(jiàn)過(guò)的無(wú)數(shù)文本結(jié)構(gòu)高度相似的模式。它做的也不是“新學(xué)”而是把當(dāng)前輸入映射到最接近的已學(xué)模式上。自注意力機(jī)制在這個(gè)過(guò)程中扮演了“對(duì)表”的角色。在推理過(guò)程中每個(gè) token 都會(huì)和其它所有 token 計(jì)算關(guān)聯(lián)權(quán)重。示例中的輸入部分和真實(shí)輸入越相似注意力分?jǐn)?shù)就越高模型就越傾向于讓真實(shí)輸入“復(fù)用”示例中標(biāo)簽對(duì)應(yīng)的輸出分布。有研究者把上下文學(xué)習(xí)解釋為一種隱式的貝葉斯推斷也有研究認(rèn)為它等價(jià)于在表征空間里做核回歸。這些理論細(xì)節(jié)不必深究但結(jié)論很重要模型確實(shí)是在輸入序列內(nèi)部完成了“按示例調(diào)整輸出分布”的過(guò)程這與梯度更新毫無(wú)關(guān)系。這也是為什么上下文學(xué)習(xí)對(duì)示例質(zhì)量這么敏感。注意力機(jī)制會(huì)放大示例中的特征如果示例本身和目標(biāo)任務(wù)不匹配或者示例內(nèi)部存在矛盾模型很容易把這些噪聲也學(xué)進(jìn)輸出模式里。后面我會(huì)專門講這個(gè)問(wèn)題。2.2 示例數(shù)量、順序和格式的敏感性問(wèn)題上下文學(xué)習(xí)并不總是“示例越多越好”。我自己的實(shí)測(cè)經(jīng)驗(yàn)是很多任務(wù)在 4 到 8 個(gè)示例時(shí)收益最大超過(guò) 8 個(gè)邊際收益會(huì)明顯遞減個(gè)別任務(wù)甚至?xí)霈F(xiàn)效果下滑。原因在于上下文窗口是有限資源示例太多會(huì)把真正要處理的內(nèi)容擠到窗口邊緣注意力權(quán)重更容易分散到無(wú)關(guān)細(xì)節(jié)上。示例的順序也有講究。如果你把同一類標(biāo)簽的示例都堆在一起模型有可能誤以為輸出應(yīng)該按照示例的順序“連坐”。比如三個(gè)“物流問(wèn)題”示例放在前面后面跟著一個(gè)“質(zhì)量投訴”示例模型在處理新輸入時(shí)可能會(huì)更傾向輸出“物流問(wèn)題”因?yàn)樗谧⒁饬ι细壳?、重?fù)次數(shù)更多。更穩(wěn)的做法是讓不同類別的示例交替出現(xiàn)保持標(biāo)簽分布均衡。格式敏感性是最容易被忽略的坑。示例的輸入輸出格式必須和真實(shí)輸入完全一致連分隔符、換行位置都要盡量對(duì)齊。我曾經(jīng)調(diào)試一個(gè)抽取任務(wù)給模型看的示例都是“輸入…… 輸出……”格式但最后測(cè)試時(shí)少寫了“輸出”三個(gè)字模型直接不輸出內(nèi)容白白排查了很久。模型對(duì)格式的執(zhí)著程度超出你的想象它不是在理解你的“意思”而是在統(tǒng)計(jì)你“格式”的模式。所以設(shè)計(jì)示例時(shí)一定要用真實(shí)輸入的樣子去構(gòu)造而不是用一套理想化的模板。2.3 如何設(shè)計(jì)高質(zhì)量示例既然示例這么關(guān)鍵怎么選才靠譜我的建議是四個(gè)原則。第一語(yǔ)義相似。優(yōu)先選擇和目標(biāo)輸入在語(yǔ)義上接近的樣本作為示例。你可以在標(biāo)注樣本集上計(jì)算每個(gè)候選示例和當(dāng)前輸入的語(yǔ)義相似度選出 Top K 個(gè)放進(jìn)提示詞。這樣模型在注意力層更容易對(duì)齊示例與新輸入的表征輸出自然更穩(wěn)。第二類別覆蓋。如果任務(wù)有多個(gè)分類示例里每個(gè)類別至少出現(xiàn)一次而且盡量平衡。否則模型會(huì)傾向于輸出示例中最多的那個(gè)類別這在少樣本場(chǎng)景里尤其致命。第三內(nèi)容正確。示例里的答案必須準(zhǔn)確推理過(guò)程必須完整。有人覺(jué)得少樣本示例可以隨手寫兩條這完全是誤區(qū)。示例就是模型眼中的“標(biāo)準(zhǔn)答案”它會(huì)像模仿字跡一樣模仿示例里的錯(cuò)誤。第四控制長(zhǎng)度。示例不是越長(zhǎng)越好冗長(zhǎng)的示例會(huì)擠占上下文空間也會(huì)引入與任務(wù)無(wú)關(guān)的噪聲。盡量用簡(jiǎn)潔、信息密度高的示例把思考過(guò)程保留下來(lái)把廢話去掉。3. 上下文學(xué)習(xí)如何提升推理能力3.1 少樣本思維鏈讓模型學(xué)會(huì)“先想再做”上下文學(xué)習(xí)價(jià)值最大的應(yīng)用方向之一就是用少樣本方式提升模型的推理能力。這里的關(guān)鍵不是給模型看“輸入-答案”的簡(jiǎn)單對(duì)而是給模型看“輸入-推理過(guò)程-答案”的完整鏈條。這種方法通常被叫做少樣本思維鏈英文是 Chain-of-Thought業(yè)內(nèi)常簡(jiǎn)稱 CoT。只給答案的少樣本在某些推理任務(wù)上幫助不大原因很容易理解模型在模仿“跳躍式結(jié)論”卻沒(méi)有模仿“得出結(jié)論的路徑”。數(shù)學(xué)題尤其明顯。你給模型看兩道題直接寫了答案它大概率學(xué)不會(huì)解題步驟只是憑感覺(jué)猜??梢坏┠憬o它的示例里包含了逐步計(jì)算過(guò)程比如先寫“設(shè)未知數(shù)為 x”再寫“根據(jù)條件列方程”最后寫“解得答案”模型就會(huì)沿著類似的路徑進(jìn)行多步推理。一個(gè)典型的少樣本思維鏈提示模板長(zhǎng)這樣問(wèn)題小明有 3 個(gè)蘋果他又買了 5 個(gè)然后吃掉 2 個(gè)還剩幾個(gè) 推理小明原來(lái)有 3 個(gè)蘋果買來(lái) 5 個(gè)后一共有 3 5 8 個(gè)。吃掉 2 個(gè)后剩下 8 - 2 6 個(gè)。 答案6 問(wèn)題一列火車每小時(shí)行駛 80 公里行駛 2.5 小時(shí)后走了多遠(yuǎn) 推理到“推理”這里截?cái)嘧屇P晚樦纠穆窂嚼^續(xù)生成。模型會(huì)模仿“先計(jì)算后總結(jié)”的結(jié)構(gòu)輸出類似“火車速度為每小時(shí) 80 公里行駛 2.5 小時(shí)距離為 80 × 2.5 200 公里”這樣的內(nèi)容。我踩過(guò)的一個(gè)坑是推理步驟不是越詳細(xì)越好。示例里如果寫了太多與題目無(wú)關(guān)的鋪墊模型會(huì)把那些冗余表達(dá)也學(xué)進(jìn)去反而增加了輸出內(nèi)容的長(zhǎng)度和出錯(cuò)概率。好的 CoT 示例應(yīng)該只保留必要的推導(dǎo)節(jié)點(diǎn)每一行都在推進(jìn)答案。3.2 零樣本也能走向推理指令驅(qū)動(dòng)的逐步思考少樣本思維鏈效果好但有時(shí)候你手頭沒(méi)有合適的示例怎么辦其實(shí)零樣本也能觸發(fā)類似的推理能力方式是在提示詞末尾追加一句引導(dǎo)模型分步思考的話比如“請(qǐng)一步一步思考先寫出推理過(guò)程再給出最終答案”。這種操作在業(yè)內(nèi)常被稱為零樣本思維鏈。它為什么有效因?yàn)轭A(yù)訓(xùn)練語(yǔ)料里存在大量“先分析、再下結(jié)論”的文本結(jié)構(gòu)。模型不需要示例只要指令中出現(xiàn)“逐步思考”這類關(guān)鍵詞就會(huì)激活它見(jiàn)過(guò)無(wú)數(shù)遍的解題文本模式。這不是什么神秘咒語(yǔ)而是對(duì)預(yù)訓(xùn)練分布的一種精準(zhǔn)觸發(fā)。如果你覺(jué)得單次生成的推理結(jié)果不穩(wěn)定還有一個(gè)更穩(wěn)妥的做法讓模型獨(dú)立生成多次每次只生成推理過(guò)程最后對(duì)答案做多數(shù)投票。我實(shí)測(cè)下來(lái)這個(gè)方法對(duì)數(shù)學(xué)計(jì)算、日期推算、邏輯謎題這類有唯一答案的任務(wù)提升很明顯。比如一個(gè)三位數(shù)加法任務(wù)零樣本直接答可能只有四成正確率加入分步思考后能到六成左右再配合多次采樣投票甚至能摸到八成。代價(jià)是推理次數(shù)增多、耗時(shí)變長(zhǎng)適合對(duì)準(zhǔn)確率有要求但不要求極速響應(yīng)的場(chǎng)景。3.3 評(píng)測(cè)維度與效果觀察到底怎么判斷上下文學(xué)習(xí)有沒(méi)有提升推理能力光靠自己看幾條輸出不夠最好用一個(gè)固定測(cè)試集跑一遍。我自己常用 20 到 30 道題的小測(cè)試集覆蓋數(shù)學(xué)計(jì)算、日期計(jì)算、邏輯推理三類任務(wù)對(duì)比零樣本直接回答、少樣本直接回答和少樣本思維鏈三種模式。下表是某次模擬實(shí)驗(yàn)的大致結(jié)果僅作參考任務(wù)類型零樣本直接回答少樣本直接回答少樣本思維鏈三位數(shù)加法38%45%78%日期推算25%36%64%邏輯謎題42%51%73%你會(huì)發(fā)現(xiàn)少樣本直接把正確答案給模型看提升幅度其實(shí)有限真正拉開(kāi)差距的是少樣本思維鏈。這說(shuō)明模型在推理任務(wù)上缺的不是“答案記憶”而是“推理路徑的示范”。少樣本中的示例本質(zhì)上是給模型指了一條它自己也能走出來(lái)的路。4. 實(shí)操搭一個(gè)上下文學(xué)習(xí)評(píng)測(cè)流程前面講了不少原理但上下文學(xué)習(xí)這東西紙上談兵沒(méi)用得動(dòng)手跑。下面我按自己常用的流程完整走一遍如何搭一個(gè)少樣本評(píng)測(cè)環(huán)境。4.1 環(huán)境與推理服務(wù)準(zhǔn)備最簡(jiǎn)單的做法是找一個(gè)支持文本補(bǔ)全接口的推理服務(wù)。你可以本地部署一個(gè)開(kāi)源指令模型也可以在云端開(kāi)一個(gè)模型服務(wù)。關(guān)鍵是接口風(fēng)格統(tǒng)一方便你用腳本批量測(cè)試。本地部署時(shí)我一般會(huì)用一個(gè)支持量化加載的推理框架加載 7B 到 13B 量級(jí)的模型。參數(shù)太大占用顯存多太小推理效果又不夠。7B 模型在 4-bit 量化下只需 6GB 左右顯存足夠做實(shí)驗(yàn)13B 模型需要更大的顯存但推理穩(wěn)定性更好。如果你手頭沒(méi)有本地顯卡也可以直接調(diào)用線上文本生成服務(wù)把密鑰配好就行。啟動(dòng)推理服務(wù)后所有請(qǐng)求統(tǒng)一走一個(gè)本地 HTTP 接口這樣后續(xù)步驟就能完全腳本化不用每次手點(diǎn)網(wǎng)頁(yè)。一個(gè)通用的調(diào)用函數(shù)長(zhǎng)這樣import requests def call_llm(prompt, temperature0.2, max_tokens512): resp requests.post( http://127.0.0.1:8000/v1/completions, json{ model: local-model, prompt: prompt, temperature: temperature, max_tokens: max_tokens, }, timeout120, ) return resp.json()[choices][0][text].strip()我這里用的是 OpenAI 兼容接口風(fēng)格實(shí)際上很多本地推理框架都認(rèn)這個(gè)格式。你只需要確保接口地址指向自己部署的服務(wù)或你采購(gòu)的服務(wù)地址即可。4.2 構(gòu)建三種提示模板上下文學(xué)習(xí)的核心資產(chǎn)就是提示模板。同一個(gè)任務(wù)模板寫得好不好結(jié)果差距非常大。我會(huì)一次性構(gòu)造三種模板方便后續(xù)對(duì)比零樣本、少樣本直接回答、少樣本思維鏈。零樣本模板最簡(jiǎn)單def build_zero_shot_prompt(instruction, test_input): return f{instruction}\n輸入{test_input}\n輸出少樣本直接回答模板在零樣本基礎(chǔ)上插入若干“輸入/輸出”對(duì)def build_few_shot_prompt(instruction, examples, test_input): segments [instruction, \n] for i, (x, y) in enumerate(examples, 1): segments.append(f示例{i}\n輸入{x}\n輸出{y}\n) segments.append(f輸入{test_input}\n輸出) return \n.join(segments)少樣本思維鏈模板示例里多一項(xiàng)“推理”def build_cot_prompt(instruction, examples, test_input): segments [instruction, \n請(qǐng)先寫出推理過(guò)程再給出最終答案。\n] for i, (x, y_step, y_ans) in enumerate(examples, 1): segments.append(f示例{i}\n問(wèn)題{x}\n推理{y_step}\n答案{y_ans}\n) segments.append(f問(wèn)題{test_input}\n推理) return \n.join(segments)注意幾個(gè)細(xì)節(jié)示例編號(hào)“示例1”“示例2”可以讓模型更清晰地感知這是范例輸入輸出的標(biāo)簽要統(tǒng)一最后的輸出位置要在冒號(hào)后截?cái)喟焉善瘘c(diǎn)交給模型。這些不起眼的格式問(wèn)題往往正是效果差距的來(lái)源。4.3 示例選擇與推理參數(shù)調(diào)優(yōu)示例不是隨便從測(cè)試集里抽兩條就行。我在實(shí)踐中最常用的一條經(jīng)驗(yàn)是用語(yǔ)義檢索選示例。先把候選樣本庫(kù)里的每條數(shù)據(jù)都做向量化再把測(cè)試輸入做同樣的向量化最后計(jì)算余弦相似度取 Top K 個(gè)樣本作為示例。這樣選出來(lái)的示例和當(dāng)前輸入在語(yǔ)義上最接近模型更有可能復(fù)刻正確的推理方式。用一個(gè)簡(jiǎn)單的向量化接口就能完成def embed_texts(texts): resp requests.post( http://127.0.0.1:8000/v1/embeddings, json{texts: texts}, timeout120, ) return resp.json()[embeddings] def pick_examples_by_similarity(test_input, candidate_pool, k4): test_vec embed_texts([test_input])[0] similarities [] for item in candidate_pool: item_vec embed_texts([item[input]])[0] sim cosine_similarity(test_vec, item_vec) similarities.append((sim, item)) similarities.sort(reverseTrue) return [item for _, item in similarities[:k]]如果你不想引入額外的向量化服務(wù)也可以退而求其次從測(cè)試集里隨機(jī)抽幾條保證類別均衡即可。效果略差但足夠做快速驗(yàn)證。推理參數(shù)上我做實(shí)驗(yàn)時(shí)一般把溫度調(diào)到 0.2既保留一定多樣性又不會(huì)讓輸出過(guò)于隨機(jī)。max_tokens 要給足尤其用思維鏈模板時(shí)推理過(guò)程可能很長(zhǎng)設(shè)小了會(huì)在半截被截?cái)?。自洽性投票?chǎng)景下我常讓模型同一道題生成 3 到 5 次然后把答案頻率最高的作為最終輸出。4.4 跑分與人工評(píng)測(cè)模板和參數(shù)都定了接下來(lái)就是跑測(cè)試集。我習(xí)慣用一個(gè) 20 題的測(cè)試集把三種模板跑一遍記錄每道題的正確率和格式解析成功率。評(píng)測(cè)的時(shí)候不能只看最終答案對(duì)不對(duì)還要看中間推理過(guò)程是否合法。拿數(shù)學(xué)題舉例答案對(duì)了但推理步驟是錯(cuò)的本質(zhì)上就是蒙對(duì)的在業(yè)務(wù)場(chǎng)景里不能信任。我自己會(huì)在腳本里同時(shí)記錄“最終答案正確”和“推理過(guò)程合法”兩個(gè)維度然后人工抽看十幾條輸出確認(rèn)模型不是靠胡編的中間步驟蒙混過(guò)關(guān)。一個(gè)簡(jiǎn)單的評(píng)測(cè)記錄表可以參考題目編號(hào)模板類型模型輸出最終答案正確推理過(guò)程合法格式可解析001few-shot-cot……是是是002zero-shot……否不適用是003few-shot-cot……是否否表格里“格式可解析”也很重要尤其你要把模型輸出接到后面業(yè)務(wù)邏輯里時(shí)格式不穩(wěn)定會(huì)帶來(lái)大量額外處理成本。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 示例選了不少效果反而變差我遇到過(guò)不止一次示例從 2 個(gè)加到 6 個(gè)準(zhǔn)確率不升反降。排查下來(lái)問(wèn)題通常出在示例的“分布”上。不是每個(gè)相似的示例都對(duì)當(dāng)前任務(wù)有幫助有時(shí)候一個(gè)特別難的示例會(huì)帶偏整個(gè)注意力分布。解決辦法分兩步。先看示例是不是和目標(biāo)輸入在類型上匹配如果測(cè)試輸入是一個(gè)短問(wèn)句示例卻是一段長(zhǎng)文章模型會(huì)被示例的長(zhǎng)度和結(jié)構(gòu)帶跑。再看示例之間的一致性兩個(gè)示例如果用的推理方式不同模型會(huì)困惑于該學(xué)哪一條路徑。實(shí)際調(diào)整時(shí)我會(huì)把示例數(shù)量先減到 2 個(gè)看效果再逐步往上加找到最優(yōu)數(shù)量。記住少而精的示例永遠(yuǎn)比多而雜的示例好用。5.2 輸出格式不穩(wěn)定少樣本提示里明明給了“輸入/輸出”的固定格式模型還是會(huì)偶爾輸出一段解釋性的廢話或者多出一個(gè)“好的我來(lái)幫你”的前綴。這個(gè)問(wèn)題的根因是你在模板里沒(méi)有把“必須嚴(yán)格按格式輸出”的邊界條件說(shuō)清楚。我的解決辦法有三招。第一在指令末尾加一句明確的格式約束比如“只輸出標(biāo)簽不要解釋”。第二在模板中使用特殊分隔符比如“輸入”“輸出”這種結(jié)構(gòu)化標(biāo)記模型對(duì)界限分明的格式更敏感。第三把溫度調(diào)低一點(diǎn)溫度過(guò)高會(huì)讓模型更傾向自由發(fā)揮。如果格式還是不穩(wěn)定就改為在代碼里做后處理用正則把需要的字段抽出來(lái)別指望模型每次都完美。5.3 上下文窗口塞不下更多示例大模型的上下文窗口是有限的示例一多再加上待處理的原文很容易超長(zhǎng)。出現(xiàn)這種情況不是簡(jiǎn)單地增加“max_tokens”就能解決得從提示詞本身下手。我常用的方案是壓縮示例、精簡(jiǎn)指令、截?cái)嘣?。給每個(gè)示例只保留最核心的輸入輸出去掉所有修飾性描述指令控制在兩句話以內(nèi)待處理文檔如果太長(zhǎng)先抽取關(guān)鍵段落再進(jìn)入提示詞。比如你想讓模型總結(jié)一份長(zhǎng)報(bào)告與其把全文塞進(jìn)去不如先用自己的規(guī)則抽出每章標(biāo)題和關(guān)鍵句子再讓模型基于這些摘要做總結(jié)。這樣既跑得動(dòng)又不容易被長(zhǎng)文本里的噪聲干擾。5.4 示例中的錯(cuò)誤被模型放大少樣本場(chǎng)景里模型對(duì)示例中的錯(cuò)誤非常敏感。一個(gè)很典型的案例我在一批示例里手滑寫錯(cuò)了一個(gè)數(shù)字模型在處理新問(wèn)題時(shí)居然照著同樣的方式算錯(cuò)了。這也印證了前文說(shuō)的——示例是模型眼中的標(biāo)準(zhǔn)答案它會(huì)模仿示例的錯(cuò)誤而不是主動(dòng)糾正。所以示例的標(biāo)注質(zhì)量必須把關(guān)。每一條示例在進(jìn)入提示詞之前都要單獨(dú)驗(yàn)證過(guò)答案正確、推理合法。如果你維護(hù)了一個(gè)示例池最好定期抽查更新避免之前積累的錯(cuò)誤悄悄混進(jìn)生產(chǎn)請(qǐng)求里。寧可少放一個(gè)示例也不要放一個(gè)有問(wèn)題的示例。5.5 什么時(shí)候該放棄上下文學(xué)習(xí)轉(zhuǎn)入微調(diào)上下文學(xué)習(xí)雖然便宜靈活但它有天花板。如果任務(wù)規(guī)則非常固定、對(duì)輸出格式有嚴(yán)格約束、而且每天調(diào)用量大說(shuō)明它已經(jīng)從“臨時(shí)探索”變成了“穩(wěn)定業(yè)務(wù)邏輯”這時(shí)候微調(diào)往往更劃算。可以按下面這個(gè)表做決策衡量維度上下文學(xué)習(xí)適合微調(diào)適合任務(wù)變化頻率高經(jīng)常調(diào)整低長(zhǎng)期穩(wěn)定私有知識(shí)依賴低高延遲要求高需要快速響應(yīng)可接受離線訓(xùn)練輸出格式要求寬松嚴(yán)格需要穩(wěn)定數(shù)據(jù)規(guī)模小幾十條即可大上千條起一句話總結(jié)上下文學(xué)習(xí)適合跑通和試探微調(diào)適合固化產(chǎn)出。你要是發(fā)現(xiàn)自己已經(jīng)把一套提示詞用了幾百天沒(méi)換過(guò)那就是時(shí)候考慮微調(diào)了。6. 我的幾點(diǎn)實(shí)操體會(huì)與擴(kuò)展方向6.1 幾個(gè)反直覺(jué)的經(jīng)驗(yàn)第一個(gè)反直覺(jué)的經(jīng)驗(yàn)是示例數(shù)量并非越多越好。我在一個(gè)文本分類任務(wù)上試過(guò) 2、4、8、16 四個(gè)檔位8 個(gè)示例時(shí)效果最好16 個(gè)反而因?yàn)樯舷挛倪^(guò)長(zhǎng)、注意力分散導(dǎo)致準(zhǔn)確率下降。很多人想當(dāng)然認(rèn)為示例是多多益善但大模型跟前幾輪 token 的注意力權(quán)重確實(shí)會(huì)衰減示例太多只會(huì)把注意力拖垮。第二個(gè)反直覺(jué)的經(jīng)驗(yàn)是示例的多樣性比準(zhǔn)確性更關(guān)鍵。準(zhǔn)確當(dāng)然重要但多樣性決定模型能不能泛化。如果我給模型的四個(gè)示例全是“快遞沒(méi)送到”這一種投訴類型它處理“商品質(zhì)量有問(wèn)題”時(shí)就會(huì)不知所措。類別的全覆蓋遠(yuǎn)比堆疊同類示例有效。第三個(gè)經(jīng)驗(yàn)是指令和示例必須配合使用。指令負(fù)責(zé)說(shuō)明目標(biāo)和邊界示例負(fù)責(zé)展示格式和路徑。只給指令不給示例輸出容易飄只給示例不給指令模型容易把示例里的偶然特征當(dāng)成規(guī)律。兩者缺一個(gè)效果都到不了預(yù)期。6.2 后續(xù)可以怎么擴(kuò)展如果你把基礎(chǔ)的少樣本流程跑通了有幾個(gè)方向值得繼續(xù)探索。你可以嘗試讓模型自己生成示例從中選出效果最好的幾條作為提示詞的一部分這招在缺少標(biāo)注樣本時(shí)很實(shí)用。也可以做動(dòng)態(tài)示例選擇對(duì)每一條測(cè)試輸入都實(shí)時(shí)計(jì)算最相似的示例而不是用一套固定示例跑完整個(gè)測(cè)試集。更進(jìn)一步把上下文學(xué)習(xí)和外部檢索結(jié)合起來(lái)先用檢索召回相關(guān)段落再讓模型基于這些段落做推理兩個(gè)能力疊加后效果能比單獨(dú)使用好不少。上下文學(xué)習(xí)最吸引我的地方在于它沒(méi)有改變模型本身卻能讓模型表現(xiàn)出完全不同的能力層次。設(shè)計(jì)提示詞的每一次調(diào)整都是在探索模型內(nèi)部已有能力的邊界。你花在示例選擇、模板結(jié)構(gòu)、參數(shù)配比上的功夫換來(lái)的是穩(wěn)定可靠的大模型應(yīng)用體驗(yàn)。這套功夫在任何大模型上都不會(huì)白費(fèi)。