!封面

先讲一个你大概率做过的操作。

你丢给大模型一个视频链接,说“帮我下载这个视频”。它理解你的意图,分析出你需要调用 yt-dlp,检查你电脑上有没有装,然后执行下载。几十秒后,视频到了你的本地文件夹。

现在问自己一个问题:大模型在这件事里到底做了什么贡献?

它只做了一件事——替你敲了那行命令。真正把视频从服务器拉到本地的是 yt-dlp,一个跟 AI 毫无关系的开源工具。没有大模型,你能不能自己敲那行命令?能。

那为什么还要让大模型跑这一趟?

它帮你省了记命令和敲键盘的 5 秒钟。代价呢?一次调用,几千个 Token 没了。你等于雇了一个律师去按计算器。

这就是法律人用 AI 最该建立的分工意识:有些工作不该让大模型做。


三个确定性

判断一件事该用脚本还是大模型,不需要技术背景。问自己三个问题就行。

输入端是不是确定的? 用户给什么,不需要语义理解就能处理。

工作流程是不是确定的? 调什么工具、按什么步骤,中间不需要做判断。

输出端是不是确定的? 最后产出什么,格式和内容可以事先约定。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 420">
  <rect width="600" height="420" fill="#fff" rx="6"/>

  <text x="300" y="32" text-anchor="middle" font-size="17" font-weight="700" fill="#222" font-family="sans-serif">三个确定性 → 脚本 / 大模型 决策矩阵</text>

  <!-- Header row -->
  <rect x="30" y="55" width="170" height="40" fill="#f5f5f5" stroke="#ccc" stroke-width="1" rx="4"/>
  <text x="115" y="80" text-anchor="middle" font-size="14" font-weight="700" fill="#333" font-family="sans-serif">输入端</text>

  <rect x="215" y="55" width="170" height="40" fill="#f5f5f5" stroke="#ccc" stroke-width="1" rx="4"/>
  <text x="300" y="80" text-anchor="middle" font-size="14" font-weight="700" fill="#333" font-family="sans-serif">工作流程</text>

  <rect x="400" y="55" width="170" height="40" fill="#f5f5f5" stroke="#ccc" stroke-width="1" rx="4"/>
  <text x="485" y="80" text-anchor="middle" font-size="14" font-weight="700" fill="#333" font-family="sans-serif">输出端</text>

  <!-- Row 1: All certain → Script -->
  <rect x="30" y="110" width="170" height="65" fill="#f2faf2" stroke="#4a9" stroke-width="1.5" rx="4"/>
  <text x="115" y="135" text-anchor="middle" font-size="13" font-weight="600" fill="#2a7" font-family="sans-serif">确定 ✓</text>
  <text x="115" y="157" text-anchor="middle" font-size="11" fill="#555" font-family="sans-serif">PDF 路径 / 视频网址</text>

  <rect x="215" y="110" width="170" height="65" fill="#f2faf2" stroke="#4a9" stroke-width="1.5" rx="4"/>
  <text x="300" y="135" text-anchor="middle" font-size="13" font-weight="600" fill="#2a7" font-family="sans-serif">确定 ✓</text>
  <text x="300" y="157" text-anchor="middle" font-size="11" fill="#555" font-family="sans-serif">mineru / yt-dlp</text>

  <rect x="400" y="110" width="170" height="65" fill="#f2faf2" stroke="#4a9" stroke-width="1.5" rx="4"/>
  <text x="485" y="135" text-anchor="middle" font-size="13" font-weight="600" fill="#2a7" font-family="sans-serif">确定 ✓</text>
  <text x="485" y="157" text-anchor="middle" font-size="11" fill="#555" font-family="sans-serif">MD 文件 / 本地视频</text>

  <line x1="300" y1="185" x2="300" y2="205" stroke="#2a7" stroke-width="1.5"/>
  <polygon points="293,202 300,212 307,202" fill="#2a7"/>

  <rect x="140" y="215" width="320" height="36" fill="#2a7" rx="5"/>
  <text x="300" y="238" text-anchor="middle" font-size="14" font-weight="700" fill="#fff" font-family="sans-serif">用脚本 — 零 Token,可复用</text>

  <!-- Row 2: Any uncertain → LLM -->
  <rect x="30" y="275" width="170" height="65" fill="#faf5f0" stroke="#e80" stroke-width="1.5" rx="4"/>
  <text x="115" y="300" text-anchor="middle" font-size="13" font-weight="600" fill="#c50" font-family="sans-serif">不确定 ✗</text>
  <text x="115" y="322" text-anchor="middle" font-size="11" fill="#555" font-family="sans-serif">"这份合同有风险吗"</text>

  <rect x="215" y="275" width="170" height="65" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="4"/>
  <text x="300" y="308" text-anchor="middle" font-size="13" fill="#999" font-family="sans-serif">任意</text>

  <rect x="400" y="275" width="170" height="65" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="4"/>
  <text x="485" y="308" text-anchor="middle" font-size="13" fill="#999" font-family="sans-serif">任意</text>

  <line x1="300" y1="350" x2="300" y2="370" stroke="#c50" stroke-width="1.5"/>
  <polygon points="293,367 300,377 307,367" fill="#c50"/>

  <rect x="140" y="380" width="320" height="36" fill="#c50" rx="5"/>
  <text x="300" y="403" text-anchor="middle" font-size="14" font-weight="700" fill="#fff" font-family="sans-serif">用大模型 — 需要语义判断</text>
