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

2026-09-29 · 原文发布日

用n8n做一个Telegram店铺客服机器人

这个免费n8n模板把Telegram机器人变成受限知识的客服:收到消息后先从工作流静态数据里取该会话的历史记录,把你填写的商家名称和逐行知识笔记连同新消息拼进要求JSON输出的提示词,发给Ollama、OpenAI或Anthropic任一模型,只采用模型标记为可回答的回复,答不上或接口报错时改发你预设的兜底话术,最后把双方消息追加进聊天记录。适合想自建低成本客服、又不想机器人乱答的人。

原文要点

这个免费n8n模板把Telegram机器人收信作为触发,先从n8n workflow static data取该chat最近对话,再把Settings节点里的business_name、逐行knowledge、历史和新消息拼成要求JSON输出的提示词,经HTTP请求发给Ollama、OpenAI或Anthropic任一提供方。只有模型返回标记可回答时才采用其reply;不可回答或AI请求报错都发预设cannot_answer_message,最后把客户与机器人消息追加回聊天记录。

这次做成什么

做出一个“只许按笔记回答”的Telegram练习客服:准备一份商家笔记,跑通取历史、拼提示词、解析JSON、失败兜底、写回记录五步;先用手工构造chat_id验证,再接BotFather测试机器人,避免机器人凭常识乱答。

准备什么

  • n8n实例含Telegram Trigger与Telegram发送消息节点,测试阶段可用Manual Trigger代替
  • BotFather创建的测试机器人和token,chat_id用测试会话,不用真实客户群
  • 三选一模型通路:本地Ollama可达且模型已拉取,或OpenAI/Anthropic API key以header凭据配置
  • Settings节点可填business_name、knowledge、cannot_answer_message、ai_provider、ai_model
  • workflow static data可读写,用于保存同一chat_id的最近轮次

具体怎么做

  1. 填写受限知识与兜底话术

    在Settings节点设business_name为虚构店名;knowledge每行只写一条事实,例如营业时间、退换规则、配送范围、客服人工时段;cannot_answer_message写成礼貌转人工;ai_provider先选ollama或openai之一,ai_model填账号真实可用名。知识不要放密钥、内部成本或无法验证承诺。

  2. 构造会话上下文键

    用chat_id作为static data键,值是数组,每项含role(customer|bot)、text、ts。触发后先读取该键,缺省为空数组;只保留最近八轮,避免提示词膨胀。把新消息追加为customer项前先去除多余空白,保留原意,不改写用户问题。

  3. 拼接JSON-only提示词并发HTTP

    把business_name、knowledge逐行、历史数组、新消息放入本页提示词,要求模型只输出answerable布尔与reply字符串。按ai_provider组装HTTP Request:Ollama指向ollama_url,OpenAI或Anthropic在节点上加header认证;不要在本站示例中写死真实端点参数,按所用提供方文档核对。

  4. 只采用可回答回复

    解析HTTP响应为JSON;若解析失败、answerable为false、reply为空或HTTP节点报错,统一改用cannot_answer_message。解析成功才取reply,并在发送前做一次长度截断与禁用承诺词检查,例如不出现“保证退款”“绝对有效”。

  5. 回发并落聊天记录

    Telegram发送节点用同一chat_id回发最终文本;随后把customer新消息与bot最终回复追加进static data数组并裁剪到最近八轮。手工测试时用两条连续消息验证第二轮能引用第一轮,但不得跨chat_id串话。

可直接复制的材料

受限客服JSON-only提示词

本站独立提示词,可复制到HTTP请求体前的构造节点;模型参数需在n8n HTTP节点按提供方核对。

你是{{business_name}}的Telegram客服。只能使用KNOWLEDGE中的逐行事实和HISTORY中的对话回答NEW_MESSAGE;不知道、涉及法律医疗金融建议、索要隐私或超出事实时,answerable必须为false。只输出JSON对象:{"answerable":true|false,"reply":"中文回复,少于120字","used_facts":[引用到的knowledge行号]}。不要输出Markdown,不要补充未给出的事实,不要承诺赔偿或结果。KNOWLEDGE:
{{knowledge_lines}}
HISTORY:
{{history_json}}
NEW_MESSAGE:
{{new_message}}

Settings测试值

全部为虚构练习值;换OpenAI/Anthropic时ai_provider与认证header要同步改,密钥放n8n凭据而非正文。

{"business_name":"青柠文具铺","knowledge":"营业时间为每日9:00-18:00\n满99元包邮,未满收8元运费\n签收后7天内未拆封可退\n人工客服在线为工作日10:00-12:00","cannot_answer_message":"这个问题我这边不能确定,已为您转人工,请稍等。","ai_provider":"ollama","ai_model":"请填本地已拉取模型名","ollama_url":"http://localhost:11434"}

static data记录样例

本站虚构chat_id与时间;用于演示第二轮上下文,非真实客户。

{"chat_7001":[{"role":"customer","text":"今天几点关门?","ts":"2026-10-01T09:00:00+08:00"},{"role":"bot","text":"营业时间每日9:00-18:00。","ts":"2026-10-01T09:00:03+08:00"},{"role":"customer","text":"满多少包邮?","ts":"2026-10-01T09:01:00+08:00"}]}

输入与输出示例

本站虚构演示,未调用模型;输出与输入的包邮知识行对应。

输入

chat_7001已问过关门时间并得到营业事实;新消息“满多少包邮?”命中knowledge第2行,ai_provider=ollama测试。

对应输出

{"answerable":true,"reply":"满99元包邮,未满收8元运费。","used_facts":[2]} 最终Telegram发送该reply;若模型返回{"answerable":false,"reply":""}或HTTP失败,则发送“这个问题我这边不能确定,已为您转人工,请稍等。”

做完检查这些

  • 模型输出非JSON、answerable=false或reply空白时,发送的只能是cannot_answer_message
  • 同一chat_id第二轮能读到第一轮,另一chat_id读不到该历史
  • knowledge之外的承诺不会出现在最终reply,used_facts只引用存在行号
  • Ollama不可达或API认证失败时客户仍收到兜底,不产生静默失败
  • static data数组追加后裁剪到设定轮数,不会无限增长

容易卡住的地方

  • 免费模板不等于模型免费;OpenAI/Anthropic按账号计费,Ollama也需本地资源与已拉取模型
  • workflow static data适合轻量上下文,多实例、重启迁移或高并发要评估持久化方案
  • Telegram Trigger需要机器人先与用户或群组产生会话,拿不到chat_id时不能用该键存历史
  • 提示词约束不能替代权限控制;不要把支付、退款执行、账号操作放进客服可答范围
  • 不同提供方的HTTP体与鉴权头不同,本站不给未核实的精确API版本,需在节点按官方文档配置

原文与作者资料 ↗

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

原文标题
Answer Telegram customer messages with Ollama, OpenAI, or Anthropic
原作者
Tucker
原始发布日期
2026-09-29T02:29:52.151Z
来源
https://n8n.io/workflows/20109