2026-09-17 · 原文发布日
用Drive文档搭公司政策问答机器人
免费n8n模板搭内部知识库:监听指定Google Drive文件夹的新增和更新文件,按PDF、Google Doc、DOCX、TXT分别抽文本,先按文件ID删掉Qdrant里的旧向量再分块、用OpenAI生成嵌入写入,保证知识库不过期;提问入口是n8n公开Chat或Slack@机器人,带对话记忆的OpenAI模型只基于检索到的文档内容作答并附来源引用,Slack提问会回到原频道/线程回复。需在Qdrant建company_docs集合并给file_id字段建索引。
原文要点
该免费模板(Intuz发布于n8n模板库)由两条链路组成:一条每分钟轮询指定Google Drive文件夹,下载新增或更新的文件,按PDF、Google Doc、TXT、DOCX分别抽取纯文本(DOCX先复制成临时Google Doc导出文本再删除),分块后附上文件ID、文件名、Drive链接、修改时间等元数据,用OpenAI生成嵌入写入Qdrant的company_docs集合,写入前按file_id删除旧向量避免过期内容;另一条链路接收n8n公开Chat或Slack提及消息,统一格式后用带记忆的OpenAI模型仅依据检索结果作答并附来源引用,Slack消息回发到原频道/线程。
这次做成什么
在公司内部搭一个会随Drive文档自动更新的政策问答机器人:员工在n8n Chat页面或Slack里提问,机器人只基于公司文档回答并给出处。本指南给出可照做的搭建顺序,并用一份虚构的员工手册练习验证同步与问答两条链路。
准备什么
- 已启用LangChain节点的n8n实例(自托管或云端)
- 能访问目标文件夹的Google账号,用于配置Google Drive OAuth2凭据
- OpenAI API密钥,同时用于对话模型和嵌入模型
- Qdrant Cloud集群地址与API密钥(或自建Qdrant)
- 一个只放公司政策文档的Google Drive测试文件夹
- 如走Slack入口:已配置app_mention与message.im事件订阅的Slack应用
具体怎么做
建Qdrant集合与file_id索引
在Qdrant控制台或REST API创建名为company_docs的集合,向量维度与所用OpenAI嵌入模型一致;然后对metadata.file_id字段建keyword类型的payload索引。没有这一步,按文件ID删除旧向量会失败或扫描极慢。可先PUT一条测试向量再按file_id过滤查询,确认索引生效。
配置文档同步链路
在模板导入后,给Google Drive Trigger节点绑定Drive OAuth2凭据,填入要监听的文件夹ID,轮询间隔保持每分钟。检查文件类型分支:PDF、Google Doc、TXT走直接抽取,DOCX走复制为临时Google Doc再导出文本的分支。把OpenAI凭据填进嵌入节点,Qdrant向量存储节点选择company_docs集合,并确认删除节点使用按metadata.file_id过滤的REST API调用。丢一份测试PDF进文件夹,等一个轮询周期后到Qdrant看是否出现带file_id元数据的分块。
配置问答链路
给Chat Trigger(或Slack Trigger)和Agent节点的OpenAI聊天模型填凭据,挂载名为company_knowledge_base的Qdrant检索工具,连接窗口记忆节点,把下方提示词填入Agent的系统消息。Slack入口还需在Slack后台订阅app_mention与message.im事件并重新安装应用,模板里已有忽略机器人自身消息的判断,避免自问自答死循环。
端到端验证与上线
更新文件夹里的政策文档(改一处数字),等下一个轮询周期后提问该数字,确认回答用新值而非旧值,即删除旧向量再插入的同步逻辑生效;同时检查答案末尾是否附带来源文件名和Drive链接。验证通过后把Chat Trigger的公开链接或Slack频道发给员工使用。
可直接复制的材料
公司政策问答机器人系统提示词
本站独立编写的系统提示词,填入Agent节点系统消息;部门名称按实际替换。
你是公司内部政策问答助手。回答员工提问时严格遵守以下规则:
1. 只依据检索工具返回的公司文档内容作答,不得使用你自身的训练知识补充政策细节。
2. 问候、自我介绍类问题直接简短回答,不需要检索。
3. 检索后如果文档中没有相关信息,回答:"我在公司文档中没有找到这方面的规定,建议联系人力资源部确认。"不要编造条款。
4. 回答用简体中文,分点列出关键规定,每点不超过两句。
5. 回答末尾必须附上来源,格式为:来源:《文件名》(Google Drive链接)。
6. 涉及数字(天数、金额、比例)时必须照抄文档原文数值,不要四舍五入或换算。创建Qdrant集合与file_id索引的请求示例
本站独立编写的配置示例,非模板原文件;集群地址、密钥、向量维度需按实际替换,未在模板环境中实测。
# 1. 创建集合(维度1536对应OpenAI text-embedding-3-small,换模型需改维度)
curl -X PUT "https://你的集群地址:6333/collections/company_docs" \
-H "api-key: 你的Qdrant密钥" -H "Content-Type: application/json" \
-d '{"vectors":{"size":1536,"distance":"Cosine"}}'
# 2. 给metadata.file_id建keyword索引,删除旧向量依赖它
curl -X PUT "https://你的集群地址:6333/collections/company_docs/index" \
-H "api-key: 你的Qdrant密钥" -H "Content-Type: application/json" \
-d '{"field_name":"metadata.file_id","field_schema":"keyword"}'同步链路一条测试数据的字段映射
本站虚构的单条测试数据:file_id对应Drive文件ID字段,chunk_text为分块后写入的文本片段,expected列出Qdrant payload中应出现的元数据键。
{"file_id":"1A2b3C4d5E6f_exampleDriveId","file_name":"员工手册-2026修订版.pdf","drive_url":"https://drive.google.com/file/d/1A2b3C4d5E6f_exampleDriveId/view","last_modified":"2026-09-17T08:30:00Z","chunk_index":0,"chunk_text":"员工连续工作满一年后,可享受带薪年假5天。","expected_qdrant_payload_keys":["metadata.file_id","metadata.file_name","metadata.drive_url","metadata.last_modified"]}输入与输出示例
本站虚构演示,非原作者运行结果;回答格式由上述系统提示词约束产生。
输入
在Drive测试文件夹放入虚构《员工手册-2026修订版.pdf》,其中写明"连续工作满一年可享年假5天";同步完成后员工在Slack提问:"@PolicyBot 入职满一年有几天年假?"对应输出
机器人回复:根据《员工手册-2026修订版》:
- 员工连续工作满一年后,可享受带薪年假5天。
来源:《员工手册-2026修订版.pdf》(https://drive.google.com/file/d/1A2b3C4d5E6f_exampleDriveId/view)做完检查这些
- 向文件夹新增PDF后一个轮询周期内,Qdrant的company_docs集合中出现带metadata.file_id的向量分块
- 修改同一文件内容后再次同步,旧分块被删除,提问该处修改只能得到新内容
- 用聊天入口提问政策问题,回答只引用检索到的文档且末尾附文件名与Drive链接
- 问一个文档中不存在的问题,机器人给出"未找到、请联系相关部门"的回退回答而非编造
- Slack提问时回复出现在原频道或原线程,且机器人不回复自己产生的消息
容易卡住的地方
- 忘记建metadata.file_id的keyword索引时,删除旧向量节点会报错或全表扫描,文档更新后新旧内容并存导致答案矛盾
- 向量维度必须与嵌入模型匹配,更换OpenAI嵌入模型后需重建集合并全量重新同步
- DOCX依赖复制成临时Google Doc再导出的转换流程,Drive账号空间不足或导出失败时该类型文件不会入库
- Slack应用订阅事件后必须重新安装到工作区,否则提及消息不会触发工作流
- 轮询间隔为每分钟,文档刚保存立刻提问可能还是旧答案,这不是故障
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Answer internal policy questions from Google Drive with OpenAI and Qdrant
- 原作者
- Intuz
- 原始发布日期
- 2026-09-17T05:24:08.355Z
- 来源
- https://n8n.io/workflows/19671