From c096f690828337d423e21d5fedd6adf8fdb1fe31 Mon Sep 17 00:00:00 2001 From: hub-gif <2487812171@qq.com> Date: Fri, 17 Apr 2026 17:59:02 +0800 Subject: [PATCH] =?UTF-8?q?refactor(strategy):=20=E7=AD=96=E7=95=A5?= =?UTF-8?q?=E6=88=90=E7=A8=BF=E7=AB=A0=E8=8A=82=E9=A1=BA=E5=BA=8F=E4=B8=8E?= =?UTF-8?q?=20LLM=20=E6=8F=90=E7=A4=BA=E5=AF=B9=E9=BD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 底稿重排为诊断→方向→4P→风险→约束→行动;前端表单 legend 与成稿章节一致;generate_strategy 系统提示约束一至十顺序;JdStrategyBuildView 补充成稿说明与 hint-flow 样式。 Made-with: Cursor --- backend/pipeline/llm/generate_strategy.py | 2 + backend/pipeline/reporting/strategy_draft.py | 51 ++++++++++--------- frontend/src/views/jd/JdStrategyBuildView.vue | 17 +++++-- 3 files changed, 42 insertions(+), 28 deletions(-) diff --git a/backend/pipeline/llm/generate_strategy.py b/backend/pipeline/llm/generate_strategy.py index 871c831..57dc7a0 100644 --- a/backend/pipeline/llm/generate_strategy.py +++ b/backend/pipeline/llm/generate_strategy.py @@ -36,6 +36,8 @@ STRATEGY_SYSTEM = """你是市场策略顾问,根据**结构化监测摘要** - 用户洞察、场景与传播结论须与宿主报告 **§8 文本挖掘** 及 `report_strategy_excerpt`(第九章)一致。 - **促销与活动**:若 `report_strategy_excerpt` 或 `structured_brief.price_promotion_signals` 中出现满减、券、到手价差、促销形态等,成稿须在**价格/营销/渠道**相关段落**承接**,与报告 **第六章、第九章** 建议一致,**不得无故省略**;**禁止**编造具体满减门槛或补贴比例(仅复述输入中已有线索)。 +**输出结构与阅读顺序**:成稿建议保持与规则底稿一致:**一至十** 依次为——目标与边界 → 战场与样本 → 竞争与本品态势 → 价格带与定位 → 用户与评论侧 → 营销策略与总体方向 → 机会与 4P 支柱 → 风险 → 业务约束 → 下一步;可微调标题用语,**勿**把「诊断数据」与「落地动作」顺序颠倒。 + **输出**:仅 Markdown 正文(不要 ``` 围栏);须收束各小节与全文,勿中途截断。""" STRATEGY_USER_PREFIX = """请基于以下 JSON 输出最终策略稿(Markdown)。\n\n""" diff --git a/backend/pipeline/reporting/strategy_draft.py b/backend/pipeline/reporting/strategy_draft.py index 61aa848..c73fc87 100644 --- a/backend/pipeline/reporting/strategy_draft.py +++ b/backend/pipeline/reporting/strategy_draft.py @@ -172,6 +172,7 @@ def build_strategy_draft_markdown( "", "> **骨架说明**:本页为**规则骨架**(占位与少量摘录)。勾选大模型生成时,在骨架与数据上写**短、可执行**成稿。" "**决策在策略生成表单完成**;未填项由模型结合本任务摘要与报告节选补全,**成稿不再写「请再选 / 请决策」式套话**。", + "> **阅读顺序**:目标与边界 → 战场与样本 → 竞争与本品态势 → 价格带与定位 → 用户与评论侧 → 营销与总体方向 → 机会与 4P 支柱 → 风险 → 业务约束 → 下一步行动。", "", ] if generated_at_iso: @@ -211,30 +212,12 @@ def build_strategy_draft_markdown( ] ) - lines.extend( - [ - "## 二、营销策略与总体方向", - "", - _goal_bullet( - "营销策略", - str(d.get("marketing_strategy") or ""), - "传播、活动、投放、内容主线等(可选)", - ), - _goal_bullet( - "总体策略", - str(d.get("general_strategy") or ""), - "增长/品类/经营层面的总原则,可与 4P 支柱呼应(可选)", - ), - "", - ] - ) - scope = brief.get("scope") or {} merged_n = scope.get("merged_sku_count") comm_n = scope.get("comment_flat_rows") lines.extend( [ - "## 三、战场与样本", + "## 二、战场与样本", "", f"- **监测关键词 / 货架语境**:{kw}", f"- **批次**:{_esc(brief.get('batch_label')) or '—'}", @@ -256,7 +239,7 @@ def build_strategy_draft_markdown( conc = brief.get("concentration") or {} shops = conc.get("shops_from_list") or {} dbrand = conc.get("detail_brand_among_merged") or {} - lines.extend(["## 四、竞争结构(摘录)", ""]) + lines.extend(["## 三、竞争结构与本品态势(摘录)", ""]) n_shop = _cr_narrative( "列表侧店铺集中度", concentration_first_share(shops), @@ -284,6 +267,8 @@ def build_strategy_draft_markdown( "", ] ) + lines.append("### 本品竞争态势(与表单「竞争态势自判」一致)") + lines.append("") stance = _esc(d.get("competitive_stance") or "").strip() stance_line = { "flank": "- **本品倾向**:侧翼切入,避免与头部正面硬碰。", @@ -305,7 +290,7 @@ def build_strategy_draft_markdown( lines.append("") pst = brief.get("price_stats") or {} - lines.extend(["## 五、价格带与定位(业务已选)", ""]) + lines.extend(["## 四、价格带与定位(业务已选)", ""]) if pst.get("n"): src = _esc(brief.get("price_stats_source")) or "—" lines.extend( @@ -339,7 +324,7 @@ def build_strategy_draft_markdown( ckw = brief.get("comment_focus_keywords") or [] usc = brief.get("usage_scenarios") or [] - lines.extend(["## 六、用户与评论侧", ""]) + lines.extend(["## 五、用户与评论侧", ""]) if use_ch8_probe: lines.extend( [ @@ -375,6 +360,24 @@ def build_strategy_draft_markdown( lines.append("*摘要中无关注词/场景组,请结合评论侧分析补全本节。*") lines.append("") + lines.extend( + [ + "## 六、营销策略与总体方向", + "", + _goal_bullet( + "营销策略", + str(d.get("marketing_strategy") or ""), + "传播、活动、投放、内容主线等(可选)", + ), + _goal_bullet( + "总体策略", + str(d.get("general_strategy") or ""), + "增长/品类/经营层面的总原则,可与下方 4P 支柱呼应(可选)", + ), + "", + ] + ) + raw_hints = brief.get("strategy_hints") or [] hints = ( filter_strategy_hints_for_ch8_probe(raw_hints) @@ -383,7 +386,7 @@ def build_strategy_draft_markdown( ) lines.extend( [ - "## 七、机会与策略支柱", + "## 七、机会与策略支柱(4P 落地)", "", ( "### 摘要提示(`strategy_hints`,已按探针口径过滤)" @@ -405,7 +408,7 @@ def build_strategy_draft_markdown( lines.extend( [ "", - "### 策略支柱(表单已填优先)", + "### 4P 策略支柱(表单已填优先)", "", "| 支柱 | 本品动作 | 与头部差异 | 证据 / 出处 |", "|------|----------|------------|-------------|", diff --git a/frontend/src/views/jd/JdStrategyBuildView.vue b/frontend/src/views/jd/JdStrategyBuildView.vue index 267e63d..e660cb2 100644 --- a/frontend/src/views/jd/JdStrategyBuildView.vue +++ b/frontend/src/views/jd/JdStrategyBuildView.vue @@ -188,6 +188,9 @@ watch( 策略稿预览决策在本页完成:已填项会写入底稿并由大模型落实为执行句;未填项由大模型结合数据补全。成稿不再重复「请再选」式表述。

+

+ 成稿章节顺序:一 目标与边界 → 二 战场与样本 → 三 竞争与本品态势 → 四 价格带与定位 → 五 用户与评论侧(由报告 §8/摘要支撑,本页无单独表单项)→ 六 营销与总体方向 → 七 4P 支柱 → 八 风险 → 九 业务约束 → 十 下一步。 +