2026-09-21 · 原文发布日
Drive 同步的 Telegram 知识库机器人
Telegram 收到提问后交给 LangChain Agent,结合 OpenRouter 聊天模型、Postgres 记忆和 Supabase 向量检索回答。另一条线监听 Google Drive:新 PDF 下载、抽文本、切块、用 OpenAI embedding 入 Supabase;更新文件先删同名向量再重建;移入 trash 文件夹则删除对应向量并移除 Drive 文件,避免过期资料继续被检索。
原文要点
原工作流由 MADIAD 发布(n8n.io/workflows/19789,免费模板):Telegram 收到提问后交给 LangChain AI Agent,组合 OpenRouter 聊天模型、Postgres 聊天记忆与 Supabase 向量库工具(OpenAI embedding)检索上下文作答并回发 Telegram。另一条线监听 Google Drive:新文件触发下载 PDF、抽文本、切块、embedding 入 Supabase;更新触发先按文件名删除旧向量再重建;文件出现在指定 trash 文件夹时删除对应向量并从 Drive 删除文件。作者提醒:按文件名删向量要求切块元数据里稳定写入 fileName。
这次做成什么
搭一套『Drive 同步的 Telegram 知识库机器人』:向测试机器人提问时从已索引的 PDF 检索答案;往 Drive 文件夹放/改/移入回收文件夹 PDF 时,向量库自动新增、重建或清除。练习方案:只用一份自己写的测试 PDF 和隔离的测试文件夹跑通三条同步线。
准备什么
- n8n 实例,可连 Telegram/Google/Supabase/OpenRouter/OpenAI/Postgres
- @BotFather 创建的测试机器人 token
- Google Drive OAuth2 凭据,测试文件夹需授权下载与删除权限
- 已启用 pgvector 的 Supabase 项目及服务密钥
- OpenRouter API 密钥(聊天模型)与 OpenAI API 密钥(embedding)
- 可写的 Postgres 实例用于聊天记忆(可用 Supabase 自带库或独立测试库)
具体怎么做
建向量表与凭据
在 Supabase SQL 编辑器执行下方建表语句(本站示例,表名与维度按你的 embedding 模型调整),启用 vector 扩展。n8n 里依次添加 Telegram、Google Drive OAuth2、Supabase、OpenRouter、OpenAI、Postgres 六组凭据。
接问答线:Telegram→Agent→回复
Telegram Trigger 收消息,把文本送入 LangChain AI Agent 节点;Agent 挂三样东西:OpenRouter 聊天模型、Postgres Chat Memory(以 Telegram chat id 作会话键)、Supabase Vector Store 工具(OpenAI embedding,指向上面的表)。Agent 输出经 Telegram 节点发回原会话。
接新增线:新 PDF 入库
Google Drive Trigger 监听『新建文件』的测试文件夹;后接 Download 节点取 PDF、文本抽取节点取全文、文本切分节点切块,切块时把 fileName 写入每块 metadata;再用 OpenAI embedding 生成向量插入 Supabase 表。
接更新线:先删后重建
第二个 Drive Trigger 监听『文件更新』;先执行删除:按 metadata 里 fileName 等于该文件名删掉旧向量(Supabase 删除节点或 SQL 节点),再复用新增线的下载→抽取→切块→embedding→插入流程重建该文件的全部向量。
接收回线:移入 trash 即清除
第三个 Drive Trigger 监听指定的 trash 文件夹;文件出现时同样按 fileName 删除 Supabase 中匹配向量,然后调用 Drive 删除节点把该文件从 Drive 移除,避免过期资料继续被检索命中。
端到端测试
把下方测试 PDF 内容存成 demo-faq.pdf 放进源文件夹,等新增线跑完;在 Telegram 问『演示产品的退款期限是多久』,机器人应引用 30 天作答。修改 PDF 把 30 天改为 14 天覆盖上传,再问应得到 14 天;把文件移入 trash 文件夹后再问,应回答找不到相关资料,且 Drive 中文件被删除。
可直接复制的材料
Supabase 向量表建表示例(本站独立编写)
本站独立编写的示例 SQL,非原作者提供;1536 维对应 text-embedding-ada-002/3-small,若换模型需改维度;表名要与 Supabase Vector Store 节点里填的一致,具体节点参数以原模板为准。
create extension if not exists vector;
create table if not exists documents (
id bigserial primary key,
content text,
metadata jsonb,
embedding vector(1536)
);
create index if not exists documents_embedding_idx
on documents using ivfflat (embedding vector_cosine_ops)
with (lists = 100);
-- 按文件名清除某文件全部向量(更新线与回收线共用此思路)
delete from documents
where metadata->>'fileName' = 'demo-faq.pdf';测试 PDF 文本内容(本站虚构)
本站虚构内容,保存为 demo-faq.pdf(可用任意编辑器导出)用于端到端测试,与 example 中的问答对应。
演示产品 FAQ(虚构)
1. 演示产品的退款期限是购买后 30 天内,超过期限不予受理。
2. 演示账号最多支持 5 台设备同时登录。
3. 企业版包含单点登录与审计日志功能,标准版不包含。
4. 数据导出支持 CSV 与 JSON 两种格式。输入与输出示例
本站虚构演示,未实际运行,非原作者结果;回复措辞取决于所选聊天模型。
输入
上传含上方四条 FAQ 的 demo-faq.pdf 到 Drive 源文件夹,然后在 Telegram 测试会话发送:『演示产品的退款期限是多久?』对应输出
机器人回复大意:『根据知识库内容,演示产品的退款期限是购买后 30 天内,超过期限不予受理。』将 PDF 中 30 天改为 14 天覆盖上传触发更新线后,再问同一问题回复变为 14 天;把文件移入 trash 文件夹后,Supabase 中 fileName=demo-faq.pdf 的向量被清空,再问回复为未找到相关资料,且 Drive 里该文件已被删除。做完检查这些
- 新 PDF 放入源文件夹后,Supabase 表中新增多行且每行 metadata 都含相同的 fileName 值
- Telegram 提问退款期限,回答中的天数与当前 PDF 版本一致(30→改后 14)
- 覆盖上传同名文件后,旧版本内容不再被检索到,表中该文件的向量数量与新版切块数一致
- 文件移入 trash 文件夹后,按 fileName 查询 Supabase 返回 0 行,且 Drive 中该文件被删除
- 连续两轮对话中 Postgres 记忆生效,第二轮能引用第一轮上下文
容易卡住的地方
- 切块时忘了把 fileName 写进 metadata,更新与回收线会删不掉旧向量,导致新旧答案并存
- Drive 凭据只有读取权限时下载正常但回收线的删除会失败,需在 OAuth 授权时给足范围
- embedding 模型维度与建表维度不一致会插入报错,换模型必须重建表
- 更新线若先重建后删除,顺序错了会把新向量也清掉,必须先删后建
- OpenRouter 模型名拼写错误或额度不足会让 Agent 静默失败,先在节点里单独试跑模型
- trash 文件夹用系统回收站代替指定文件夹时触发条件不同,本方案依赖你自己指定的文件夹
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Sync a Telegram RAG chatbot with Google Drive using OpenAI and Supabase
- 原作者
- MADIAD
- 原始发布日期
- 2026-09-21T10:45:24.956Z
- 来源
- https://n8n.io/workflows/19789