工程链路与演进方案
面向 ima 知识库 Agent 升级:双轨无条件并发 · 绕过纯文本 Rerank · 组装层同构映射 · 全模态统一演进
检索时延 (1万页)
复杂图纸召回提升
百万页索引存储
客户端改造成本
对 Agent 完全透明
零决策负担。 多模态作为 knowledge_search 底层并发分支,不新增独立工具。避免让 LLM 做图文前置意图分类(消除单点故障),无论是单轮非思考模式还是多轮思考模式,均在 1 轮内获得完整图文证据。
双轨独立直通组装层
绕过纯文本 Rerank。 纯文本 Cross-Encoder 只看文字字符串,会把缺乏 OCR 文字的正确图纸当作“低相关”过滤。Evie 基于 32×64 MaxSim 细粒度全交叉匹配,分数即为精排置信度,卡阈值后直通组装层。
满足轮次与延迟预算
1 轮收敛,≤5s 超时。 ima 非思考模式代码硬约束 max_iterations: 3;工具超时上限 5 秒。假设后台已有 1 万页预编码底库(32 万个 64 维向量常驻 GPU,仅占约 38MB 显存),单 Query 进行 32×64 MaxSim 细粒度全量打分仅需约 1.1 ms,整体耗时完全由慢轨决定(P95 < 350ms),轻松满足 5s 超时约束。
短 ID 与图片引用闭环
图文同构交付。 命中的整页图片经底库字典包装为包含 <img> 的标准分片,分配 [pdf_X] 短 ID。Agent 正常引用,ima 客户端检测到图片标自动浮起高清卡片并支持跳转对应页。
flowchart LR
%% 样式定义
classDef client fill:#f0f9ff,stroke:#0284c7,stroke-width:1.5px,color:#0369a1;
classDef base fill:#f8fafc,stroke:#64748b,stroke-width:1.5px,color:#0f172a;
classDef text fill:#fff7ed,stroke:#ea580c,stroke-width:1.5px,color:#7c2d12;
classDef visual fill:#f0fdf4,stroke:#16a34a,stroke-width:1.5px,color:#14532d;
classDef core fill:#faf5ff,stroke:#9333ea,stroke-width:2px,color:#581c87;
%% 阶段 1: 用户交互与 Agent
User["用户提问
(纯文字 / 带图)"]:::client --> Agent["ima ReAct Agent
(knowledge_search)"]:::base
%% 双轨无条件并发
Agent --> T_Rec["【文本轨】粗排召回
(BM25 + 文本向量 200~700 候选)"]:::text
T_Rec --> T_Rk["文本 Reranker
(Cross-Encoder 卡阈值)"]:::text
T_Rk --> T_Top["文本过线分片
(动态保留)"]:::text
Agent --> V_Rt{"输入有图?"}:::visual
V_Rt -- 纯文本 --> Evie["【视觉轨】Evie d64 K32
(1w页预编码~1.1ms)"]:::visual
V_Rt -- 带图附件 --> Qwen["【视觉轨】Qwen3-VL-2B
(Fused 交叉注意力)"]:::visual
Evie & Qwen --> V_Gt{"分 ≥ 阈值?"}:::visual
V_Gt -- 达标 --> V_Top["视觉过线原页
(直通绕过 Rerank)"]:::visual
V_Gt -- 未达标 --> V_Mute["静默 (100%退还文本)"]:::visual
%% 阶段 3: 组装层并轨
T_Top & V_Top --> CA["【组装层 Context Assembler】
• 双轨动态合并 (直通并轨)
• 反查映射注入 img 原图
• 统一截断 ≤18k token 打短 ID"]:::core
%% 阶段 4: 结果生成与客户端图文闭环
CA --> Answer["Agent 生成回答
标注引用 [pdf_1]"]:::client
Answer --> FE["ima 客户端闭环
• 浮起高清原图卡片
• 点击跳转阅读器对应页"]:::client
flowchart LR
%% 样式定义
classDef inNode fill:#f8fafc,stroke:#64748b,stroke-width:1.5px,color:#0f172a;
classDef stepNode fill:#faf5ff,stroke:#9333ea,stroke-width:1.5px,color:#581c87;
classDef dictNode fill:#fefce8,stroke:#ca8a04,stroke-width:1.5px,color:#713f12;
classDef outNode fill:#f0f9ff,stroke:#0284c7,stroke-width:2px,color:#0369a1;
%% 输入两路
V_In["视觉直通过线结果
(页级: doc_id + page_no)"]:::inNode
T_In["文本 Rerank 过线切片
(块级: 真实 media_id + text)"]:::inNode
%% 步骤 1: 反查映射
V_In --> S1["【步骤 1: 反查映射 Page-to-Chunk】
• 查元数据字典取出该页文本
• 文本末尾嵌入 <img src='...'>
• 转换成与文本轨一致的标准结构"]:::stepNode
MapDict[("底库元数据字典
(Page ↔ Chunk 映射)")]:::dictNode -.-> S1
%% 步骤 2: 双轨合并与同页去重
S1 & T_In --> S2["【步骤 2: 动态并轨与去重】
• 视觉过线页面排在前列
• 文本精排切片紧随其后
• 命中同一页时自动去重"]:::stepNode
%% 步骤 3: Token 预算截断
S2 --> S3["【步骤 3: Token 预算截断】
• 严格对齐 Doc 2 硬上限
• 从前往后累加至 ≤18k token
• 超限后置切片平滑截断"]:::stepNode
%% 步骤 4: 会话短 ID 编码与注册
S3 --> S4["【步骤 4: 会话短 ID 编码与注册】
• 转换为会话短 ID (pdf_1, word_2...)
• 注册映射表 (短 ID ↔ 真实 media_id)"]:::stepNode
%% 输出
S4 --> Out["输出标准 Tool Result 给 Agent
(对 Agent 透明,支持引用跳转)"]:::outNode
图文分流 · 极简路由落地
根据输入模态执行极简 if/else 路由:输入纯文本 Query 走 Evie 压缩 d64 K32(后台 1 万页已编码底库全量 MaxSim 打分仅约 1.1ms,索引存储 3.81 GiB/百万页);输入带图 Query 走 Qwen3-VL-2B (Fused)。绕过传统纯文本 Reranker,组装层注入 <img> 原图标签,以极低侵入性实现企业知识库多模态图文检索高质量落地。
为 EVIE 增加视觉输入,统一为单一模型
核心演进方向:未来为 EVIE 补充视觉输入能力(支持 Query 图像输入与图文混合编码)。将图搜图、图文搜图与文档检索从当前的“两个模型并行(Qwen3-VL-2B + EVIE)”彻底统一收敛至 EVIE 单一多模态检索模型,消除维护双模型异构底座的工程复杂度,实现全模态检索底座归一化。