文章目錄
- 模型之FIM(Fill-In-the-Middle)補全
- 什么是FIM(Fill-In-the-Middle)
- FIM 的工作原理
- FIM 示例:代碼補全場景
- 常見模型fim 測試
- deepseek fim
- 阿里completions 接口
- 要判斷模型是否支持特定的特殊標記
- **1. 模型可以自動推斷生成區域**
- **2. `suffix` 是可選的**
- **3. 模型的訓練方式**
- **4. `suffix` 的影響**
- **5. 示例對比**
- **有 `suffix` 的請求**
- **沒有 `suffix` 的請求**
- **6. 模型的靈活性**
- **7. 適用場景**
- **總結**
模型之FIM(Fill-In-the-Middle)補全
什么是FIM(Fill-In-the-Middle)
背景:傳統訓練的 GPT 模型只能根據前文內容預測后文內容,但有些應用比如代碼生成器,需要我們給出上文和下文,使模型可以預測中間的內容,傳統訓練的 GPT 就不能完成這類任務。
FIM 是一種強大的生成技術,特別適合需要在上下文中間插入內容的場景。通過明確的前綴和后綴,模型可以更好地理解上下文,從而生成高質量的中間內容。這種技術在代碼生成、文檔編輯和自然語言生成中都有廣泛的應用。
使用 FIM 訓練的能夠正確填充中間部分,FIM 是一種新的訓練技巧,使得 GPT 類模型能夠根據上下問填充中間部分。
FIM 的工作原理
-
輸入分為三部分:
- 前綴 (Prefix): 輸入文本的開頭部分,提供上下文。
- 后綴 (Suffix): 輸入文本的結尾部分,提供補充信息。
- 中間部分 (Hole): 需要模型生成的部分。
-
模型任務:
模型根據前綴和后綴的上下文,生成中間部分的內容。 -
標記 (Special Tokens):
通常會使用特殊標記(如 <fim_begin>、<fim_end> 和 <fim_hole>)來明確區分前綴、后綴和中間部分。
如果需要使用 FIM,通常需要明確指定 FIM 的相關配置,例如在 prompt 中提供前綴和后綴,并在模型配置中啟用 FIM 模式。
模型本身需要支持 FIM 模式。如果模型不支持 FIM,即使提供了相關標記,模型也無法正確生成中間部分。
在 FIM 模式下,模型會根據 prompt 和 suffix 的上下文,自動推斷需要生成的中間部分(即 <fim_hole>)
FIM 示例:代碼補全場景
場景描述
假設你正在編輯一段代碼,需要在函數體的中間插入邏輯。FIM 的目標是根據函數的上下文(前綴和后綴)生成中間部分的代碼。
<fim_begin>
func calculateSum(a int, b int) int {// Start of function
<fim_end>return result
}
<fim_hole>
-
<fim_begin>: 標記前綴的開始。
前綴內容是函數的開頭部分: -
<fim_end>: 標記前綴的結束。
后綴內容是函數的結尾部分: -
<fim_hole>: 標記需要生成的中間部分。
在某些實現中,<fim_hole> 是可選的,主要用于標記生成區域。如果省略 <fim_hole>,模型仍然可以通過上下文(prompt 和 suffix)推斷出需要生成的部分。
{"prompt": "<fim_begin>func calculateSum(a int, b int) int {\n // Start of function\n<fim_end>","suffix": " return result\n}"
}
模型會自動識別 <fim_end> 和 suffix 之間的區域為生成目標。
如果顯式添加 <fim_hole>:
{