refactor(strategy): 策略成稿章节顺序与 LLM 提示对齐

底稿重排为诊断→方向→4P→风险→约束→行动;前端表单 legend 与成稿章节一致;generate_strategy 系统提示约束一至十顺序;JdStrategyBuildView 补充成稿说明与 hint-flow 样式。

Made-with: Cursor
This commit is contained in:
hub-gif 2026-04-17 17:59:02 +08:00
parent 99bd2ef40d
commit c096f69082
3 changed files with 42 additions and 28 deletions

View File

@ -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"""

View File

@ -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 策略支柱(表单已填优先)",
"",
"| 支柱 | 本品动作 | 与头部差异 | 证据 / 出处 |",
"|------|----------|------------|-------------|",

View File

@ -188,6 +188,9 @@ watch(
<RouterLink to="/jd/strategy-view">策略稿预览</RouterLink>
<strong>决策在本页完成</strong>已填项会写入底稿并由大模型落实为执行句未填项由大模型结合数据补全成稿不再重复请再选式表述
</p>
<p class="hint-top hint-flow">
<strong>成稿章节顺序</strong> 目标与边界 战场与样本 竞争与本品态势 价格带与定位 用户与评论侧由报告 §8/摘要支撑本页无单独表单项 营销与总体方向 4P 支柱 风险 业务约束 下一步
</p>
<div class="toolbar">
<label class="chk-inline">
@ -299,7 +302,7 @@ watch(
</fieldset>
<fieldset class="fieldset">
<legend>营销策略与总体策略</legend>
<legend>营销策略与总体策略</legend>
<label class="fld fld-block">
<span>营销策略</span>
<textarea
@ -319,7 +322,7 @@ watch(
</fieldset>
<fieldset class="fieldset">
<legend>策略支柱 本品打算怎么做可先填一列</legend>
<legend>策略支柱4P 本品打算怎么做可先填一列</legend>
<label class="fld fld-block">
<span>产品</span>
<textarea v-model="decisions.pillar_product" rows="2" />
@ -339,7 +342,7 @@ watch(
</fieldset>
<fieldset class="fieldset">
<legend>风险确认已知晓则勾选</legend>
<legend>风险确认已知晓则勾选</legend>
<label class="chk">
<input v-model="decisions.ack_risk_keywords" type="checkbox" />
关注词 / 场景可能以偏概全需原评论抽样
@ -355,7 +358,7 @@ watch(
</fieldset>
<fieldset class="fieldset">
<legend>业务约束与内部判断</legend>
<legend>业务约束与内部判断</legend>
<label class="fld fld-block">
<span>业务备注</span>
<textarea
@ -376,6 +379,12 @@ watch(
color: #4b5563;
line-height: 1.55;
}
.hint-flow {
margin-top: -0.6rem;
padding-top: 0.5rem;
border-top: 1px solid #e5e7eb;
font-size: 0.84rem;
}
.hint-top a,
.hint-top :deep(a) {
color: #2563eb;