检索可见性对照器
admin/审计专用的检索可见性对照器(安全对照组件,组件头常驻警示条:命中差异对照对普通用户构成泄露——任何随受限集合变化的可观察量都是侧信道):固定身份集 × 同一查询的命中对照网格,每身份一列(有效角色 + 授权集合内安全计数 + 命中列表),可见性五级呈现(hidden 不渲染 / metadata 锁+标题+打码+申请 / restricted 附申请通道 / summary AI 摘要可见原文不可用 / full 正常);过滤层徽标三态(pre ✓ 唯一安全基线——ANN 与 BM25 两侧同时生效 / post ⚠ 分数已可观察——缺陷层 / none ✕ fail-open——Kendra 教训);教学段讲 volume leakage 与 padding 取整缓解。renderKbVisibility(el, { query, identities, hits, evaluateHit }) → handle { setFilterLayer(l), getVisibility(id, hit) }。
切身份 chip / 过滤层徽标派发事件 · metadata 列打码、summary 列给 AI 摘要、hidden 不渲染 · 此对照仅 admin 审计可用
<div id="kb-visibility-demo"> <div class="kb-visibility"> <div class="kb-visibility-warn">admin 审计视图——勿嵌入终端用户界面</div> <div class="kb-visibility-bar"><span class="kb-meta">身份 chip 组 · 查询回显 · 过滤层徽标(pre ✓ / post ⚠ / none ✕)</span></div> <div class="kb-visibility-grid"> <div class="kb-visibility-col"> <header>张三 · 华东销售部</header> <div class="kb-visibility-count kb-num">安全计数 4</div> <div class="kb-visibility-hit" data-visibility="metadata"><span>2026 财务规划</span><span class="kb-visibility-snippet"></span></div> </div> <div class="kb-visibility-col"> <header>王五 · 财务部</header> <div class="kb-visibility-count kb-num">安全计数 6</div> <div class="kb-visibility-hit" data-visibility="full"><span>2026 财务规划</span><span class="kb-visibility-snippet">含 Q4 预算缺口与降本目标……</span></div> </div> <div class="kb-visibility-col"> <header>系统审计员</header> <div class="kb-visibility-count kb-num">安全计数 5</div> <div class="kb-visibility-hit" data-visibility="summary"><span>并购意向简报</span><span class="kb-visibility-summary">拟收购标的与估值区间(AI 摘要可见,原文受限)</span></div> </div> </div> <div class="kb-visibility-lesson">计数差异 = volume leakage(缓解只有 padding 取整);post-filter 的分数已可观察;fail-open 是 Kendra 无 UserContext 的教训。</div> </div></div><p class="demo-label" id="kb-visibility-log" style="margin-top:8px">切身份 chip / 过滤层徽标派发事件 · metadata 列打码、summary 列给 AI 摘要、hidden 不渲染 · 此对照仅 admin 审计可用</p> 安装
bun add @icen.ai/ui pnpm add @icen.ai/ui npm install @icen.ai/ui yarn add @icen.ai/ui 一行引入该组件(CSS 与 behavior 自动带上,无需关心内部 CSS 文件名):
import '@icen.ai/ui/kit/kb-visibility'; 也可以用脚手架直接打印引入行:
bunx --bun @icen.ai/ui add kb-visibility
Astro 项目注意:kit 入口里的 CSS import 在页面 <script> 里会被 Astro 的 client bundle 摇掉——请改在布局 frontmatter 里引 CSS(import '@icen.ai/ui/components/kb-perm.css';),JS 行为仍可走 kit。Vite SPA / webpack 项目无此问题。
用法
import { renderKbVisibility } from '@icen.ai/ui/kit/kb-visibility';import type { KbVisibility } from '@icen.ai/ui/kit/kb-core'; const vis = renderKbVisibility(el, { query: 'Q3 目标 · 财务规划 · 供应商准入', identities: [ // 固定身份集(服务端 token;不接受自由输入) { user: 'zhangsan', label: '张三 · 华东销售部', groups: ['sales-east', 'project-q3'] }, { user: 'wangwu', label: '王五 · 财务部', groups: ['finance-team', 'auditors'] }, { user: 'auditor', label: '系统审计员', groups: ['auditors', 'compliance'] }, ], hits: [ { id: 'h-1', title: '2026 财务规划', snippet: '含 Q4 预算缺口与降本目标……', summary: '财务规划要点的 AI 摘要(原文受限)' }, ], evaluateHit: (hit, identity): KbVisibility => policyEngine(identity, hit), // 缺省走 hit 自带 visibility});vis.setFilterLayer('pre'); // pre ✓(唯一安全基线)/ post ⚠(分数可观察)/ none ✕(fail-open)vis.getVisibility('zhangsan', hits[0]!); // 指定身份对指定命中的可见性// 事件:icen:kb-visibility-identity {identity} / icen:kb-visibility-layer {layer}