个人项目
双AI专家协作系统
基于飞书应用机器人的双 AI 专家协作系统,支持 GPT 与 DeepSeek 参与业务群讨论,通过独立分析、联网查证与交叉论证,为团队提供多角度的方案建议和风险判断。
- TypeScript
- Node.js
- Fastify
- Feishu SDK
- OpenAI-compatible API
- PostgreSQL
- Redis
- BullMQ
- Zod
- Vitest
- Pino
- Prometheus
- Docker
项目介绍
双AI专家协作系统是基于飞书应用机器人开发的双 AI 专家协作系统,面向公司业务咨询、方案研讨和风险核对场景,将 GPT 与 DeepSeek 作为独立专家接入群聊。 基于多 Agent 编排实现上下文理解、联网检索、独立分析和交叉复核,支持定向提问、双 AI 会诊及主动参与群讨论;两个 AI 可围绕同一业务问题交换意见、核对依据并指出分歧,为团队决策提供多角度分析和可追溯的参考信息。
核心功能
双 Agent 协作与按需复核: 接入 GPT、DeepSeek 两个独立飞书机器人,通过 TypeScript 中央编排器实现单独问答、双模型并行分析和交叉复核。正式问题按答案通过校验的顺序分别返回,不等待慢模型;简单闲聊仅保留首个有效回复,并通过 AbortController 取消另一方请求。既保留多角度分析,又避免重复回复和不必要的等待。 结合群聊场景的智能参与机制: 采用“确定性规则筛选+模型语义判断”:明确点名、管理命令先按规则路由,普通讨论再由模型判断相关度、置信度和新增价值,并结合活跃时段、冷却时间、频率限制决定是否参与。规则负责明确边界,模型负责理解语境,让 AI 能主动提供帮助,同时控制打扰和调用开销。 共享联网证据与可追溯回答: 集成博查搜索,由编排层统一获取证据,供两个 Agent 及复核环节共享;使用进程内 Promise 缓存合并相同查询,并通过 Redis 搜索尝试标记限制重复检索。引用链接由程序根据证据白名单生成,过滤模型虚构的来源编号和 URL,减少重复搜索,也便于用户追溯回答依据。 异步处理与失败恢复: 使用 BullMQ+Redis 分离高优先级会话、主动插话和消息发送任务,避免发送故障直接拖累模型处理。结合数据库发送记录、稳定幂等键及飞书请求 UUID,实现发送重试和长文本分片续发;已经发送成功的分片无需重新发送,发送重试也无需再次生成答案。 面向运营的群级配置管理: 通过飞书交互卡片和批量命令配置参与方式、联网策略、上下文范围及回答详细度。采用 PostgreSQL 事务、版本校验和审计记录发布配置,降低多人修改时相互覆盖的风险,让不同群聊可以独立调整 AI 行为,而不必修改代码。
承担责任
业务场景与交互设计: 围绕公司日常咨询、方案讨论和风险核对,设计“单专家咨询、双专家会诊、主动参与讨论”三类交互流程,明确点名优先级、复核触发条件和异常反馈;通过飞书卡片配置参与频率、上下文范围与回答详细度,使业务人员无需修改代码即可调整 AI 行为。 双 Agent 协作链路开发: 基于 TypeScript 实现中央编排器,构建“消息路由 → 上下文装配 → 按需检索 → 并行分析 → 交叉复核 → 回复发送”处理链路;两个模型先独立形成意见,再核对对方的事实、遗漏和风险,输出一致意见与分歧。 回答质量与证据约束: 设计包含结论、证据、风险、缺失信息和人工确认标记的结构化输出,结合 Zod 校验及有限修复约束模型结果;接入博查搜索并共享检索证据,通过来源白名单过滤虚构引用,保留未核实结论的提示。 运行稳定性与资源控制: 使用 BullMQ、Redis 和 PostgreSQL 实现异步任务分流、消息幂等、发送重试及配置版本管理;统一限制模型调用次数,记录调用耗时、Token 用量和决策原因,并围绕并行返回、模型失败、任务抢占和重复发送编写测试。
难点与解决
双 AI 如何真正相互论证,而不是重复回答: 采用“独立分析+一轮交叉复核”的分阶段编排,先让两个模型基于相同上下文和检索证据分别作答,再交换答案,按事实错误、遗漏信息和风险进行结构化核对。相比直接让机器人互相接话,该方案能够限制协作轮次和调用开销,并明确区分“模型意见一致”与“事实已有证据”,避免把相互认同当成验证结果。 多模型分析质量与响应速度难以兼顾: 使用并行调用和答案完成回调,任一模型输出通过校验后立即入发送队列,复核在后续完成,不让首答等待整个协作流程;对问候等简单对话只保留首个有效回复,通过 AbortController 取消慢模型。按问题类型选择处理深度,兼顾业务分析的完整性与日常交流的及时性。 AI 既要主动参与,又不能频繁打断或回复过时话题: 将参与决策拆为规则过滤和模型判断两层,先检查活跃时段、话题、冷却和频率,再判断相关度与新增价值;利用 Redis 最新消息令牌及 Lua 原子检查识别已被新消息替代的任务。主动任务不长期占用群级锁,减少旧问题拖慢后续讨论的情况。 模型输出不稳定,异常修复容易产生额外费用: 基于 JSON 输出约束和 Zod 校验识别字段缺失、类型错误,将具体错误位置反馈给模型修复;单次调用最多尝试两次,并受消息级共享预算约束。关闭 SDK 隐式重试,将分析、复核、网络重试和结构修复统一计数,避免多层重试叠加造成调用量失控。 双模型联网分析容易重复检索和伪造来源: 将搜索能力集中在编排层,同一消息的分析与复核共享一份证据;通过内存 Promise 缓存合并相同查询,使用 Redis 哈希标记限制重复搜索。模型仅选择证据 ID,最终链接由程序依据白名单生成,将来源约束落实到代码校验,而不只依赖提示词。