deepseek-ai / deepseek-ai/DeepSeek-V3

bug:工具调用后模型出现重复词语输出,疑似生成退化

Open
#1,630 1 comment 1 reaction 0 assignees View on GitHub
Dominant language
Python
Stars
104k
Forks
16.7k
PR merge metrics
No merged PRs in 30d

Description

# 缺陷报告:工具调用后模型出现重复词语输出,疑似生成退化

## 1. 缺陷概要

| 项 | 内容 |
|---|---|
| 缺陷标题 | 工具调用返回失败结果后,模型最终回复出现单词/短语无限重复 |
| 缺陷类型 | 工具调用场景下的生成退化 / 重复输出 |
| 严重程度 | 中高:不一定造成业务数据错误,但会导致输出不可用、token 浪费和工具调用流程失控 |
| 发现日期 | 2026-09-08 |
| 涉及模型 | DeepSeek V4 Flash 系列,当前使用变体为 `deepseek-v4-flash(codebuddy)` |
| 调用形态 | IDE Agent 对话 + MCP 工具调用 |
| 关联工具 | 代码仓库访问工具(具体名称已脱敏) |
| 运行环境 | macOS;IDE Agent 客户端;长上下文、多轮工具调用会话 |

## 2. 问题描述

在 IDE Agent 客户端中使用 DeepSeek 模型执行 MCP 工具调用时,如果工具返回仓库不存在、项目不可见等失败结果,模型在生成最终回复阶段会出现明显的重复输出退化。

重复内容不是工具返回结果的一部分,而是模型在接收工具结果后生成的 assistant 文本。例如,某个仓库工具相关词语会被连续输出大量次数;该具体词语已在本报告中脱敏为 ``。

此外还观察到英文单词 `switch` 被连续重复输出。重复次数较多,文本看起来像模型进入了生成循环。

## 3. 复现过程

### 3.1 复现步骤

1. 在一个较长的 IDE Agent 会话中,要求模型通过 MCP 访问一个代码仓库或组路径。
2. 模型调用仓库查询、项目搜索等工具(具体工具名称已脱敏)。
3. 工具返回正常的失败结果,例如:

```text
Project "/" not found
```

4. 模型准备向用户解释访问失败原因。
5. 最终回复中出现某个词语或短语的连续重复,且重复内容与工具结果无关。

### 3.2 实际复现案例

目标地址:

```text
//list
```

工具调用结果:

- 仓库详情查询返回 `Project "/" not found`;
- 项目搜索返回空数组;
- 命名空间查询返回有限的正常结果。

之后模型输出中出现大量重复的 ``。切换代码仓库访问工具的具体实现并不能根治,说明异常主要发生在模型生成阶段,而不是某个工具返回了重复文本。

## 4. 预期行为

工具调用失败后,模型应该:

1. 读取工具返回结果;
2. 简洁说明失败原因;
3. 必要时提出下一步建议;
4. 结束本轮生成,不重复调用工具,不重复输出词语。

预期示例:

```text
工具返回 Project not found,当前凭据无法访问 /。请确认完整仓库路径或访问权限。
```

## 5. 实际行为

模型没有正常结束,而是出现以下一种或多种现象:

- 单个词或短语重复输出大量次数;
- 输出内容与工具返回结果无关;
- 回复长度异常增长,浪费大量 token;
- 用户难以判断真实工具结果;
- 看起来像模型在不断重试或陷入循环;
- 同一会话中更换工具名称后仍可能出现类似退化。

## 6. 证据与问题定位

### 6.1 工具侧响应正常

本次实际拿到的 MCP 响应是结构化、有限长度的正常结果:

```json
{"message":"Project \\\"/\\\" not found"}
```

因此当前证据不支持“工具响应本身包含重复内容”的判断。

### 6.2 重复发生在模型生成阶段

重复词语出现在工具调用返回之后、assistant 最终回复中,并且至少观察到两种不同重复内容:

- `switch` 重复;
- `` 重复。

这更符合以下问题特征:

- tool-result → assistant generation 状态切换异常;
- 长上下文条件下的局部重复退化;
- 生成终止条件未生效;
- 失败工具结果触发了错误的重试/循环模式。

当前不能仅凭客户端表现断定具体是采样参数、服务端解码器还是工具协议编排问题,建议服务端结合 request trace 进一步定位。

## 7. 影响评估

### 用户侧影响

