2026-10-02 · 原文发布日
用Google Drive里的PDF搭一个Facebook Messenger问答机器人
这个模板把Facebook Messenger机器人接到RAG知识库上:收到消息后忽略主页自己发的内容,用OpenAI embedding把问题向量化,从Supabase向量库检索相关段落,交给OpenRouter聊天模型生成有依据的回答,经Facebook Graph API回发,对话历史存在Postgres。知识库维护全自动:Drive指定文件夹新增PDF时下载、提取文本、切块、生成向量入库;文件更新时删旧向量重新索引;文件进入指定的Trash文件夹时删除对应向量并彻底删除文件。
原文要点
该模板把Facebook Messenger机器人接到RAG知识库:webhook先处理Meta验证挑战并回显hub_challenge;收到消息后提取发送者与主页ID,忽略主页自发消息;LangChain AI Agent用OpenAI embedding把问题向量化,从Supabase(pgvector)向量库检索相关段落,由OpenRouter聊天模型生成有依据的回答,经Facebook Graph API回发;对话历史按Messenger sender ID存Postgres。知识库维护自动:Drive指定文件夹新增PDF时下载、提取文本、切块、生成向量入库;文件更新时删旧向量重新索引;文件进入指定Trash文件夹时删除对应向量并彻底删除文件。作者要求embedding模型与Supabase向量维度一致。
这次做成什么
搭一个用Google Drive里的PDF做知识库、在Facebook Messenger里自动回答客户问题的机器人。练习方案:先建Supabase向量表并放入两份自制PDF,手动触发索引流程,再用一条合成的Messenger消息JSON在n8n测试执行里走通检索与回发链路,最后才接真实Meta应用。
准备什么
- Supabase项目,已启用pgvector扩展,并有service key
- OpenAI API密钥,用于生成embedding,模型维度必须与向量表一致
- OpenRouter API密钥(或换用n8n支持的其他聊天模型节点)
- 可连接的Postgres数据库,用于按sender ID存对话历史
- Google Drive OAuth凭证,及三个指定文件夹:PDF主文件夹、更新监听文件夹、Trash文件夹
- Meta开发者账号、Facebook主页、Page access token,能配置webhook回调地址和验证令牌
具体怎么做
建Supabase向量表
在Supabase的SQL编辑器里执行下方建表SQL(本站独立示例)。关键是embedding列的维度要和你选的OpenAI embedding模型一致,例如text-embedding-3-small为1536维;不一致时入库直接报错,这是作者明确点名的坑。
配PDF索引流程
把三个Google Drive触发器分别指向主文件夹(新增)、同一文件夹(更新)、Trash文件夹。新增路径:Drive下载→提取PDF文本→切块→OpenAI embedding→写入Supabase,metadata里存Drive文件ID;更新路径先按文件ID删旧向量再走一遍新增;Trash路径按文件ID删向量后彻底删除Drive文件。先用两份自制PDF手动触发一次,确认向量入库。
配消息问答流程
Webhook节点接收Meta的GET验证并回显hub_challenge;POST消息进入后先判断sender是否等于主页ID,是则直接结束,避免机器人回复自己造成死循环。AI Agent节点:OpenAI embedding把用户问题向量化→Supabase向量检索→OpenRouter聊天模型结合检索段落生成回答;Postgres memory节点用sender ID作为会话键。
回发与测试
用Facebook Graph API凭据(Page access token)把回答发给对应sender ID。在n8n测试执行里粘贴下方合成webhook消息,确认链路输出一条基于PDF内容的回答;最后在Meta开发者后台把生产webhook URL和验证令牌填进去,用真实主页小号发消息验收。
可直接复制的材料
Supabase向量表建表SQL(本站独立示例)
本站编写的独立示例方案,1536维对应text-embedding-3-small;换模型必须同步改维度。原模板的具体表结构以画布为准。
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);
create or replace function match_documents(
query_embedding vector(1536),
match_count int default 5
) returns table (id bigint, content text, metadata jsonb, similarity float)
language sql stable as $$
select id, content, metadata,
1 - (embedding <=> query_embedding) as similarity
from documents
order by embedding <=> query_embedding
limit match_count;
$$;Messenger webhook合成测试消息
本站虚构的测试负载;PAGE_ID_PLACEHOLDER替换为你的主页ID,sender与recipient相同时应被流程忽略。
{
"object": "page",
"entry": [{
"id": "PAGE_ID_PLACEHOLDER",
"messaging": [{
"sender": {"id": "TEST_USER_9001"},
"recipient": {"id": "PAGE_ID_PLACEHOLDER"},
"timestamp": 1759600000000,
"message": {"mid": "mid.test.0001", "text": "你们的退货期限是多久?"}
}]
}]
}AI Agent系统提示词(本站编写)
本站独立编写的客服提示词,原模板的具体提示词需在其Agent节点里核对。
你是某店铺的Messenger客服。回答用户问题时:
1. 只依据检索到的知识库段落作答,段落里没有的信息就说『这个我需要帮你确认』,不要编造。
2. 用简体中文、口语化短句,一条回复不超过150字。
3. 涉及金额、期限、地址等具体信息时,逐字引用段落原文的表述。
4. 不知道用户身份背景,不要称呼其姓名。输入与输出示例
本站虚构演示,未实际调用模型或发送消息,输出为按流程逻辑推演的示意。
输入
知识库中《门店服务说明.pdf》含段落『自签收之日起30天内可无理由退货,定制类商品除外』,测试用户TEST_USER_9001发来消息『你们的退货期限是多久?』。对应输出
Agent检索到相似度最高的段落后,经OpenRouter模型生成并经Graph API回发的文本为:『您好,自签收之日起30天内可无理由退货,定制类商品除外。有其他问题随时问我。』同一次执行在Postgres中以sender ID为TEST_USER_9001的会话键追加一轮问答记录。做完检查这些
- 在Meta开发者后台发送GET验证请求,webhook原样回显hub_challenge值
- sender ID等于主页ID的合成消息不会触发任何检索或回发
- 上传新PDF到主文件夹后,Supabase的documents表出现该文件的多个切块向量行且metadata含文件ID
- 把同名PDF改内容后触发更新,旧向量行被删除且新段落可被检索到
- 把文件移入Trash文件夹后,对应向量行被删除且Drive中文件被彻底删除
- 测试提问的回复内容与PDF原文中的期限表述逐字一致
容易卡住的地方
- embedding模型与向量表维度不一致是作者明确指出的失败点,换模型时两边都要改
- Page access token过期或权限不足时Graph API回发失败,消息看似被忽略
- 主页自发消息若不过滤会造成机器人自问自答的死循环,这一步不能省
- Trash路径会彻底删除Drive文件而不仅是删向量,误移文件无法从回收站找回,建议先指向专用测试文件夹演练
- Supabase service key权限很高,只放在n8n凭证里,不要写进任何提示词或日志
- OpenRouter按模型计费,聊天模型选型直接决定每条消息的调用成本
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Reply to Facebook comments using RAG with Google Drive, Supabase, OpenAI and Postgres
- 原作者
- MADIAD
- 原始发布日期
- 2026-10-02T13:07:17.400Z
- 来源
- https://n8n.io/workflows/20337