判例を対象としたRAG Légifrance
判例を対象とするRAGを構築するには、DILAの公開XMLアーカイブ(CASSは破毀院公報に掲載された判決、INCAは同公報に掲載されていない判決)をダウンロードし、各判決をセクションごとに分割して、BGE-M3を使ってQdrantにインデックス化し、上告番号とECLIを引用させてください。全件アーカイブの容量は圧縮状態で数百MB程度であり、数十GBではありません。
フランスの判例はオープンデータとして公開されていますが、そのデータセットには明確な対象範囲、独特のXML構造、そして一般的なチュートリアルでは扱われない落とし穴があります。このガイドでは、これらの裁判例を対象とするローカルのセマンティック検索エンジンを構築します。ダウンロード、XMLの読み取り、セクションごとの分割、インデックス作成、フィルター付き検索、そしてユーザーに明示すべき限界を取り上げます。
#法律分野のRAGとは何か、何が求められるのか
法律分野のRAGは、裁判所の判決を対象とする意味検索エンジンと、検索で見つかった文章から回答を作成するモデルを組み合わせたものです。検索では質問をベクトルに変換し、判決データベースから意味的に最も近い抜粋を見つけます。その後、モデルが出典を引用しながら、それらをまとめて回答します。法律分野では、モデル単体と比べた利点が決定的です。モデルは記憶に頼って答えるのではなく、裁判所名、日付、上告番号、ECLI識別子が付いた、読み返せる文章に基づいて回答します。
このガイドでは、フランスの法務・行政情報局(DILA)が公開するオープンデータを使い、ローカルマシン上にこのエンジンを構築します。法律専門家の質問が外部サービスに送信されることはありません。想定するのは、「有期雇用契約(CDD)の終了について、フランス破毀院の最近の判決にはどのようなものがありますか?」といった質問に対し、出典付きの該当箇所の一覧を返す使い方です。このシステムは法的見解を示すものではありません。情報を検索して引用し、その法的な評価は専門家が行います。
#公式データセット:実際に含まれている内容
あなたのドキュメント、あなたのAI:あなたのPDF、メモ、メールを扱う信頼性の高いローカルRAG。何もクラウドに送信しません。
- 永久に利用できるオンラインスペース
- PDF + ファイル
- 生涯アップデート
DILAは、それぞれ収録範囲が異なる複数のデータベースで裁判を公開しています。重要でありながらよく誤解される点は、これらのデータベースにはフランスで下されたすべての裁判が収録されているわけではないということです。CASSという名称で公開されている破毀院の判例データには、判例集「Bulletin」に掲載された判決が収録されており、民事部の判決は1960年以降、刑事部の判決は1963年以降が対象です。これらには、裁判官が作成した見出しと要旨が付いています。「Bulletin」に掲載されていない未公刊の判決は、1989年から公開されている別のデータベースINCAに収録されています。
| Base | コンテンツ | 全件アーカイブ(圧縮済み) |
|---|---|---|
| CASS | フランス破毀院の判例集(Bulletin)に掲載された判決(民事は1960年以降、刑事は1963年以降) | 約248 MB |
| INCA | 1989年以降のフランス破毀院の未公刊判決(判例集Bulletinに未掲載) | 約655MB |
| CAPP | 控訴裁判所および第一審裁判所による民事・刑事の裁判の抜粋 | 約279MB |
| JADE | 国務院(Conseil d'État)、行政控訴裁判所、権限争議裁判所(Tribunal des conflits)(裁判機関に応じた選択) | 約1.2GB |
上記のサイズは、2026年9月30日に確認した際にDILAのサーバーに掲載されていた、各データベースの全体アーカイブのサイズです。圧縮状態ではデータベースごとに数百MBで、時折引用される数十GBという数字を大きく下回ります。各判決が小さなXMLファイルになっているため、展開後の容量は大きくなりますが、一般的なパソコンで十分です。計画を立てる前に、ご自身のディスク上で実際の容量を測定してください。
もう一つの方法は、Judilibre APIです。フランスの破毀院が提供するこのAPIでは、公開の場で言い渡された判決を収録し、必要に応じて情報の補足や仮名化を施したオープンなデータベースを、誰でも無料で利用できます。認証付きのプログラミングインターフェースを通じて利用する点が、単にダウンロードするファイルであるDILAのアーカイブとは異なります。ローカルRAGでは、アーカイブが最も手軽な出発点です。より網羅的で最新の資料が必要になったときに、Judilibreが有用になります。
#資料群をダウンロードする:既存データ、次に更新データ
各データベースはDILAのサーバー上で同じ構成になっています。まず、名前がFreemiumで始まりglobalで終わる全件アーカイブがあり、その後に新しいデータを追加する差分アーカイブが続きます。閲覧時点では、フランス破毀院(Cour de cassation)の全件アーカイブは2025年7月13日付で、週次アーカイブによって2026年9月末までのデータが補われていました。そのため、まず全件アーカイブをダウンロードし、その後の日付の差分アーカイブをすべて順番に適用する必要があります。
DILA が再生成すると、ストックアーカイブの名前が変わります:名前をハードコードする前に、フォルダのリストを再確認してください。また、フォルダをループでダウンロードすることも避けてください。ストックアーカイブ 1 つと増分データで十分であり、再帰的なミラーリングはパブリックサーバーに不要な負荷をかけます。
#フィールドを取り違えずにDILAのXMLを読む
この形式は、複数のデータベースに共通する文書型定義の一群で、DILA が DTD Légifrance という名称で公開しています。2026年9月の週次アーカイブでは、Cour de cassation(破毀院)の判決は、共通メタデータブロック(識別子、種別)、法的メタデータブロック(表題、判決日、裁判所、判決結果)、司法裁判に固有のブロック(事件番号、裁判体、ECLI、Bulletin への掲載の有無を示す指標)で構成されています。全文はテキストブロック内のコンテンツ要素の配下にあり、改行は br タグで表されています。
チュートリアルには、よく見られる落とし穴が二つあります。まず、法務ブロックのNUMEROフィールドは内部番号です。法律専門家が引用する上告事件番号は、固有ブロック内のNUMEROS_AFFAIRESにあります。次に、itertextでファイル内のテキストをすべて取得すると、メタデータが判決本文に混ざり、ベクトルに不要な情報が入り込みます。本文を含む要素だけを対象にする必要があります。
#トークン数ではなく、判決の構造に沿って分割する
近年のフランス破毀院の判決には、一定の構成が見られます。検討した判決には、「Faits et procédure」、「Examen des moyens」という見出しがあり、続いて各上告理由について「Énoncé du moyen」と「Réponse de la Cour」が置かれ、最後に「PAR CES MOTIFS」で始まる主文が続きます。700トークンごとに区切ると、裁判所に提示された問いとその回答が分離され、曖昧な抜粋になってしまいます。まずこれらの見出しに沿って分割し、その後、長すぎるブロックだけをさらに分割してください。
2つ目は、少ないコストで大きな効果が得られる改善です。各抜粋の先頭に見出し(裁判例のタイトルとECLI)を付けてください。「控訴裁判所は立証責任を逆転させた」といった抜粋だけでは、どの裁判所の、いつの裁判例から取られたものか分かりません。見出しがあれば、埋め込みモデルと生成を行う側の両方が文脈を把握できます。構成の異なる古い裁判例については、段落ごとに一部を重複させて分割する方法に戻してください。
#BGE-M3 と Qdrant でインデックスを構築する
BGE-M3は多言語埋め込みモデルで、公式のモデルカードによると、1,024次元のベクトルを生成し、最大8,192トークンの入力を受け付けます。一般的な用途ではフランス語の法律文書を適切に扱えますが、それでも自分の質問で性能を測定してください。Qdrantは、ベクトルをメタデータと一緒に保存するのに適しています。Pythonクライアントにはサーバー不要のローカルモードがありますが、ドキュメントでは開発、プロトタイピング、テスト向けとされています。数十万件の抜粋を扱う場合は、サーバーを起動してください(例えばDockerを使います)。
チュートリアルでよく見かける例には、エラーとして表面化しないバグがあります。判決のインデックスをポイントのIDとして使うと、同じ判決からの抜粋が上書きされ、最後の抜粋だけが残ります。抜粋ごとに一意のIDが必要です。もう一つの注意点として、日付で絞り込むには、メタデータに年月日をAAAAMMJJ形式の整数として保存してください。これにより、日付の範囲で絞り込めます。
#フィルタを使って質問し、結果を確認する
検索では、同じモデルで質問をエンコードし、Qdrantに最も近いテキストの抜粋を求めます。必要に応じてフィルターで対象を絞り込みます。裁判体、判決の結論、日付によるフィルターは、従来の全文検索に対する大きな利点です。「社会部、2023年以降」は、クエリに単語を追加するのではなく、メタデータに対する2つの条件として指定できます。
#法的文脈において、意味検索だけでは不十分な理由
法律の専門家は、上告事件番号、条文番号、定型表現など、正確な情報を探すことがよくあります。意味的類似性による検索では、こうした情報をうまく見つけられません。数値の近い2つの番号に、意味上の関連はないからです。実際、BGE-M3の作者もモデルカードで、RAGにはハイブリッド検索の後にリランキングを行うパイプラインを推奨しています。そのため、ベクトル検索にBM25のような語彙ベースの検索を併用し、2つの結果リストを統合してから、有力な候補をリランキングモデルに渡してください。
法律文書のコレクションでは、この追加は、適切なチャンク分割に次いで最も重要な改善です。ハイブリッド検索とリランキングのガイドでは実装方法を詳しく説明しています。本ガイドでは、判例に特有の内容に絞って扱います。
#生成、更新、引用の検証
生成時には、最も関連性の高い5〜8件の抜粋を参照情報とともにモデルに渡し、それらだけに基づいて回答するよう指示してください。Qwen 3.5 9B(Ollamaライブラリでは6.6 GB)のような90億パラメータのモデルで、抜粋の要約には十分です。Mistral Small 24B(14 GB)には16 GBのビデオメモリが必要です。プロンプトでは、各主張について上告番号とECLIを引用し、抜粋に質問への答えがない場合は「裁判例は見つかりませんでした」と回答するよう求める必要があります。
更新については、確認した一覧によると、DILAはCASSとINCAの差分アーカイブをおおむね毎週公開しています。定期実行する処理では、未取得のアーカイブをダウンロードして解析し、抜粋を追加する必要があります。その際、重複を避けるために固定の識別子を使います。最後に、回答で引用されている参照情報がすべて、提供した抜粋に含まれていることをプログラムで確認してください。これは、契約分析のガイドで使っている確認方法と同じ考え方です。
#ユーザーに表示する制限
- 収録範囲は限定的
- CASSに含まれるのは判例公報(Bulletin)に掲載された判決のみで、INCAには同公報に未掲載の判決、CAPPには控訴院の判決の一部が収録されています。データベースにある判決が見当たらなくても、その判決が存在しない証拠にはなりません。
- 未収録、またはごく最近の裁判例
- ごく最近の裁判判断は、最新の差分アーカイブにまだ含まれていない可能性があります。慎重な扱いが必要な案件では、Légifranceの情報と照合してください。
- 法制度の変化
- 古い判決は、判例の変更や法改正によって、すでに通用しなくなっている場合があります。システムはテキストを検索しますが、その法的判断が現在どの程度の権威を持つかを評価するものではありません。
- 仮名化
- 名前は伏せられています。当事者の身元を特定しようとすることは、絶対にしないでください。
- 法的助言は行いません
- このツールは、必要な情報を探して引用するのを支援します。事実の法的評価、個別の案件への適用、助言は、引き続き専門家が担います。
- 情報を漏らさずに契約書を分析する
- ハイブリッド検索:BM25とベクトル
- パイプラインにリランカーを追加する
- ドキュメントの分割戦略
- BGE-M3:フランス語向けの埋め込みベクトル
- Qdrant:ローカルRAGのベクトルデータベース
- 出典:data.gouv.fr上のCASSデータセット
- 出典:DILAのサーバー上のCASSアーカイブ
- 情報源:data.gouv.fr上のAPI Judilibre
- 出典:BGE-M3のモデルカード
- ソース:QdrantのPythonクライアント
法律分野のRAGとは何ですか?+
破毀院の判例をオープンデータで入手するには、どこを探せばよいですか?+
収録されている判例は網羅的ですか?+
フランス語の法的文脈向けにどの埋め込みモデルを選ぶべきですか?+
裁判例のインデックス作成にはGPUが必要ですか?+
これらの裁判例を商用製品で利用できますか?+
ご意見、誤りのご指摘、補足はありますか?ぜひお知らせください。皆さんにとってより良いガイドにするために役立ちます。