大模型應用開發入門分享

阿里妹導讀
本文是作者給兄弟團隊做的大模型入門分享,介紹了基本大模型模式,分享出來希望幫助更多的同學參與到LLM應用建設。
前言
大模型作為新興領域,不斷地冒出來新的專有術語和新的概念,讓大家覺得很神秘,捉摸不透。但是大部分複雜性的背後都會有一個極其簡單便於理解的模型,本次分享最主要就是大模型的基本正規化,透過正規化將這些神秘感去除。
大模型雖然很厲害,很神秘,但作為使用人員,門檻是非常非常非常低的。
模型基礎
雖然市面上的大型語言模型(LLMs)種類繁多,但在使用層面大家平等的都是API調包俠,因此從介面層面來剖析大模型有哪些能力。LLM的介面通常都遵循或類似於 OpenAI 的規範。這裡我們以 OpenAI 的介面為例進行說明。
在與大型模型互動時,除了控制模型輸出隨機性的引數外,最核心的引數只有兩個:messages 和 tools。可以說,市面上各種各樣的大模型應用,都是基於這兩個引數的基礎上設計而來
messages-大模型是怎麼實現記憶的?
  • messages是一個對話陣列,其中角色主要有:
  • system:代表當前對話的系統指令,一般放提示詞
  • user:使用者指令
  • assistant:LLM的回覆
  • …:不同廠商會有不同的擴充套件定義
大模型所謂的對話記憶實際上就是依賴該陣列做資訊傳遞,如下圖所示,第一輪我告訴我的名字叫屈定,第二輪的時候在問他是誰,他已經知道了我的名字,之所以知道因為我在messages的上下文中傳遞給了他這個資訊。
  • 使用user傳遞使用者的對話

  • 使用system設定系統指令

  • 提示詞的不穩定容易被指令注入攻擊

三張圖看完,先總結下:
  • 大模型為什麼能記住之前的對話?
只是因為後臺系統給了他之前的對話,並不是他自己記住。大模型的請求呼叫就是一個無狀態的,取決於每次給的對話內容。
  • 大模型的提示詞有什麼用?
大模型的提示詞可以進一步控制(覆蓋)模型的行為,具備高優先順序,但存在不穩定性

接下來我們就可以來理解第一個重要的大模型範式:檢索增強生成,也就是RAG(Retrieval Augmented Generation)
直白的理解為用檢索到的知識,來增量生成答案的質量。比如我有一個關於數倉各種問題處理的Q&A,想要做一個問答機器人,這個問答機器人要基於我的Q&A回覆使用者。這個 檢索Q&A -> 基於檢索到的Q&A回覆使用者,這個流程就是一個典型的RAG鏈路。也顯而易見,RAG的最終目標是生成靠譜的答案給到使用者。

RAG鏈路的搭建是很簡單,但是效果卻很難,從流程裡面我們能發現兩個關鍵點:
1.知識庫檢索召回:這裡要解決如何召回最靠譜的答案。
2.LLM基於知識回答:這裡要解決的是如何讓模型在一堆知識中給出自信準確的回答。
這些都是業界在不斷探索的東西,沒有所謂的標準答案,只有適合當前業務的最佳方案。

tools-大模型能執行任何工具?

經常有同學會問一些大模型是否能查詢odps,或者大模型能夠把數倉資料匯入到ob之類的問題。這些問題的背後是對LLM存在錯誤的理解,也就是tools引數的理解。
tools也是一個數組,包含了一堆工具集合,核心為工具的作用描述,和工具需要的引數,如下圖天氣工具的定義。

接下來就是使用工具,基於工具的回答至少要兩次大模型請求呼叫:
1.將使用者的對話和工具一起給到大模型,大模型需要執行的工具以及工具引數;
2.後端系統依據大模型選擇結果,去執行對應的工具,拿到結果;
3.再次請求大模型,此時上下文中給到了工具執行結果,大模型基於資訊回覆;

先總結下:
1.大模型並不能夠執行任何工具,但是大模型能夠選擇接下來要執行的工具。選擇後工具由配合的系統來執行獲取結果。

