FIM 补全
一般用户可忽略本节内容。
在前面几节中,我们学习了如何用 LLMCaller 与 AI
对话、让它阅读长篇文档、甚至自己调用外部工具。但你可能会发现一个问题:如果我只想补全代码的“中间一部分”,难道还要跟 AI 聊一次天吗?
比如,你在代码编辑器里写了一个函数,写完了开头 Dim total As Double = 0,又写好了结尾 Return
total,只是不知道中间该怎么算。这时候,普通的对话模型会回你:“好的,你可以在这中间加上 total = price * count”,你需要手动复制粘贴。
为了实现类似 VSCode 中按下 Tab 键瞬间补全代码的体验,DeepSeek 提供了一个专门的接口:FIM(Fill In the Middle)补全。
什么是 FIM 补全?
FIM 是代码大模型领域非常经典的设计。它的逻辑是:你提供开头(前缀 prompt)和结尾(后缀 suffix),模型负责把中间空缺的内容补上。
常规对话:你问我答,一来一回。
前缀续写 (Prefill):你给开头,我顺着往下编。
FIM 补全:你给开头和结尾,我只负责“填坑”。
这非常适合写代码,因为我们在编程时,经常需要在现有代码的中间插入逻辑。有了 FIM 接口,AI 就能主动分析前后代码的上下文,自动补全中间的代码。
FIM 补全的官方说明地址:
https://api-docs.deepseek.com/zh-cn/guides/fim_completion
示例
FIM接口只能通过HttpClient调用,下面是参考代码,可以直接在命令窗口测试执行:
Dim
apiKey
As
String
=
"sk-a734b83536da45e9aedc3e42605bfb3a"
'请替换为自己的APIKey
Dim
hc
As
New
HttpClient("https://api.deepseek.com/beta/completions")
hc.SkipError =
True
hc.ContentType =
"application/json"
hc.Headers.Add("Authorization",
"Bearer "
& apiKey)
Dim
body
As
New
JObject()
body("model")
=
"deepseek-flash"
body("prompt")
=
"Public Function CalculateTotal(unitPrice As Double, quantity As
Integer)"
& vbCrLf &
"
Dim totalAmount As Double = 0"
'前缀代码
body("suffix")
=
" Return totalAmount"
& vbCrLf &
"End
Function"
'后缀代码
body("max_tokens")
= 128
hc.Content = body.ToString()
Dim
res
As
String
= hc.GetData()
'
解析出补全的中间代码
If
hc.StatusCode = 200
Then
Dim
jo
As
JObject = JsonConvert.DeserializeObject(res)
MessageBoxA.Show(jo("choices")(0)("text").ToString())
Else
MessageBoxA.Show(hc.StatusDescription)
End
If
为什么不用 LLMCaller?
你可能会问:为什么不将FIM直接封装在 LLMCaller 里?
因为 LLMCaller 封装的是 /chat/completions(对话接口),而 FIM 使用的是
/beta/completions(文本补全接口),它们是 OpenAI 体系下的两套完全不同的 API:
数据结构不同:对话接口的数据是 messages(带有 system、user、assistant 角色);FIM 接口的数据只有扁平的 prompt 和
suffix 字符串。
响应速度不同:FIM 主要用于 IDE 插件(如 VSCode 的 Continue),要求毫秒级响应,不能带长篇大论的废话。
上下文隔离:FIM 是一次性计算,不需要(也不支持)像 LLMCaller 那样维护多轮对话记忆或工具调用。
一句话总结:杀鸡焉用牛刀。 如果你要做聊天机器人或智能体,用 LLMCaller;如果你只想做纯粹的代码文本补全,直接用 HttpClient 调 FIM
接口最快、最直接。