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的最近轮次
具体怎么做
填写受限知识与兜底话术
在Settings节点设business_name为虚构店名;knowledge每行只写一条事实,例如营业时间、退换规则、配送范围、客服人工时段;cannot_answer_message写成礼貌转人工;ai_provider先选ollama或openai之一,ai_model填账号真实可用名。知识不要放密钥、内部成本或无法验证承诺。
构造会话上下文键
用chat_id作为static data键,值是数组,每项含role(customer|bot)、text、ts。触发后先读取该键,缺省为空数组;只保留最近八轮,避免提示词膨胀。把新消息追加为customer项前先去除多余空白,保留原意,不改写用户问题。
拼接JSON-only提示词并发HTTP
把business_name、knowledge逐行、历史数组、新消息放入本页提示词,要求模型只输出answerable布尔与reply字符串。按ai_provider组装HTTP Request:Ollama指向ollama_url,OpenAI或Anthropic在节点上加header认证;不要在本站示例中写死真实端点参数,按所用提供方文档核对。
只采用可回答回复
解析HTTP响应为JSON;若解析失败、answerable为false、reply为空或HTTP节点报错,统一改用cannot_answer_message。解析成功才取reply,并在发送前做一次长度截断与禁用承诺词检查,例如不出现“保证退款”“绝对有效”。
回发并落聊天记录
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