接下來我們就可以來理解第二個重要的大模型範式ReAct(Reason+Act)
這裡需要強調下,大模型的很多正規化都是對生活中人類行為的模擬,因此我們也是從生活中的案例來理解大模型。
案例主題:老闆讓寫一份調研外部大模型框架的報告
工具:網際網路搜尋,PPT,思維導圖
思考 (Reasoning): 需要調研外部大模型框架,明確調研目標是瞭解行業內的主要框架、特點和應用場景。需要先明確有哪些主流框架,然後針對性地收集資料。行動 (Acting):行動: 使用網際網路搜尋“主流大模型框架 2024/2025”、“開源大模型框架”。觀察 (Observation):觀察: 搜尋結果顯示:PyTorch、TensorFlow、JAX等是主流框架,還有一些新興框架如MindSpore、Paddle等。
思考 (Reasoning): 我已經拿到了想要的資料,接下來使用思維導圖搭建彙報思路行動 (Acting):行動: 使用思維導圖工具,搭建報告的初步框架,包括:框架名稱、開發語言、主要特點、優勢、劣勢、應用場景。觀察 (Observation):觀察: 初步框架包括:框架名稱、開發語言、主要特點(動態圖/靜態圖、分散式訓練支援等)、優勢、劣勢、應用場景(NLP、CV等)。
思考 (Reasoning): 資訊基本收集完畢,需要將所有資訊整理成結構化的報告,並使用PPT進行總結和分析。行動 (Acting):行動: 使用PPT工具,將思維導圖中的內容整理成PPT,並撰寫文字說明。觀察 (Observation):觀察: 完成了PPT初稿,內容比較全面,但需要進行排版美化。
這個思考的流程就是ReAct,後面有實際案例,這裡先理解這個概念。

模型使用
大模型的應用五花八門,但都離不開上述兩個核心引數,接下來圍繞上述的引數,我們能利用的現有的模型互動手段主要有以下三種,包括:
  • 調優提示詞:大模型工程中的核心,提示詞的優秀與否決定了你是否需要鏈路上做額外的兜底
  • 增加呼叫次數:將一個任務拆分為多個子任務執行,最後判斷結果。這是一種常用的對提示詞能力的補充手段,降低單一提示詞的複雜性。
  • 模型微調:透過引入特定業務場景案例,讓模型能更好地理解使用者的意圖和需求。
用大模型+提示詞做翻譯 [提示詞調優]
為了更好的評價,我們選擇哪吒中的英文臺詞,然後將英文翻譯成中文,看還原度如何?
The prejudice in people's hearts is like a mountain. No matter how hard you try, you can't move it.Looking back on it, three years isn't that long.Be quick to obey my commandI'm the captain of my destiny, not heaven.If you ask me whether people can change their own destiny, I don't know. But defying fate is Nezha's destiny.
方案一直接使用提示詞進行翻譯
## Role and Goal:你是一個翻譯專家,尤其擅長英文到中文的翻譯,接下來我給你多段英文臺詞,幫我翻譯成中文.## Constraints- 翻譯時保持譯文格式不變## Background:原文來自《哪吒》系列電影的第二部中的臺詞,講述了天劫之後,哪吒、敖丙的靈魂保住了,但很快會魂飛魄散。太乙真人打算用七色寶蓮給二人重塑肉身,但是在重塑肉身的過程中卻遇到重重困難,哪吒、敖丙的命運將迎來更多的挑戰。## Guidelines:1. 結合背景將文字直接翻譯成中文,保持原始格式,不省略任何資訊。## Source:- The prejudice in people's hearts is like a mountain. No matter how hard you try, you can't move it.- Looking back on it, three years isn't that long.- Be quick to obey my command- I'm the captain of my destiny, not heaven.- If you ask me whether people can change their own destiny, I don't know. But defying fate is Nezha's destiny.## Output:{譯文}
絕大多數情況下,直接使用提示詞能做到的效果就已經能達到60%了(現在的模型確實強大了),下方的問題在於一些短的語句翻譯不夠傳神。
模型
方案一翻譯結果:
gemini-2.0-flash
  • 人心中的成見就像一座大山,任你怎麼努力也無法搬動。
  • 如今想來,三年光陰,也不算長。
  • 還不快快聽我號令!
  • 我命由我定,不由天!
  • 要問我人能否改變自己的命運,我不知道。但是,逆天而行,就是哪吒的命。
