2026-09-15 · 原文发布日
RFx招标采购问答助手
n8n聊天触发接收供应商或内部人员的RFx提问,先识别提问者角色、招标阶段与问题类别并提取事件编号,再从Google Sheets拉取RFx事件详情与FAQ规则构建分角色的提示词,Gemini据此生成简明回答;系统对答案做不确定性与敏感话题评分,正常交互记入用量表,需人工的则写入升级日志待跟进。
原文要点
该模板链路为:n8n聊天触发器收到问题后记录问题、时间戳和会话ID;判断提问者是供应商还是内部人员,识别招标阶段、问题类别并抽取RFx事件编号;从Google Sheets读取RFx_Events与FAQ_Rules,优先当前进行中和被点名的事件;把事件详情、FAQ规则与回答要求交给Google Gemini生成简明答案;再给答案做不确定性与敏感话题评分,正常写入FAQ_Usage_Log,需人工时写入Escalation_Log。设置要求四张表列名与追加字段一致,并配置Sheets OAuth2、Gemini凭证和聊天webhook。
这次做成什么
在站内复刻一个可练习的RFx问答分流器:输入一条供应商或内部提问,输出角色、阶段、类别、事件号、Gemini回答草案、风险评分,以及应写入用量日志还是升级日志。方案不依赖原模板文件,用四张Google Sheets、一个n8n Chat Trigger、一个Gemini节点和两个追加行节点即可跑通最小闭环。
准备什么
- 一个可登录的n8n实例,能创建Chat Trigger公开webhook并能在本机curl测试
- Google账号已开通Sheets,并能创建OAuth2客户端给n8n读写表格
- Google Gemini API凭证可配置到Gemini Chat Model节点,且了解模型调用可能计费
- 已新建一个练习用Google工作簿,含RFx_Events、FAQ_Rules、FAQ_Usage_Log、Escalation_Log四个工作表
具体怎么做
建四张练习表并固定列名
在Google Sheets新建工作簿RFx练习库。RFx_Events列用event_id、title、stage、status、owner、deadline、scope;FAQ_Rules列用rule_id、role、stage、category、question_hint、answer_rule、escalate_flag;FAQ_Usage_Log列用timestamp、session_id、role、stage、category、event_id、question、answer、uncertainty_score、sensitive_score、route;Escalation_Log列用timestamp、session_id、phone_or_user、event_id、question、reason、status、assignee。把下方CSV样例分别导入前两张表,后两张先只留表头。
配置三类凭证并替换文档ID
n8n凭据页添加Google Sheets OAuth2,范围选读写表格;添加Google Gemini或PaLM兼容凭证;如用本地聊天组件而非第三方,只保留n8n Chat Trigger自带端点。每个Google Sheets节点都选择同一练习工作簿,文档ID从浏览器地址栏复制,工作表名逐节点选择,不要沿用占位ID。
搭触发到分类的第一段
拖入Chat Trigger,响应模式设为返回消息。接Set节点命名解析输入,字段映射:question={{$json.body.message}},session_id={{$json.body.sessionId}},timestamp={{$json.body.timestamp||$now}}。再接Code节点运行下方分类脚本,输出role、stage、category、event_id;正则只识别RFQ-2026-018这类大写RFx编号,找不到就留空,绝不用猜测值覆盖。
读取事件与FAQ并组提示词
Google Sheets节点A读RFx_Events,筛选status等于Active或event_id等于分类结果;节点B读FAQ_Rules,按role、stage、category匹配,最多取5条。Function节点把事件拼成context_lines,把规则拼成faq_lines,若event_id为空且没有Active事件则设置need_clarify=true。把下方Gemini提示词放入Gemini Chat Model前的Prompt字段,变量用$json引用。
评分、分支和落表输出
Gemini后接Code节点,用答案文本中是否包含不确定、需采购确认、法务、价格有效期、保密等词计算uncertainty_score与sensitive_score,规则见评分配置材料。IF节点条件:任一分数大于等于0.7或need_clarify为真走Escalation_Log,status填pending,reason填评分和缺失说明;否则走FAQ_Usage_Log。最后Chat Respond返回answer与route,便于练习页看到分流结果。
用隔离数据做端到端练习
先停用真实供应商群或生产表格,只用示例工作簿。激活工作流后复制Chat Trigger测试URL,用下方example.input作为POST body发送;检查n8n执行日志中Sheets读取行数、Gemini输入是否含事件摘要、IF分支是否写入Escalation_Log。通过后把session_id换成新值再测内部折扣权限问题,验证角色会改变回答口径。
可直接复制的材料
RFx_Events与FAQ_Rules合成CSV
本站独立合成练习数据;导入Google Sheets后列名必须与节点字段一致,日期格式先在表格内设为文本避免错位。
RFx_Events.csv
event_id,title,stage,status,owner,deadline,scope
RFQ-2026-018,办公椅年度询价,澄清,Active,林岚,2026-10-08 18:00,300把人体工学椅含安装
RFP-2026-003,客服外包提案,评标,Active,赵启,2026-10-20 12:00,7x10中文客服与质检
RFI-2026-011,仓储系统调研,已截止,Closed,周渺,2026-08-01 17:00,三地仓库WMS能力摸底
FAQ_Rules.csv
rule_id,role,stage,category,question_hint,answer_rule,escalate_flag
FR-01,supplier,澄清,截止时间,还能改标书吗,仅引用RFx_Events.deadline回答;逾期请提交采购联系人,FALSE
FR-02,supplier,评标,价格,价格有效期多久,不承诺合同外有效期;提示以正式RFP条款为准,TRUE
FR-03,internal,评标,进度,现在到哪一步,可说明stage与owner;不泄露其他供应商报价,FALSE
FR-04,any,任意,敏感,竞争对手报价,拒绝提供并建议走采购合规渠道,TRUEGemini分角色回答提示词
本站编写的独立提示词;变量名需与前面Set/Code节点输出一致,模板未下载时不保证与原模板措辞相同。
你是企业采购RFx问答助手。只允许使用【事件摘要】和【FAQ规则】作答,不要编造政策、价格、对手信息或截止日期。
提问者角色:{{$json.role}};识别阶段:{{$json.stage}};类别:{{$json.category}};事件号:{{$json.event_id || 未提供}}
【事件摘要】
{{$json.context_lines}}
【FAQ规则】
{{$json.faq_lines}}
回答要求:1)供应商只给流程性、公开性说明;内部人员可多说owner与stage,但不透露其他供应商报价。2)若规则含escalate_flag=TRUE或资料不足,答案末尾固定写:需人工跟进。3)中文不超过180字,先给结论,再给下一步。4)禁止出现按原价肯定有效的承诺。分类Code节点示例脚本
本站练习脚本,仅做关键词分流;生产可换成分类模型,但不要把未识别事件号填成相近编号。
const q = ($json.question || '').toString();
const lower = q.toLowerCase();
const id = (q.match(/\bRF[QPX I]?-?20\d{2}-\d{3}\b/i) || [''])[0].toUpperCase();
const supplierWords = ['投标','报价','供应商','标书','截止','澄清'];
const internalWords = ['评标','进度','权限','内部','负责人','定标'];
const role = supplierWords.some(w=>q.includes(w)) && !internalWords.some(w=>q.includes(w)) ? 'supplier' : 'internal';
let stage = '任意';
if (q.includes('截止') || q.includes('澄清') || q.includes('改标')) stage = '澄清';
if (q.includes('评标') || q.includes('进度') || q.includes('定标')) stage = '评标';
let category = '其他';
if (q.includes('截止') || q.includes('时间')) category = '截止时间';
if (q.includes('价格') || q.includes('报价') || q.includes('有效期')) category = '价格';
if (q.includes('对手') || q.includes('竞争') || q.includes('保密')) category = '敏感';
if (q.includes('进度') || q.includes('哪一步')) category = '进度';
return [{json:{question:q, session_id:$json.session_id, timestamp:$json.timestamp, role, stage, category, event_id:id || null}}];评分与分支配置
本站设定的练习阈值,不是原模板公布算法;上线前需在真实模板核对评分节点是否已有不同规则。
评分规则:uncertainty初始0;答案含不确定、资料不足、需人工跟进、以正式条款为准各加0.25;event_id为空且问题涉及具体事件加0.4;上限1。sensitive初始0;含竞争对手、报价明细、保密、法务、折扣权限、中标名单各加0.3;FAQ命中escalate_flag=TRUE直接置1;上限1。IF条件:uncertainty>=0.7 OR sensitive>=0.7 OR need_clarify=true 进Escalation_Log;否则进FAQ_Usage_Log。字段映射:Escalation_Log.timestamp=.timestamp,session_id=.session_id,phone_or_user=.role,event_id=.event_id,question=.question,reason=concat('u=',uncertainty,';s=',sensitive,';clarify=',need_clarify),status='pending',assignee='采购值班'。Usage_Log同名字段直接映射,route='answered'。Chat Trigger隔离测试数据
虚构会话,不包含真实供应商信息;不要在生产webhook使用同一sessionId反复压测。
POST到Chat Trigger测试URL的JSON:{"body":{"message":"我是供应商,RFQ-2026-018的标书过了截止还能补交吗?会不会看到别家报价?","sessionId":"sess-rfx-demo-001","timestamp":"2026-09-15T10:20:00+08:00"},"headers":{"x-demo":"aiplay-isolated-rfx"}}。期望工作流收到后先回EVENT_RECEIVED等价确认,再由Chat Respond返回中文答复;若使用自定义前端,需把sessionId与message放在body字段下,与本映射一致。输入与输出示例
本站虚构演示,未调用Gemini或原模板;输出展示字段对应关系,不代表作者工作流实测结果。
输入
{"body":{"message":"我是供应商,RFQ-2026-018的标书过了截止还能补交吗?会不会看到别家报价?","sessionId":"sess-rfx-demo-001","timestamp":"2026-09-15T10:20:00+08:00"}}对应输出
分类:role=supplier,stage=澄清,category=敏感,event_id=RFQ-2026-018。Gemini草案:结论:以RFQ-2026-018页面截止时间2026-10-08 18:00为准,逾期不能在本练习流程中承诺补交;也不会提供其他供应商报价。下一步:如有特殊原因,请通过采购联系人正式提交说明。需人工跟进。评分:uncertainty=0.25,sensitive=1.00,route=escalated。写入Escalation_Log一行:timestamp=2026-09-15T10:20:00+08:00,session_id=sess-rfx-demo-001,event_id=RFQ-2026-018,reason=u=0.25;s=1;clarify=false,status=pending。做完检查这些
- 四张表存在且追加字段与节点映射同名,执行后Usage或Escalation只新增一行
- 同一问题在role为supplier时不出现内部owner细节,改为internal可出现owner但不出现别家报价
- 含竞争对手报价的提问必须进入Escalation_Log,且status为pending
- event_id能从RFQ-2026-018样式文本抽出,抽不到时不伪造相近事件
- Chat Respond返回中文答案和route字段,测试页能区分answered与escalated
容易卡住的地方
- Google Sheets日期列被自动改格式,导致截止时间比对失败,先导成文本再映射
- Gemini凭证无计费或区域不可用时会超时,不要在问题里承诺作者未给的精确费用
- FAQ_Rules没有覆盖某类别时直接回答会编造,应把need_clarify设为真
- 把Chat Trigger生产URL发给真实供应商前未隔离日志,可能把练习数据写入正式表
- 评分阈值是本站练习设定,与原模板可能不同,导入原模板后要重新核对
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Answer RFx sourcing event questions with Gemini and Google Sheets
- 原作者
- WeblineIndia
- 原始发布日期
- 2026-09-15T07:43:37.143Z
- 来源
- https://n8n.io/workflows/19610