# 合同审查智能体 (Contract Review Agent)

一个基于 FastAPI 和大型语言模型 (LLM) 的智能合同审查系统，能够自动分析合同条款、识别风险并提供审查建议。

## 📋 项目概述

本项目是一个智能合同审查代理，通过以下流程实现合同自动化审查：

1. **文档解析** - 支持多种格式的合同文档解析
2. **分段处理** - 将合同按规则智能分段
3. **事实提取** - 从每个分段中提取与审查规则相关的客观事实
4. **规则审查** - 基于预设规则对提取的事实进行审查
5. **风险复核** - 对审查结果进行反思和复核
6. **结果合并** - 合并所有分段审查结果生成最终报告

## 🏗️ 项目结构

```
lufa-contract/
├── main.py              # FastAPI 主应用入口
├── test.py              # 测试脚本
├── core/                # 核心业务逻辑
│   ├── cache.py         # 缓存管理
│   ├── config.py        # 配置管理
│   ├── memory.py        # 记忆/状态管理
│   ├── tool.py          # 工具基类
│   └── tools/           # 具体工具实现
│       ├── segment_summary.py      # 分段事实提取
│       ├── segment_review.py       # 分段规则审查
│       ├── segment_rule_router.py  # 规则路由
│       ├── retrieve_reference.py   # 参考检索
│       ├── reflect_retry.py        # 反思重试
│       └── segment_merger.py       # 结果合并
├── data/                # 数据文件
│   ├── rules.xlsx       # 审查规则表
│   ├── batch/           # 批量处理数据
│   └── benchmark/       # 基准测试数据
├── utils/               # 工具函数
│   ├── common_util.py   # 通用工具
│   ├── http_util.py     # HTTP 工具
│   └── doc_util.py      # 文档工具
├── demo/                # 演示文件
├── tmp/                 # 临时文件
└── .vscode/             # VSCode 配置
```

## 🔧 技术栈

- **后端框架**: FastAPI
- **LLM 服务**: Qwen2-72B-Instruct (可配置)
- **文档处理**: 支持 PDF、Word 等多种格式
- **日志**: Loguru
- **数据验证**: Pydantic

## 📦 核心功能

### 1. 分段事实提取 (SegmentSummary)
基于审查规则从合同分段中提取客观事实，确保：
- 事实可在原文中直接找到
- 不做抽象、概括或推断
- 不补充未出现的主体、条件或数值

### 2. 分段规则审查 (SegmentReview)
对提取的事实进行规则匹配和风险分析，输出：
- 风险等级 (H/M/L)
- 审查结论
- 修改建议

### 3. 反思重试 (ReflectRetry)
对审查结果进行自我反思，识别潜在问题并重试

### 4. 结果合并 (SegmentMerger)
合并所有分段的审查结果，生成完整的审查报告

## ⚙️ 配置说明

在 `core/config.py` 中可配置：

```python
# LLM 配置
LLMConfig:
  base_url: "http://192.168.252.71:9002/v1"
  model: "Qwen2-72B-Instruct"

# 审查规则集
ALL_RULESET_IDS = ["通用", "借款", "担保", "财务口", "金盘", "金盘简化"]

# 分段大小控制
MAX_SINGLE_CHUNK_SIZE = 5000
```

## 🚀 快速开始

### 1. 安装依赖

```bash
pip install fastapi uvicorn pydantic loguru
```

### 2. 启动服务

```bash
python main.py
```

服务将在 `http://localhost:8000` 启动

### 3. API 端点

- `POST /sleep` - 测试端点
- `POST /document/parse` - 解析合同文档
- `POST /contract/review` - 执行合同审查
- `GET /contract/{conversation_id}/result` - 获取审查结果

## 📝 使用示例

### 提交合同审查请求

```python
import requests

# 上传合同文档
response = requests.post(
    "http://localhost:8000/document/parse",
    json={
        "conversation_id": "unique-conversation-id",
        "file_url": "http://example.com/contract.pdf",
        "ruleset_id": "通用"
    }
)

# 获取审查结果
result = requests.get(
    f"http://localhost:8000/contract/{response.json()['conversation_id']}/result"
)
```

## 🔐 安全说明

- API Key 配置在 `core/config.py` 中
- 支持内外网环境切换 (`use_lufa` 参数)
- 临时文件自动清理

## 📊 数据格式

### 审查结果结构

```json
{
  "conversation_id": "xxx",
  "findings": [
    {
      "segment_id": "seg_001",
      "rule_id": "rule_001",
      "risk_level": "H",
      "fact": "提取的事实",
      "conclusion": "审查结论",
      "suggestion": "修改建议"
    }
  ]
}
```

## 🛠️ 开发指南

### 添加新的审查规则

1. 在 `data/rules.xlsx` 中添加新规则
2. 更新 `core/config.py` 中的规则集配置
3. 重启服务

### 自定义 LLM 模型

修改 `core/config.py` 中的 `LLMConfig`:

```python
LLMConfig:
  base_url: "你的 LLM 服务地址"
  model: "你的模型名称"
```

### 📊 评估与回归测试流程

**目标**：验证规则修改后的效果，对比 F1 值变化。

**步骤**：
1. **重启服务**（重新加载 `rules.xlsx`）：
   ```bash
   tmux attach -t jp
   # Ctrl+C 中断当前进程
   conda activate lufa && python main.py
   # Ctrl+D 退出 tmux
   ```

2. **运行批处理**（在 `tmux batch` 会话中）：
   ```bash
   tmux attach -t batch
   conda activate lufa
   python data/batch/batch.py
   # 等待约 20-30 分钟，直到看到 "all done."
   ```

3. **运行评估**（批处理完成后）：
   ```bash
   cd /home/ccran/lufa-contract
   python data/benchmark/eval.py --datasets-dir jp-output-lufa --val-dir jp-output-lufa-val
   ```

4. **查看结果**：
   评估结果会生成在 `data/benchmark/results/` 目录下，查看 `.log` 文件中的 F1 值：
   ```bash
   grep -E "付款时间审查 | 运输保险审查 | 技术性能审查" data/benchmark/results/*.log
   ```

**关键指标**：
- **准确率 (Precision)**：模型识别出的风险中，真正是风险的比例。
- **召回率 (Recall)**：所有真实风险中，被模型找出的比例。
- **F1 值**：准确率和召回率的调和平均数，综合评价指标。

**规则优化策略**：
- **误报多（Precision 低）**：在规则中增加**反例案例**，明确区分相似但合格的情况。
- **漏报多（Recall 低）**：在规则中增加**同义词**或**更灵活的匹配模式**。
- **参考案例**：`data/rules.xlsx` 中的 "案例" 列，用于指导模型判断。

---

## 📄 许可证

内部使用，保留所有权利。

## 👥 维护者

- 开发团队

## 📞 联系方式

如有问题，请联系项目维护团队。
