对庭律师背景画像卡
用户会反复提供律师姓名(有时带城市或律所),要求输出一份画像卡用于庭前准备。
这是长期复用的任务,本文件是其标准作业流程。
配套资源:
- references/retrieval-and-classification.md —— 检索通道参数、召回自检、角色/机构判定规则(做判定前必读)
- references/deliverable-spec.md —— 交付形态、合规红线、免责声明模板
- scripts/profile_pipeline.py —— 可复用的抽取+统计脚本(已用真实样本验证)
- CHANGELOG.md / VERSIONS/ —— 版本历史与回退方法
0. 适用边界
适用:中国内地执业律师的公开执业信息画像,用于己方庭前准备。
不适用 / 需拒绝:
- 要求评估律师"人品、能力、口碑" → 只描述可核查的行为模式与文书事实,不做人格评价
- 要求查询私人生活、家庭、住址、未公开案情 → 拒绝
- 要求获取对方当事人信息、在办案件内部信息 → 拒绝
- 非中国内地执业者(中国香港/中国澳门/中国台湾及境外)→ 数据库与执业登记体系不同,须先声明能力边界
1. 作业流水线
| 阶段 | 动作 | 出口条件 |
|---|---|---|
| P0 身份定性 | 确认姓名 + 城市/律所;若信息不足先追问 | 四要素(姓名/律所/城市/执业证号)至少锁定律所 |
| P1 身份唯一性 | 检索律所官网、司法厅许可决定书、律师页;生成同名排除清单 | 唯一锁定,或列出候选交用户确认 |
| P2 主体检索 | 元典 qw="姓名 律所" 全时段 → 分桶补齐 → 换式捞漏 |
召回自检通过(见 §3) |
| P3 判定与统计 | 跑 scripts/profile_pipeline.py |
得 cases.json + 统计报告,回退项已单独列出 |
| P4 行为画像 | 律所官网活动报道、自媒体、专业文章、所内搭档 | 要么有可引原文,要么明确写"近乎空白" |
| P5 交付 | 生成 HTML 画像卡 + present_files |
自查清单(§7)全过 |
| P6 收尾 | 追问三件事 + 写 memory + 按需升版本 | — |
2. 身份唯一性确认(不可跳过)
四要素
| 要素 | 权威来源 |
|---|---|
| 执业证号 | 律所官网 / 律师页 / 省市司法厅准予执业许可决定书 |
| 执业机构 | 同上 + 裁判文书"委托诉讼代理人"段 |
| 城市 | 律所注册地 |
| 执业起始时间 | 司法厅许可决定书(含文号,最权威) |
同名排除
对姓名做 WebSearch + 律师页检索,逐个比对"律所/城市/执业证号":
- 律所不同 → 直接排除,写入交付物的"同名排除记录"表
- 无法区分 → 列候选让用户确认,绝不默认选第一个
⚠️ 必须检索"执业初期律所"
律师实习期/执业初期常挂靠另一家所,只查当前律所会整段丢失早期数据。
- 查找途径:按年份分桶取最早几年的文书;司法厅许可决定书;律协执业机构变更公示
- 实战案例:马士成 2019 年入广东晟典,但 2018 年文书显示其在广东众诚律师事务所(记载为"实习律师")。
只按"晟典"检索会漏掉 4 件早期案件。--firm 参数要把所有历史律所都传进去。
3. 检索与召回自检(决定样本质量)
通道优先级、参数含义、分桶策略详见 references/retrieval-and-classification.md。核心结论:
- 主检通道只有一个:元典
yuandian_rh_ptal_search,qw="姓名 律所"(AND)
- 企查查·法律不支持以代理律师为检索字段(实测 0 条),不要浪费时间
- 威科先行可交叉验证,但配额易耗尽 - "律师"不是检索字段 → 召回必然不完整,必须如实披露
- 召回自检是硬闸门:每次检索后比对
total与len(lst)
-len(lst) < total→ 必须分桶重跑(按年ja_start/ja_end、按文书种类wszl、按案件类别ajlb)
- 多检索式结果按案号去重合并
- 脚本会在extract阶段自动打印截断告警 - 不重跑检索:返回超 token 时系统会自动落盘到
~/.workbuddy/projects/<proj>/<session>/tool-results/mcp-*.txt,用脚本读文件即可
4. 统计与判定
直接跑脚本,不要手写解析:
PY="C:/Users/MyPC/.workbuddy/binaries/python/versions/3.13.12/python.exe"
SK="$HOME/.workbuddy/skills/litigation-counterpart-profile"
# 第一步:抽取 / 去重合并 / 机构归属过滤
"$PY" "$SK/scripts/profile_pipeline.py" extract \
--results-dir "<tool-results 目录>" \
--name <姓名> \
--firm <当前律所> --firm <执业初期律所> \
--extra extra.json \
--out cases.json
# 第二步:输出 Markdown 统计报告
"$PY" "$SK/scripts/profile_pipeline.py" stat --cases cases.json --out report.md
脚本会输出:案由分布、程序角色与实质身份两张立场表、攻守归类、法院层级、
程序/审级、常出庭法院、年份分布、执业机构,以及 ⚠️ 需人工复核清单。
口径必须与手工一致的三条铁律
- 攻守看实质身份,不看程序位置——
被上诉人(原审原告)是攻方 - 角色判定必须先把当事人首部与正文切开——否则同一律师会被判成两个角色
- 回退判定项必须单列并标注浮动区间——不要用硬猜的数字填表
5. 战绩章节的写法
用户会要求"战绩",但直接给胜率是错的(调解书不上网、撤诉上网率低、执行到位不公开、检索本身不完整)。
正确做法:
1. 明文警告"任何胜率结论在此样本上都不成立"
2. 列结果要素分布(撤回起诉 / 支持类判项 / 驳回上诉维持原判 / 终本 / 仲裁裁决相关)
3. 挑可确证的代表性案例,附案号 + 判决书原文引述 + 其代理方位置与胜负
4. 说明哪些指标不可测量(真实胜率、和解率、执行到位率)
6. 行为画像
- 律所官网"所内活动报道"是金矿——律师本人的专业分享/讲座常由律所官网或公众号发布,
是唯一可逐字引用的公开观点来源。检索式:"律所名" 姓名 分享 / 讲座 / 专业下午茶 / 沙龙 - "无自媒体"是有效结论,不是失败——须明文写出,并给出庭前启示:
用公开言论预判其主张的路径失效,改走同类案由文书说理反推 - 同案搭档统计:统计本所搭档出现频次 → 提示实际出庭人可能是搭档,建议向法院确认出庭代理人
- 稳定客户/案源识别:同一当事人反复出现的系列案 = 其核心客户,可推断业务偏好
7. 交付前自查清单
- [ ] 身份四要素齐全,同名排除记录已写入,无"默认选第一个"
- [ ] 执业初期律所已检索并纳入
- [ ] 每项检索式的
total与lst已比对,截断项已分桶补齐 - [ ] 有效样本量、统计区间、截至日期三处都标了
- [ ] 立场给了两张表(程序角色 + 实质身份),攻守按实质身份算
- [ ] 回退判定项已列出,并写明"人工复核后可能浮动 ±N"
- [ ] 战绩未给单一胜率,已列不可测量项
- [ ] 关键结论均有可溯源链接
- [ ] 未转载个人手机号/微信号/私人邮箱
- [ ] 免责声明完整(见
references/deliverable-spec.md§3) - [ ]
present_files已调用 - [ ] 追问三件事已发出:①涉案件由/争议焦点/我方立场 ②承办法院与法官 ③统计区间偏好
- [ ] 已写入工作区
memory/YYYY-MM-DD.md
8. 成功经验(v1.0.0→v1.1.0 验证有效,请保持)
| # | 做法 | 为什么有效 |
|---|---|---|
| 1 | 多检索式 + 去重合并 | 单式 total=54 却只返回 50;三式合并得 61 件唯一文书 > 任一单式 total。合并是必做,不是优化 |
| 2 | 按结案日期分桶 | ja_start/ja_end 是唯一能把返回量压进 token 限额的维度,且天然覆盖不同年份 |
| 3 | 提前识别"执业初期律所" | 一次查到众诚所,多拿 4 件早期案件,否则执业前 2 年整段空白 |
| 4 | 结果落盘后用脚本解析,不重跑检索 | 超 token 自动落盘,重跑浪费配额且无法保证结果一致 |
| 5 | 把"无自媒体"写成结论 + 庭前启示 | 空白本身就是情报:说明无法用其公开言论预判,必须换路径 |
| 6 | 挖律所官网活动报道 | 唯一可逐字引用的本人方法论来源(马士成"先程序后实体"即由此得来),比自媒体更真实 |
| 7 | 战绩改为"结果要素分布 + 代表性案例" | 既满足用户对战绩的需求,又不制造虚假精度 |
| 8 | 按"我方原告/被告"分叉写庭前启示 | 画像的终点是可执行动作,不是资料汇编 |
| 9 | 把判定脚本沉淀为工具 | 角色/机构判定规则复杂且易错,脚本化后可复现、可回归测试 |
| 10 | 脚本自报不确定性 | 9 件回退判定单列 + 浮动区间说明,比"看起来很精确"更可信 |
9. 失败教训(踩过的坑,务必规避)
9.1 本机环境类
| # | 故障 | 现象 | 处置 |
|---|---|---|---|
| 1 | Bash PATH 缺失 | dirname/head/cd 全部 command not found |
每条命令前 export PATH="/c/Users/MyPC/.workbuddy/binaries/PortableGit/versions/1.2.0/usr/bin:/usr/bin:/bin:$PATH";Python 用绝对路径 |
| 2 | CDP 浏览器不可用 | web-access check-deps 报 proxy 连接超时;9222 端口返回 403 Connection rejected |
端口被一个 --no-startup-window 的空壳 Edge 实例占用。重启会复现,不要建议用户重启。改用 WebSearch / WebFetch 静态层 |
| 3 | Python 输出中文乱码 | Windows 控制台编码非 UTF-8 | 脚本内 sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') |
9.2 数据通道类
| # | 教训 | 处置 |
|---|---|---|
| 4 | 企查查·法律检索律师名 → 0 条 | 该库不支持以代理律师为检索字段。别当成"这个律师没案子",换元典 |
| 5 | 威科先行配额耗尽 | 返回 {"code":"quota_exhausted"}。设计流程时不要把配额型通道放在关键路径上,只作可选交叉验证 |
| 6 | 元典返回超 token 被截断/落盘 | 不要反复重跑;读落盘文件,并按日期分桶缩小条件 |
9.3 方法学类(最昂贵的三条)
| # | 教训 | 后果 | 修复 |
|---|---|---|---|
| 7 | 只查当前律所 | 丢失执业初期全部数据 | 主动检索历史律所,--firm 传全部 |
| 8 | 不划"当事人首部"边界就做角色归属 | 列表最后一条条目吞掉整篇正文 → 正文里的姓名提及被算进该条目 → 同一律师在同一份文书里被判成原告和被告(实测 9 件全错) | 用 BODY_RE 求首部结束位置,正文内的姓名提及不参与角色判定 |
| 9 | 按程序位置而非实质身份算攻守 | 被上诉人(原审原告) 被判成守方 → 攻守画像反向 |
捕获括号内实质身份,剥离"原审/一审/二审"前缀后再归类 |
9.4 合规类
| # | 教训 | 处置 |
|---|---|---|
| 10 | 把律师手机号/个人邮箱从官网原样转载进交付物 | 对庭前准备无用,却构成对他人联系方式的二次扩散。规则:个人联系方式不写入交付物,只写律所机构地址 |
9.5 返工类
| # | 教训 |
|---|---|
| 11 | 先产出交付物、后写脚本 → 口径不一致要返工。应先跑脚本出统计,再据此写交付物 |
| 12 | 判定规则改动后必须回归验证(用同一份真实样本重跑,确认攻守比回到手工核对值),否则修一处错一处 |
9.6 已知未解项(诚实登记)
- 无法评估召回率:裁判文书上网不完整,没有任何通道能给出"该律师真实案件总数"作为分母。
因此不能声明样本覆盖率,只能声明样本量。 - 调解/撤诉案件大量缺失:导致战绩类指标系统性偏高或偏低,方向不可知。
fallback判定的准确性未验证:目前只能标记出来交人工复核,未找到自动化校验方案。- 跨省执业经验:样本中异地案件极少时,无法判断是"不去外地"还是"外地文书未上网",交付物中应避免下此结论。
10. 交付形态
默认产出自包含 HTML 画像卡(light 主题、单文件、可直接打印分享),命名
<姓名>律师-对庭背景画像卡.html 放工作区根目录。
固定章节顺序、版式规范、合规红线、免责声明模板 → 见 references/deliverable-spec.md。
11. 版本管理
- 版本号写入 frontmatter 的
version字段 - 每次实质修改:先把当前
SKILL.md复制到VERSIONS/v<旧版本>-SKILL.md,再改主文件,
然后在CHANGELOG.md记录 - 回退方法见
CHANGELOG.md
语义化约定:修 bug / 补规则 → 次版本号 +1(1.1.0 → 1.2.0);
只改文案措辞 → 修订号 +1(1.1.0 → 1.1.1);
流程结构性重构(阶段增减、交付形态变更)→ 主版本号 +1(1.x.x → 2.0.0)