得物以HarnessAgent融合知识库与飞书检索
概述
知识问答的核心挑战是准确率与质量——查得全(召回率)、查得准(精准度)、理解得对(多模态)、看得对(权限隔离)。团队选择 AgentScope 2.0 的 HarnessAgent 架构,重点使用三项能力:ReAct 循环(Agent 不是一次性检索后回答,而是在“推理→行动→观察”中反复迭代,实现搜索→评估→精读→再搜索);Middleware(在 onActing 钩子插入三阶段质量过滤,对 Agent 完全透明);并行工具调用(一次推理中决定调用多个工具时框架自动并行,由 Toolkit.parallel(true) + Java 21 虚拟线程支撑,工具调用为 I/O 密集型、虚拟线程在阻塞时自动释放平台线程)。数据源分两条线并在同一轮对话中同时激活:企业知识库(产品文档、流程规范、FAQ,按业务领域或部门划分、管理员统一维护)与个人飞书数据(飞书消息、文档、妙记,检索该用户个人可见数据)。权限隔离分两层——知识库层按可访问列表控制,飞书层用 UserCallContext 注入用户 openId、API 按身份返回数据,同一问题不同用户结果不同。Agent 自主决定用哪些工具、搜几次、是否精读、何时停止,决策依据为 AGENTS.md 中的结构化提示词(规定来源优先级:企业知识库 > 飞书文档 > 消息/妙记,冲突时明确指出并建议采信来源);SourceCollector 按 sourceId 跨工具去重,每条关键信息在回答中标注 [src:sourceId] 可溯源。 团队不重复造轮子:知识库的文档解析、Chunk 切分、向量化与混合检索全部由公司已有知识管理平台提供,本产品在其之上构建智能检索层。检索前先做查询扩展——把用户原始问题改写为语义等价的完整自然语言句子而非关键词(Embedding 模型在自然语言上训练,完整句子比一串词编码更精准),并生成多个不同角度的变体并行发起检索以覆盖意图各侧面。针对“向量相似 ≠ 语义相关”(余弦相似度易被高频词干扰,文中举例向量检索返回 5 条中只有 2 条真正相关、噪声比例 60%),结果经三阶段过滤:Stage 0 FastPass(结果数 ≤ 2 且原始 score 全部 ≥ 0.7 时直接放行、零额外延迟);Stage 1 Reranker 用 gte-rerank-v2 交叉编码器重新打分,阈值 0.3 过滤“词像但意思不对”并取 Top-8;Stage 2 LLM Grading 用大模型按 0.1~1.0 四级逐条打分(最多 10 条、30 秒超时),阈值 0.5 过滤“主题对但不够直接”。Pipeline 通过 AgentScope 的 MiddlewareBase 接口接入 onActing 钩子拦截 knowledge_search 结果并按 toolCallId 分组处理,各阶段独立可开关(对时效性要求高的场景可关闭 LLM Grading 降延迟),过滤后结果重建为与原始工具输出格式一致的文本,Agent 无需感知。 针对用户遇问题第一反应是截图(报错信息、界面异常、配置页面)的场景,产品支持图片输入实现“截图即提问”。上传阶段支持拖拽/粘贴/点击,最多 6 张并校验类型和大小;发送阶段从对象存储内网读取图片字节做 Base64 编码,与文本一起构造多模态消息。模型侧自动判断策略:未指定模型时自动切换到视觉语言模型;指定了视觉模型则正常执行;指定了纯文本模型则拒绝并提示,防止调用失败;且校验不仅检查本轮上传的图片,还检查历史对话中是否有图片——因大模型无状态,历史图片每轮都需重新发送,只要历史中有图同样强制使用视觉模型。历史回放按消息聚合、按用户归属过滤、总大小受预算控制;Agent 可在回答中插入检索到的图片辅助说明,图片与文字引用统一编号。 多实例 SSE 断点续传按优先级自动选择三条恢复路径:路径一同实例恢复(页面刷新、切后台、网络闪断等最常见场景,本地内存仍有 Agent 运行状态,直接发一个完整快照恢复历史后续传,零延迟零 Redis 开销);路径二跨实例转发(负载均衡调度或网络切换导致 IP 变化,新实例通过 Redis 路由表查到原实例地址内部转发,原实例像本地客户端一样推送 SSE 流、新实例透传);路径三快照重建兜底(原实例宕机或不可达时从 Redis 重建完整会话,已产生内容可完整恢复)。设计上用“快照一帧恢复”替代逐条重放,避免前端 React 收到密集批量更新被合并成跳变;用路由表 + 内部转发替代 Redis Pub/Sub,避免订阅生效延迟导致新订阅者错过前几条消息,Redis 只存路由信息不参与事件推送。配套 10 秒一次的 SSE 注释行心跳保活,以及用 Redis 原子 SETNX 带 TTL 的分布式锁防止用户双击发送导致的同会话并发请求。模型侧实现容灾:主模型出现 5xx 服务端错误、限流、超时、网络异常等可重试错误时自动切换到备用版本继续服务、用户无感知;4xx 客户端错误不触发切换、直接返回错误让用户修正。