大語言模型的應用日益普及,開發者需要掌握客製化和評估技巧才能有效運用。本文除了介紹溫度引數、模型選擇等客製化方法外,也說明 BERTScore 等評估指標的計算方式,並提供 Python 程式碼範例。此外,文章也涵蓋提示工程的技巧與挑戰,以及 LLM 在程式碼生成、摘要、翻譯等方面的應用,幫助開發者瞭解如何撰寫有效的提示以獲得最佳結果。最後,文章也討論了 LLM 的不同型別和應用挑戰,提供開發者更全面的參考。
大語言模型的客製化與評估
大語言模型(LLMs)在軟體開發領域的應用越來越廣泛,尤其是在程式碼生成、程式碼審查和錯誤修復等方面。為了更好地利用這些模型,開發者需要了解如何客製化和評估它們。
客製化大語言模型
客製化LLMs可以透過調整各種引數來實作,包括:
- 模型選擇:開發者可以選擇不同的模型,甚至使用自己微調的LLMs,以確保模型能夠滿足特定的開發需求。
- 溫度(Temperature):這個引數控制著生成內容的隨機性和創造性。較低的值會使輸出更加確定性和準確,而較高的值則會增加創意但也可能導致輸出不合理。
- 程式碼生成:0.2–0.3,確保輸出準確且符合慣例。
- 程式碼審查:0.2或更低,專注於最佳實踐和標準。
- 創意問題解決:0.7–1.0,探索更廣泛的解決方案。
調整引數的例子
import openai
# 設定API金鑰
openai.api_key = '你的API金鑰'
# 定義一個簡單的提示
prompt = "在Python中,如何使用Tkinter建立一個簡單的GUI來取得使用者的姓名和年齡?"
# 調整溫度引數
response = openai.Completion.create(
engine="text-davinci-003",
prompt=prompt,
max_tokens=2048,
temperature=0.3, # 調整溫度
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
# 輸出結果
print(response.choices[0].text.strip())
內容解密:
openai.api_key = '你的API金鑰':這行程式碼設定了OpenAI的API金鑰,用於身份驗證。prompt變數定義了輸入模型的提示,用於詢問如何使用Tkinter建立GUI。openai.Completion.create()方法用於向模型提交提示並生成回應。temperature=0.3:設定溫度為0.3,以獲得更確定性的輸出。max_tokens=2048:限制輸出的最大長度。
評估大語言模型
評估LLMs是一項艱巨的任務,因為這些模型往往不透明。研究人員提出了一些評估指標,例如:
- BERTScore:用於評估生成文字的品質。
BERTScore的計算
from bert_score import score
# 定義候選文字和參考文字
candidates = ["這是一個測試句子。"]
references = ["這是用於比較的參考句子。"]
# 計算BERTScore
P, R, F1 = score(candidates, references, lang="zh-tw")
# 輸出結果
print(f"Precision: {P.mean():.4f}")
print(f"Recall: {R.mean():.4f}")
print(f"F1 Score: {F1.mean():.4f}")
內容解密:
from bert_score import score:匯入BERTScore函式庫中的score函式。candidates和references變數分別定義了候選文字和參考文字,用於比較。score(candidates, references, lang="zh-tw"):計算BERTScore,語言設定為繁體中文(zh-tw)。- 輸出Precision、Recall和F1 Score,用於評估生成文字的品質。
評估大語言模型的指標與方法
評估大語言模型(LLM)的方法多種多樣,涵蓋了從自然語言處理到程式碼生成的各個方面。這些評估指標和方法旨在衡量模型的效能、準確性和適用性。
常見的評估指標
BERTScore
BERTScore 利用 BERT 嵌入來比較生成文字和參考文字之間的相似度。雖然主要用於自然語言文字,但也可以擴充套件到程式碼生成任務,特別是在程式碼帶有註解或說明時。
Perplexity(困惑度)
困惑度是評估機率模型(如LLM)的常見指標。它量化了模型預測的機率分佈與實際資料分佈之間的吻合程度。在程式碼生成的背景下,較低的困惑度值表示模型在預測程式碼序列中的下一個詞元方面表現更好。
BLEU(雙語評估替換)
BLEU 原本用於機器翻譯,但也用於程式碼生成,以比較生成的程式碼和參考程式碼。它計算 n-gram 精確度分數,以量化生成文字和參考文字之間的相似度,從而幫助評估生成程式碼的語法正確性。較高的 n-gram 精確度分數表示生成文字和參考文字在特定序列上的吻合度更高。
ROUGE(導向召回的評估工具)
ROUGE 是另一個從 NLP 領域借鑒而來的評估指標,用於評估程式碼生成模型。它計算生成文字和參考文字之間的 n-gram 重疊,提供有關生成程式碼與預期輸出的一致性的見解。
程式碼生成評估基準
MBXP(最基本的 X 程式設計問題)
MBXP 是一個專門為評估跨多種程式語言的程式碼生成模型而設計的基準。它使用可擴充套件的轉換框架,將原始資料集中的提示和測試案例轉換為目標語言,從而促進對程式碼生成模型的全面多語言評估。
HumanEval
HumanEval 是一個用於評估 LLM 程式碼生成能力的基準,透過衡量其從檔案字串合成程式的功能正確性。這個基準對於持續開發和增強 AI 模型在程式碼生成方面的能力至關重要。
多語言 HumanEval(HumanEval-X)
HumanEval-X 是原版 HumanEval 基準的擴充套件。它評估 LLM 在超過 10 種程式語言中的程式碼生成和翻譯能力,利用轉換框架將 Python 中的提示和測試案例轉換為對應的目標語言資料,建立了一個更全面的多語言程式碼生成和翻譯基準。
評估大語言模型的複雜性
評估 LLM 不僅僅是看引數數量的多少。雖然更多的引數可能意味著更強的能力,但也伴隨著巨大的計算成本和能耗。此外,引數數量的增加也會導致模型的複雜性增加,可能會出現過擬合的問題。過擬合意味著模型在訓練資料上表現極佳,但在未見資料上表現不佳,從而削弱了其泛化能力。
大語言模型的型別
開放原始碼 LLM
開放原始碼 LLM 允許任何人使用、修改或分享它們,具有透明度高、可協作創新等優點。然而,它們也存在沒有專門團隊維護、安全性問題、檔案不完善等缺點。
封閉原始碼或專有 LLM
封閉原始碼或專有 LLM 則保持其程式碼、訓練資料和模型結構的秘密性,但通常具有更好的維護和支援。
此圖示展示了評估大語言模型的不同指標和方法,以及大語言模型的兩種型別:開放原始碼和封閉原始碼。
詳細內容解說
上述圖表清晰地展示了大語言模型的評估方法和指標的多樣性,以及不同型別的LLM的特點。這些內容對於理解和應用LLM具有重要的指導意義。
大語言模型的開發與應用挑戰
開發大語言模型(LLM)是一項複雜的任務,需要龐大的資本投入。根據表2-6的資料,頂級LLM開發商在2023年獲得了巨額資金。
資金投入與技術優勢
| 公司名稱 | 獲得資金 |
|---|---|
| Anthropic | 12.5億美元 |
| OpenAI | 100億美元 |
| Cohere | 2.7億美元 |
| Inflection AI | 13億美元 |
這些資金使公司能夠聘請全球頂尖的資料科學家,並建立先進的基礎設施。因此,這些LLM在效能上往往達到最先進水平,並且能夠滿足企業對於安全性和隱私性的嚴格需求。
挑戰與風險
然而,這些大型AI系統也面臨著一些挑戰。首先是信任問題:這些模型如何生成回應?如何處理幻覺和偏見?這些問題的答案往往不夠詳細。
另一個風險是這些大型AI營運商可能形成壟斷,這可能導致客戶被鎖定在特定的生態系統中。此外,閉源LLM可能比開源專案更容易停滯不前,因為它們無法受益於開源專案所帶來的多樣化輸入和審查。
評估AI輔助程式設計工具
選擇合適的AI輔助程式設計工具可能是一個令人頭痛的問題。你需要權衡多個因素,例如精確度、聊天功能、安全性、速度和使用者友好性。有時,這取決於你覺得哪個工具用起來更舒服。但如果你所屬的公司堅持使用特定的系統,你的選擇餘地可能會受到限制。
熱門工具排行榜
根據Stack Overflow的2023年開發者調查,近9萬名開發者參與了最受歡迎工具的評選,結果如表2-7所示。
| AI輔助開發工具 | 使用比例 |
|---|---|
| GitHub Copilot | 54.77% |
| Tabnine | 12.88% |
| Amazon CodeWhisperer | 5.14% |
| Snyk Code | 1.33% |
| Codeium | 1.25% |
| Wispr AI | 1.13% |
| Replit Ghostwriter | 0.83% |
| Mintlify | 0.52% |
| Adrenaline | 0.43% |
| Rubberduck AI | 0.37% |
這個排行榜讓我們瞭解到市面上有多種工具可供選擇。在挑選工具時,向其他開發者尋求推薦是一個明智的做法。同時,自己測試幾款工具也很有幫助。幸運的是,大多數工具都提供免費試用,讓你可以在承諾之前先試用。
試用與選擇
測試這些工具時,你應該考慮公司的財務支援。是否有風險投資基金的支援?如果沒有,公司可能會在成長和創新方面遇到困難。已經有一些AI輔助程式設計公司因為財務問題而停止了服務,這對開發者來說是一個很大的困擾。例如,Kite是一家早期進入該領域的公司,但最終在2022年決定停止其專案。不過,它將大部分工具的程式碼開源了。
提示工程
提示工程是機器學習和自然語言處理的一個子領域,主要目標是研究如何與大語言模型進行有效的溝通,以便獲得所需的答案。可以把它想像成向別人尋求建議時,你需要提供背景資訊並清楚地表達你的需求。同樣地,在與LLM互動時,你需要精心設計你的問題或提示,有時還需要在問題中加入一些提示或額外的資訊,以確保LLM理解你的需求。
與LLM互動的藝術與科學
提示工程既是一門藝術,也是一門科學。一方面,你需要選擇正確的詞彙和語氣,以引導AI產生你想要的回應。這需要一些直覺和創造力來引導對話的方向,並提煉出詳細和細微的回應。另一方面,提示工程也需要對AI模型的工作原理有深入的瞭解,並且需要精確、可預測和可重複的結果。
策略與技巧
在提示工程中,你不太可能找到一勞永逸的解決方案。雖然市面上有許多課程、影片和書籍聲稱擁有提示工程的所有“秘密”,但讀者應該抱持懷疑的態度。有效的提示工程需要不斷的實驗、分析和調整,直到獲得滿意的結果。
程式碼範例
// 簡單的使用者登入系統範例
function login(username, password) {
// 簡單的驗證邏輯
if (username === 'admin' && password === 'password') {
return true;
} else {
return false;
}
}
內容解密:
此範例展示了一個簡單的使用者登入系統實作。首先定義了一個login函式,接受使用者名稱和密碼作為引數。在函式內部,進行了一個簡單的驗證:如果使用者名稱是admin且密碼是password,則傳回true,表示登入成功;否則傳回false,表示登入失敗。
程式碼改進
// 改進的使用者登入系統範例,加入密碼加密
const crypto = require('crypto');
function hashPassword(password) {
// 使用SHA-256加密密碼
return crypto.createHash('sha256').update(password).digest('hex');
}
function login(username, password) {
const storedHash = '5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8'; // admin/password 的 SHA-256 雜湊值
const inputHash = hashPassword(password);
if (username === 'admin' && inputHash === storedHash) {
return true;
} else {
return false;
}
}
內容解密:
在改進的範例中,我們加入了密碼加密的功能。首先定義了一個hashPassword函式,使用SHA-256演算法對密碼進行雜湊處理。在login函式中,我們比較輸入密碼的雜湊值與預先儲存的雜湊值是否一致,以此來驗證密碼。這樣可以避免直接儲存明文密碼,提高安全性。
隨著AI技術的不斷發展,提示工程作為一個新興領域,正吸引著越來越多的關注。它不僅需要技術上的專業知識,也需要創造力和實踐經驗。未來,我們可以預見提示工程將在更多領域發揮重要作用,例如軟體開發、內容創作和客戶服務等。
提示工程的挑戰與技巧
在人工智慧和機器學習的世界中,新的模型和技術不斷湧現,使得提示工程成為一個不斷變化的領域。提示工程可以令人感到沮喪,因為即使是對提示的微小更改也可能導致語言模型(LLM)產生截然不同的輸出。這是由於LLM底層的先進技術根據機率框架。
提示工程的挑戰
以下是提示工程中的一些挑戰:
冗長的回應
LLM可能會給出冗長的回應,當你只需要一個簡短的答案時。它們傾向於新增許多相關的想法或事實,使得回應超過必要長度。如果你希望LLM直接切入正題,只需要求它保持「簡潔」。
不可轉移性
這意味著適用於一個LLM的提示可能不適用於另一個LLM。換句話說,如果你從ChatGPT切換到Gemini或GitHub Copilot,你可能需要調整你的提示,因為每個LLM都有其獨特的訓練、設計和專業化。
長度敏感性
LLM可能會被過長的提示弄得不知所措,並開始忽略或誤解輸入的部分內容。這就像是LLM的注意力持續時間出現了偏差,其回應變得有些分散。因此,你應該避免在提示中提供詳細的要求;保持提示在一頁以內。
模糊性
如果你的提示不明確,LLM可能會感到困惑,並提供完全不相關或純屬虛構的回應。清晰度是關鍵。
提示的組成部分
你可以將一個提示視為具有四個主要組成部分,如圖3-1所示。
圖示:提示的四個主要組成部分
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 大語言模型客製化與評估
package "LLM 客製化與評估" {
package "客製化引數" {
component [模型選擇] as model
component [溫度調整] as temp
component [Top-P 設定] as topp
}
package "評估指標" {
component [BERTScore] as bert
component [BLEU 分數] as bleu
component [人工評估] as human
}
package "應用場景" {
component [程式碼生成] as code
component [文字摘要] as summary
component [語言翻譯] as translate
}
}
model --> temp : 基礎設定
temp --> topp : 控制隨機性
topp --> bert : 輸出評估
bert --> bleu : 多維度評估
bleu --> human : 品質驗證
code --> temp : 低溫度 0.2-0.3
summary --> temp : 中溫度 0.5
translate --> temp : 低溫度
note right of temp
溫度設定建議:
- 程式碼生成: 0.2-0.3
- 程式碼審查: 0.2 以下
- 創意問題: 0.7-1.0
end note
note right of bert
評估挑戰:
- 冗長回應處理
- 不可轉移性
- 長度敏感性
end note
@enduml
首先,上下文指定了LLM在提供回應時應採用的角色或人物。接下來,是諸如總結、翻譯或分類別等指令。然後,如果你希望LLM處理資訊以產生更好的回應,則需要輸入內容。最後,你可以指定輸出的格式。
請記住,你不需要全部四個組成部分。事實上,你可能只需要其中一個就能得到好的回應。但作為一般規則,提供更多的具體細節給LLM總是更好的。
上下文
你通常會以一兩句話開始你的提示,提供上下文。通常,你會指定你希望AI承擔的角色或人物。這會導致更準確、更具上下文相關性的回應,從而確保更有意義的結果。
例如,如果你想除錯一段程式碼,你可能會使用以下作為上下文:
提示:你是一位具有除錯Java應用程式經驗的軟體工程師。
或者,如果你想了解某個演算法的最佳化技術,你可以透過宣告以下內容來設定場景:
提示:你是一位具有演算法最佳化專業知識的高階軟體開發人員。
新增上下文有助於LLM以正確的心態處理你的提示。
指令
你的提示應該至少包含一個明確的指令。你可以新增更多的指令,但需要謹慎。將一堆積查詢塞進你的提示中可能會讓LLM感到困惑,使其更難得到你想要的答案。
為什麼多個指令會導致問題?
首先,當你有多個指令時,事情可能會變得模糊。如果它們不清晰或似乎相互衝突,LLM可能會對該關注哪一個或如何平衡它們所有指令感到困惑。
其次,擁有多個指令意味著LLM需要處理和理解你的提示中的每個部分,然後弄清楚如何將所有部分編織成一個連貫的回應。這需要大量的心理體操,有時可能會導致錯誤或答案不正確。
簡化你的提示
鑑於所有這些,一個專業的技巧是保持簡單。不要一次性向LLM提出一整串問題,而是嘗試將它們分解成一系列較小的提示。這就像進行一場來回的對話,而不是進行一場獨白。
######### 內容解密:
- 上下文的重要性:透過提供上下文,可以幫助LLM更好地理解你的需求,從而提供更準確和相關的回應。
- 指令的清晰度:清晰和簡潔的指令對於獲得正確的回應至關重要。避免使用模糊或相互衝突的指令。
- 總結技巧:總結是一種非常有用的技巧,可以幫助你快速掌握冗長的檔案或報告的主要內容。
- 多指令處理:當需要處理多個指令時,將它們分解成較小的提示可以提高LLM的理解和回應準確性。
透過遵循這些技巧和了解提示工程中的挑戰,你可以更好地利用LLM來完成各種任務,從而提高工作效率和準確性。
大語言模型在軟體開發中的多樣應用
大語言模型(LLM)為軟體開發者提供了諸多強大的功能,包括摘要、分類別、推薦和翻譯等,能夠顯著提升開發效率和程式碼品質。以下將探討這些應用及其實際操作方法。
自動摘要與主題建模
自動摘要功能能夠從大量文字中提取關鍵資訊,對於處理冗長的電子郵件、檔案或程式碼註解尤為實用。開發者可利用此功能快速掌握資訊核心,避免浪費時間在無關緊要的細節上。
電子郵件摘要範例
假設需要從一長串電子郵件中提取討論重點或決策結果,可以使用以下提示詞:
- “總結以下電子郵件討論的主要內容。”
- “請分析這封電子郵件串並提取出關鍵決策。”
主題建模
主題建模是一種統計技術,用於從檔案集合中發現抽象主題。開發者可透過以下提示進行主題建模:
- “識別以下文字中討論的主要主題:{文字}”
- “從以下文字中提取關鍵字以推斷主要主題:{文字}”
- “根據以下文字的內容提出適當的標籤:{文字}”
文字分類別與情感分析
文字分類別涉及將文字標記為預定義的類別,其中情感分析是其重要分支,用於判斷文字的情感傾向,如正面、負面或中立。開發者可以利用情感分析來評估使用者對應用程式的反饋。
情感分析範例
- “請分析這些客戶評論並判斷整體情感是正面、負面還是中立?{文字}”
- “以下是我們使用者論壇中關於最新更新的討論串,您能總結整體情感嗎?{文字}”
- “我彙總了我們應用商店頁面的反饋,您能根據情感分類別這些評論嗎?{文字}”
推薦功能
大語言模型能夠根據輸入的程式碼或問題提供改進建議或解決方案,幫助開發者更高效地除錯、最佳化程式碼或使用API。
程式碼最佳化與除錯範例
- “以下程式碼片段在呼叫
<Method()>時丟擲NullPointerException,您能協助找出潛在原因並提出修復建議嗎?” - “這是我寫的一個用於排序整數列表的函式,您能推薦任何最佳化方案使其執行更快或更具可讀性嗎?”
多語言翻譯與本地化
本地化是使軟體適應特定地區語言和文化規範的過程,對擴大市占率和提升使用者經驗至關重要。大語言模型能夠支援多語言翻譯,成為開發者強大的輔助工具。
多語言翻譯範例
- “將以下UI文字翻譯成法語:儲存、離開、檔案、編輯、幫助。”
- “將以下使用者手冊段落翻譯成西班牙語。”
- “將以下錯誤訊息翻譯成德語:檔案未找到、存取被拒絕、網路連線斷開。”
輸入內容的最佳實踐
在使用大語言模型時,透過特殊符號(如###或""")清晰分隔指令和內容,能夠提升模型的理解準確度並獲得更精確的輸出。
結構化提示範例
提示:從以下文字中提取API實作的關鍵步驟:
檔案:
"""
{API檔案內容}
"""
這種結構化的提示方式不僅能讓大語言模型更好地理解任務要求,還能提高輸出結果的品質,使其更符合開發者的實際需求。