157 lines
6.7 KiB
JavaScript
157 lines
6.7 KiB
JavaScript
/**
|
||
* 本地模拟多场景验证: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);
|