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文档、系统提示词目录
This commit is contained in:
70
test2/server/tests/_test_single.js
Normal file
70
test2/server/tests/_test_single.js
Normal file
@@ -0,0 +1,70 @@
|
||||
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();
|
||||
Reference in New Issue
Block a user