diff --git a/backend/pipeline/reporting/strategy_draft.py b/backend/pipeline/reporting/strategy_draft.py index c73fc87..5135d93 100644 --- a/backend/pipeline/reporting/strategy_draft.py +++ b/backend/pipeline/reporting/strategy_draft.py @@ -162,84 +162,263 @@ def build_strategy_draft_markdown( strategy_decisions: dict[str, Any] | None = None, report_config: dict[str, Any] | None = None, ) -> str: - """生成可下载的 Markdown:策略骨架为主,附录为数据速览。""" + """生成可下载的 Markdown:与「六主轴 + 品牌四线」示例稿同构的规则骨架,附录为数据速览。""" use_ch8_probe = report_uses_chapter8_text_mining_probe(report_config) d = strategy_decisions or {} pos = _esc(d.get("positioning_choice") or "").strip() kw = _esc(brief.get("keyword")) or _esc(keyword) or "—" + batch = _esc(brief.get("batch_label")) or "—" lines: list[str] = [ f"# 市场策略制定草稿 · 「{kw}」", "", - "> **骨架说明**:本页为**规则骨架**(占位与少量摘录)。勾选大模型生成时,在骨架与数据上写**短、可执行**成稿。" - "**决策在策略生成表单完成**;未填项由模型结合本任务摘要与报告节选补全,**成稿不再写「请再选 / 请决策」式套话**。", - "> **阅读顺序**:目标与边界 → 战场与样本 → 竞争与本品态势 → 价格带与定位 → 用户与评论侧 → 营销与总体方向 → 机会与 4P 支柱 → 风险 → 业务约束 → 下一步行动。", + "> **骨架说明**:本页为**规则骨架**(占位与少量摘录)。大模型成稿时须写成**短、可执行**的完整策略稿,结构与 [`docs/demo` 市场策略稿示例](docs/demo) 一致:**摘要 → 一~十 → 附录**。" + "**不与《竞品分析报告》重复**:统计表、词频/共现、细类样本量、文本挖掘方法等以报告为准;策略稿只写**结论要点 + 怎么做**,可写「详见报告 §×」。" + "**决策在策略生成表单完成**;未填项由模型结合本任务摘要与可选节选补全,**成稿不再写「请再选 / 请决策」式套话**。", "", ] if generated_at_iso: lines.append(f"> **生成时间**:{_esc(generated_at_iso)} · **任务 ID**:{job_id}") lines.append("") + scope = brief.get("scope") or {} + merged_n = scope.get("merged_sku_count") + comm_n = scope.get("comment_flat_rows") + lines.extend( [ "---", "", - "## 一、目标与边界", + "## 摘要", + "", + f"- **范围与样本**:监测词「{kw}」;批次 **{batch}**;" + + ( + f"深入 SKU ≈ {_num(merged_n)};评价条数 ≈ {_num(comm_n)}。" + if merged_n is not None or comm_n is not None + else "样本规模见附录。" + ), + "- **用户侧**:*(一两句结论即可:讨论焦点与负向主题;**勿**展开与报告重复的细类统计、词频。)*", + "- **阶段重点**:*(须含 1~2 条**可执行动作**,回扣 §2 优先痛点;勿仅写「加强运营」。)*", + "", + "## 一、顾客是谁", + "", + "### 1.1 人群与决策路径", + "", + f"- **检索与货架语境**:{kw};批次 {batch}。", + ] + ) + bf = _esc(d.get("battlefield_one_line") or "").strip() + if bf: + lines.append(f"- **一句话战场**:{bf}") + else: + lines.append("- **一句话战场**:*(在哪个需求场景、与谁抢同一批用户?)*") + lines.extend( + [ + "- **典型路径**:*(成稿:搜索 → 列表比价 → 详情与配料 → 评价 → 下单/复购。)*", + "", + "*成稿须与 §2 痛点一致:写清「谁在什么任务下检索、决策」,为后文「针对痛点怎么做」埋伏笔。*", + "", + "### 1.2 细类讨论焦点(评论文本分析)", + "", + ] + ) + if use_ch8_probe: + lines.extend( + [ + "*当前任务以**第八章评论侧文本挖掘**为主呈现时,此处**不**逐条罗列关注词子串命中次数。*", + "", + "- **饼干 / 糕点 / 面点等**:*(骨架占位;成稿用**一句归纳**/用户关心点,**勿**复述 §8 词频与条数。)*", + "", + ] + ) + else: + ckw = brief.get("comment_focus_keywords") or [] + usc = brief.get("usage_scenarios") or [] + lines.append("*下列为关注词/场景**统计摘录**(仅底稿审计用);**成稿删除逐条枚举**,只保留对策略有用的一两句结论,避免与同任务竞品分析报告重复。*") + lines.append("") + if ckw: + for item in ckw[:8]: + if isinstance(item, dict): + w = _esc(item.get("word")) + c = _num(item.get("count")) + lines.append( + f"- 「{w}」:子串统计命中约 **{c}** 次(口径同报告关注词)。" + ) + if usc: + for item in usc[:6]: + if isinstance(item, dict): + sc = _esc(item.get("scenario")) + cn = _num(item.get("count")) + sh = _pct(item.get("share_of_text_units")) + lines.append( + f"- 场景「{sc}」:约 **{cn}** 条,约占 **{sh}** 文本单元(预设场景分组)。" + ) + if not ckw and not usc: + lines.append("*摘要中无关注词/场景组,请结合评论侧分析补全本节。*") + lines.append("") + + mix = brief.get("category_mix_top") or [] + if mix: + lines.append("### 类目结构(摘录)") + lines.append("") + for item in mix[:6]: + if isinstance(item, dict): + lines.append(f"- {_esc(item.get('label'))}:{_num(item.get('count'))}") + lines.append("") + + lines.extend( + [ + "### 1.3 本品聚焦(占位)", + "", + "*成稿写清本期**主攻人群/场景**与 §2.1 痛点的对应关系。*", "", _goal_bullet("本品角色", str(d.get("product_role") or ""), "新品 / 追赶 / 防守 / 拓品类 …"), - _goal_bullet("时间范围", str(d.get("time_horizon") or ""), "如:本季度 / 未来 12 周"), - _goal_bullet( - "成功标准(可量化)", - str(d.get("success_criteria") or ""), - "如:搜索位次、转化率、声量、复购 …", - ), - _goal_bullet("非目标", str(d.get("non_goals") or ""), "明确不做什么(可选)"), _goal_bullet( "目标客群", str(d.get("audience_segment") or ""), - "一句话:为谁、什么场景(可选)", + "为谁、什么场景(可选)", ), _goal_bullet( "主要对标", str(d.get("competitor_reference") or ""), "品牌或价位带参照(可选)", ), - _goal_bullet( - "资源与预算备注", - str(d.get("resource_notes") or ""), - "人力、投放、产能等量级(可选)", - ), "", ] ) - scope = brief.get("scope") or {} - merged_n = scope.get("merged_sku_count") - comm_n = scope.get("comment_flat_rows") lines.extend( [ - "## 二、战场与样本", + "## 二、产品价值与用户痛点", + "", + "### 2.1 痛点与证据", + "", + "| 痛点 | 证据信号 | 优先级 |", + "|------|----------|--------|", + "| *(成稿依数据与评论归纳)* | | |", + "", + "### 2.2 本品价值(占位)", + "", + "- **功能**:*(占位)*", + "- **情感/社会价值**:*(占位;对外须合规)*", + "", + "### 2.3 痛点—价值—证据", + "", + "| 痛点 | 本品价值(占位) | 素材 |", + "|------|------------------|------|", + "| | | |", + "", + "### 2.4 负向评价主题归因(若有)", + "", + "*成稿只写**归因结论**(如分量、口感适配);**勿**复述报告中的案例枚举与统计细节。*", + "", + "### 2.5 策略动作总表(痛点 → 怎么做)", + "", + "*成稿须**逐行填写**:针对用户哪条痛点,采取什么策略动作,在具体触点怎么做,如何验证。*", + "", + "| 用户痛点 | 策略动作(做什么) | 具体怎么做(触点/话术/规格/渠道) | 如何验证 |", + "|----------|-------------------|-----------------------------------|----------|", + "| *(与 §2.1 对应)* | *(动词句)* | *(可执行)* | *(指标或抽样)* |", + "| | | | |", "", - f"- **监测关键词 / 货架语境**:{kw}", - f"- **批次**:{_esc(brief.get('batch_label')) or '—'}", ] ) - if merged_n is not None or comm_n is not None: + + raw_hints = brief.get("strategy_hints") or [] + hints = ( + filter_strategy_hints_for_ch8_probe(raw_hints) + if use_ch8_probe + else (list(raw_hints) if isinstance(raw_hints, list) else []) + ) + if hints: + lines.append("**摘要自动线索(`strategy_hints`)**") + lines.append("") + for h in hints: + lines.append(f"- {_esc(h)}") + lines.append("") + + pst = brief.get("price_stats") or {} + lines.extend( + [ + "## 三、为什么要买「这款产品」", + "", + "### 3.1 品类与时机", + "", + ] + ) + raw = brief.get("pc_search_raw") or {} + if raw.get("result_count_consensus") is not None: lines.append( - f"- **深入样本**:深入 SKU ≈ {_num(merged_n)};评价扁平条数 ≈ {_num(comm_n)}。" + f"- **列表申报规模(resultCount)**:{_num(raw.get('result_count_consensus'))}(非销售额)" ) - bf = _esc(d.get("battlefield_one_line") or "").strip() - if bf: - lines.append(f"- **一句话战场**:{bf}") + elif merged_n is not None: + lines.append(f"- **深入样本 SKU 数**:{_num(merged_n)}") else: - lines.append( - "- **一句话战场**:*(在哪个需求场景、与谁抢同一批用户?)*" - ) + lines.append("- **品类与时机**:*(成稿结合摘要与监测范围。)*") lines.append("") + lines.append( + "*成稿在§3.1 末尾用 1~2 句**承接** §2 中优先解决的痛点(再写购买理由)。*" + ) + lines.append("") + lines.extend( + [ + "### 3.2 转化障碍与应对", + "", + ] + ) + if pst.get("n"): + src = _esc(brief.get("price_stats_source")) or "—" + lines.extend( + [ + f"- **价格摘录**:来源 {src},n = {_num(pst.get('n'))};" + f"区间 {_num(pst.get('min'))}~{_num(pst.get('max'))};中位数 {_num(pst.get('median'))}。", + "- **障碍与应对**:*(**每条障碍**对应**至少一条应对动作**:谁、在哪个页面/环节、改什么;含价带锚点、规格、信任等。)*", + "", + ] + ) + else: + lines.append("*摘要中无价带统计,请结合本批次价格数据补全。*") + lines.append("") + lines.append( + "*若无价带摘录,成稿仍须写障碍与应对,并与 §2 痛点挂钩。*" + ) + lines.append("") + + lines.extend( + [ + "## 四、为什么要选「这个品牌」", + "", + "### 4.1 品牌承诺与调性(占位)", + "", + "*成稿:承诺与调性须能落到**触点**(商详/包装/客服首句等)上的**具体句子**,勿仅形容词。*", + "", + "- **一句话**:*(占位)*", + "- **调性**:透明、可验证、合规控糖叙事(成稿可细化)。", + "", + "### 4.2 信任与证据", + "", + "- *(成稿:评价、配料、可核验表述边界。)*", + "", + "**主定位(与表单一致)**", + "", + f"- {_pos_mark(pos, 'top')} **贴顶**:中高位或头部价位带。", + f"- {_pos_mark(pos, 'mid')} **卡腰**:围绕中位数一带。", + f"- {_pos_mark(pos, 'entry')} **下探**:贴近区间下限。", + f"- {_pos_mark(pos, 'different')} **另起带**:规格/组合/服务差异化。", + "", + ] + ) conc = brief.get("concentration") or {} shops = conc.get("shops_from_list") or {} dbrand = conc.get("detail_brand_among_merged") or {} - lines.extend(["## 三、竞争结构与本品态势(摘录)", ""]) + lines.extend( + [ + "## 五、与其它品牌有何不同", + "", + "### 5.1 对比对象(摘录)", + "", + ] + ) n_shop = _cr_narrative( "列表侧店铺集中度", concentration_first_share(shops), @@ -263,11 +442,23 @@ def build_strategy_draft_markdown( lines.extend( [ "", - "- **自测**:头部已占稳心智时,侧翼还是正面替代?分散时是否用细分场景或内容教育切入?", + "- **环境自测**:头部强势时是侧翼还是正面替代?格局分散时是否用细分场景切入?", + "", + "### 5.2 差异化方向(占位)", + "", + "*成稿:相对竞品**多做什么/少做什么**,写**可执行的一步**(非空泛「更好」)。*", + "", + "| 差异点 | 说明 | 风险 |", + "|--------|------|------|", + "| | *待填* | |", "", ] ) - lines.append("### 本品竞争态势(与表单「竞争态势自判」一致)") + lines.append("### 5.3 竞争应对") + lines.append("") + lines.append( + "*成稿:在表单倾向基础上,写清**跟价/不跟价时具体话术或机制**(一句即可)。*" + ) lines.append("") stance = _esc(d.get("competitive_stance") or "").strip() stance_line = { @@ -278,164 +469,114 @@ def build_strategy_draft_markdown( }.get(stance) if stance_line: lines.append(stance_line) - lines.append("") - - mix = brief.get("category_mix_top") or [] - if mix: - lines.append("### 类目结构(Top)") - lines.append("") - for item in mix[:6]: - if isinstance(item, dict): - lines.append(f"- {_esc(item.get('label'))}:{_num(item.get('count'))}") - lines.append("") - - pst = brief.get("price_stats") or {} - lines.extend(["## 四、价格带与定位(业务已选)", ""]) - if pst.get("n"): - src = _esc(brief.get("price_stats_source")) or "—" - lines.extend( - [ - f"- **价格来源**:{src},有效价样本 n = {_num(pst.get('n'))}。", - f"- **展示价区间**:{_num(pst.get('min'))} ~ {_num(pst.get('max'))};**中位数** {_num(pst.get('median'))}。", - "", - "**主定位(与表单一致)**", - "", - f"- {_pos_mark(pos, 'top')} **贴顶**:中高位或头部价位带,强调品质/成分/背书。", - f"- {_pos_mark(pos, 'mid')} **卡腰**:围绕中位数一带,强调性价比与场景匹配。", - f"- {_pos_mark(pos, 'entry')} **下探**:贴近区间下限,强调入门与拉新(注意毛利与调性)。", - f"- {_pos_mark(pos, 'different')} **另起带**:避开主价格带,用规格/组合/服务差异化。", - "", - ] - ) - else: - lines.append("*摘要中无价带统计,请结合本批次价格数据补全。*") - lines.append("") - lines.extend( - [ - "**主定位(与表单一致)**", - "", - f"- {_pos_mark(pos, 'top')} **贴顶**:中高位或头部价位带,强调品质/成分/背书。", - f"- {_pos_mark(pos, 'mid')} **卡腰**:围绕中位数一带,强调性价比与场景匹配。", - f"- {_pos_mark(pos, 'entry')} **下探**:贴近区间下限,强调入门与拉新(注意毛利与调性)。", - f"- {_pos_mark(pos, 'different')} **另起带**:避开主价格带,用规格/组合/服务差异化。", - "", - ] - ) - - ckw = brief.get("comment_focus_keywords") or [] - usc = brief.get("usage_scenarios") or [] - lines.extend(["## 五、用户与评论侧", ""]) - if use_ch8_probe: - lines.extend( - [ - "*当前任务报告以**第八章评论侧文本挖掘**为主呈现时,此处**不**逐条罗列子串命中次数(与报告 §8 口径一致)。*", - "", - "- **需求焦点**:*(骨架占位;成稿写 1~2 句可执行结论)*", - "- **场景侧重**:*(骨架占位)*", - "- **传播切入点**:*(骨架占位)*", - "", - ] - ) - else: - lines.append("*下列为关注词/场景**统计摘录**(口径同本批次摘要);成稿时写成具体动作,勿重复统计句。*") - lines.append("") - if ckw: - for item in ckw[:8]: - if isinstance(item, dict): - w = _esc(item.get("word")) - c = _num(item.get("count")) - lines.append( - f"- 「{w}」:子串统计命中约 **{c}** 次(口径同报告关注词)。" - ) - if usc: - for item in usc[:6]: - if isinstance(item, dict): - sc = _esc(item.get("scenario")) - cn = _num(item.get("count")) - sh = _pct(item.get("share_of_text_units")) - lines.append( - f"- 场景「{sc}」:约 **{cn}** 条,约占 **{sh}** 文本单元(预设场景分组)。" - ) - if not ckw and not usc: - lines.append("*摘要中无关注词/场景组,请结合评论侧分析补全本节。*") lines.append("") lines.extend( [ - "## 六、营销策略与总体方向", + "## 六、阶段目标与路径", + "", + "### 6.1 本阶段定义", + "", + _goal_bullet("时间范围", str(d.get("time_horizon") or ""), "如:本季度 / 未来 12 周"), + _goal_bullet( + "成功标准(可量化)", + str(d.get("success_criteria") or ""), + "搜索位次、转化、复购等", + ), + _goal_bullet("非目标", str(d.get("non_goals") or ""), "明确不做什么(可选)"), + "", + "### 6.2 路径", + "", + "*成稿:路径须与 **§2.5** 动作可对齐;营销/总体策略为**动词句**,回扣痛点。*", "", _goal_bullet( "营销策略", str(d.get("marketing_strategy") or ""), - "传播、活动、投放、内容主线等(可选)", + "传播、活动、投放、内容主线(可选)", ), _goal_bullet( "总体策略", str(d.get("general_strategy") or ""), - "增长/品类/经营层面的总原则,可与下方 4P 支柱呼应(可选)", + "增长/品类/经营总原则(可选)", + ), + _goal_bullet( + "资源与预算备注", + str(d.get("resource_notes") or ""), + "人力、投放、产能等(可选)", ), "", ] ) - raw_hints = brief.get("strategy_hints") or [] - hints = ( - filter_strategy_hints_for_ch8_probe(raw_hints) - if use_ch8_probe - else (list(raw_hints) if isinstance(raw_hints, list) else []) - ) - lines.extend( - [ - "## 七、机会与策略支柱(4P 落地)", - "", - ( - "### 摘要提示(`strategy_hints`,已按探针口径过滤)" - if use_ch8_probe - else "### 摘要提示(`strategy_hints`)" - ), - "", - ] - ) - if hints: - for h in hints: - lines.append(f"- {_esc(h)}") - else: - lines.append("*(当前无自动线索)*") pp = str(d.get("pillar_product") or "") pr = str(d.get("pillar_price") or "") pch = str(d.get("pillar_channel") or "") pcm = str(d.get("pillar_comm") or "") lines.extend( [ + "## 七、品牌四线:建设 · 打造 · 运营 · 体验", "", - "### 4P 策略支柱(表单已填优先)", + "*(与表单「4P 策略支柱」对应:产品 / 定价 / 渠道 / 传播。)*", + "*成稿:**每条线**至少一句——服务哪类痛点、本阶段**具体做哪一步**。*", "", - "| 支柱 | 本品动作 | 与头部差异 | 证据 / 出处 |", - "|------|----------|------------|-------------|", - f"| 产品 | {_pillar_cell(pp)} | *待填* | *§* |", - f"| 价格 | {_pillar_cell(pr)} | *待填* | *§* |", - f"| 渠道/触点 | {_pillar_cell(pch)} | *待填* | *§* |", - f"| 传播与内容 | {_pillar_cell(pcm)} | *待填* | *§* |", + "### 7.1 品牌建设", + "", + f"- {_pillar_cell(pp)}", + "", + "### 7.2 品牌打造", + "", + f"- {_pillar_cell(pr)}", + "", + "### 7.3 品牌运营", + "", + f"- {_pillar_cell(pch)}", + "", + "### 7.4 品牌体验", + "", + f"- {_pillar_cell(pcm)}", "", ] ) + if use_ch8_probe: pst_sig = brief.get("price_promotion_signals") or {} has_promo = isinstance(pst_sig, dict) and bool(pst_sig) lines.extend( [ - "### 促销与活动(须与报告对齐)", "", - "*评论侧需求与场景以报告 **§8 文本挖掘** 为准,**不以**关注词/场景子串统计为论据。*", - ( - "*促销、满减、券后价差等:须与报告 **第六章** 及摘要 `price_promotion_signals`、**第九章**节选一致;成稿须承接报告已写明的活动与价差线索。*" - if has_promo - else "*促销与价差:若报告 **第六章/第九章** 或摘要 `price_promotion_signals` 有归纳,成稿须承接;无则勿编造具体满减门槛。*" - ), + "*促销与活动线索:须与摘要 `price_promotion_signals` 及第六章/第九章已有归纳一致;无则勿编造具体满减门槛。*" + if has_promo + else "*促销与价差:若摘要或价格信号有归纳则承接;无则勿编造。*", "", ] ) + lines.extend( + [ + "## 八、战术支柱", + "", + "*成稿:四支柱分别回扣 **痛点→动作→落地**(可与 §2.5 呼应,避免纯重复)。*", + "", + "### 8.1 产品策略", + "", + f"- *(表单产品支柱:{_pillar_cell(pp)})*", + "", + "### 8.2 定价策略", + "", + f"- *(表单价格支柱:{_pillar_cell(pr)})*", + "", + "### 8.3 促销与活动策略", + "", + "*须写促销**原则**(券/到手价/跟价节奏);**满减、满折、跨店**等:能引用的写清来源;监测未捕获具体门槛时写「待与运营/后台对齐」,**勿**整节留空,**勿**编造门槛数字。*", + "*与 `price_promotion_signals`、报告第六章一致;勿虚构活动。*", + "", + "### 8.4 渠道与传播", + "", + f"- *(渠道/传播:{_pillar_cell(pch)} / {_pillar_cell(pcm)})*", + "", + ] + ) + rk = bool(d.get("ack_risk_keywords")) rp = bool(d.get("ack_risk_price")) rc = bool(d.get("ack_risk_concentration")) @@ -446,37 +587,39 @@ def build_strategy_draft_markdown( ) lines.extend( [ - "## 八、风险核对项", + "## 九、风险、假设与待验证", "", _risk_line(rk, rk_kw), _risk_line(rp, "价格带是否含大促/异常挂价?(需核对清洗规则)"), _risk_line(rc, "列表集中度与深入样本品牌是否不一致?(需解释渠道差异)"), "", + "*成稿:每条风险尽量带**应对动作或验证计划**(抽样、核对规则),勿只列标题。*", + "", + "*业务备注见下节。*", + "", + "## 十、下一步与节奏", + "", + "*成稿:下列为**可执行任务**(可补负责人/时间);与 §2.5 / §六 优先级一致。*", + "", + "- [ ] 锁定主推款与对标;过法务与合规。", + "- [ ] 统一对外数据口径与话术。", + "- [ ] 下轮监测更新后迭代策略。", + "", ] ) notes = _esc(business_notes) lines.extend( [ - "## 九、业务约束与备注", + "### 业务约束与备注", "", (notes if notes else "*(未填写业务备注。)*"), "", - ] - ) - - lines.extend( - [ - "## 十、下一步(可执行)", - "", - "- [ ] 对齐 **§一** 目标与 **§九** 约束,锁定 1~2 条主命题。", - "- [ ] 为 **§七** 支柱各补 **1 条数据证据** + **12 周内可交付动作**(负责人 + 时间)。", - "", "---", "", - "## 附录 · 本任务关键数据速览", + "## 附录:本任务关键数据一览", "", - f"- **关键词**:{kw} · **摘要版本**:v{_num(brief.get('schema_version'))}", + f"- **关键词**:{kw} · **批次**:{batch} · **摘要版本**:v{_num(brief.get('schema_version'))}", ] ) meta = brief.get("meta") diff --git a/docs/planning/策略生成-框架确定.md b/docs/planning/策略生成-框架确定.md new file mode 100644 index 0000000..e1a242d --- /dev/null +++ b/docs/planning/策略生成-框架确定.md @@ -0,0 +1,156 @@ +# 策略生成 · 框架确定 + +**版本**:2026-04-21(修订:强化「痛点 → 怎么做」) +**目的**:在继续迭代「填表 → 规则底稿 / LLM 成稿 → 导出」之前,把**结构、输入输出、与报告的关系**定死;并明确——**策略成稿不是市场说明书,而是针对用户痛点写清「做什么、怎么做」**。 + +**关联**: + +| 说明 | 路径 | +|------|------| +| 原则与 S1/S2 路线 | `docs/planning/strategy-marketing-content-alignment.md` | +| 规则底稿(骨架) | `backend/pipeline/reporting/strategy_draft.py` → `build_strategy_draft_markdown` | +| LLM 成稿 | `backend/pipeline/llm/generate_strategy.py` → `generate_strategy_draft_markdown_llm` | +| 人工可读示例(低 GI 批次) | `docs/demo/市场策略稿-示例-20260413_104252_低GI.md` | +| API | `JobStrategyDraftView`:`POST` 策略稿,`generator=rules \| llm` | + +--- + +## 1. 我们说的「策略生成」指什么 + +在本仓库里,**策略生成**特指:**独立市场策略稿**(Markdown),由任务数据 + 业务表单驱动,**不是**竞品报告全文,也**不是**报告里第九章那一小段嵌入块。 + +| 产物 | 形态 | 主要用途 | +|------|------|----------| +| **独立策略稿** | 摘要 → 一至十 → 附录 | 业务讨论、对外删减版、与表单决策对齐 | +| **报告 · 第九章** | 仅 `####` 小节,嵌在「九、策略与机会」下 | 与第五~八章同源、假设性归纳 | +| **营销内容**(规划) | 另管线,共用 brief | 表达层,见 alignment 文档 S2 | + +框架确定**只锁定第一行**:独立策略稿。 + +--- + +## 0. 与《竞品分析报告》的分工(避免重复) + +| 放在分析报告 | 放在策略稿 | +|--------------|------------| +| 样本量、列表/深入口径、词频、共现、LDA、细类条数、图表解读、方法说明 | **不写或一句带过**;可写「详见同任务竞品分析报告 §× / 附录」 | +| — | **要写**:痛点归纳(结论短语)、**怎么做**(§2.5 及后续动作)、资源与节奏、风险应对 | + +策略稿**不是第二份统计报告**;统计分析已在报告中完成,策略稿只消费其**结论**并转为**行动**。 + +### 常见质疑(口径) + +**Q:凭什么写「松软」,评论里还有很多人要「酥脆」?** +**A:** 二者常对应**不同细类**(糕点/面包 vs 饼干)。策略须**按主推款/细类**写口感与工艺,分线表述;禁止用单一词覆盖全池。若多线并行,饼干线与糕点线应分别有策略句。 + +**Q:满减、满额打折是不是不管了?** +**A:** **不是不管。** 能来自 `price_promotion_signals` / 报告第六章的须写进 §八.3;**禁止编造**未监测到的门槛。未捕获具体规则时,须写「待运营按后台活动补齐」类表述,并保留促销**原则**(透明、跟价节奏、券类型方向),避免整节空白。 + +--- + +## 1.1 核心:策略部分要写「怎么做」,不能只写「是什么」 + +| 不满意的表现 | 应有的表现 | +|--------------|------------| +| 大量篇幅描述市场、品类、数据,读完不知道「我们要做什么」 | 每条策略**能回答**:针对**哪类用户、哪条痛点**,我们**采取什么动作**,**在具体触点怎么做**(商详第几屏、主图文案、规格怎么标、客服话术等) | +| 痛点与后面章节脱节 | **第二节**列清痛点后,**第六节起**(目标与路径、品牌四线、战术支柱)必须能**回扣**到痛点,避免「泛泛而谈增长」 | +| 只有「建议重视体验」 | 写成**可执行句**:谁、在什么渠道、在什么时间窗口、做什么改动、如何验收 | + +**强制结构(逻辑闭环)**: + +1. **用户痛点**(来自数据与评论归纳,第二节) +2. **对应策略意图**(价值主张、差异化、目标) +3. **怎么做**(动作 + 落地载体:页面/投放/产品/价格/促销) +4. **如何验证**(指标、抽样、时间) + +规则底稿中增加 **§2.5 策略动作总表** 占位;LLM 成稿须**填满**该表或等价表述,且 **§六~§八** 以**动词导向**(应做、通过、在…上)为主,避免纯名词堆砌。 + +--- + +## 2. 成稿结构(已定,勿随意增删块) + +与 **`build_strategy_draft_markdown` / `STRATEGY_SYSTEM`**、示例稿 **一致**,顺序如下: + +| 顺序 | 章节 | 要点(**策略性要求**) | +|------|------|------------------------| +| 0 | **摘要** | 除范围样本外,**阶段重点**须含 1~2 条**可感知动作**(如「主推款商详标明规格与克重」),而非仅「加强运营」 | +| 1 | **一、顾客是谁** | 1.1 人群与路径 · 1.2 细类/评论侧归纳 · 1.3 本品聚焦(表单:角色、客群、对标) | +| 2 | **二、产品价值与用户痛点** | 痛点表 · 本品价值 · 对表 · 负向归因 **· 2.5 策略动作总表(痛点 → 怎么做)** | +| 3 | **三、为什么要买「这款产品」** | 品类与时机 · **转化障碍每条对应「应对动作」**(怎么做),不是只列障碍 | +| 4 | **四、为什么要选「这个品牌」** | 承诺与调性 · 信任与证据 · 主定位(表单勾选) | +| 5 | **五、与其它品牌有何不同** | 对比对象 · 差异化 · **竞争应对须写可执行应对**(不主动价格战 / 跟价时如何说明等) | +| 6 | **六、阶段目标与路径** | 时间 / 成功标准 · **营销与总体策略须写成动作句**(与痛点挂钩) | +| 7 | **七、品牌四线** | 建设 · 打造 · 运营 · 体验(与表单 4P 支柱对应,**每条线至少一条「怎么做」**) | +| 8 | **八、战术支柱** | 产品 / 定价 / 促销 / 渠道:**每支柱下写 针对哪条痛点、做什么、怎么落地** | +| 9 | **九、风险、假设与待验证** | 含表单风险勾选 | +| 10 | **十、下一步与节奏** | 含业务备注;**下一步**为可执行任务,非口号 | +| 11 | **附录** | 关键数据一览(与 brief 同源) | + +**命名约定**:对外文档可称「六主轴 + 品牌四线」——六主轴对应 **一~六** 的叙事链,**七** 为品牌四线,**八** 为 4P 战术落地。 + +**§2.5 策略动作总表(推荐列)**: + +| 用户痛点(可来自 2.1) | 策略动作(我们做什么) | 具体怎么做(触点/话术/规格/渠道) | 如何验证 | +|------------------------|------------------------|-----------------------------------|----------| +| | | | | + +**全文各章「怎么做」补充(除 §2.5 外,摘要与一、三~五、九、十亦须落地)** + +| 章节 | 除数据叙述外,必须带上的策略性内容 | +|------|--------------------------------------| +| **摘要** | **阶段重点**含 1~2 条可执行动作,回扣 §2 优先痛点 | +| **一** | **1.3** 写清主攻人群/场景与 §2 痛点的对应;与后文动作一致 | +| **三** | §3.1 末承接 §2 优先痛点;§3.2 **每条障碍**对应**至少一条应对动作**(页面/环节/改什么) | +| **四** | 承诺落到**触点**(商详/包装/客服等)的具体句子 | +| **五** | 差异化 = 相对竞品**多做什么/少做什么**;竞争应对 = 跟价/不跟价时的**具体话术或机制** | +| **六** | 路径与 §2.5 对齐;营销/总体策略为**动词句** | +| **七** | 四线各至少一句:**服务哪类痛点、本阶段做哪一步** | +| **八** | 四支柱分别回扣 **痛点→动作→落地** | +| **九** | 风险项带**应对动作或验证计划**,勿只列标题 | +| **十** | 可执行任务,与 §2.5 / §六 优先级一致 | + +(代码与 `STRATEGY_SYSTEM` 已同步上述要求;规则底稿各节均有对应 *成稿须…* 提示。) + +--- + +## 3. 输入框架(三层) + +| 层 | 内容 | 来源 | +|----|------|------| +| **A. 数据层** | `build_competitor_brief` 的 JSON | 同任务 `run_dir` CSV + `effective_report_config.json`,与报告**同一套计数** | +| **B. 决策层** | `strategy_decisions` | 前端策略表单:战场一句话、定位四选一、竞争倾向、四柱、营销/总体策略、风险勾选等 | +| **C. 对齐层(可选)** | `report_strategy_excerpt` | `load_report_strategy_excerpt`:优先 `strategy_opportunities_llm.json` 的 `markdown`,否则从 `competitor_analysis.md` 第九章截取 | + +LLM 路径下:**A** 经 `compact_brief_for_llm` 压缩进 payload;**B** 原样进入;**C** 截断后进入。 +**规则路径**无 LLM,仅 **A+B** 写入骨架,**C** 不参与(但 API 仍返回节选元数据便于核对)。 + +--- + +## 4. 输出与验收 + +| 模式 | 输出 | 最低验收 | +|------|------|----------| +| `generator=rules` | 带占位符的 Markdown | 章节齐全;含 **§2.5** 表头;数字仅来自 brief 摘录;与 `chapter8_text_mining_probe` 时无关注词条形图口径冲突 | +| `generator=llm` | 可读成稿 | 章节与骨架一致;无编造数字;已填表单项落实为执行句;节选非空时与第九章方向不矛盾;**全书**能体现「痛点→动作→怎么做」(含摘要、一、三~十);**禁止**仅复述市场描述而无 actionable 句 | + +--- + +## 5. 与「报告第九章」的边界(防混) + +- **第九章**:短、假设性、`####` 标题,服务**已读报告的人**。 +- **独立策略稿**:长结构、服务**要单独拿策略讨论/对外节选的人**。 +- 二者数据同源(brief),**不要求**策略稿复述「第九章原文」,只要求**方向与数字不打架**(见 `STRATEGY_DATA_RULES`)。 + +--- + +## 6. 待你方拍板的扩展(不影响上述已定框架) + +若后续要改,单独立项,不混进「框架确定」: + +- 是否增加「仅摘要 / 仅战术章」等**变体模板**; +- 是否在表单增加字段(如新里程碑); +- 营销内容 S2 与策略稿的**强制依赖顺序**(建议:策略稿稳定后再接营销)。 + +--- + +*本文件为框架锚点;实现以代码与 `strategy-marketing-content-alignment.md` 为准,如有冲突以代码与 alignment 原则优先。*