Prhub

#46255 fix(reasoning): guard rfind in ernie45 streaming </response> branch

原始 PR 作者 hclsys 合并时间 2026-07-01 09:01 文件变更 1 提交数 2 评论 2 代码增减 +2 / -1

执行摘要

修复 Ernie45 流式解析中 rfind 返回 -1 的问题

修复流式解析中因 rfind 未守卫导致内容被静默截断的 bug。PR body 指出:rfind</response> token ID 已进入 delta_token_ids 但字符串尚未被增量反标记化输出时返回 -1,此时 content[:-1] 会丢弃最后一个有效字符。同一方法中其他两处 rfind 均已正确守卫。

值得合并。改动正确、简洁,修复了一个明确的边界情况 bug,且已获 reviewer 批准。

讨论亮点

无 review 评论。作者在 Issue 评论中提及 PR#39044 将对同一文件中的 </think> 守卫进行重构,但本 PR 的 </response> 分支与之互补,不会冲突。

实现拆解

vllm/reasoning/ernie45_reasoning_parser.pyextract_reasoning_streaming 方法中,位于 elif self.response_end_token_id in delta_token_ids 分支的 response_end_idx = content.rfind(self.response_end_token) 之后,增加 if response_end_idx != -1: 守卫,只有找到时才执行 content = content[:response_end_idx]。改动仅 3 行(+2/-1),与同一方法中其他两处 rfind 的守卫模式完全一致。

文件 模块 状态 重要度
vllm/reasoning/ernie45_reasoning_parser.py 推理解析 modified 5.16

关键符号

extract_reasoning_streaming

关键源码片段

vllm/reasoning/ernie45_reasoning_parser.py core-logic

包含流式解析方法 `extract_reasoning_streaming`,其中新增对 `rfind` 返回 -1 的守卫,防止内容静默截断。

# vllm/reasoning/ernie45_reasoning_parser.py
# 在 extract_reasoning_streaming 方法中,位于 elif self.response_end_token_id in delta_token_ids: 分支
elif self.response_end_token_id in delta_token_ids:
    # 查找 </response> 在 delta_text 中最后一次出现的位置
    response_end_idx = content.rfind(self.response_end_token)
    # 修复 : 当增量反标记化尚未输出 </response> 字符串时,rfind 返回 -1
    # 此时不应截断内容,否则会静默丢弃最后一个有效字符
    if response_end_idx != -1:
        content = content[:response_end_idx]

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

风险极低。改动仅添加一行守卫,且完全复制了同一方法中已存在的逻辑模式。未添加测试文件,但该守卫是防御性编程,不会改变正常路径行为。

直接影响 Ernie45 模型在流式推理场景下的输出正确性,防止在增量反标记化延迟时静默丢弃字符。不影响非流式路径。

缺少测试覆盖

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论