feat: 法务场景深化-货款催收全流程+合同审查
CI / 后端测试 (push) Has been cancelled
CI / 前端构建 (push) Has been cancelled

后端:
- detect_legal_subscene(): 意图检测,区分催收/审查/通用
- DEBT_COLLECTION_PROMPT: 催收6阶段流程prompt(回款概率+阶段判断+行动建议)
- CONTRACT_REVIEW_PROMPT: 合同审查prompt(风险等级+条款清单+修改建议+谈判要点)
- build_dynamic_prompt: 法务场景自动追加子方向prompt

种子数据:
- seed_debt_templates.py: 5类催收文书模板(催款函/律师函/支付令/财产保全/执行申请)
- seed_contract_risks.py: 5类合同风险条款库(买卖/承揽/租赁/合作/经销)

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
selfrelease
2026-09-01 10:52:12 +08:00
co-authored by Devin
parent 50a9d028c3
commit 4606fcd5c6
4 changed files with 713 additions and 0 deletions
+82
View File
@@ -2989,6 +2989,80 @@ SCENE_PROMPTS: dict[str, str] = {
}
# ===== 法务场景子方向:催收 / 合同审查 =====
# 催收关键词:检测到时激活催收专用 prompt
DEBT_COLLECTION_KEYWORDS = [
"欠款", "拖欠", "催收", "催款", "货款", "回款", "收账", "讨债",
"不付款", "不给钱", "赖账", "跑路", "失联", "欠钱",
"逾期未付", "拖欠货款", "客户欠", "应收账款", "坏账",
"支付令", "强制执行", "财产保全", "冻结账户",
]
# 合同审查关键词
CONTRACT_REVIEW_KEYWORDS = [
"审查合同", "审合同", "看合同", "合同有没有问题", "合同风险",
"合同条款", "这个合同", "帮我看看合同", "合同能不能签",
"违约金过高", "付款条件", "管辖条款", "保密条款",
"合同陷阱", "合同漏洞", "合同问题",
]
def detect_legal_subscene(question: str) -> str:
"""检测法务问题的子方向。
Returns:
'debt_collection' / 'contract_review' / 'general'
"""
q = question.lower()
if any(kw in q for kw in DEBT_COLLECTION_KEYWORDS):
return "debt_collection"
if any(kw in q for kw in CONTRACT_REVIEW_KEYWORDS):
return "contract_review"
return "general"
# 催收专用 prompt 段:追加到法务 system prompt 后
DEBT_COLLECTION_PROMPT = """
【当前问题属于货款催收场景,请按以下框架回答:】
1. **回款概率评估**:根据欠款金额、逾期天数、对方经营状况、证据情况,给出回款概率(高>70%/中30-70%/低<30%)
2. **当前阶段判断**:判断处于催收6阶段中的哪一阶段
- 阶段1:友好催收(0-30天)→ 催收话术 + 催款函
- 阶段2:正式催收(30-60天)→ 律师函 + 施压策略
- 阶段3:支付令(60-90天)→ 支付令申请书(快速司法途径)
- 阶段4:民事诉讼(90天+)→ 起诉状 + 财产保全申请
- 阶段5:庭审准备 → 证据清单 + 代理思路
- 阶段6:强制执行 → 执行申请书 + 财产线索排查
3. **本阶段行动建议**:具体可执行的步骤,包括话术模板、文书要点
4. **关键风险提示**:对方可能转移财产/无财产可供执行/诉讼时效等
5. **下一步预判**:如果本阶段不成功,下一阶段是什么
注意:始终从老板(债权人)视角出发,目标是帮老板最快回款。
"""
# 合同审查专用 prompt 段
CONTRACT_REVIEW_PROMPT = """
【当前问题属于合同审查场景,请按以下框架回答:】
1. **风险等级**:高/中/低(综合评估)
2. **风险条款清单**(按严重程度排序):
- 🔴 高风险条款:说明风险 + 修改建议(给出替代条款文本)
- 🟡 中风险条款:说明风险 + 修改建议
- 🟢 低风险条款:提示即可
3. **缺失条款提醒**:该类合同应有但未约定的条款(如保密/知识产权/退出机制)
4. **谈判要点**:
- 不能让的条款(签了就吃亏)
- 可以让的条款(作为谈判筹码)
- 谈判策略建议
审查维度:付款条款、违约责任、管辖争议、知识产权、退出机制、隐性陷阱(自动续约/排他条款等)。
注意:从老板(合同一方)视角出发,目标是帮老板识别风险、争取有利条款。
"""
def build_dynamic_prompt(scene: str, question: str, kimi_client=None,
fact_summary: str | None = None) -> str:
"""基于场景+问题动态生成定制 system prompt。
@@ -3006,6 +3080,14 @@ def build_dynamic_prompt(scene: str, question: str, kimi_client=None,
"""
base_prompt = SCENE_PROMPTS.get(scene, SCENE_PROMPTS["legal"])
# 法务场景:检测子方向,追加专用 prompt
if scene == "legal":
subscene = detect_legal_subscene(question)
if subscene == "debt_collection":
base_prompt += DEBT_COLLECTION_PROMPT
elif subscene == "contract_review":
base_prompt += CONTRACT_REVIEW_PROMPT
if not kimi_client:
return base_prompt