[心得] 讓 AI 好好說話,兩步提示增強模型輸出
Medium 好讀版: https://bit.ly/4fpxwdn
大型語言模型 (LLM) 為自動化工作流程提供了很多幫助,
很多新的應用因為大型語言模型的出現,從不可能變為可能。
而為了使用模型的回答來串接不同的工作,
結構化輸出 (Structured Output) 幾乎不可或缺。
目前熱門的模型都有支援輸出特定的 JSON 格式,來方便程式處理模型的回答。
不過平常可能不太容易察覺,結構化輸出其實有它的缺點。
要求模型輸出特定的格式有機會降低模型的表現,甚至增加幻覺發生的機率。
大型語言模型如何產生結構化輸出?
想要讓模型照著我們的要求回答問題並不是一件簡單的事情,
資料科學家和工程師們為此提出了很多不同的解決方案。
而目前被廣泛應用到實際產品的方式,
是透過建立目標格式的語法樹來限制模型每一次輸出的 token。
知名的實作有開源的 lm-format-enforcer (LMFE)
或是 Google DeepMind 基於 OpenFST 的實作。
雖然在名詞的使用上各家並沒有統一,但概念上是相似的。
大方向就是強迫模型輸出符合當前語法狀態的 token,遍歷目標語法樹直到結束狀態。
這個方法的可靠性和效率非常高,幾乎可以確保輸出的格式符合規範。
但,最重要的永遠是這個但是,
強迫模型輸出特定的格式意味著每一次輸出的 token
不一定是能夠回答問題的的最佳解。
模型極有可能為了符合格式,讓下一個產生的 token 偏離了正確答案。
隨著任務的複雜度和輸出的增加,這樣的偏差最終就可能導致幻覺或錯誤的回答。
讓模型先好好說話!
要解決這樣的問題,有一個容易且直覺的方法:
不要限制模型輸出的格式,讓它好好回答問題。
取得答案之後,我們再要求模型將答案轉換成我們要的格式。
這個方法適用在有較長前後文 (Context) 的複雜任務,
因為輸出的內容通常較精簡,模型便可以正確的轉換格式。
但這個方法具體倒底能改進多少輸出的品質呢?
來作個實驗!
為了量化結構化輸出對模型表現的影響,
筆者收集了一週份來自立法院的會議紀錄和質詢逐字稿,
總計約 400,000 個 tokens 的文字資料來設計實驗。
完整的資料可以在立院知更的每週新聞下載。
任務目標是請模型整理出當週立法院討論的議題,並做成新聞標題。
在選題上,我們要求模型盡可能的挑選不同領域的議題,
並希望可以避免標題間太過相似。
因此若是模型輸出的標題重覆性越高,則輸出的品質越低。
我們將輸出的標題透過 text embedding 輸出成 embedding vectors,
透過兩兩配對標題並計算彼此的相似度後取平均值,
就可以評估模型的表現。
以下的程式碼分別實作了兩個不同的方法:
1. 立即使用結構化輸出
2. 先不使用結構化輸出,後續多用一個提示來整理輸出格式。
以下我們稱前後者分別為一步和二步驟提示。
程式的輸出和標題相似度的範例如下。
最後我們用標題間的相似度畫出分布圖,可以得到以下的結果。
https://imgur.com/i2zAPBN
https://imgur.com/KzBcQ8R
可以看到二步驟提示得到的標題彼此間相以度較低,
因此議題的差異較高,更符合我們設定的目標。
總結
從我們的實驗可以觀察出,
透過二步驟提示先讓模型好好針對問題回答,
再修改成特定格式有助於提升模型的表現。
因此若是輸入的前後文較長,且任務要求比較複雜,
可以透過這個方法來有效的改善輸出的品質。
希望這個小技巧能對你有一點幫助,
有任何的問題或指教都歡迎留言和我討論。
===========================
最後小小的宣傳一下我開發的服務:立院知更。
這是一個使用大型語言模型實作的立法院搜尋引擎,
我們希望透過建立更加直覺且便利的立院搜尋引擎,
讓所有人能夠輕易地使用關鍵字搜尋到立院中各種相關文檔及影音資料,
進而提升公民參與。
有任何的想法或意見,都歡迎來信討論!
參考資料
1. Automata-based constraints for language model decoding
https://arxiv.org/abs/2407.08103v1
2. lm-format-enforcer
https://github.com/noamgat/lm-format-enforcer
--
實作推,但是不是要考慮誤差範圍
請問提升的效益和兩倍cost如何取捨呢
我在使用時,多數情況成本並不會增加一倍。 原因是目前模型的計價方式是以 token 計算, 第二個 Prompt 並不會帶入第一個的輸入, 所以費用通常遠小於第一個 API call。 但這個問題很棒!我認為成本控制是目前應用 LLM 最大的挑戰之一。
真不錯
讚 請繼續收集之後的數據 畢竟實驗次數越多 結論才越準確
用html node比較不會出錯
第二個prompt也未必能選擇最佳解,也沒有控制LLM的輸出。
這邊可能我沒有表達清楚。 因為我使用的是 Gemini 的 API,所以 Generation Config 就可以控制 輸出成 Json 格式。
其實第二階任務改成選擇題,選擇候選答案,並結合formatte
r控制輸出,其中一種範例:只選擇編號輸出1,2,3,4等選項,
只要消耗one token就能選到答案,成本超低,回應速度超快
。這種速度與成本會幾乎等於one -prompt。
等待與消耗硬體資源成本,根本不用耗費2倍cost。
至於相似度評估,如果你是拿現有別人的embedding模型,要
先用立法院資料驗證模型品質。不然算出來的相似度會非常的
隨機難以參考。
範例圖中,八個句子相似度的例子,看起來同語意,但相似度
卻有0.85, 到0.78的落差。顯然,相似度選用的embedding的
模型,未必適合您的專案。
別誤會,架構與技巧本身是沒問題的。只是多提出了實務上更
能省成本,更能驗證效果的客觀做法。
謝謝你的建議!受益良多~
※ 編輯: lollypop02 (1.161.189.194 臺灣), 11/15/2024 12:03:21推推 請問lyrobin有開源嗎
所以是用人家的api嗎 可以分享用哪一個嗎
你的問題是沒有用思維鏈產答案,而不是一階二階
52
Re: [討論] 中研院繁中LLM被爆直接拿對岸的來套小弟待的公司,非學術單位, 可能是台灣硬體計算資源稍微豐富的公司。 公司投入在買GPU 應該近億了。 自己也研究了幾個月 fine-tune 方法。 不過,還是沒足夠能力與資源訓練正常的LLM。16
[情報] 電腦也會手繪 開源AI模型重現創作歷程電腦也會手繪,美研究生開源AI模型「PaintsUndo」重現彩圖創作歷程 美國史丹佛大學研究生 Lvmin Zhang(lllyasviel)7 月 9 日在 Github 發表 AI 模型「P aintsUndo」,使用者只要導入 2D 靜態圖像就會展開「逆向工程」,從白紙草稿、上色、 陰影到作品完工,電腦自動深度偽造一整段創作過程並完整輸出成影片。X
Re: [爆卦] 中央研究院詞庫小組大型語言模型對於LLM只有這一點認知程度的話,最好不要就這樣出來帶風向會比較好,不然先去 跟陽明交大校長先去旁邊先學習一下什麼叫做LLM,不同LLM之間又有什麼差異。 第一個錯誤的認知是認為LLM就應該要提供正確的答案,事實上LLM是一個機率模型, 它所做的事情是基於模型的權重預測下一個token(詞塊)最高的機率是那個,它不是資 料庫,所以你不能因為它答的一個答案不是你所想的就是說這個模型如何如何。10
Re: [討論] 大家會擔心 ai 寫 code 讓工程師飯碗不解決幻覺,不一定要從LLM解, 而是靠系統架構解。 例如,做一個問答系統,很多人減少幻覺是這樣做的: 0. 預先整理好QA問答資料集 (人工整理,或機器輔助整理)9
[閒聊] 電腦也懂手繪,美研究生開源AI模型「Pain電腦也懂手繪,美研究生開源AI模型「PaintsUndo」重現彩圖創作歷程 g-behaviors-in-digital-paintings 縮網址:5
Re: [新聞]剖析中研院大型語言模型事件的衝擊先說結論: 發展本土化,繁體中文LLM模型,然後期待這個模型能讓大家使用,根本是錯誤方向。不知道這些專家學者,是在騙經費,還是還沒想清楚產業到底缺什麼。 --- 如果今天你使用Google搜尋,搜到"台灣是中國的",或任何有政治偏見的相關文章。 你會不會覺得Google很爛?4
[閒聊] 提示工程是不是跟咒文很像剛剛看到GitHub Copilot的31戒 有感而發 一直覺得現在語言模型所謂的提示工程 概念跟機器人三大法則 或者ACG中經常出現的言 靈 或者咒文概念很像 新手咒文寫落落長沒效果還浪費token 模型看起來還像白癡2
Re: [爆卦] 中央研究院詞庫小組大型語言模型阿肥外商碼農阿肥啦! 今天忙到剛剛才看到這篇,先說derek大大有點避重就輕的點, 大家都知道LLM就是一個機率模型,更正確來說應該是一個生成式模型,概念就是他從訓 練數據集當中去模仿數據源的分佈。 當然,我相信這絕對是中研院自己finetune的,也不是說只是拿別人模型出口接了openCC2
[閒聊] aespa運用AI技術推出「BEYBLADE X」ED「ZOOM ZOOM」是在電視東京系列播出的電視動畫「BEYBLADE X」的片尾主題曲。 這個歌詞影片是採用AI模型輸出的多格式,並結合動作捕捉技術, 使其接近傳統的質感動畫,是一種新嘗試的影像製作方式。 在AI的使用上,依照文化廳的指南建構了考慮著作權的安全模型。3
Re: [黑特] 黃國昌真的不懂AI耶!不知道政府是怎麼買 但是如果直接買來用就不對了 資料是舊的查詢就沒有意義了 所以應該要 方式一:API + 私有資料庫整合