/** * 本地模拟多场景验证:toolExecutor.js 修复后的路由和分类逻辑 */ const path = require('path'); // 模拟环境变量(模拟服务器配置) process.env.VOLC_ARK_ENDPOINT_ID = 'ep-xxx'; process.env.VOLC_ARK_API_KEY = 'fake-key'; process.env.VOLC_ARK_KNOWLEDGE_BASE_IDS = 'kb-f94cc30193b3b707,kb-a69b0928e1714de7,kb-a6c238e38ca81478,kb-149300b22195d2bf,kb-c7e7cd2bf0580fa0,kb-177fb1d978d88e0e'; process.env.VOLC_ARK_KNOWLEDGE_BASE_ROUTING = JSON.stringify([ {"name":"product","dataset_ids":["kb-f94cc30193b3b707"],"keywords":["pm产品","fitline","pm-fitline","产品","细胞营养素","activize","oxyplus","basics","restorate","儿童倍适","ntc","营养保送","小红产品","大白产品","小白产品","火炉原理","阿育吠陀","成分","功效","吃法","用法","服用","好转反应","活动","促销","分数"]}, {"name":"company","dataset_ids":["kb-a69b0928e1714de7"],"keywords":["pm公司","德国pm公司","公司","地址","电话","联系方式","实力","背景","成立","总部","分公司"]}, {"name":"training","dataset_ids":["kb-a6c238e38ca81478"],"keywords":["培训","新人","起步三关","精品会议","会议组织","成长上总裁","团队培训","新人入门"]}, {"name":"investment","dataset_ids":["kb-149300b22195d2bf"],"keywords":["招商","代理","代理商","合作","加盟","招募","事业机会","创业","招商稿"]}, {"name":"system","dataset_ids":["kb-c7e7cd2bf0580fa0"],"keywords":["一成系统","ai众享","数字化工作室","盛咖学愿","系统","邀约话术","文化解析","ai赋能","团队发展"]}, {"name":"general","dataset_ids":["kb-177fb1d978d88e0e"],"keywords":["一成ai","ai落地","转观念","对比","综合知识库"]} ]); // 加载修复后的 toolExecutor const ToolExecutor = require(path.join(__dirname, '..', 'test2', 'server', 'services', 'toolExecutor')); console.log('====== 多场景逻辑验证 ======\n'); // 场景定义 const scenarios = [ { name: '场景1: 德国PM基础三合一(截图问题)', query: '给我介绍一下德国PM的基础三合一吧?', context: [], expectRoute: 'product', expectDeterministic: '德国PM细胞营养素 基础套装 大白 小红 小白', }, { name: '场景2: 我们公司的产品(上下文有基础套装)', query: '介绍一下我们公司的产品。', context: [ { role: 'user', content: '基础三合一是什么?' }, { role: 'assistant', content: '德国PM细胞营养素基础套装包括大白、小红、小白三款产品。' }, ], expectRoute: 'product', expectDeterministic: '德国PM FitLine 细胞营养素产品 大白Basics 小红Activize 小白Restorate 儿童倍适', }, { name: '场景3: 德国PM公司介绍(纯公司查询)', query: '介绍一下德国PM公司', context: [], expectRoute: 'company', }, { name: '场景4: 德国PM产品(产品+德国PM混合)', query: '德国PM的产品有哪些', context: [], expectRoute: 'product', }, { name: '场景5: 一成系统(系统优先路由)', query: '一成系统是什么', context: [], expectRoute: 'system', }, { name: '场景6: 河南胡辣汤(闲聊,不走知识库)', query: '河南胡辣汤', context: [], expectRoute: 'default_or_none', }, { name: '场景7: 追问"这个怎么用"(上下文有小红产品)', query: '这个怎么用', context: [ { role: 'user', content: '小红产品是什么?' }, { role: 'assistant', content: 'Activize Oxyplus 是...' }, ], expectDeterministic: 'Fitline小红产品提升能量原理', }, { name: '场景8: classifyKnowledgeAnswer - 未命中模式1', query: 'test', classifyContent: '关于PM细胞营养素基础套装,目前我这边没有找到这三个产品的具体成分和功效说明。建议你直接查看产品包装上的详细信息,或联系官方客服获取准确的使用指导。', expectHit: false, }, { name: '场景9: classifyKnowledgeAnswer - 未命中模式2', query: 'test', classifyContent: '我没有找到德国PM细胞营养素基础三合一的相关介绍。你是想了解它的成分、功效,还是使用方法呢?', expectHit: false, }, { name: '场景10: classifyKnowledgeAnswer - 正常命中', query: 'test', classifyContent: 'PM细胞营养素基础套装包含大白Basics、小红Activize和小白Restorate三款产品,通过NTC营养保送系统发挥协同作用。', expectHit: true, }, { name: '场景11: 招商合作', query: '怎么加盟代理', context: [], expectRoute: 'investment', }, { name: '场景12: 新人培训', query: '新人起步三关是什么', context: [], expectRoute: 'training', }, ]; let passed = 0; let failed = 0; for (const s of scenarios) { console.log(`--- ${s.name} ---`); // 测试 classifyKnowledgeAnswer if (s.classifyContent !== undefined) { const result = ToolExecutor.classifyKnowledgeAnswer(s.query, s.classifyContent); const ok = result.hit === s.expectHit; console.log(` classify hit=${result.hit} reason=${result.reason} ${ok ? '✅' : '❌ EXPECTED hit=' + s.expectHit}`); if (ok) passed++; else failed++; console.log(''); continue; } // 测试路由 const context = s.context || []; const normalizedQuery = ToolExecutor.normalizeKnowledgeQueryAlias(s.query); const anchored = ToolExecutor.applyKnowledgeQueryAnchor(normalizedQuery); const deterministicQuery = ToolExecutor.buildDeterministicKnowledgeQuery(anchored, context); const effectiveQuery = deterministicQuery || anchored; const kbTarget = ToolExecutor.selectKnowledgeBaseTargets(effectiveQuery, context); console.log(` normalized: "${normalizedQuery}"`); console.log(` deterministic: "${deterministicQuery}"`); console.log(` effective: "${effectiveQuery}"`); console.log(` routes: [${kbTarget.matchedRoutes.join(', ')}]`); console.log(` datasets: [${kbTarget.datasetIds.join(', ')}]`); if (s.expectDeterministic) { const ok = deterministicQuery === s.expectDeterministic; console.log(` deterministic check: ${ok ? '✅' : '❌ EXPECTED "' + s.expectDeterministic + '"'}`); if (ok) passed++; else failed++; } if (s.expectRoute) { const ok = s.expectRoute === 'default_or_none' ? kbTarget.matchedRoutes.includes('default') || kbTarget.matchedRoutes.length === 0 : kbTarget.matchedRoutes.includes(s.expectRoute); console.log(` route check: ${ok ? '✅' : '❌ EXPECTED route=' + s.expectRoute}`); if (ok) passed++; else failed++; } console.log(''); } console.log(`\n====== 结果:${passed} 通过, ${failed} 失败 ======`); if (failed > 0) process.exit(1);