什么是对话前缀续写

对话前缀续写(Chat Prefix Completion)允许开发者在 assistant 消息中预设一个「开头」,让模型从这个开头继续写下去。这在以下场景中非常有用:

  • 强制模型以特定格式开始回复(如 JSON、Markdown 表格)
  • 填充对话模板的缺失部分
  • 让模型以特定语气或人格开始回复

基础用法

在 messages 中预先填入 assistant 消息,设置 prefix 参数为 true:

from openai import OpenAI
import os

client = OpenAI(
    api_key=os.environ.get('DEEPSEEK_API_KEY'),
    base_url='https://api.deepseek.com'
)

response = client.chat.completions.create(
    model='deepseek-v4-flash',
    messages=[
        {"role": "system", "content": "你是一个专业的邮件撰写助手。"},
        {"role": "user", "content": "写一封请假邮件,主题:身体不适,请假一天。"},
        # 预设开头——模型将从这里续写
        {"role": "assistant", "content": "尊敬的领导:\n\n您好!"}
    ],
    # 启用前缀续写
    extra_body={"chat_prefix_completion": True}
)

print(response.choices[0].message.content)
# 输出:
# 尊敬的领导:
#
# 您好!
# 由于身体不适,特向您申请请假一天...(续写内容)

强制 JSON 输出开头

解决模型偶尔不输出纯 JSON 的问题:

response = client.chat.completions.create(
    model='deepseek-v4-pro',
    messages=[
        {"role": "system", "content": "你是数据分析师,输出 JSON 格式报告。"},
        {"role": "user", "content": "分析 Q2 销售数据:总营收 500 万,同比增长 20%"},
        # 强制以 JSON 开头
        {"role": "assistant", "content": "{\n  \"report\": "}
    ],
    extra_body={"chat_prefix_completion": True}
)

# 输出保证以 {"report": 开头

Markdown 表格续写

response = client.chat.completions.create(
    model='deepseek-v4-flash',
    messages=[
        {"role": "user", "content": "列出 Python 三大主流 Web 框架及其特点"},
        # 预设表格头——模型填充表格内容
        {"role": "assistant", "content": "| 框架 | 特点 | 适用场景 |\n|------|------|----------|\n"}
    ],
    extra_body={"chat_prefix_completion": True}
)

# 输出保证以 Markdown 表格格式开始

Chat Prefix vs FIM 对比

Chat Prefix CompletionFIM 补全
接口/v1/chat/completions/v1/completions
控制方式assistant 消息前缀prompt + suffix 参数
思维模式支持思考模式仅非思考模式
适用场景格式控制、模板填充、语气设定代码补全、中间填充
稳定性BetaBeta

注意事项

  • 目前为 Beta 功能,接口和行为可能调整
  • 仅在消息列表的最后一条是 assistant 消息时生效
  • 前缀长度会计入输出 token 消耗
  • 建议前缀不宜过长(控制在 100 tokens 以内),给模型留有创造空间
  • 与 JSON Mode 可以组合使用:前缀设为 JSON 开头 + response_format 约束