17 KiB
海巡獲客計畫:知識圖譜 + 雙軌爬取 + 島民交接
在既有「背景 Job + 島民交接」上,新增 Topic Knowledge Graph(Brave 驅動)與雙維度 Tag(相關 + 近期)+ 雙軌海巡,強化流程 B 的痛點發現、關鍵字精準度與產品-痛點匹配驗證。
北極星
海巡找到的貼文/留言,你的產品是否真的解得了那個問題(可置入、可回覆、可追蹤)。
流程 B 主線:
Brave 知識圖譜擴散(周邊延伸)
→ 衍生雙維度搜尋 tag(相關詞 + 近期求助詞)
→ 使用者手動勾選
→ 每個 tag 雙軌爬 Threads(相關軌 + 近期軌,7d 優先 / 30d 補充)
→ productFitScore 篩選
→ 島民協助撰寫獲客留言
已拍板決策
| 項目 | 決策 |
|---|---|
| 圖譜深度 | 3 層、範圍廣:核心 → 成因/症狀 → 相鄰情境 |
| 進海巡的 tag | 使用者手動勾選(圖譜 UI 多選;島民可 toggle,不預設全選) |
| 近期窗口 | 7 天內為重點;不足時補充至 30 天;超過 30 天排除 |
| Brave 預算 | 中等,每輪知識擴展 10–15 次查詢(不足可 supplemental 1 輪) |
| 痛點 tag 候選 | 圖譜衍生 ≥12 候選,其中痛點/求助類 ≥8 |
| 流程 A | 保留 style-8d 捷徑;matrix + 留言收集疊加於 Phase 2 |
根因診斷(舊系統痛點少、關鍵字不準)
對照舊 Next.js(lib/ai/prompts/research-map-placement.ts、lib/services/scan-tasks.ts、lib/ai/analyze-topic.ts):
| 現象 | 根因 | 新系統對策 |
|---|---|---|
| 痛點只抓到 1–2 個 | Placement 壓 suggestedTags 至 2~4;PLACEMENT_QUERY_MAX = 8 |
圖譜衍生 ≥8 痛點 tag + supplemental 補充迴圈 |
| 關鍵字不夠精準 | AI 憑種子詞推測,無外部知識 | Brave knowledge_expand 建 TKG,節點附 evidence[] |
| 只有「最相關」 | Recency 只是加分,無獨立近期軌 | Tag 層分 relevance / recency;Crawl 層雙軌必跑 |
| 沒有周邊延伸 | Brave 只做 site:threads.net |
knowledge_expand 做領域知識(成因、懷孕、換季…)再衍生 tag |
新後端原則見 AGENTS.md:複製模式,不複製舊業務——移植 Playwright/過濾規則,用 Mongo + Job 重建。
架構總覽
flowchart TB
subgraph input [輸入]
Seed["種子詞"]
ProductBrief["product_brief"]
Persona["人設"]
end
subgraph tkg [知識圖譜]
ExpandJob["expand-graph job"]
BraveK["Brave knowledge_expand"]
TKG["topic_knowledge_graphs"]
end
subgraph derive [Tag衍生]
DeriveFn["deriveSearchTagsFromGraph"]
RelQ["relevanceQueries"]
RecQ["recencyQueries"]
end
subgraph select [使用者選擇]
GraphUI["圖譜 UI 勾選節點/tag"]
end
subgraph scan [海巡]
ScanJob["scan job 每tag雙軌"]
Posts["scan_posts"]
end
subgraph outcome [驗收]
Fit["productFitScore"]
Outreach["outreach + 島民留言"]
end
Seed --> ExpandJob
ProductBrief --> ExpandJob
Persona --> ExpandJob
ExpandJob --> BraveK --> TKG
TKG --> DeriveFn
DeriveFn --> RelQ
DeriveFn --> RecQ
RelQ --> GraphUI
RecQ --> GraphUI
GraphUI --> ScanJob --> Posts --> Fit --> Outreach
Tag 產生完整流水線
Tag 不是 AI 一次吐 2~4 個,而是五段流水線產出:
flowchart LR
S["1 種子詞+brief"] --> A["2 AI核心地圖"]
A --> B["3 Brave knowledge_expand"]
B --> G["4 合成TKG三層"]
G --> D["5 deriveSearchTagsFromGraph"]
D --> R["relevanceQueries"]
D --> C["recencyQueries"]
| 步驟 | 做什麼 | 產出 |
|---|---|---|
| 1 | 讀 seed_query、product_brief、target_audience |
輸入包 |
| 2 | AI 產核心 questions/pillars/exclusions | 研究地圖骨架 |
| 3 | Brave 10–15 次一般網搜(非 threadsOnly) | snippets → 候選節點 |
| 4 | AI 合成 TKG(L0/L1/L2)+ productFitScore + evidence[] |
topic_knowledge_graphs |
| 5 | 每節點壓成 2~8 字真人搜尋詞,分兩套 | derivedTags |
雙維度 Tag(相關 + 近期都要)
每個圖譜節點衍生:
| 維度 | 用途 | 寫法範例 |
|---|---|---|
relevanceQueries |
相關軌:短詞、高命中 | 敏感肌、屏障受損 |
recencyQueries |
近期軌:求助語境 + 時間窗 | 敏感肌 請問、換季泛紅 推薦 |
recencyQueries在 Bravethreads_discover時加after:{7天前日期}(參考舊scan-web-discover.tsbuildPlacementKeywordQueries)- 候選總量:≥12 tag(痛點/求助類 ≥8);使用者勾選後才 crawl
痛點 Tag 保底機制
解決「只抓到一兩個痛點」:
expand-graph 完成 → deriveSearchTagsFromGraph
IF 痛點/求助類 tag 數 < 8:
→ supplemental_round(最多 1 次,Brave +5 查詢)
→ 追加查詢例:{seed} 困擾、{seed} 求助、{L2節點} 請問、{seed} 推薦
→ AI 補節點 + 補 derivedTags
IF 仍 < 8:
→ job 標 warning;UI + 島民提示「可重跑 expand 或手動加種子詞」
| 指標 | 舊系統 | 新系統 |
|---|---|---|
| Placement suggestedTags | 2~4 | 不沿用此上限 |
| 搜尋任務上限 | 8 | 候選 ≥12,實 crawl = 勾選數 |
| 痛點類最低 | 無保證 | ≥8(含 supplemental) |
Topic Knowledge Graph(TKG)
Mongo collection:topic_knowledge_graphs
綁 persona_id + seed_query。
{
"seed": "敏感肌",
"nodes": [
{
"id": "n1",
"label": "敏感肌",
"nodeKind": "pain",
"type": "core",
"layer": 0,
"placementValue": "high",
"productFitScore": 95,
"selectedForScan": false,
"evidence": [],
"derivedTags": {
"relevance": ["敏感肌"],
"recency": ["敏感肌 請問", "敏感肌 推薦"]
}
},
{
"id": "n2",
"label": "懷孕嗅覺敏感",
"nodeKind": "cause",
"type": "cause",
"layer": 2,
"relation": "可能成因",
"placementValue": "medium",
"productFitScore": 40,
"selectedForScan": false,
"evidence": [{ "url": "...", "snippet": "..." }],
"derivedTags": {
"relevance": ["懷孕皮膚癢", "嗅覺敏感"],
"recency": ["懷孕 皮膚 癢 請益"]
}
},
{
"id": "n3",
"label": "屏障修復原理",
"nodeKind": "knowledge",
"type": "mechanism",
"layer": 1,
"productFitScore": 70,
"selectedForScan": false,
"derivedTags": {
"relevance": ["屏障受損"],
"recency": ["屏障受損 怎麼辦"]
}
}
],
"edges": [
{ "from": "n1", "to": "n2", "relation": "可能因" },
{ "from": "n1", "to": "n3", "relation": "機制" }
],
"braveSources": [{ "query": "敏感肌 懷孕 原因", "snippet": "...", "url": "..." }],
"painTagCount": 9,
"generatedAt": 0
}
三層擴散
L0 核心:敏感肌
L1 直接相關:屏障受損、換季泛紅、刺癢
L2 周邊情境:懷孕荷爾蒙、嗅覺敏感、壓力熬夜、換洗臉產品過敏 …
節點語意
| 欄位 | 說明 |
|---|---|
nodeKind |
pain(痛點/求助)、knowledge(科普延伸)、cause、symptom |
placementValue |
建議優先級,不決定是否海巡 |
selectedForScan |
使用者勾選後 true,才進 scan payload |
productFitScore |
依 product_brief:產品解不解得了 |
derivedTags |
relevance + recency 兩套查詢詞 |
evidence[] |
L1/L2 必填(Brave snippet 可追溯) |
knowledge節點:延伸話題/科普靈感,預設不勾選;若 snippet 含求助語境可升級為painknowledge不強制進 placement crawl,除非使用者勾選且productFitScore達標
Brave 雙模式
| 模式 | threadsOnly |
用途 |
|---|---|---|
knowledge_expand |
false |
建 TKG,找成因/周邊/知識 |
threads_discover |
true |
海巡時找 Threads 貼文 |
L0/L1 查詢模板(plan_queries,上限 15/輪)
{seed} 常見原因
{seed} 什麼情況會
{seed} 初期 症狀
{seed} 怎麼改善 困擾
{seed} 求助 推薦
L2 周邊擴散查詢池(從 brief/受眾推導)
{seed} 懷孕 相關
{seed} 壓力 熬夜
{seed} 換產品 過敏
{seed} 與 {受眾場景} 的關係
{L1節點} 原因
{L1節點} 困擾
Brave 回傳 title/snippet/url → AI 萃取節點與邊 → 寫入 TKG。實作:internal/library/knowledge/ + Brave adapter(BRAVE_SEARCH_API_KEY;參考舊 lib/services/web-search.ts)。
完整範例:敏感肌 Walkthrough
輸入
- 種子詞:
敏感肌 - product_brief:溫和修護、無香料、適合敏感/屏障受損肌
Brave knowledge_expand(節錄)
| 查詢 | snippet 線索 | 圖譜節點 |
|---|---|---|
敏感肌 常見原因 |
屏障受損、過度清潔 | L1 symptom 屏障受損 |
敏感肌 懷孕 |
荷爾蒙、嗅覺/皮膚變敏感 | L2 cause 懷孕嗅覺敏感 |
換季 皮膚 泛紅 |
季節性刺激 | L1 symptom 換季泛紅 |
衍生 tag(候選,勾選前不 crawl)
| 節點 | relevanceQuery | recencyQuery | productFit |
|---|---|---|---|
| 敏感肌 | 敏感肌 |
敏感肌 請問 |
95 |
| 屏障受損 | 屏障受損 |
屏障受損 推薦 |
90 |
| 換季泛紅 | 換季泛紅 |
換季泛紅 請問 |
88 |
| 懷孕皮膚癢 | 懷孕皮膚癢 |
懷孕 皮膚 癢 請益 |
視產品而定 |
使用者:勾選 productFit 高的 4 個節點(可不勾懷孕若產品不適用)
startScan:每個勾選節點的 relevance + recency 詞都跑雙軌
| 軌道 | 行為 | 本例預期 |
|---|---|---|
| 相關軌 | sort=relevance, limit≈12 | 高互動痛點貼文 |
| 近期軌 | 7d 優先,不足補 30d | 一週內求助帖 |
合併 → gold / recent / relevant → productFitScore → 獲客台 → 島民 generateOutreachReply + fill
近期窗口
| 窗口 | 天數 | 行為 |
|---|---|---|
| 重點 | 7 天內 | 優先爬取、優先顯示、排序最高 |
| 補充 | 8~30 天 | 7 天內不足時才補,排序較低 |
| 排除 | >30 天 | 不進海巡與獲客清單 |
策略:
- 每個勾選 tag 的近期軌先抓滿 7 天名額
- 全輪痛點貼文不足目標時,自動放寬至 30 天
- 獲客台預設篩「7 天內」,可切「含 30 天內補充」
雙軌海巡(Tag + Crawl + UI 三層對齊)
近期軌不是相關軌的副產品——每個勾選 tag 的 relevance 與 recency 查詢都必跑。
| 層級 | 相關 | 近期 |
|---|---|---|
| Tag | derivedTags.relevance 短詞高命中 |
derivedTags.recency 求助語境 + after 日期 |
| Crawl | 相關軌 sort=relevance, limit≈12 | 近期軌 7d 滿額 → 30d 補 |
| UI | 可篩 priority=relevant |
預設 7d + priority=gold 置頂 |
合併優先級:
- 兩軌皆有 →
gold - 僅近期軌 →
recent - 僅相關軌 →
relevant
過濾:移植 hasPlacementIntent、looksLikeCasualChat(舊 lib/topic-anchor.ts、lib/scan-recency.ts)。
scan_posts 擴充欄位
placement_score、priority(gold/recent/relevant)product_fit_score、solved_by_productposted_at、search_tag、query_dimension(relevance/recency)graph_node_idreplies[](可選,scrape_replies: true)
產品匹配驗收
每篇海巡結果:
productFitScore:痛點 vsproduct_briefsolvedByProduct:獲客留言是否對應產品能力(生成時強制檢查)
獲客台 UI:
- 預設排序:7 天內 + 產品能解決
- 標示:可置入 / 需人工 / 超出產品範圍
- 獲客留言:島民 fill 全文,不自動送出
島民交接
job.result.handoff
{
"handoff": {
"flow": "placement",
"persona_id": "...",
"pain_tag_count": 9,
"summary": "12 候選 tag → 勾選 6 節點 → 38 篇;痛點 10(核心 6 + 周邊 4);7 天內 8 篇",
"pain_breakdown": { "core": 6, "peripheral": 4, "recent_7d": 8 },
"top_peripheral_hits": ["懷孕皮膚癢", "換季泛紅"],
"next_route": "/personas/:id/outreach",
"needs_supplemental_expand": false,
"connection_required": false
}
}
JobMonitor → islanderHandoffStore;buildIslanderContext 注入【近期海巡交接】。
Custom actions
| Action | 用途 |
|---|---|
expandKnowledgeGraph |
觸發 expand-graph;supplemental=true 補充迴圈 |
toggleGraphNode |
勾選/取消節點 |
startScan |
dual_track=true,只爬 selectedForScan 節點 |
generateOutreachReply |
產獲客留言 |
applyDraft |
fill 留言欄位 |
對話路徑(流程 B)
「幫我找敏感肌的痛點」
→ expand-graph(Brave knowledge_expand + AI 合成 TKG)
→ IF pain_tag_count < 8 → 島民:「要再補一輪 Brave 嗎?」→ supplemental_round
→ 研究頁:圖譜 + 雙維度 tag + productFitScore
→ 使用者手動勾選節點
→ startScan(每詞雙軌:相關 + 近期,7d/30d)
→ outreach → highlight gold/recent → generateOutreachReply + fill
Job 模板
| Template | Steps | worker |
|---|---|---|
expand-graph |
plan_queries → brave_knowledge → ai_synth → derive_tags → [supplemental?] → persist_tkg | go |
scan |
session → crawl_dual_track → replies? → store → filter → ai_fit → persist | node + go |
style-8d |
(既有) | node + go |
執行順序:expand-graph → 勾選 tag → scan。
API 草案
POST /api/v1/personas/:id/knowledge-graph/expand # ?supplemental=true
GET /api/v1/personas/:id/knowledge-graph
PATCH /api/v1/personas/:id/knowledge-graph/nodes # selectedForScan
POST /api/v1/personas/:id/scan-jobs # graph_id, selected_node_ids, dual_track
GET /api/v1/personas/:id/scan-posts # recent_7d, product_fit_min, priority
POST /api/v1/personas/:id/outreach-drafts/generate
Internal worker:POST /workers/scan-posts/batch、Brave/AI 內部端點。
前端頁面
| 路徑 | 用途 | 島民 label |
|---|---|---|
/personas/:id/research |
圖譜、雙維度 tag、勾選 | 加入海巡、Brave 再擴展 |
/personas/:id/outreach |
獲客貼文 + 留言 | 獲客留言、標記已處理 |
/personas/:id/matrix |
流程 A(Phase 2) | 草稿內容 |
研究頁每節點展示:relevanceQueries、recencyQueries、productFitScore、勾選框、上次命中數。
實作分期
Phase 0a — 知識圖譜 + Tag 流水線
- Go Brave adapter(
knowledge_expand/threads_discover) expand-graphjob:plan_queries → brave → ai_synth → derive_tagssupplemental_round(痛點 tag < 8)- Mongo
topic_knowledge_graphs(含derivedTags、painTagCount) deriveSearchTagsFromGraph(relevance + recency 雙陣列)- API expand / get / patch nodes
Phase 0b — 島民 handoff
- handoff(含
pain_tag_count、needs_supplemental_expand) - JobMonitor bridge
- custom actions +
ai.islander.system.md海巡專章
Phase 1 — 雙軌 scan + 流程 B
- Node
crawl_dual_track(每 tag 相關+近期,7d/30d) productFitScore+ outreach UI- 驗收:敏感肌 → L2(懷孕等)→ 候選痛點 tag ≥8 → 勾選後貼文痛點 ≥8 → 7d 內 ≥5
Phase 2 — 流程 A
- matrix + 留言收集 + 島民 fill
Phase 3 — 自動化
- job_schedules、Brave 熔斷、Meta API 發留言
風險
| 議題 | 對策 |
|---|---|
| Brave 幻覺 | 節點必須有 evidence[] |
| 圖譜跑題 | exclusions + productFitScore |
| 查詢爆炸 | Brave ≤15/輪;supplemental ≤5;衍生 ≤20;只爬勾選 |
| 醫療敏感 | disclaimer;留言不自動發 |
| 周邊節點產品不符 | 低 productFit 預設不勾;獲客台標 ✗ |