🐎

「スキルシート自動化ツール」を作ったことで得られたもの

に公開

📝はじめに — なぜこの記事を書くのか

「スキルシートを書いてください」

おそらく一度はモニターの前で固まるフレーズです。
書いたことのないものをいきなり書けと言われても難しいと思います。

ここでいう「スキルシート」とは、
エンジニアの経歴・担当業務・保有スキルを一覧化した、社内向けの職務経歴書のような書類です。

案件へのアサインやお客様への提案の際に、
「このエンジニアは何ができるのか?」をひと目で伝えるための資料として使われます。

現状では 営業担当がエンジニアから口頭でヒアリングを行い、 その内容を元にスキルシートを“代筆”する というフローで作成しています。

そのため、エンジニアは言語化が苦手で書けない、営業はヒアリング〜文書化までの工数が大きいという双方の課題が発生しています。

この問題を解決するため、
私は「スキルシート自動化ツール」を開発しました。

この記事では、

  • どんな課題から作り始めたのか

  • どんな体験をゴールに設計したのか

  • どの技術をどう役立てたか

そして、実際に発表して分かった“良かった点/ダメだった点”

をまとめます。

成功談というより、
「実際に作ったらどこが難しくて、どう改善していくべきだったか」
という教訓を共有する記事です。

1.🧰使用技術まとめ(Tech Stack)

フロントエンド : React (Vite) + TypeScript

バックエンド : Python (FastAPI)

認証 : Amazon Cognito

データベース : PostgreSQL(SQLAlchemy)

AI(生成モデル) : OpenAI GPT-4o-mini

ストレージ : Google Drive API

スプレッドシート作成 : Google Sheets API

インフラ : AWS(API・認証)+GCP(テンプレ管理)

💡技術選定の理由(ざっくり)

React + TS:状態管理の多いフォームアプリと相性が良い

FastAPI:Python × 型定義 × OpenAI の相性が最強

GPT-4o-mini:十分な日本語品質と圧倒的低コスト

Cognito:安全な認証を“実務レベル”で実装できる

PostgreSQL:過去のコンペでの使用経験と、DB管理のお手軽さから

Google Sheets API:生成したスプレッドシートが“すぐ使える”形にできる

Drive API:スキルシートの管理を一箇所に集中できる

2.🎯なぜ「スキルシート自動化ツール」を作ったのか

従来は営業担当の方などが記入し作成していたスキルシートですが、これを

誰でも書けるような自動化ツールが欲しいという形に落とし込み、工数削減を図るのが目的でした。

実際一回もスキルシートを書いていない人が面談や配属前に「スキルシートを書いてください」
と言われても、

経験が浅いほど、そもそも何を書けばいいのかわからないという問題があります。

スキルシートの作成を各エンジニアが自主的に行うことになるのですが、読み手側は

  • ある程度の粒度で案件ごとに書いてほしい
  • 既定のフォーマットで作成し、他の人のシートとも比較しやすくしてほしい

という“保証されたクオリティ”を求めています。

ここには、明らかにギャップがあります。

  • 書き手:何をどこまで書けばいいかわからない
  • 読み手:最低限ほしい情報のラインがある

このギャップを埋めるために、このツールでは

  • 入力ハードルを下げる
  • 一定以上の品質で整形されたアウトプットを自動で出す

ことをゴールにしました。

ゴールは一文でいうと、

「一回ちゃんと入力したら、あとはできるだけAIに整えてほしい」

です。

そのために、以下のような UX を意識しました。

🧭 3. 設計で意識した UX(使い勝手)

💬Q&A ウィザードで「日本語で答えるだけ」にする

案件ごとの業務内容をいきなり書いてください、と言われると難しいので、

  • 「この案件はどんな種類の仕事でしたか?」
  • 「担当していたフェーズはどこですか?(要件定義 / 開発 / テスト etc)」
  • 「主にどんな作業をしていましたか?(1〜3行でOK)」
  • 「使っていた技術・ツールは何ですか?」

といった Q&A に答えるだけで、

  • 案件名
  • 作業工程・フェーズ
  • スキルシートに載せる用の “太めな” 業務内容
  • 環境・ツールの一覧

を OpenAI で整形して自動生成するようにしました。

バックエンドでは FastAPI から GPT-4o-mini を呼び出し、
JSON Schema で project_title / phase / work_description / tools[] を返すようにしています。

🧩研修テンプレをワンクリックで挿入

社内研修でよくあるパターン(開発研修 / インフラ研修 etc)は、
「何を書けばいいか」より「どれだけ理解して自分の言葉で書けるか」が重要です。

とはいえ、土台となる雛形がないと最初の一行すら難しいので、

  • 代表的な研修パターン(開発 Lv1 / Lv2、インフラ Lv1 / Lv2)について
  • ある程度 “標準的な” 案件がワンクリックで挿入される

ようにしました。

そこから自分の経験に合わせて削ったり足したりする前提です。

📌 入社前経歴も「箇条書き → 整形」で自動化

アルバイト・インターン・前職などの「入社前の経歴」も、
そのままではスキルシートに載せにくいことが多いです。

そこで、

  • 箇条書きでラフに書いてもらう
  • 「入社前経歴整形」API に投げる
  • ◆アルバイト経験 / ◆インターン経験 のような見出し+箇条書き形式で整形する

というフローにし、「とりあえず箇条書きだけ書けば形になる」ようにしました。

📊最後に 3 行サマリーを自動生成

案件をいくつか入力したあと、

  • 「この人は結局どんな経験をしてきたのか」
  • 「どの技術が得意そうか」

が一目で分かる 3 行サマリーも GPT-4o-mini で生成しています。

  • 行頭を「・」で揃えた 3 行
  • それぞれ異なる軸(フロント / バックエンド / インフラ /ドキュメント etc)でまとめる
  • 可能な限り技術名も入れる