方案二提示詞中引入COTChain-of-Thought
COT被稱為思維鏈,簡單點來說是要告訴模型針對問題的思考步驟是什麼,引導模型去按照特定思維解決問題。概念很抽象,以翻譯為例,我們思考一般人是如何進行翻譯的?
1.先直接翻譯
2.結合上下文再審視這個翻譯是否合理,有哪些改進點
3.針對改進點再斟酌修改
那麼我們也讓模型按照這個思路來執行翻譯。
## Role and Goal:你是一個翻譯專家,尤其擅長英文到中文的翻譯,接下來我給你多段英文臺詞,幫我翻譯成中文.## Constraints- 翻譯時保持譯文格式不變- 嚴格按照output中定義的正規化輸出## Background:原文來自《哪吒》系列電影的第二部中的臺詞,講述了天劫之後,哪吒、敖丙的靈魂保住了,但很快會魂飛魄散。太乙真人打算用七色寶蓮給二人重塑肉身,但是在重塑肉身的過程中卻遇到重重困難,哪吒、敖丙的命運將迎來更多的挑戰。## Guidelines:翻譯的過程分為三部分:1. 直譯:結合背景將文字直接翻譯成中文,保持原始格式,不省略任何資訊。2. 評估和反思:結合背景道教封神,主人公對命運反抗,識別直接翻譯中的具體問題,例如:- 非母語常用的中文表達,- 笨拙的措辭- 過於口語化的表達- 等等提供解釋,但不要新增或省略內容或格式。3. 意譯:根據字面翻譯和已識別的問題,重新解釋翻譯,確保它保持與原始輸入格式一致,不要刪除任何內容。## Source:- The prejudice in people's hearts is like a mountain. No matter how hard you try, you can't move it.- Looking back on it, three years isn't that long.- Be quick to obey my command- I'm the captain of my destiny, not heaven.- If you ask me whether people can change their own destiny, I don't know. But defying fate is Nezha's destiny.## Output:### 直譯{直譯}***### 評估和反思{評估和反思}***### 意譯{意譯}
該方案取得了意想不到的效果,針對長句翻譯成短句組合形式, 相比官方的來看,更像是修道者的口吻,但針對一些特殊短句用法,仍然不夠理想。
模型
方案一翻譯結果:
方案二翻譯結果:
gemini2.0 flash
  • 人心中的成見就像一座大山,任你怎麼努力也無法搬動。
  • 如今想來,三年光陰,也不算長。
  • 還不快快聽我號令!
  • 我命由我定,不由天!
  • 要問我人能否改變自己的命運,我不知道。但是,逆天而行,就是哪吒的命。
  • 人心存偏見,如山嶽難移。縱使竭盡全力,亦不可撼動分毫。
  • 如今想來,三年光陰,彈指一揮間。
  • 奉我號令,不得有誤!
  • 我命由我不由天!
  • 若問世人能否逆天改命,吾不得而知。然,抗爭宿命,乃哪吒之命也。
