0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

履歴書・職務経歴書をAIで生成する jtr-generator をつくった裏話 🧩📄🤖

Last updated at Posted at 2026-01-01

リポジトリはこちら👇
https://github.com/unagi/jtr-generator

「AIに履歴書・職務経歴書を作らせたら最強では?」と思って始めたんですが、“最強プロンプトを1発入れる”みたいな作りは全く役に立たない、からスタートしました 😇

結論はシンプルで、勝ち筋はここでした👇

  • LLM:ユーザー体験を生む「対話・整理・不足確認」担当 🗣️🧠
  • アプリ(scripts/schema):高速&高品質&再現性の「決定的な生成」担当 🧱⚙️✨
  • references/:検索に頼らず、会話UX(質問設計)を再現する“地図” 🗺️📚

以下、裏話です。


“最強プロンプト”が役に立たない理由 ☠️

LLMに「履歴書PDF作って」と頼むと、だいたいこうなりがちです 🤖💦

  • 遅い:その場でコーディングから始める(毎回ゼロから)🐢
  • 見た目がイマイチ:帳票の完成度が甘い(余白・揃え・文字組み)📄🥲
  • フォント品質まで気が回らない:日本語PDFの“信頼感”が落ちる 🔤⬇️
  • ブレる:毎回別実装・別レイアウトになりやすい 🎲

つまり、LLMは「文章」や「整理」は得意でも、
“帳票として美しいPDFを、安定して、速く” は苦手になりやすい。

なので、プロンプトを鍛えるよりも、LLMとアプリの境界を設計する方が勝てました 🧱🧩


解決策:LLMとアプリの境界をハッキリ引く 🧱🧩

jtr-generatorでやったのは、LLMにやらせないことを増やすこと。

ざっくり境界線(図)📐

[User]
  ↓(会話UX)
[LLM / SKILL.md]  …質問順・品質ゲート・禁止事項・推測ルール
  ↓(データ契約)
[schema + scripts] …バリデーション・フォント/レイアウト・PDF生成(決定的)
  ↓
[PDF outputs]

アプリ(scripts/schema)の仕事:高速&高品質を“事前実装”で固定する ⚙️⚡️✨

1) 「遅い」を潰す:LLMに都度コーディングさせない 🏎️

LLMに任せると毎回コーディングから始める → それが遅さの元。

なので、PDF生成は main() を呼ぶだけに寄せて、生成処理を固定しました。
LLMは「何を聞くか/何が足りないか」だけに集中できる。

  • 速い(毎回ゼロから書かない)
  • ブレない(同じ入力なら同じ出力に寄せられる)

ここがまずデカいです ⚡️


2) 「見た目イマイチ」を潰す:帳票品質をLLMに任せない 📄🧱

見た目が微妙になりやすい理由はだいたい2つで、

  • 完成度(レイアウトの詰め)
  • フォント品質(日本語の“それっぽさ”)

ここを「プロンプトで頑張る」のではなく、最初から“高品質な帳票”として実装しておく

さらに、イケてる日本語フォントを同梱して、PDFの可読性と信頼感を底上げしました 🔤✨
(環境対策というより、LLMに“見た目の完成度”を任せないための設計です)


3) 「再現性」を作る:入力はスキーマで契約する 📐✅

LLMがどう頑張っても、入力が自由すぎると壊れます。

だから入力は JSON Schema準拠を前提にして、
型・必須・日付形式などの“守るべきライン”を決めました。

ここで狙っているのは「厳格さ」ではなく、UXの安定です 😄


SKILL.mdの仕事:プロンプトじゃなく“契約書”として書く 📜🧠

SKILL.mdで意識したのは、それっぽく喋らせるより、迷わせないこと。

1) 指示の優先順位:衝突したらどうする?🚦

仕様・制約を最上位に置いて、ユーザー指示や会話のノリより優先する。
これがあると「雰囲気で破る」が起きにくいです。

2) 品質ゲート:「入力埋めゲーム禁止」🎮🚫

入力欄が埋まっていても、採用判断に必要な情報(役割・期間・規模・技術・成果)が不足していれば生成に進まない。

