审计函证地址核查自动化:从工商查询到地图API到Web Search的三层过滤

我还是初级的时候,就在"信息查询瑞士军刀"里做过一个函证地址核查功能。
当时市面上还没有这种工具。我的做法很直接——注册一个百度地图 API,两个地址丢进去算距离,通过距离远近来判断地址是否一致。
后来市面上陆续出现了类似的工具,大家都在用地图 API 算距离。
但我发现一个问题。
光靠距离是不够的。地址相近,不代表函证地址就一定真实;距离远,也不代表就一定有问题——建筑公司的发函地址经常是项目工地,跟注册地差着上千公里,但这是正常的。
真正耗时的是距离远的那批:你得打开浏览器,一家一家去搜,看这个公司在那个地方到底有没有项目或者办公地址。搜到了就标记通过,搜不到就标异常。这个人工搜索的环节,才是最费时间的。
所以我用 AI 重新做了这个功能,把它做成了一个 Skill。核心改进就是:把人工搜索这一步也自动化了。
三层过滤:从简单到复杂
整个核查逻辑分三层,层层递进:

第1层:文本相似度(零API,秒出结果)
↓ 未通过
第1.5层:地理编码距离(调地图API)
↓ 未通过
第2层:Web Search 人工/AI 介入
第1层:文本相似度
最简单粗暴的一层。把发函地址和工商注册地址做文本比对,用 thefuzz 库算相似度。
相似度 ≥ 80%,直接通过。
比如:
- 发函地址:“济南市工业南路89号”
- 工商地址:“济南市工业南路89号”
- 相似度:100% ✅
这一层能直接过滤掉大量地址一致的公司。不需要调任何 API,零成本,秒出结果。
但有些公司注册地址带了省份前缀,发函地址没带,比如:
- 发函地址:“长沙市雨花区中意一路158号”
- 工商地址:“湖南省长沙市雨花区中意一路158号”
相似度可能掉到 95%,但仍然 ≥ 80%,依然通过。
第1.5层:地理编码距离
文本相似度低于 80% 的,不一定就是有问题。比如地址表述差异很大,但实际可能是同一个地方。
这一层调用腾讯地图 API,把两个地址分别转成经纬度坐标,然后算直线距离(Haversine 公式)。
距离 ≤ 2km,判定为通过。
2km 是什么概念?基本就是同一个行政区域内,可能是街道门牌号的差异,或者是工商注册用了简写。
第2层:Web Search
前两层都没通过的,才进入这一层。
这一层解决的就是我之前说的那个痛点——人工搜索。
以前你得自己打开浏览器,搜公司名、搜项目名、翻新闻、翻公告。现在 AI 帮你搜,搜到的结果自动写进报告里,连来源网址都附上,你可以点进去验证。

一个案例:10 家公司的核查全过程
我用一组模拟数据跑了完整流程。10 家公司,覆盖了建筑施工、水利水电等行业。
输入
一份 Excel,两列:公司名称 + 发函地址。