方案三引入動態few shot
few shot指的是提示詞中的少樣本技巧,動態就是將這部分樣本抽離到一個知識庫,每一次走翻譯前先去知識庫裡面召回TOP最相關的,然後放入到提示詞的Example中。
假設我的知識庫中召回瞭如下兩句:
Item1: 原文:Be quick to obey my command意譯:急急如律令Item2: 原文:Life is notlong, but it'notshort either.意譯:人生,說長不長,說短不短。
結合後提示詞如下:
## Role and Goal:你是一個翻譯專家,尤其擅長英文到中文的翻譯,接下來我給你多段英文臺詞,幫我翻譯成中文.## Constraints- 翻譯時保持譯文格式不變- 嚴格按照output中定義的正規化輸出## Background:原文來自《哪吒》系列電影的第二部中的臺詞,講述了天劫之後,哪吒、敖丙的靈魂保住了,但很快會魂飛魄散。太乙真人打算用七色寶蓮給二人重塑肉身,但是在重塑肉身的過程中卻遇到重重困難,哪吒、敖丙的命運將迎來更多的挑戰。## Guidelines:翻譯的過程分為三部分:1. 直譯:結合背景將文字直接翻譯成中文,保持原始格式,不省略任何資訊。2. 評估和反思:結合背景道教封神,主人公對命運反抗,識別直接翻譯中的具體問題,例如:- 非母語常用的中文表達,- 笨拙的措辭- 過於口語化的表達- 等等提供解釋,但不要新增或省略內容或格式。3. 意譯:根據字面翻譯和已識別的問題,重新解釋翻譯,確保它保持與原始輸入格式一致,不要刪除任何內容。## Example:1. 原文:Be quick to obey my command意譯:急急如律令---2. 原文:Life is not long, but it's not short either.意譯:人生,說長不長,說短不短。## Source:- The prejudice in people's hearts is like a mountain. No matter how hard you try, you can't move it.- Looking back on it, three years isn't that long.- Be quick to obey my command- I'm the captain of my destiny, not heaven.- If you ask me whether people can change their own destiny, I don't know. But defying fate is Nezha's destiny.## Output:### 直譯{直譯}***### 評估和反思{評估和反思}***### 意譯{意譯}
模型
方案一翻譯結果:
方案二翻譯結果:
方案三翻譯結果:
gemini2.0 flash
  • 人心中的成見就像一座大山,任你怎麼努力也無法搬動。
  • 如今想來,三年光陰,也不算長。
  • 還不快快聽我號令!
  • 我命由我定,不由天!
  • 要問我人能否改變自己的命運,我不知道。但是,逆天而行,就是哪吒的命。
  • 人心存偏見,如山嶽難移。縱使竭盡全力,亦不可撼動分毫。
  • 如今想來,三年光陰,彈指一揮間。
  • 奉我號令,不得有誤!
  • 我命由我不由天!
  • 若問世人能否逆天改命,吾不得而知。然,抗爭宿命,乃哪吒之命也。
  • 人心之偏見,如山嶽巋然,縱移山填海,亦難撼其分毫。
  • 事過境遷,三年光陰,亦不過彈指一揮間。
  • 急急如律令
  • 我命由我不由天!
  • 若問人定勝天否,我亦茫然。然逆天而行,乃哪吒之宿命。
few shot這種開卷考試方法是大模型鏈路中一種重要的最佳化手段,few shot是提示詞中為數不多能夠動態變化的部分,且對模型整體效果影響較小,更為可控。此外業務流量一般都是符合2:8分佈的,且是可收斂的,可能只需要20%的few shot案例,就能滿足80%的場景訴求。
用大模型+Agent做計算器 [增加呼叫次數]
大家應該都看過下面的案例,大模型是很不擅長數學計算的,那麼用大模型直接做計算器就非常容易出問題。

這裡使用llama_index的agent框架做演示:
1.定義了三個工具函式,乘法,加法,減法
2.構建一個Agent執行模式
import osfrom dotenv import load_dotenvfrom llama_index.core.agent import ReActAgentfrom llama_index.core.tools import FunctionToolfrom llama_index.llms.azure_openai import AzureOpenAIdef multiply(a: int, b: int) -> int:    """Multiply two integers and returns the result integer"""return a * bdef add(a: int, b: int) -> int:    """Add two integers and returns the result integer"""return a + bdef subtract(a: int, b: int) -> int:    """subtract two integers and returns the result integer"""return a - b# 載入 .env 檔案load_dotenv()# 初始化工具multiply_tool = FunctionTool.from_defaults(fn=multiply)add_tool = FunctionTool.from_defaults(fn=add)subtract_tool = FunctionTool.from_defaults(fn=subtract)llm = AzureOpenAI(model="gpt-4o",  # 或者 gpt-4                  engine='gpt-4o',                  deployment_name="gpt-4o",                  api_key=os.getenv('AZURE_KEY'),                  azure_endpoint="https://ilm-dev.openai.azure.com",                  api_version="2023-07-01-preview")# 初始化Agentagent = ReActAgent.from_tools([multiply_tool, add_tool, subtract_tool], llm=llm, verbose=True)response = agent.chat("What is 60-(20+(2*4))? Calculate step by step ")
> Running step cba1a160-74c3-4e34-bcc4-88e6a678eaf9. Step input: What is60-(20+(2*4))? Calculate step by step Thought: The current language of the user is: English. I need to use a tool to help me answer the question.To solve the expression \(60 - (20 + (2 * 4))\) step by step, I will first calculate the multiplication inside the parentheses.Action: multiplyAction Input: {'a'2'b'4}Observation: 8> Running step 5455108e-ac53-4115-8712-68f2457a9b82. Step input: NoneThought: Now that I have the result of the multiplication, I can proceed to the next step, which is to add20and8.Action: addAction Input: {'a'20'b'8}Observation: 28> Running step 4d8fae00-83bd-4205-9993-f0e0119f408d. Step input: NoneThought: Now that I have the result of the addition, I can proceed to the final step, which is to subtract 28from60.Action: subtractAction Input: {'a'60'b'28}Observation: 32> Running step ce5d1075-ff11-47a2-b286-d7a715dc40ba. Step input: NoneThought: I can answer without using any more tools. I'll use the user's language to answer.Answer: The result of the expression \(60 - (20 + (2 * 4))\) is32.