この“止める勇気”が、実は ユーザー体験を作ります ✨
(雑にPDFが出るより、ちゃんと聞き返してくれた方が価値がある)

3) 推測・補完のルール:捏造を仕組みで防ぐ 🧯

  • 出してない事実・数値を断言しない
  • 推測するなら根拠+生成前に確認
  • 確認できないなら「要確認」or 空欄

AIに個人情報を扱わせる以上、ここは“仕様で縛る”のが安心です 🔒


references/ の仕事:検索に頼らず、会話UX(質問設計)を再現する 🗺️📚✨

LLMにタスクを渡すと、すぐ「調べに行く」ムーブになりがちです 🤖🔎
でも運用上、検索が使えない/不安定/同時発動できないケースが普通にあります。

そこで jtr-generator では、外部検索に頼る代わりに references/ に“判断基準と質問設計”を同梱しました。

ポイントは「知識を置いた」じゃなくて、
LLMが迷わず“良い聞き方”を再現できる状態を作ったことです 🔥

✅ references/ が解決すること

  • 質問の品質を安定させる(毎回違う聞き方をしない)
  • 採用判断に必要な粒度で聞き出す(役割・期間・規模・技術・成果)
  • 会話の流れ(UX)をテンプレ化して、LLMが“ちゃんと面接官っぽく”なる
  • 検索できない環境でも同じ品質で進められる

“古い職務経歴”を最新化するとき、references が効く例 🧠📄➡️📄

たとえば「数年前時点」のPDFを入力にすると、LLMはこういう「更新のための聞き取り」に入ります 👇
(年や固有名詞は伏せています)

次のステップ:職務経歴書の最新化
アップロードされたPDFは「数年前時点」の内容なので、それ以降の職務経歴を STAR 法で構造化して聞き出します。
スキルのベストプラクティスに従い、採用判断に必要な情報を段階的に確認します。

質問セット1:直近の主要プロジェクト(時系列:新しい順)
<在籍企業>(20XX-XX〜現在)での最新職務について、以下を教えてください:

- 直近の主要プロジェクト 3〜5 件を列挙(新しい順)
  - 例:<プロジェクトA> / <プロジェクトB> / <プロジェクトC>

質問セット2:職務要約の軸(キャリアテーマ)
- 現在のあなたの肩書・部門は何ですか?(<肩書> のままですか、それとも変更されましたか)
- 20XX-XX〜現在の「一貫したテーマ」は何ですか?

質問セット3:STARで深掘り(最大インパクトの案件)
- Situation:当時、会社・部門・チームはどのような状況でしたか?
- Task:あなたが解決すべき課題・目標は何でしたか?
- Action:あなた個人が取った具体的な行動は?(技術・ツール含む)
- Result:成果は?(可能なら数値、難しければ相対比較でもOK)

これって「モデルが賢いから」だけじゃなくて、
best practices(質問の順序・粒度・深掘り軸)を references に置いておいたから再現できた、という設計上の勝ちです 🧱✨


LLMにお願いする“いいところ”:自然文でも拾って、構造に落としてくれる 🧠🗣️➡️📐

このフローの気持ちよさは、ユーザーが STARを厳密に埋めなくても回る点です 😄

  • ユーザーは自然言語で「当時こんな状況で〜、自分はこうして〜」と話す
  • LLMがそこから Situation/Task/Action/Result を抽出して整理する
  • さらに不足があれば「数値ある?」「あなた個人のActionはどこ?」みたいに追撃できる

つまり、入力はゆるくていい(自然文) のに、出力は堅くできる(構造化)
これが「LLMにお願いする価値」だと思っています 🤖✨


まとめ:AIアプリは「LLMを賢くする」より「境界を賢くする」✨🧱

  • LLMは“曖昧→構造”変換と対話UXに寄せる 🗣️
  • 正しさ・見た目・再現性はアプリ(schema+実装)に寄せる 📄⚙️
  • SKILL.mdは契約書として書く 📜
  • references/ は会話UXの設計図として同梱する 🗺️

「最強プロンプト」を目指すより、
LLMが苦手なところを“設計”で取り除く方が、だいぶ勝てました 😄🔥


出来上がりサンプル 📎✨

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?