Skip to content

对话前缀续写(Beta)允许你在 messages 末尾添加一条 prefix: true 的 assistant 消息,模型会从该内容接着续写。配合 stop 参数可精确控制输出边界,是生成特定格式代码、Markdown 或 JSON 的利器。

DeepSeek API 对话前缀续写(Beta)

此功能为 Beta 版本,需使用 Beta 端点:https://api.deepseek.com/beta

使用场景

  • 强制模型输出特定格式(如以 \``python` 开始的代码块)
  • 续写已有文档或代码
  • 精确控制输出结构

基本用法

messages 末尾添加一条 role: "assistant"prefix: true 的消息,模型会从该内容接着生成:

typescript
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.deepseek.com/beta",  // 必须用 /beta 端点
  apiKey: process.env.DEEPSEEK_API_KEY,
});

const response = await client.chat.completions.create({
  model: "deepseek-v4-pro",
  messages: [
    { role: "user", content: "写一个快速排序的 Python 实现" },
    {
      role: "assistant",
      content: "```python\n",  // 前缀:模型从这里开始续写
      // @ts-ignore - prefix 是 DeepSeek 扩展字段
      prefix: true,
    },
  ],
  stop: ["```"],  // 遇到 ``` 停止,只输出代码块内容
});

console.log(response.choices[0].message.content);
// 直接输出 Python 代码,不带 ```python 包装

Python 版本:

python
from openai import OpenAI

client = OpenAI(
    api_key="<your api key>",
    base_url="https://api.deepseek.com/beta",
)

messages = [
    {"role": "user", "content": "写一个快速排序的 Python 实现"},
    {"role": "assistant", "content": "```python\n", "prefix": True},
]

response = client.chat.completions.create(
    model="deepseek-v4-pro",
    messages=messages,
    stop=["```"],
)
print(response.choices[0].message.content)

实用技巧

控制 JSON 输出的开头:

typescript
messages: [
  { role: "user", content: "给我一份用户信息 JSON" },
  { role: "assistant", content: '{"name":', prefix: true },
]
// 模型会续写完整的 JSON 对象,从 {"name": 开始

续写 Markdown 文档:

typescript
messages: [
  { role: "user", content: "写一篇关于 KV Cache 的技术文章" },
  { role: "assistant", content: "## KV Cache 简介\n\nKV Cache", prefix: true },
]

注意事项

  • 必须使用 /beta 端点:标准端点不支持 prefix 字段
  • prefix: true 的 assistant 消息必须是 messages 数组的最后一条
  • stop 参数配合使用效果更好,可以精确截断输出边界
  • TypeScript 中 prefix 是 DeepSeek 扩展字段,可能需要 // @ts-ignore 或自定义类型

常见问题

Q: 对话前缀续写和普通 assistant 消息有什么区别?

A: 普通 assistant 消息会作为"历史回复"传给模型,模型知道那是之前说的话;prefix: true 的消息则告诉模型"从这里开始生成下一句",效果更像"补全"而不是"多轮对话"。

Q: FIM 和对话前缀续写有什么区别?

A: 对话前缀续写是在 Chat Completions 接口上工作,适合对话场景;FIM(Fill in the Middle)在 Completions 接口上工作,可以同时提供前缀和后缀让模型补全中间,更适合代码补全。