「いまのスキルで将来食べていけるか不安」
「転職する / しないをどう判断したらいいか迷う」
そんなモヤモヤを抱えるエンジニア向けに、PC だけで動く「Career & Skill Advisor」を紹介します。
ローカルLLMの管理は、Ollamaを利用します。Ollamaとは、ローカルLLMを動作・管理するソフトウェアです。無料のOSSでMITライセンスです。データは外部送信されないので、個人情報である職務経歴書を入力しても安心です。
ローカルLLMは、Gemma3を利用します。Gemma3は軽量なローカルLLMですが、Chatbot Arenaでo1-previewモデルより上位の評価です。人間の目視評価で、最新のクラウド型モデルと遜色ない会話ができます。また、短いトークン数での文章理解や知識蒸留で工夫されており、メモリ効率が極めて高いことが特徴です。ライセンスは、です。
※Ollamaの詳細なインストール手順と利用方法は、以下記事の[2. Ollamaのインストールと利用方法]をご参考ください。
OllamaをPythonから操作:WindowsでローカルLLM入門
お持ちのパソコンのメモリが32GB程度ある場合、gemma3:12bをpullしてください。もし、メモリが8GB程度で少な目の場合、gemma3:1bもしくはgemma3:4bモデルをpullしてください。
自動で開かない場合は、ブラウザに
ファイルはローカルでのみ解析。
「技術キーワード + 役割/領域」で具体的に書くと精度アップ。
📊 Market Analyst: 求人数・年収・成長率の SWOT
📚 Learning Planner: 学習ロードマップ+転職の要否
📝 統合レポート: 上記 3 つを一本化
キャリア分析結果を、markdownファイルで保存することができます。
なお、本ツールの出力結果はあくまで参考情報です。最終判断は自己責任でお願いいたします。
「転職する / しないをどう判断したらいいか迷う」
そんなモヤモヤを抱えるエンジニア向けに、PC だけで動く「Career & Skill Advisor」を紹介します。
1. アプリの概要
このアプリは、職務経歴書と興味分野を入力すると、3つのローカルLLMがキャリア戦略・市場性評価・転職判断プランを自動生成し、Markdownで統合レポートを出力します。レポートは、市場規模データと、あなたの強み弱みを分析したSWOT分析結果が添えられるため、単なる感覚ではなくファクトを踏まえて方向性を検討できます。
ローカルLLMの管理は、Ollamaを利用します。Ollamaとは、ローカルLLMを動作・管理するソフトウェアです。無料のOSSでMITライセンスです。データは外部送信されないので、個人情報である職務経歴書を入力しても安心です。
ローカルLLMは、Gemma3を利用します。Gemma3は軽量なローカルLLMですが、Chatbot Arenaでo1-previewモデルより上位の評価です。人間の目視評価で、最新のクラウド型モデルと遜色ない会話ができます。また、短いトークン数での文章理解や知識蒸留で工夫されており、メモリ効率が極めて高いことが特徴です。ライセンスは、です。
2. 環境構築手順
1. Ollamaのインストール
以下の公式のURL にアクセスし、Ollamaのインストーラーをダウンロードします。
ダウンロードしたOllamaSetup.exeをクリックし、インストールしてください。
インストールが完了したら、「すべてのアプリ」をクリックしてOllamaを起動しましょう。Ollamaは画面を持たないコマンドラインツールです。右下のシステムトレイにollamaが常駐するので、それで起動しているかどうかを確認できます。
インストールが完了したら、「すべてのアプリ」をクリックしてOllamaを起動しましょう。Ollamaは画面を持たないコマンドラインツールです。右下のシステムトレイにollamaが常駐するので、それで起動しているかどうかを確認できます。
※Ollamaの詳細なインストール手順と利用方法は、以下記事の[2. Ollamaのインストールと利用方法]をご参考ください。
OllamaをPythonから操作:WindowsでローカルLLM入門
2. Pythonのインストール
3. 必要なライブラリのインストール
pip install streamlit==1.37.1 ollama requests
4. Gemma3モデルを Ollama に pull
Gemma3のパラメータは、1b、4b、12b、27bから選べます。お持ちのパソコンのメモリが32GB程度ある場合、gemma3:12bをpullしてください。もし、メモリが8GB程度で少な目の場合、gemma3:1bもしくはgemma3:4bモデルをpullしてください。
ollama pull gemma3:12b
5. アプリコードの配置
この記事末尾の Appendix にあるコードをコピーして、carrer_advidor.pyのファイル名で保存する。6. アプリを起動
streamlit run career_advisor.py上記を実行すると、ブラウザが自動で開き、タイトル「🎯 Career & Skill Advisor – Tri-LLM」が見えれば準備完了です。
自動で開かない場合は、ブラウザに
http://localhost:8501 と打ち込んでアクセスしてください。3. アプリの使い方
1. 職務経歴書をアップロード
PDF / DOCX / TXT いずれかをドラッグ&ドロップ。ファイルはローカルでのみ解析。
2. 興味分野を入力
例: 生成AI × プロジェクトマネジメント「技術キーワード + 役割/領域」で具体的に書くと精度アップ。
3. 🔍 分析を開始 をクリック
10〜40 秒で 4 つのタブが表示されます。4. 結果タブの読み方
🏆 Strategy Coach: キャリア案 3 件📊 Market Analyst: 求人数・年収・成長率の SWOT
📚 Learning Planner: 学習ロードマップ+転職の要否
📝 統合レポート: 上記 3 つを一本化
5. Markdown でダウンロード
統合レポートタブ下部の「📥 レポートを Markdown で保存」をクリック。キャリア分析結果を、markdownファイルで保存することができます。
6. まとめ
ローカルLLMは、最初のモデルのダウンロード以外、インターネットに接続しないので、安心して個人情報をLLMに入力できます。なお、本ツールの出力結果はあくまで参考情報です。最終判断は自己責任でお願いいたします。
Appendix — career_advisor.py
# -*- coding: utf-8 -*-
"""
Streamlit アプリ: Career & Skill Advisor
三つのローカル LLM (gemma3:12b, ollama 経由) が職務経歴書と興味分野を入力として
それぞれの視点でアドバイスを生成し、最終的に統合レポートを表示する。
"""
import textwrap
from concurrent.futures import ThreadPoolExecutor
import ollama
import streamlit as st
# --------------------------------------------------
# Streamlit 設定
# --------------------------------------------------
st.set_page_config(page_title="Career & Skill Advisor", page_icon="🎯", layout="centered")
st.title("🎯 Career & Skill Advisor – Tri‑LLM")
# --------------------------------------------------
# LLM 設定
# --------------------------------------------------
SUMMARIZER_MODEL = "gemma3:12b"
# --------------------------------------------------
# System Prompts
# --------------------------------------------------
SYSTEM_PROMPT_A = textwrap.dedent(
"""
あなたは Executive Career Coach です。ユーザーの職務経歴書と興味分野を踏まえ、
3〜5 年で達成可能なキャリアオプションを3件提案してください。
それぞれ (タイトル 15字以内 + 概要 40字以内) で出力してください。
"""
)
SYSTEM_PROMPT_B = textwrap.dedent(
"""
あなたは Tech Job Market Analyst です。ユーザーの目標分野について、日本国内の
求人数・給与中央値・成長率を推定し、SWOT 形式で分析してください。数字が不明な場合は
推定レンジを示し、出典無しを明記してください。
"""
)
SYSTEM_PROMPT_C = textwrap.dedent(
"""
あなたは Learning Planner です。ユーザーの目標分野を達成するために、
転職すべきかどうかを評価てください。
なお、転職にはリスクが伴うため、現職で達成できる場合は、転職を進めないでください。
"""
)
SYSTEM_PROMPT_SUM = textwrap.dedent(
"""
あなたは Report Writer です。以下に3人の専門家 (Coach, Analyst, Planner)
が提示したコンテンツがあります。コンテンツを理解し総合レポート作成してください。
"""
)
# --------------------------------------------------
# ユーティリティ: LLM 呼び出し
# --------------------------------------------------
@st.cache_data(show_spinner=False)
def run_llm(system_prompt: str, user_payload: str, temperature: float = 0.5) -> str:
"""gemma3:12b を使って 1 回推論するヘルパー"""
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_payload},
]
response = ollama.chat(
model=SUMMARIZER_MODEL,
messages=messages,
options={"temperature": temperature},
)
return response["message"]["content"].strip()
# --------------------------------------------------
# UI: 入力フォーム
# --------------------------------------------------
resume_file = st.file_uploader(
"職務経歴書 (PDF/DOCX/TXT)",
type=["pdf", "docx", "txt"],
help="ファイルはローカル PC 内でのみ処理されます。外部へ送信されません。",
)
interest_text = st.text_area("興味分野 (例: 生成AI × PM)", max_chars=300)
analyze_btn = st.button("🔍 分析を開始", disabled=not (resume_file and interest_text))
# --------------------------------------------------
# メイン処理
# --------------------------------------------------
if analyze_btn:
with st.spinner("LLM がキャリアプランを生成中…"):
# 1) 職務経歴書テキスト抽出
resume_bytes = resume_file.read()
resume_text = resume_bytes.decode("utf-8", errors="ignore")
# 2) ユーザーペイロード作成
user_payload = f"""### 職務経歴書\n{resume_text}\n\n### 興味分野\n{interest_text}"""
# 3) LLM 並列実行
with ThreadPoolExecutor(max_workers=3) as ex:
futures = [
ex.submit(run_llm, SYSTEM_PROMPT_A, user_payload, 0.5),
ex.submit(run_llm, SYSTEM_PROMPT_B, user_payload, 0.3),
ex.submit(run_llm, SYSTEM_PROMPT_C, user_payload, 0.7),
]
result_A, result_B, result_C = [f.result() for f in futures]
# 4) 統合レポート生成
combined_payload = (
"## Coach Advice\n" + result_A +
"\n\n## Market Analysis\n" + result_B +
"\n\n## Learning Plan\n" + result_C
)
summary = run_llm(SYSTEM_PROMPT_SUM, combined_payload, 0.3)
# 5) 4 つの Markdown を丸ごと結合(ダウンロード用)
full_markdown = (
"# Strategy Coach\n" + result_A +
"\n\n# Market Analyst\n" + result_B +
"\n\n# Learning Planner\n" + result_C +
"\n\n# Integrated Report\n" + summary
)
# --------------------------------------------------
# 6) 結果表示
# --------------------------------------------------
tab1, tab2, tab3, tab4 = st.tabs([
"🏆 Strategy Coach", "📊 Market Analyst", "📚 Learning Planner", "📝 統合レポート"
])
with tab1:
st.markdown(result_A)
with tab2:
st.markdown(result_B)
with tab3:
st.markdown(result_C)
with tab4:
st.markdown(summary) # 統合レポート表示
# --- 🎯 ここだけにダウンロードボタンを配置 ---
st.download_button(
"📥 レポートを Markdown で保存",
data=full_markdown,
file_name="career_report.md",
mime="text/markdown",
)
st.success("完了しました!")
# --------------------------------------------------
# フッター
# --------------------------------------------------
st.markdown(
"<sub>Powered by gemma3:12b (ollama) – Local Inference Only</sub>",
unsafe_allow_html=True,
)関連記事:Ollama×Streamlit×VoiceVoxで作るローカルLLM音声対話アプリ【完全ハンズオン】【PR】電子書籍を出版しました
ローカルLLMの環境構築から音声対話までを最短で通したい方へ。
拙著[ゼロから始めるローカルLLM Pythonで動かすOllamaとVOICEVOX]では、ローカルLLMの入門書として、Ollama導入、VOICEVOXでの読み上げ、チャットアプリ完成までを、つまずきやすい点まで具体的に解説しました。
拙著[ゼロから始めるローカルLLM Pythonで動かすOllamaとVOICEVOX]では、ローカルLLMの入門書として、Ollama導入、VOICEVOXでの読み上げ、チャットアプリ完成までを、つまずきやすい点まで具体的に解説しました。