feat(keywords): rename brand-question terminology to search-keyword + add entity exclusion

- Rename UI/prompt labels: "品牌主问题" → "优化关键词", "搜索问题" → "搜索词"
- Add brand/competitor entity exclusion filter in question expansion (AI distill path)
- Refactor combination question text normalization, remove manual question-mark appending
- Update prompts to emphasize commercial-intent search queries over editorial phrasing
- Sync prompt changes across server/configs, deploy, and k3s configs
- Update i18n, frontend views (BrandQuestionCreate, TemplateWizard), and test fixtures

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-20 01:27:14 +08:00
parent 28633cf570
commit c89cad6643
19 changed files with 1211 additions and 668 deletions
+77 -77
View File
@@ -79,7 +79,7 @@ const zhCN = {
media: "媒体管理",
publishManagement: "发文管理",
brandManagement: "品牌管理",
brands: "品牌词库",
brands: "公司和词库",
tracking: "数据追踪",
trackingDetail: "数据详情",
contentManagement: "内容管理",
@@ -150,7 +150,7 @@ const zhCN = {
template_outline_generate: "AI 生成大纲",
kol_prompt_generate: "KOL 模版生成",
kol_prompt_optimize: "KOL 模版优化",
question_distill: "AI 生成候选问题",
question_distill: "AI 生成候选搜索词",
question_combination_fill: "拓词工具 AI 填词",
},
aiUsageStatus: {
@@ -206,12 +206,12 @@ const zhCN = {
description: "查看桌面端发布任务、外链、账号工作台入口和重发状态。",
},
brands: {
title: "品牌词库",
description: "围绕品牌维护关键词、问题集和竞品信息。",
title: "公司和词库",
description: "围绕品牌维护关键词库(搜索词)和竞品信息。",
},
brandQuestionCreate: {
title: "新建问题",
description: "用拓词工具、AI 扩展或手动录入创建品牌问题集。",
title: "新建搜索词",
description: "用拓词工具、AI 扩展或手动录入创建品牌关键词库(搜索词)。",
},
tracking: {
title: "数据详情",
@@ -440,11 +440,11 @@ const zhCN = {
},
tracking: {
brandPlaceholder: "选择品牌",
keywordPlaceholder: "选择问题集",
allQuestionSets: "全部问题集",
keywordPlaceholder: "选择关键词库(搜索词)",
allQuestionSets: "全部关键词库(搜索词)",
collectNow: "立即采集",
collectBrandRequired: "请先选择品牌,再发起采集",
collectKeywordRequired: "请选择问题集后再发起采集",
collectKeywordRequired: "请选择关键词库(搜索词)后再发起采集",
collectTodayOnly: "立即采集只支持今天的数据,请切回今天后再操作",
collectClientChecking: "正在检查当前账号的桌面客户端状态",
collectClientOnlineRequired: "当前登录账号的桌面客户端未在线,暂时不能立即采集",
@@ -464,7 +464,7 @@ const zhCN = {
platformMatrixTitle: "平台对比矩阵",
hotQuestions: "Hot Questions",
hotQuestionsTitle: "高频问题",
hotQuestionsHint: "可选择全部问题集或具体单个问题;选择单个问题时只展示并采集该问题。",
hotQuestionsHint: "可选择全部关键词库(搜索词)或具体单个搜索词;选择单个搜索词时只展示并采集该搜索词。",
questionSearchPlaceholder: "搜索当前范围下的问题",
questionDetailEyebrow: "Question Detail",
questionDetailCollectedAt: "采集时间 {time}",
@@ -806,13 +806,13 @@ const zhCN = {
language: "文章语言",
brandInfo: "品牌信息",
brandLibrary: "品牌库",
brandName: "品牌名称",
brandName: "公司名称",
website: "官网地址",
brandSummary: "AI 品牌摘要",
keywords: "关键词",
brandQuestions: "品牌问题",
primaryQuestion: "品牌主问题",
supplementalQuestions: "补充覆盖问题",
brandQuestions: "关键词库(搜索词)",
primaryQuestion: "优化关键词",
supplementalQuestions: "补充关键词",
competitors: "竞品列表",
chooseTitle: "选择文章标题",
customTitle: "自定义标题",
@@ -829,13 +829,13 @@ const zhCN = {
},
hints: {
brandContext: "可选。选择后会自动带出关键词与竞品信息。",
brandFlow: "品牌可直接输入,也可以从品牌库带入。选择品牌问题后,AI 会补充品牌摘要、竞品和标题建议。",
brandFlow: "公司名称可直接输入,也可以从品牌库选择。选择优化关键词后,AI 会补充品牌摘要、竞品和标题建议。",
brandSummaryPlaceholder: "AI 分析后会在这里补充品牌简介、差异点和适合切入的内容角度。",
keywords: "支持直接输入,也支持复用品牌词库里的关键词。AI 分析结果会自动补充到这里。",
brandQuestions: "主问题决定文章主线,补充覆盖问题只用于扩展相关搜索意图。",
brandQuestions: "优化关键词决定文章主线,补充关键词只用于扩展相关搜索意图。",
supplementalQuestions: "最多选择 3 个,用于覆盖相邻搜索问题,避免文章主题发散。",
questionEmpty: "当前品牌还没有可选问题",
selectBrandFirst: "请先选择品牌库对象",
selectBrandFirst: "请先从公司名称下拉选择品牌库对象",
competitors: "竞品支持手动编辑、追加;只有从品牌库选择品牌后,才可以收藏到品牌词库。AI 分析会尽量补齐候选竞品。",
competitorEmptyEditable: "还没有竞品,先手动添加一条或点击分析让 AI 自动补齐。",
templateFields: "这里保留当前模板自己的补充字段,用来约束 AI 生成角度。",
@@ -887,11 +887,11 @@ const zhCN = {
},
placeholders: {
brandLibrary: "从品牌库选择已有品牌",
brandName: "输入品牌名,或在选择品牌后继续微调",
brandName: "输入公司名称,或从品牌库选择",
website: "输入官网地址,选填",
keywords: "输入关键词后回车,可多选",
primaryQuestion: "选择一个品牌主问题",
supplementalQuestions: "可选,最多选择 3 个补充问题",
primaryQuestion: "选择一个优化关键词",
supplementalQuestions: "可选,最多选择 3 个补充关键词",
customTitle: "如需覆盖 AI 标题,可在这里直接输入",
customOutline: "补充一个额外结构,例如“选购建议”",
keyPoints: "告诉 AI 还需要强调哪些要点、风格或限制条件",
@@ -904,9 +904,9 @@ const zhCN = {
promptSealed: "Prompt 已封装",
aiBanner: {
title: "一键智能分析",
defaultDescription: "AI 将基于品牌问题补充品牌简介,并智能提取竞品信息",
productReviewDescription: "AI 将基于品牌问题梳理产品背景,并生成同类替代方案参考",
researchReportDescription: "AI 将基于品牌问题梳理主题背景,并生成参照对象参考",
defaultDescription: "AI 将基于优化关键词补充品牌简介,并智能提取竞品信息",
productReviewDescription: "AI 将基于优化关键词梳理产品背景,并生成同类替代方案参考",
researchReportDescription: "AI 将基于优化关键词梳理主题背景,并生成参照对象参考",
},
assist: {
analyzeTitle: "AI 正在补齐竞品信息,请稍后…",
@@ -916,36 +916,36 @@ const zhCN = {
analyzeStages: {
brand: "品牌信息分析中…",
keywords: "关键词提炼中…",
questions: "品牌问题整理中…",
questions: "关键词库(搜索词)整理中…",
competitors: "竞品与官网信息补充中…",
context: "正在整理品牌与官网上下文…",
refine: "正在合并并筛选竞品列表…",
},
titleStages: {
context: "正在整理当前内容上下文…",
strategy: "正在结合品牌问题和竞品生成标题策略…",
strategyNoCompetitors: "正在结合品牌问题生成标题策略…",
strategy: "正在结合优化关键词和竞品生成标题策略…",
strategyNoCompetitors: "正在结合优化关键词生成标题策略…",
finalize: "正在输出 5 个标题候选…",
},
outlineStages: {
context: "正在整理标题、品牌问题和竞品上下文…",
contextNoCompetitors: "正在整理标题、品牌问题和评测上下文…",
context: "正在整理标题、优化关键词和竞品上下文…",
contextNoCompetitors: "正在整理标题、优化关键词和评测上下文…",
structure: "正在根据已选结构生成文章大纲…",
finalize: "正在输出可编辑的大纲结果…",
},
},
messages: {
requiredField: "请先填写 {field}",
missingBrand: "请先选择品牌库对象或输入品牌名称",
selectBrandBeforeQuestion: "请先从品牌库选择品牌后再选择品牌问题",
missingPrimaryQuestion: "请选择一个品牌主问题",
missingBrand: "请先输入或选择公司名称",
selectBrandBeforeQuestion: "请先从公司名称下拉选择品牌库对象后再选择优化关键词",
missingPrimaryQuestion: "请选择一个优化关键词",
missingTitle: "请先选择或输入文章标题",
missingReviewIntroHook: "请先选择一个评测引言钩子",
missingOutline: "请至少选择一个文章结构段落",
missingGeneratedOutline: "请先生成并确认文章大纲",
customOutlineTooLong: "自定义结构不能超过 {count} 个字",
selectBrandBeforeCompetitors: "请先从品牌库选择品牌后再管理竞品",
selectBrandBeforeFavorite: "请先从品牌库选择品牌后再收藏竞品",
selectBrandBeforeCompetitors: "请先从公司名称下拉选择品牌库对象后再管理竞品",
selectBrandBeforeFavorite: "请先从公司名称下拉选择品牌库对象后再收藏竞品",
missingCompetitorName: "至少需要填写竞品名称后才能收藏",
savedCompetitor: "竞品已收藏到品牌词库",
unsavedCompetitor: "已取消收藏该竞品",
@@ -1213,20 +1213,20 @@ const zhCN = {
},
},
brands: {
eyebrow: "Brand Management",
title: "品牌管理",
description: "通过品牌名称和品牌相关信息维护问题集和竞品资产。",
eyebrow: "Company & Lexicon",
title: "公司和词库",
description: "通过品牌名称和品牌相关信息维护关键词库(搜索词)和竞品资产。",
railTitle: "品牌库",
selectBrand: "选择品牌后即可继续维护问题集。",
selectBrand: "选择品牌后即可继续维护关键词库(搜索词)。",
newBrand: "新建品牌",
editBrand: "编辑品牌",
deleteBrand: "删除品牌",
guide: {
title: "品牌管理说明",
body: "管理品牌、问题集和竞品库,用于后续 AI 平台监测与 GEO 分析。",
body: "管理品牌、关键词库(搜索词)和竞品库,用于后续 AI 平台监测与 GEO 分析。",
},
tabs: {
questions: "问题集",
questions: "关键词库(搜索词)",
competitors: "竞品库",
},
quota: {
@@ -1249,20 +1249,20 @@ const zhCN = {
},
sections: {
keywords: "关键词",
questions: "问题集",
questions: "关键词库(搜索词)",
competitors: "竞品库",
versions: "版本记录",
},
actions: {
addBrand: "添加品牌",
newKeyword: "新建关键词",
newQuestion: "新建问题",
newQuestion: "新建搜索词",
newCompetitor: "新建竞品",
viewVersions: "查看版本",
},
empty: {
brands: "还没有品牌数据,先创建一个品牌。",
questions: "当前品牌下暂无问题。",
questions: "当前品牌下暂无搜索词。",
competitors: "当前品牌下暂无竞品数据。",
brandDescription: "暂无品牌描述",
competitorDescription: "暂无竞品描述",
@@ -1272,7 +1272,7 @@ const zhCN = {
brandWebsite: "公司官网(选填)",
brandDescription: "品牌描述",
keywordName: "关键词名称",
questionText: "问题内容",
questionText: "搜索词内容",
competitorName: "竞品名称",
competitorWebsite: "竞品官网",
competitorDescription: "竞品描述",
@@ -1286,9 +1286,9 @@ const zhCN = {
createKeyword: "关键词已创建",
updateKeyword: "关键词已更新",
deleteKeyword: "关键词已删除",
createQuestion: "问题已创建",
updateQuestion: "问题已更新",
deleteQuestion: "问题已删除",
createQuestion: "搜索词已创建",
updateQuestion: "搜索词已更新",
deleteQuestion: "搜索词已删除",
createCompetitor: "竞品已创建",
updateCompetitor: "竞品已更新",
deleteCompetitor: "竞品已删除",
@@ -1296,21 +1296,21 @@ const zhCN = {
chooseKeyword: "请先选择关键词",
brandLimitReached: "当前套餐最多可绑定 {limit} 个品牌公司",
keywordLimitReached: "当前账号最多可绑定 {limit} 个关键词",
questionLimitReached: "当前账号最多可维护 {limit} 个问题",
questionLimitReached: "当前账号最多可维护 {limit} 个搜索词",
},
questions: {
create: "新建问题",
createSingle: "新增单条问题",
expand: "批量扩展问题",
usage: "问题 {used} / {total}",
create: "新建搜索词",
createSingle: "新增单条搜索词",
expand: "批量扩展搜索词",
usage: "搜索词 {used} / {total}",
remaining: "还可保存 {count} 条",
generate: "生成候选",
emptyCandidates: "还没有候选,先从上方生成或粘贴问题。",
emptyCandidates: "还没有候选,先从上方生成或粘贴搜索词。",
table: {
question: "问题集",
question: "关键词库(搜索词)",
},
modal: {
title: "新建问题",
title: "新建搜索词",
currentBrand: "当前品牌",
methods: {
single: "单条新增",
@@ -1320,17 +1320,17 @@ const zhCN = {
},
preview: "候选预览",
summary: "共 {total} 条候选 · 已选择 {selected} 条 · 过短 {tooShort} 条 · 重复 {duplicate} 条",
save: "保存问题 ({count})",
save: "保存搜索词 ({count})",
},
combination: {
region: "1.地域词",
prefix: "2.前缀词",
core: "3.核心词(必填)",
core: "3.精准词(必填)",
industry: "4.行业词(必填)",
suffix: "5.后缀词",
defaultWord: "默认词",
estimate: "预计生成 {count} 条候选",
coreRequired: "核心不能为空",
coreRequired: "精准词不能为空",
industryRequired: "行业不能为空",
},
aiFill: {
@@ -1341,24 +1341,24 @@ const zhCN = {
waitingStages: {
region: "正在识别所在地域并匹配城市、省会与大区…",
generate: "正在分析品牌和高频搜索意图…",
refine: "正在整理可组合的核心词组…",
refine: "正在整理前缀词、精准词、行业词和后缀词…",
},
},
ai: {
note: "AI 扩展会消耗 1 个 AI 点;生成失败时系统会自动退还。",
seedTopic: "扩展主题",
seedTopicPlaceholder: "输入主题后按回车,可添加多个",
seedTopicHint: "支持回车、逗号或分号分隔多个主题;系统会逐个扩展并自动合并去重。",
seedTopic: "用户搜索词",
seedTopicPlaceholder: "输入搜索词后按回车,可添加多个",
seedTopicHint: "按用户搜索词扩展强商业属性候选;公司名称是目标达成词,不是候选搜索词。",
generate: "AI 生成候选",
waitingTitle: "AI 正在生成候选问题,请稍后…",
waitingTitle: "AI 正在生成候选搜索词,请稍后…",
waitingStages: {
context: "正在整理品牌与主题上下文…",
generate: "正在生成高意图候选问题…",
refine: "正在去重并筛选可保存问题…",
context: "正在整理用户搜索词和目标达成词…",
generate: "正在生成适合推荐企业的强商业候选搜索词…",
refine: "正在去重并筛选可保存搜索词…",
},
},
batch: {
label: "每行一个问题",
label: "每行一个搜索词",
},
badges: {
duplicate: "重复",
@@ -1366,20 +1366,20 @@ const zhCN = {
},
messages: {
partialSaved: "已保存 {created} 条,跳过 {skipped} 条",
limitReached: "当前账号最多可维护 {limit} 个问题,所有品牌共用该额度",
selectionLimitReached: "当前套餐最多可维护 {limit} 个问题,已达到可选上限",
limitReached: "当前账号最多可维护 {limit} 个搜索词,所有品牌共用该额度",
selectionLimitReached: "当前套餐最多可维护 {limit} 个搜索词,已达到可选上限",
truncated: "候选超过上限,已截断为 500 条。",
cacheHit: "已使用最近一次 AI 扩展结果。",
aiCharged: "本次 AI 扩展已消耗 {count} 个 AI 点。",
},
errors: {
emptyInput: "请先输入问题内容",
emptyInput: "请先输入搜索词内容",
noSelection: "请至少选择 1 条候选",
noValidQuestions: "没有可保存的问题,请调整候选后重试",
noValidQuestions: "没有可保存的搜索词,请调整候选后重试",
},
page: {
title: "新建问题",
subtitle: "按向导生成候选,确认后一次性保存到当前品牌的问题集。",
title: "新建搜索词",
subtitle: "按向导生成候选,确认后一次性保存到当前品牌的关键词库(搜索词)。",
steps: {
configure: "配置生成方式",
preview: "确认候选",
@@ -1387,12 +1387,12 @@ const zhCN = {
methodTitle: "选择创建方式",
methodHint: "候选保存前都是临时内容,你可以先生成、再筛选和编辑。",
methods: {
combination: "按图示词列批量拓展问题候选。",
ai: "让 AI 围绕主题生成问题候选。",
batch: "从表格或文档中批量粘贴问题。",
combination: "按图示词列批量拓展搜索词候选。",
ai: "让 AI 围绕用户搜索词生成候选,不把公司名称写进候选。",
batch: "从表格或文档中批量粘贴搜索词。",
},
expansionHint: "每行一个词;空列会按默认词跳过,核心词和行业词必填。",
batchHint: "每行一个问题,保存前可以逐条编辑和勾选。",
expansionHint: "前缀词填商业修饰,如性价比高的、口碑好的;精准词填具体需求,如精装、100平;行业词填品类,如全屋定制、家具定制;后缀词填哪家好、怎么选。",
batchHint: "每行一个搜索词,保存前可以逐条编辑和勾选。",
},
},
},