fix(bridge): KB 检索尊重 limit/去重并接入 reranker;记录 quality/KB 批次运行结果

This commit is contained in:
wangliang
2026-10-23 11:59:07 +08:00
parent 589e5f9349
commit cdeb30f5c4
4 changed files with 61 additions and 7 deletions
+6 -2
View File
@@ -10,6 +10,8 @@ const { createAgent } = require('./agent');
const { createVerification } = require('./verification');
const { createLibreDeskClient } = require('./libredesk');
const { createRetriever } = require('./rag');
const { createLLM } = require('./llm');
const { createReranker } = require('./reranker');
const prom = require('./prom');
const { ToolError } = require('./errors');
@@ -91,9 +93,11 @@ function createServer(options = {}) {
const verification = options.verification || createVerification(cfg);
const client = options.client || createLibreDeskClient(cfg);
const retriever = options.retriever || (cfg.ragPgUrl ? createRetriever(cfg) : null);
const tools = options.tools || createTools(cfg, { verification, retriever, client });
const llm = options.llm || createLLM(cfg);
const reranker = options.reranker || createReranker(llm);
const tools = options.tools || createTools(cfg, { verification, retriever, client, reranker });
const identity = options.identity || createIdentity(cfg);
const agent = options.agent || createAgent(cfg, { verification, client, retriever });
const agent = options.agent || createAgent(cfg, { verification, client, retriever, reranker, llm });
const libredeskWebhook = options.libredeskWebhook || createLibreDeskWebhook(cfg, { agent });
const byName = new Map(tools.map((t) => [t.name, t]));
const startedAt = Date.now();
+11 -1
View File
@@ -377,7 +377,17 @@ function createTools(cfg, deps = {}) {
const query = String(args.query || '').trim();
if (!query) throw new ToolError(400, 'invalid_arguments', 'query is required');
const limit = Math.min(Number(args.limit) || 5, 8);
let results = await retriever.searchKB(query, Math.max(limit, 8));
// 有 reranker 时多取一些候选再重排;没有 reranker 时必须尊重调用方 limit。
const fetchLimit = reranker ? Math.max(limit, 8) : limit;
let results = await retriever.searchKB(query, fetchLimit);
// parent/child 可能命中同一篇文章:按 question+answer 去重后再重排
const seen = new Set();
results = results.filter((r) => {
const key = `${r.question || ''}\u0000${r.answer || ''}`;
if (seen.has(key)) return false;
seen.add(key);
return true;
});
if (reranker) results = await reranker.rerank(query, results, limit);
return {
results,