1. 回复不可直接使用,降低模型可靠性;
2. 大量重复 token 增加调用成本和延迟;
3. 关键信息可能被重复文本淹没;
4. 用户可能误以为 MCP 或业务系统正在被反复调用;
5. 在自动化 Agent 场景中可能放大为工具重试、任务超时或执行死循环。

### 工程侧影响

该问题发生在工具调用链路中,比普通文本重复更严重:工具调用通常具有状态、副作用和预算限制。如果重复生成进一步被编排器解释为继续执行,可能导致:

- 无意义的重复工具调用;
- 任务预算耗尽;
- 自动化任务超时;
- 结果协议无法解析。

## 8. 初步根因假设

优先怀疑模型生成链路存在以下问题之一:

1. **工具结果后的生成状态退化**:模型未正确将失败工具结果收束为一次性说明;
2. **重复 n-gram 抑制不足**:短词重复时没有及时触发停止或重新采样;
3. **终止条件未生效**:模型已经进入无效重复状态,但仍持续生成;
4. **长上下文放大退化**:历史中存在多次工具调用、错误信息和重试语义,导致模型局部循环;
5. **工具编排协议与模型输出边界不清**:模型无法区分“工具调用失败后的最终回复”和“继续尝试工具调用”。

以上为定位假设,需结合服务端 token 序列、finish reason、采样配置和 tool-call 状态日志确认。

## 9. 建议采集的信息

请 DeepSeek 服务侧尝试复现并采集检查以下内容:

- request_id / trace_id;
- 实际模型版本和部署实例;
- tool result 注入后的完整消息序列摘要;
- 生成参数:temperature、top_p、max_tokens、repetition_penalty 等;
- finish_reason;
- 实际生成 token 数;
- 是否发生服务端重试或请求续写;
- 重复 n-gram 检测结果;
- tool-call 状态机是否已经进入终态;
- 首次出现重复 token 的位置。

建议日志中避免记录真实凭据、业务 token 和完整敏感报文,只保留脱敏后的消息摘要及哈希。

## 10. 修复建议

### P0:生成安全护栏

当检测到连续重复 token 或重复 n-gram 超过阈值时:

- 立即停止当前生成;或
- 丢弃异常结果并执行一次受控重采样;
- 重采样失败则返回明确错误,而不是继续生成。

### P1:工具调用终态约束

工具已经返回失败结果后,若模型没有输出新的合法 tool call,应将本轮收束为最终文本回复,禁止隐式循环。

同时建议限制:

- 单轮工具调用次数;
- 同一工具、同一参数的重复调用次数;
- 工具失败后的自动重试次数。

### P1:短上下文回归测试

增加以下自动化测试:

1. 工具返回 `Project not found`;
2. 工具返回空数组;
3. 工具返回权限不足;
4. 连续两次工具失败;
5. 长上下文中夹杂多个工具调用;
6. 中文短词和英文短词重复检测;
7. 正常工具结果和异常工具结果混合。

验收条件:

- 不出现超过阈值的重复 n-gram;
- 最终回复在合理 token 数内结束;
- 不产生未声明的额外工具调用;
- finish_reason 正常。

### P2:客户端兜底

在 IDE Agent / Agent 编排层增加重复输出保护:

- 检测连续重复文本;
- 截断异常回复并提示“模型输出异常,请重试”;
- 保留原始 request_id 便于追踪;
- 不自动无限重试。

## 11. 临时规避方案

在问题修复前:

1. 工具调用异常时切换到其他模型;
2. 使用新会话,避免继承已经退化的长上下文;
3. 限制单轮工具调用次数;
4. 工具失败后由客户端直接结束本轮,不让模型继续多次试探;
5. 对模型输出设置最大 token 上限和重复检测。

## 12. 期望 DeepSeek 团队反馈

请确认:

1. 是否已知 DeepSeek V4 Flash 系列在 tool-use 场景下存在重复生成问题;
2. 是否与长上下文、MCP 工具失败响应或特定采样参数有关;
3. 是否可以提供服务端 request trace 对应的 finish reason 和异常 token 统计;
4. 是否已有重复 n-gram 检测和自动终止机制;
5. 推荐使用哪个模型版本或参数作为临时规避方案。

## 13. 结论

本问题表现为:**MCP 工具返回有限且正常,但 DeepSeek 在工具结果后的 assistant 生成阶段出现单词/短语重复退化**。当前证据更支持模型生成稳定性问题,而不是代码仓库访问工具返回异常。

建议按“工具调用后的重复生成 / 生成终止条件未生效”方向排查,并优先增加重复输出检测、工具调用次数限制和异常生成自动终止机制。

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.