From f0514d748727740646eb9d6ee9960020c2103497 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Mon, 5 Oct 2026 00:17:01 +0800 Subject: [PATCH] =?UTF-8?q?fix(#2185):=20=E4=BA=BA=E7=89=A9=E5=A4=96?= =?UTF-8?q?=E8=B2=8C=E5=B1=9E=E6=80=A7=E5=BC=BA=E5=88=B6=E6=8F=8F=E8=BF=B0?= =?UTF-8?q?+=E5=85=9C=E5=BA=95,=E6=8F=90=E5=8D=87Seedream=20t2i=E8=BF=98?= =?UTF-8?q?=E5=8E=9F=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit VLM对hair/skin_tone/face_shape/outfit四项输出"无法判断"导致Seedream自由发挥, 发型服装还原失败。双层修复: 1. prompts.py image_analysis system prompt强化: - 明确has_person=true时hair/skin_tone/face_shape/outfit四项禁止填"无法判断" - 提供hair/skin_tone/face_shape/outfit的具体示例值供参照 - 即使局部遮挡也要基于可见部分合理推断 2. worker _xml_to_product双层保险: - VLM仍输出"无法判断"时,用通用兜底值(自然发型/自然肤色/标准脸型/日常服装) - 保证portrait_prompt始终包含完整外貌描述(性别/年龄/发型/肤色/脸型/穿着/表情) - 确保preheat_trust_chain的人物描述过滤器(len>=10)不会过滤掉结果 预期:人像图VLM输出具体外貌→Seedream t2i还原发型服装脸型→ Seedance reference_image为高还原度AI人像→人物整体相似度>85%(上次脸部80-90%,本次服装发型也应还原) --- apps/worker/worker_app/tasks/viral_video.py | 25 ++++++++++++++------- packages/application/viral_video/prompts.py | 10 ++++++++- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/apps/worker/worker_app/tasks/viral_video.py b/apps/worker/worker_app/tasks/viral_video.py index ffc75cff2..678c3b8d0 100644 --- a/apps/worker/worker_app/tasks/viral_video.py +++ b/apps/worker/worker_app/tasks/viral_video.py @@ -422,25 +422,34 @@ def _analyze_single_image( _pose = _pa.get("pose", "无法判断") or "无法判断" _expr = _pa.get("expression", "无法判断") or "无法判断" _count = xp.attr_int(_pa.get("count"), 1) + # #2185: VLM有时对外貌属性输出"无法判断",用通用兜底值确保portrait_prompt始终有完整外貌描述 + if _hair == "无法判断": + _hair = "自然发型" + if _skin == "无法判断": + _skin = "自然" + if _face == "无法判断": + _face = "标准" + if _outfit == "无法判断": + _outfit = "日常服装" _parts = [] if _gender != "无法判断": _g = _gender + ("性" if not _gender.endswith("性") else "") _parts.append(_g) + else: + _parts.append("成年人") if _age != "无法判断": _parts.append(_age) _parts.append("人物") - if _hair != "无法判断": - _parts.append(_hair) - if _skin != "无法判断": - _parts.append(f"{_skin}肤色") - if _face != "无法判断": - _parts.append(f"{_face}脸型") - if _outfit != "无法判断": - _parts.append(f"身着{_outfit}") + _parts.append(_hair) + _parts.append(f"{_skin}肤色") + _parts.append(f"{_face}脸型") + _parts.append(f"身着{_outfit}") if _pose != "无法判断": _parts.append(f"姿态{_pose}") if _expr != "无法判断": _parts.append(f"表情{_expr}") + else: + _parts.append("表情自然") portrait_prompt = ",".join(_parts) logger.info( "[爆款视频] 图片 #%d 解析: count=%d gender=%s age=%s hair=%s skin=%s face=%s outfit=%s pose=%s expr=%s → %s", diff --git a/packages/application/viral_video/prompts.py b/packages/application/viral_video/prompts.py index 9307abe17..4e41733a9 100644 --- a/packages/application/viral_video/prompts.py +++ b/packages/application/viral_video/prompts.py @@ -57,7 +57,15 @@ _IMAGE_ANALYSIS_SYSTEM = f"""你是电商商品视觉分析师,负责从商品 用一个标签,属性 resolution、lighting、composition、blur 描述画质。 下面每个卖点用一个 标签。 -看不到或无法判断的内容,属性值填“无法判断”,布尔值填 false,不要留空标签。""" +【人物属性硬性要求(has_person=true时必须遵守)】 +hair/skin_tone/face_shape/outfit四项绝对禁止填“无法判断”,必须基于图片可见特征给出具体中文描述: +- hair:必须描述发型+发色,如“黑色齐肩直发”“棕色微卷中长发”“深棕色短发” +- skin_tone:必须描述肤色,如“暖调自然肤色”“白皙肤色”“小麦色” +- face_shape:必须描述脸型,如“鹅蛋脸”“圆脸”“瓜子脸”“方脸” +- outfit:必须描述可见穿着,如“米色翻领衬衫”“白色T恤”“黑色连衣裙” +即使局部被遮挡也要根据可见部分合理推断;确实看不清时按最接近的直观印象描述。 + +其他非人物属性看不到或无法判断时填“无法判断”,布尔值填false,不要留空标签。""" _IMAGE_ANALYSIS_USER = """请分析以下商品图片,共 {image_count} 张。 所属行业:{industry} -- 2.54.0