我把 Claude 的_计算机控制_功能用在了自动贴现流程,这是一份防踩坑指南
我把 Claude 的"计算机控制"功能用在了自动贴现流程,这是一份防踩坑指南
周四下午三点,我盯着屏幕上第 23 张报错截图,开始怀疑人生。
我以为让 Claude 自动填贴现单是个周末项目——毕竟不就是"识别 PDF、填表、提交"嘛,AI 都能写诗了,填个表算什么。结果它在"金额"这一栏卡了我整整两天,截图识别出来的数字对了,但格式全错,审核系统死活不认。
但我还是跑通了。
这篇文章是我踩完所有坑之后,希望你不用再踩的那份地图。
---
第一章:Computer Use 是什么,为什么我非要用它做贴现
先说清楚 Computer Use 是什么。
简单讲:它让 Claude 能像人一样操控电脑——截图、移动鼠标、点击按钮、键盘输入,然后再截图看结果,循环往复。**不需要对方系统开放 API,不需要写 RPA 脚本,只要 Claude 能"看到"屏幕,它就能操作。**
这对财务人员意味着什么?
贴现流程是一个典型的"高重复、低容错、强依赖遗留系统"场景:
- 每天要处理几十张纸质票据 PDF
- 内部贴现系统是十年前的老软件,没有开放接口
- 字段多、格式严、一个数字错了整单作废
- 人工处理平均每张 8-12 分钟,全靠眼睛和手
这不就是 Computer Use 的天然靶场吗?
理论上是的。实际上……我们继续。
---
第二章:贴现自动化的完整链路拆解
在讲踩坑之前,先建立全局视图。整套自动化分 5 个节点:
```
[票据PDF上传] → [字段提取] → [系统登录录入] → [触发审核流] → [结果回写通知]
① ② ③ ④ ⑤
```
**节点①:PDF 上传识别**
Claude 接收票据 PDF,通过 Computer Use 截取关键页面,用视觉能力定位票面区域。这一步本质上是"把 PDF 变成 Claude 能理解的图像输入"。
**节点②:关键字段提取**
从票面图像中提取:票号、出票人、收款人、金额、到期日、承兑行。这是整个链路最容易出错的环节——后面 7 个坑有 4 个在这里。
**节点③:登录内部系统录入**
Claude 控制鼠标打开贴现系统,自动登录,逐字段填入提取的数据。这一步的关键是**操作时序**——系统响应慢,AI 不等待就会点错地方。
**节点④:触发审核流**
填完之后点击"提交审核"按钮,等待系统弹出确认对话框,再次确认。这里有一个必须设置的人工卡点(第四章展开)。
**节点⑤:结果回写通知**
截图保存审核单号,写入 Excel 台账,发送飞书/企微通知给经办人。
整个流程的"视觉-行动"循环长这样:
```python
# 伪代码:Computer Use 的核心循环
while not task_complete:
screenshot = capture_screen() # 截图
action = claude.analyze(screenshot) # Claude 分析当前状态
execute(action) # 执行操作(点击/输入)
wait_for_response() # 等待系统响应
verify_result() # 验证结果是否符合预期
```
不是黑盒魔法,是可拆解的感知-决策-执行循环。
> 💡 文中所有代码示例都基于 Claude API 调用。如果你还没有 API 访问权限,或者想用更低成本先跑通 demo,可以试试 [api.884819.xyz](https://api.884819.xyz)——按量计费,不用订阅,适合先验证再扩规模。
---
第三章:7 个真实踩坑记录(核心章节)
这是全文最值钱的部分。每个坑我都标注了"踩了几次才解决",血泪数据。
---
坑 #1:截图分辨率导致字段识别错位
**触发次数:11 次**
现象:Claude 识别出的票号最后两位总是错的,比如实际是 `...4782`,识别成 `...4782` 没问题,但金额栏的小数点后第二位经常漂移。
原因:我的测试环境是 1080p 屏幕,但截图时没有锁定 DPI,系统缩放比例 125% 导致截图实际分辨率和 Claude 预期不一致,字符边缘模糊。
**解法:**
```python
# 强制设置截图 DPI,避免系统缩放影响
import pyautogui
import ctypes
Windows: 禁用 DPI 感知,强制 96 DPI 截图 ctypes.windll.shcore.SetProcessDpiAwareness(0)
screenshot = pyautogui.screenshot()
screenshot = screenshot.resize(
(1920, 1080),
resample=Image.LANCZOS # 高质量重采样
)
```
> **金句:** 分辨率问题不是 AI 的锅,是你没告诉 AI 它在看什么尺寸的世界。
---
坑 #2:系统弹窗打断自动化链路
**触发次数:8 次**
现象:自动化跑到一半,系统突然弹出"会话即将超时"或"有未读消息"弹窗,Claude 不知道该关掉它还是等待,直接卡死。
原因:Computer Use 的视觉分析是无状态的——它只看当前截图,不知道"这个弹窗不在预期流程里"。
**解法:** 在每次操作前加一个"弹窗检测"步骤:
```python
def check_unexpected_popup(screenshot):
"""检测非预期弹窗并处理"""
popup_keywords = ["超时", "警告", "提示", "确认", "timeout"]
analysis = claude.analyze(
screenshot,
prompt="检测当前屏幕是否存在弹窗对话框,返回JSON:{has_popup: bool, popup_type: str}"
)
if analysis["has_popup"]:
if analysis["popup_type"] in ["timeout", "warning"]:
close_popup() # 自动关闭
log_event("popup_dismissed", analysis["popup_type"])
elif analysis["popup_type"] == "critical":
trigger_human_review() # 触发人工介入
raise AutomationPausedException("需要人工处理弹窗")
```
---
坑 #3:金额格式识别歧义(最坑的一个)
**触发次数:14 次,折腾了整整两天**
现象:票面金额 `¥1,234,567.89`,Claude 提取出来是 `1234567.89`,但贴现系统要求输入格式是 `1,234,567.89`(带千分位),提交直接报错。更离谱的是,有些票据用"人民币壹佰贰拾叁万肆仟伍佰陆拾柒元捌角玖分"大写,识别出来的数字又不一样。
**解法:金额标准化处理器**
```python
import re
from decimal import Decimal
def normalize_amount(raw_amount: str) -> str:
"""
统一处理金额格式:
- 支持 ¥符号、人民币前缀、大写金额
- 输出:带千分位的标准格式 "1,234,567.89"
"""
# 去除货币符号
cleaned = re.sub(r'[¥¥人民币CNY\s]', '', raw_amount)
# 处理大写金额(调用 Claude 转换)
if re.search(r'[壹贰叁肆伍陆柒捌玖拾佰仟万亿]', cleaned):
cleaned = claude.convert_chinese_amount(cleaned)
# 转为 Decimal 避免浮点精度问题
amount = Decimal(cleaned.replace(',', ''))
# 验证合理范围(防止识别错误导致天文数字)
if amount <= 0 or amount > Decimal('999999999.99'):
raise ValueError(f"金额超出合理范围: {amount}")
# 输出标准格式
return f"{amount:,.2f}"
```
> **金句:** 金额字段无小事,一个格式错误就是一张废单。
---
坑 #4:网络延迟造成操作时序错乱
**触发次数:6 次**
现象:Claude 点击"下一步"之后,页面还没加载完,它就开始在新页面的位置点击,结果点到了错误的按钮。
**解法:** 操作前等待 + 智能重试机制:
```python
def wait_and_click(target_element: str, max_retries: int = 3):
"""带重试的智能点击"""
for attempt in range(max_retries):
screenshot = capture_screen()
# 检查目标元素是否可见且可交互
element_state = claude.analyze(
screenshot,
prompt=f"检查'{target_element}'是否可见且可点击,返回:{{visible: bool, loading: bool, position: [x, y]}}"
)
if element_state["loading"]:
time.sleep(2 ** attempt) # 指数退避等待
continue
if element_state["visible"]:
click(element_state["position"])
return True
raise TimeoutError(f"元素 {target_element} 在 {max_retries} 次重试后仍不可用")
```
---
坑 #5:权限沙箱限制截图范围
**触发次数:3 次**
现象:贴现系统运行在受限权限下,某些弹窗截图出来是全黑或者被遮挡,Claude 看到的是一片黑,什么都识别不了。
**解法:** 切换到系统级截图 API,绕过应用层权限限制。Windows 下用 `win32api`,macOS 下用 `screencapture` 命令行工具。同时在提示词里加入"如果截图全黑,返回 SCREENSHOT_FAILED 而不是猜测内容"。
---
坑 #6:票据扫描质量差导致 OCR 失效
**触发次数:5 次**
现象:纸质票据扫描件分辨率太低(150 DPI 以下),或者有折痕、污渍,Claude 识别率直线下降,票号最后几位经常出错。
**解法:** 在送给 Claude 之前先做图像预处理——二值化、去噪、超分辨率放大。用 `opencv` + `Pillow` 做预处理流水线,识别率从 73% 提升到 94%。
---
坑 #7:多字段联动校验缺失
**触发次数:9 次**
现象:Claude 单独提取每个字段都对,但"到期日早于出票日"这种逻辑错误它不会主动发现,直接录入系统后被后台校验拦截,还得重来。
**解法:** 在提取完所有字段后,加一个"业务逻辑校验层":
```python
def validate_ticket_fields(fields: dict) -> list[str]:
"""票据字段业务逻辑校验"""
errors = []
if fields["maturity_date"] <= fields["issue_date"]:
errors.append("到期日不能早于或等于出票日")
if fields["amount"] != fields["amount_in_words_converted"]:
errors.append(f"大小写金额不一致:{fields['amount']} vs {fields['amount_in_words_converted']}")
if len(fields["ticket_number"]) not in [10, 12, 16]:
errors.append(f"票号长度异常:{len(fields['ticket_number'])}位")
return errors
```
---
第四章:生产级部署的 3 个必做配置
能跑 demo 和敢上生产,中间隔着一道墙。
配置一:人工审核卡点
**高风险操作前必须人确认。** 我的规则是:单张票据金额超过 50 万,或者任意字段置信度低于 0.92,自动暂停并推送审核请求:
```python
HUMAN_REVIEW_THRESHOLD = {
"amount": 500000, # 金额超过 50 万
"confidence": 0.92, # 置信度低于 0.92
"error_count": 1 # 任何校验错误
}
```
配置二:异常熔断机制
连续 3 次失败自动停止,发告警,不让错误滚雪球:
```python
class CircuitBreaker:
def __init__(self, failure_threshold=3, recovery_timeout=300):
self.failures = 0
self.threshold = failure_threshold
self.state = "CLOSED" # CLOSED/OPEN/HALF_OPEN
def record_failure(self):
self.failures += 1
if self.failures >= self.threshold:
self.state = "OPEN"
send_alert("自动化熔断:连续失败次数超限,请人工介入")
```
配置三:操作日志全记录
每一步操作、每一张截图、每一次 Claude 的判断都要留档。合规审计要用,出了问题也能回溯。日志格式参考:
```json
{
"ticket_id": "T20250115001",
"step": "amount_extraction",
"raw_value": "¥1,234,567.89",
"normalized_value": "1,234,567.89",
"confidence": 0.96,
"screenshot_hash": "sha256:abc123...",
"timestamp": "2025-01-15T14:32:11+08:00",
"operator": "claude-sonnet-4.6-computer-use"
}
```
---
第五章:成本与收益的真实账单
用数据说话。
Token 消耗对比
| 场景 | 单张票据 Token 消耗 | 折算成本(约) |
|------|-------------------|--------------|
| 简单票据(字段清晰) | ~8,000 tokens | ¥0.15 |
| 中等复杂(有大写金额) | ~14,000 tokens | ¥0.26 |
| 复杂票据(低质扫描件) | ~22,000 tokens | ¥0.41 |
> 以上数据基于 Claude Sonnet 4.6 定价,通过 [api.884819.xyz](https://api.884819.xyz) 调用,国内访问稳定性比直连官方好很多,成本核算也更直观。
时间成本对比
| 处理方式 | 单张耗时 | 日处理 40 张总耗时 |
|---------|---------|-----------------|
| 纯人工 | 8-12 分钟 | 5.3-8 小时 |
| AI 自动化(跑通后) | 2.5-4 分钟 | 1.7-2.7 小时 |
| **节省** | **约 65%** | **约 3.6-5.3 小时** |
ROI 计算公式
```
月净收益 = 月节省工时 × 人力时薪 - 月 AI 调用成本
示例:
月节省工时 = 4小时/天 × 22工作日 = 88小时
人力时薪 = ¥80/小时(财务专员)
月 AI 成本 = 40张/天 × ¥0.26 × 22天 ≈ ¥229
月净收益 = 88 × 80 - 229 = ¥6,811
```
适合 vs 不适合用 Computer Use 的场景
| 适合 ✅ | 不适合 ❌ |
|--------|---------|
| 无 API 的遗留系统操作 | 需要毫秒级响应的实时系统 |
| 高重复的表单录入 | 需要绝对零错误的核心交易 |
| 格式固定的文档处理 | 界面频繁变动的系统 |
| 跨系统数据搬运 | 需要复杂业务判断的审批 |
上线前检查清单(10 项)
1. [ ] 截图 DPI 已锁定,分辨率测试通过
2. [ ] 所有字段格式标准化函数已覆盖测试
3. [ ] 弹窗检测逻辑已验证(至少测试 5 种弹窗类型)
4. [ ] 人工审核卡点阈值已与业务方确认
5. [ ] 熔断机制已测试(模拟连续失败场景)
6. [ ] 操作日志格式已与合规部门确认
7. [ ] 异常告警通道已接通(飞书/企微/短信)
8. [ ] 沙箱环境完整跑通 100 张测试票据
9. [ ] 生产环境权限已申请并验证截图可用
10. [ ] 回滚方案已准备(自动化失败时切换人工流程)
---
三天之后,这个流程每天自动跑 40 张票据,我在喝咖啡。
不夸张——第一次看到它自己登录系统、自己填完一张单、自己提交审核,我盯着屏幕愣了三秒,然后去泡了杯咖啡。那种感觉很难描述,有点像第一次看到 Roomba 自己回充电桩。
**你现在可以做的第一步是:** 找一张你们最标准、字段最清晰的票据 PDF,按第二章的架构搭一个最小化 demo,只跑节点①和②(提取字段),验证识别准确率。不要一上来就跑全流程——先把最难的字段提取跑通,其他节点都是体力活。
🚀 **想直接上手?**
- 复制文中的代码片段
- 在 [api.884819.xyz](https://api.884819.xyz) 注册获取 API Key(注册即送 5 元体验额度,国产模型免费)
- 跑通第一个字段提取 demo,通常 30 分钟内
有问题欢迎评论区留言,我会逐一回复。
---
📌 **下一篇预告**
跑通贴现流程之后,我开始想一个更大的问题:
Computer Use 能不能同时操控多个系统?比如:左边跑 ERP,右边开着银行网银,中间还有一个 Excel 在实时更新——多窗口并发自动化,是 Computer Use 的天花板,也是我下一篇要硬啃的课题。
**《Claude Computer Use 多窗口并发实战:我是怎么让 AI 同时操控 3 个系统不打架的》**
关注我,下周见。
---
*本文由8848AI原创,转载请注明出处。关注8848AI,带你从零开始学AI。*
#AI自动化 #ClaudeAI #ComputerUse #财务自动化 #RPA #AI实战 #8848AI #Prompt技巧