Gemini CLIで自動車保険証券PDFをMarkdownへ変換してみる
自動車保険の保険証券PDFを、あとでRAGやGraphDBで扱いやすいようにMarkdownへ変換してみました。
今回は、保険約款ではなく「保険証券」、つまり契約内容の一覧表を対象にしています。
PDFは画像PDFのため、通常のテキスト抽出ではなく、Gemini CLIを使って内容を読み取り、指定したMarkdown形式へ構造化しました。
- 今回の目的
- 注意:公開記事では個人情報を載せない
- プロンプトファイルを作成する
- PDFファイルをMac miniへコピーする
- 古いGemini CLIのコマンドは使えなかった
- 現在のGemini CLI向けにプロンプトを変更する
- GEMINI_API_KEYが未設定でエラーになった
- npxではなくグローバルインストールに変更する
- Node.jsとnpmの確認
- Gemini CLIをグローバルインストールする
- Gemini APIキーを保存する
- .zshrcでGEMINI_API_KEYを読み込む
- APIキーが読み込まれているか確認する
- direnvをインストールする
- Gemini CLIを再実行する
- ファイル変更の許可確認
- Markdownファイルを確認する
- 今回の結果
- ハマりどころ
- 次にやること
- まとめ
今回の目的
今回の目的は、自動車保険証券のPDFをMarkdown化し、事故対応RAGや保険金請求支援システムで再利用しやすくすることです。
保険証券には、契約者情報、車両情報、補償内容、特約、保険料、連絡先などがまとまっています。
これをMarkdown化しておくことで、あとから以下のような処理につなげやすくなります。
- 契約内容の確認
- 人身傷害や搭乗者傷害の有無確認
- 弁護士費用特約の有無確認
- 事故時の連絡先確認
- RAG用ドキュメントとしての利用
- GraphDBへの登録
注意:公開記事では個人情報を載せない
保険証券には、個人情報や契約情報が多く含まれます。
そのため、ブログやGitHubに載せる場合は、必ずダミー化します。
特に以下は公開しないようにします。
- 証券番号
- 氏名
- 生年月日
- 住所
- 電話番号
- 登録番号
- 車台番号
- 代理店の担当者情報
- APIキー
今回の記事では、実際の値は掲載せず、すべてダミー値に置き換えています。
プロンプトファイルを作成する
まず、保険証券PDFをMarkdownへ変換するためのプロンプトファイルを作成します。
vim prompt_insurance_policy.txt
内容は以下です。
あなたは保険書類を構造化する専門アシスタントです。 以下のPDFは「自動車保険の保険証券(画像PDF)」です。 これは約款ではなく、契約内容の一覧表です。 【重要なルール】 - 解釈や要約は行わないでください - 意味の推測や補完はしないでください - 書かれていない内容は絶対に追加しないでください - 原文に存在する情報のみを使用してください - 数値・日付・金額・固有名詞は正確に保持してください 【目的】 PDF内の情報を、人が読みやすく再利用できる Markdown形式の構造化文書に変換してください。 【出力形式】 以下の構成を必ず守ってください。 --- # 保険証券(契約内容) ## 契約基本情報 - 証券番号: - 保険種類: - 保険期間(開始): - 保険期間(満了): - 契約日: ## 契約者・被保険者 - 保険契約者: - 記名被保険者: - 生年月日: - 住所: - 電話番号: ## 車両情報 - 登録番号: - 車名: - 型式: - 車台番号: - 初度登録: - 排気量: - 用途車種: - 使用目的: ## 運転条件 - 運転者限定: - 運転者年令条件: - 補償対象者: ## 等級・割引 - ノンフリート等級: - 割引率: - ゴールド免許割引: - 安全運転スコア: ## 補償内容 ### 対人賠償 - 保険金額: ### 対物賠償 - 保険金額: - 免責金額: ### 人身傷害 - 保険金額: - 特約: ### 搭乗者傷害 - 保険金額: ### 車両保険 - 補償タイプ: - 保険金額(1年目): - 保険金額(2年目): - 保険金額(3年目): - 免責金額: ## 特約・サービス - 記載されている特約を箇条書きで列挙 ## 保険料 - 払込方法: - 1年目保険料: - 2年目保険料: - 3年目保険料: ## 連絡先 - 事故連絡先: - カスタマーセンター: - 代理店名: - 電話番号: --- 【注意】 - 不明な項目は「記載なし」と記載してください - 表や一覧は、意味を崩さず箇条書きにしてください - 改行と見出しを適切に使い、可読性を最優先してください
PDFファイルをMac miniへコピーする
保険証券や約款のPDFをMac miniへコピーします。
今回は以下のように scp で転送しました。
scp aw10s/ollama/rag_data/insurance/* macmini:~/insurance/
転送結果は以下です。
あいおいニッセイ自動車保険証券.pdf 100% 349KB 6.2MB/s 00:00 あいおいニッセイ普通保険約款・特約.pdf 100% 7938KB 7.8MB/s 00:00 県民共済特約.pdf 100% 1496KB 9.0MB/s 00:00 県民共済約款.pdf 100% 406KB 7.4MB/s 00:00
古いGemini CLIのコマンドは使えなかった
最初は、古い記事を参考に以下のようなコマンドを試しました。
gemini analyze \ --file あいおいニッセイ自動車保険証券.pdf \ --prompt prompt_insurance_policy.txt \ --output insurance.md
しかし、現在のGemini CLIではこの形式は使えませんでした。
実行結果は以下です。
Unknown arguments: file, output Usage: gemini [options] [command] Gemini CLI - Launch an interactive CLI, use -p/--prompt for non-interactive mode
--file や --output は現在のGemini CLIでは使えないようです。
現在のGemini CLI向けにプロンプトを変更する
現在のGemini CLIでは、ファイルを直接オプション指定するのではなく、プロンプト内で「このファイルを読んでください」と指示する形にしました。
最終的には、以下のようにしました。
gemini -y " 次の指示書を必ず最初に読み、その内容に厳密に従ってください。 指示書ファイル: - prompt_insurance_policy.txt 次のPDFファイルを処理してください。 - あいおいニッセイ自動車保険証券.pdf 指示書のフォーマットに従い、 Markdown形式で構造化してください。 出力は insurance.md として保存してください。 "
このプロンプトでは、以下を明示しています。
- 最初に
prompt_insurance_policy.txtを読むこと - 対象PDFを指定すること
- 指示書のフォーマットに従うこと
- 出力ファイル名を
insurance.mdにすること
GEMINI_API_KEYが未設定でエラーになった
実行すると、以下のエラーが出ました。
YOLO mode is enabled. All tool calls will be automatically approved. When using Gemini API, you must specify the GEMINI_API_KEY environment variable. Update your environment and try again (no reload needed if using .env)!
Gemini APIを使う場合、GEMINI_API_KEY 環境変数が必要です。
npxではなくグローバルインストールに変更する
最初は npx @google/gemini-cli でGemini CLIを使っていました。
ただし、毎回実行する用途では以下が気になりました。
- 毎回インストール確認が出る
- 毎回の実行が遅い
- 自動化やバッチ処理で不安定になりやすい
- 無料枠処理中にタイムアウトが増える可能性がある
そのため、通常はNode.js 24をデフォルトにして、Gemini CLIはグローバルに入れる方針にしました。
Firebase Gen1のようにNode.js 18が必要なプロジェクトでは、後で direnv を使って、そのディレクトリだけNode.js 18に切り替える想定です。
Node.jsとnpmの確認
現在のNode.jsとnpmを確認します。
node -v npm -v
結果は以下です。
v24.13.0 11.6.2
Gemini CLIをグローバルインストールする
npmでGemini CLIをグローバルインストールします。
npm i -g @google/gemini-cli
実行結果は以下です。
npm warn deprecated node-domexception@1.0.0: Use your platform's native DOMException instead added 592 packages in 26s 157 packages are looking for funding run `npm fund` for details
これで、gemini コマンドを直接使えるようになります。
Gemini APIキーを保存する
APIキーを直接 ~/.zshrc に書くのではなく、別ファイルに保存します。
まず、保存用ディレクトリを作成します。
mkdir -p ~/.config/gemini
APIキー保存用ファイルを作成します。
vim ~/.config/gemini/api_key_free
中身には、実際のAPIキーを保存します。
公開記事では、実際のキーは絶対に書きません。
YOUR_GEMINI_API_KEY_HERE
保存したら、権限を絞ります。
chmod 600 ~/.config/gemini/api_key_free
.zshrcでGEMINI_API_KEYを読み込む
~/.zshrc に以下を追記します。
echo 'export GEMINI_API_KEY="$(cat ~/.config/gemini/api_key_free)"' >> ~/.zshrc
現在のシェルをログインシェルとして起動し直します。
exec zsh -l
source ~/.zshrc でも反映できますが、今回はログインし直しに近い形で読み込み直しました。
APIキーが読み込まれているか確認する
APIキーそのものを表示すると危険なので、先頭だけ確認します。
echo ${GEMINI_API_KEY:0:6}
これは、環境変数 GEMINI_API_KEY の先頭6文字だけを表示する確認方法です。
意味は以下です。
${変数:開始位置:文字数}
ブログやログに残す場合も、APIキー全体は絶対に表示しないようにします。
direnvをインストールする
次に、プロジェクトごとにNode.jsや環境変数を切り替えるため、direnv を入れます。
brew install direnv
direnv は、インストールしただけでは動きません。
zshと連携するためのフックを ~/.zshrc に追加します。
echo 'eval "$(direnv hook zsh)"' >> ~/.zshrc
シェルを起動し直します。
exec zsh -l
バージョンを確認します。
direnv version
Gemini CLIを再実行する
APIキーとdirenv設定後、再度Gemini CLIを実行します。
gemini -y " 次の指示書を必ず最初に読み、その内容に厳密に従ってください。 指示書ファイル: - prompt_insurance_policy.txt 次のPDFファイルを処理してください。 - あいおいニッセイ自動車保険証券.pdf 指示書のフォーマットに従い、 Markdown形式で構造化してください。 出力は insurance.md として保存してください。 "
ファイル変更の許可確認
Gemini CLIが insurance.md を作成または変更しようとすると、確認画面が表示される場合があります。
Apply this change? 1. Allow once 2. Allow for this session 3. Modify with external editor 4. No, suggest changes
選択肢の意味は以下です。
| 選択肢 | 意味 | 使いどころ |
|---|---|---|
| 1. Allow once | 今回だけ許可する | 初回実行や、毎回内容を確認したい場合 |
| 2. Allow for this session | このセッション中は許可する | 連続してファイル修正する場合 |
| 3. Modify with external editor | 外部エディタで修正する | AI案を手動で調整したい場合 |
| 4. No, suggest changes | 拒否して修正案だけ出す | 内容が間違っている場合 |
生成内容が正しければ、1 または 2 を選びます。
Markdownファイルを確認する
生成されたMarkdownを確認します。
cat insurance.md
以下のように、保険証券の内容がMarkdownとして構造化されました。
なお、以下は公開用に個人情報をダミー化した例です。
--- # 保険証券(契約内容) ## 契約基本情報 - 証券番号:DUMMY-POLICY-NUMBER - 保険種類:タフ・見守るクルマの保険プラスS(個人総合自動車保険) - 保険期間(開始):令和5年11月26日 午後4時 - 保険期間(満了):令和8年11月26日 午後4時 - 契約日:令和5年11月15日 ## 契約者・被保険者 - 保険契約者:山田太郎様 - 記名被保険者:保険契約者に同じ - 生年月日:昭和XX年XX月XX日 - 住所:静岡県〇〇市〇〇町 〇〇番地 - 電話番号:090-XXXX-XXXX ## 車両情報 - 登録番号:浜松 000 あ 0000 - 車名:サンプル車種 - 型式:DUMMY-MODEL - 車台番号:DUMMY-CHASSIS-NUMBER - 初度登録:平成XX年XX月 - 排気量:0.65 L - 用途車種:自家用軽四輪乗用車 - 使用目的:通勤・通学使用 ## 運転条件 - 運転者限定:限定なし - 運転者年令条件:35才以上補償 - 補償対象者:記載なし ## 等級・割引 - ノンフリート等級:20等級 - 割引率:63%割引 - ゴールド免許割引:あり - 安全運転スコア:なし ## 補償内容 ### 対人賠償 - 保険金額:無制限 ### 対物賠償 - 保険金額:無制限 - 免責金額:免責金額なし ### 人身傷害 - 保険金額:1名につき 5,000万円 - 特約:自動車事故特約、入院・後遺障害時における人身傷害諸費用特約、人身傷害家族臨時交通費用特約、傷害一時金特約、搭乗者傷害(死亡・後遺障害)特約 ### 搭乗者傷害 - 保険金額:1名につき 1,000万円 ### 車両保険 - 補償タイプ:一般補償 - 保険金額(1年目):100万円 - 保険金額(2年目):90万円 - 保険金額(3年目):80万円 - 免責金額:保険年度ごとの事故1回目 0万円、保険年度ごとの事故2回目以降 10万円 ## 特約・サービス - ロードアシスタンスサービス - 運転者年令条件特約 - 弁護士費用(自動車事故型)特約 - 運転特性情報による保険料算出に関する特約 - 事故発生の通知等に関する特約 - 車両保険無過失事故特約 - 継続手続特約 - 保険証券の発行に関する特約 - 長期保険料分割払特約 - 保険料クレジットカード払(登録方式)特約 - ロードサービス費用特約 - 代車補償対象外特約 - 全損時諸費用特約 ## 保険料 - 払込方法:年払 クレジットカード払(登録方式) - 1年目保険料:59,680円 - 2年目保険料:59,740円 - 3年目保険料:59,100円 ## 連絡先 - 事故連絡先:あんしんサポートセンター TEL 0120-024-024 - カスタマーセンター:あいおいニッセイ カスタマーセンター TEL 0120-101-101 - 代理店名:サンプル代理店 - 電話番号:000-000-0000 ---
今回の結果
今回の作業で、以下まで確認できました。
- 保険証券PDFをMac miniへコピーできた
- 保険証券用のMarkdown変換プロンプトを作成できた
- 古いGemini CLIの
analyze --file --output形式は使えないことが分かった - 現在のGemini CLIでは、プロンプト内でファイルを指定する方式にした
GEMINI_API_KEYを環境変数として設定した- Gemini CLIでPDFを読み取り、
insurance.mdを作成できた - 保険証券の内容をMarkdown形式で構造化できた
ハマりどころ
古いGemini CLI記事のコマンドはそのまま使えない
gemini analyze --file ... --output ... のような形式は、現在のGemini CLIでは使えませんでした。
現在のバージョンでは、プロンプト内で対象ファイルと出力ファイルを指示する形にしました。
GEMINI_API_KEYが必要
Gemini APIを使う場合は、GEMINI_API_KEY 環境変数が必要です。
APIキーは直接 ~/.zshrc に書かず、別ファイルに保存して読み込む形にしました。
APIキーは絶対に公開しない
ログやブログ記事にAPIキーを貼らないように注意します。
公開用の記事では、以下のようにダミー表記にします。
YOUR_GEMINI_API_KEY_HERE
保険証券の内容も公開しない
保険証券には個人情報が多く含まれます。
氏名、住所、電話番号、証券番号、車台番号、登録番号などは、公開前に必ずダミー化します。
–yoloは便利だが注意
-y または --yolo を使うと、ツール実行が自動承認されます。
今回のようにファイル生成を自動化する場合は便利ですが、意図しないファイル変更のリスクもあります。
重要なファイルがあるディレクトリでは、最初は -y を外して挙動を確認する方が安全です。
次にやること
次は、自動車保険の普通保険約款・特約PDFをMarkdown化します。
保険証券は契約内容の一覧ですが、約款は補償条件、支払条件、免責、特約の詳細が書かれています。
事故対応RAGとして使うには、以下のような情報を約款から取り出す必要があります。
- 人身傷害保険で支払われるもの
- 搭乗者傷害の支払条件
- 傷害一時金特約の条件
- 弁護士費用特約の対象範囲
- ロードサービス費用特約の内容
- 請求に必要な書類
- 免責事項
保険証券と約款を両方Markdown化することで、「自分の契約では何が使えるのか」と「約款上どの条件で支払われるのか」をつなげやすくなります。
まとめ
Gemini CLIを使って、自動車保険証券の画像PDFをMarkdownへ変換しました。
最初は古い記事のコマンド形式を試しましたが、現在のGemini CLIでは使えなかったため、プロンプト内で指示書と対象PDFを指定する方式に変更しました。
また、Gemini APIキーは環境変数 GEMINI_API_KEY として設定し、ブログ記事では必ずダミー化するようにしました。
保険証券のMarkdown化により、契約内容、補償内容、特約、保険料、連絡先を構造化できました。
次は約款PDFをMarkdown化し、保険証券と約款を組み合わせて、事故対応RAGに使える形へ整理していきます。

コメント