System Design Document

意向確認チェッカー 設計書

案件: JIB(ジェーアイビー) 作成日: 2026-04-09 Ver 1.0
SECTION 1

概要

保険代理店の面談録音から、意向確認に必要な説明義務の充足状況を自動判定し、意向確認シートを生成するスタンドアロンアプリケーション。

  • 機能: 録音データ → 文字起こし → 意向確認チェック → シート生成(単一機能に集中)
  • 技術制約: AI APIを一切使わない。文字起こし含め完全ローカル完結
  • インフラ: JIB社内 Mac mini 1台で完結。外部通信なし
  • 横展開: 他の保険代理店への販売を前提とした汎用設計

設計方針

既存JIB MVPコードベース(16帳票・38エンドポイント)とは完全に独立した新規アプリとして開発。1機能に絞り、コードベースも1機能分に留める。

SECTION 2

システムアーキテクチャ

2.1 処理パイプライン

1
録音ファイルアップロード
営業マンがブラウザから録音ファイル(.m4a, .wav, .mp3)をアップロード
2
ローカル文字起こし(mlx-whisper)
Apple Silicon最適化のWhisperモデルでタイムスタンプ付き文字起こし
3
ルールエンジンによる自動チェック
rules.yaml のチェック項目をキーワード/パターンマッチで判定。該当セグメントを自動引用
4
営業マンによる確認・補足
チェック結果のメモ追記、判定の手動上書き
5
意向確認シート Excel 生成
openpyxlでJIBのテンプレートに結果を流し込み、.xlsx をダウンロード

2.2 技術スタック

レイヤー技術選定理由
言語Python 3.12+Whisperエコシステムとの親和性
文字起こしmlx-whisperApple Silicon最適化。Mac上で最速
WebサーバーFastAPI非同期処理(文字起こし待ち)に強い。軽量
フロントエンドHTML + Vanilla JSフレームワーク不要。1ファイルで完結
帳票出力openpyxlExcel生成。JIBのテンプレートに流し込み
ルール定義YAMLコードレスで編集可能。UIからも書き戻し
データ保存SQLite履歴管理。1ファイルでバックアップ容易

2.3 インフラ構成

ハードウェア
Mac mini M4 (16GB) 1台
ネットワーク
JIB社内LAN内のみ
外部通信
なし(完全ローカル)
アクセス方法
ブラウザで http://<mac-mini-ip>:8000
SECTION 3

ルールエンジン

保険業法上の意向確認で必要な説明義務項目をルールとして定義。各ルールは「定義されたキーワード群が文字起こしテキストに含まれていれば説明済みと判定」するチェックリスト型。

3.1 ルール定義例(rules.yaml)

categories: - id: important_matters name: "重要事項説明" items: - id: contract_overview name: "契約概要の説明" keywords: ["契約概要", "保障内容", "保険金額", "保険期間"] match_mode: "or" # いずれか1つ含まれれば「説明済み」 - id: intent_confirmation name: "意向の確認" items: - id: purpose name: "加入目的の確認" keywords: ["目的", "なぜ", "きっかけ", "理由", "備え"] match_mode: "or"

3.2 判定ロジック

ステップ処理内容
1rules.yaml からカテゴリ・項目・キーワードを読み込み
2文字起こしテキストを正規化(空白除去・lowercase)
3各項目のキーワードリストでテキストを検索
4match_mode: "or" → いずれか1つ含まれれば「説明済み」
5match_mode: "and" → 全キーワードが含まれなければ「説明済み」にならない
6ヒットしたキーワードを含むセグメントを「根拠」として自動引用

3.3 ルールの管理

  • ルール変更はWeb UI(タブ2: ルール設定)から実施可能
  • 変更時は rules_history テーブルに自動バックアップ(いつでも復元可能)
  • 初期ルールはJIBの意向確認シートの項目に合わせて設定
SECTION 4

UI設計

4.1 画面構成(3タブ)

タブ名称主な利用者用途
1録音 → チェック営業マンメイン作業。録音アップ → 確認 → ダウンロード
2ルール設定管理者チェック項目・キーワードの追加・編集
3履歴全員過去の記録一覧・再ダウンロード

4.2 メイン作業画面イメージ(タブ1)

録音 → チェック
ルール設定
履歴
録音ファイルをドラッグ&ドロップ、または クリックして選択
.m4a / .wav / .mp3 対応
文字起こし結果
田中様: 子供が来年大学に入るので、学資の備えが心配なんです...
募集人: 学資の保障内容についてご説明しますね。まず保険期間ですが...
田中様: 月々の予算は2万円くらいまでなら...
チェック結果
重要事項説明
契約概要の説明
学資保険の保障内容・保険期間を説明済み
注意喚起情報の説明
未検出 — メモを入力して手動で ✓ に変更可能
意向の確認
加入目的の確認
子供の大学進学資金の準備
保険料の意向確認
月々2万円まで
顧客名
田中太郎
担当者
佐藤
意向確認シート ダウンロード

4.3 操作フロー

