Files
bigwo/mcp-server-ssh/verify_scenarios.cjs

157 lines
6.7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 本地模拟多场景验证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);