运行结果
脚本自动完成工商查询(通过中注协行业知识库),然后逐层过滤:
第1层直接通过的(4家):
| 公司 | 发函地址 | 工商地址 | 相似度 |
|---|---|---|---|
| 中建八局第一建设 | 济南市工业南路89号 | 济南市工业南路89号 | 100% |
| 中铁四局集团 | 合肥市包河区望江东路96号 | 合肥市包河区望江东路96号 | 100% |
| 中交第三航务工程局 | 上海市徐汇区平江路139号 | 上海市徐汇区平江路139号 | 100% |
| 中国建筑第五工程局 | 长沙市雨花区中意一路158号 | 长沙市雨花区中意一路158号 | 95% |
这 4 家地址完全一致或基本一致,发函地址就是注册地址,没什么好说的。
进入第1.5层的(6家):
全部因为相似度低于 80% 被拦下来,地理编码距离也远超 2km。比如:
| 公司 | 发函地址 | 工商地址 | 相似度 | 距离 |
|---|---|---|---|---|
| 中铁十二局 | 深圳地铁16号线项目部 | 太原市万柏林区西矿街130号 | 22% | 1711km |
| 水电七局 | 白鹤滩水电站施工区 | 成都市郫都区成灌东路349号 | 6% | 415km |
| 中交一公局三公司 | 莎车公路项目指挥部 | 北京市通州区景盛北三街10号 | 10% | 3369km |
1711 公里、3369 公里…… 这些地址根本不在一个城市。
但这不代表一定有问题。建筑公司的发函地址是项目工地,这是行业常态。
所以这 6 家全部进入第 2 层:Web Search 验证。
第2层:Web Search 逐个验证
搜索策略不是简单地搜公司名,而是有针对性地搜索:
| 策略 | 搜索词 | 适用场景 |
|---|---|---|
| 公司+地址 | “公司名” “地址关键词” | 通用 |
| 项目+地名 | “项目名” “地名” | 建筑公司 |
| 母公司+项目 | “母公司” “项目地名” | 分公司/施工局 |
通过验证的(3家):
| 公司 | 验证结果 |
|---|---|
| 中铁十二局 | 百度百科:参建深圳地铁16号线,2022年12月开通。项目部地址合理。 |
| 水电七局 | 中国电建官网:组建白鹤滩施工局,承建左岸引水发电系统。施工区地址合理。 |
| 中建三局 | 央视网/澎湃新闻:承建武汉绿地中心,设有总承包项目部。项目部地址合理。 |
这 3 家虽然发函地址和工商注册地址差了上千公里,但都能找到权威来源确认公司在该地址有项目。属于建筑行业正常的施工现场地址。
仍然异常的(3家):
| 公司 | 异常原因 |
|---|---|
| 中交一公局三公司 | 发函地址为"莎车公路项目指挥部",但 G217 莎车项目中标方为中交一公局厦门公司,非三公司。未找到三公司在莎车的权威佐证。 |
| 贵州建工第八 | 工商地址在贵阳,发函地址在从江县丙妹镇。未找到该公司在从江县的任何项目记录。 |
| 河北建设唐山分公司 | 工商地址在唐山高新区,发函地址在滦南县柏各庄镇。未找到在滦南县的项目记录。 |
判定规则:证据不足就是异常
这里有个核心原则:
没有权威来源直接佐证 = 异常。
什么算"权威来源"?政府招标公告、公司官网、权威媒体报道、百度百科等。B2B 平台上的企业信息不算——那谁都能填。
最终输出
脚本自动生成一份 Excel 报告,7 列:
| 列 | 内容 |
|---|---|
| 公司名称 | 被函证单位 |
| 发函地址 | 函证寄送地址 |
| 工商注册地址 | 工商系统查询结果 |
| 相似度(%) | 文本相似度 |
| 距离(km) | 两地址直线距离 |
| 匹配说明 | 未通过原因 / Web Search 佐证 |
| 核查结论 | 通过(绿色)/ 异常(红色) |
结论列带颜色标记,一眼就能看出哪些需要关注。

总结一下
整个流程:
- 工商查询 → 拿到注册地址
- 文本比对 → 相似度 ≥ 80% 直接通过
- 地理编码 → 距离 ≤ 2km 直接通过
- Web Search → 逐个验证异常项,找权威来源佐证
- 生成报告 → Excel 带颜色标记
10 家公司,自动化完成前两层,第三层由 AI 搜索验证。整个过程从传统的一两天压缩到几分钟。
当然,这个脚本是 Claude Code 写的,核心代码量也不大。但解决的问题很实际:把一个重复、枯燥、容易出错的核查工作,变成了一套标准化流程。
而且地址核查不一定要单独用。它本身就是一个基础功能,可以被其他更大的实质性程序调用——比如应收账款审计流程里,函证样本选完之后,地址核查自动跟着跑。这才是 AI 审计工具化的正确方向:每个小功能做好一件事,大的流程把它们串起来。