// 教学用检索规则实验。无网络、无模型、无向量库;不是生产性能评测。 // Run: node knowledge-base-lab.mjs (Node.js 18+) import assert from 'node:assert/strict'; const documents = [ { id: 'travel-v1', status: 'retired', roles: ['employee', 'admin'], terms: ['报销'], text: '虚构旧制度:差旅标准 200 元。' }, { id: 'travel-v2', status: 'active', roles: ['employee', 'admin'], terms: ['报销'], text: '虚构现行制度:差旅标准 300 元。' }, { id: 'ops-admin', status: 'active', roles: ['admin'], terms: ['运维轮换'], text: '虚构管理员运维轮换流程:由值班负责人复核。' }, { id: 'meal-v1', status: 'active', roles: ['employee', 'admin'], terms: ['餐补'], text: '虚构餐补制度:按出勤记录审核。' }, ]; const fixtures = [ { id: 'current-version', query: '报销标准', role: 'employee', expected: 'travel-v2' }, { id: 'synonym', query: '出差能报多少', role: 'employee', expected: 'travel-v2' }, { id: 'denied', query: '运维轮换流程', role: 'employee', expected: null }, { id: 'allowed', query: '运维轮换流程', role: 'admin', expected: 'ops-admin' }, { id: 'missing', query: '宠物托管规则', role: 'employee', expected: null }, { id: 'ordinary', query: '餐补怎么申请', role: 'employee', expected: 'meal-v1' }, ]; const match = (doc, query) => doc.terms.some(term => query.includes(term)); const baseline = ({ query }) => documents.find(doc => match(doc, query))?.id ?? null; const guarded = ({ query, role }) => { const normalized = query.replaceAll('出差', '报销'); return documents.filter(doc => doc.status === 'active' && doc.roles.includes(role)) .find(doc => match(doc, normalized))?.id ?? null; }; const results = fixtures.map(test => ({ case: test.id, query: test.query, role: test.role, expected: test.expected, baseline: baseline(test), guarded: guarded(test), })); for (const result of results) assert.equal(result.guarded, result.expected, result.case); const baselinePasses = results.filter(row => row.baseline === row.expected).length; assert.equal(baselinePasses, 3, 'Fixture baseline changed: review the article before updating expectations.'); console.table(results); console.log(JSON.stringify({ fixtureCount: fixtures.length, baselinePasses, guardedPasses: results.length, scope: '人工构造固定样例;仅检索规则;不调用LLM;不衡量回答正确率或生产安全性。' }, null, 2));