Skip to content

fix(ai): 分类响应无法解析时按失败处理并重试 - #1255

Open
Ryan02I5 wants to merge 2 commits into
sansan0:masterfrom
Ryan02I5-Labs:fix/ai-filter-unparseable-batch-retry
Open

Ryan02I5 wants to merge 2 commits into
sansan0:masterfrom
Ryan02I5-Labs:fix/ai-filter-unparseable-batch-retry

Conversation

@Ryan02I5

@Ryan02I5 Ryan02I5 commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

问题

AI 智能筛选的分类响应为空、不含 JSON,或顶层不是数组时,_parse_classify_response 返回 [],与"成功但无匹配"无法区分。该批次会被标记为已分析,之后不再重试,而原因只在 DEBUG 模式下输出。

常见触发场景:模型的思考 token 计入 max_tokens,预算用完后返回空文本。详见 #1254。

修改

  • 解析失败的三种情况(空响应或不含 JSON、JSON 解析失败、顶层不是数组)改为返回 None。这沿用 classify_batch 已有的失败约定:调用方输出"分类失败,将在下次运行重试",并且不标记已分析。
  • 这三种情况在非 DEBUG 模式下各输出一行原因。空响应时提示检查 ai.max_tokens。原有的 DEBUG 详细输出保持不变。
  • 合法的空数组 [] 仍返回空列表,表示无匹配。
  • 不改提示词、配置项、模型调用、存储结构,也不改 filter_pipeline.py。

注意:如果某个模型持续返回无法解析的内容,该批次每次运行都会重试。这与现有请求异常时的处理一致。

验证

  • 新增 tests/test_ai_filter_classify_response.py:

    • 空、空白、非 JSON、截断的 JSON 代码块、顶层为对象:均返回 None;
    • [] 返回空列表,合法数组正常解析;
    • 经 AIFilterPipeline._classify_batches 的回归:空响应批次不进入已分析列表,后一批次正常记录。
  • 在修改前的代码上,新测试中的回归用例和 5 个子用例会失败;修改后全部通过。

  • uv run --project . --with pytest pytest -q tests --ignore=tests/test_mcp_stdio.py

    • 31 passed, 40 subtests passed
  • uvx ruff check tests/test_ai_filter_classify_response.py

  • git diff --check origin/master...HEAD

  • 真实运行:在 v6.11.0 镜像中加载本修改,用 anthropic/claude-haiku-5-5、max_tokens: 3000 复现。两条失败路径都出现了,原来会显示 0 条匹配 的批次现在都按失败处理:

    [AI筛选] 分类响应 JSON 解析失败: Expecting property name enclosed in double quotes: line 3 column 26 (char 68)
    [AI筛选] RSS 批次 1: 120 条 → 分类失败,将在下次运行重试
    [AI筛选] 分类响应为空或不含 JSON(可检查 ai.max_tokens 是否过小,部分模型的思考 token 也计入该上限)
    [AI筛选] RSS 批次 2: 120 条 → 分类失败,将在下次运行重试
    [AI筛选] RSS 批次 3: 61 条 → 9 条匹配
    [AI筛选] 已记录 240 条新闻分析状态 (匹配 21, 不匹配 219)
    

    已分析状态只记录成功的批次(热榜 179 条加 RSS 批次 3 的 61 条),失败的 240 条留待下次运行。

Closes #1254

Ryan02I5 and others added 2 commits November 5, 2026 13:28
分类响应为空、不含 JSON 或顶层不是数组时,_parse_classify_response
此前返回空列表,与"成功但无匹配"无法区分:该批次被标记为已分析,
之后不再重试,且原因只在 DEBUG 模式下输出。

改为返回 None,沿用 classify_batch 已约定的失败语义,由调用方输出
"分类失败,将在下次运行重试"且不标记已分析;同时在非 DEBUG 模式下
输出一行原因。合法的空数组 [] 仍视为无匹配。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[问题] AI 智能筛选:分类响应无法解析时批次被静默标记为已分析

1 participant