淺析面向場景的大模型應用框架選擇
原創從demo到產品之間存在著鴻溝,大模型應用也是如此。在工程實踐的時候,產品/服務提供的功能與性能及成本之間存在著大量的權衡,面向場景來選擇大模型的應用框架,則是一種具體的權衡方法。
例如,什么時候使用Agent?當任務太復雜而無法通過單個LLM調用完成時,或者如果任務需要非LLM功能,則需要使用Agent系統。在這種情況下,復雜的任務分解為更簡單的任務,并在Agent框架中編排它們。其他的時候,可能會畫蛇添足。
1. 場景的抽象
在面對不可枚舉的應用場景時,如何選擇合適的大模型應用框架呢?
我們可以嘗試從技術特征出發,對場景進行分類,這是一個抽象的過程。LLM作為一種非確定性技術,如果您不需要所創建的內容具有那么多的唯一性,那么它帶來的麻煩將超過它的價值。減少了不確定性的應用框架也減少了對LLM的調用總數,因此還有降低使用LLM總成本的作用。由于LLM調用比典型的Web服務慢,這也有減少延遲的作用。
然而,LLM存在幻覺問題,并在其訓練數據中反映偏見和毒性。鑒于此,直接向終端用戶發送LLM生成的內容存在風險。解決這個問題會增加很多工程復雜性,可能需要引入一個實體在回路中檢查內容,或者在應用程序中添加護欄,以驗證生成的內容沒有違反策略。
于是,我們可以把確定性和風險作為兩個維度,把成本和延遲作為約束條件,嘗試對場景進行分類,進而選擇相應的應用框架。
2. 確定性低且風險低的場景——提示模版
面對確定性低且低風險的任務,在每次需要生成內容時調用 LLM 的 API。我們使用 PromptTemplate 并根據運行時參數對發送給 LLM 的提示進行模板化,這樣的應用框架是一個好的選擇。例如,基于提示發送電子郵件,我們可以使用 langchain:
prompt_template = PromptTemplate.from_template(
"""
You are an AI executive assistant to {sender_name} who writes letters on behalf of the executive.
Write a 3-5 sentence thank you message to {recipient_name} for {reason_for_thanks}.
Extract the first name from {sender_name} and sign the message with just the first name.
"""
)
...
response = chain.invoke({
"recipient_name": "John Doe",
"reason_for_thanks": "speaking at our Data Conference",
"sender_name": "Jane Brown",
})
使用此框架的常見情況是針對交互式應用程序的內部用戶(風險很低)。
為重復的任務使用預生成的、經過審查的模板,減少了對持續的人工審查的需要。適合中等創造力,低中等風險的情況下,標準化,但個性化的內容是必要的。
3. 確定性中且風險低的場景——提示緩存
如果希望重復提問每次都生成相同的答案,大幅度降低成本和延遲的一種方法是緩存過去的提示和響應,可以使用 langchain 在客戶端執行這樣的緩存:
from langchain_core.caches import InMemoryCache
from langchain_core.globals import set_llm_cache
set_llm_cache(InMemoryCache())
prompt_template = PromptTemplate.from_template(
"""
What are the steps to put a freeze on my credit card account?
"""
)
chain = prompt_template | model | parser
除了客戶端緩存精確的文本輸入和相應的響應之外,緩存還是很有用的。Anthroic 支持“提示緩存”,可以要求模型在服務器端緩存部分提示(通常是系統提示和重復上下文) ,同時在每個后續查詢中繼續向其發送新的指令。使用提示緩存降低了每個查詢的成本和延遲,同時不影響非確定性。它在 RAG、文檔提取和示例變多時的few-shot提示中特別有用。
4. 確定性高且風險低的場景——SLM
在大型語言模型(LLM)中完全消除幻覺幾乎是不可能的。使用較小的LLM來執行更有針對性的任務雖然可以減少幻覺的風險,但這可能會影響準確性。然而,小型語言模型(SLM)正在變得越來越精確且尺寸越來越小,而LLM則主要專注于增強其任務能力。對于像文檔提取這樣的特定任務,這些方法之間的準確性差異已經趨于穩定。
如今,越來越多的企業級任務可以通過使用SLM和非最前沿的LLM來完成,這些任務通常具有較高的確定性和較低的風險承受能力。例如,從文檔中創建嵌入、進行知識檢索和主題建模等任務就非常適合使用小型語言模型。這類任務不僅需要高度的準確性,還要求模型能夠快速響應并處理大量數據。因此,選擇適當的模型大小和技術方案對于確保業務效率和數據安全至關重要。隨著技術的發展,我們可以預見未來會有更多創新的方法出現,以進一步提高模型的性能和適用性。
5. 確定性中且風險中的場景——響應模版
如果給訂購旅游產品的用戶發送郵件,而且沒有內部人員能夠在發送之前編輯每封信,這是一個非確定性中且風險為中等的場景。在這種情況下,預先生成模板化響應可能是有幫助的。
prompt_template = PromptTemplate.from_template(
"""
Write a letter to a customer who has purchased {product_name} tour package.
The customer is traveling {group_type} and the tour is to {tour_destination}.
Sound excited to see them and explain some of the highlights of what they will see there
and some of the things they can do while there.
In the letter, use [CUSTOMER_NAME] to indicate the place to be replaced by their name
and [TOUR_GUIDE] to indicate the place to be replaced by the name of the tour guide.
"""
)
chain = prompt_template | model | parser
print(chain.invoke({
"group_type": "family",
"tour_destination": "Beijing, China",
}))
我們要求 LLM 在消息中插入可以動態替換的占位符。無論何時需要發送響應,都要從數據庫中檢索消息,并用實際數據替換占位符。
6. 確定性高且風險中等的場景——組裝式學習
對于一家印刷機零件制造商而言,為其產品目錄中的每一項創建一個網頁是一項既重要又需要高度準確性的任務。在此過程中,確保信息的真實性至關重要,例如不能錯誤地宣稱某個零件具有耐熱性,而實際上它并不具備這種特性。同樣,也要避免使用大型語言模型(LLM)時產生誤導,比如讓讀者誤以為安裝某個部件需要特定的工具。
面對這樣的挑戰,采用預生成內容的策略可以有效降低動態內容帶來的風險。這意味著利用預先準備好的模板和數據來生成網頁內容,而不是完全依賴即時生成的內容。在這種情況下,LLM的作用被限制在提取關鍵信息和生成摘要上,即使這些操作是“實時”完成的,由于它們基于已有的數據和規則,因此只會帶來相對較低的風險。
這家制造商可能擁有一個詳盡的數據庫,其中包含了每個零件的所有相關屬性。一種簡單而有效的方法是使用LLM為每個屬性自動生成描述性文本。然而,在將這些自動生成的內容存儲到內容管理系統之前,進行人工審核是必不可少的步驟。這樣可以確保所有信息都是準確無誤的,并且符合公司的標準和期望。通過這種方式,不僅可以提高內容的準確性,還能增強用戶對品牌的信任感。
prompt_template = PromptTemplate.from_template(
"""
You are a content writer for a manufacturer of paper machines.
Write a one-paragraph description of a {part_name}, which is one of the parts of a paper machine.
Explain what the part is used for, and reasons that might need to replace the part.
"""
)
chain = prompt_template | model | parser
print(chain.invoke({
"part_name": "xxx",
}))
該方法適用于內靜態內容。然而,如果是一家電子商務零售商,想創建個性化的推薦,內容會更加動態,需要LLM更高的不確定性。就準確性而言,風險承受能力仍然大致相同。
我們可以使用這種將預生成+機器學習相結合的方法。使用 LLM 進行重新格式化和摘要,并預先生成內容以確保準確性,其中準確性是至關重要的一些部分的內容,而創造性的寫作是必需的其他方面。利用機器學習根據用戶上下文選擇合適的預生成模板,平衡個性化和風險管理。
另外, 模型微調也是面對這樣場景的一種技術選擇。微調的常見用例包括能夠創建品牌內容、機密信息摘要和個性化內容。
7. 確定性低且風險高的場景——安全護欄
面對需要全方位能力并伴隨多種風險(如品牌風險、機密信息泄露等)的挑戰,建立安全護欄成為應用層不可或缺的策略。這些護欄不僅涉及對輸入模型的數據進行預處理,確保其安全性和適宜性,還包括對模型輸出的細致后期處理,以及對錯誤條件的迭代提示詞優化,從而形成一道堅固的防線。
在確定性較低或要求高度創造力的任務中,高風險如影隨形。此時,定制的安全護欄顯得尤為重要,它們能夠針對性地減輕包括品牌損害在內的多重風險,并強化數據安全性。這種定制化的防護措施對于滿足特定行業或應用程序的獨特需求至關重要,確保在追求創新和效率的同時,不失穩健與安全。通過這樣的多層次安全策略,組織能夠在復雜多變的數字環境中保持競爭力,同時有效管理潛在威脅。
8.一句話小結
根據不同場景的確定性和風險程度,采取相應的大模型應用框架:低確定性低風險使用提示模版,中確定性低風險使用提示緩存,高確定性低風險采用SLM,中確定性中風險應用響應模版,高確定性中風險實施組裝式學習,而低確定性高風險則設置安全護欄。當然,這是探索性的粗糙分類,希望可以拋磚引玉!