AI PLAY玩法更新持续收录
← 回到更新流

2026-09-01 · 原文发布日

用自家文档库回客服邮件

n8n免费模板:手动跑索引分支抓取文档站sitemap、切块后用Gemini嵌入存进n8n数据表;之后带Support标签的Gmail来信会嵌入问题、算余弦相似度找最接近段落,低于阈值直接停,够则由Gemini严格依据检索段落起草回复并二次审核断言,通过才建草稿,缺口发Slack并记录待补文档。

原文要点

原模板两条分支:手动索引分支抓文档站sitemap,兼容sitemapindex与扁平sitemap,下载页面、抽取正文、重叠切块,用Google Generative Language即Gemini embeddings批量嵌入,向量归一化后把text、url、title、vector、run_id upsert进n8n Data Table并删除旧run;回答分支每几分钟查Gmail指定Support标签未读信,剔除引用历史,嵌入问题,从docs_index取向量算余弦相似度,最佳分低于min_score就停。覆盖足够时由Gemini严格据段落起草JSON回复,再做一次断言审核,通过才在原线程建Gmail草稿并记support_questions为answered,否则发Slack缺口并记not covered或unsupported。设置含x-goog-api-key、Gemini聊天凭据、Gmail与Slack、两张Data Table、min_score等参数。

这次做成什么

做一个“先索引、后答题、不过线不硬答”的客服草稿练习:用Gemini嵌入把文档段落放进n8n Data Table,Gmail Support标签来信触发检索,余弦相似度达阈值才起草,二次审核通过才建草稿;不达标发Slack并登记缺口。本站给独立建表、阈值与合成问题示例,不冒充原工作流。

准备什么

  • n8n实例可用Manual Trigger、Schedule或Gmail Trigger与Code节点
  • Google AI Studio或Gemini API key,按原文以x-goog-api-key头用于嵌入请求
  • n8n内可配置Google Gemini聊天模型凭据,用于起草与审核
  • Gmail OAuth2凭据、测试标签Support和隔离测试邮箱
  • Slack OAuth2凭据与测试频道,例如#support-gaps
  • 两张n8n Data Table:docs_index与support_questions,列名按下文创建
  • 一个可公开访问的练习sitemap或几页静态文档,不用生产客户数据

具体怎么做

  1. 建两张Data Table

    在n8n Data Tables新建docs_index,列设为chunk_key文本、url文本、title文本、text文本、vec数组或JSON文本、run_id文本;再建support_questions,列设为asked_on日期时间、question文本、status文本、best_score数字、note文本。chunk_key用url加序号,run_id用本次索引时间戳,便于删除旧版本。

  2. 跑一次手动索引分支

    用Manual Trigger接Indexing Settings,填练习sitemap URL、URL包含过滤、page cap、chunk size、embedding dimensions。HTTP节点取sitemap,若为sitemapindex先展开子sitemap;逐页下载后抽取正文,按重叠窗口切块;批量调Gemini embeddings,响应向量做L2归一化,再upsert到docs_index,最后删除run_id不等于本次的旧行。先跑3页以内确认vec维度一致。

  3. 配置Gmail触发与低分停止

    启用Gmail Trigger,轮询几分钟一次,条件为Unread且标签Support。Code节点剥离引用历史得到question_clean;用同一Gemini嵌入接口嵌入问题;读取docs_index全部或按run_id最新行,在Code中计算dot product即余弦相似度,取top passages。Answer Settings设min_score,例如练习用0.72;best_score低于阈值就写support_questions status=not_covered并停止,不发Slack草稿。

  4. 起草、审核、草稿或升级

    达到阈值时,Gemini聊天节点用系统提示词强制“只能使用检索段落,不知道就输出insufficient”。要求返回JSON含draft_body、claims、citations。第二个Gemini审核节点逐条核对claims是否被citations支持,输出audit_pass布尔与unsupported_claims。audit_pass为true才用Gmail节点在原thread创建Draft并记answered;false则Slack发缺口报告并记unsupported。

可直接复制的材料

客服回邮起草与审核提示词(本站练习版)

本站独立编写;模型名、字段和阈值需在n8n节点与原模板核对,非原工作流文件。

