Commit 3db30d09 by ccran

feat:反思替换为思考模型

parent 4441c13b
......@@ -16,17 +16,19 @@ MAX_SINGLE_CHUNK_SIZE=5000
META_KEY="META"
DEFAULT_RULESET_ID = "通用"
ALL_RULESET_IDS = ["通用","借款","担保","财务口","金盘","金盘简化"]
use_lufa = True
use_lufa = False
if use_lufa:
outer_backend_url = "http://znkf.lgfzgroup.com:48081"
base_fastgpt_url = "http://192.168.252.71:18089"
base_backend_url = "http://192.168.252.71:48081"
api_key = "fastgpt-zMavJKKgqA9jRNHLXxzXCVZx1JXxfuNkH1p2qfLhtPfMp41UvdSQvt8"
segment_review_api_key = "fastgpt-zMavJKKgqA9jRNHLXxzXCVZx1JXxfuNkH1p2qfLhtPfMp41UvdSQvt8"
reflect_retry_api_key = "fastgpt-ao3al2vgfnArt9qi2bTpPeRHouCO7qngUZiQsIM1E2x91u22z65J"
else:
outer_backend_url = "http://218.77.58.8:48080"
base_fastgpt_url = "http://192.168.252.71:18088"
base_backend_url = "http://192.168.252.71:48080"
api_key = "fastgpt-vLu2JHAfqwEq5FUQhvATFDK0yDS6fs804v7KwWBMyU4sRrHzh4UGl89Zpa"
segment_review_api_key = "fastgpt-vLu2JHAfqwEq5FUQhvATFDK0yDS6fs804v7KwWBMyU4sRrHzh4UGl89Zpa"
reflect_retry_api_key = "fastgpt-abxzi4CC7SGuVdxDVFmhAFFQHqi6owK5YsIfXdvOMEAcpIhZWDPObTz2Xn"
# 项目根目录
root_path = r"E:\PycharmProject\contract_review_agent"
......@@ -44,8 +46,12 @@ LLM = {
"base_tool_llm": LLMConfig(),
"fastgpt_segment_review": LLMConfig(
base_url=f"{base_fastgpt_url}/api/v1",
api_key=api_key
)
api_key=segment_review_api_key
),
"fastgpt_reflect_retry": LLMConfig(
base_url=f"{base_fastgpt_url}/api/v1",
api_key=reflect_retry_api_key
),
}
doc_support_formats = [".docx", ".doc", ".wps"]
pdf_support_formats = [".txt", ".md", ".pdf"]
......
......@@ -9,54 +9,40 @@ from core.tools.segment_llm import LLMTool
REFLECT_SYSTEM_PROMPT = '''
你是一个合同审查反思智能体(ReviewReflection)。
你的任务不是重新发散式审查整份合同,而是基于已有 findings、facts 和全文上下文,对 findings 进行校验、去重、合并、修订,并输出最终可交付的 findings 列表
你的任务不是重新审查合同,而是基于已有 findings、当前审查规则和合同全文,对 findings 进行复核,输出最终 findings
反思范围
通用反思任务
你只能做以下事情:
1. 删除重复 findings;
2. 删除在全文上下文下不成立或证据不足的 findings;
3. 修订表述不准确、风险程度不合适、建议不够可执行的 findings;
4. 合并指向同一原文实质问题的重复 findings;
5. 仅在多个 findings 在同一审查规则或同一风险模式下形成稳定重复时,新增少量 system/global findings。
【边界约束】
- 不得引入新的审查维度,不得脱离已有 findings 的审查范围自行扩展新问题。
- facts 和全文上下文仅用于验证、修正、去重、合并已有 findings,或支持同一风险模式下的系统性总结。
- 不得仅依据 facts 摘要或抽象概括生成 finding;最终每条 finding 仍必须有合同原文直接引用作为证据。
- global finding 只能来自多个已有 findings 的归纳,不得凭空新增。
【判定原则】
- 若多个 findings 针对同一原文实质问题,仅保留一条更准确、更完整的表述。
- 若某 finding 在全文上下文下被其他条款、定义、附件或事实明确修正、限制或抵消,则删除。
- 若某 finding 方向正确但表述、严重性或建议不准确,则修订后保留。
- 若多个 findings 在同一规则或同一风险模式下重复出现,且有至少两处原文证据支持,可合并为一条 system/global finding。
【证据要求】
- final_findings 中每条都必须证据充分。
- original_texts 必须是合同原文的直接引用,不得改写、概括或臆造。
【输出约束】
- 严格按照 JSON Schema 输出,不得输出任何解释性文字。
2. 删除证据不足或不能由合同原文直接支持的 findings;
3. 删除超出当前审查规则范围的 findings;
4. 修订 issue、result 或 suggestion 不准确的 findings;
5. 合并指向同一原文实质问题的 findings;
6. 基于合同全文对已有 findings 做必要校正。
【通用判定原则】
- findings 只是候选结论,不当然等于最终结论;
- final result 必须以合同全文和当前审查规则为准;
- 每条 final finding 必须有合同原文直接引用;
- original_text 必须能够直接支撑该 finding;
- result 只能为“合格”或“不合格”;
- 若 result 为“合格”,suggestion 填写“无需修改”;
- 若 result 为“不合格”,suggestion 必须具体、可执行;
- 若反思后无成立 findings,返回 {"final_findings": []}。
'''
# TODO 根据需要合并的 finding 的特点
MERGE_FINDINGS_PROMPT = '''
【问题归并规则】
如果多个 findings 属于同一根本问题(root cause),
只保留一条代表性 finding。
代表性 finding 应满足:
- 原文最清晰
- 最容易定位
- 修改建议最完整
其余重复 findings 应删除。
【输出约束】
- 严格输出 JSON;
- 不得输出任何解释性文字。
'''
REFLECT_USER_PROMPT = '''
反思规则】
当前审查规则】
{rule}
【已有风险 findings】
【规则专属反思思路】
{rule_reflection_prompt}
【已有 findings】
{findings_json}
【合同摘要事实记忆 facts】
......@@ -66,17 +52,14 @@ REFLECT_USER_PROMPT = '''
站在 {party_role} 的立场进行反思审查。
【任务】
请输出反思后的最终 findings 列表,可直接用于最终审查报告。你需要:
- 删除重复 findings;
- 删除在全文上下文中不成立或证据不足的 findings;
- 修订表述、严重性或建议不准确的 findings;
- 合并重复 findings,并保留全部关键原文证据;
- 仅在多个 findings 指向同一规则或同一风险模式下的系统性问题时,新增少量 global findings。
请基于通用反思要求、当前审查规则、规则专属反思思路、已有 findings 和合同全文,
输出最终 final_findings。
【特别要求】
- 不得引入新的审查维度;
- 不得仅依据 facts 摘要生成结论;
- 每条 final finding 都必须有合同原文直接引用;
- 仅在已有 findings 的基础上做复核、删除、修订、合并;
- 不得扩展新的审查维度;
- 必须结合合同全文进行校正;
- 每条 final finding 必须包含 result,且 result 只能为“合格”或“不合格”;
- 若无成立 findings,返回 {{"final_findings": []}};
- 仅输出 JSON。
'''
......@@ -88,7 +71,8 @@ OUTPUT_FORMAT_SCHEMA = '''
"segment_id":"合同原文片段所在的段落ID",
"issue": "详细且准确的风险描述,为什么该问题构成风险,需基于规则和文本解释",
"original_text": "合同原文片段的直接引用",
"suggestion": "可直接替换原文、新增条款措辞,或明确的修改方向"
"suggestion": "可直接替换原文、新增条款措辞,或明确的修改方向",
"result": "合格 或 不合格",
}
]
}
......@@ -100,7 +84,7 @@ OUTPUT_FORMAT_SCHEMA = '''
@tool("reflect_retry", "反思重试质量闸")
class ReflectRetryTool(LLMTool):
def __init__(self) -> None:
super().__init__(REFLECT_SYSTEM_PROMPT)
super().__init__(REFLECT_SYSTEM_PROMPT,'fastgpt_reflect_retry')
@tool_func(
{
......@@ -123,6 +107,8 @@ class ReflectRetryTool(LLMTool):
findings_json=json.dumps(base_findings, ensure_ascii=False),
facts_json=json.dumps(facts or [], ensure_ascii=False),
party_role=party_role,
# TODO 不同规则可能有不同的反思思路提示,目前先不区分,后续可根据需要增加规则专属反思思路提示,如针对付款条款审查的反思思路提示、针对担保条款审查的反思思路提示等 --- IGNORE ---
rule_reflection_prompt=None,
) + OUTPUT_FORMAT_SCHEMA
messages = self.build_messages(user_content)
......@@ -155,27 +141,28 @@ if __name__ == "__main__":
tool = ReflectRetryTool()
res = tool.run(
party_role="甲方",
rule={"title":"付款与验收", "segment_id": 3},
rule={"title":"主体审查","rule":"判断双方主体是否存在"},
facts=[
{"segment_id": 3, "支付": {"比例": "30%预付款", "期限": "验收后30日内"}},
{"segment_id": 3, "验收": {"标准": "双方书面确认", "时限": "7个工作日"}},
{"segment_id": 1, "主体": {"甲方": "麓发集团", "乙方": "湖南大学"}},
],
findings=[
{
"rule_title": "付款条款审查",
"segment_id": 3,
"original_text": "甲方在验收合格后30日内支付剩余价款。",
"issue": "未约定逾期付款违约金,约束不足",
"rule_title": "主体审查",
"segment_id": 1,
"original_text": "甲方为麓发集团,乙方为湖南大学。",
"issue": "已经约定双方主体,无问题",
"risk_level": "M",
"suggestion": "增加逾期付款违约金条款,如逾期每日按未付款的0.05%计收"
"result":"合格",
"suggestion": "无需建议"
},
{
"rule_title": "验收条款审查",
"rule_title": "主体审查",
"segment_id": 3,
"original_text": "乙方交付后甲方7个工作日内完成验收。",
"issue": "未明确逾期未验收的后果",
"risk_level": "L",
"suggestion": "补充逾期未验收视为通过或约定明确责任"
"original_text": "",
"issue": "未约定双方主体",
"risk_level": "M",
"result":"不合格",
"suggestion": "补充双方主体信息"
},
]
)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment