DEEP DIVE · LLM 上下文

知识库与提示词工程

把企业的产品、销售经验、客户画像结构化注入 LLM 上下文 —— 让 AI 像「记得朋友情况的同事」一样回答。

最后更新 2026-05-06数据来源 Supabase · GitHub适用于 技术对接人 / 客户审计

四层上下文模型

把企业的产品、销售经验、客户画像 结构化注入 LLM 上下文, 让 AI 像「记得朋友情况的同事」一样回答。system prompt 由四层有序拼接:PERSONA + STYLE + MEMORY + KNOWLEDGE
knowledge_documents
16
产品/定价/服务/FAQ/话术 5 类
conversation_examples
18
金牌对话 · 5★ top-3 注入
conversations
1418
客户画像覆盖 100%
comments / 高意向
6707 / 1185
实时来自 Supabase · 17.7%

客户 Onboarding · 四类资料

① 业务知识

历史成交对话 ≥ 50 条
品牌产品介绍 1 页
常见问题 FAQ 10-20 条

② 抖音资产

采集账号矩阵 → accounts
竞品 / 合作博主 → source_accounts

③ 承接规则

转人工触发关键词
销售对接微信号 + 二维码
审核负责人

④ 合规边界

红线词 / 禁用词
语气风格偏好
AI 人设定位(公开 or 隐式)

最小启动包:≥ 50 条历史成交对话 · 1 页产品介绍 · ≥ 1 个抖音主账号 · 1 名审核负责人。齐了才开始配账号 + 抓取 —— 不齐则 LLM 只能生成通用话术,意图打分和私信质量都会大幅下降。

知识库双表设计

knowledge_documents

文档型知识:产品 / 定价 / 服务流程 / FAQ / 话术。
字段:org_id · category · title · content · sort_order
embedding vector(1536) 注释行预留,pgvector 启用即接 RAG。

conversation_examples

对话型训练数据:金牌成交对话。
字段:org_id · stage · buyer_message · sales_reply · quality_score
5 ★ 永远在 top-3 · 1-3 ★ 仅当 5 ★ 不足时填位。

为什么不合表?文档与对话两类数据的结构和注入模式根本不同,合并会增加 SELECT 复杂度和 prompt 构造负担。embedding 列两表都已预留,pgvector 上线后取消注释即可,无需改 schema。

注入位置 · 1500 字预算

// src/lib/llm.ts (line 313) const base = ` ${PERSONA}\n\n ${STYLE}\n\n ${MEMORY}\n\n ${nameLine} ${profileLine} ${knowledgeSection} `;
KNOWLEDGE_QUOTA = 1500 字(3000 → 1500 砍半)· 每轮每分类最多 1 条。知识块过大会稀释 PERSONA 语气,输出趋向客服腔。如需更多召回,先上 pgvector 做相关性裁剪而非加大 budget。

金牌对话即训练 · 不需要 fine-tune

buildExampleBlock 按当前对话 stage 拉对应金牌例子,ORDER BY quality_score DESC LIMIT 3,拼成 few-shot 示范注入 system prompt。目前生产库 18 条覆盖 3 个 stage,正在持续扩充。

// stage = nurture · 5★ 成交单复用 user: 我家 130 平想做整屋 assistant: 130 平这个面积刚好够开放式厨房。 预算大概在哪个段?8-12 还是 12-15? user: 预算大概 15 万左右 assistant: 15 万整屋够主材+柜体...

跨会话客户记忆 · memory.ts

(org_id + douyin_user_id) 跨会话 shallow merge customer_profile JSONB,best-effort(DB 错误返回 {} 不抛)。渲染为自然语言句子注入 system prompt。

INPUT · customer_profile

{ "area": 130, "city": "成都", "budget": "15w", "decision_maker": "太太" }

OUTPUT · 注入 prompt 的句子

他家 130 平在成都,预算大概 15 万,太太主导。

