fix(kb): improve retrieval resilience on per-KB failure and rerank selection (#9122)

* fix(kb): improve retrieval resilience on per-KB failure and rerank selection

- Remove RuntimeError on single-KB dense retrieval failure: always skip
  the faulty KB and return partial results instead of crashing.
- Simplify rerank provider selection: remove redundant rerank_pi check
  since the provider is already loaded from that ID.

* fix(kb): simplify rerank selection loop, improve dense retrieval error log
This commit is contained in:
lxfight
2026-07-03 22:12:24 +08:00
committed by GitHub
parent aecee6fc9f
commit 468eea99c6

View File

@@ -171,21 +171,12 @@ class RetrievalManager:
# 5. Rerank
first_rerank = None
for kb_id in kb_ids:
vec_db = kb_options[kb_id]["vec_db"]
for kb_opt in kb_options.values():
vec_db = kb_opt.get("vec_db")
rerank_provider = (
getattr(vec_db, "rerank_provider", None) if vec_db else None
)
if rerank_provider is None:
continue
rerank_pi = kb_options[kb_id]["rerank_provider_id"]
if (
vec_db
and rerank_provider
and rerank_pi
and rerank_pi == rerank_provider.meta().id
):
if rerank_provider is not None:
first_rerank = rerank_provider
break
if first_rerank and retrieval_results:
@@ -237,10 +228,11 @@ class RetrievalManager:
all_results.extend(vec_results)
except Exception as e:
logger.error(f"知识库 {kb_id} 稠密检索失败: {e}", exc_info=True)
if len(kb_ids) == 1:
raise RuntimeError(f"知识库 {kb_id} 稠密检索失败: {e}") from e
# multi-KB: skip the faulty KB and continue
logger.error(
f"知识库 {kb_id} 稠密检索失败: {type(e).__name__}: {e}",
exc_info=True,
)
# skip the faulty KB and continue
# 按相似度排序并返回 top_k
all_results.sort(key=lambda x: x.similarity, reverse=True)