feat: 新增预算中心本体与风险规则评分回填
后端新增预算本体解析模块和风险规则评分回填服务,优化规则 生成本体对齐和提示词构建,增强费用类型关键词和本体验证, 完善报销查询和审计接口,前端预算中心页面增加对话框和本 体工具函数,重构审计页面元数据和视图模型,补充单元测试。
This commit is contained in:
@@ -15,8 +15,10 @@ from app.schemas.ontology import (
|
||||
OntologyTimeRange,
|
||||
)
|
||||
from app.services.ontology_rules import (
|
||||
AR_CORE_KEYWORDS,
|
||||
AP_CORE_KEYWORDS,
|
||||
AR_CORE_KEYWORDS,
|
||||
BUDGET_DRAFT_KEYWORDS,
|
||||
BUDGET_OPERATE_KEYWORDS,
|
||||
COMPARE_KEYWORDS,
|
||||
DRAFT_FOLLOW_UP_KEYWORDS,
|
||||
DRAFT_KEYWORDS,
|
||||
@@ -27,13 +29,13 @@ from app.services.ontology_rules import (
|
||||
EXPLAIN_KEYWORDS,
|
||||
GENERIC_EXPENSE_PROMPTS,
|
||||
KNOWLEDGE_INTENTS,
|
||||
LlmOntologyEntityHint,
|
||||
LlmOntologyParseResult,
|
||||
OPERATE_KEYWORDS,
|
||||
QUERY_KEYWORDS,
|
||||
RISK_KEYWORDS,
|
||||
SCENARIO_KEYWORDS,
|
||||
STATUS_KEYWORDS,
|
||||
LlmOntologyEntityHint,
|
||||
LlmOntologyParseResult,
|
||||
)
|
||||
|
||||
logger = get_logger("app.services.ontology")
|
||||
@@ -99,6 +101,9 @@ class OntologyDetectionMixin:
|
||||
|
||||
best_scenario = max(scores, key=scores.get)
|
||||
best_score = scores[best_scenario]
|
||||
if scores.get("budget", 0.0) > 0 and scores["budget"] >= best_score:
|
||||
best_scenario = "budget"
|
||||
best_score = scores["budget"]
|
||||
if best_score <= 0:
|
||||
if "单据" in compact_query and any(
|
||||
keyword in compact_query for keyword in STATUS_KEYWORDS
|
||||
@@ -111,9 +116,10 @@ class OntologyDetectionMixin:
|
||||
scores["expense"],
|
||||
scores["accounts_receivable"],
|
||||
scores["accounts_payable"],
|
||||
scores["budget"],
|
||||
]
|
||||
if max(business_scores) > 0:
|
||||
best_scenario = ("expense", "accounts_receivable", "accounts_payable")[
|
||||
best_scenario = ("expense", "accounts_receivable", "accounts_payable", "budget")[
|
||||
business_scores.index(max(business_scores))
|
||||
]
|
||||
best_score = max(business_scores)
|
||||
@@ -130,6 +136,14 @@ class OntologyDetectionMixin:
|
||||
) -> tuple[str, float]:
|
||||
if any(keyword in compact_query for keyword in OPERATE_KEYWORDS):
|
||||
return "operate", 0.30
|
||||
if scenario == "budget" and any(
|
||||
keyword in compact_query for keyword in BUDGET_OPERATE_KEYWORDS
|
||||
):
|
||||
return "operate", 0.30
|
||||
if scenario == "budget" and any(
|
||||
keyword in compact_query for keyword in BUDGET_DRAFT_KEYWORDS
|
||||
):
|
||||
return "draft", 0.28
|
||||
status_document_query = (
|
||||
"单据" in compact_query
|
||||
and any(keyword in compact_query for keyword in STATUS_KEYWORDS)
|
||||
@@ -383,13 +397,15 @@ class OntologyDetectionMixin:
|
||||
"你的任务是把用户输入解析为固定 JSON,用于后续路由、追问和权限判断。"
|
||||
"只输出 JSON 对象,不要输出 Markdown、代码块、解释、标题或 <think>。"
|
||||
"场景 scenario 只能是:expense, accounts_receivable, "
|
||||
"accounts_payable, knowledge, unknown。"
|
||||
"accounts_payable, budget, knowledge, unknown。"
|
||||
"意图 intent 只能是:query, explain, compare, risk_check, draft, operate。"
|
||||
"如果用户是在描述一笔待处理费用、待报销事项、上传票据或希望整理报销,"
|
||||
"即使没有明确说“生成草稿”,也优先使用 expense + draft。"
|
||||
"如果提供了 conversation_history,必须把最近轮次作为当前追问的上下文,"
|
||||
"正确理解“这个”“那笔”“改成 800”“继续补充”这类省略表达。"
|
||||
"出现“客户”不等于应收,出现“供应商”不等于应付,必须结合动作词和业务目标判断。"
|
||||
"预算编制、预算金额、成本中心、预算科目、预算预警、预算占用、"
|
||||
"剩余预算、可用预算、超预算、预算不足等问题必须使用 budget 场景。"
|
||||
"只有明确查询、统计、列出、多少、明细、对比时才优先使用 query 或 compare。"
|
||||
"附件名称和 OCR 摘要只作为辅助证据,不能编造未出现的事实。"
|
||||
"如果用户明确提到打车、的士票、出租车票、网约车、乘车费、车费等交通票据,"
|
||||
@@ -397,7 +413,8 @@ class OntologyDetectionMixin:
|
||||
"不要输出用户原文未出现、且与规则候选冲突的费用类型。"
|
||||
"信息不足时 clarification_required=true,并给出一句简短中文追问。"
|
||||
"missing_slots 使用简短 snake_case,例如 expense_type, amount, "
|
||||
"customer_name, participants, attachments。"
|
||||
"customer_name, participants, attachments, budget_period, "
|
||||
"budget_subject, budget_amount。"
|
||||
"entity_hints 只填写你比较确定的业务对象;如果不确定,可以返回空数组。"
|
||||
"费用申请场景下,建议把干净的申请事由放入 type=reason,"
|
||||
"把出行方式放入 type=transport_mode,取值优先为飞机、火车、轮船。"
|
||||
@@ -422,6 +439,9 @@ class OntologyDetectionMixin:
|
||||
'"confidence": 0.86},\n'
|
||||
' {"type": "reason", "value": "服务客户业务部署", '
|
||||
'"normalized_value": "服务客户业务部署", "role": "target", '
|
||||
'"confidence": 0.86},\n'
|
||||
' {"type": "budget_subject", "value": "差旅费", '
|
||||
'"normalized_value": "travel", "role": "filter", '
|
||||
'"confidence": 0.86}\n'
|
||||
" ]\n"
|
||||
"}"
|
||||
|
||||
Reference in New Issue
Block a user