</svg>

规则只有一句话:三个全确定,用脚本;任意一个不确定,用大模型。

下面逐个讲。

输入端确定。 你给脚本的东西,格式和类型是固定的。一个 PDF 路径、一个视频网址、一个装满裁判文书的文件夹——脚本不需要“理解”PDF 里写了什么,它只需要知道“这是 PDF,调 mineru 转 Markdown”。

反过来,“帮我看看这份合同有没有风险”——输入也是文件,但你要求的是语义理解,脚本做不了。

工作流程确定。 从输入到输出,每一步调什么、按什么顺序,中间不需要做判断。PDF 转 MD 的流程永远是:检测文件类型 → 调 mineru → 输出 MD。没有“先看看内容再决定”这种分支。

一旦流程里出现了“如果……那么……”,而且这个“如果”依赖对内容的语义判断,那就出了脚本的能力边界。

输出端确定。 转出来的 MD 文件、下载到本地的视频、提取出来的案号和日期——这些东西的形态是可以事先约定的。

而“帮我写一份法律意见书”——输出虽然也是一份文件,内容却取决于你对案情的分析和判断,不是脚本能干的活。


四个最适合脚本的法律场景

格式转换

律师的工作流里塞满了格式转换。客户发来 PDF 合同,要转成可编辑文本;对方律师发来 Excel 证据清单,要转成 JSON 喂给分析工具;扫描件里的文字要提取出来做检索。

每一次都让大模型跑一遍,纯属浪费。一个脚本就够了:自动检测文件夹里的文件类型,PDF 调 mineru,Excel 调 Python 库,图片调 OCR,转完保留原始文件夹结构。脚本写好了,以后 PDF 转 MD 这件事就不需要再消耗任何 Token。

批量信息提取

你有一万份裁判文书,想提取案号、法院名称、裁判日期。

让大模型一份份读?可以。但 Token 账单会很难看,而且每份都要等它一个字一个字输出。脚本几秒钟就能跑完。

因为“案号”在裁判文书里有固定的格式特征——“(XXXX)X 民 X 字第 XX 号”,法院名称出现在固定位置,裁判日期的表述也是模式化的。这些信息的提取靠的是模式匹配,不是语义理解。

这和 OCR 之后再让大模型“读懂”判决书的论证逻辑,是两件完全不同的事。

基础脱敏

身份证号 18 位数字(或 17 位 + X),手机号 11 位且以 1 开头,银行卡号有固定的 BIN 码规则。用正则表达式匹配替换,脚本完全能胜任。

但人名脱敏就复杂了。人名可能是一个字、两个字、三个字甚至四个字,可能是少数民族姓名音译。脚本只能靠特征判断,而人名恰恰是特征最不明显的那一类——它没办法用规则区分“陈石”是律师还是“陈述”是动词。这时候你需要大模型从上下文关系里判断“这一个字到底是不是人名”。

脱敏这件事,边界清晰:格式化的用脚本,语义的用模型。

批量生成群体性案件文书