上次有同學問,那麼大模型在這種鏈路裡面到底發揮了什麼作用?大模型最大的能力就是自然語言理解,我們可以嘗試把規則再複雜化,輸入改成張三代表減法,李四代表加法,王二代表乘法,What is 60張三(20李四(2王二4))? Calculate step by step,表現仍然可以,這就帶來了對自然語言的容錯,會像人一樣去思考,而不是固定死的邏輯。
Thought: The current language of the user is English. I need to use a tool to help me answer the question. The expression given is60張三(20李四(2王二4)), which translates to 60 - (20 + (2 * 4)). I will calculate step by step.First, I need to calculate the multiplication part: 2王二4, which is2 * 4.Action: multiplyAction Input: {'a'2'b'4}Observation: 8> Running step 48262cb8-5c3a-47b7-b13b-449787c27078. Step inputNoneThought: The result of 2王二4is8. Now, I need to calculate the addition part: 20李四8, which is20 + 8.Action: addAction Input: {'a'20'b'8}Observation: 28> Running step 1cccd5c6-3d96-4014-a579-1c997765a1da. Step inputNoneThought: The result of 20李四8is28. Now, I need to calculate the subtraction part: 60張三28, which is60 - 28.Action: subtractAction Input: {'a'60'b'28}Observation: 32> Running step 65d33d20-1009-4482-a6d2-7af20333640c. Step inputNoneThought: I can answer without using any more tools. I'll use the user's language to answer.Answer: The result of 60張三(20李四(2王二4)) is32.
模型微調
這部分具體案例就不好說了,我舉個實際生產的案例,在給WorldFirst做客服的時候,存在很多特殊的業務知識,比如使用者在萬里匯下載銀行對賬單 != 下載交易流水單。這裡有業務背景,銀行對賬單是亞馬遜要求的賬戶證明檔案。這些業務背景是模型難以掌握的,此時就需要引入微調,將這部分知識內建到模型裡面。
現在主流的方式都在慢慢弱化微調,因為費時費力,還不一定起到正向的效果,更多的工程實踐是將提示詞複雜化動態化,工程上做更多的兜底工作。
一些感想
大模型能帶來很大的工作和問題思考方式的革新,讓一些問題解決方式變成取決於你的想象力,但對客的業務的效果並非完全取決於大模型。很多同學認為有了LLM,業務效果,開發效率,交付質量都能很方便解決,什麼都往LLM上靠攏,這是很大的誤區。
以筆者參與的客服場景感想,最早都認為客服是非常適合大模型的場景,筆者同樣也是這樣認為。實際深入後,並非如此,尤其是在對專業度和準確率有明確要求的場景。客服作為售後,使用者是帶著問題帶著情緒來的,他需要的是明確的解決方案,不需要機械式的安撫和吐答案。因此業辦能力 + 擬人化是客服成功的兩大主要因素,確定主要因素後,再去思考LLM在這些因素點上能帶來什麼,接著思考構建你的方案,這樣的應用才是靠譜的方式。
端到端全鏈路追蹤診斷
本方案為您介紹如何使用應用即時監控服務 ARMS 應用監控進行一站式呼叫鏈路追蹤,幫助您快速定位問題,洞察效能瓶頸,重現呼叫引數,從而大幅提升線上問題診斷的效率。    
點選閱讀原文檢視詳情。

相關文章