起草系统提示词:你是客服草稿撰写员。只能使用给定retrieved_passages中的事实,禁止加入价格、日期、承诺或段落没有的步骤。输出JSON,不要Markdown:{"draft_body":"中文礼貌回复,120至260字,含一句如需进一步排查请回复本邮件","claims":["回复中的事实断言"],"citations":[{"claim":"对应断言","url":"来自passage.url","quote":"来自passage.text的连续短句"}],"insufficient":false}。若段落不足以回答,设insufficient=true且draft_body为空字符串。审核系统提示词:你是事实核对员。输入draft JSON与相同retrieved_passages。对claims逐条判断是否有citations.quote直接支持;任何价格、期限、兼容性或操作步骤无引用即失败。只输出{"audit_pass":true或false,"unsupported_claims":["未支持断言原文"],"reason":"不超过80字"}。

Data Table与检索阈值练习配置

可照建列与设置;embedding_dimensions必须和实际嵌入响应一致,0.72只是本站练习阈值。

{"docs_index":{"columns":{"chunk_key":"text","url":"text","title":"text","text":"text","vec":"json","run_id":"text"},"delete_rule":"delete where run_id != current_run_id"},"support_questions":{"columns":{"asked_on":"datetime","question":"text","status":"text","best_score":"number","note":"text"}},"indexing_settings":{"sitemap_url":"https://docs.example.test/sitemap.xml","url_filter":"/guide/","page_cap":5,"chunk_size_chars":700,"overlap_chars":120,"embedding_dimensions":768},"answer_settings":{"gmail_label":"Support","min_score":0.72,"top_k":5,"slack_channel":"#support-gaps","status_values":["answered","not_covered","unsupported"]}}

练习文档段落合成CSV

合成练习数据,三行对应三个chunk_key;不要把真实客户文档或密钥放进测试表。

chunk_key,url,title,text
faq-1,https://docs.example.test/guide/password,密码重置,在工作台右上角选择账户设置,再点安全页,选择发送重置邮件;邮件链接30分钟内有效。
faq-2,https://docs.example.test/guide/billing,发票抬头,发票抬头可在账单页修改,当月已开具发票不追溯重开。
faq-3,https://docs.example.test/guide/api-limit,调用限额,练习套餐每分钟60次请求,超过后返回429,应指数退避重试。

输入与输出示例

本站虚构演示,相似度0.81与0.61是练习设定,非真实Gemini返回,也未创建真实Gmail草稿或Slack消息。

输入

Gmail Support标签合成来信,主题“重置链接打不开”,正文剔除引用后为question_clean:“我按账户设置里的安全页操作,但重置邮件链接提示过期,下一步还能怎么处理?”同一轮docs_index只有上方三行,min_score=0.72。

对应输出

检索最佳段落为faq-1,best_score示意0.81,超过0.72;起草JSON可含claims:["重置邮件链接30分钟内有效","应在账户设置的安全页重新发送重置邮件"], citations指向faq-1.quote“邮件链接30分钟内有效”;审核返回{"audit_pass":true,"unsupported_claims":[],"reason":"两条断言均有quote支持"},于是原线程建Gmail草稿,support_questions写status=answered、best_score=0.81。若best_score=0.61,则不建草稿,记not_covered。

做完检查这些

  • docs_index每行都有chunk_key、url、title、text、vec和run_id六列
  • 同一page_cap下重复索引后,旧run_id行被删除且不残留混维度向量
  • Gmail触发只读取Support标签未读信,剥离引用后question_clean非空
  • best_score低于min_score时流程停止,support_questions记not_covered
  • 审核audit_pass为true才在原线程建Gmail草稿并记answered
  • 出现unsupported_claims时发Slack缺口并把状态记为unsupported

容易卡住的地方

  • 嵌入请求按原文用x-goog-api-key头,聊天模型另用Gemini凭据,两者别混填
  • vec维度一旦更换模型或dimensions参数,必须整表重建索引再回答
  • sitemap可能是sitemapindex,先展开子索引再收集页面,否则漏文档
  • min_score没有通用保证值,先用合成问题回归再逐步调整,不承诺命中
  • 低分停止不是错误,是防止无依据回复;不要把低分也强行送起草
  • Gmail草稿仍需人工查看后再发,模板描述是建草稿而非自动发送
  • Slack频道先用测试频道,避免把缺口报告打进生产客服频道

原文与作者资料 ↗

本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。

原文标题
Answer Gmail support emails from your docs with Gemini and Slack
原作者
Daniel Shashko
原始发布日期
2026-08-31T17:00:44.062Z
来源
https://n8n.io/workflows/18950