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 接口最快、最直接。


本页地址:http://www.foxtable.com/webhelp/topics/7236.htm