2026-10-13 · 原文发布日
每天给客户流失风险打分并生成诊断建议
每天早上从Postgres视图拉取客户关系漂移特征数据,用规则计算风险分数、等级和支持信号,只对超过阈值的中高风险客户再查近期工单和沟通记录,由Gemini经LangChain代理生成结构化诊断、证据和建议动作,并校验AI引用的信号ID必须来自已知规则信号。结果合并后写入drift_assessments表并定紧急程度,可执行的中高风险案例发Slack提醒。前提是你的库里有对应的视图、工单表和评估表。
原文要点
原作者iamvaar的n8n流程每天07:00运行:从Postgres的v_customer_drift_features视图拉客户漂移特征,用规则代码算风险分数、等级和支持信号;只对超过阈值的中高风险客户回查support_tickets和communications表取近期工单与沟通上下文;Gemini经LangChain代理生成结构化诊断、证据和建议动作,并校验AI引用的信号ID必须来自已知规则信号;合并后写入drift_assessments表并定紧急程度和到期日,可执行的中高风险案例发Slack提醒。作者另附YouTube演示视频。
这次做成什么
在已有客户数据的前提下,搭一条每天早上自动给客户流失风险打分、只对高风险客户生成AI诊断并推送到Slack的巡检流程。因原模板未给出提示词与建表细节,本文提供本站独立编写的诊断提示词、评分规则示例和合成测试数据。
准备什么
- 可访问的n8n实例,能配置Postgres、Google Gemini(PaLM)和Slack三类凭据
- 一个Postgres数据库,含v_customer_drift_features视图、support_tickets与communications表
- 用于写结果的drift_assessments表(含分数、等级、诊断、Slack文案等列)
- Google Gemini API密钥,供LangChain聊天模型节点调用
- Slack工作区及一个用于接收告警的频道ID
具体怎么做
准备数据库对象与测试数据
在Postgres建好v_customer_drift_features视图(暴露customer_id、登录频率、工单数、使用时长变化等特征列)、support_tickets、communications和drift_assessments表。先用artifacts中的合成CSV导入几条测试客户,避免直接跑真实生产数据。
定时触发与拉取特征
新建工作流,加Schedule Trigger设每天07:00(也可先手动执行)。接Postgres节点,Execute Query:SELECT * FROM v_customer_drift_features,输出每个客户一行特征。
规则评分与阈值分支
接Code节点编写评分逻辑(见artifacts示例代码):按信号加权算出score,划分low/medium/high等级并产出signal_ids列表。接IF节点,只让score超过阈值(示例设为60)的中高风险客户进入AI分支,低风险直接走合并且不调用AI,控制调用量。
补上下文并生成AI诊断
中高风险分支先接两个Postgres查询,按customer_id取近30天工单和沟通记录,合并进同一item。接LangChain Agent节点挂Google Gemini聊天模型,系统消息用artifacts中的诊断提示词,要求输出含signal_ids引用的严格JSON;之后用Code节点校验返回的每个信号ID都在规则产出的已知ID集合内,不在则丢弃该条证据。
写库与Slack告警
Merge节点合并AI诊断结果与低风险结果,Code节点组装统一记录:分数、等级、诊断、urgency(high→紧急、medium→一般)、due_date和Slack消息文本。Postgres节点INSERT进drift_assessments表。最后IF节点筛出可执行的中高风险案例,接Slack节点Post Message到目标频道。
可直接复制的材料
Gemini漂移诊断提示词(粘贴到LangChain Agent系统消息)
本站独立编写,落实原文'AI引用信号ID必须来自已知规则信号'的校验思路,可直接粘贴。
你是客户成功团队的流失风险分析师。用户会给你一位客户的规则风险评分、触发信号列表(每个信号有唯一ID)以及近30天工单和沟通记录。
请严格输出如下JSON,不要输出任何其他文字:
{"diagnosis": "不超过80字的漂移诊断", "evidence": [{"signal_id": "必须来自输入信号列表的ID", "detail": "该信号对应的证据"}], "recommended_action": "一条具体可执行的下一步动作"}
硬性规则:evidence中的每个signal_id必须逐字来自输入提供的信号ID集合,禁止编造新ID;没有足够证据时evidence可为空数组但要在diagnosis中说明依据不足。规则评分示例代码(Code节点,JavaScript)
本站设计的示例规则与阈值,信号权重和THRESHOLD=60均为参考值,请按业务在原模板核对并调整。
const SIGNALS = {
LOGIN_DROP: { w: 25, desc: '登录频率环比下降超50%' },
TICKET_SPIKE: { w: 20, desc: '近30天工单数翻倍' },
USAGE_DROP: { w: 25, desc: '核心功能使用时长下降超40%' },
NO_REPLY: { w: 15, desc: '超过14天未回复任何沟通' },
NPS_LOW: { w: 15, desc: '最近NPS评分低于6' }
};
const THRESHOLD = 60;
return items.map(item => {
const f = item.json;
const ids = [];
if (f.login_drop_pct > 50) ids.push('LOGIN_DROP');
if (f.tickets_30d >= 2 * f.tickets_prev_30d && f.tickets_30d > 1) ids.push('TICKET_SPIKE');
if (f.usage_drop_pct > 40) ids.push('USAGE_DROP');
if (f.days_since_reply > 14) ids.push('NO_REPLY');
if (f.last_nps != null && f.last_nps < 6) ids.push('NPS_LOW');
const score = ids.reduce((s, id) => s + SIGNALS[id].w, 0);
const level = score >= 80 ? 'high' : score >= THRESHOLD ? 'medium' : 'low';
return { json: { ...f, score, level, signal_ids: ids, send_to_ai: score >= THRESHOLD } };
});合成测试客户数据(导入v_customer_drift_features底层表)
本站虚构合成数据,仅用于隔离测试:C-1001命中5个信号得100分应判high并触发AI诊断,C-1002得0分判low不调用AI,C-1003命中3个信号得65分应判medium并触发AI诊断。
customer_id,customer_name,login_drop_pct,tickets_30d,tickets_prev_30d,usage_drop_pct,days_since_reply,last_nps
C-1001,岚图文创,62,4,1,55,21,4
C-1002,澄迈物流,10,0,0,5,2,9
C-1003,栖云教育,70,3,3,48,20,7drift_assessments写入字段映射示例
本站示例映射,列名需与你实际建的drift_assessments表一致;到期日规则(高风险3天、其余14天)为本站设定参考值。
{
"operation": "insert",
"table": "drift_assessments",
"columns": {
"customer_id": "={{$json.customer_id}}",
"score": "={{$json.score}}",
"level": "={{$json.level}}",
"diagnosis": "={{$json.diagnosis || '规则评分未达AI诊断阈值'}}",
"recommended_action": "={{$json.recommended_action || '继续观察'}}",
"urgency": "={{$json.level === 'high' ? 'urgent' : 'normal'}}",
"due_date": "={{$json.level === 'high' ? new Date(Date.now()+3*86400000).toISOString().slice(0,10) : new Date(Date.now()+14*86400000).toISOString().slice(0,10)}}",
"slack_text": "={{$json.slack_text}}"
}
}输入与输出示例
本站虚构演示,诊断文案为示意而非Gemini实际输出,未真实运行该流程。
输入
导入合成测试数据后手动执行一次:C-1001岚图文创登录降62%、工单4对1、使用降55%、21天未回复、NPS=4;C-1002澄迈物流各项正常。对应输出
C-1001命中5个信号得100分判high,进入AI分支,drift_assessments新增一行:score=100, level=high, urgency=urgent, diagnosis示意“核心使用与互动全面下滑,存在明确流失迹象”,recommended_action示意“48小时内由客户成功经理电话回访并安排产品培训”;Slack频道收到该客户告警。C-1002得0分判low,写库但不调用AI、不发Slack。做完检查这些
- 手动执行一次后,drift_assessments表的行数与视图客户数一致,每个客户恰好一条评估
- 低风险客户(如C-1002)的记录中diagnosis为占位文本,且Gemini节点从未被触发
- AI返回JSON中每个evidence的signal_id都能在规则产出的signal_ids列表中找到,找不到时该证据被剔除
- Slack频道只收到level为medium或high且有建议动作的客户告警,文本含客户名、分数和建议动作
容易卡住的地方
- v_customer_drift_features视图、support_tickets、communications、drift_assessments四个对象缺一即报错,先用合成数据验证再切真实库
- Gemini经LangChain代理调用,凭据需建在LangChain聊天模型节点上而不是普通HTTP节点
- 不校验AI引用的信号ID会让诊断引用不存在的证据,校验节点不能省
- 阈值过低会把大量客户送进AI分支,Gemini调用量与费用随之上升,先用小样本观察分数分布
- 每天07:00是原作者设定的默认值,可按团队作息调整cron
- 模型调用按量计费,免费的是模板本身
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Diagnose customer churn risk from PostgreSQL data with Gemini and Slack alerts
- 原作者
- iamvaar
- 原始发布日期
- 2026-10-13T05:31:41.838Z
- 来源
- https://n8n.io/workflows/20842