问题描述
backend/core/llm_providers.py 中 _build_full_input 方法只对 dict 类型输入使用 json.dumps(),但评分步骤(Step 3)传入的 input_data 是 list 类型,走了 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: "批量评估失败"。
复现步骤
- 上传任何包含特殊字符(双引号等)的视频
- 等待 pipeline 执行到 Step 3(评分)
- 查看 celery worker 日志:
LLM批量评估失败: 无法从响应中解析出有效的JSON
- 最终结果:0 个切片
修复方案
- if isinstance(input_data, dict):
+ if isinstance(input_data, (dict, list)):
修复已包含在 PR #49 中。
问题描述
backend/core/llm_providers.py中_build_full_input方法只对dict类型输入使用json.dumps(),但评分步骤(Step 3)传入的input_data是list类型,走了else分支使用 Python 的str()转换。这是一个严重 bug,导致所有视频的评分步骤必然失败,最终生成 0 个视频切片。
根因分析
当
input_data是 list 时(评分步骤传入[{"outline": ..., "content": [...]}]),str()转换产生 Python repr 格式:"一天猪男")不会被正确转义LLM 收到格式错误的输入后返回的 JSON 中包含未转义的特殊字符,
parse_json_response解析失败,所有切片评分被标记为final_score: 0.0, recommend_reason: "批量评估失败"。复现步骤
LLM批量评估失败: 无法从响应中解析出有效的JSON修复方案
修复已包含在 PR #49 中。