feat: 结构化输出按官方规范 + 两段式重试 + DeepSeek 复检开关
- 豆包: response_format.json_schema(strict);DeepSeek: 切 Responses API text.format.json_schema (官方 chat/completions 通道不支持 json_schema),不支持时自动降级 json_object([output] schema) - 重试两段式:传输错误 cfg.retries 次;解析失败/空正文有独立 3 次专用重试,仍失败落 parse_fail - 移除三票复核(decide_final/_verify_clean/verify_clean),DeepSeek 单次判定即终稿 - 新增 [run] deepseek_recheck 开关(默认 no=仅豆包初筛;yes=追加 DeepSeek 复检) - GUI 不再覆盖 config 提示词;prompt 相对/前导斜杠路径按 exe 目录解析 - 报表去「票型/复核」列并同步说明;README/config.example.ini 同步 - 测试新增输出格式、重试、开关与提示词路径用例(50 passed)
This commit is contained in:
@@ -4,10 +4,17 @@
|
||||
|
||||
```
|
||||
全部图片 ──▶ 豆包(火山方舟 Ark)初筛 ──┬─ 判为违规 ──▶ 直接定稿(便宜,拦下大头)
|
||||
└─ 无违规/违规不明/异常 ──▶ DeepSeek 复检
|
||||
└─ 仍判无违规 ──▶ 追加两票复核(3票取多数)
|
||||
└─ 无违规/违规不明/异常 ──▶ DeepSeek 复检(可开关)
|
||||
(单次判定即终稿,已移除三票复核)
|
||||
```
|
||||
|
||||
DeepSeek 复检默认关闭(`[run] deepseek_recheck=no`),即默认只跑豆包初筛;
|
||||
需要第二级复检时把该开关设为 `yes`(或 `mode=deepseek` 全量走 DeepSeek)。
|
||||
|
||||
AI 输出启用官方结构化输出:豆包走 `response_format.json_schema`(strict),DeepSeek 走
|
||||
Responses API 的 `text.format.json_schema`(其 chat/completions 通道不支持 schema);
|
||||
接口不支持时自动降级 `json_object`(见 `[output] schema`),保证单次判定稳定可靠。
|
||||
|
||||
## 输出结构
|
||||
|
||||
指定输出目录后,自动建立时间戳文件夹,按分类归档图片,Excel 放在一级目录:
|
||||
@@ -58,7 +65,6 @@ uv run --with pyinstaller --with aiohttp --with openpyxl \
|
||||
|
||||
-o, --output DIR 输出目录(默认为图片文件夹)
|
||||
--mode cascade(默认)/ doubao / deepseek
|
||||
--no-verify 跳过 DeepSeek 无违规两票复核
|
||||
--prompt FILE 自定义提示词(默认内置 prompts.txt)
|
||||
--workers-ark/--workers-ds/--max-tokens 调优项(默认即可)
|
||||
```
|
||||
@@ -77,11 +83,15 @@ api_key = sk-...
|
||||
model = deepseek-v4-flash-vision-exp
|
||||
max_tokens = 5000
|
||||
[run]
|
||||
mode = cascade # cascade / doubao(仅豆包)/ deepseek(仅 DeepSeek)
|
||||
verify_clean = yes # DeepSeek 判无违规后是否追加两票复核(yes/no)
|
||||
mode = cascade # cascade / doubao(仅豆包)/ deepseek(仅 DeepSeek)
|
||||
deepseek_recheck = no # 仅 cascade 生效:no=只豆包初筛(默认)/ yes=追加 DeepSeek 复检
|
||||
[output]
|
||||
schema = auto # auto(默认)/ on / off;auto=启用官方结构化输出,接口不支持自动降级 json_object
|
||||
```
|
||||
|
||||
运行模式:config.ini `[run] mode` 全局生效(GUI 也跟随);CLI 的 `--mode` 参数可临时覆盖。
|
||||
DeepSeek 复检开关:`[run] deepseek_recheck`(默认 `no`)。`no` 时 cascade 等效“仅豆包”,
|
||||
DeepSeek 相关的 API Key 也不再是必填项;需要 DeepSeek 复检时设 `yes`(或直接 `mode=deepseek` 全量走 DeepSeek)。
|
||||
|
||||
## 项目结构
|
||||
|
||||
@@ -89,7 +99,7 @@ verify_clean = yes # DeepSeek 判无违规后是否追加两票复核(yes/no
|
||||
├── src/violation_detector/
|
||||
│ ├── config.py # 配置(自动生成 ini、缺项检测、冻结环境路径)
|
||||
│ ├── providers.py # 豆包/DeepSeek 异步客户端,统一结果结构
|
||||
│ ├── pipeline.py # 级联调度、断点缓存(runs/)、两票复核、成本汇总
|
||||
│ ├── pipeline.py # 级联调度、断点缓存(runs/)、成本汇总
|
||||
│ ├── report.py # 时间戳输出目录、分类归档、Excel 报表
|
||||
│ ├── cli.py / gui.py
|
||||
├── app_gui.py / app_cli.py # 启动器 + PyInstaller 入口
|
||||
@@ -116,9 +126,11 @@ uv run --with pytest --with aiohttp --with openpyxl --no-project \
|
||||
## 检测规则与已知特性
|
||||
|
||||
- 分类按提示词 17 类标准输出唯一分类,自动归一化写法差异。
|
||||
- DeepSeek:temperature=0 + JSON 模式、max_tokens=5000(全量梯度实测零失败最小档)。
|
||||
- 无违规两票复核:3 票一致才稳;2:1 保留多数但标记“人工复核”;分歧从严取违规类。
|
||||
- 边界图存在运行间抖动(同为 temp=0 重测全量一致率约 68%),与 max_tokens 无关;
|
||||
报表“票型/复核”列已标出分歧图,建议人工终审。
|
||||
- AI 输出:按官方启用结构化输出——豆包=response_format.json_schema(strict),
|
||||
DeepSeek=Responses API 的 text.format.json_schema(约束「文字/图形属性 · 侵权/违规逻辑 ·
|
||||
违规分类」三字段);接口不支持时自动降级 json_object([output] schema)。
|
||||
DeepSeek 走 chat/completions 兜底时 temperature=0、max_tokens=5000。
|
||||
- 复检单次即终稿:DeepSeek 对豆包放行/存疑图各跑一遍即定稿,不再追加多票复核。
|
||||
- 边界图仍可能存在运行间抖动(单模型单次判定所致),成本较低可整批重跑比对,存疑图建议人工终审。
|
||||
- 级联成本:DeepSeek 只处理豆包放行的少数存疑图(单张约 1-1.6 分钱,
|
||||
空闲时段半价;高峰=工作日 9-12、14-18 点)。
|
||||
|
||||
Reference in New Issue
Block a user