Files
bigwo/test2/server/tests/_test_single.js
User 9567eb7358 feat(server): KB prompt优化、字幕修复、S2S重连、助手配置API
- assistantProfileConfig: KB answer prompt改为分层策略(严格产品信息+灵活常识补充)
- nativeVoiceGateway: S2S upstream自动重连(最多50次)、event 351字幕debounce(800ms取最长文本)
- toolExecutor: 确定性query改写增强、KB查询传递session上下文
- contextKeywordTracker: 支持KB话题记忆优先enrichment
- contentSafeGuard: 新增品牌安全内容过滤服务
- assistantProfileService: 新增助手配置CRUD服务
- routes/assistantProfile: 新增助手配置API路由
- knowledgeKeywords: 扩展KB关键词词典
- fastAsrCorrector: ASR纠错规则更新
- tests/: KB prompt测试、保护窗口测试、Viking性能测试
- docs/: 助手配置API文档、系统提示词目录
2026-03-24 17:19:36 +08:00

71 lines
3.0 KiB
JavaScript
Raw 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.

const path = require('path');
const https = require('https');
const fs = require('fs');
// 加载 .env
const envPath = path.join(__dirname, '../.env');
if (fs.existsSync(envPath)) {
fs.readFileSync(envPath, 'utf8').split('\n').forEach(line => {
const t = line.trim();
if (!t || t.startsWith('#')) return;
const i = t.indexOf('=');
if (i > 0) {
const k = t.slice(0, i).trim();
let v = t.slice(i + 1).trim();
if ((v.startsWith('"') && v.endsWith('"')) || (v.startsWith("'") && v.endsWith("'")))
v = v.slice(1, -1);
if (!process.env[k]) process.env[k] = v;
}
});
}
const PROMPT = '你是大沃的智能助手负责回答与PM-FitLine德国产品相关的问题。知识库涵盖近50款PM-FitLine产品的完整资料成分、用法、剂量、价格、规格、搭配方案、好转反应等及117个常见问答。回答规则产品相关具体信息必须严格依据知识库不得猜测或自行补充公司背景、健康常识可适当补充。产品常有别名小红=艾特维、大白=倍适、小白=维适多等请注意识别。不得编造产品名或数据。PM是营养品非药物涉及疾病建议咨询医生。若知识库无相关内容坦诚说明并建议咨询推荐人。回答口语化、简洁1-3句给结论150字内。';
const QUERY = process.argv[2] || '一成系统 赋能 德国PM';
const m = process.env.VOLC_ARK_KB_MODEL || process.env.VOLC_ARK_KNOWLEDGE_ENDPOINT_ID;
const ak = process.env.VOLC_ARK_API_KEY || process.env.VOLC_ACCESS_KEY_ID;
const ids = (process.env.VOLC_ARK_KNOWLEDGE_BASE_IDS || '').split(',').map(s => s.trim()).filter(Boolean);
const th = parseFloat(process.env.VOLC_ARK_KNOWLEDGE_THRESHOLD) || 0.3;
const body = JSON.stringify({
model: m,
messages: [
{ role: 'system', content: PROMPT },
{ role: 'user', content: QUERY },
],
metadata: { knowledge_base: { dataset_ids: ids, top_k: 3, threshold: th } },
stream: false,
max_tokens: 80,
thinking: { type: 'disabled' },
});
const t0 = Date.now();
const req = https.request({
hostname: 'ark.cn-beijing.volces.com',
path: '/api/v3/chat/completions',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${ak}`,
'Content-Length': Buffer.byteLength(body),
},
timeout: 15000,
}, (res) => {
let chunks = [];
res.on('data', c => chunks.push(c));
res.on('end', () => {
const j = JSON.parse(Buffer.concat(chunks).toString());
const content = j.choices?.[0]?.message?.content || '(empty)';
const u = j.usage || {};
const ms = Date.now() - t0;
const isNoHit = /未找到|未提及|暂无|没有相关|无法|不确定/.test(content);
console.log(`\n检索词: "${QUERY}"`);
console.log(`延迟: ${ms}ms | tokens: ${u.prompt_tokens}->${u.completion_tokens} | ${isNoHit ? '❌NO-HIT' : '✅HIT'}`);
console.log(`\n回答:\n${content}\n`);
});
});
req.on('error', e => console.error('ERROR:', e.message));
req.write(body);
req.end();