67 lines
2.6 KiB
Python
67 lines
2.6 KiB
Python
"""AI PMO kernel intent resolve mixin."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from . import ai_pmo_kernel_common as _common
|
|
|
|
for _name, _value in vars(_common).items():
|
|
if not _name.startswith("__"):
|
|
globals()[_name] = _value
|
|
|
|
|
|
class KernelIntentResolveMixin:
|
|
async def _resolve_intent(
|
|
self,
|
|
*,
|
|
message_text: str,
|
|
session: Optional[ConversationSession],
|
|
world_model: dict[str, Any],
|
|
) -> tuple[CanonicalIntent, str]:
|
|
project_id = _safe_int(world_model.get("resolved_project_id"))
|
|
raw_rule_intent = self.intent_resolver.resolve(text=message_text, project_id=project_id)
|
|
rule_intent = self._apply_slot_guard(intent=raw_rule_intent, message_text=message_text)
|
|
# 查询/噪音场景优先走规则意图,避免额外触发 LLM 分类链路导致不必要失败重试。
|
|
if rule_intent.name in {INTENT_QUERY, INTENT_IGNORE} and float(rule_intent.confidence or 0.0) >= 0.85:
|
|
return rule_intent, "rule_preferred"
|
|
if self._is_short_confirmation_message(message_text=message_text, session=session):
|
|
if session is None:
|
|
return rule_intent, "rule_fallback"
|
|
return (
|
|
self._build_short_confirm_intent(
|
|
message_text=message_text,
|
|
session=session,
|
|
world_model=world_model,
|
|
),
|
|
"session_inherited",
|
|
)
|
|
|
|
# 默认规则优先:仅在规则低置信/默认兜底时才触发 LLM。
|
|
if not self._intent_llm_enabled():
|
|
return rule_intent, "rule_fallback"
|
|
if not self._should_invoke_llm_last_resort(rule_intent=rule_intent):
|
|
return rule_intent, "rule_preferred"
|
|
|
|
llm_intent = await self._resolve_intent_with_llm(
|
|
message_text=message_text,
|
|
session=session,
|
|
world_model=world_model,
|
|
rule_intent=rule_intent,
|
|
)
|
|
if llm_intent is not None:
|
|
if self._intent_arbitration_enabled():
|
|
selected_intent, source = self._arbitrate_intent(
|
|
rule_intent=rule_intent,
|
|
llm_intent=llm_intent,
|
|
message_text=message_text,
|
|
)
|
|
else:
|
|
selected_intent, source = llm_intent, "llm"
|
|
return self._apply_slot_guard(intent=selected_intent, message_text=message_text), source
|
|
logger.info(
|
|
"ai_pmo_intent_rule_fallback",
|
|
tenant_id=self.tenant_id,
|
|
reason="intent_llm_empty_or_failed_or_timeout",
|
|
)
|
|
return rule_intent, "rule_fallback"
|
|
|