聲明:本文來自於微信公眾號 機器之心(ID:almosthuman2014),作者:機器之心,授權站長之傢轉載發佈。
ChatGPT 正確的使用姿勢。
自 ChatGPT 問世以來,OpenAI 一直被認為是全球生成式大模型的領導者。2023年3月,OpenAI 官方宣佈,開發者可以通過 API 將 ChatGPT 和 Whisper 模型集成到他們的應用程序和產品中。在 GPT-4發佈的同時 OpenAI 也開放其 API。
一年過去,OpenAI 的大模型使用體驗究竟如何,行業內的開發者怎麼評價?
最近,初創公司 Truss 的 CTO Ken Kantzer 發佈一篇題為《Lessons after a half-billion GPT tokens》的博客,闡述在使用 OpenAI 的模型(85% GPT-4、15% GPT-3.5)處理完5億個 token 之後,總結出的七條寶貴經驗。
機器之心對這篇博客進行不改變原意的編譯、整理,以下是博客原文內容:
經驗1:prompt,少即是多
我們發現,如果 prompt 中的信息已經是常識,那麼該 prompt 不會幫助模型產生更好的結果。GPT 並不愚蠢,如果您過度指定,它實際上會變得混亂。
這與編碼不同,編碼中的一切都必須是明確的。
舉一個讓我們感到困擾的例子:
pipeline 的一部分讀取一些文本塊,並要求 GPT 將其分類為與美國50個州之一相關。這不是一項艱巨的任務,可以使用字符串 / 正則表達式,但有足夠多奇怪的極端情況,因此需要更長的時間。所以我們的第一次嘗試大致是這樣的:
Here'sablockoftext.Onefieldshouldbe"locality_id",anditshouldbetheIDofoneofthe50states,orfederal,usingthislist:
這有時會起作用(約超過98% 的情況),但失敗的情況足以讓我們不得不進行更深入的挖掘。
在調查時,我們註意到字段「名稱」始終返回州的全名,盡管我們沒有明確要求它這樣做。
因此,我們改用對名稱進行簡單的字符串搜索來查找狀態,然後模型就一直運行良好。
總而言之,GPT 顯然知道50個州。當 prompt 更加模糊時,GPT 的質量和泛化能力都可以提高,這太瘋狂 —— 這是高階思維的典型標志。
經驗2:不需要 langchain
你隻需要 chat API,不需要 langchain,甚至可能不需要 OpenAI 去年在其 API 中發佈的任何其他內容。
Langchain 是過早抽象的完美例子。我們開始認為我們必須使用它。但相反,數百萬個 token 之後,我們可能在生產中使用3-4個非常多樣化的 LLM 函數,而我們的 openai_service 文件中仍然隻有一個40行的函數:
defextract_json(prompt,variable_length_input,number_retries)
我們使用的唯一 API 是 chat API。我們不需要 JSON 模式、函數調用等等(盡管我們做所有這些),我們甚至不使用系統 prompt。gpt-4-turbo 發佈時,我們更新代碼庫中的一個字符串。
這就是強大的廣義模型的美妙之處 —— 少即是多。
該函數中的40行代碼大部分都是圍繞 OpenAI API 被關閉的500s/socket 的錯誤處理。
我們內置一些自動截斷功能,因此不必擔心上下文長度限制,我們有自己專有的 token 長度估計器。
ifs.length>model_context_size*3
在存在大量句點或數字的極端情況下(token ratio <3characters /token),這種方法會失敗。所以還有另一個專有的 try/catch 重試邏輯:
ifresponse_error_code=="context_length_exceeded"
我們已經依靠上述方法取得很大進展,並且該方法足夠靈活,可以滿足我們的需求。
經驗3:通過流式 API 改善延遲並向用戶顯示變速輸入的單詞是 ChatGPT 一項重大的用戶體驗創新
我們曾經認為這隻是一個噱頭,但實際上用戶對「變速輸入字符」的反應非常積極 —— 這感覺就像是人工智能的鼠標 / 光標用戶體驗時刻。
經驗4:GPT 不擅長產生零假設
「如果找不到任何內容,則返回空輸出」—— 這可能是我們遇到的最容易出錯的 prompting 語言。在此情況下,GPT 不僅會經常出現幻覺而不返回任何內容,還會導致「缺乏信心」,返回空白的次數比應有的要多。
我們大多數的 prompt 都是以下形式:
“Here’s a block of text that’s making a statement about a company, I want you to output JSON that extracts these companies. If there’s nothing relevant, return a blank. Here’s the text: [block of text]”
有一段時間,我們會遇到 bug,[文本塊] 可能為空,幻覺不時出現。順便說一句,GPT 很喜歡幻想面包店,這裡有一些很棒的面包店:
陽光面包店
金糧面包店
極樂面包店
幸運的是,解決方案是修復該 bug,並在沒有文本的情況下根本不向其發送 prompt。
經驗5:「上下文窗口」命名不當
「上下文窗口」隻會因輸入而變大,而不會因輸出而變大。
一個鮮為人知的事實是,GPT-4的輸入窗口可能有128k token,但輸出窗口卻隻有區區4k!
我們經常要求 GPT 返回 JSON 對象的列表 —— 一個 json 任務的數組列表,其中每個任務都有一個名稱和一個標簽,而 GPT 無法返回超過10項。
我們最初認為這是因為上下文窗口大小是4k,但我們發現10個項目,可能隻有700-800個 token,GPT 就會停止。
經驗6:向量數據庫和 RAG / 嵌入對我們普通人來說幾乎毫無用處
我認為矢量數據庫 / RAG 確實是用於搜索的,以下是一些原因:
1. 相關性沒有界限。有一些解決方案,你可以創建自己的相關性截止啟發式,但它們並不可靠。在我看來,這確實「殺死 RAG」—— 你總是冒著用不相關的結果危害檢索的風險;或者過於保守,錯過重要的結果。
2. 為什麼要將向量放入專門的專有數據庫中,遠離所有其他數據?除非你處理的是 google/bing 規模的工作,否則上下文的丟失絕對不值得進行權衡。
3. 除非你正在進行非常開放的搜索(例如整個互聯網),否則用戶通常不喜歡返回他們沒有直接輸入的內容的語義搜索。
在我看來(未經驗證),對於大多數搜索案例,LLM 的更好用法是使用正常的完成 prompt 將用戶的搜索轉換為分面搜索(faceted-search),甚至是更復雜的查詢。但這根本不是 RAG。
經驗7:幻覺基本上不會發生
我們的每個用例本質上都是「這是一段文本,從中提取一些內容」。通常,如果要求 GPT 提供一段文本中提到的公司名稱,它不會為你提供「隨機公司」(除非文本中沒有公司,即零假設問題)。
類似地,GPT 並不會真正產生幻覺代碼。如果用例完全、詳細,那麼 GPT 實際上非常可靠。
原文鏈接:
https://kenkantzer.com/lessons-after-a-half-billion-gpt-tokens/