把 Claude 塞进 pandas 管道:7 条脏地址实测,5 条自动清洗、2 条被闸门拦下

文章目录

    • [1. 结论先行](#1. 结论先行)
    • [2. 环境信息](#2. 环境信息)
    • [3. 为什么正则做不了、纯模型也不行](#3. 为什么正则做不了、纯模型也不行)
    • [4. 核心代码:三段式管道](#4. 核心代码:三段式管道)
    • [5. 运行结果:5 过 2 拦](#5. 运行结果:5 过 2 拦)
    • [6. 可视化:管道架构与分流结果](#6. 可视化:管道架构与分流结果)
    • [7. 成本与规模的算术](#7. 成本与规模的算术)
    • [8. 踩坑与避坑](#8. 踩坑与避坑)
    • [9. 总结](#9. 总结)
    • 参考链接

1. 结论先行

每个数据团队都有一列不敢动的脏数据。香港地址是重灾区:flat 5, 3/f, wing on house, 123 queen's road central銅鑼灣謝斐道123號5樓B室g/f, 88 nathan rd, tst, kln------中英混杂、缩写、漏区,正则写两百行也覆盖不全。这篇用实测说明一个架构:把 Claude 当成 pandas 管道里的一个 transform 步骤 ------它负责把乱七八糟的字符串变成结构化 JSON,但进库之前必须过一道确定性校验闸门

七条真实写法实测:5 条自动清洗通过,2 条被闸门拦下进人工------其中一条是模型幻觉出一个不存在的区名"West Kowloon"(香港十八区里没有它)。这个 71% 自动通过率加 29% 人工兜底的组合,就是 LLM 进数据管道的正确姿势。

2. 环境信息

  • Python 3.13,只用标准库(json / re)+ matplotlib,零第三方依赖
  • 数据:七条真实风格的香港地址(混合英文缩写、繁体中文、缺失字段、模糊描述)
  • 架构规则一句话:LLM 是管道里唯一不确定的步骤,所以它两侧必须都是确定性代码------输入侧限定它只能输出什么 schema,输出侧校验它输出的每个字段
  • 诚实边界:dry-run 的 LLM 输出用模拟字典代替(生产环境由 Claude 结构化输出返回),校验器与统计是真实代码

3. 为什么正则做不了、纯模型也不行

正则的困境:香港地址的排列组合没有上限------楼层有 3/f3/F三樓G/F;区名有 tstTST尖沙咀尖沙嘴;大厦名夹在中间没有分隔规律。规则引擎面对的是无限的表面形式,写得越多漏得越多。

纯模型的困境:模型偶尔会"好心补全"------near kowloon station 被补成区名"West Kowloon",听起来合理,但香港十八区没有这个区。数据管道要的是每一行都可验证,一行幻觉进库,下游报表全歪。

所以答案在中间:模型做语义理解(它擅长的),白名单和格式校验做事实裁定(代码擅长的)。这不是对模型不放心,是把不确定性和确定性分层的工程常识。

4. 核心代码:三段式管道

python 复制代码
import json, re

DISTRICTS = {"Central and Western", "Wan Chai", "Causeway Bay", "Eastern",
             "Southern", "Yau Tsim Mong", "Sham Shui Po", "Kowloon City",
             "Wong Tai Sin", "Kwun Tong", "Kwai Tsing", "Tsuen Wan",
             "Tuen Mun", "Yuen Long", "North", "Tai Po", "Sha Tin",
             "Sai Kung", "Islands"}

# ---------- LLM transform: raw text -> structured JSON ----------
# 生产环境由 Claude 结构化输出返回;这里用模拟输出驱动流程
def llm_transform(raw: str) -> dict:
    ...

# ---------- deterministic validation gate ----------
def validate(rec: dict) -> dict:
    issues = []
    if rec.get("district") not in DISTRICTS:
        issues.append("DISTRICT_BAD")
    if not rec.get("district") or not (rec.get("street") or rec.get("unit")):
        issues.append("INSUFFICIENT")
    if rec.get("floor") and not re.fullmatch(r"G/F|\d{1,2}/F", rec["floor"]):
        issues.append("FLOOR_FORMAT")
    return {"gate": "PASS" if not issues else "BLOCKED", "issues": issues}

# ---------- route ----------
def route(rec, gate):
    if gate["gate"] != "PASS":
        return "manual_review"
    return f"clean/{rec['district']}"

DISTRICTS 这十九个字符串是整套架构的锚点:模型可以自由理解输入,但区名必须落在这个白名单里 。三条校验各管一类错误------白名单管幻觉、必填管偷懒、格式管笔误。这套「宽进严出」三件套可以直接抄进任何 LLM 清洗列的场景,建议收藏备用

5. 运行结果:5 过 2 拦

复制代码
flat 5, 3/f, wing on house, 123 queen's road central -> clean
銅鑼灣謝斐道123號5樓B室                              -> clean
g/f, 88 nathan rd, tst, kln                          -> clean
sha tin new town plaza phase 3 unit 1201             -> clean
near kowloon station, west kowloon  -> manual_review [DISTRICT_BAD]
7/f, tower 2                        -> manual_review [DISTRICT_BAD, INSUFFICIENT]
25 tai lin pai road, kwun tong, kowloon             -> clean

summary: 5 clean / 2 blocked  (71% auto-pass)

两条被拦的各有代表性:"West Kowloon"是模型幻觉 ------语义上它存在(西九龙片区),但不是十八区之一的合法行政区名,白名单一票否决;7/f, tower 2 是信息不足 ------没有街名没有区,模型没硬编(这是对的),闸门按"必填不足"送人工。注意第三条 tst, kln 这种重度缩写被正确解析成 Yau Tsim Mong------缩写和简写正是模型比正则强的地方,而白名单保证了这种"强"不会变成编造。

6. 可视化:管道架构与分流结果

第一张是架构全貌:脏列进、LLM 转换、闸门校验、双路出口------绿色出口和红色出口都是确定性代码在管 ,模型只在中间那一段干活。第二张是七条样本的分流结果:5 绿 2 红,红色区就是人工的工作清单。这张架构图值得收藏,给团队定"LLM 能碰哪段数据"的规矩时直接用

7. 成本与规模的算术

逐行调一次 API 是最直觉的实现,但批量场景有更省的走法:把 N 条地址合并进一次请求 (一次结构化输出返回 JSON 数组),调用量直接除以 N;再叠 prompt caching(系统提示+白名单+示例是固定前缀),长跑成本再降一档。粗算:一万条地址,逐行 = 一万次调用的固定开销;每 20 条合并 = 500 次调用 + 缓存命中------同一个模型,账单差一个数量级。代价是单次失败影响一批,所以失败重试按"批"记,闸门照常逐条校验。

8. 踩坑与避坑

踩坑 后果 避开姿势
模型输出直接进库 "West Kowloon"这类幻觉区名混入报表 18 区白名单 + 必填校验,BLOCKED 进人工
只校验区名不校验其他字段 楼层格式五花八门照样入库 白名单 + 枚举 + 格式三件套各管一类
逐行调用 API 调用量与账单线性爆炸 N 条合并一次请求 + prompt caching
把"信息不足"硬解析 模型编造街名填空 必填不足一律送人工,模型空着是对的
混合繁简/缩写当两种数据 正则规则翻倍维护 交给模型统一输出,白名单兜底

这张表建议收藏,做任何"LLM 清洗列"之前先对一遍------尤其第一行,幻觉不是 bug,是需要闸门的常态。

9. 总结

把 Claude 塞进 pandas 管道的正确姿势是把它当成一个能力很强但不完全可靠的 transform 函数 :它能理解正则永远覆盖不全的表面形式(5/7 自动通过,含 tst, kln 这种重度缩写),但它的输出必须被白名单、必填、格式三重校验包住(2/7 被拦,含一个幻觉区名)。数据管道的可靠性从来不是靠某个组件完美,而是靠不确定的部分被确定的部分包住

代码、白名单、校验规则全部可复现,换一列脏数据(品名、公司名、职位)就能直接套用。这篇也收录进「CodingPlan·八月创作之星博客挑战赛」收官批次。

本文为原创技术实践;dry-run 的 LLM 输出为模拟数据,生产环境由 Claude 结构化输出返回;示例地址为演示用混合写法,不指向任何真实住户。

参考链接

  1. Anthropic 官方文档 - Structured Outputs / Tool Use:https://docs.anthropic.com/en/docs/build-with-claude/tool-use
  2. Anthropic 官方文档 - Prompt Caching:https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching
  3. 香港十八区(维基百科,白名单依据):https://zh.wikipedia.org/wiki/香港十八區
相关推荐
二进制漫游记1 小时前
PostgreSQL超详细入门教程:Windows安装+Python异步连接+完整增删改查实战
python·postgresql
2601_962077601 小时前
从零搭建Python接口自动化测试框架:pytest+requests实战指南
python·pytest·接口自动化·requests·框架搭建
stolentime1 小时前
OpenClaw 2.0 新手快速上手与实战指南
爬虫·python·ai·网络爬虫
启观川2 小时前
Python基础-第 16 章 综合案例:客户信息管理系统
开发语言·笔记·python·正则表达式
用户3721574261352 小时前
如何使用 Python 给 PDF 添加附件:文档附件与附件注释
python
λqaq72 小时前
Redis 数据库基础:安装、5 大核心数据类型与常用命令
linux·数据库·redis·python·缓存
天天被压力2 小时前
【零依赖量化数据实战 #31】沪深A实时盘口全景:逐笔·全盘实时·最新价·历史逐笔
java·人工智能·python
今天AI了吗2 小时前
【AI】一文讲清 RAG:从大模型局限到企业级知识库落地流程
前端·javascript·人工智能·python·深度学习·机器学习·easyui
“AI国潮设计-小江”2 小时前
《Python实战 | 用SDXL大模型生成“潮汕英歌舞”国潮IP头像,已申请外观专利,附Prompt思路!》
人工智能·python·prompt·aigc·scikit-learn