プライベートな AI で履歴書をカスタマイズ:Ollama でローカルに動かす
ローカルモデルで履歴書をプライベートにカスタマイズする方法:クラウドプロバイダーが受け取るもの、Ollama のモデルの選び方、速度・品質・タイムアウトのトレードオフ。
AI モデルに履歴書のカスタマイズを頼むたびに、モデルは文書全体を読みます。名前、電話番号、メール、すべての勤務先と日付、そしてファイルに入れているそのほかのすべてです。クラウドプロバイダーを使えば、そのテキストはあなたのマシンの外に出ます。プライベートな AI による履歴書のカスタマイズとは、代わりに自分のハードウェアでモデルを動かし、履歴書(CV)と求人内容をマシンの外に出さないことです。この記事では、なぜそうしたいのか、そうしない場合にクラウドプロバイダーが何を受け取るのか、Ollama でローカルモデルをどう選ぶか、そして速度、品質、タイムアウトのトレードオフを説明します。
セットアップの手順はドキュメントにあります。Docker での流れは Ollama のセットアップ(英語)を、設定画面と環境変数は 自分の AI キーを使う を参照してください。この記事は「なぜ」と「何を」の話です。
なぜ履歴書をローカルに保つのか
履歴書は、あなたが持っている中でもかなり個人的な文書です。氏名、電話番号、メール、住んでいる都市、そしてどこで働いてきたかの日付付きの記録が入っています。マスター履歴書を持っているなら、カスタマイズ版には決して書かないことも入っているかもしれません。前の職を辞めた理由のメモ、内定の年収額、上司の名前などです。それをチャットの画面に貼り付ければ、データの扱いの規約を読んだかどうかもわからない会社にそれを送ったことになります。
具体的に気にする理由がある人は 3 つのグループです。
守秘義務がある人。 現在の勤務先の名前、プロジェクトのコードネーム、顧客の一覧が箇条書きに出てくるなら、履歴書には契約で守る義務のある情報が含まれているかもしれません。
ひそかに転職活動をしている人。 「競合他社の職に向けて履歴書をカスタマイズしている」という記録を、自分のディスク以外のどこにも残したくないはずです。
プロバイダーのポリシーを読む人。 規約はプロバイダーやプランによって違います。たとえば Anthropic の商用製品のページには、API とビジネス向け製品の入力と出力は、あなたが送ったフィードバックを除き、デフォルトでは学習に使われないと書かれています(Anthropic privacy centre、2026 年 8 月付。一般向けのプランは別のページで扱われています)。ほかのプロバイダーも独自の規約を公開しています。それを正しく読めているかに頼りたくないなら、ローカルモデルがその問いそのものをなくしてくれます。
クラウドプロバイダーが受け取るもの
Resume Matcher はハーネスです。接続したモデルにプロンプトを送り、その結果にコードによるチェックをかけます。送信前に情報を伏せる処理は行いません。プロジェクトのコードから作った下の表は、各機能が選んだプロバイダーに何を送るかを示しています。
| 機能 | プロバイダーに送られる内容 |
|---|---|
| 履歴書のアップロード(解析) | 名前、メール、電話番号、リンクを含む、抽出した履歴書の全文 |
| 求人内容の分析、履歴書のタイトル | 求人内容 |
| カスタマイズ(スキル計画、差分による編集) | 求人内容と、個人情報を含む履歴書全体の構造化された JSON |
| カスタマイズ後のキーワード処理 | カスタマイズ版とマスター履歴書の JSON、求人内容の先頭 2,000 文字 |
| 箇条書きの採点 | 箇条書きのテキスト、求人内容、抽出したキーワード |
| カバーレター、連絡メール | 履歴書全体の JSON と求人内容 |
| 面接準備 | 履歴書の JSON(最大 30,000 文字)と求人内容(最大 12,000 文字) |
| 強化、再生成、履歴書ウィザード | 履歴書または 1 つの項目と、あなたの回答や指示 |
| 接続テスト | 「Hi」という 1 語 |
Resume Matcher の作者には何も送られず、アプリに分析用のコードはありません。ほかのプロバイダーの API キー、データベース、トラッカーのボード、設定、作成した PDF はディスクに残ります。それ以外の外向きの通信は、AI ライブラリ(LiteLLM)が起動時に公開されているモデルの価格表を取得するものだけで、あなたのデータは含まれず、オフラインのときは同梱のコピーを使います。
ChatGPT や Claude に手作業で貼り付けても、送られるものは同じで、構造が少ないだけです。クラウドのモデルが履歴書を読む流れであれば、どんな方法でも、履歴書はそのクラウドに送られます。
プライベートな AI での履歴書のカスタマイズはどう見えるか
同じハーネスをマシン上で動くモデルに向ければ、上の表のすべての行がローカルにとどまります。モデルが履歴書を読み、編集を提案し、コードがそれをチェックし、テキストをどこかに運ぶネットワークのリクエストは発生しません。
Resume Matcher では、設定で次の 2 つのプロバイダーのどちらかを選ぶことになります。
- Ollama:オープンなモデルをダウンロードし、
http://localhost:11434で提供する無料のツール。 - OpenAI 互換の任意のサーバー:llama.cpp、vLLM、LM Studio など、OpenAI の Chat Completions API に対応したもの。
「プライベート」という言葉には、4 つの補足があります。
インストールにはインターネットが必要ですが、使うときには不要です。 アプリ、その依存関係、PDF の書き出しに使うブラウザ、モデルの重みを一度ダウンロードします。そのあとカスタマイズの作業はオフラインで動きます。起動時の LiteLLM の価格表の取得も、オフラインのときは同梱のコピーを使います。
データは 1 つのフォルダーにあります。 履歴書、求人内容、カスタマイズ版、トラッカーのボードは、アプリのデータディレクトリの SQLite ファイル、または 1 つの Docker ボリュームにあります。設定はその横の小さな設定ファイルにあります。API キーを保存している場合は、あなたのユーザーアカウントだけが読める鍵ファイルで暗号化されます。履歴書の内容そのものはその SQLite ファイルに普通のデータとして保存されるので、フォルダーのプライバシーはそれが置かれたディスクと同じです。ディスク全体を暗号化したノートパソコンなら、それでカバーできます。
アプリに分析機能はありません。 コードに追跡用の SDK は含まれていません。Docker イメージは Next.js 自体のフレームワークのテレメトリーも無効にしています。ソースから npm run dev でフロントエンドを動かす場合、そのフレームワークの設定は自分で管理してください。
ローカルサーバーにクラウドのキーが渡ることはありません。 有料のプロバイダーのキーを環境変数に入れたまま Ollama に切り替えても、バックエンドはそのキーをローカルサーバーに渡さないので、プロバイダーを切り替えてもキーが漏れることはありません。
ローカルモデルの選び方
Ollama がいちばん手軽な方法です。名前でモデルを取得し、ローカルのポートで提供します。Resume Matcher の設定画面は Ollama のデフォルトとして gemma3:4b を提案し、プロジェクトのセットアップガイドはほかの選択肢として llama3.2 と mistral を挙げています。Ollama が提供するどのモデルでも、モデル欄に入力できます。
デフォルトから始めます。 gemma3:4b はプロジェクトが提案する出発点で、Ollama のモデルページ によると、2026 年 10 月時点でダウンロードは 3.4 GB です。小さなモデルなので、何が期待できるかは下の構造化された編集についての段落を読んでください。
ハードウェアが許すなら大きくします。 同じページには、8.2 GB の gemma3:12b と 17 GB の gemma3:27b があります。これはダウンロードのサイズで、実行時にモデルが必要とするメモリは、量子化やコンテキストの長さによって変わる別の数字です。Resume Matcher のドキュメントは RAM の要件を示しておらず、私もそれをでっち上げるつもりはありません。Ollama の FAQ は、モデルが GPU に読み込まれたのか、システムメモリに読み込まれたのか、その両方なのかを確認する方法を説明しています。あるサイズがマシンに合うかを知るには、それが最も速い方法です。
小さなモデルは構造化された編集を苦手とすると考えてください。 これは既知の問題です。Resume Matcher はモデルに新しい履歴書を丸ごと求めるのではなく、厳密な形式で的を絞った編集の一覧を求めます。各編集は元の文を引用しているので、コードは適用する前に確認できます。プロジェクトの設計メモには、小さなモデルはこの形式を苦手とすると記録されています。壊れた出力を返したり、一致しない文を引用したり、構造を省いたりします。コードは決まった回数だけ再試行し、それでも失敗するとエラーになるので、再生成するか大きなモデルに移ってください。弱いモデルは時間を浪費しますが、安全策はモデルに関係なく機能します。名前、勤務先、役職、日付、学位は固定され、新しい数値は元に戻されます。
ハーネスがローカルモデルを助けるためにしていることが 2 つあります。
- Ollama では JSON モードを常にオンにしています。 サーバーが拒否した場合はプロンプトだけの方法に切り替え、モデルを正しい構造へと導きます。
- 推論の過程を取り除きます。 一部の推論モデルは、答えの前に
<think>ブロックを出力します。コードは解析の前にそのブロックを取り除くので、「考える」モデルでも編集の形式が壊れません。
デフォルトのモデルで、あなたの履歴書のプレビューが壊れる場合は、プロンプトを疑う前に中くらいのモデルを試してください。
トレードオフ:速度、品質、タイムアウト
速度。 クラウドのモデルはカスタマイズのリクエストに数秒で答えます。ノートパソコンの CPU で動くローカルモデルは、同じプロンプトに数分かかることがあり、カスタマイズの処理は 1 回の実行でモデルを何度も呼び出します。求人からのキーワード抽出、箇条書きの関連性の採点、スキル計画、編集の一覧、そしてそのあとのキーワード処理です。それぞれの呼び出しは前の呼び出しを待ちます。1 回あたり 5 倍遅いモデルは、実行全体も 5 倍遅くします。
品質。 大きなモデルはより流暢に言い換え、求人の語彙により近く、壊れた編集も少なくなります。小さなモデルは硬い言い回しになり、却下される変更が増えます。コードのチェックがあるので、下限はどちらも同じです。小さなモデルも大きなモデルと同様、数値を作り出したり日付を変えたりはできません。そうした編集はあなたに届く前に止められるからです。違うのは上限です。
タイムアウト。 Resume Matcher の AI へのリクエストはすべて、1 つの期限 REQUEST_TIMEOUT_SECONDS の中で実行されます。デフォルトは 240 秒で、30〜1,800 の値を受け付けます。この期限はカスタマイズの実行全体、つまりすべてのモデル呼び出しを含みます。ローカルのプロバイダーには 2 倍のタイムアウト係数が適用されますが、控えめなハードウェアで大きなモデルを動かすと、それでも超えることがあります。タイムアウトが起きるなら、バックエンドの環境で REQUEST_TIMEOUT_SECONDS を、それに合わせてフロントエンドの環境で NEXT_PUBLIC_REQUEST_TIMEOUT_MS を引き上げてください。どちらも 自分の AI キーを使う のページに載っています。
費用。 ローカルモデルならリクエストごとの費用はゼロで、クラウドプロバイダーなら呼び出しごとに料金がかかります。カスタマイズした履歴書、カバーレター、面接準備をそれぞれ付けた 40 件の応募となれば、その差はある人にとっては本当のお金で、別の人にとってはわずかな額です。いずれにしても、プライバシーの論点はそれだけで成り立ちます。
全体の組み立て
位置関係をつかむための 1 段落です。コマンドはドキュメントにあります。
Ollama はあなたのマシンで動き、ポート 11434 で待ち受けます。Resume Matcher はその横で、ソースからでも Docker でも動き、ポート 3000 でアプリを提供します。設定でプロバイダーに Ollama を選び、取得したモデルの名前を入力して「接続テスト」をクリックすると、「Hi」という 1 語が送られ、モデルが答えたかどうかが表示されます。Docker の中からは、コンテナが独自のネットワーク名前空間を持つため、アプリは localhost ではなく http://host.docker.internal:11434 で Ollama に接続します。そのあとは、アプリのすべての機能(カスタマイズ、カバーレター、面接準備、強化)がローカルモデルを使い、ブラウザは同じマシンで PDF を印刷します。
Ollama のセットアップ(英語)のページに Docker での手順があり、自分の AI キーを使う で、ソースと Docker の両方の方法について、設定、環境変数、トラブルシューティングを扱っています。
クラウドのモデルのほうがよいとき
ローカルはトレードオフであり、人によってはクラウドの側が勝ちます。ノートパソコンの性能が低ければ、動かせるモデルは小さく、小さなモデルは役に立つ編集より却下される編集を多く出します。今週応募するのに 1 回の実行に 4 分かかるなら、データの流れより速度が大事です。履歴書にプロバイダーに読まれて困るものが何もなく、プロバイダーの規約も読んでいるなら、プライバシーの論点はあなたにとって机上の話です。
中間の方法もあります。カスタマイズの大半はローカルモデルで行い、最も良い文章がほしい 1 件の応募のときだけ、設定でプロバイダーを切り替えます。アプリはプロバイダーごとにキーを保存するので、切り替えはドロップダウンで済みます。安全策のコードは変わりません。どのモデルを接続しても、名前、勤務先、役職、日付、学位は固定され、モデルが作り出した数値はあなたが見る前に元に戻されます。
Resume Matcher は無料で、Apache 2.0 ライセンスのオープンソースであり、20 万人以上の求職者が使っています。モデルを同梱せず、ウェブサイトもホスティングしていません。それがこの記事の要点です。モデルはあなたのもので、データもあなたのものです。
役に立ったら
自分のマシンでモデルを動かす方法が、あなたの探していたものなら、GitHub の Resume Matcher にスターを付けていただけると、ほかの求職者が見つけやすくなります。私、Saurabh Rai は GitHub、X、LinkedIn でフォローできます。
[この記事は AI の助けを借りて下書き、翻訳、整形しました。製品に関する情報は Resume Matcher のソースコードと照合して確認し、外部の情報源は引用箇所にリンクしています。]
役に立ちましたか? GitHub で Resume Matcher にスターを付けて、開発をフォローしてください