2026-09-05 · 原文发布日
本地模型驱动的客服代理:三知识库检索加人工升级
自托管取向的客服n8n流程:webhook收工单后先验API密钥、按会话限流、去重并打码常见个人信息,立即返回202再异步处理;Ollama上的LangChain代理带Postgres记忆,依次检索三个Supabase向量知识库,查不到就补Wikipedia,按置信度把答复路由到Slack、Gmail或HTTP回调并写审计日志;低置信或用户点名要人工时建升级队列,工作时间提醒Slack、非工作时间邮件值班。
原文要点
作者Nev的自托管客服n8n模板:webhook收POST工单后校验x-api-key,缺失或错误返回401;Supabase按会话限流超限返回429;空体拒绝、限2000字符、按message_id去重;立即回202后异步处理,打码常见个人信息并识别点名要人工;Ollama上的LangChain代理带Postgres对话记忆,依次检索三个Supabase向量库(documents、additional_documents、reference_documents),未命中补Wikipedia;按置信度把答复路由到Slack、Gmail或HTTP回调并写审计日志;低置信或要人工时建升级队列,工作时间提醒Slack、非工作时间邮件值班,升级量突增也发Slack警告。需替换YOUR_API_KEY等占位符。模型qwen2.5:7b与nomic-embed-text。
这次做成什么
在自托管环境跑通这条客服管线,并用本站设计的三张合成工单验证:正常问题走知识库答复、超限请求被429拦截、点名要人工的工单进入升级队列并按时间路由提醒。
准备什么
- 可联网的自托管n8n实例,且能访问Ollama服务端点
- Ollama已拉取qwen2.5:7b和nomic-embed-text两个模型
- Supabase项目,含五个业务表和三个向量知识库表
- Supabase、Postgres(对话记忆)、Slack、Gmail四套凭据
- 替换YOUR_API_KEY、YOUR_ONCALL_EMAIL、YOUR_N8N_INSTANCE_URL等占位符
- 已嵌入好的知识库文档,否则代理只能走Wikipedia兜底
具体怎么做
准备Ollama模型
在Ollama服务器执行拉取qwen2.5:7b与nomic-embed-text,确认n8n所在机器能访问Ollama端点;前者做代理推理,后者给知识库文档生成向量。
建Supabase表结构
创建support_rate_limits、support_message_ids、support_audit_log、support_kb_gaps、support_escalations五张业务表,再建documents、additional_documents、reference_documents三个向量表并配置embeddings与匹配函数,供Vector Store检索节点使用。
配凭据并替换占位符
在n8n依次添加Supabase、Postgres、Ollama、Slack、Gmail凭据;把模板里的YOUR_API_KEY、YOUR_ONCALL_EMAIL、YOUR_N8N_INSTANCE_URL替换为隔离测试值,设置目标Slack频道ID。
灌入知识库内容
把合成FAQ文档用nomic-embed-text生成向量写入三张知识库表,验证检索节点能按相似度取回内容,避免代理空转。
三类工单演练
用下方测试payload连发三次:正常问题期望202后知识库答复进审计日志;同一会话短时间连发触发429;message带“我要找人工”触发升级队列,并按当前时间走Slack提醒或值班邮件。
可直接复制的材料
Supabase建表参考SQL(本站设计,需对照模板核对)
原文只列了表名未给字段,此SQL为本站按流程需要设计的参考,列名与向量维度请以模板节点实际读取为准再执行。
create table support_rate_limits (session_id text, window_start timestamptz, request_count int default 0);
create table support_message_ids (message_id text primary key, received_at timestamptz default now());
create table support_audit_log (id bigint generated always as identity primary key, session_id text, scrubbed_query text, answer text, sources text, confidence text, created_at timestamptz default now());
create table support_kb_gaps (id bigint generated always as identity primary key, query text, logged_at timestamptz default now());
create table support_escalations (id bigint generated always as identity primary key, session_id text, reason text, status text default 'open', created_at timestamptz default now());
create table documents (id bigint generated always as identity primary key, content text, embedding vector(768));
create table additional_documents (id bigint generated always as identity primary key, content text, embedding vector(768));
create table reference_documents (id bigint generated always as identity primary key, content text, embedding vector(768));客服代理JSON输出提示词(本站独立编写)
本站撰写的输出约束提示词;字段名需与模板解析节点期望的JSON结构核对后使用。
你是客服答复代理。依次检索三个知识库:主文档库、补充文档库、参考文档库;三者都没有相关内容时才查Wikipedia。只用检索到的内容回答,不要编造。最终以纯JSON输出,不要包裹多余文字:{"answer":"给客户的中文答复","confidence":"high或medium或low","sources":["用到的知识库名称或wikipedia"],"human_requested":true或false}。判定规则:知识库直接命中且内容完整为high;部分命中或需拼凑为medium;三库未命中仅靠Wikipedia为low;用户明确说找人工、转人工、要客服电话时human_requested置true,此时answer写一句安抚语,confidence仍可给出。合成测试工单payload
本站虚构数据,邮箱为保留测试域名;请求头需带x-api-key: 你替换后的测试密钥,callback_url留空表示走Slack或Gmail渠道。
{
"message_id": "test-msg-0001",
"session_id": "sess-demo-42",
"channel": "slack",
"customer": {"name": "测试用户甲", "email": "demo-user@example.test"},
"message": "你好,我的发票一直没收到,邮箱是demo-user@example.test,能帮我查一下吗?另外如果查不到我要找人工处理。",
"callback_url": ""
}输入与输出示例
本站虚构演示,未实际运行;提醒文案与字段以模板实际配置为准。
输入
POST /webhook/support 头带x-api-key: test-key-local-01,body用上方payload:message_id为test-msg-0001,内容为发票未收到且说“我要找人工”。对应输出
同步返回202 Accepted。异步处理:邮箱被打码为d***@example.test后送入代理;因payload含“我要找人工”,human_requested为true,流程在support_escalations写入一行(session_id=sess-demo-42, reason=human_requested, status=open);工作时间内Slack频道收到提醒“新升级工单 sess-demo-42:客户要求人工”;support_audit_log同时记录打码后的问题与答复。做完检查这些
- 不带x-api-key或带错密钥的请求被返回401且不进入后续处理
- 同一会话在限流窗口内超额请求返回429并在support_rate_limits留有计数
- 重复发送相同message_id被去重拦截,不会二次进入代理处理
- 正常问题答复后support_audit_log出现含sources与confidence的一行
- 含“找人工”字样的请求在support_escalations生成open状态记录
容易卡住的地方
- Ollama端点从n8n不可达时代理会整体失败,先单独验证网络连通
- 知识库表为空会导致所有问题都走低置信或Wikipedia兜底路径
- 超过2000字符的消息会被直接拒绝,长工单需要提前截断提示
- 非工作时间升级走Gmail值班邮件,未配YOUR_ONCALL_EMAIL会静默丢失提醒
- 占位符YOUR_API_KEY等未替换就上线等于把测试接口暴露在默认密钥下
- qwen2.5:7b为作者指定模型,答复质量与速度取决于本机硬件,别对响应耗时做保证
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Autonomous AI Customer Support Agent with Multi-KB RAG & Human Escalation
- 原作者
- Nev
- 原始发布日期
- 2026-09-04T17:29:38.289Z
- 来源
- https://n8n.io/workflows/19217