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

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回调地址和验证令牌

具体怎么做

  1. 建Supabase向量表

    在Supabase的SQL编辑器里执行下方建表SQL(本站独立示例)。关键是embedding列的维度要和你选的OpenAI embedding模型一致,例如text-embedding-3-small为1536维;不一致时入库直接报错,这是作者明确点名的坑。

  2. 配PDF索引流程

    把三个Google Drive触发器分别指向主文件夹(新增)、同一文件夹(更新)、Trash文件夹。新增路径:Drive下载→提取PDF文本→切块→OpenAI embedding→写入Supabase,metadata里存Drive文件ID;更新路径先按文件ID删旧向量再走一遍新增;Trash路径按文件ID删向量后彻底删除Drive文件。先用两份自制PDF手动触发一次,确认向量入库。

  3. 配消息问答流程

    Webhook节点接收Meta的GET验证并回显hub_challenge;POST消息进入后先判断sender是否等于主页ID,是则直接结束,避免机器人回复自己造成死循环。AI Agent节点:OpenAI embedding把用户问题向量化→Supabase向量检索→OpenRouter聊天模型结合检索段落生成回答;Postgres memory节点用sender ID作为会话键。

  4. 回发与测试

    用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