#!/usr/bin/env python3 """从原始差评中归纳'提示词困难'类痛点场景。 输出可供 UX/文案团队直接使用的场景清单。""" import json from pathlib import Path from collections import Counter HERE = Path(__file__).parent raw = json.loads((HERE / "raw_reviews.json").read_text(encoding="utf-8")) reviews = raw["reviews"] # 场景 → 关键词 & 手工映射(基于阅读原文归类) SCENARIOS = [ { "id": "S1", "name": "冷启动空白页 · 不知道从何写起", "user_behavior": "打开产品看到空输入框,无参考、无示例,直接放弃或抄别人的提示词", "root_cause": "缺少任务引导 / 模板入口 / one-click 示例;用户认知负担过重", "review_ids": ["R01", "R09", "R13", "R21"], "bad_example": "'描述你想写的内容' → 用户输入:'帮我写文章'", "improve_direction": "首屏改为'场景卡片墙'(小红书文案/BP/公众号/演讲稿…);每张卡片一键填入完整提示词骨架,用户只需替换关键词;首次使用强制走 30 秒教学" }, { "id": "S2", "name": "风格/语气无法精确描述 · 抽象词失效", "user_behavior": "用形容词描述期望('自然一点''激情一点''好一点'),AI 抓不到,改到崩溃", "root_cause": "自然语言形容词映射到模型行为的方差大;用户没有'风格锚点'的表达工具", "review_ids": ["R05", "R07", "R15", "R20", "R24"], "bad_example": "'写得自然一点、别有 AI 味' / '激情一点' → AI 加满感叹号", "improve_direction": "把风格量化成滑竿+参考样本:提供'风格样本卡'(严肃/俏皮/走心/干货/官方…),每个附 30 字预览;支持'贴一段范文让 AI 模仿'的输入通道(<-- 解决 R19)" }, { "id": "S3", "name": "角色扮演不生效 · 只写身份不给约束", "user_behavior": "写'你是 XX 顾问/律师/鲁迅',期望 AI 立刻切换专业口吻,结果仍是通用助手", "root_cause": "用户不知道角色 = 身份 + 领域知识 + 说话方式 + 服务对象;缺失后三项", "review_ids": ["R08", "R10", "R14", "R23"], "bad_example": "'你是营销顾问' → AI 输出通用建议", "improve_direction": "推出'角色模板'库:每个角色预置身份+知识关键词+回答范式+禁忌;可视化'角色卡'让用户勾选,而非纯文本输入" }, { "id": "S4", "name": "参数面板恐惧 · 不懂温度/top-p/创意度", "user_behavior": "看到高级模式或参数就避而不点;硬拉滑竿导致结果更差,失去信任", "root_cause": "把 LLM 术语直接暴露给非技术用户;缺乏'参数=效果预览'反馈回路", "review_ids": ["R04", "R16", "R25"], "bad_example": "'创意度拉到 100' → 全是胡说八道", "improve_direction": "隐藏所有 LLM 原生参数;改成 3 档业务预设('求稳/求灵感/求爆款'),每档配一句人话解释和 mini 预览;高级模式加二级确认" }, { "id": "S5", "name": "长度/格式/局部修改无法精确控制", "user_behavior": "想控制精确字数、想只改一段、想切换第一人称,反复重写整篇", "root_cause": "缺少块级/句级编辑指令 UI;用户不知道'指哪打哪'的表达方式", "review_ids": ["R06", "R17", "R18"], "bad_example": "'简短一点' → AI 删掉关键细节", "improve_direction": "生成结果按段落拆卡片,每段附独立操作:改短/改长/换视角/换措辞;字数用滑竿+区间(如 180-220 字)而非文字描述" }, { "id": "S6", "name": "输入信息组织混乱 · 不知道该塞什么进 AI", "user_behavior": "有产品链接/竞品文/需求碎片,不知道该复制哪部分、按什么顺序给 AI", "root_cause": "缺失结构化输入表单;开放输入框对普通用户过于'自由'", "review_ids": ["R02", "R03", "R11", "R12", "R19", "R22"], "bad_example": "'写小红书文案' 三个字 / 直接粘产品链接 / '目标读者:年轻人'", "improve_direction": "按场景配'结构化字段表单':商品文案自动 4 字段(产品/卖点/受众/平台);读者字段改成多选画像(而非'年轻人'这种无效词);URL 自动抓取摘要供用户勾选喂给 AI" } ] # 统计覆盖率 total = len(reviews) covered = Counter() scenario_counts = [] for s in SCENARIOS: n = len(s["review_ids"]) scenario_counts.append((s["id"], s["name"], n)) for rid in s["review_ids"]: covered[rid] += 1 # 按频次排序 SCENARIOS.sort(key=lambda s: -len(s["review_ids"])) for rank, s in enumerate(SCENARIOS, 1): s["rank"] = rank s["frequency"] = len(s["review_ids"]) s["frequency_pct"] = round(len(s["review_ids"]) / total * 100, 1) top3_covered_ids = set() for s in SCENARIOS[:3]: top3_covered_ids.update(s["review_ids"]) top3_pct = round(len(top3_covered_ids) / total * 100, 1) output = { "meta": { "source": "35 条差评中 25 条属于'提示词困难',已按场景归类", "total_prompt_difficulty_reviews": total, "scenarios_count": len(SCENARIOS), "top3_coverage_pct": top3_pct, "top3_coverage_meets_60pct": top3_pct >= 60 }, "scenarios": SCENARIOS, "cross_cutting_insights": [ "所有场景根因指向同一底层问题:『开放输入框 + 抽象自然语言』对非技术用户过重,应把提示词工程用 UI 组件封装", "新手小白(4/25)与自媒体运营(5/25)是抱怨最集中人群,先做这两类 persona 的引导路径", "抽象形容词('好一点''自然点''激情点')在 5+ 条差评中出现,这类模糊指令是最大失败源,需要用'样本+滑竿'替代" ], "recommended_next_actions": [ "P0 · 一周内:场景卡片墙 + 结构化输入表单(覆盖 S1+S6, ≈ 40% 差评)", "P0 · 一周内:隐藏 LLM 术语,参数改业务预设(覆盖 S4)", "P1 · 两周内:风格样本卡 + 'AI 模仿这段范文'输入通道(覆盖 S2)", "P1 · 两周内:角色卡模板库(覆盖 S3)", "P2 · 四周内:段落级编辑操作 + 字数滑竿(覆盖 S5)" ] } out_path = HERE / "pain_points.json" out_path.write_text(json.dumps(output, ensure_ascii=False, indent=2), encoding="utf-8") print(f"生成 {len(SCENARIOS)} 个场景, 共覆盖 {sum(len(s['review_ids']) for s in SCENARIOS)} 条评论引用(部分评论可能跨场景)") print(f"Top3 场景覆盖率: {top3_pct}% (阈值 60% => {'PASS' if top3_pct >= 60 else 'FAIL'})") for s in SCENARIOS: print(f" [{s['id']}] {s['name']}: {s['frequency']} 条 ({s['frequency_pct']}%)") print(f"输出: {out_path}")