1418 / 1418 conversations 客户画像覆盖率 100% —— 跨会话沉淀已开始。扩展画像字段时同步更新 formatCustomerProfile() 的句法,不要回退到 KV 拼接。

反范例 · 为什么不能用「字段:值」?

✗ ANTI-PATTERN · KV 标签

面积:130 城市:成都 预算:15万

→ LLM 进入「档案查询」模式 → 输出客服腔:「您好,根据您的信息我们看到您 130 平 ...」

✓ PATTERN · 自然语言描述

他家 130 平在成都,预算大概 15 万,太太主导。

→ LLM 像「记得朋友情况」融入 → 输出自然:「上次说的 15 万够整屋主材,要不咱看下方案?」

规律:给 LLM 注入的上下文越「人话」,输出越「人话」。record_customer_info 工具直接产出描述句,不是 KV。

PERSONA + STYLE · 从抽象到具体

PERSONA · 5+ 条具体素材

你叫小艾,32 岁,成都人,做全屋 定制这行 8 年。 门店导购出身 · 工厂参观过 自家 89 平刚装完 · 橘猫小四 嘴比同事甜 · 不喜欢报价绕弯

STYLE · 6 条硬底线(30 → 6)

1. 不报具体单价(用区间) 2. 不杜撰门店地址 3. 不主动暴露 AI 身份 4. 不堆 emoji / 方括号表情 5. 不超 70 字硬底 6. 不替客户做决定
负向规则越多 → 模型越像客服。"绝不/严禁" 堆得越多,模型进入 risk-avoidance 模式 —— 取消正常语气,反而更机器。比例参考:负向 ≤ 6 条 · PERSONA 具体素材 ≥ 5 条 · few-shot ≥ 3 组覆盖核心场景。

Prompt 优化七法 · 22 次 commit 沉淀

① 身份充实 > 负向规则

PERSONA 写成真人 · STYLE 30 → 6 条。few-shot 替代规则。

② few-shot 场景必须一致

冷开场 vs 暖场逻辑不同 · 3 archetype 各写一组(价格对比 / 装修焦虑 / 模糊探索)。

③ 上下文用自然语言

KV 标签 → LLM 进档案查询模式。record_customer_info 工具直接产描述句。

④ 结构化输出六层防御

token 预算 / batch 上限 / 1:1 强制 / 多级 parser / raw 日志 / 模型选择。

⑤ 中文 prompt 用「」

外层 JS 字符串 + 内层 ASCII " 会截断。默认全角引号 「」

⑥ 正面替代禁令

只写禁令,模型会换词继续编。必须给出口(如「模糊邀约」「报区间」)。

⑦ 知识 ≤ 1500 字预算

知识块过大稀释 PERSONA 语气 → 输出客服腔。先上 pgvector 做相关性裁剪。

LLM rewrite 双陷阱

方括号表情 [勾引] 漏出 + 杜撰地址(成华区展厅)。prompt 层禁令 + strip_bracket_emojis 后处理兜底。

模型路由 · 各司其职

路径模型用途
CHATqwen/qwen3-235b-a22bchatReply / generateOpener · 人格、风格、记忆全注入
ANALYSISqwen/qwen3-235b-a22banalyzeComments / detectDecisionSignals · 2026-04-27 全切 Qwen3

工程指标(实测):

指标数值
src/lib/llm.ts1124 行
src/lib/memory.ts68 行
LLM 相关 commits52 个
近 3 周迭代22 次
Supabase migrations25 个
analyze cron 配置*/15 * * * * · batch 15 · max_tokens 8192 · budget 270s

路线图 · Next up

pgvector 启用

取消注释 embedding vector(1536)

RAG 检索替代全量注入

按相关性召回 · 替代 1500 字定额预算

金牌对话扩充

18 → 50+ · 用 V3 round 实战成功样本

ice_break prompt 升级

chatReply 切 V3 4 段式 · 用最近 round 实战 few-shot