Azure托管GPT-3.5-Turbo如何停止文本生成?
解决Azure托管GPT-3.5-Turbo生成指定长度列表时无法自动停止的问题
问题描述
我在使用Azure托管的OpenAI模型,需求是生成指定长度的句子或词汇列表。示例提示如下:
Give 10 Examples of pizza ingredients: 1. tomatoes 2. mushrooms
text-davinci-003模型可按预期完成列表并停止,但GPT-3.5-Turbo模型会一直生成至令牌上限,即便明确告知任务完成后停止,少样本提示也无效。
尝试过的临时解决方案存在明显弊端:
- 设置较低的
max_tokens值,但因提示内容动态变化难以预估合适数值,且需额外后处理去除冗余令牌; - 为示例添加计数器并指定数字为停止序列,普通计数器易误触发,特殊计数器可能被模型变形导致无法停止。
是否存在像text-davinci-003那样简洁有效的停止生成方案?
可行的简洁停止方案
1. 强化提示词的终止指令
在提示词末尾添加明确的强制终止规则,同时锁定列表结束的边界。例如调整提示词为:
Give 10 Examples of pizza ingredients. Once you have listed all 10 items, stop immediately without adding any extra content: 1. tomatoes 2. mushrooms
GPT-3.5-Turbo对清晰的指令约束响应度更高,这种方式无需依赖复杂停止序列,靠语义指令限制生成行为。
2. 结合格式约束与精准停止序列
要求模型严格遵循编号列表格式,同时设置针对性的停止触发点。例如提示词:
Generate exactly 10 pizza ingredients in a numbered list. End the output right after the 10th item, do not add anything else: 1. tomatoes 2. mushrooms
同时将stop参数设置为["\n11."]——正常生成到第10项后,下一个预期的编号是11.,以此作为精准停止信号,避免单一数字的误触发。
3. 利用函数调用实现结构化输出(适用场景)
如果业务场景支持函数调用,可以定义一个接收固定长度列表的函数,让模型通过调用该函数返回结果。这种方式下模型会严格按照参数要求生成内容,完成后自动停止。例如定义函数结构:
{ "name": "submit_ingredient_list", "description": "Submit a list of pizza ingredients", "parameters": { "type": "object", "properties": { "ingredients": { "type": "array", "items": {"type": "string"}, "minItems": 10, "maxItems": 10 } }, "required": ["ingredients"] } }
调用时指定该函数,模型会生成符合长度要求的列表并通过函数返回,不会产生冗余内容。
4. 组合式停止序列设计
使用多格式的停止序列组合,覆盖可能的列表编号形式,降低误触发概率。例如设置stop参数为["\n11.", "\n- 11", "11)", "\n11:"],覆盖常见的编号标点格式,确保生成到第10项后触发停止。
内容的提问来源于stack exchange,提问作者dude
相关产品推荐
相关产品推荐

