package com.superbiz.agent.service; import com.superbiz.agent.dto.KnowledgeQuery; import org.springframework.stereotype.Service; import java.util.List; /** * 检索前的 query 理解层(L0 出口)。 * *
输入是 Agent 的原始检索句,输出 {@link KnowledgeQuery},供后续 L1 过滤与 rerank 使用。
* *{@code categoryFilter} 仅在 L0 恰好命中一个 domain 时非空; * 多 domain 或零 domain 时为 null,避免错误收窄召回。
*/ public KnowledgeQuery transform(String rawQuery) { String normalized = rawQuery == null ? "" : rawQuery.trim(); KnowledgeIndexService.L0Hint hint = knowledgeIndexService.analyzeQuery(normalized); return KnowledgeQuery.builder() .originalQuery(normalized) // 预留改写字段;当前未实现 rewrite,保持与 original 一致 .rewrittenQuery(normalized) .domainHints(safeList(hint.domains())) .matchedKeywords(safeList(hint.matchedKeywords())) .entities(safeList(hint.entities())) // 只有唯一 domain 才作为向量 metadata 的 category 过滤条件 .categoryFilter(hint.singleDomainOrNull()) .l0Titles(safeList(hint.titles())) .l0MatchCount(hint.matches() == null ? 0 : hint.matches().size()) .build(); } private List