2026-09-24 · 原文发布日
n8n 工作流:带审批的 Telegram 知识库机器人
该 n8n 模板搭建一个私有 Telegram 问答机器人:新用户发消息会进入待审批状态,管理员在控制群点按钮批准或拒绝,状态存 Redis。获批用户可发文字或语音(语音经 OpenAI 转写),由 LangChain agent 调用 OpenRouter 模型,结合 Supabase 向量库检索作答,长回复自动切条发送。另有手动分支把指定 Google Drive 文件夹里的 Google Docs 切块、生成 embedding 导入 Supabase,注意重复同步会产生重复分块。
原文要点
该 n8n 免费模板实现一个带审批的私有 Telegram 知识库机器人:新用户消息进入待审批,管理员在控制群点内联按钮批准或拒绝,状态写入 Redis;获批用户可发文字或语音,语音经 OpenAI 转写后交给 LangChain agent(OpenRouter 聊天模型+Redis 会话记忆+Supabase 向量检索工具)作答,长回复自动切条发送。另有手动分支把指定 Google Drive 文件夹中的 Google Docs 切块、生成 OpenAI embedding 写入 Supabase documents 表;重复执行同步会追加产生重复分块,需先清空或改为 upsert。Redis 会话记忆默认七天后过期,一个 Telegram bot 同时只能挂一个 webhook。
这次做成什么
在本站照做的目标:用这套免费模板搭起一个『审批准入+文档问答』的 Telegram 测试机器人,管理员批准后,用户能就一篇测试知识库文档提问并得到有依据的中文回答。练习方案:只用一篇虚构的退货政策文档做知识库,用一个测试账号走完『申请→批准→文字问答→语音问答』全流程,不涉及真实客户数据。
准备什么
- n8n 实例(含 AI/LangChain 节点),且具备公网 HTTPS 地址以挂 Telegram webhook
- Telegram:用 @BotFather 创建的 bot token,以及一个拉入该 bot 的管理员控制群
- Redis 实例及连接凭据(存审批状态与会话记忆,测试可用本地容器)
- OpenRouter 与 OpenAI 的 API key(模型调用与转写/embedding 可能产生费用)
- Supabase 项目,已启用 pgvector,具备建表与建函数权限
- Google 账号,用于 Drive 与 Docs 的 OAuth 授权及存放测试文档的文件夹
具体怎么做
创建 bot 并拿到控制群 chat ID
在 Telegram 找 @BotFather 发送 /newbot,按提示命名后拿到 HTTP API token。新建一个只有管理员的私密群,把 bot 拉进群并在群里任意发一条消息;用浏览器访问 https://api.telegram.org/bot你的token/getUpdates,在返回 JSON 中找到该群的 chat.id(群 ID 通常是负号开头的一串数字),记下来备用。
导入模板并配置六组凭据
打开模板页 n8n.io/workflows/19900(该模板免费,JSON 已脱敏、不含任何密钥),用 Copy to clipboard 或 Import 把它导入自己的 n8n 实例。然后在 n8n 的 Credentials 里依次新建:Telegram API(粘贴 bot token)、Redis(主机/端口/密码)、OpenRouter API、OpenAI API、Supabase API(项目 URL 与 service key)、Google Drive 与 Google Docs 两个 OAuth2。模板内每个节点选择对应凭据。
准备 Supabase 向量库
在 Supabase SQL 编辑器启用 pgvector 扩展,并创建 n8n Supabase Vector Store 节点所期望的 documents 表与 match_documents 相似度检索函数(字段含 content、metadata、embedding)。原模板页面没有附建表 SQL,具体 DDL 请以 n8n 官方 Supabase 向量节点文档为准核对,不要照抄网上版本号不明的脚本。
替换两处占位符并跑知识库同步
在工作流的规范化(Set/Code)节点中把 REPLACE_WITH_CONTROL_CHAT_ID 改为第 1 步拿到的控制群 ID,把 REPLACE_WITH_GOOGLE_DRIVE_FOLDER_ID 改为测试文件夹的 ID(文件夹 URL 最后一段)。在 Drive 里建该文件夹并放入一篇 Google Doc(内容用下面的测试文档),手动执行工作流的 Manual Trigger 同步分支一次,确认 Supabase documents 表新增若干分块行。
走通审批与问答测试
先用另一个 Telegram 测试账号(未授权)私聊 bot 发『你好』,应收到待审批提示,同时控制群出现带『批准/拒绝』按钮的审批卡片。点『批准』,Redis 中该用户状态变为 approved,用户收到通过通知。随后用文字发送『退货期限是多久?』,agent 应基于知识库回答;再发一条语音提问,确认走 OpenAI 转写分支。全部通过后,再把 Telegram Trigger 切换为激活状态(注意一个 bot 同时只能有一个生效的 webhook 或触发器)。
可直接复制的材料
工作流占位符与字段映射清单(配置核对单)
本站独立整理的配置核对单;两个占位符必须替换为你自己的值,其余按模板节点逐项确认。
# 本工作流需要替换/确认的映射(本站整理,按节点逐个核对)
## 占位符
- REPLACE_WITH_CONTROL_CHAT_ID = 管理员控制群 chat.id,示例格式:-1001234567890(负数,替换成你自己的)
- REPLACE_WITH_GOOGLE_DRIVE_FOLDER_ID = Drive 文件夹 ID,即 https://drive.google.com/drive/folders/ 后面那串字符
## 审批链字段映射
- Telegram Update → message.from.id 或 callback_query.from.id:作为用户唯一标识
- Redis 键:按用户 ID 存 access 状态,取值 pending / approved / denied / blocked
- 管理员回调:callback_query.data 携带目标用户 ID 与决定(批准/拒绝),仅当回调来自控制群 chat ID 时才生效
- 批准/拒绝后:向控制群回执,并向目标用户私聊发送结果通知
## 问答链字段映射
- 文字消息:message.text 直接作为问题
- 语音消息:message.voice.file_id → Telegram 下载文件 → OpenAI 转写文本作为问题
- LangChain agent:问题 + Redis 会话记忆(默认七天过期)+ Supabase 向量检索结果 → OpenRouter 聊天模型生成回答
- 输出:超长回答按 Telegram 长度限制切分为多条依次发送
## 知识库同步链(手动触发)
- Google Drive 节点:列出指定文件夹中的 Google Docs
- Google Docs 节点:读取全文 → 文本切块 → OpenAI 生成 embedding → 写入 Supabase documents 表(content/metadata/embedding)
- 注意:同步是追加式,重复执行会产生重复分块,重跑前先清空该来源记录或改为 upsertagent 中文系统提示词(替换模板默认俄语回答)
本站独立编写的中文系统提示词,用于替换原模板默认的俄语回答设定;粘贴到 LangChain agent 节点的 System Message 中。
你是一个私有知识库问答助手。请只依据检索工具返回的知识库内容回答用户问题,遵守以下规则:
1. 全程使用简体中文回答,语气简洁、像同事对话,不要使用敬语堆砌。
2. 如果检索结果足以回答,直接给出答案,并在末尾用一行注明依据的文档名。
3. 如果检索结果与问题无关或信息不足,回答:『知识库里暂时没有相关内容,请联系管理员补充文档。』不要凭常识编造答案。
4. 涉及数字、日期、期限时,必须照抄检索结果原文,不要改写或四舍五入。
5. 回答控制在 300 字以内;用户追问时可以引用上一轮对话记忆,但不得泄露其他用户的信息。测试用知识库文档与测试数据
本站虚构的测试材料;把文档正文粘进测试文件夹里的 Google Doc,问答对与消息结构用于人工核对流程,不代表真实 Telegram 推送。
# 测试 Google Doc 内容(标题:启航商城售后政策-测试版)
启航商城自营商品支持自签收之日起 30 天内无理由退货,定制类商品除外。
退货商品需保持包装完整,运费由平台承担。
退款在仓库验收后 3 个工作日内原路退回。
发票遗失不影响退货,但需在申请时说明。
※ 本文为 AI PLAY 练习用虚构内容,与任何真实商家无关。
# 一条测试问答数据
用户(文字):退货期限是多久?
期望回答要点:自签收之日起 30 天内可申请无理由退货(定制类除外),依据:启航商城售后政策-测试版
# 一条测试审批数据(Telegram 私聊消息结构示例,chat/user id 均为虚构)
{"update_id":900001,"message":{"message_id":11,"from":{"id":555001001,"first_name":"TestUser"},"chat":{"id":555001001,"type":"private"},"date":1792800000,"text":"你好,想查一下售后政策"}}输入与输出示例
本站虚构演示,非模板作者运行结果;实际输出取决于所选模型与检索命中。
输入
测试账号(ID 555001001)私聊 bot 发送文字:退货期限是多久?运费谁出?对应输出
管理员控制群先收到审批卡片并点『批准』后,bot 回复:启航商城自营商品支持自签收之日起 30 天内无理由退货(定制类商品除外);退货运费由平台承担。依据:启航商城售后政策-测试版做完检查这些
- 未授权测试账号发消息后,控制群在数秒内出现含批准/拒绝按钮的审批卡片,且用户端收到待审批提示
- 点击『批准』后用户收到通过通知,Redis 中该用户键的值变为 approved,过期策略生效
- 用文字提问测试问题,回答包含『30 天』且注明依据文档名,没有出现知识库以外的编造内容
- 发送一条语音消息后,流程走到 OpenAI 转写分支并能正常作答
- 手动同步分支执行后,Supabase documents 表新增分块行且 metadata 含文档标识
容易卡住的地方
- 一个 Telegram bot 同时只能有一个生效的 webhook/Telegram Trigger:本地调试和线上激活冲突时先停用其中一个
- 知识库同步是手动且追加式,重复执行会产生重复分块,重跑前清空旧记录或改 upsert,否则检索会返回重复内容
- 管理员回调必须来自配置的控制群 chat ID,填错群 ID 会导致审批按钮无效或任何人都能批准
- OpenRouter 模型调用、OpenAI 转写与 embedding 均可能计费,测试前确认 key 的额度与单价
- 模板默认用俄语作答,不改系统提示词的话中文用户会收到俄语回答
- Supabase 的 documents 表与 match_documents 函数结构必须和向量节点预期一致,否则检索静默返回空结果
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Run a Telegram knowledge base bot with OpenRouter, OpenAI, Supabase and Redis
- 原作者
- Konstantin
- 原始发布日期
- 2026-09-24T09:42:43.091Z
- 来源
- https://n8n.io/workflows/19900