Lemini — 2つのモードで動作する法律アドバイスチャットボット
(github.com/maantano)URL : https://lemini-brown.vercel.app/
韓国の法令・判例を自然言語で尋ねられるRAGチャットボット Lemini を作成し、共有します。最近、似た方向性のサービス投稿が上がっているのを見て、私たちは同じ
問題を2つの異なるモードで解こうとしており、技術的なフィードバックをいただきたく投稿します。
なぜ2つのモードなのか
法律に関する質問は大きく2つに分かれます。
- "私の状況はこうなのですが、どうすればいいですか?" — ユーザーには事実関係を整理して書く力が不足していることがあります。通常のRAGで受けると一般論しか返ってきません。
- "この契約書/約款をレビューしてほしい" — 文書はすでにあるのに、単一プロンプトで「レビューして」と頼むと標準チェックリストしか出てきません。
この2種類は同じRAGでは解けません。Lemini はモードを2つに分けて設計しました。
モード1 — Ouroboros(対話型の事実関係収束)
質問 → [事実関係は十分か?] ──不足── 選択式の追質問 ─┐
│ 十分 │
▼ ←─ ユーザー回答 ┘
RAG(法令+判例+自主規約)
▼
構造化分析
· 有利/注意すべき事実
· 行動プラン
· 期限警告(時効)
· 関連判例
▼
引用検証ループ — 検索 hit に存在しない引用を除去
核心の一文: 答える前に、モデルが「事実関係は十分か」を自ら問い直します。
不足していれば選択式カードで追質問し、十分なら RAG → 構造化分析へ進みます。ユーザーが追質問を自分で設計する必要はありません。
モード2 — 専門分析(文書レビュー6チェーン)
文書入力
▼
① 全体スキャン — 文書の性格、セクション要約
② 外部制度フレームのマッピング — この文書が依拠している制度を宣言
③ 軸別RAG — 制度軸ごとに法令・判例を検索
② 外部制度フレームのマッピング — この文書が依拠している制度を宣言
③ 軸別RAG — 制度軸ごとに法令・判例を検索
④ 条項単位レビュー — observations / gaps / external
⑤ 並列チェーン(3つ同時)
├ 目的-手段の整合性
├ 制度面のレビュー
└ リスクシナリオ
⑥ 判断型 verdict — 判断型の質問のときのみ
核心の一文: 単一プロンプトで「レビューして」ではなく、「文書の外側にある制度フレームを先に宣言してから入ります。」
この②の段階は単一プロンプトではうまく出にくいため、チェーンを分離しました。
2つのモードを支える共通基盤
- 引用検証ループ — LLM が付けた引用を検索 hit と照合し、存在しない引用は応答から除去。もっともらしい偽の条文を防止。
- 3種データの同一プール — 法令 + 判例 + 自主規約(公正取引委員会の標準約款、協会規約、KISA・個人情報委員会ガイドライン)を同じベクトル空間に格納。
コード上のドメイン分岐は0件で、document_type のみで区別。 - 独自収集パイプライン — 法令は DRF API で週1回自動更新、判例は国家法令情報共同活用 API + on-demand キャッシュ。
- プロンプトは汎用性を最優先にしました。答えを導くための情報は与えず、質問に合った回答を導出するよう設計しました。
スタック
FastAPI / Cloud Run · Next.js · Gemini(構造化 JSON + マルチチェーン)· SQLite + 独自埋め込みマトリクス(ベクトル・lexical・exact の3軸)
プライバシー
会員登録・ログインなし、サーバーDBへの会話保存なし(ブラウザ localStorage)、stateless、IP は rate limit 用の in-memory のみ使用。
限界
法律アドバイスではなく、情報検索・分析ツールです。別表・書式データ、判例カバレッジには空白があります。モデル自体の推論力は外部LLMに
依存しており、私たちが差別化したい点は「もっともらしい答え」ではなく「根拠が検証された構造化された答え」です。
フィードバックをいただきたい点
- モード1 — Ouroboros の追質問が的外れ、または過剰なケース
- モード2 — 文書レビュー6チェーンで抜けている観点
- 引用検証ループで検出できなかった誤った引用
- 同じドメインの他サービスと比べて欠けている視点
使ってみて、率直なフィードバックをいただけると嬉しいです。
2件のコメント
文書レビュー結果
確認失敗
文書レビュー中にエラーが発生しました。チャットボットの使用中にもエラーが発生し、法令名を検索すると、最初は50%と表示されますが、残りは4565%のようなあり得ないスコアが出るようです。
ありがとうございます!!確認してみます!!