Skip to content

Bug: LLM评分步骤必然失败 — _build_full_input 对 list 类型输入未做 JSON 序列化 #53

@smartchainark

Description

@smartchainark

问题描述

backend/core/llm_providers.py_build_full_input 方法只对 dict 类型输入使用 json.dumps(),但评分步骤(Step 3)传入的 input_datalist 类型,走了 else 分支使用 Python 的 str() 转换。

这是一个严重 bug,导致所有视频的评分步骤必然失败,最终生成 0 个视频切片。

根因分析

# backend/core/llm_providers.py 第 84-91 行
def _build_full_input(self, prompt: str, input_data: Any = None) -> str:
    if input_data:
        if isinstance(input_data, dict):  # ← 只检查了 dict
            return f"{prompt}\n\n输入内容:\n{json.dumps(input_data, ensure_ascii=False, indent=2)}"
        else:
            return f"{prompt}\n\n输入内容:\n{input_data}"  # ← list 走这里,用 str() 转换
    return prompt

input_data 是 list 时(评分步骤传入 [{"outline": ..., "content": [...]}]),str() 转换产生 Python repr 格式:

  • 使用单引号而非双引号
  • 字符串内的特殊字符(如中文引号 "一天猪男")不会被正确转义

LLM 收到格式错误的输入后返回的 JSON 中包含未转义的特殊字符,parse_json_response 解析失败,所有切片评分被标记为 final_score: 0.0, recommend_reason: "批量评估失败"

复现步骤

  1. 上传任何包含特殊字符(双引号等)的视频
  2. 等待 pipeline 执行到 Step 3(评分)
  3. 查看 celery worker 日志:LLM批量评估失败: 无法从响应中解析出有效的JSON
  4. 最终结果:0 个切片

修复方案

-            if isinstance(input_data, dict):
+            if isinstance(input_data, (dict, list)):

修复已包含在 PR #49 中。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions