stop 参数是 DeepSeek API 中一个非常有用的功能,它可以指定一个或多个停止序列,当生成的文本中出现这些序列时,API 会立即停止生成。这能有效避免生成多余的内容,提高响应速度并节省 token 使用量。
基本用法
1. 简单示例
$data = [ 'model' => 'deepseek-chat', 'messages' => [ ['role' => 'user', 'content' => '写一篇关于人工智能的短文,不超过200字。'] ], 'stop' => ["\n\n", "###"], // 遇到两个换行或###时停止 'max_tokens' => 1000 ];
2. 完整 PHP 实现
function callDeepSeekApiWithStop($prompt) {
$apiKey = 'your-api-key-here';
$url = 'https://api.deepseek.com/v1/chat/completions';
$data = [
'model' => 'deepseek-chat',
'messages' => [
['role' => 'system', 'content' => '你是一位专业的写作助手'],
['role' => 'user', 'content' => $prompt]
],
'temperature' => 0.7,
'max_tokens' => 1000,
'stop' => ["\n\n", "###", "。"] // 可以指定多个停止序列
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer ' . $apiKey
],
CURLOPT_TIMEOUT => 30
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) {
throw new Exception('API请求失败: ' . curl_error($ch));
}
$result = json_decode($response, true);
if ($httpCode !== 200) {
$errorMsg = $result['error']['message'] ?? '未知错误';
throw new Exception("API错误: {$errorMsg} (HTTP {$httpCode})");
}
return $result['choices'][0]['message']['content'];
}
// 使用示例
try {
$content = callDeepSeekApiWithStop("用100字左右介绍北京故宫,不要超过这个字数限制。");
echo $content;
} catch (Exception $e) {
echo "错误: " . $e->getMessage();
}
实际应用场景
1. 生成列表时避免多余项
$data = [ 'model' => 'deepseek-chat', 'messages' => [ ['role' => 'user', 'content' => '列举5个中国著名的旅游景点:'] ], 'stop' => ["6."], // 生成到第5项后遇到"6."就停止 'max_tokens' => 200 ];
2. 生成结构化内容
$data = [ 'model' => 'deepseek-chat', 'messages' => [ ['role' => 'user', 'content' => '以Markdown格式写一篇关于Python的简介,包含## 标题和- 列表项,以---结束'] ], 'stop' => ["---"], // 遇到---就停止 'temperature' => 0.3 // 降低随机性确保结构 ];
3. 问答场景控制回答长度
$data = [ 'model' => 'deepseek-chat', 'messages' => [ ['role' => 'user', 'content' => '用一句话回答:地球到月球的距离是多少?'] ], 'stop' => ["。", "!", "?"], // 遇到标点符号就停止 'max_tokens' => 50];
高级技巧
1. 动态设置 stop 参数
function generateContent($prompt, $stopSequences = ["\n\n"]) {
$data = [
'model' => 'deepseek-chat',
'messages' => [['role' => 'user', 'content' => $prompt]],
'stop' => $stopSequences,
'max_tokens' => 1000
];
// ...API调用代码...
}
// 根据不同需求使用不同的停止序列
$techArticle = generateContent("写一篇关于区块链的技术文章", ["\n\n", "## 结论"]);
$shortAnswer = generateContent("简述量子计算", ["。", "!", "?"]);
2. 结合 max_tokens 使用
$data = [ 'model' => 'deepseek-chat', 'messages' => [/*...*/], 'stop' => ["\n\n"], 'max_tokens' => 500, // 双重保险 'temperature' => 0.5 ];
3. 处理可能的多余内容
即使使用了 stop 参数,有时仍可能生成多余内容,可以在客户端进行处理:
function cleanGeneratedText($text, $stopSequences) {
foreach ($stopSequences as $seq) {
$pos = strpos($text, $seq);
if ($pos !== false) {
$text = substr($text, 0, $pos);
}
}
return trim($text);
}
// 使用
$generated = callDeepSeekApiWithStop($prompt);
$cleaned = cleanGeneratedText($generated, ["\n\n", "###"]);
注意事项
-
stop 序列选择:
-
选择不会在正常内容中出现的序列
-
中文常用:[“\n\n”, “。”, “!”, “?”, “###”]
-
与 max_tokens 的关系:
-
stop 优先于 max_tokens
-
建议同时设置 max_tokens 作为保护
-
性能影响:
-
合理的 stop 参数可以显著减少不必要的生成
-
但过多的 stop 序列会增加API处理负担
-
语言差异:
-
中文和英文可能需要不同的 stop 序列
-
例如中文更适合用句号而不是句点作为停止符