什么是对话前缀续写
对话前缀续写(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 Completion | FIM 补全 | |
|---|---|---|
| 接口 | /v1/chat/completions | /v1/completions |
| 控制方式 | assistant 消息前缀 | prompt + suffix 参数 |
| 思维模式 | 支持思考模式 | 仅非思考模式 |
| 适用场景 | 格式控制、模板填充、语气设定 | 代码补全、中间填充 |
| 稳定性 | Beta | Beta |
注意事项
- 目前为 Beta 功能,接口和行为可能调整
- 仅在消息列表的最后一条是 assistant 消息时生效
- 前缀长度会计入输出 token 消耗
- 建议前缀不宜过长(控制在 100 tokens 以内),给模型留有创造空间
- 与 JSON Mode 可以组合使用:前缀设为 JSON 开头 + response_format 约束