矩,省下Few-shot的Token錢)
給大模型畫個圈用System Prompt立規(guī)矩省下Few-shot的Token錢上一篇我們聊了Few-shot少樣本提示。那招確實好用給個例子大模型就能照貓畫虎出來的格式規(guī)規(guī)矩矩。但是呢Few-shot有個很現(xiàn)實的問題就是費Token。你每次發(fā)請求都得把那個好幾百字的樣例帶在消息歷史里。如果你一天跑一千次請求這個樣例你就重復傳了一千遍。這都是白花花的銀子啊。而且有時候我們不需要那么復雜的例子我們只想讓大模型守點基本規(guī)矩。比如別寫廢話、別亂猜原因、必須用列表輸出。這種全局性的規(guī)矩有沒有更省事、更省Token的辦法來約束它當然有。今天我們就來深挖一下System Prompt系統(tǒng)提示詞。這玩意兒就像是大模型的緊箍咒念上之后它就不敢造次了。一、 上回書說到Few-shot的痛點每次都要帶例子Token燒得慌1.1 回顧Few-shot的套路上回我們在代碼里往messages列表里塞了虛擬的對話歷史。一條是樣例提問一條是樣例回答。這套路沒毛病大模型看到歷史就知道該按什么套路出牌。但是你算過賬沒有假設你的樣例輸入加上樣例輸出一共有400個字。這400個字在API調用里大概就是五六百個Token。你每次請求真實的業(yè)務數(shù)據(jù)這五六百個Token是雷打不動要帶上的。如果你的業(yè)務并發(fā)量很大比如一個小時查一千次數(shù)據(jù)。這一個小時光傳樣例廢掉的Token就有五十萬。一天下來就是上百萬Token。去后臺 https://ai.timecho.com/settings/keys 一看賬單這錢花得你肉疼。1.2 樣例里的格式規(guī)矩其實是不變的你再仔細想想我們在樣例里寫的那些東西核心目的是什么其實主要就兩個。第一是教它推理邏輯。這個必須用樣例沒轍。第二是教它輸出格式。比如“必須列1234點”、“必須用【】做標題”。這第二條其實是一種死規(guī)矩。不管你查什么數(shù)據(jù)我都要求你這么排版。那既然是死規(guī)矩我們干嘛每次都要用樣例去示范呢我們直接用大白話告訴它不就行了這就輪到System Prompt出場了。二、 什么是System Prompt憑啥它說話最管用2.1 大白話解釋大模型腦子里的底層出廠設置在API的messages列表里消息的role除了user和assistant還有一個叫system。System Prompt跟普通的User提問不一樣。User提問是臨時起意問完就完了。System Prompt是系統(tǒng)級的指令它會在大模型生成每一個詞的時候都像幽靈一樣飄在它腦子里提醒它。你可以把它理解成你給這個大模型設定的“人設”或者“憲法”。如果你不設System Prompt大模型的人設就是個沒受過訓練的網(wǎng)民它想怎么回就怎么回。如果你設了System Prompt比如“你是一個嚴謹?shù)倪\維工程師”那它在想亂說話的時候就會掂量掂量這不符合工程師的身份啊然后重新組織語言。2.2 優(yōu)先級最高模型必須先滿足System的約束在技術底層大模型對System的指令注意力權重是最高的。也就是說如果User讓它往東System讓它往西大模型大概率會往西走。System的約束力最強。這就給我們立規(guī)矩提供了完美的工具。我們把那些必須遵守、不能變通的格式要求和邊界條件統(tǒng)統(tǒng)寫進System Prompt里。這樣我們就不需要在每次的User提問里反復嘮叨也不需要在Few-shot樣例里占篇幅了。三、 怎么寫一個靠譜的System Prompt寫System Prompt是個手藝活。寫得太短不管用寫得太長大模型會抓不住重點甚至直接遺忘。通常來說分三塊來寫最穩(wěn)妥。3.1 定人設你到底是個啥角色第一塊告訴它你是誰。角色定了說話的口吻和深度就定了。比如你寫“你是一個擁有10年經(jīng)驗的企業(yè)級時序數(shù)據(jù)運維專家?!边@句話不是廢話。大模型見到“10年經(jīng)驗”和“運維專家”它調動出來的內部知識就不一樣。它就不會用小學生的口吻跟你說“這個數(shù)字變大了”它會用專業(yè)的術語說“指標呈現(xiàn)上升趨勢疑似觸發(fā)閾值”。如果你做的是金融分析你就寫“你是資深量化研究員”。人設一定要貼合你的業(yè)務。3.2 定格式輸出必須長啥樣第二塊把死規(guī)矩寫死。這是我們用來省Few-shot Token的關鍵。比如我對報告的格式要求是極其嚴格的我就可以這么寫“你的輸出必須嚴格遵守以下Markdown格式## 異常檢測概要- 異常時間點 - 異常指標## 關聯(lián)分析分析過程## 根因推測推測結論嚴禁輸出任何上述格式之外的廢話。不要寫‘好的這是您的報告’之類的客套話?!蹦憧催@段話一貼大模型就不敢隨便寫散文了。它只能老老實實地填你給的框。這個效果跟你在Few-shot里給個樣例是一模一樣的。但是它只需要寫一次不需要每次都帶樣例數(shù)據(jù)。3.3 定邊界什么話絕對不能說第三塊是防守。大模型有個毛病就是愛胡編。當它不知道原因的時候它也硬編一個原因給你這叫幻覺。我們在System里必須嚴禁這種行為。“規(guī)則如果根據(jù)現(xiàn)有數(shù)據(jù)無法推斷出根因你必須明確回答‘信息不足無法推斷’絕不允許猜測或編造看似合理的解釋。”這就是給它的紅線。有了這條線它在沒把握的時候就會認慫而不是一本正經(jīng)地胡說八道。認慫我們可以再去查數(shù)據(jù)胡說八道就會誤導老板決策。四、 動手把System Prompt塞進代碼4.1 在messages列表的第一位插入system消息按照API規(guī)范System Prompt必須放在messages列表的第一位。你不能把它插在中間或最后。我們寫一段代碼把System定義好defbuild_messages_with_system(real_data_text):# --- 第一步立規(guī)矩 (System Prompt) ---system_prompt 你是一個擁有10年經(jīng)驗的企業(yè)層級里的時序數(shù)據(jù)運維專家。 你的輸出必須嚴格遵守以下Markdown格式不要輸出任何其他內容 ## 異常檢測概要 - 異常時間點 - 異常指標與數(shù)值 ## 關聯(lián)分析 對比相關指標的步驟 ## 根因推測 給出最可能的1-2個原因 規(guī)則 1. 嚴禁輸出“好的”、“沒問題”等客套話。 2. 如果無法推斷根因必須寫“信息不足無法推斷”絕不允許猜測。 # --- 第二步用戶的真實提問 ---user_promptf請分析以下時序數(shù)據(jù)找出異常并推測原因\n{real_data_text}# --- 拼裝Messages列表 ---messages[{role:system,content:system_prompt},# 必須放第一位{role:user,content:user_prompt}]returnmessages你看那個system_prompt里面人設、格式、紅線全有了。而且我故意把格式寫得非常具體連Markdown的二級標題符號##都給出來了。大模型只要照著填空就行。4.2 結合之前的Function Calling框架測試效果如果你把我們之前寫的Function Calling框架拿出來把這段帶System的messages塞進去你會發(fā)現(xiàn)大模型調用工具的精準度也提高了。為什么因為你在System里告訴它它是“資深專家”了。資深專家在查數(shù)據(jù)的時候是不會瞎查的。它給出的SQL參數(shù)會更合理它調用的次數(shù)也會更克制。你跑一下看看出來的報告絕對是干干凈凈沒有一句廢話格式完美符合你的Markdown要求。而這一切你根本沒花一個Token去給Few-shot樣例。五、 System Prompt和Few-shot該怎么選能不能一起上講到這你可能有個疑問既然System這么牛那還要Few-shot干嘛5.1 System管宏觀規(guī)矩Few管微觀套路它們倆的分工是不一樣的。System Prompt是憲法管的是大方向。什么不能干必須按什么大類格式干這歸System管。但是具體的業(yè)務推理套路System管不了。比如CPU飆高到底是先看內存還是先看網(wǎng)絡這個推理鏈條你用自然語言在System里寫不清楚。你寫個幾百字的推理步驟大模型根本記不住它會遺忘。這時候就得Few-shot出馬了。你在Few-shot的樣例里展示一次從CPU高 - 查內存 - 發(fā)現(xiàn)也高 - 推斷是GC的完整鏈路。大模型看一眼樣例就懂了。5.2 混合雙打的威力演示最爽的玩法是System和Few-shot一起上。System把格式框死Few-shot把邏輯教明白。而且有了System兜底你的Few-shot樣例就可以寫得很精簡。你不需要在樣例里再寫一遍格式要求了因為System已經(jīng)管了。你的樣例可以縮水成這樣樣例輸入CPU 88% (10:02), Memory 85% (10:02) 樣例輸出關聯(lián)分析CPU與內存同漲。根因推測內存泄漏導致頻繁GC。你看樣例里連Markdown標題都不用寫了只寫核心邏輯。這省了多少Token格式的事全交給System去約束就行了。這就像你帶徒弟System是員工手冊告訴他上班別遲到、報告必須用Word寫。Few-shot是老員工教他怎么填這個Word模板里的坑。兩者結合徒弟帶得又快又好。六、 System Prompt的坑規(guī)矩立太多模型會精神分裂System雖好但也不能濫用。如果你在System里塞了十幾條互相打架的規(guī)矩大模型直接就擺爛了。6.1 自相矛盾的指令比如你在System里寫“輸出必須極其詳細不少于500字。”接著你又寫“嚴禁輸出廢話必須簡短不超過100字。”大模型一看這就懵了。到底讓我寫長還是寫短最后它可能精神分裂前半段寫長后半段強行截斷出來的東西莫名其妙。所以System里的規(guī)矩一定要互相兼容。你要詳細就別嫌長。你要簡短就別要求面面俱到。6.2 超出它能力范圍的硬性要求還有些規(guī)矩大模型客觀上做不到你硬寫進去也沒用。比如你在System里寫“你的分析必須100%準確絕不允許出現(xiàn)任何誤差?!贝竽P褪歉怕誓P退豢赡?00%準確。你寫這句它只會學會偽裝。它會把那些不靠譜的結論包裝得像100%靠譜一樣輸出來。這反而增加了隱蔽的幻覺更危險。正確的寫法是我們在前面定的邊界“如果不確定就明說”。允許它認錯它反而更誠實。七、 去官方文檔和Playground里找靈感7.1 看看文檔里有沒有推薦的System寫法寫System Prompt沒有標準答案不同的模型對指令的敏感度也不一樣。建議你去翻翻開發(fā)文檔https://ai.timecho.com/docs/。看看官方有沒有給出一套針對時序分析的最佳實踐System模板。有時候官方在文檔里會給一段示例代碼里面那個System Prompt寫得特別地道。那是人家根據(jù)模型調優(yōu)過的你直接抄過來用比自己瞎琢磨強一百倍。7.2 在示例頁面里測試不同System Prompt的威力還有一個好去處就是應用示例頁面https://ai.timecho.com/realtime。雖然網(wǎng)頁端可能沒法顯式地讓你設System字段但你可以把System的指令放在提問的最前面用個特殊符號括起來比如[System指令...]。你試著換幾種System指令看看模型的輸出變化有多大。你可以測測寫“你是個暴躁的運維”和“你是個溫柔的運維”出來的口吻有啥區(qū)別。這能幫你直觀地感受System Prompt的威力。八、 總結與下期預告8.1 提示詞工程三板斧湊齊了到今天這篇我們關于提示詞工程最核心的三板斧就湊齊了。第一板斧是明確的指令這我們在前面就用了。第二板斧是Few-shot樣例教它照貓畫虎。第三板斧是System Prompt給它立規(guī)矩畫圈。這三招配合起來大模型基本就被你拿捏得死死的了。它該查數(shù)據(jù)就查數(shù)據(jù)該出報告就出報告格式規(guī)范邏輯嚴密不廢話不瞎編。這才是一個合格的AI員工該有的樣子。8.2 下期我們講講怎么讓它輸出純JSON對接下游系統(tǒng)今天我們讓大模型輸出了規(guī)整的Markdown報告。這對人看是爽了但是機器看不懂啊。如果你的下游還有個自動化腳本要去解析大模型的結論自動發(fā)報警或者重啟服務。那個腳本怎么去讀Markdown很難讀。腳本只認識JSON。那怎么逼著大模型不輸出人看的Markdown只輸出機器看的JSON呢這就需要用到更硬核的約束手段了。下一期我們就來聊聊怎么開啟JSON Mode徹底鎖死大模型的輸出格式。我們下篇見。