feat: 小财管家意图规划与报销提交编排增强
- 完善管家意图识别、模型计划构建与规划器调度 - 重构差旅报销提交编排器与管家计划流程前端交互 - 优化报销消息项样式与文档中心视图 - 新增小财管家与附件上传风险前置复核设计文档 - 补充管家规划器与文档中心测试覆盖
This commit is contained in:
@@ -148,7 +148,7 @@ class StewardPlannerService:
|
||||
drafts: list[PlannedTaskDraft] = []
|
||||
first_reimbursement = self._find_first_reimbursement_index(message)
|
||||
application_source = message[:first_reimbursement] if first_reimbursement >= 0 else message
|
||||
if self._looks_like_application(application_source):
|
||||
if self._looks_like_application(application_source) or self._looks_like_future_travel_application(application_source):
|
||||
drafts.append(
|
||||
PlannedTaskDraft(
|
||||
task_type="expense_application",
|
||||
@@ -180,6 +180,31 @@ class StewardPlannerService:
|
||||
compact = re.sub(r"\s+", "", text)
|
||||
return bool(compact) and "申请" in compact and bool(re.search(r"出差|差旅|费用|交通|住宿|采购|会务|会议", compact))
|
||||
|
||||
@staticmethod
|
||||
def _looks_like_future_travel_application(text: str) -> bool:
|
||||
compact = re.sub(r"\s+", "", text)
|
||||
if not compact or "报销" in compact:
|
||||
return False
|
||||
business_signal = re.search(
|
||||
r"出差|差旅|客户现场|项目|部署|实施|支撑|支持|协助|拜访|调研|培训|会议|驻场|上线|验收",
|
||||
compact,
|
||||
)
|
||||
route_signal = re.search(
|
||||
fr"(?:去|到|赴|前往)({'|'.join(CITY_NAMES)})",
|
||||
compact,
|
||||
)
|
||||
time_signal = re.search(
|
||||
r"明天|后天|下周|下月|近期|月底|\d{1,2}月\d{1,2}(?:日|号)?|"
|
||||
r"\d{4}[-/年]\d{1,2}[-/月]\d{1,2}(?:日)?|[0-9一二两三四五六七八九十]+天",
|
||||
compact,
|
||||
)
|
||||
planned_route_signal = re.search(
|
||||
r"(?:去|到|赴|前往).{0,24}(?:出差|差旅|客户|现场|项目|部署|实施|支撑|支持|协助|拜访|调研|培训|会议|驻场|上线|验收)|"
|
||||
r"(?:出差|差旅).{0,24}(?:[0-9一二两三四五六七八九十]+天|客户|现场|项目|部署|实施|支撑|支持|协助|拜访|调研|培训|会议|驻场|上线|验收)",
|
||||
compact,
|
||||
)
|
||||
return bool((business_signal or route_signal) and (time_signal or planned_route_signal))
|
||||
|
||||
def _build_task(
|
||||
self,
|
||||
draft: PlannedTaskDraft,
|
||||
@@ -352,7 +377,12 @@ class StewardPlannerService:
|
||||
@staticmethod
|
||||
def _resolve_task_confidence(segment: str, fields: dict[str, str], task_type: str) -> float:
|
||||
compact = re.sub(r"\s+", "", segment)
|
||||
intent_score = 1.0 if ("申请" in compact if task_type == "expense_application" else "报销" in compact) else 0.45
|
||||
if task_type == "expense_application":
|
||||
intent_score = 1.0 if (
|
||||
"申请" in compact or StewardPlannerService._looks_like_future_travel_application(compact)
|
||||
) else 0.45
|
||||
else:
|
||||
intent_score = 1.0 if "报销" in compact else 0.45
|
||||
time_score = 1.0 if fields.get("time_range") else 0.0
|
||||
location_score = 1.0 if fields.get("location") else 0.2
|
||||
scene_score = 1.0 if fields.get("expense_type") and fields["expense_type"] != "other" else 0.35
|
||||
|
||||
Reference in New Issue
Block a user