Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
ccran
/
lufa-contract
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
3db30d09
authored
Mar 19, 2026
by
ccran
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat:反思替换为思考模型
parent
4441c13b
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
60 additions
and
67 deletions
+60
-67
core/__pycache__/config.cpython-312.pyc
+0
-0
core/config.py
+11
-5
core/tools/__pycache__/reflect_retry.cpython-312.pyc
+0
-0
core/tools/__pycache__/segment_llm.cpython-312.pyc
+0
-0
core/tools/reflect_retry.py
+49
-62
No files found.
core/__pycache__/config.cpython-312.pyc
View file @
3db30d09
No preview for this file type
core/config.py
View file @
3db30d09
...
...
@@ -16,17 +16,19 @@ MAX_SINGLE_CHUNK_SIZE=5000
META_KEY
=
"META"
DEFAULT_RULESET_ID
=
"通用"
ALL_RULESET_IDS
=
[
"通用"
,
"借款"
,
"担保"
,
"财务口"
,
"金盘"
,
"金盘简化"
]
use_lufa
=
Tru
e
use_lufa
=
Fals
e
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"
]
...
...
core/tools/__pycache__/reflect_retry.cpython-312.pyc
View file @
3db30d09
No preview for this file type
core/tools/__pycache__/segment_llm.cpython-312.pyc
View file @
3db30d09
No preview for this file type
core/tools/reflect_retry.py
View file @
3db30d09
...
...
@@ -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"
:
"补充双方主体信息"
},
]
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment