|
|
@@ -3,147 +3,74 @@ const path = require('path');
|
|
|
|
|
|
const DEFAULT_VOC_ISSUES = [
|
|
|
{
|
|
|
- issue: '第一次来怕踩雷',
|
|
|
- insight: '用户不是不想来,而是不知道怎么点才稳。',
|
|
|
- title: '第一次来我们店,照这个顺序点不容易踩雷',
|
|
|
- hook: '第一次来别一上来就乱点,这 3 个菜最稳。',
|
|
|
- script: '第一次来我们店,如果你怕点多了浪费、点错了踩雷,可以先按这个顺序来。第一道点招牌菜,先判断口味是不是你喜欢的;第二道点一个下饭菜,适合两三个人一起分;第三道再点一个清爽解腻的。这样人均更稳,也更容易吃出这家店的特色。',
|
|
|
- shots: ['菜单特写', '招牌菜出餐', '老板解释点单顺序', '顾客桌面组合'],
|
|
|
- commentPrompt: '第一次来你最怕点错什么?评论区告诉我,我帮你搭配。',
|
|
|
- metric: '评论里“怎么点/第一次来/套餐/人均”的提问是否增加'
|
|
|
+ issue: '第一次了解怕踩雷',
|
|
|
+ insight: '用户不是不想选,而是不知道怎么判断才稳。',
|
|
|
+ title: '第一次了解我们,按这个顺序看不容易踩雷',
|
|
|
+ hook: '第一次接触别急着下决定,先看这 3 点最稳。',
|
|
|
+ script: '第一次了解我们,如果你怕选错、怕花冤枉钱,可以先按这个顺序判断。第一步先看核心产品或服务能不能解决你最关心的问题;第二步看真实用户的反馈和案例;第三步再对比价格和适配度。这样你不是盲选,而是在判断到底值不值。',
|
|
|
+ shots: ['产品/服务全貌', '核心卖点特写', '真实案例展示', '用户使用场景'],
|
|
|
+ commentPrompt: '第一次了解你最担心什么?评论区告诉我,我帮你判断。',
|
|
|
+ metric: '评论里“怎么选/第一次/适不适合/怎么对比”的提问是否增加'
|
|
|
},
|
|
|
{
|
|
|
- issue: '觉得人均贵',
|
|
|
- insight: '用户真正想知道的是贵在哪里、值不值、怎么点更划算。',
|
|
|
- title: '为什么这顿饭人均不算低,但很多老客还会再来',
|
|
|
- hook: '如果你只看人均,会觉得我们不便宜,但这几个地方才是成本。',
|
|
|
- script: '很多顾客第一次看人均会犹豫,所以今天直接讲清楚。我们贵的地方不是装修噱头,而是这几类食材、这道招牌菜的处理时间,还有高峰期也要保持稳定出品。第一次来不建议乱点,可以先按两人/四人套餐吃,既能吃到招牌,也不会一下子超预算。',
|
|
|
- shots: ['食材近景', '后厨处理过程', '招牌菜上桌', '套餐组合价格牌'],
|
|
|
- commentPrompt: '想看两人不踩雷点单,还是四人聚餐点单?',
|
|
|
- metric: '评论里“贵/值不值”下降,“套餐/怎么点”上升'
|
|
|
+ issue: '觉得价格贵',
|
|
|
+ insight: '用户真正想知道的是贵在哪里、值不值、怎么选更划算。',
|
|
|
+ title: '为什么我们不是最便宜的,但很多老用户还会复购',
|
|
|
+ hook: '如果你只看价格,会觉得我们不便宜,但这几个地方才是成本。',
|
|
|
+ script: '很多用户第一次看价格会犹豫,所以今天直接讲清楚。我们贵的地方不是噱头,而是这几项投入、这套服务的稳定性,还有长期使用的保障。第一次不建议盲选,可以先从入门方案开始,既能体验核心价值,也不会一下子超预算。',
|
|
|
+ shots: ['成本构成展示', '服务/工艺过程', '前后效果对比', '不同方案价格说明'],
|
|
|
+ commentPrompt: '想看入门方案怎么选,还是进阶方案怎么搭配?',
|
|
|
+ metric: '评论里“贵/值不值”下降,“方案/怎么选”上升'
|
|
|
},
|
|
|
{
|
|
|
- issue: '怕排队久',
|
|
|
- insight: '排队问题可以转成预期管理和到店攻略。',
|
|
|
- title: '不想排太久,建议你这几个时间来',
|
|
|
- hook: '想吃但怕排队,先记住这 3 个时间点。',
|
|
|
- script: '我们高峰期确实会排队,但不是任何时间都要等。一般来说,工作日早点来更舒服,周末建议避开正餐最高峰。如果你已经在路上,可以先看评论区置顶的等位提示,或者提前想好要点的招牌菜,到店后更快决定。',
|
|
|
- shots: ['门口等位情况', '非高峰空桌', '等位提示牌', '招牌菜快剪'],
|
|
|
- commentPrompt: '你更想知道排队时间,还是想先看点单攻略?',
|
|
|
- metric: '评论里“几点去/要等多久”的咨询是否变成可引导问题'
|
|
|
+ issue: '担心买了不适合自己',
|
|
|
+ insight: '适配焦虑要用“适合谁、不适合谁”来降低。',
|
|
|
+ title: '这个适合谁、不适合谁,我直接说清楚',
|
|
|
+ hook: '先说不适合什么人,再说适合什么人。',
|
|
|
+ script: '我们不想只讲好的一面,所以今天直接说清楚。我们适合这类需求、这种预算、这种使用场景的人;如果你的情况是另外几种,可能要先看看其他选择。讲清楚不适合谁,反而能减少你拿到手之后的落差。',
|
|
|
+ shots: ['不同人群标签', '适配场景对比', '真实使用反馈', '正面说明'],
|
|
|
+ commentPrompt: '你的需求和预算大概是什么?我帮你判断适不适合。',
|
|
|
+ metric: '评论里“适不适合/像我这种/能不能用”的互动是否增加'
|
|
|
},
|
|
|
{
|
|
|
- issue: '不知道招牌菜是什么',
|
|
|
- insight: '招牌菜要从“老板推荐”变成“不同人群怎么选”。',
|
|
|
- title: '第一次来,老板不建议你把所有招牌都点一遍',
|
|
|
- hook: '招牌菜不是越多越好,第一次来先点这几个就够。',
|
|
|
- script: '很多人第一次来会问哪个最招牌。我的建议是不要一次点太多,先按口味选。如果你喜欢重口味,先点这一道;如果带孩子或者长辈,先点更稳的这一道;如果是朋友聚餐,再加一个适合分享的菜。招牌不是让你多花钱,而是帮你少踩雷。',
|
|
|
- shots: ['三道菜并排', '不同人群标签', '老板手指菜单', '夹菜试吃'],
|
|
|
- commentPrompt: '你是重口味、带家人,还是朋友聚餐?我给你推荐点法。',
|
|
|
- metric: '评论里“招牌/推荐/带孩子/聚餐”的提问是否增加'
|
|
|
+ issue: '不知道核心差异是什么',
|
|
|
+ insight: '卖点要从“我们很好”讲到“为什么和别人不一样”。',
|
|
|
+ title: '别人也在做,我们到底不一样在哪',
|
|
|
+ hook: '不是所有卖点都重要,但这一个差异值得你了解。',
|
|
|
+ script: '很多同行都说自己好,但用户真正想知道的是差异在哪。我们最核心的不是参数堆叠,而是这个做法、这套体验和这类长期结果。第一次了解,你可以不用全看完,但一定要看这一点,因为它最能代表我们想做的事。',
|
|
|
+ shots: ['核心差异演示', '关键细节特写', '用户真实反应', '对比说明'],
|
|
|
+ commentPrompt: '你选这类产品或服务时,最看重哪个点?',
|
|
|
+ metric: '收藏、转发、评论里“想了解/值得/怎么联系”的信号是否增加'
|
|
|
},
|
|
|
{
|
|
|
- issue: '担心服务忙不过来',
|
|
|
- insight: '服务焦虑要用流程透明和高峰期提醒来降低。',
|
|
|
- title: '高峰期来吃饭,先知道这几个小提醒',
|
|
|
- hook: '我们忙的时候,最怕顾客不知道该找谁。',
|
|
|
- script: '高峰期服务压力确实更大,所以我们把几个常见问题提前说清楚。加菜、催菜、打包、开发票分别找哪里,桌上也会放提示。你来吃饭不用猜流程,遇到问题直接按提示找对应的人,我们也会持续优化高峰期响应。',
|
|
|
- shots: ['桌面提示牌', '服务员动线', '加菜流程', '收银台/打包区'],
|
|
|
- commentPrompt: '你最在意上菜速度、服务响应,还是环境卫生?',
|
|
|
- metric: '评论里“没人理/服务慢”下降,“流程/提示”正向反馈增加'
|
|
|
+ issue: '担心售后服务跟不上',
|
|
|
+ insight: '服务焦虑要用流程透明和响应承诺来降低。',
|
|
|
+ title: '买之前先知道:出问题找谁、多久响应',
|
|
|
+ hook: '我们最怕的是你遇到问题不知道该找谁。',
|
|
|
+ script: '售后和服务是很多人下单前最担心的,所以我们把流程提前说清楚。咨询、售后、退换、维护分别走哪个入口,多久能响应,都有明确说明。你不用猜流程,遇到问题直接按指引找对应的人,我们也会持续优化响应速度。',
|
|
|
+ shots: ['服务流程图', '响应承诺说明', '售后入口', '真实处理记录'],
|
|
|
+ commentPrompt: '你最在意响应速度、解决能力,还是后续保障?',
|
|
|
+ metric: '评论里“没人管/服务慢”下降,“流程/保障”正向反馈增加'
|
|
|
},
|
|
|
{
|
|
|
- issue: '内容看着种草,到店怕落差',
|
|
|
+ issue: '内容看着种草,实际怕落差',
|
|
|
insight: '内容要降低夸张表达,主动讲适合谁、不适合谁。',
|
|
|
- title: '这家店适合谁,不适合谁,老板直接说清楚',
|
|
|
- hook: '先说缺点,再说适合什么人来。',
|
|
|
- script: '我们不想只拍滤镜很好看的视频,所以今天直接说清楚。我们适合喜欢这种口味、愿意接受高峰等位、想吃本地特色的人;如果你只想安安静静坐很久,或者完全不能吃辣,可能要提前避开某些菜。讲清楚不适合谁,反而能减少到店落差。',
|
|
|
- shots: ['真实门店环境', '无滤镜菜品', '高峰现场', '老板正面说明'],
|
|
|
- commentPrompt: '你来之前最想先知道优点还是缺点?',
|
|
|
+ title: '不想只拍好看的,今天把真实情况说清楚',
|
|
|
+ hook: '先说缺点,再说适合什么人。',
|
|
|
+ script: '我们不想只拍滤镜很好看的内容,所以今天直接说清楚。我们适合这类需求、愿意接受这些前提的人;如果你期待的是另外几种效果,可能要提前了解清楚。讲清楚真实情况,反而能减少你接触之后的落差。',
|
|
|
+ shots: ['真实场景', '无滤镜实拍', '真实使用过程', '正面说明'],
|
|
|
+ commentPrompt: '你接触之前最想先知道优点还是缺点?',
|
|
|
metric: '评论里“真实/避坑/适合谁”的互动是否增加'
|
|
|
},
|
|
|
{
|
|
|
- issue: '不知道为什么值得专门来',
|
|
|
- insight: '门店内容要把特色从“好吃”讲到“为什么值得来”。',
|
|
|
- title: '如果你只来一次,建议把这顿饭吃明白',
|
|
|
- hook: '不是所有菜都要点,但这一个理由值得你来一次。',
|
|
|
- script: '很多店都说自己好吃,但顾客真正想知道为什么值得专门来。我们这家店最核心的不是菜名,而是这个做法、这个口味记忆和这类用餐场景。第一次来,你可以不用点满一桌,但一定要试这一道,因为它最能代表我们想做的味道。',
|
|
|
- shots: ['核心菜品制作', '口味细节', '顾客夹菜反应', '门头和桌面氛围'],
|
|
|
- commentPrompt: '你会为了哪种味道专门跑一趟?',
|
|
|
- metric: '收藏、转发、评论里“想去/值得去/地址”的信号是否增加'
|
|
|
- }
|
|
|
-];
|
|
|
-
|
|
|
-const TEA_VOC_ISSUES = [
|
|
|
- {
|
|
|
- issue: '第一次来怎么点最稳',
|
|
|
- insight: '新客不是不想买,而是不知道先点哪一杯最能判断这家店稳不稳。',
|
|
|
- title: '第一次来这家店,照这个顺序点不容易踩雷',
|
|
|
- hook: '第一次来别乱点,先用这 3 步判断值不值。',
|
|
|
- script: '第一次喝一家茶饮,别一上来就冲最复杂的新品。先点一杯招牌基础款,看茶底、奶感和甜度稳不稳;第二杯再选你平时喜欢的方向,比如茶感重、奶感重或者清爽型;第三步才考虑加料和特殊口味。这样你不是盲试,而是在判断这家店到底值不值得复购。',
|
|
|
- shots: ['门头/点单台', '菜单首单推荐区', '三杯不同口味摆拍', '店员指菜单说明'],
|
|
|
- commentPrompt: '第一次来你最怕点错什么?评论区说口味,我帮你选更稳的点法。',
|
|
|
- metric: '评论里“第一次来/怎么点/推荐哪个/踩雷”的提问是否增加'
|
|
|
- },
|
|
|
- {
|
|
|
- issue: '18-22 元贵在哪/值在哪',
|
|
|
- insight: '18-22 元不是绝对贵,关键是用户能不能看见原料、茶底、口味稳定性和适合人群。',
|
|
|
- title: '18-22 元到底贵不贵?先看这 3 个地方',
|
|
|
- hook: '你以为贵的是价格,其实要看这杯值不值。',
|
|
|
- script: '很多人看到 18 到 22 元会先问贵不贵。我的建议是别只看标价,先看三件事:茶底是不是清楚,甜度和口味是不是稳定,配料是不是适合你。如果一杯喝完你觉得茶味、奶感、甜度都在线,而且不会喝完后悔,那它讨论的就不是便宜,而是值不值。',
|
|
|
- shots: ['价格牌特写', '茶底/原料展示', '出杯过程', '成品和口味标签'],
|
|
|
- commentPrompt: '你判断一杯茶饮值不值,最看价格、茶底还是口味稳定?',
|
|
|
- metric: '评论里“贵/值不值”减少,“茶底/口味/适合谁”的讨论增加'
|
|
|
- },
|
|
|
- {
|
|
|
- issue: '券后价和套餐怎么买最划算',
|
|
|
- insight: '用户不怕优惠少,怕看不懂规则、加料后超预算、套餐不适合自己。',
|
|
|
- title: '券后价到底怎么算?新客先看这两行',
|
|
|
- hook: '别只看标价,真正花多少钱在结算页。',
|
|
|
- script: '很多新客不是不想下单,是看不懂券后价。你先看两件事:第一,券后总价到底是多少;第二,加料、规格、配送费会不会让预算变高。第一次来不要只冲最低价,先选规则最清楚、口味最稳的套餐。看懂总价和条件,再判断这杯是不是划算。',
|
|
|
- shots: ['手机点单页', '优惠券/套餐页', '券前券后对比', '结算页总价特写'],
|
|
|
- commentPrompt: '你最想看券后价怎么算,还是套餐怎么点不超预算?',
|
|
|
- metric: '评论里“券后/套餐/多少钱/怎么买”的提问是否增加'
|
|
|
- },
|
|
|
- {
|
|
|
- issue: '茶底/甜度/配料怎么选',
|
|
|
- insight: '茶底、甜度、配料和身体反应已经进入新客决策,不是喝完才考虑。',
|
|
|
- title: '茶底怎么选?下午喝怕睡不着的先看这条',
|
|
|
- hook: '怕踩雷,先别看颜值,先看茶底和甜度。',
|
|
|
- script: '有条评论问得很真实:波霸奶茶用什么茶底,下午喝会不会晚上睡不着。第一次来,先看茶底、甜度和配料。平时不喝浓茶的人,别一上来选茶感特别重的;不爱甜的人,先从低甜度开始;对配料敏感的人,先看清楚加料和奶基底。适合你,才是真的值。',
|
|
|
- shots: ['茶底展示', '甜度选择页', '配料/加料特写', '店员说明适合人群'],
|
|
|
- commentPrompt: '你更关心茶底、甜度、配料表,还是喝完会不会睡不着?',
|
|
|
- metric: '评论里“茶底/甜度/配料/睡不着”的问题数量'
|
|
|
- },
|
|
|
- {
|
|
|
- issue: '哪几款不容易踩雷',
|
|
|
- insight: '避坑内容比单纯推荐更接近新客转化,因为它降低第一次尝试风险。',
|
|
|
- title: '第一次来,先点这几类,不容易踩雷',
|
|
|
- hook: '怕踩雷的,先别追新品,先记住这 3 类。',
|
|
|
- script: '新客最怕的不是贵,是喝完觉得不适合自己。第一次来建议先点三类:基础招牌款,口味大众款,你平时就喝得惯的方向。先用稳的款判断这家店的基本水平,再去试新品和特殊口味。第一次体验稳了,才有下一次复购。',
|
|
|
- shots: ['三款稳定单品', '适合人群标签', '试喝反应', '菜单避坑提示'],
|
|
|
- commentPrompt: '你最怕踩雷的是太甜、太淡、茶味重,还是加料不好吃?',
|
|
|
- metric: '“避坑/踩雷/推荐哪个/哪款稳”类评论和收藏率'
|
|
|
- },
|
|
|
- {
|
|
|
- issue: '外卖到手怎么避免翻车',
|
|
|
- insight: '外卖场景会放大冰化、分层、口感变化,新客第一次外卖体验会影响复购。',
|
|
|
- title: '外卖点茶饮,先看这 3 点,不容易翻车',
|
|
|
- hook: '外卖点错了,到手那一刻就后悔。',
|
|
|
- script: '茶饮外卖最容易翻车的地方,不是只有配送慢。你要看这杯适不适合外卖,冰量会不会影响口感,打包到手会不会分层。第一次点外卖,建议选口感更稳定、打包后变化小的款,不要先点特别依赖现做状态的口味。到手体验稳,才有复购。',
|
|
|
- shots: ['打包流程', '封口和保温细节', '外卖到手状态', '冰量/分层对比'],
|
|
|
- commentPrompt: '你点茶饮外卖最怕冰化、分层,还是口感变淡?',
|
|
|
- metric: '外卖相关评论、“到手/冰化/翻车”关键词变化'
|
|
|
- },
|
|
|
- {
|
|
|
- issue: '买一送一/团购规则怎么讲清楚',
|
|
|
- insight: '低价和买一送一能触发注意,但新客还需要确认规则、口味和有没有坑。',
|
|
|
- title: '买一送一到底怎么算?先看懂规则再下单',
|
|
|
- hook: '看起来很划算,但规则你真的看懂了吗?',
|
|
|
- script: '买一送一、团购、低价新品,确实很容易让人心动。但新客真正关心的是有没有坑。下单前先看三件事:券后到底多少钱,能不能叠加,口味和规格有没有限制。规则讲清楚,顾客才不是因为便宜冲动一次,而是因为第一次体验清楚、放心,愿意再来。',
|
|
|
- shots: ['活动海报', '团购/买一送一点单页', '规则限制特写', '两杯到手展示'],
|
|
|
- commentPrompt: '你最常看不懂的是团购规则、券后价,还是买一送一限制?',
|
|
|
- metric: '“划算/有坑/团购/券后价/怎么买”类评论数量'
|
|
|
+ issue: '不知道为什么值得专门选你',
|
|
|
+ insight: '要把特色从“好”讲到“为什么值得选”。',
|
|
|
+ title: '如果你只选一次,建议把这件事想明白',
|
|
|
+ hook: '不是所有理由都重要,但这一个值得你了解一次。',
|
|
|
+ script: '很多同行都说自己好,但用户真正想知道为什么值得专门选你。我们最核心的不是名头,而是这个方法、这份长期结果和这类真实场景。第一次了解,你可以不用全部记住,但一定要看这一点,因为它最能代表我们的价值。',
|
|
|
+ shots: ['核心价值演示', '长期结果展示', '用户真实反馈', '场景氛围'],
|
|
|
+ commentPrompt: '你会为了哪种结果专门选一家?',
|
|
|
+ metric: '收藏、转发、评论里“想要/值得/怎么联系”的信号是否增加'
|
|
|
}
|
|
|
];
|
|
|
|
|
|
@@ -164,105 +91,29 @@ function collectIssues(input = {}) {
|
|
|
const explicit = splitList(input.issues || input.problems || input.vocIssues || input.contentDirections || input.directions || input.evidence || input.comments);
|
|
|
if (explicit.length) return explicit.slice(0, 12);
|
|
|
const text = String(input.reportText || input.evidenceText || input.context || input.background || '').trim() || readTextIfExists(input.report || input.reportPath);
|
|
|
- const lines = splitList(text).filter(line => /排队|贵|踩雷|服务|招牌|套餐|人均|不好吃|落差|等位|怎么点|券后|团购|买一送一|茶底|甜度|配料|外卖|翻车|值不值|首单|口味/.test(line));
|
|
|
+ const lines = splitList(text).filter(line => /价格|贵|踩雷|服务|售后|怎么选|适合|不适合|落差|案例|对比|值不值|效果|质量|体验|方案|差异|卖点|为什么|预算/.test(line));
|
|
|
return lines.length ? lines.slice(0, 12) : DEFAULT_VOC_ISSUES.map(item => item.issue);
|
|
|
}
|
|
|
|
|
|
-function isTeaScenario(input = {}, issue = '') {
|
|
|
- const text = [
|
|
|
- input.industry,
|
|
|
- input.category,
|
|
|
- input.businessType,
|
|
|
- input.evidenceText,
|
|
|
- input.reportText,
|
|
|
- input.context,
|
|
|
- input.background,
|
|
|
- issue
|
|
|
- ].filter(Boolean).join(' ');
|
|
|
- return /茶饮|奶茶|新茶饮|茶底|甜度|波霸|买一送一|券后|外卖|冰化|配料表/.test(text);
|
|
|
-}
|
|
|
-
|
|
|
-function selectTeaTemplateByIntent(issue) {
|
|
|
- const text = String(issue || '');
|
|
|
- const findByIssue = (pattern) => TEA_VOC_ISSUES.find(item => pattern.test(item.issue));
|
|
|
-
|
|
|
- const intentRules = [
|
|
|
- {
|
|
|
- textPattern: /买一送一|规则|有坑|低价|9\.9|11\.9|21/,
|
|
|
- issuePattern: /买一送一/
|
|
|
- },
|
|
|
- {
|
|
|
- textPattern: /券后|套餐|划算|优惠/,
|
|
|
- issuePattern: /券后价/
|
|
|
- },
|
|
|
- {
|
|
|
- textPattern: /第一次|首单|怎么点|点单/,
|
|
|
- issuePattern: /第一次来/
|
|
|
- },
|
|
|
- {
|
|
|
- textPattern: /18|22|贵|值不值|性价比|价格/,
|
|
|
- issuePattern: /18-22/
|
|
|
- },
|
|
|
- {
|
|
|
- textPattern: /茶底|甜度|配料|睡不着|波霸|成分/,
|
|
|
- issuePattern: /茶底/
|
|
|
- },
|
|
|
- {
|
|
|
- textPattern: /踩雷|避坑|哪几款|稳/,
|
|
|
- issuePattern: /踩雷/
|
|
|
- },
|
|
|
- {
|
|
|
- textPattern: /外卖|到手|冰化|分层|塌口感|翻车/,
|
|
|
- issuePattern: /外卖/
|
|
|
- }
|
|
|
- ];
|
|
|
-
|
|
|
- for (const rule of intentRules) {
|
|
|
- if (rule.textPattern.test(text)) {
|
|
|
- const matched = findByIssue(rule.issuePattern);
|
|
|
- if (matched) return matched;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return null;
|
|
|
-}
|
|
|
-
|
|
|
function inferTemplate(issue, index, input = {}) {
|
|
|
const text = String(issue || '');
|
|
|
- if (isTeaScenario(input, text)) {
|
|
|
- const intentMatched = selectTeaTemplateByIntent(text);
|
|
|
- if (intentMatched) return intentMatched;
|
|
|
-
|
|
|
- const teaMatched = TEA_VOC_ISSUES.find(item =>
|
|
|
- text.includes(item.issue) ||
|
|
|
- item.issue.includes(text) ||
|
|
|
- (/第一次|首单|怎么点|点单/.test(text) && item.issue.includes('第一次来')) ||
|
|
|
- (/18|22|贵|值不值|性价比|价格/.test(text) && item.issue.includes('18-22')) ||
|
|
|
- (/买一送一|规则|有坑|低价|9\.9|11\.9|21/.test(text) && item.issue.includes('买一送一')) ||
|
|
|
- (/券后|套餐|划算|优惠/.test(text) && item.issue.includes('券后价')) ||
|
|
|
- (/茶底|甜度|配料|睡不着|波霸|成分/.test(text) && item.issue.includes('茶底')) ||
|
|
|
- (/踩雷|避坑|哪几款|稳/.test(text) && item.issue.includes('踩雷')) ||
|
|
|
- (/外卖|到手|冰化|分层|塌口感|翻车/.test(text) && item.issue.includes('外卖'))
|
|
|
- );
|
|
|
- return teaMatched || TEA_VOC_ISSUES[index % TEA_VOC_ISSUES.length];
|
|
|
- }
|
|
|
const matched = DEFAULT_VOC_ISSUES.find(item =>
|
|
|
text.includes(item.issue) ||
|
|
|
- text.includes(item.issue.replace('第一次来', '')) ||
|
|
|
item.issue.includes(text) ||
|
|
|
- (/排队|等位|等待/.test(text) && item.issue.includes('排队')) ||
|
|
|
- (/贵|人均|性价比|值不值/.test(text) && item.issue.includes('人均')) ||
|
|
|
- (/踩雷|怎么点|点单/.test(text) && item.issue.includes('踩雷')) ||
|
|
|
- (/招牌|推荐菜|特色菜/.test(text) && item.issue.includes('招牌')) ||
|
|
|
- (/服务|没人理|态度/.test(text) && item.issue.includes('服务')) ||
|
|
|
- (/落差|网红|滤镜|种草/.test(text) && item.issue.includes('落差'))
|
|
|
+ (/踩雷|第一次|怎么选|不会选/.test(text) && item.issue.includes('踩雷')) ||
|
|
|
+ (/贵|价格|性价比|值不值|预算/.test(text) && item.issue.includes('价格')) ||
|
|
|
+ (/适合|不适合|适配/.test(text) && item.issue.includes('适合')) ||
|
|
|
+ (/差异|卖点|特色|不一样|区别/.test(text) && item.issue.includes('差异')) ||
|
|
|
+ (/服务|售后|没人管|响应|态度/.test(text) && item.issue.includes('服务')) ||
|
|
|
+ (/落差|种草|滤镜|网红/.test(text) && item.issue.includes('落差')) ||
|
|
|
+ (/为什么|值得|理由/.test(text) && item.issue.includes('值得'))
|
|
|
);
|
|
|
return matched || DEFAULT_VOC_ISSUES[index % DEFAULT_VOC_ISSUES.length];
|
|
|
}
|
|
|
|
|
|
function buildContentPlan(input = {}) {
|
|
|
- const brand = String(input.project || input.brand || input.store || '你的门店').trim();
|
|
|
- const industry = String(input.industry || input.category || '本地生活餐饮').trim();
|
|
|
+ const brand = String(input.project || input.brand || input.store || '你的品牌').trim();
|
|
|
+ const industry = String(input.industry || input.category || '通用行业').trim();
|
|
|
const platform = String(input.platform || '抖音/小红书').trim();
|
|
|
const days = Math.max(1, Math.min(Number(input.days || 7), 15));
|
|
|
const issues = collectIssues(input);
|
|
|
@@ -275,9 +126,7 @@ function buildContentPlan(input = {}) {
|
|
|
insight: template.insight,
|
|
|
title: template.title,
|
|
|
hook: template.hook,
|
|
|
- script: isTeaScenario(input, sourceIssue)
|
|
|
- ? template.script
|
|
|
- : template.script.replace(/我们店/g, brand === '你的门店' ? '我们店' : brand),
|
|
|
+ script: template.script,
|
|
|
shots: template.shots,
|
|
|
commentPrompt: template.commentPrompt,
|
|
|
validationMetric: template.metric,
|
|
|
@@ -294,7 +143,7 @@ function buildContentPlan(input = {}) {
|
|
|
'- 每条都包含前 3 秒钩子、口播脚本、镜头建议、评论区引导和验证指标。',
|
|
|
'',
|
|
|
'## 业务口径',
|
|
|
- `- 品牌/门店:${brand}`,
|
|
|
+ `- 品牌:${brand}`,
|
|
|
`- 行业/品类:${industry}`,
|
|
|
`- 发布平台:${platform}`,
|
|
|
`- 内容周期:${days} 天`,
|
|
|
@@ -313,9 +162,7 @@ function buildContentPlan(input = {}) {
|
|
|
].join('\n')),
|
|
|
'',
|
|
|
'## 拍摄提醒',
|
|
|
- isTeaScenario(input, issues.join(' '))
|
|
|
- ? '- 先拍真实门店、真实饮品、真实点单/出杯/打包流程,不要只拍滤镜氛围。'
|
|
|
- : '- 先拍真实门店、真实产品、真实服务流程,不要只拍滤镜氛围。',
|
|
|
+ '- 先拍真实场景、真实产品、真实服务流程,不要只拍滤镜氛围。',
|
|
|
'- 每条内容只解决一个用户问题,避免一条视频讲太多。',
|
|
|
'- 发完后把评论里的新问题继续放回 VOC 问题池,下一轮再优化。',
|
|
|
'',
|