ステップ操作内容
1営業マンが録音ファイルをアップロード
2文字起こし処理(進捗バー表示)
3ルールエンジンが自動チェック → ✓/✗ リスト表示
4✓ の項目: 文字起こしから該当箇所を自動引用してメモ欄にプリセット
5営業マンがメモを確認・補足・修正
6✗ の項目: 必要に応じて手動でメモを書き、✓ に変更可能
7顧客名・担当者名を入力
8「ダウンロード」→ 意向確認シート.xlsx が生成される
SECTION 5

データモデル

5.1 SQLiteテーブル

-- 面談記録 CREATE TABLE records ( id INTEGER PRIMARY KEY AUTOINCREMENT, customer_name TEXT NOT NULL, recruiter_name TEXT NOT NULL, audio_filename TEXT NOT NULL, audio_path TEXT NOT NULL, transcript_text TEXT NOT NULL, segments_json TEXT NOT NULL, -- タイムスタンプ付きセグメント check_results_json TEXT NOT NULL, -- チェック結果 + メモ created_at TEXT NOT NULL DEFAULT (datetime('now','localtime')), exported_at TEXT -- Excel出力した日時 ); -- ルール変更履歴 CREATE TABLE rules_history ( id INTEGER PRIMARY KEY AUTOINCREMENT, rules_yaml TEXT NOT NULL, -- 変更時点のYAMLスナップショット changed_by TEXT, changed_at TEXT NOT NULL DEFAULT (datetime('now','localtime')) );

5.2 チェック結果JSON構造

{ "categories": [ { "id": "important_matters", "name": "重要事項説明", "items": [ { "id": "contract_overview", "name": "契約概要の説明", "status": "explained", "matched_keywords": ["保障内容", "保険期間"], "evidence_segments": [ {"start": "2:30", "end": "3:15", "text": "..."} ], "memo": "学資保険の保障内容・保険期間を説明済み", "manually_overridden": false } ] } ] }
SECTION 6

API設計

メソッドパス用途
POST /api/transcribe 録音ファイルをアップロードし文字起こし実行
GET /api/transcribe/{job_id}/status 文字起こしの進捗確認
POST /api/check 文字起こし結果に対しルールチェック実行
PUT /api/records/{id} チェック結果・メモの更新(手動上書き含む)
POST /api/records/{id}/export 意向確認シートExcel生成・ダウンロード
GET /api/records 履歴一覧取得(検索・フィルタ対応)
GET /api/records/{id} 個別記録の詳細取得
GET /api/rules 現在のルール取得
PUT /api/rules ルール更新(YAML書き戻し + 履歴保存)
SECTION 7

ディレクトリ構成

intent-checker/ ├── src/ │ ├── main.py # FastAPIアプリ起動 │ ├── transcriber.py # mlx-whisper文字起こし │ ├── rule_engine.py # ルール読み込み・チェック判定 │ ├── exporter.py # Excel生成(openpyxl) │ ├── database.py # SQLite操作 │ └── models.py # Pydanticモデル ├── static/ │ ├── index.html # SPA(3タブ構成) │ ├── app.js # フロントエンドJS │ └── styles.css # CSS ├── config/ │ └── rules.yaml # ルール定義 ├── templates/ │ └── intent_sheet.xlsx # 意向確認シートテンプレート ├── data/ │ ├── db.sqlite3 # SQLiteデータベース │ └── audio/ # アップロードされた録音ファイル ├── tests/ │ ├── test_transcriber.py │ ├── test_rule_engine.py │ ├── test_exporter.py │ └── test_api.py ├── requirements.txt └── README.md
SECTION 8

納品スコープ・費用・スケジュール

8.1 納品物

#納品物内容
1Mac mini M4 (16GB)初期費用に含む。セットアップ済みで納品
2意向確認チェッカー アプリMac mini上で動作。ブラウザからアクセス
3意向確認シートテンプレートJIBの書式に合わせたExcelテンプレート
4初期ルール設定JIBの意向確認項目に合わせたrules.yaml
5操作マニュアル営業マン向け + 管理者向け

8.2 費用

別途ご相談

8.3 開発スケジュール(テンプレート受領後 6週間)

Week 1文字起こし
パイプライン
Week 2ルールエンジン
+ チェック画面
Week 3ルール設定
+ 履歴管理
Week 4Excel出力
テンプレート
Week 5Mac mini
セットアップ
Week 6現地導入
+ 操作研修
前提条件: JIBから意向確認シートのテンプレート(記入済みサンプル)を受領済みであること。Mac mini購入は発注後1週間程度で到着想定。
SECTION 9

横展開の拡張ポイント

本システムは1機能に絞った設計だが、以下の拡張を想定:

  • ルールのプリセット: 保険業界標準のチェック項目をプリセットとして複数用意し、代理店ごとにカスタマイズ
  • 複数帳票対応: 意向確認シート以外の帳票(アフターフォロー報告等)も同じパイプラインで生成
  • Whisperモデル選択: Mac miniのスペックに応じてmedium/large-v3を切替可能に