银行对一百个逾期借款人发律师函,物业公司对两百户欠费业主起诉——文书结构高度统一,变的只是当事人信息、欠款金额、违约时间。模板写好,变量位留好,脚本循环填充,几分钟出几百份。

以前我团队有个会 Python 的同事,这种活交给他,别人干一天他半小时搞定。现在,你自己就可以是那个人。

不会写 Python 没关系。往下看。


你已经在开发软件了,只是没意识到

法律人面对脚本,有一个共同的卡点:我不会编程。

在大模型出现之前,这个卡点是真实的。学 Python 要时间,调 bug 要耐心,配环境要运气。现在这个障碍基本不存在了。

你不需要会 Python。你需要的是把自己的需求讲清楚:

  1. 你会给它什么(输入)
  2. 你希望它达到什么效果(输出)
  3. 你电脑上有哪些工具可以用(不知道也没关系,让大模型自己找)

然后对大模型说:帮我写个脚本,实现这个功能。

它写出来,你运行,发现哪里不对再让它改。这个过程本质上就是你在用自然语言做软件开发——你相当于用大模型帮你开发了一个软件。它没有图形界面,在终端里跑,但它确确实实解决了你的问题。

软件写好之后,大模型退居二线。以后每次干这件事,直接跑脚本,零 Token。而且跨工作区复用:合同审核碰到 PDF,调它;咨询碰到 PDF,也调它;案件分析碰到 PDF,还是它。

再进一步,脚本可以嵌入你的 Skill 和 Agent。一个复杂的合同审核 Skill,第一步“格式转换”用脚本完成,大模型只在需要语义判断的环节出场。这就是分工——确定的事脚本做,判断的事模型做。


几个容易踩的坑

不是所有“重复”都等于“确定”。 你每周写案件进展报告,这件事重复发生,但每份报告的内容需要你分析进展、评估风险、给出下一步建议——都依赖法律判断,脚本写不了。判断标准是三个确定性,不是“这事儿我干了很多次”。

脚本不是写一次就一劳永逸。 工具会更新(mineru 升级了 API),需求会变化(今天只转 PDF,下周还想转 Excel)。脚本也要跟着进化。好消息是,改脚本和写脚本一样简单——对大模型说就行。

大模型写的代码不一定对。 它会用不存在的 API 参数,会在边界情况崩溃。你不需要学会 debug,但一定要学会测试:拿小样本先跑一下,结果对了再批量用。这个习惯比你想象的更重要。


什么时候别用这套方法

三个确定性是实用框架,不是金科玉律。

核心环节依赖法律判断的任务——案件分析、策略制定、谈判评估——从头到尾都要专业判断,不适合用脚本替代。

一次性的操作,手动做比写脚本快——那就手动做。别为了方法论而方法论。

电脑上缺少工具链——脚本调用的底层工具(mineru、yt-dlp、ffmpeg)需要先装好。部署这事大模型可以帮你做,但你得知道需要部署什么。

最后说句实在话:这个方法最大的价值,不是把你变成效率狂人,而是让你在每次想“让大模型帮我做”之前,多问自己一句——没有大模型,这件事是不是也可以自动化?

答案是肯定的,写个脚本。省下来的 Token,留给真正需要判断力的工作。


作者简介: 陈石律师,浙江海泰律师事务所副主任、高级合伙人、房地产与建设工程部主任,宁波市律师协会副秘书长、第七届宁波仲裁委员会仲裁员,聚焦建筑房地产、投融资、并购重组及商事争议解决。曾获多家法律媒体与专业机构认可,荣登 LegalOne 2025 中国区建工及房地产实务先锋 45 强、律新社 2025 年度管理合伙人 20 佳(华东),入选《商法》The A-List 法律精英,获评 ALB China 区域市场十五佳长三角地区律师新星,并获律新社 2024 年度并购领域品牌之星。长期为万科、华润置地、信达地产、保利置业、招商蛇口、中海地产等企业提供法律服务,承办“首宗百亿地王”“长春第一高楼”“台州第一高楼”等代表性项目,累计服务项目投资额超千亿。近年来持续推动 AI 与法律实务融合,强调以结构化方法打通技术逻辑、法律判断与商业场景;著有《赋能法律人:AI 底层思维与应用范式》,并在多地开展相关主题讲座与分享。四明山法师 AI 夜校(legalAGI.cn)发起人。