关于 OpenCaseLaw — Swiss Caselaw, Statutes & Doctrine
OpenCaseLaw 为法律研究人员和 AI 工具提供瑞士判例、法规及引证数据。其 MCP 服务支持德语、法语和意大利语法律研究,也提供 REST、CLI 和 Parquet 访问方式。
主要功能
- 01搜索逾百万条法院记录
- 02检索联邦及州级法规
- 03探索判例与法规引证
- 04获取判决结构及段落
- 05访问立法材料与评注
适用场景
- 01查找瑞士各法院判决
- 02追踪主要判例和上诉链
- 03核验法律草稿中的引证
- 04整理可分享的研究证据包
MCP 相关
远程 MCP 服务提供 42 个公开研究工具,可用于搜索判决和法规、探索引证关系及获取结构化法律材料。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://mcp.opencaselaw.ch/mcpclaude mcp add --transport http ch-opencaselaw-swiss-caselaw https://mcp.opencaselaw.ch/mcp{"mcpServers":{"ch-opencaselaw-swiss-caselaw":{"type":"http","url":"https://mcp.opencaselaw.ch/mcp"}}}在 Cursor 中打开{"servers":{"ch-opencaselaw-swiss-caselaw":{"type":"http","url":"https://mcp.opencaselaw.ch/mcp"}}}在 VS Code 中打开{"mcpServers":{"ch-opencaselaw-swiss-caselaw":{"type":"http","url":"https://mcp.opencaselaw.ch/mcp"}}}{"mcpServers":{"ch-opencaselaw-swiss-caselaw":{"serverUrl":"https://mcp.opencaselaw.ch/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
https://mcp.opencaselaw.ch/mcphttps://mcp.opencaselaw.ch/sse工具
42| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| limit | integer | 否 | 最大结果数(默认值 10,最大值 50)。 |
| query | string | 是 | 自然语言或关键词查询。 |
详细介绍
OpenCaseLaw
面向法律研究和 AI 的瑞士判例法与立法开放平台。
超过 100 万份判决 · 覆盖全部 26 个州 · 1875 年至今 · 引证图谱 · MCP + REST + CLI + Parquet · CC0 数据 · MIT 代码
试用搜索 · 与你的 AI 聊天 · 自动化研究 · 下载数据集 · API 文档
你可以做什么
- 搜索瑞士联邦法院和各州法院的判决,涵盖德语、法语和意大利语。
- 追踪案件之间的引证,找出某个问题的先导判决。
- 在 Claude、兼容 ChatGPT 的客户端或任何 MCP 客户端中查询判例法和立法。
- 使用研究 CLI保存可重复运行的研究脚本、检查引证解析,并保留选定的证据。
- 下载语料,用于法律 NLP、检索和图谱研究。
30 秒内完成连接
{
"mcpServers": {
"opencaselaw": {
"url": "https://mcp.opencaselaw.ch/mcp"
}
}
}
无需注册,无需 API 密钥,仅支持只读。提供 42 个工具;各客户端的设置指南请见 opencaselaw.ch/mcp。
正在使用 Anthropic 的 Claude for Legal 插件? 这里提供一份瑞士法律操作手册,可让该插件的合同审查和 NDA 筛查技能适用于 瑞士法律,且每条法规均已对照法规镜像核验: opencaselaw.ch/claude/legal.local.md; 另请参阅设置指南。
自动化研究
ocl 是一个基于公开研究 API 的轻量命令行客户端,专为处理聊天窗口
不擅长的两类任务而设计:核对草稿中的引证,以及将备忘录背后的证据
保存在可共享的文件夹中。它已发布至 PyPI,包名为 opencaselaw-cli:
pipx install opencaselaw-cli # or: uv tool install opencaselaw-cli
ocl citations resolve 'BGE 136 III 513' '4A_747/2012' 'BGE 999 III 1'
ocl bundle create 'Rachekündigung Art. 336 OR' --max-results 10 --passage 2 --law OR:336 --out evidence
第一个命令会逐条列出引证,说明判决是否存在、具体是哪份判决,以及请求的 Erwägung 是否存在。第二个命令会将选定的判决、段落和法规条文保存到一个文件夹中,其中包含通俗易懂的 INDEX.md 和带哈希的 manifest.json。所有内容均由服务原样返回:引证字符串、段落文本和来源链接。搜索范围有限制;引证核查只确认判例是否存在,并不确认其是否支持某项主张。请参阅 CLI 指南。
对话请使用 MCP,自动化请使用 CLI 或 REST API,语料规模的分析请使用 Parquet。
真实结果示例
问题。 根据瑞士法律,员工提出主张后遭到报复性解雇,在什么情况下构成滥用?
一次调用 — search_decisions("missbräuchliche Kündigung Rachekündigung")
返回 129 份判决,最具代表性的判决列在首位:
BGE 136 III 513(2010 年 10 月 7 日)
Art. 336 OR; missbräuchliche Kündigung. Der Arbeitnehmer ist vor einer Rachekündigung nur geschützt (Art. 336 Abs. 1 lit. d OR), sofern er nach Treu und Glauben annehmen kann, dass die von ihm geltend gemachten Ansprüche berechtigt sind. Es ist nicht erforderlich, dass sie tatsächlich begründet sind.
Regeste 内容直接原样返回自存储的官方判决要旨,引证字符串则来自存储字段——工具不会自行构造引证。这一约定让答案可以核验,而非仅仅听起来可信。
复现方法:
curl -sG https://mcp.opencaselaw.ch/api/decisions \
--data-urlencode "q=missbräuchliche Kündigung Rachekündigung" \
--data-urlencode "limit=3"
覆盖范围
| 资源 | 覆盖范围 |
|---|---|
| 法院裁决 | 1,050,000+ 条记录,118 个法院和来源集合,1875 年至今 |
| 语言 | 德语、法语、意大利语(另有英语,适用于唯一权威文本为英语的 ECtHR 判决) |
| 法律 | 5,525 部联邦法律,15,600 部州级法律(涵盖全部 26 个州) |
| 引用图谱 | 约 1,000 万条已解析的裁决间关联边,1,240 万条法规引用 |
| 释义层 | 联邦委员会咨文、评注、开放获取学术研究、联邦行政实践 |
| 访问方式 | Web、MCP、REST、研究命令行、每日 CC0 Parquet |
| 许可 | CC0 数据、MIT 代码(ECtHR 文本 © ECHR-CEDH,详见数据卡) |
计数均由唯一事实来源生成,见
docs/canonical_numbers.md,每项数据旁均记录了验证方法。
明确说明局限性。 门户限制访问的来源无法做到完全覆盖;我们会记录这些来源,而不是避而不谈。引用图谱报告的是解析 覆盖率(93.8 %),并非精确率估计——人工语义审计正在准备中。部分州级裁决可能未经删节即由法院发布;我们沿用上游的假名化处理,不会再次进行假名化。请参阅 治理与移除政策。
一周,绘于图中
每周五,我们会用五种方式描绘瑞士判例法中的这一周,每种方式对应网站的一种语言:浮雕地图(德语)、以线条呈现的 151 年(法语)、乐谱(意大利语)、色块(罗曼什语)和收据(英语)。同一周,同一组数字。完整档案见 opencaselaw.ch/posters。
这些海报由 scripts/weekly_poster_editions.py 根据已提交的 docs/stats.json 历史记录生成,与语料库一样采用 CC0 许可。
贡献
数据质量报告是最有价值的贡献——迄今为止收到的每一份报告都已复现、修复,并通过回归测试加以锁定。请参阅 CONTRIBUTING.md。
本页其余部分为参考详情。
项目缘起
如今,瑞士法律研究分散在各个付费墙之后,无法供大模型访问,而且费用高得令人难以承受,最需要它的人——法学院学生、独立研究人员以及大型律所之外的所有人——尤其如此。商业数据库(Weblaw、Swisslex、Legalis)每月收费数百瑞郎,却仍不提供整洁的 API。大模型因无法获取权威来源而会编造法规文本。小州将裁决发布在无人索引的 PDF 档案中。
OpenCaseLaw 解决了这些问题。每一项已发布的瑞士法院裁决、每一部联邦和州级法律、它们之间已解析的引用图谱,以及 44 个 MCP 工具(公共模式下有 42 个远程工具,另有 2 个仅限本地使用),让任何现代大模型都能充当瑞士法律研究助手——全部免费、全部开放、全部自动更新。
你将获得什么
判例 —— 超过 1,050,000 条裁决记录(约 909,000 项唯一裁决;保留并关联跨标识符重复记录,绝不删除),涵盖 1875 年至今、118 家法院,提供全文和结构化元数据,包括:
- 全部 7 家联邦法院(BGer、BVGer、BStGer、BPatGer、BGE、BGE 历史判例、BGE-EGMR)
- 联邦军事法院(Militärkassationsgericht / MKG,1915–2025 年的 1,244 项裁决)
- 全部 26 个州级法院系统(第一、第二和第三审级)
- 监管机构裁决(FINMA、ComCo、FDPIC、IndepBC、ElCom、PostCom、ComCom)
- ECHR/EGMR:涉及瑞士作为被申请国的资料(487 篇由 BGE 发布的 EGMR 译文、847 篇标记为涉及瑞士的 HUDOC 文档),以及针对 46 个被申请国中任一国家、重要性为 1–3 的所有 ECtHR 分庭和大法庭判决——共 8,275 项判决;法院发布法文文本时使用法文,否则使用英文。重要性为 4 的判决(重要性低且重复,涵盖委员会的全部案件)和可受理性裁决不在范围内。
- 三种官方语言:德语 463,012(46.7%)、法语 446,869(45.1%)、意大利语 81,796(8.2%);架构为罗曼什语保留了
rm - 通过案号规范化和结合内容长度的合并进行去重
- 每日更新;BGer 判决在法院发布后约 15 分钟内即可获取
立法 —— 每一项瑞士联邦和州级法律均在本地镜像,并按条文建立索引:
- 5,525 项联邦法律 / 每种德语、法语和意大利语版本约 133,359 条条文,来自 Fedlex SPARQL 端点
- 15,600 项州级法律 / 361,430 条条文,直接从全部 26 个州抓取(LexWork 涵盖 18 个州,SIL 涵盖 2 个州,ZH OpenData 涵盖 ZH,TI~RL 涵盖 TI);对于主要门户中缺失的法律,LexFind PDF 备用来源补充了 4 个州
- 统一的 SQLite FTS5 搜索可同时检索两个语料库;条文查找耗时不到 1 毫秒
- 每月 2 日刷新(法律生效后的次日)
- 1,240 万条裁决到具体法规条文的已解析链接
引文图谱 —— 瑞士法律体系中唯一公开的大规模引文图谱:
- 965 万条已解析的裁决间引文边(共提取 1,000 万条),附带置信度分数
- 1,240 万条裁决到法规的链接,已根据当前合并文本解析
- 双向查找、上诉链解析(Instanzenzug)、按引文权威性对指导性案例进行排名
- 支持
find_leading_cases、find_citations、find_appeal_chain、analyze_legal_trend(排名第一:BGE 125 V 351,共有 85,108 条入引文) 44 个 MCP 工具(公开模式下有 42 个远程工具 + 2 个仅限本地的工具)——可在你选择的大模型中运行的专业研究工具: - 自然语言决策搜索(BM25 + 同义词扩展 + Haiku 重排,在 100 条查询的黄金集上达到 MRR@10 = 0.647)
- 重要判例发现、引证网络、上诉链、判例法演变
- 联邦和州法律条文查询,以及两者的全文搜索——支持口语→法律词汇扩展(搜索 “Vaterschaftsurlaub” 可找到相关法规,尽管法规写的是 “Urlaub des andern Elternteils”),并支持跨语言州法律搜索(德语查询可找到法语/意大利语州法律)
- 法理概览(法规 + 按权威性排序的 BGE + 时间线 + Botschaft 参考)
- 立法沿革(Materialien)——包含 83,958 条 Botschaft 修法引用,涵盖 9,139 份 BBl 出版物和 33,465 个不同的(法规,条文)组合;《联邦公报》(Bundesblatt)Materialien 原文(19,800 多份 DE/FR/IT 文档、约 165 万段:联邦委员会 Botschaften、联邦委员会的报告和意见、议会委员会报告、法案草案;自 1999 年起与 Fedlex 数据完整对应,1850–1999 年的内容正在根据联邦档案扫描件补充;有 26,500 多个链接指向相关法规条文),以及Fedlex 上自 1993 年以来的每次联邦 Vernehmlassung(2,694 项程序,涵盖 FOJ 立法项目;10,296 份文档原文:Erläuternde Berichte、Vorlagen、Ergebnisberichte、Stellungnahmen——其中 Stellungnahmen 自 2016 年起系统地发布于 Fedlex),可通过
search_botschaft(对原文语料进行主题全文搜索,支持按doc_type筛选)、get_materialien(Fedlex 链接到某项法律的文档和征询意见,以及针对某条文的 Erläuternder-Bericht 段落)、get_article_purpose(特定条文的 Botschaft 原文)和get_article_history(整合法规 + Botschaft + 重要判例 + 评论的时间线)访问;BV 和 BGFA 的逐条摘要(立法意图、关键论据、设计选择、被否决的替代方案);BV 的议会辩论记录。通过 Fedlex SPARQL 发现机制,将 Botschaften 原文完整摄取并扩展至约 25,000 份的工作正在进行。 - 判决结构访问——
get_decision_structure(拆分 Sachverhalt + Erwägungen + Dispositiv + Regeste)、get_erwaegung(原文 Schweizer 引证格式的单元,例如get_erwaegung("BGE 136 III 513", "2.3"))、get_regeste(BGer/BVGer/BStGer 官方判决要旨) - 在线评论查询,来源包括 OnlineKommentar.ch 和 OpenLegalCommentary.ch(1,131 篇评论)
- 根据真实 BGE 案情生成的Fallbearbeitung 考试题,并附带用于练习的隐藏分析
- 根据案情起草模拟判决(用于为大模型输出提供依据的研究工具)
- 结构化案件摘要(regeste、Sachverhalt、Erwägungen、Dispositiv、引述的法规、权威文献)
多种访问方式——与你的 AI 聊天、自动化研究,或下载语料库:
面向大模型用户、研究人员和开发者:
- 远程 MCP 服务,地址为
mcp.opencaselaw.ch(SSE + Streamable HTTP)——可在任何 MCP 客户端(Claude、ChatGPT、Cursor、Gemini、Windsurf)中用 30 秒完成设置 - 适用于 Grok/xAI 和任何支持函数调用的大模型 API 的 OpenAI 兼容工具定义
- 本地 MCP 服务——具备完整离线能力,包含全部 44 个工具(2 个仅限本地的更新工具可离线使用),需要约 65 GB 磁盘空间
- 轻量级研究命令行工具——支持 JSON/JSONL、批量输入、保存证据包和引证解析;
pipx install opencaselaw-cli;源码位于clients/python/ - REST API,附带交互式文档(Swagger UI + OpenAPI 规范)
- 通过 HuggingFace 数据集批量下载 Parquet(约 7 GB)
- 可在 opencaselaw.ch 使用实时仪表板和浏览界面 面向起草文件的法律从业者——精选的从业者工具集:
- Word 插件 — 搜索判决,并直接在 Word 中插入格式正确的瑞士法律引注(无需复制粘贴)。点击一项 Erwägung,即可插入带有正确子引注的内容;点击法律条文 §,即可插入相应款项。免费的 Audit 会扫描整份文件,检查虚构的引注和错误的定位信息(确定性检查,不使用大模型)。Pro tier(通过 Stripe 计费,每月 CHF 5,每天共享 25 次 AI 调用,始终启用基于模式的客户端 PII 脱敏;范围和限制见 word.opencaselaw.ch/privacy.html)还提供四种 AI 工具:Verify(将单条引注与判决全文进行核对)、Strengthen(为段落进行 X 光分析,提供按引注图中心性排序的主导判例建议和评注摘录)、Find Support(查找支持无依据陈述的判决,并以 0–100 评分)和 Reflect(为整份文件提供文学映照——一部呈现相同人性困境的典范作品,加一个反思性问题)。通过 REST API 提供约 8 种 MCP 工具(公开模式下有 42 种远程工具,另有 2 种仅限本地的工具),专为撰写法律意见书的工作流优化。
可在论文中论证的性能:
| 指标 | 数值 |
|---|---|
| 判决搜索质量 | MRR@10 = 0.647(在线)/ 0.470(可复现的离线结果)· 比基线高 102 % |
| 条文查询延迟 | < 1 ms(本地 FTS5) |
| BGer 发布到可搜索 | ~15 min(轮询器上线前为 24 h) |
| 每日全文重建 | ~5 h,零停机(原子交换) |
| 引注到判决的解析 | 已解析 9.65 M 条边(共提取 10 M 条) |
项目介绍
这是一个结构化、可搜索的瑞士法院判决档案库,收录从联邦最高法院(BGer)到全部 26 个州法院的判决。每份判决都包含完整判决文本、案号、日期、语言、法律领域、法官、引用的判决,以及 20 多个其他元数据字段。
数据集通过直接抓取官方法院网站和州法院门户网站构建。每天夜间都会抓取、去重并发布新判决。
根据你的需求,有八种使用方式:
| 方式 | 适用对象 | 可获得的内容 |
|---|---|---|
| 使用 AI 搜索 | 所有人 | 在 Claude、ChatGPT、Cursor 或 Gemini 中使用自然语言搜索——即时访问,无需下载,提供完整的 24 个工具 |
| 引用分析 | 法律学者、研究人员 | 重要判例、引用网络、上诉链,以及随时间变化的判例法趋势 |
| 法规查找 | 法律专业人士 | 5,525 部联邦法律和 15,600 部州法律的完整条文,联邦化 FTS5,毫秒级以内完成查询 |
| 立法搜索 | 法律专业人士 | 基于 LexFind 的检索搜索,支持使用 fetch_top_n_texts 构建单次调用的自然语言工作流 |
| 教育工具 | 法学院学生、教师 | 结构化案例摘要、法理时间线、附带隐藏分析的真实 BGE 考题 |
| Word 加载项 | 撰写诉状的法律从业者 | 将格式化的瑞士引注插入 Word · 点击 Erwägung / §,即可插入包含正确子引注的内容 · 免费版 Audit(5 条轨道的引注检查)· Pro(每月 CHF 5,每天 25 次 AI 调用):Verify(对照全文核验引注)· Strengthen(段落透视分析 + 重要判例建议)· Find Support(查找支持某项陈述的判决)· Reflect(文学镜像)——精选约 8 个工具的子集 |
| REST API / 下载 | 开发者、数据科学家、NLP 研究人员 | 研究 REST API,通过 HuggingFace 批量下载 Parquet 数据(约 7 GB) |
| Web 界面 | 所有人 | 实时仪表板,包含语料库统计、每日增量、变化最大的项目,以及多语言浏览功能 |
不确定从哪里开始? 连接到远程 MCP 服务——支持 Claude、ChatGPT 和 Gemini CLI。无需下载,即可即时访问超过 1,050,000 份判决、引用分析、法规查找、立法搜索和教育工具。
1. 使用 AI 搜索
该数据集配有一个 MCP 服务,其确切工具范围取决于部署方式。本地部署提供全部 44 个工具;远程模式不包含 2 个仅限本地的更新工具(update_database、check_update_status),共提供 42 个远程工具。你只需用自然语言提问;工具便会执行全文搜索,并返回包含匹配片段的判决。
远程与本地
| 远程 | 本地 | |
|---|---|---|
| 设置时间 | 30 秒 | 30–60 分钟 |
| 磁盘空间 | 无需 | 约 65 GB |
| 工具 | 38 个(不含本地更新工具) | 40 个,包含 update_database 和 check_update_status |
| 数据新鲜度 | 每夜自动更新 | 手动更新 |
| 离线使用 | 否 | 是 |
| 需要 | Claude、ChatGPT 或 Gemini CLI(见下文套餐) | 任意 MCP 客户端 |
建议先使用远程服务。只有在需要离线访问时,才切换到本地部署。
选项 A:远程服务(推荐)
直接连接托管的 MCP 服务,无需下载数据、无需本地数据库,即可立即访问 1,050,000 多份判决。
托管服务会记录哪些信息。 系统会记录你的查询:工具、参数(包括查询文本)、时间戳、客户端类别和轮换的会话标识符;查询文本会无限期保存在访问受限的私人研究档案中,用于改进搜索和训练我们自己的模型。系统不会将 IP 地址与查询一同存储,也没有账户或登录流程,而且会话标识符每次连接都会更换。完整详情请见五种语言版本的:隐私声明。如果你的查询包含机密信息,或你代表客户提交查询,请使用下方的选项 B,在本地运行语料库,确保任何信息都不会离开你的设备。
Claude.ai / Claude Desktop(最简单):
- 打开 设置 → 连接器
- 点击 “添加自定义连接器”
- 粘贴
https://mcp.opencaselaw.ch - 点击 添加
浏览器(claude.ai)和桌面应用的操作步骤相同。无需 Node.js、配置文件或下载。
适用于 Pro、Max、Team 和 Enterprise 套餐。免费套餐请使用 Claude Code 或手动 JSON 配置。
Claude Code:
claude mcp add swiss-caselaw --transport sse https://mcp.opencaselaw.ch
替代方式:手动 JSON 配置(无法使用自定义连接器时)
添加到 claude_desktop_config.json(需要 Node.js):
{
"mcpServers": {
"swiss-caselaw": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.opencaselaw.ch"]
}
}
}
保存后重启 Claude Desktop。
ChatGPT:
- 打开 设置 → 应用 → 高级设置 → 启用 开发者模式
- 点击 创建应用 → 将其命名为
Swiss Caselaw,粘贴https://mcp.opencaselaw.ch/sse,身份验证:无 - 在任意聊天中:点击 + → 开发者模式 → 选择 Swiss Caselaw
适用于 Plus、Pro、Team、Enterprise 和 Edu 套餐。建议搭配 GPT-5.3 使用(GPT-5.4 目前不支持调用 MCP 工具)。
Gemini CLI:
添加到 ~/.gemini/settings.json:
{
"mcpServers": {
"swiss-caselaw": {
"url": "https://mcp.opencaselaw.ch"
}
}
}
保存后重启 Gemini CLI。无需账户套餐,Gemini CLI 免费使用。
Google ADK(Agent 开发套件):
构建可使用所有工具的 Gemini 驱动 Agent:
from google.adk.agents import LlmAgent
from google.adk.tools import MCPToolset
from mcp.client.sse import SseConnectionParams
agent = LlmAgent(
model="gemini-3.1-pro",
name="swiss_law_agent",
instruction="You are a Swiss legal research assistant.",
tools=[
MCPToolset(
connection_params=SseConnectionParams(
url="https://mcp.opencaselaw.ch/sse",
),
),
],
)
如需 Google Gen AI SDK 示例及其他所有平台的说明,请参阅完整 MCP 设置指南。
所有平台的详细说明请参阅**完整 MCP 设置指南**。
update_database和check_update_status工具仅在本地服务上可用,远程数据集每晚自动更新。
选项 B:本地服务(离线访问)
使用自己的数据库副本(约需 65 GB 磁盘空间)在本地运行 MCP 服务。这样你可以离线访问数据,并完全掌控数据。
使用 Claude Code 设置
Claude Code 是 Anthropic 提供的命令行工具,用于在终端中使用 Claude。
步骤 1。 克隆此代码库:
git clone https://github.com/jonashertner/opencaselaw.git
cd caselaw-repo-1
步骤 2。 创建虚拟环境并安装 MCP 服务依赖项:
python3 -m venv .venv
# macOS / Linux
source .venv/bin/activate
pip install mcp pydantic huggingface-hub pyarrow fastapi
# Windows (PowerShell)
.venv\Scripts\Activate.ps1
pip install mcp pydantic huggingface-hub pyarrow
步骤 3。 在 Claude Code 中注册 MCP 服务:
# macOS / Linux
claude mcp add swiss-caselaw -- /path/to/caselaw-repo-1/.venv/bin/python3 /path/to/caselaw-repo-1/mcp_server.py
# Windows
claude mcp add swiss-caselaw -- C:\path\to\caselaw-repo-1\.venv\Scripts\python.exe C:\path\to\caselaw-repo-1\mcp_server.py
请使用 .venv 中 Python 二进制文件的完整绝对路径,这样无论你从哪个目录运行 Claude Code,服务都能找到其依赖项。
步骤 4。 重启 Claude Code 并进行首次搜索。
首次使用时,服务会自动:
- 从 HuggingFace 下载所有 Parquet 文件(约 7 GB)到
~/.swiss-caselaw/parquet/ - 在
~/.swiss-caselaw/decisions.db构建本地 SQLite FTS5 全文搜索索引(约 58 GB)
根据设备和网络连接情况,这需要 30–60 分钟。此过程仅需执行一次,之后即可通过本地数据库即时搜索。
磁盘总用量: ~/.swiss-caselaw/ 中约 65 GB(macOS/Linux),或 %USERPROFILE%\.swiss-caselaw\(Windows)。
使用 Claude Desktop 进行设置
请参阅 Claude Desktop 设置指南,了解分步说明(macOS + Windows)。
快速设置 — 将以下内容添加到 claude_desktop_config.json:
{
"mcpServers": {
"swiss-caselaw": {
"command": "/path/to/caselaw-repo-1/.venv/bin/python3",
"args": ["/path/to/caselaw-repo-1/mcp_server.py"]
}
}
}
配置文件位置:~/Library/Application Support/Claude/claude_desktop_config.json(macOS)或 %APPDATA%\Claude\claude_desktop_config.json(Windows)。在 Windows 上,请改用 .venv\\Scripts\\python.exe。
任何兼容 MCP 的客户端都可以使用相同的 command + args 模式。
保持数据最新
数据集每天更新。若要获取最新决策,请让 Claude 运行 update_database 工具,或显式调用该工具。此操作会从 HuggingFace 重新下载 Parquet 文件,并重建本地数据库。
SQLite 快照制品
HuggingFace 数据集还可能在 artifacts/sqlite/snapshots/ 下发布完整的压缩 SQLite 基础快照,供引导工具使用。其元数据位于 artifacts/manifest.json 中的 snapshot 字段;如果该值为 null,使用方应回退到上述 Parquet 重建流程。
此快照用于本地 MCP/服务引导:下载 artifacts/manifest.json,获取 snapshot.sqlite_zst.path,验证 snapshot.sqlite_zst.sha256,解压到 decisions.db.tmp,执行快速的 SQLite 行数/架构检查,然后以原子方式将其移动到 decisions.db。随后,支持增量更新的工具可以应用更新的 artifacts/sqlite/deltas/*.sqlite.zst 条目。
手动引导快照:
pip install zstandard
python - <<'PY'
import hashlib
import json
import os
import sqlite3
import urllib.request
from pathlib import Path
import zstandard as zstd
base = "https://huggingface.co/datasets/voilaj/swiss-caselaw/resolve/main"
data_dir = Path(os.environ.get("SWISS_CASELAW_DIR", Path.home() / ".swiss-caselaw")).expanduser()
data_dir.mkdir(parents=True, exist_ok=True)
with urllib.request.urlopen(f"{base}/artifacts/manifest.json") as r:
manifest = json.load(r)
snapshot = manifest.get("snapshot")
if not snapshot:
raise SystemExit("No SQLite snapshot is advertised; use update_database instead.")
meta = snapshot["sqlite_zst"]
tmp_db = data_dir / "decisions.db.tmp"
final_db = data_dir / "decisions.db"
class HashingReader:
def __init__(self, raw, digest):
self.raw = raw
self.digest = digest
def read(self, size=-1):
data = self.raw.read(size)
if data:
self.digest.update(data)
return data
h = hashlib.sha256()
with urllib.request.urlopen(f"{base}/{meta['path']}") as src, tmp_db.open("wb") as dst:
zstd.ZstdDecompressor().copy_stream(HashingReader(src, h), dst)
if h.hexdigest() != meta["sha256"]:
tmp_db.unlink(missing_ok=True)
raise SystemExit("SHA-256 verification failed")
con = sqlite3.connect(tmp_db)
try:
rows = con.execute("SELECT COUNT(*) FROM decisions").fetchone()[0]
con.execute("SELECT decision_id FROM decisions LIMIT 1").fetchone()
finally:
con.close()
expected = snapshot.get("rows")
if expected is not None and rows != expected:
raise SystemExit(f"Row-count check failed: got {rows}, expected {expected}")
tmp_db.replace(final_db)
print(f"Installed {final_db} with {rows:,} decisions")
PY
本地数据库的工作原理
~/.swiss-caselaw/
├── parquet/ # Downloaded Parquet files from HuggingFace (~7 GB)
│ └── data/
│ ├── bger.parquet
│ ├── bvger.parquet
│ └── ... # 100 files, one per court
├── decisions.db # SQLite FTS5 search index (~58 GB)
├── reference_graph.db # Case citations + statute links (~3.5 GB)
└── statutes.db # Federal law articles from Fedlex (~610 MB)
所有数据都保留在你的设备上。搜索期间不会发出任何 API 调用——MCP 服务会直接查询本地 SQLite 数据库。
数据库结构。 decisions.db 是一个包含两张表的 SQLite 单文件:
-
decisions— 主表,每项裁决占一行。包含 24 个列,包括面向搜索的字段,以及json_data(完整记录数据块)和用于支持去重查询的canonical_key。表按court、canton、decision_date、language、docket_number、chamber和decision_type建立索引,以便快速筛选查询。 -
decisions_fts— 一个 FTS5 虚拟表,镜像decisions中的 7 个文本列:court、canton、docket_number、language、title、regeste和full_text。FTS5 会在这些列上构建倒排索引,从而支持对 100 万多项裁决进行亚秒级全文搜索。分词器为unicode61 remove_diacritics 2,可处理德语、法语、意大利语和罗曼什语中的重音字符。插入、更新和删除触发器会自动使 FTS 索引与主表保持同步。
为何约为 58 GB。 96.2 万多项法院裁决的全文平均每项约 15 KB。对于每个唯一词元、其所在位置以及所属列,FTS5 倒排索引都会增加额外开销。这是已知的权衡:大型文本语料的 FTS5 索引会远大于源数据,但它无需外部基础设施即可实现即时排序搜索。
搜索流程。 搜索时,服务会:
-
检测查询意图 — 查询案号(
6B_1234/2023)、显式 FTS 语法(Mietrecht AND Kündigung)或自然语言(decisions on tenant eviction)。 -
运行多种 FTS5 查询策略 — 对于自然语言查询,服务会生成多个 FTS 查询变体(AND、OR、短语、聚焦于 regeste/title 字段,以及扩展多语言词项),并依次执行。每种策略都会产生一组排序后的候选结果。对于显式语法(AND/OR/NOT、带引号的短语、列筛选器),会优先尝试原始查询。
-
通过 RRF 融合候选结果 — 使用倒数排名融合(Reciprocal Rank Fusion)合并所有策略的结果:每个候选结果的分数是所有返回该结果的策略中
1/(k + rank)的加权总和。被多种策略找到的裁决会获得加权提升。 -
使用信号评分重新排序 — 根据综合分数对排名靠前的候选结果重新排序,该分数结合了:
- BM25 分数(来自 FTS5,采用自定义列权重:
full_text1.2、regeste5.0、title6.0——判决摘要和标题的权重大幅高于正文) - 词项在标题(3.0 倍)、regeste(2.2 倍)和摘要片段(0.8 倍)中的覆盖率
- 标题/regeste 中的短语匹配(1.8 倍)
- 案号匹配 — 完全匹配(6.0 倍)或部分匹配(2.0 倍)
- 法规/引用图信号 — 如果查询提及某条款(例如,“Art. 8 BV”),引用该条款的裁决会获得加权提升
- 法院先验权重 — 例如,庇护相关查询会提升 BVGer 的结果
- BM25 分数(来自 FTS5,采用自定义列权重:
-
选择最佳段落 — 对每条结果,服务都会扫描全文,找出最相关的段落,并将其作为摘要片段返回。
可用工具
以下工具在远程和本地均可用,另有说明的除外。
| 工具 | 描述 |
|---|---|
search_decisions | 按全文和筛选条件搜索(法院、州、语言、日期范围、审判庭) |
get_decision | 按案号或 ID 获取单项判决。包含引证关系计数(被引 / 引用)。 |
list_courts | 列出所有法院及其判决数量 |
get_statistics | 按法院、州或年份汇总统计数据 |
find_citations | 显示某项判决引用了哪些判决,以及哪些判决引用了它,并附置信度评分 |
find_appeal_chain | 追溯上诉链(Instanzenzug)——前序和后续审级 |
find_leading_cases | 查找某一主题或法规中被引用次数最多的判决 |
analyze_legal_trend | 按年份统计某项法规或主题的判决数量 |
draft_mock_decision | 根据事实构建仅用于研究的模拟判决大纲,并以判例法和法规引用为依据;在得出结论前会询问澄清问题 |
get_case_brief | 为任何案件生成结构化摘要——regeste、关键 Erwägungen、引用的法规及引证效力 |
get_doctrine | 法规条文或法律概念 → 排序后的典型判例 + 法理演变时间线 |
generate_exam_question | 法律主题 → 真实 BGE 案情,附带隐藏分析,用于 Fallbearbeitung 练习 |
get_law | 按 SR 编号 / 缩写及可选州查询瑞士联邦或州法律。从本地镜像返回完整条文文本(联邦法律来自 Fedlex;州法律来自 cantonal_laws.db——22 个州直接抓取门户网站,其余 4 个州通过 LexFind 提取 PDF) |
search_laws | 统一搜索联邦和州法律的 FTS5 搜索,并通过 BM25 排名交错排列。使用 canton= 筛选特定司法辖区,或使用 jurisdiction='federal' / 'cantonal' |
get_commentary | 从 OnlineKommentar.ch 获取特定联邦法律条文的学术评注(CC-BY-4.0) |
search_commentaries | 在 OnlineKommentar.ch 上的 362 篇法律评注中进行全文搜索,涵盖 19 项联邦法律 |
search_legislation | 基于 LexFind 的联邦和州立法发现搜索。fetch_top_n_texts=N 可在一次调用中为排名前 N 的结果补充完整条文文本 |
get_legislation | 获取任何联邦或州法律的完整元数据和条文文本。优先使用本地数据(statutes.db → cantonal_laws.db → LexFind API 回退) |
browse_legislation_changes | 按州或联邦层级查看近期变更动态(实时 LexFind API,无本地镜像) |
update_database | 从 HuggingFace 重新下载最新 Parquet 文件并重建本地数据库 (仅本地) |
check_update_status | 检查正在运行的数据库更新进度 (仅本地) |
引文完整性工具包(防幻觉)
OpenCaseLaw 将瑞士法律引文视为一个封闭语料库问题:大模型写出的每个引用,要么能在约 105 万条记录组成的语料库及 Fedlex 法规镜像中找到对应条目,要么不能。MCP 服务提供一套包含四种工具的工具包,可端到端地强制执行这一约定。
| 工具 | 用途 |
|---|---|
cite | 为瑞士引文生成规范的 citation_string 和 canonical_url。如果引文是编造的,则返回 exists=false 和 close_matches;大模型应照抄返回的字符串,而不是自行构造。 |
check_claim_support | 针对每项主张的 Sonnet 裁判:给定(主张、decision_id、可选的 pinpoint),根据逐字引用的 Erwägung 文本返回 supports: yes / partial / no / contradicts / unrelated。使用与执行检索的模型(Haiku)不同的模型系列(Sonnet),避免在验证中再次引入检索错误。 |
attest_response | 最终审计,在发送最终答案前调用一次。对大模型的草稿最多运行 五 项检查: ① 案例 — 每条 BGE/BGer/BVGer/BStGer/BPatGer/MKGE 引用均真实存在,且每个 pinpoint 都可解析; ② 法规 — 每条 Art. X LAW 引用都能在 statutes.db 中解析;③ 引文 — 每段不少于 30 个字符的 "…" 都逐字出现在引用来源(判决或法规)中;④ 日期 — 每个紧邻引用的 vom DD.MM.YYYY 都与存储的判决日期一致;⑤ 依据核验(通过 audit_grounding=true 启用)— 对每条已验证的引文,独立的 Sonnet 裁判会检查引用来源是否确实支持大模型附加其上的论述。返回可直接发送的 linked_text,其中每条通过验证的引文都已包裹在 Markdown 链接中。 |
get_erwaegung / get_regeste / get_law / get_materialien / get_commentary | 提供逐字文本的来源,是大模型唯一获准直接引用的来源。 |
该架构旨在防范两类经实证测量的法律大模型错误:
- 幻觉(Dahl、Magesh、Suzgun 和 Ho,Large Legal Fictions,Stanford RegLab,2024 — Journal of Legal Analysis):向通用大模型提出的法律问题中,有 58–88 % 至少会产生一条编造的权威依据。Stanford RegLab 后续对商用法律 RAG 工具的研究(Magesh 等人,Hallucination-Free?,2024)测得的比例为 17–33 %。→ 由审计 ① ② ③ ④ 捕获。
- 推理错误(Butler 和 Butler,Isaacus,Legal RAG Bench,2026 年 3 月):引文真实存在,来源也已检索到,但附加其上的论述实际上并未得到引文文本的支持。→ 由审计 ⑤ 捕获。
完整的服务端提示词(R1–R8)内置了这些规则,因此任何接入的客户端(Claude、ChatGPT、Cursor、Gemini、Copilot Studio)都会自动遵守该约定。实现请参阅 mcp_server.py,回归测试套件请参阅 tests/web/test_attest_audits.py,公开说明请参阅 opencaselaw.ch 上的验证章节。
该架构的端到端表现通过 Swiss Legal RAG Bench 测量。这是一个基于 Butler 和 Butler 的 Legal RAG Bench 方法设计的基准,涵盖德语、法语和意大利语的联邦法律问题,并将错误分解为幻觉、检索和推理问题。v0.1 基线(运行中的 OpenCaseLaw + Claude Sonnet 4.6,共 10 个问题):正确率 100 %,依据充分度 90 %,检索准确率 70 %。
示例查询
这些查询在远程服务和本地服务上都可使用:
> Search for BGer decisions on Mietrecht Kündigung from 2024
> What did the BVGer rule on asylum seekers from Eritrea?
> Show me the full text of 6B_1234/2023
> How many decisions does each court in canton Zürich have?
> Find decisions citing Art. 8 BV
> What are the leading cases on Art. 8 EMRK?
> Show me the citation network for BGE 138 III 374
> How has Mietrecht jurisprudence evolved over time?
> Show me Art. 41 OR (statute lookup)
> Search for statute provisions about Verjährung
> Trace the appeal chain for 5A_234/2026
> Explain BGE 133 III 121 to me
> What are the leading cases on Art. 41 OR and how has the doctrine evolved?
> Give me a practice case on Haftpflichtrecht
> Search for cantonal data protection laws
> Show me the details of SR 220 (Obligationenrecht)
> What legislation changed recently in Zürich?
AI 会自动调用 MCP 工具 — 你可以直接查看搜索结果,并针对特定判决提出后续问题。
引用图工具
四种工具可访问引用图:965 万条已解析的判决到判决引用边(共提取 1,000 万条)和 1,240 万条法规引用。这些工具需要图数据库(output/reference_graph.db);如果该数据库不可用,工具会返回提示,而不会报错。
find_citations — 给定一项判决,显示其发出的引用(它引用了什么)和收到的引用(哪些内容引用了它)。每条已解析的引用都包含目标判决的元数据和置信度分数。未解析的引用(例如,数据集中没有收录的较早判决)会显示其原始引用文本。
> Show me the citation network for BGE 138 III 374
## Outgoing (13 — what this decision cites)
1. BGE 136 III 365 (2010-01-01) [bge] conf=0.98 mentions=1
2. BGE 133 III 189 (2007-01-01) [bge] conf=0.93 mentions=1
...
## Incoming (13,621 — what cites this decision)
1. 5A_234/2026 (2026-02-19) [bger] conf=0.92 mentions=2
2. 5A_117/2026 (2026-01-30) [bger] conf=0.88 mentions=1
...
参数:decision_id(必填)、direction(both/outgoing/incoming)、min_confidence(0–1,默认值为 0.3)、limit(默认值为 50,最大值为 200)。
find_appeal_chain — 追踪某项判决的上诉链(审级链)。显示先前审级(下级法院)和后续审级(向上级法院提起的上诉),重建完整的诉讼程序路径(例如,Bezirksgericht → Obergericht → Bundesgericht)。
参数:decision_id(必填)、min_confidence(0–1,默认值为 0.3)。
find_leading_cases — 查找被引用最多的判决,并按引用它们的其他判决数量排序。可按法规(法律代码 + 条文)、文本查询、法院或日期范围筛选。
> What are the leading cases on Art. 8 EMRK?
1. BGE 135 I 143 (2009) — 3,840 citations
Regeste: Anspruch auf Aufenthaltsbewilligung...
2. BGE 130 II 281 (2004) — 3,155 citations
Regeste: Familiennachzug; gefestigtes Anwesenheitsrecht...
参数:query(可选文本)、law_code + article(可选法规)、court、date_from、date_to、limit(默认值为 20,最大值为 100)。建议至少指定 query 或 law_code;如果不指定任何筛选条件,则返回全局被引用最多的判决。
analyze_legal_trend — 按年份统计判决数量,展示某个主题或法规相关判例如何随时间演变。返回包含数量的表格和可视化条形图。
> How has Art. 29 BV jurisprudence evolved?
**Filter:** Art. 29 BV
**Total:** 34,669 decisions
Year Count Bar
2000 275 █████
2005 733 ████████████
2010 1,028 █████████████████
2015 1,536 ██████████████████████████
2020 1,896 ████████████████████████████████
2025 2,400 ████████████████████████████████████████
参数:query(可选文本)、law_code + article(可选法规)、court、date_from、date_to。必须指定 query 或 law_code 中的至少一项。
法规查询工具(本地,联邦和州级)
两个工具可直接从本地镜像获取瑞士法律文本,覆盖联邦和州级管辖范围,并提供文章级 FTS5 索引和亚毫秒级查询:
- **联邦:**通过 Fedlex SPARQL 端点获取 5,525 部法律 / 约 133,359 条文章,分别使用德语、法语和意大利语版本;每月镜像至
statutes.db。涵盖德语、法语和意大利语中的所有整合版联邦法案。 - 州级:
cantonal_laws.db中有 15,600 部法律 / 361,430 条文章,数据来自以下两种途径:- 直接抓取门户(主要方式)——22 个州的官方 Gesetzessammlungen 通过 LexWork、SIL、ZH OpenData 或 TI Raccolta delle Leggi 平台发布(AG、AI、AR、BE、BL、BS、FR、GE、GL、GR、LU、NE、NW、OW、SG、SH、SO、TG、TI、VS、ZG、ZH)。直接解析 HTML,不进行 PDF 提取或 OCR,从而获得干净的文章级数据。
- LexFind PDF 后备方案——4 个尚未纳入直接抓取范围的州(JU、SZ、UR、VD)。从 LexFind.ch 提取 PDF,使用 PyMuPDF 解析并按文章分段。为 BE / FR / VS / GR 提供双语第二语言处理。
- 与联邦表通过 SQLite FTS5 合并并联合查询。
get_law——按 SR 编号或缩写查询任何瑞士法律(联邦或州级),还可选择获取指定文章的全文。
> Show me Art. 8 BV
# BV — SR 101
**Bundesverfassung der Schweizerischen Eidgenossenschaft vom 18. April 1999**
### Art. 8 — Rechtsgleichheit
1 Alle Menschen sind vor dem Gesetz gleich.
2 Niemand darf diskriminiert werden, namentlich nicht wegen der Herkunft, ...
> Show me Art. 1 of the Zurich Hundegesetz
get_law(canton="ZH", sr_number="554.5", article="1")
参数:sr_number 或 abbreviation(至少需要一个)、article(可选——省略则显示完整文章列表)、language(de/fr/it,默认 de)、canton(默认 CH;查询州级法律时设为 ZH、BE 等)。
search_laws——使用 FTS5 对所有瑞士法规文章进行统一搜索,涵盖联邦和州级内容。每个语料库按 BM25 排序,再按排名交错合并,使每个响应都能呈现两个管辖层级的内容。
> Search for statute provisions about Verjährung
1. [CH] Art. 130 OR (SR 220): Die Verjährung beginnt mit der Fälligkeit der Forderung...
2. [ZH] § 19 Kirchgemeindenreglement (SR 182.60): ... Verjährungsbestimmungen ...
3. [CH] Art. 132 OR (SR 220): Bei der Berechnung der Frist ist der Tag...
参数:query(必填,FTS5 语法)、sr_number(可选——指定一部联邦法律,表示仅搜索联邦法律)、canton(可选——限定一个州,或设为 CH 以仅搜索联邦法律)、jurisdiction(all / federal / cantonal,默认 all)、language(de/fr/it)、limit(1–50)。
法规发现工具(基于 LexFind)
另外三个工具在本地镜像之上接入实时 LexFind API,用于处理镜像无法满足需求的情况——例如刷新周期之间新发布的版本、完整版本历史和近期变更动态。这些工具提供更广泛的发现功能;对于简单的“获取现行文本”查询,get_law / search_laws 更快、更可靠。
search_legislation——在瑞士法规中进行更广泛的发现搜索,并可选择在单次调用中补充全文内容。如果不确定法规属于联邦还是州级,或需要一次性完成自然语言工作流,此工具会很有用。
> Search for the Bernese dog act with full text
search_legislation(query="Hundegesetz", canton="BE", fetch_top_n_texts=2)
→ returns top 2 matches with full_text_preview + sample_articles inline,
no follow-up get_legislation call needed.
参数:query(必填)、canton(可选——CH、ZH、BE 等)、active_only(默认 true)、search_in_content(默认 false——搜索标题/关键词;设为 true 可搜索法律文本)、language(de/fr/it)、limit(1–60,默认 20)、fetch_top_n_texts(0–10,默认 0——设为 N 可为排名靠前的 N 条结果补充解析后的完整文章文本)。
get_legislation——获取特定法律的详细信息,包括元数据、版本历史记录以及官方来源链接(Fedlex、州级门户)。
> Show me the Obligationenrecht on LexFind
SR 220 — Bundesgesetz betreffend die Ergänzung des Schweizerischen
Zivilgesetzbuches (Fünfter Teil: Obligationenrecht)
Entity: Bund (CH) | Category: Gesetz | Keywords: OR
In force since: 01.01.2026
Sources:
DE: https://www.fedlex.admin.ch/eli/cc/27/317_321_377/de
FR: https://www.fedlex.admin.ch/eli/cc/27/317_321_377/fr
参数:lexfind_id(来自搜索结果),或 systematic_number + canton(例如,“220” + “CH”)、include_versions(默认 false)、language(de/fr/it)。
browse_legislation_changes——查看某个州或联邦层级近期的法规变更,包括新法规、修订和废止,以及日期和链接。
> What legislation changed recently in Zürich?
1. [01.03.2026] version — Vollzugsverordnung zur Finanzverordnung (SR 181.131)
2. [01.03.2026] new — Studienordnung für den Masterstudiengang... (SR 414.253.125)
3. [01.03.2026] version — Organisationsverordnung der Finanzdirektion (SR 172.110.3)
参数:canton(默认 CH)、language(de/fr/it)。
教育工具
三个工具支持法律学习,涵盖学生的三项核心工作流:理解案件、理解法理,以及练习考试涵摄。工具会返回丰富的结构化数据;Claude 作为导师,动态生成所有教学内容。
get_case_brief — 任意案件引用(“BGE 133 III 121”、案号或 decision_id)→ 结构化简报。返回 regeste、Sachverhalt、带编号的关键 Erwägungen、Dispositiv、附带文本摘录的引用法规、引用权威性(被引次数/引用次数),以及被引最多的案件和该案件引用的案件。
get_doctrine — 法条(“Art. 41 OR”)或法律概念(“culpa in contrahendo”、“Tierhalterhaftung”)→ 法理概览。返回按引用次数排序的代表性案件、展示规则演变过程的法理时间线,以及法规文本(如适用)。
generate_exam_question — 法律主题(“Haftpflichtrecht”、“Art. 41 OR”、“Mietrecht”)→ 真实的 Fallbearbeitung。此工具会挑选一项代表性 BGE,将匿名化的 Sachverhalt 作为事实案例,并返回隐藏分析(适用法规、法律测试、正确结论)。学生先写出涵摄,再让 Claude 展示分析,以便对照并获取反馈。传入 exclude_ids 可避免重复同一案件。
draft_mock_decision 可选用 Fedlex URL,并会将获取的法规摘录缓存到
~/.swiss-caselaw/fedlex_cache.json(可通过 SWISS_CASELAW_FEDLEX_CACHE 配置)。
搜索质量基准测试
使用固定的黄金查询集,跟踪搜索相关性随时间的变化:
python3 benchmarks/run_search_benchmark.py \
--db ~/.swiss-caselaw/decisions.db \
-k 10 \
--json-output benchmarks/latest_search_benchmark.json
指标:MRR@k、Recall@k、nDCG@k、Hit@1
此仓库还附带一份冻结的离线基线:benchmarks/search_benchmark_2026-03-19_offline_full.json。在包含 100 条查询的完整查询集上,针对本地 decisions.db 中的 1,078,177 行数据运行,记录的指标为 MRR@10 = 0.4697、Recall@10 = 0.4958、nDCG@10 = 0.5250 和 Hit@1 = 0.33。请将其视为可复现的离线基线,而非已完全配置的托管部署得分。
你可以设置最低质量门槛(失败时返回非零退出码):
python3 benchmarks/run_search_benchmark.py \
--db ~/.swiss-caselaw/decisions.db \
-k 10 \
--min-mrr 0.50 \
--min-recall 0.75 \
--min-ndcg 0.85
构建引用关系图(可选)
如需基于法规/引用关系进行重排序,请构建本地图数据库:
python3 search_stack/build_reference_graph.py \
--source-db ~/.swiss-caselaw/decisions.db \
--courts bger,bge,bvger \
--db output/reference_graph.db
然后将服务指向该数据库:
export SWISS_CASELAW_GRAPH_DB=output/reference_graph.db
默认启用图信号。如需禁用,请设置 SWISS_CASELAW_GRAPH_SIGNALS=0。
构建法规数据库(可选)
如需查询法规(get_law、search_laws),请构建 Fedlex 法规数据库:
# Download the top 100 most-cited federal laws from Fedlex
python3 -m scrapers.fedlex --top 100
# Build the SQLite FTS5 statutes database
python3 -m search_stack.build_statutes_db
然后复制到数据目录:
cp output/statutes.db ~/.swiss-caselaw/
或者显式设置路径:
export SWISS_CASELAW_STATUTES_DB=output/statutes.db
2. 下载数据集
完整数据集以 Parquet 文件的形式托管在 HuggingFace 上——每个法院一个文件,每项判决包含 34 个字段,其中包括完整的判决文本。
供机器读取的构件元数据发布在 artifacts/manifest.json 中。除了每日 Parquet/SQLite 增量之外,清单还可能指向一个可选的完整压缩 SQLite 快照,路径为 artifacts/sqlite/snapshots/<date>.decisions.sqlite.zst,供希望直接从 Parquet 之外的数据引导本地 FTS5 数据库的工具使用。
使用 Python(datasets 库)
步骤 1。 安装该库:
pip install datasets
步骤 2。 加载数据:
from datasets import load_dataset
# Load a single court (~170k decisions, ~800 MB)
bger = load_dataset("voilaj/swiss-caselaw", data_files="data/bger.parquet")
# Load all courts (~900K decisions, ~6.5 GB download)
ds = load_dataset("voilaj/swiss-caselaw", data_files="data/*.parquet")
步骤 3。 浏览数据:
# Print a single decision
decision = bger["train"][0]
print(decision["docket_number"]) # "6B_1/2024"
print(decision["decision_date"]) # "2024-03-15"
print(decision["language"]) # "de"
print(decision["regeste"][:200]) # First 200 chars of the headnote
print(decision["full_text"][:500]) # First 500 chars of the full text
使用 pandas
import pandas as pd
# Load one court
df = pd.read_parquet("hf://datasets/voilaj/swiss-caselaw/data/bger.parquet")
# Filter by date
df_recent = df[df["decision_date"] >= "2024-01-01"]
print(f"{len(df_recent)} decisions since 2024")
# Filter by language
df_french = df[df["language"] == "fr"]
# Group by legal area
df.groupby("legal_area").size().sort_values(ascending=False).head(10)
直接下载
每个法院对应一个 Parquet 文件。直接下载:
https://huggingface.co/datasets/voilaj/swiss-caselaw/resolve/main/data/bger.parquet
https://huggingface.co/datasets/voilaj/swiss-caselaw/resolve/main/data/bvger.parquet
https://huggingface.co/datasets/voilaj/swiss-caselaw/resolve/main/data/zh_gerichte.parquet
...
完整文件列表:huggingface.co/datasets/voilaj/swiss-caselaw/tree/main/data
3. REST API
通过 HTTP 查询数据集,无需安装任何内容。此功能使用 HuggingFace Datasets Server。
获取行:
curl "https://datasets-server.huggingface.co/rows?dataset=voilaj/swiss-caselaw&config=default&split=train&offset=0&length=5"
获取数据集信息:
curl "https://datasets-server.huggingface.co/info?dataset=voilaj/swiss-caselaw"
使用 SQL 搜索(DuckDB 端点):
curl -X POST "https://datasets-server.huggingface.co/search?dataset=voilaj/swiss-caselaw&config=default&split=train" \
-d '{"query": "SELECT docket_number, decision_date, language FROM data WHERE court = '\''bger'\'' LIMIT 10"}'
注意:REST API 会根据 HuggingFace 仓库中的配置查询数据集(按法院划分的 Parquet 文件,包含完整的 34 个字段的架构)。如需批量访问或本地分析,请使用上文的下载方法。
4. Web UI
用于搜索瑞士法院裁决的本地聊天界面。用自然语言提问,AI 助手会搜索整个语料库,并给出附有裁决引用的回答。
Browser (localhost:5173) → FastAPI backend → MCP server → Local SQLite FTS5 DB
所有操作都在你的计算机上运行。数据不会离开你的计算机(你选择的服务提供商的 LLM API 调用除外)。
所需条件
| 要求 | 检查方法 | 获取方式 |
|---|---|---|
| Python 3.10+ | python3 --version(macOS/Linux)或 python --version(Windows) | python.org/downloads |
| Node.js 18+ | node --version | nodejs.org — 下载 LTS 版本 |
| LLM 服务提供商 | (见下文) | 至少一个云端 API 密钥或通过 Ollama 使用本地模型 |
| 约 65 GB 可用磁盘空间 | df -h .(macOS/Linux) | 用于搜索索引(首次运行时下载) |
Windows 用户: 从 python.org 安装 Python,并在安装过程中勾选“Add Python to PATH”。Node.js 会自动安装 npm。
云端服务提供商(至少选择一个,或使用下文的 Ollama)
| 服务提供商 | 环境变量 | 密钥获取方式 | 费用 |
|---|---|---|---|
| Google Gemini | GEMINI_API_KEY | aistudio.google.com/apikey | 提供免费套餐 |
| OpenAI | OPENAI_API_KEY | platform.openai.com/api-keys | 新账户可获得免费额度 |
| Anthropic(Claude) | ANTHROPIC_API_KEY | console.anthropic.com | 按用量付费 |
重要: Claude Desktop 或 Claude Pro 订阅不包含 API 密钥。你需要在 console.anthropic.com 单独注册开发者账户。
本地模型(无需 API 密钥)
如果你不想使用云端 API,可以通过 Ollama 在本地运行所有内容:
| 模型 | 安装命令 | 下载大小 | 所需 RAM |
|---|---|---|---|
| Qwen 2.5(14B) | ollama pull qwen2.5:14b | 约 9 GB | 约 16 GB |
| Llama 3.3(70B) | ollama pull llama3.3:70b | 约 40 GB | 约 48 GB |
从 ollama.com 安装 Ollama(适用于 macOS、Linux、Windows),然后:
ollama serve # start the Ollama server (leave running)
ollama pull qwen2.5:14b # download a model (one-time)
Web UI 会自动检测 Ollama,并显示可用的本地模型。
分步设置
步骤 1. 克隆仓库:
git clone https://github.com/jonashertner/opencaselaw.git
cd caselaw-repo-1
步骤 2. 创建 Python 虚拟环境:
python3 -m venv .venv
激活虚拟环境:
| 操作系统 | 命令 |
|---|---|
| macOS / Linux | source .venv/bin/activate |
| Windows (PowerShell) | .venv\Scripts\Activate.ps1 |
| Windows (cmd) | .venv\Scripts\activate.bat |
当终端提示符以
(.venv)开头时,说明虚拟环境已激活。
步骤 3. 安装 Python 依赖:
pip install fastapi uvicorn python-dotenv mcp pyarrow pydantic
然后至少安装一个大模型提供商的 SDK:
pip install anthropic # for Claude
pip install openai # for OpenAI / GPT-4o / local models via Ollama
pip install google-genai # for Google Gemini
提示:
openai包也可用于本地 Ollama 模型(Ollama 提供兼容 OpenAI 的 API)。如果你只想使用本地模型,执行pip install openai即可,无需云端 API 密钥。
步骤 4. 安装前端:
cd web_ui && npm install && cd ..
步骤 5. 配置 API 密钥:
cp .env.example .env
用文本编辑器打开 .env,并在相应行粘贴 API 密钥。例如,如果你有 Gemini 密钥,请将 GEMINI_API_KEY=AI... 改为你的实际密钥。其他提供商对应的行保持不变——如果留空,系统会忽略它们。
你也可以跳过此步骤,在启动后通过界面中的 Settings 面板配置密钥。
步骤 6. 启动应用:
| 操作系统 | 命令 |
|---|---|
| macOS / Linux | ./scripts/run_web_local.sh |
| Windows (PowerShell) | .\scripts\run_web_local.ps1 |
在浏览器中打开 **http://localhost:5173**。
首次运行时的预期情况: MCP 服务会自动从 HuggingFace 下载数据集(约 7 GB),并构建本地搜索索引(约 58 GB)。根据网络连接和磁盘速度,这需要 30–60 分钟。终端中会显示进度。完成这项一次性设置后,应用即可即时启动。
功能
- 5 个模型:Claude、OpenAI、Gemini(云端)+ 通过 Ollama 运行的 Qwen 2.5 和 Llama 3.3(本地)
- 本地优先选项:使用 Ollama 完全在你的设备上运行,无需云端 API 密钥
- 流式响应:实时逐个 token 显示响应
- 工具增强型聊天:AI 会自动调用搜索、get_decision、list_courts 等工具
- 决策卡片:可点击的法规引用,附带 Fedlex 条文内嵌文本
- 筛选器:按法院、州、语言和日期范围缩小结果范围
- 应用内设置:通过界面配置 API 密钥和 Ollama 连接
- 导出:将对话下载为 Markdown、Word 或 PDF
故障排除
| 问题 | 解决方案 |
|---|---|
python3: command not found(Windows) | 改用 python 而不是 python3,或重新安装 Python,并勾选 “Add to PATH” |
npm: command not found | 从 nodejs.org 安装 Node.js |
ModuleNotFoundError: No module named 'fastapi' | 激活虚拟环境(source .venv/bin/activate),然后重新运行 pip install ... |
| “No provider configured” 横幅 | 点击齿轮图标(Settings)并粘贴 API 密钥,或启动 Ollama |
| 首次运行时显示 “Database not found” | 等待初始下载完成(在终端中查看进度) |
| 端口已被占用 | 在 .env 中编辑 BACKEND_PORT 或 FRONTEND_PORT |
| PowerShell 脚本被阻止(Windows) | 运行一次 Set-ExecutionPolicy -Scope CurrentUser RemoteSigned |
有关高级配置(自定义端口、MCP 服务路径、超时时间),请参阅 .env.example。
每项决策包含什么
每项决策包含 34 个结构化字段:
核心字段
| 字段 | 类型 | 示例 | 说明 |
|---|---|---|---|
decision_id | string | bger_6B_1234_2025 | 唯一键:{court}_{docket_normalized} |
court | string | bger | 法院代码(完整列表) |
canton | string | CH | 联邦法院使用 CH,州级法院使用 ZH/BE/GE/... |
docket_number | string | 6B_1234/2025 | 公布时的原始案件编号 |
decision_date | date | 2025-03-15 | 作出裁决的日期 |
language | string | de | de、fr、it 或 rm |
full_text | string | (完整文本) | 裁决全文,通常为 5–50 页 |
source_url | string | https://bger.ch/... | 原文的永久链接 |
法律内容
| 字段 | 类型 | 说明 |
|---|---|---|
regeste | string | 法律要旨/摘要(Regeste) |
legal_area | string | 法律领域(Strafrecht、Zivilrecht 等) |
title | string | 主题行(Gegenstand) |
outcome | string | 结果:Gutheissung、Abweisung、Nichteintreten 等 |
decision_type | string | 类型:Urteil、Beschluss、Verfügung 等 |
cited_decisions | string | 所引裁决参考文献的 JSON 数组 |
bge_reference | string | 如已发布,则为 BGE 汇编参考文献 |
abstract_de | string | 德语摘要(主要为 BGE) |
abstract_fr | string | 法语摘要 |
abstract_it | string | 意大利语摘要 |
法院元数据
| 字段 | 类型 | 说明 |
|---|---|---|
chamber | string | 审判庭(例如,“I. zivilrechtliche Abteilung”) |
judges | string | 合议庭成员 |
clerks | string | 法院书记员(Gerichtsschreiber) |
collection | string | 官方汇编参考文献 |
appeal_info | string | 上诉状态/后续诉讼程序 |
技术字段
| 字段 | 类型 | 说明 |
|---|---|---|
docket_number_2 | string | 次级案件编号 |
publication_date | date | 在线发布日期 |
pdf_url | string | PDF 直链 |
external_id | string | 交叉引用 ID |
scraped_at | datetime | 抓取此裁决的时间 |
source | string | 数据源标识符 |
source_id | string | 特定数据源的 ID(例如 Signatur) |
source_spider | string | 数据源爬虫/抓取器名称 |
content_hash | string | 用于去重的 full_text 的 MD5 值 |
has_full_text | bool | full_text 是否非空 |
text_length | int | full_text 的字符数 |
完整的 34 个字段的 Parquet 导出架构:export_parquet.py
覆盖范围
联邦法院
| 法院 | 代码 | 判决数 | 时段 | 来源 |
|---|---|---|---|---|
| 联邦最高法院(BGer) | bger | 约 173,000 | 1996 年至今 | bger.ch |
| BGE 指导性判例 | bge | 约 45,000 | 1954 年至今 | bger.ch CLIR |
| 联邦行政法院(BVGer) | bvger | 约 91,000 | 2007 年至今 | bvger.ch |
| 联邦行政实践(VPB) | ch_vb | 约 2,500 | 1987–2017 年 | amtsdruckschriften.bar.admin.ch(联邦档案馆;已冻结,该系列于 2018 年结束) |
| 联邦刑事法院(BStGer) | bstger | 约 11,000 | 2004 年至今 | bstger.weblaw.ch |
| EDÖB(数据保护) | edoeb | 约 1,200 | 1994 年至今 | edoeb.admin.ch |
| FINMA | finma | 约 1,200 | 2008–2024 年 | finma.ch |
| ECHR(由 BGer 发布的瑞士案件) | bge_egmr | 约 475 | 1974 年至今 | bger.ch CLIR |
| ECHR 瑞士(HUDOC) | hudoc_ch | 834 | 1959 年至今 | HUDOC API |
| ECtHR 分庭判决 | ecthr_chamber | 7,761 | 1960 年至今(法语或英语) | HUDOC API |
| ECtHR 大法庭 | ecthr_grand_chamber | 514 | 1960 年至今(法语或英语) | HUDOC API |
| ECtHR 委员会判决 | ecthr_committee | 0 — 重要性 4,超出范围 | HUDOC API | |
| 军事上诉法院(MKG) | mkg | 1,244 | 1915–2025 年 | oa.admin.ch + alexandria.ch |
| 联邦专利法院(BPatGer) | bpatger | 约 190 | 2012 年至今 | bpatger.ch |
| 竞争委员会(WEKO) | weko | 约 120 | 2009 年至今 | weko.admin.ch |
| 体育仲裁法庭 | ta_sst | 约 50 | 2024 年至今 | ta-sst.ch |
| 联邦委员会 | ch_bundesrat | 约 15 | 2012 年至今 | bj.admin.ch |
州法院
覆盖全部 26 个州的 77 家法院。规模最大的州级判例集:
| 州 | 法院数 | 判决数 | 时段 |
|---|---|---|---|
| 沃州(VD) | 3 | 约 155,000 | 1984 年至今 |
| 苏黎世州(ZH) | 20 | 约 126,000 | 1980 年至今 |
| 日内瓦州(GE) | 1 | 约 116,000 | 1993 年至今 |
| 提契诺州(TI) | 1 | 约 58,000 | 1995 年至今 |
| 圣加仑州(SG) | 7 | 约 35,000 | 2001 年至今 |
| 格劳宾登州(GR) | 1 | 约 29,000 | 2002 年至今 |
| 巴塞尔乡村州(BL) | 1 | 约 26,000 | 2000 年至今 |
| 伯尔尼州(BE) | 6 | 约 26,000 | 2002 年至今 |
| 阿尔高州(AG) | 18 | 约 21,000 | 1993 年至今 |
| 巴塞尔城市州(BS) | 3 | 约 19,000 | 2001 年至今 |
覆盖全部 26 个州:AG、AI、AR、BE、BL、BS、FR、GE、GL、GR、JU、LU、NE、NW、OW、SG、SH、SO、SZ、TG、TI、UR、VD、VS、ZG、ZH。
各法院实时统计:仪表板
工作原理
┌──────────────────────────────────────────────────────┐
│ Daily Pipeline │
│ │
Court websites ────────►│ Scrapers ──► JSONL ──┬──► Parquet ──► HuggingFace │
bger.ch │ (45 scrapers, │ │
bvger.ch │ rate-limited, ├──► FTS5 DB ───┐ │
cantonal portals │ resumable) │ ├► MCP Server │
│ └──► Graph DB ──┘ │
│ ▲ │
Fedlex (SPARQL) ───────►│ Fedlex scraper ──► XML ──► Statutes DB ─┘ │
│ │
│ 01:00 UTC scrape 04:00 UTC publish │
└──────────────────────────────────────────────────────┘
分步说明
-
抓取(每日 01:00 UTC)— 45 个抓取器并行运行,每个抓取器针对特定法院的网站或 API。每个抓取器均设有速率限制,并支持断点续传:它会跟踪已发现的判决,仅获取新增判决。输出:每家法院对应一个 JSONL 文件。另有一个 Fedlex 抓取器通过 SPARQL 下载联邦法律文本(Akoma Ntoso XML),用于法规数据库。
-
构建搜索索引(04:00 UTC)— 将 JSONL 文件导入 SQLite FTS5 数据库,以支持全文搜索。周一至周六采用增量模式:通过字节偏移检查点跟踪每个 JSONL 文件的读取进度,因此只处理新追加的判决(通常少于 1 分钟)。周日执行完整重建,压缩 FTS5 索引并重置检查点(约 3 小时)。通过
decision_id对出现在多个来源中的判决去重,并保留全文最长的版本。质量增强步骤还会补充缺失的标题、裁判摘要和内容哈希。 -
导出— 将 JSONL 文件转换为 Parquet(每家法院一个文件),使用固定的 34 个字段的架构。
-
上传— 将 Parquet 文件推送到 HuggingFace。MCP 服务和
datasets库会自动获取新数据。可选的制品发布也能更新artifacts/manifest.json,其中包含每日增量数据以及完整压缩的 SQLite 快照,供外部引导工具使用。 -
更新仪表板— 重新生成
stats.json(包括上次运行的抓取器运行状况),并推送到 GitHub Pages。
本地运行(开发者)
适用于希望运行抓取器、构建处理流程或修改代码库的贡献者和开发者。
先决条件
- Python 3.10+
- pip
安装
git clone https://github.com/jonashertner/opencaselaw.git
cd caselaw-repo-1
python3 -m venv .venv
source .venv/bin/activate # macOS/Linux — on Windows: .venv\Scripts\Activate.ps1
pip install -e ".[all]"
这会安装所有依赖项,包括 PDF 解析、加密和 FastAPI 服务。若要进行不包含可选依赖项的最小化安装,请改用 pip install -e .。
抓取裁决
# Scrape 5 recent decisions from the Federal Supreme Court
python run_scraper.py bger --max 5 -v
# Scrape BVGer decisions since a specific date
python run_scraper.py bvger --since 2025-01-01 --max 20 -v
# Scrape a cantonal court
python run_scraper.py zh_gerichte --max 10 -v
输出写入 output/decisions/{court}.jsonl——每行一个 JSON 对象,每个法院对应一个文件。抓取器会记住已获取的内容(状态存储在 state/ 中),因此可以反复运行,只获取新的裁决。
可用的法院代码有 45 个。运行 python run_scraper.py --list 查看完整列表,或访问仪表板查看各法院的统计数据。
构建本地搜索数据库
# Full build (reads all JSONL, optimizes FTS index — ~3h for 900K decisions)
python build_fts5.py --output output -v
# Incremental build (reads only new JSONL bytes, skips optimize — seconds)
python build_fts5.py --output output --incremental --no-optimize -v
# Full rebuild (deletes DB + checkpoint, rebuilds from scratch)
python build_fts5.py --output output --full-rebuild -v
此操作会读取 output/decisions/ 中的 JSONL 文件,并在 output/decisions.db 创建 SQLite FTS5 数据库。完整构建 90 万条裁决大约需要 3 小时,生成的数据库约为 58 GB。增量模式使用检查点文件(output/.fts5_checkpoint.json)跳过未更改的文件,并跳过已处理的字节;当新增裁决较少时,几秒钟即可完成。
导出为 Parquet
python export_parquet.py --input output/decisions --output output/dataset -v
将 JSONL 文件转换为 Parquet 格式(每个法院对应一个文件)。输出写入 output/dataset/。
数据来源
| 来源 | 内容 | 方式 |
|---|---|---|
| 官方法院网站 | 联邦法院(bger.ch、bvger.ch、bstger.ch、bpatger.ch) | JSON API、结构化 HTML |
| 联邦监管机构 | FINMA、WEKO、EDÖB、VPB | Sitecore/自定义 API |
| 州级法院门户网站 | 26 个州级平台(Weblaw、Tribuna、FindInfo、自定义门户) | 法院专用抓取器 |
多个来源中出现的裁决会按 decision_id 去重(该 ID 是法院代码与规范化案号的确定性哈希值)。保留全文最长的版本。
法律依据
根据瑞士法律,法院裁决属于公共记录。《联邦最高法院法》第 27 条要求联邦最高法院公布其裁决。联邦法院一贯认为,法院裁决必须向公众开放(BGE 133 I 106、BGE 139 I 129)。本项目仅抓取公开可用且正式发布的裁决。
治理与移除
重新发布会改变内容的可发现性,因此本项目制定了治理政策,涵盖来源撤回、重新匿名化,以及经核实的更正/移除请求。请参阅 docs/governance-and-removal-policy.md。
贡献者
维护者:Jonas Hertner。一小群首批用户、错误报告者、机构合作伙伴和使用方集成者共同塑造了这款工具;完整名单以及如何添加你的姓名,请参阅 CONTRIBUTORS.md。
如果你在生产环境中使用 OpenCaseLaw——无论是作为抓取器贡献者、数据集使用者、律所集成者还是研究项目——我们都希望了解。请发送邮件至 [email protected],或发起讨论。
许可证
代码:MIT。请参阅 LICENSE。
数据集打包及新增元数据:在存在相关权利的范围内采用 CC0-1.0。底层裁决文本仍是由相关法院和公共机构提供的官方发布裁决。
联系方式
有问题、反馈或想法?请发送邮件至 [email protected]。
你也可以在 GitHub 上提交问题。
项目动态发布于 LinkedIn。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。




