終于寫了一篇和系列標(biāo)題沾邊的博客,這一篇真的是解密prompt!我們會討論下思維鏈(chain-of-Thought)提示詞究竟要如何寫,如何寫的更高級。COT其實是Self-ASK,ReACT等利用大模型進(jìn)行工具調(diào)用方案的底層邏輯,因此在Agent調(diào)用章節(jié)之前我們會有兩章來講思維鏈
先打預(yù)防針,COT當(dāng)前的研究多少存在一些玄學(xué)成分,部分COT的研究使用的模型并非SOTA模型,以及相同的COT模板在不同模型之間可能不具備遷移性,且COT的效果和模型本身能力強相關(guān),哈哈可以去圍觀COT小王子和Claude友商的Prompt決戰(zhàn)]。本章只是為大家提供一些思維鏈設(shè)計的思路,以及給Agent調(diào)用做一些鋪墊。
思維鏈的核心是為了提高模型解決復(fù)雜推理問題的能力,包括但不限于符號推理,數(shù)學(xué)問題,決策規(guī)劃等等,Chain-of-Thought讓模型在得到結(jié)果前,模擬人類思考推理的過程生成中間的推理步驟。適用于以下場景
- 有挑戰(zhàn)的任務(wù)
- 解決任務(wù)本身需要多步推理
- 模型規(guī)模對任務(wù)效果的提升相對有限
COT基礎(chǔ)用法
Few-shot COT
Chain of Thought Prompting Elicits Reasoning in Large Language Models
開篇自然是COT小王子的成名作,也是COT的開山之作,單看引用量已經(jīng)是一騎絕塵。
論文的核心是通過Few-shot的方案,來引導(dǎo)模型生成中間推理過程,并最終提高模型解決復(fù)雜問題的能力。核心邏輯很Simple&Naive
- 通過在Few-shot樣本中加入推理過程,可以引導(dǎo)模型在解碼過程中,先給出推理過程,再得到最終答案
- 類似中間推理過程的加入,可以顯著提高模型在常識推理,數(shù)學(xué)問題,符號推理等復(fù)雜推理問題上的模型表現(xiàn)。
先看效果,見上圖,可以得到幾個insights
- COT帶來的效果提升具有涌現(xiàn)性,只在100B左右的大模型上才出現(xiàn)顯著更優(yōu)的效果,但作者沒有給出模型規(guī)模的影響原因
- COT帶來的效果提升在復(fù)雜問題例如GSM8K上表現(xiàn)更顯著
讓我們直觀來看下COT的Few-shot模板構(gòu)建,以及對解碼的影響。這里我們使用Belle的數(shù)學(xué)COT指令樣本采樣10個構(gòu)建了一組few-shot思維鏈指令,如下,
測試數(shù)學(xué)能力嘛,小學(xué)奧數(shù)經(jīng)典的汽車相遇問題走一個,問題:兩輛汽車從相距500千米的兩城同時出發(fā),相向而行.一輛摩托車以每小時80千米的速度在兩輛汽車之間不斷往返聯(lián)絡(luò).已知這兩輛汽車的速度分別是每小時40千米和60千米,求兩汽車相遇時,摩托車共行駛了多少千米?題目不復(fù)雜500/(40+60)*80 = 400千米
以下分別使用ChatGPT和ChatGLM在Greedy-search模式下進(jìn)行解碼,分別是直接提問和加入few-shot-cot后再提問
prompt | chatgpt | chatglm-6b |
---|---|---|
直接提問 | 設(shè)兩汽車相遇時間為\(t\)小時,則兩汽車相遇時的距離為\((40+60)t=100t\)千米。摩托車在這\(t\)小時內(nèi)不斷往返,相當(dāng)于在兩汽車之間來回行駛了\(2\times 80t=160t\)千米。因此,摩托車共行駛了\(160t\)千米。根據(jù)題意,兩汽車相遇時的距離為500千米,因此\(t=\frac{500}{100}=5\)小時。代入可得,摩托車共行駛了\(160\times 5=\boxed{800}\)千米。 | 設(shè)兩汽車相遇時,摩托車行駛了 \(x\) 小時。根據(jù)題意,兩汽車相向而行,它們的相對速度為 \(40+60=100\) 千米/小時。因此,兩汽車相遇時,它們行駛的距離之和為:\(500\times(100+40)=50000\)因為兩汽車相遇時,摩托車一直在行駛,所以摩托車行駛的距離等于兩汽車相遇時它們行駛的距離之和:\(x\times80=50000\)解得:\(x=4000\)因此,兩汽車相遇時,摩托車共行駛了 \(4000\) 千米。 |
few-shot COT | 設(shè)摩托車共行駛了x千米,則兩輛汽車相遇時,摩托車往返的次數(shù)為x/500。在每次往返中,摩托車行駛的距離為80千米,所以摩托車共行駛的距離為:x = (80千米) × (x/500) = 0.16x千米兩輛汽車相遇時,它們的總路程為500千米,所以它們相遇所用的時間為:t = 500千米 / (40千米/小時 + 60千米/小時) = 5小時根據(jù)摩托車的速度和時間,可以得到:x = 80千米/小時 × 5小時 = 400千米因此,摩托車共行駛了400千米。 | 設(shè)兩汽車相遇時,摩托車行駛了 \(x\) 小時。由題意可知,兩汽車相遇時,它們已經(jīng)行駛了 500 千米,所以有:\(40x + 60x = 500\)解得 \(x=50/9\),即兩汽車相時,摩托車行駛了 50/9 小時。因此,摩托車共行駛了:\(80 \times (50/9) = 400\) |
加入COT之后chatgpt和chatglm都雙雙答對了,雖然有運氣成分,且推理過程還顯得有點智障吧。但你會發(fā)現(xiàn)不加入few-shot COT模型同樣會進(jìn)行推理再給出答案,而非像論文中給出的模型會直接直接給一個答案沒有任何推理。原因是論文使用的是text-davinci-002是沒有經(jīng)過RLHF的舊版本模型。我們在一些需要推理的多項選擇問題上也進(jìn)行了測試,不管是使用few-shot COT還是加入COT指令樣本進(jìn)行微調(diào),確實都能帶來一定程度上推理/數(shù)學(xué)能力的提升。
論文還進(jìn)行了一些消融實驗包括
- 準(zhǔn)確率提升是否來自數(shù)學(xué)公式的引入?
論文嘗試了few-shot部分只加入公式并不能顯著提升效果。個人感覺這個消融實驗不太完整,因為很多復(fù)雜MWP問題模型很難映射到單一的公式,而先進(jìn)行問題分解后再逐步映射到中間公式,在我們的場景里是可以提升效果的。這里推薦兩個數(shù)據(jù)集:APE210K和Math23K分別是猿輔導(dǎo)和騰訊開源的數(shù)學(xué)世界問題轉(zhuǎn)化成公式的數(shù)據(jù)集,大家可以自己試試看
- 準(zhǔn)確率提升是否因為few-shot-cot幫助模型更好的召回相應(yīng)的知識?
論文嘗試了先給出答案再進(jìn)行推理的prompt模板,發(fā)現(xiàn)效果顯著變差。說明few-shot-COT只是激活模型給出推理,推理過程本身才是模型效果提升的核心。我們在一些需要推理的多項選擇問題上也發(fā)現(xiàn),先推理再回答選項的效果顯著優(yōu)于先回答選項再給出推理過程
zero-shot COT
Large Language Models are Zero-Shot Reasoners
除了使用Few-shot-COT樣本可以讓模型給出推理過程,單純用指令也可以讓模型給出思維鏈,且能進(jìn)一步提升模型復(fù)雜問題推理能力。論文中效果最好的激活思維鏈的指令是"Let's think step by step"哈哈哈,我當(dāng)時論文看到這里感覺空氣都凝固了
zero-shot-COT在論文中需要兩步解碼,第一步用Let's think step by step讓模型給出推理過程,第二步把推理過程和問題一起輸入模型,讓模型給出結(jié)果。但實際使用時你會發(fā)現(xiàn),基本上第一步解碼模型就會在推理結(jié)束時給出結(jié)果,而把帶結(jié)果的輸入再輸入模型,極大概率第二步模型會給出相同的答案,所以其實zero-shot-COT也可以直接一步到位。
咱主打一個和相遇問題死磕,還是摩托車和貨車相遇,咱使用幾組不同的激活詞再來問一遍
激活詞 | chatgpt | chatglm |
---|---|---|
請一步步的推理分析解決以下問題 | 設(shè)兩汽車相遇時間為t小時,則兩汽車相遇時的距離為(40+60)t=100t千米。由于兩汽車相向而行,所以它們的相對速度為40+60=100千米/小時。因此,摩托車在t小時內(nèi)往返的距離為2×80t=160t千米。根據(jù)題意,摩托車在兩汽車相遇時停止往返,因此摩托車共行駛的距離為160t千米。將上述兩個式子聯(lián)立,解得t=2.5小時。因此,摩托車共行駛的距離為160×2.5=400千米。 | 設(shè)兩汽車相遇時,摩托車行駛了 \(x\) 小時。根據(jù)題意,兩汽車相向而行,它們的相對速度為 \(40+60=100\) 千米/小時。因此,兩汽車相遇時,它們之間的距離為 \(500-x\) 千米。根據(jù)題意,摩托車以每小時 \(80\) 千米的速度在兩輛汽車之間不斷往返聯(lián)絡(luò),因此摩托車每行駛 \(x\) 小時,會在兩汽車相遇時行駛 \(80x\) 千米。因此,可以列出方程:\(80x = 500-x\)解方程可得:\(x = 50\)因此,兩汽車相遇時,摩托車共行駛了 \(80x=3000\) 千米。 |
請逐步推理回答問題 | 設(shè)兩汽車相遇時間為t小時,則兩汽車相遇時的距離為(40+60)t=100t千米。根據(jù)題意,摩托車以80千米/小時的速度在兩汽車之間不斷往返,因此摩托車在t小時內(nèi)往返的路程為2×80×t=160t千米。所以,摩托車共行駛了160t千米。將兩式相等,得到:100t=500t=5此,兩汽車相遇時,摩托車共行駛了160×5=<<160*5=800>>800千米。 | 設(shè)兩汽車相遇時,摩托車行駛了 \(x\) 小時。根據(jù)題意,兩汽車相向而行,因此它們相遇的時間可以用以下方程計算:\(t = \frac{500}{40 + 60} = 10\)因為兩汽車相遇時,摩托車一直在行駛,所以摩托車行駛的時間也是 \(x\) 小時。根據(jù)題意,摩托車的速度是每小時 \(80\) 千米,因此摩托車行駛的距離可以用以下方程計算:\(x \times 80 = 500 - t\)將 \(t\) 的值代入上式,得到:\(x \times 80 = 500 - 10 = 490\)因此,兩汽車相遇時,摩托車共行駛了 \(490\) 千米。 |
2組提示詞,只有第一組讓chatgpt給出了正確的答案,整體上提示詞的效果很玄學(xué),我們在不同問題上例如多項選擇,數(shù)學(xué)計算也試過很多不同的方案,沒找到啥規(guī)律。論文作者也嘗試了不同的指令詞來驗證zero-shot-COT對指令詞的依賴程度,見下表。整體上只要指令詞有引導(dǎo)模型逐步推理的含義在,對模型效果都是有提升的。我個人也是看到這里才覺得zero-shot-COT可能確實有一定的合理性,因為指令提供的上文語義確實和模型推理的解碼語義存在一定的相關(guān)性。
效果上,論文在MultiArith和GSM8k上和few-shot-cot進(jìn)行了對比,整體上比few-shot略差,但是要顯著超越只使用指令的baseline。不過需要注意,這里的評測模型還是是text-davinci-002,是沒有經(jīng)過RLHF只做了SFT的版本,并不是當(dāng)前的最強模型,因此下圖的效果提升放到GPT4上會打不小的折扣。畢竟GPT-4使用few-shot-COT在GSM8k上準(zhǔn)確率已經(jīng)奔著90%+去了。在模型大小上,zero-shot-COT同樣具有規(guī)模效應(yīng),只在大模型上才表現(xiàn)出超越常規(guī)指令的效果
COT進(jìn)階用法
以上不論是few-shot還是zero-shot COT都還是基于模型自身給出推理過程,而人工不會過多干預(yù)推理過程。在進(jìn)階用法中會對推理過程做進(jìn)一步的人工干預(yù)來引導(dǎo)解碼步驟,進(jìn)一步提升解碼準(zhǔn)確率,且以下的進(jìn)階方案是可以組合使用的。
Self-Consistency
SELF-CONSISTENCY IMPROVES CHAIN OF THOUGHT REASONING IN LANGUAGE MODELS
self-consistency是在few-shot-cot的基礎(chǔ)上,用Ensemble來替換Greedy Search,來提高解碼準(zhǔn)確率的一種解碼策略,論文顯示加入self-consistency,可以進(jìn)一步提升思維鏈的效果GSM8K (+17.9%)。
在使用大模型進(jìn)行固定問題回答例如多項選擇,數(shù)學(xué)問題時,我們往往會采用Greedy-Search的方式來進(jìn)行解碼,從而保證模型解碼生成固定的結(jié)果,不然的話使用隨機解碼,我采樣4次,模型把ABCD都選了一遍,那這題模型到底是答對了還是答錯了??但每一步都選Top Token的局部最優(yōu)的解碼方案很顯然不是全局最優(yōu)的,而self-consistency其實提供了一種無監(jiān)督的Ensemble方案,來對模型隨機解碼生成的多個回復(fù)“投票”出一個更準(zhǔn)確答案,如下圖
self-consistency的基礎(chǔ)假設(shè)很人性化:同一個問題不同人也會給出不同的解法,但正確的解法們會殊途同歸得到相同的正確答案。以此類比模型解碼,同一問題不同隨機解碼會得到不同的思維鏈推理過程,期望概率最高的答案,準(zhǔn)確率最高。那核心就變成針對多個解碼輸出,如何對答案進(jìn)行聚合。論文對比了以下幾種方案
給定指令prompt和問題question,模型通過隨機解碼會生成一組\(a_1,a_2,...a_m\)答案候選,以及對應(yīng)的思維鏈路徑\(r_1,r_2,...r_m\)。效果最好的兩種聚合方案分別是
- major vote:直接對解碼后的結(jié)果投票大法投出一個出現(xiàn)概率最高的答案。該說不說大道至簡,最簡單的方案往往是最好的, 論文后面的結(jié)果都是基于投票法給出的
- normalized weighted sum: 計算\((r_i, a_i)\)路徑的概率,既模型輸出的每一個token條件解碼概率求和,并對解碼長度K進(jìn)行歸一化。雖然這里略讓人驚訝,本以為加權(quán)結(jié)果應(yīng)該會更好,可能一定程度也說明模型的解碼概率在答案的正確性上其實不太有區(qū)分度。
針對解碼參數(shù)論文還做了一些測試
- 隨機參數(shù):self-consistency支持不同的隨機解碼策略,在參數(shù)設(shè)定上需要平衡解碼的多樣性和準(zhǔn)確率,例如temperature太低會導(dǎo)致解碼差異太小,投票投了個寂寞,太高又會影響最終的準(zhǔn)確率。看測試可能top-p=40, temperature=0.5是一個不錯的測試起點
- 采樣次數(shù):major vote的效果很依賴候選樣本數(shù),論文中很豪橫采樣了40次,地主家的兒子也不敢這么玩...看效果采樣5次以上就能超過Greedy解碼,具體解碼次數(shù)看你家有多少余糧吧...
Least-to-Most
LEAST-TO-MOST PROMPTING ENABLES COMPLEX REASONING IN LARGE LANGUAGE MODELS
如果說上面的Self-Consisty多少有點暴力出奇跡,那Least-to-Most明顯更優(yōu)雅一些。思路很簡單,在解決復(fù)雜問題時,第一步先引導(dǎo)模型把問題拆分成子問題;第二步逐一回答子問題,并把子問題的回答作為下一個問題回答的上文,直到給出最終答案,主打一個循序漸進(jìn)的解決問題。也可以理解為通過few-shot來引導(dǎo)模型給出更合理,更一致的推理思路,再根據(jù)這個思路在解決問題。
設(shè)計理念很好,但我最好奇的是few-shot-COT要如何寫,才能引導(dǎo)模型針對不同場景進(jìn)行合理的問題拆解。這里我們還是看下針對數(shù)學(xué)問題的few-shot應(yīng)該如何構(gòu)建的,論文中的few-shot-prompt是純手工寫制作,這里我采用chatgpt來生成再人工調(diào)整。從APE21K中隨便抽了3個問題,注意不要太簡單,已經(jīng)有論文證明,few-shot-COT樣本的推理步驟越多效果越好。這里我拆解問題的Prompt(未調(diào)優(yōu))是"對以下數(shù)學(xué)問題進(jìn)行問題拆解,分成幾個必須的中間解題步驟并給出對應(yīng)問題, 問題:",來讓ChatGPT生成中間的解題步驟作為few-shot-cot模板
- Problem Reducing 問題拆解
還是同一道相遇問題,通過Reduce prompt,ChatGPT輸出:要解答摩托車共行駛了多少千米?我們需要回答以下問題:"兩輛汽車相遇需要多長時間?","摩托車在這段時間內(nèi)共行駛了多少千米?
以上的問題拆解不是非常穩(wěn)定,有時會包括最終的問題,有時只包括中間的解題步驟,為了保險起見,你可以在解析的問題后面都再加一個原始的問題。
- Sequentially Solve 子問題有序回答
把Reduce步驟的子問題解析出來,按順序輸入chatgpt,先回答第一個子問題
再把第一個子問題和回答一起拼接作為上文,這里使用對話history也可以,拼接只是為了直觀展示
Least-to-Most最值得借鑒的還是它問題拆分的思路,這在后面被廣泛借鑒,例如Agent調(diào)用如何拆分每一步的調(diào)用步驟,以及如何先思考再生成下一步Action,在這些方案里都能看到Least-to-Most的影子。文章來源:http://www.zghlxwxcb.cn/news/detail-485906.html
想看更全的大模型相關(guān)論文梳理·微調(diào)及預(yù)訓(xùn)練數(shù)據(jù)和框架·AIGC應(yīng)用,移步Github >>?DecryptPropmt文章來源地址http://www.zghlxwxcb.cn/news/detail-485906.html
到了這里,關(guān)于解密Prompt系列9. 模型復(fù)雜推理-思維鏈COT基礎(chǔ)和進(jìn)階玩法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!