というルールでプロンプトを組み、
基本情報のサマリー欄にそのまま貼れるような文章を自動生成しています。

Q&A ウィザード画面↓

サマリー生成画面↓


4.🏗️技術スタック解説(実務レベルの部分)

🧪FastAPI × OpenAI(GPT-4o-mini)

backend/app/routers/ai_generate.py の一部は次のようにしています。

response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[...],
    response_format={
        "type": "json_schema",
        "json_schema": ProjectSchema,
    },
)
  • JSON Schema を使い “スキルシート向けの構造化データ” を返す

  • 誘導型プロンプトで一貫性を担保

🗄️PostgreSQL × SQLAlchemy

🔍 SQLAlchemy を採用した理由と、何をしてくれるのか

今回のアプリでは、
案件情報・スキル情報・入社前経歴などをデータベースに保存する必要があります。

そこで使ったのが SQLAlchemy(エスキューエルアルケミー) です。

🧱 SQLAlchemy ってそもそも何?

SQLAlchemy は、Python でデータベースを扱うための ORM[1]です。

ざっくり言うと:

「Pythonのクラスを書くと、それがそのまま DB のテーブルになる仕組み」
「SQL文を手で書かなくても、Python のコードでデータ操作できる」

という便利ツール。

例えるなら:

  • SQL → 手書きの詳細な料理レシピ

  • SQLAlchemy → 「材料を渡せば調理してくれるシェフ」

みたいなイメージです。

💡 SQLAlchemy を選んだ理由(本プロジェクトに合っていた点)

  • FastAPI(Pydantic)との相性が良い
    → リクエスト/レスポンスの型定義とモデルが似ているので扱いやすい。

  • JSON 型をそのまま保存できる
    → tools[] の配列や、AI の出力 JSON を無理に分解して正規化しなくてよい。

  • Python のコードだけで DB を管理できる
    → INSERT / UPDATE / SELECT を Pythonっぽく書けるので読みやすい。

  • 今後の拡張に強い
    → 案件履歴・カテゴリ・タグなど、テーブル構造が増えてもスムーズ。

📦 モデル定義はこんな感じ

class Project(Base):
    __tablename__ = "projects"

    id = Column(Integer, primary_key=True)
    user_id = Column(String, nullable=False)
    title = Column(String)
    phase = Column(String)
    description = Column(Text)
    tools = Column(JSON)
  • JSON 列で tools[] をそのまま保存

  • 過去案件の再利用も容易

  • 複数テーブルを JOIN せずに扱える構造にした

🎯 結果:今回のツールと相性が良かった

  • AI から返ってくる JSON

  • 配列・文字列・長文が混ざるデータ

  • 案件ごとの柔らかい構造

これらを “そのまま” 保存できたので、
SQLAlchemy × PostgreSQL は今回のアプリにかなりフィットしていました

📁Google Drive API(テンプレ管理)

  • Drive 上にテンプレートを置く

  • 新しく作った時にコピーしてユーザー別フォルダへ保存

  • テンプレ修正時に“影響範囲が1ファイル”で済む

📑Google Sheets API(スキルシート出力)

sheet.values().update(
    spreadsheetId=sheet_id,
    range="B10",
    valueInputOption="USER_ENTERED",
    body={"values": [[project.title]]}
).execute()
  • 行単位で案件を書き込み

  • 整形済み文章をそのまま書き込む

  • 3 行サマリーを指定セルに自動挿入

5.🌟うまくいったところ

  • Q&A 形式で書き始めのハードルを下げられた

  • 研修テンプレで“最低限のライン”を提供できた

  • AI に任せる箇所/人が判断すべき箇所を明確にできた

  • Google Sheets 出力で“そのまま提出できる”形になった

  • 初めてでも「形になるスキルシート」が作れるようになったのは大きな成果だった。

6.⚠️反省点(実際のフィードバック)

🧩 課題 1:入力項目がまだ多い

経験が浅い人にとってはまだしんどい量。

🧩 課題 2:入社前経歴が 1 ブロックで弱い

人によって差が大きく、柔軟な構造にできていない。

🧩 課題 3:AI の補完範囲が分かりにくい

どこまでが事実・どこからが AI なのか曖昧。

🧩 課題 4:過去シートの再利用が弱い

毎回同じ情報を入力する羽目になる。

🧩 課題 5:総じて“効率の悪い”UI

これが一番の問題。工数的にも時間的にも手動とさほど変わらないものになってしまいました。

7.🔧今後の改善

✔ 既存シートからコピーした時に「基本情報スキップ」

✔ 入社前経歴を複数ブロックで扱う(案件扱い)

✔ 入力内容からカテゴリ・技術一覧を自動推定

✔ 過去の案件から “似た構造” を提案

🏁おわりに

今回のツールは、

「効率の悪いものはツールとして機能しない」

という当たり前のことを、自分の手で実感できたプロジェクトでした。

それでも、

Q&A 方式で“書き始めの壁”を壊し

GPT で“整形の壁”を下げ

Sheets 出力で“完成までの壁”をなくす

という意味では、

確実に書き手の負担を減らす一歩になったと思っています。

今後はもっと、

「不要な手間を省き、工数削減と快適性を両立する自動化ツールに仕上げる」

という方向で改善していきたいです。


脚注
  1. ORM(Object Relational Mapper)。
    プログラムの中で扱う“オブジェクト”と、データベースの“テーブル・レコード”を
    自動的に対応させてくれる仕組み。
    SQL を手書きしなくても、Python のクラスやメソッドとしてデータ操作が行える。 ↩︎

ネイバーズ東京

Discussion