AIエージェント設計
求人ライティングのAIエージェント構成とパイプライン
Indeed リライト
指揮者エージェントがユーザー指示を解釈し、対象を検索・確認の上、リライトまたはステータス変更を実行する
account_tree実行フロー
CSV Upload
PHASE 1 グルーピング 10 nano 並列
指揮者 コンダクター Agent Loop
確認 ユーザー承認 (リライト時)
PHASE 2 偵察 nano 並列
PHASE 3 方針決定 2 nano
PHASE 4 ライティング 5.1 + nano
PHASE 5 検査 nano 並列
PHASE 6 組み立て Code
CSV Output
alt_routeアクション分岐(指揮者が決定)
status_change即実行トリガー: 「止めて」「停止して」「一時停止して」
指揮者 → Phase 6(CSV組立のみ)
rewrite確認ありトリガー: 「リライトして」「未経験者向けにして」「キャッチコピーを攻めて」
指揮者 → 確認 → Phase 2→3→4→5→6
rewrite_and_status確認ありトリガー: 「東京はリライトして、神奈川は止めて」
指揮者 → 確認 → Phase 2→3→4→5→6(リライト+ステータス変更)
handyman指揮者のツール一覧
指揮者はLLM-in-a-loop(最大8ステップ)で動作。毎回JSONで1ツールを呼び、結果を受け取って次のステップを判断する。
search_by_area(area: string)勤務地エリアで求人を検索
例: 「神奈川」「東京」
search_by_shift(shift: string)勤務時間帯で求人を検索
例: 「夜勤」「日勤」
search_by_keyword(keyword: string, column?: string)任意のキーワードで検索(カラム指定可)
例: 「未経験」「ドライバー」
search_by_group(groupId: string)グループIDで求人を取得
例: 「G1」
decide(decision: object)最終決定を出す(action, targetRowIndices, summary)
doneタスク完了
verified確認ステップ(リライト時のみ)
ユーザーが指示を送信
例: 「東京の求人を未経験者向けにして」
指揮者が検索・判断
search_by_area("東京") → 1件ヒット(行3: ドライバー 東京都)→ decide
確認メッセージを表示
「1件をリライトします。行3: ドライバー (東京都) — 未経験者向けにリライト」
→ 「実行する」「キャンセル」ボタン
承認後に Phase 2→6 を実行
対象行のみをリライト。他の求人は変更しない
ステータス変更(「神奈川止めて」等)は確認不要で即実行。リライトのみ確認ステップを挟む。
filter_alt対象行フィルタリング
指揮者の targetRowIndices で後続フェーズの入力を絞り込む:
全8件の postings
↓ targetRowIndices = [0](東京の1件)
targetPostings = [row 0] のみ
targetGrouping = row 0 が属するグループ(メンバーもrow 0だけ)
↓
Phase 2: targetGrouping で偵察(1グループ)
Phase 3: targetGrouping で方針決定
Phase 4: targetPostings でライティング(1件だけ)
Phase 5: 検査
Phase 6: 全postings でCSV組立(差分検出はwritingResultsで判定)
Phase 6は全求人データを使ってCSVを組み立てるが、リライト結果がある行だけが「変更あり」として出力される。
sort指示の優先順位
tag数字の扱い
訴求ナノ(PHASE 1)
- - 数字を ● にマスクして渡す
- - 訴求の「型」だけ分類(待遇推し/研修推し等)
- - 年間休日120日と118日 → 同じグループ
ライティング(PHASE 4)
- - 数字はプレースホルダーで出力
- - {{salary_min}} {{annual_holidays}} {{area}} 等
- - PHASE 6でコードが実数値に置換 → 改ざんゼロ
editPhase 4: ライティングの実行パターン
1求人あたりの処理(6並列 Promise.all)
各ライターはカラム専用のシステムプロンプトを持ち、テキストのみ出力。JSON不要。
テンプレート方式(同一グループ内で類似求人)
1. 代表1件だけgpt-5.1で書く(6並列)
2. 残りはコードでテンプレ展開(LLM不使用)
3. プレースホルダーを各求人固有の値に置換
4グループ × 6呼出 = 24回 → 約24円
並列方式(求人ごとに個別リライト)
1. 全件を個別にgpt-5.1で書く(最大5求人ずつバッチ)
2. 各求人 × 6並列 = 求人数に比例
30件 × 6呼出 = 180回 → 約180円
グルーピング(初回のみ・指示前に自動実行)
bolt並列実行0.21円A 職種分類ナノ
30件の求人を職種で分類する
inputInput
- 職種名
- 仕事内容の冒頭100文字
outputOutput
- 職種グループ(甲ドライバー系、乙倉庫系、丙事務系...)
B 雇用・給与分類ナノ
雇用形態と給与で分類する
inputInput
- 雇用形態
- 給与形態
- 給与金額
outputOutput
- 条件グループ(X正社員月給20万〜、Yパート時給...)
C 資格・経験分類ナノ
資格と経験要件で分類する
inputInput
- 資格要件
- 経験要件
outputOutput
- ターゲットグループ(α要資格、β未経験OK)
D1 待遇訴求ナノ
待遇・高収入を推しているか判定
inputInput
- アピールポイント
- 給与情報(数字マスク)
outputOutput
- 該当/非該当の行リスト
D2 研修訴求ナノ
研修・未経験歓迎を推しているか判定
inputInput
- 仕事内容(数字マスク)
- アピールポイント(数字マスク)
outputOutput
- 該当/非該当の行リスト
D3 働きやすさ訴求ナノ
働きやすさを推しているか判定
inputInput
- アピールポイント(数字マスク)
- 休日情報(数字マスク)
outputOutput
- 該当/非該当の行リスト
D4 安定訴求ナノ
安定・キャリアを推しているか判定
inputInput
- アピールポイント(数字マスク)
- 仕事内容(数字マスク)
outputOutput
- 該当/非該当の行リスト
D5 勤務時間帯分類ナノ
日勤/夜勤/交替制/シフト制を分類
inputInput
- 募集要項(勤務時間・曜日)
- 職種名
outputOutput
- 時間帯グループ(日勤、夜勤、交替制、シフト制)
D6 勤務地分類ナノ
勤務地をエリアで分類する
inputInput
- 勤務地
- 勤務地の補足
- アクセス
outputOutput
- エリアグループ(新宿エリア、大阪エリア、地方工場...)
E 統合ナノ
A〜D6の結果を統合して最終グループを決定
inputInput
- A〜D6の分類結果(約700文字)
outputOutput
- 最終グループ(G1: ドライバー/正社員/要資格/研修推し/新宿 → 行1,5 ...)
コンダクターエージェント(全指示の入口)
0.02〜0.10円指揮者エージェント
ユーザー指示を解釈し、ツールで対象求人を検索・特定。リライト/ステータス変更/両方を判断。リライト時はユーザーに確認を求める
inputInput
- ユーザーの自然言語指示
- PHASE 1 グループ一覧
outputOutput
- action: rewrite / status_change / rewrite_and_status
- targetRowIndices: 対象行(検索結果ベース)
- summary: 実行内容の要約
偵察
bolt並列実行0.08円偵察ナノ
対象グループ代表1件を分析し、強み・弱み・NG・改善提案を報告する
inputInput
- 職種名
- キャッチコピー
- 仕事内容
- アピールポイント
- 求める人材
outputOutput
- 強み
- 弱み
- NGワード・ポリシー違反
- 改善提案
方針決定
0.05円会話ナノ(ルーター)
指揮者の決定と偵察結果を統合し、グループ別の解釈済み指示を生成する
inputInput
- 指揮者の決定(対象グループ・指示要約)
- PHASE 1 グループ分類結果
outputOutput
- 対象グループIDリスト
- グループ別の解釈済み指示
オーケストレーター
偵察結果と解釈済み指示を統合し、各グループのライティング方針を決定する
inputInput
- PHASE 1 グルーピング結果
- PHASE 2 偵察結果
- 会話ナノからの指示(対象グループ+要約)
outputOutput
- トーン
- 攻めポイント
- 注意点
- テンプレ方式 or 並列方式
- スキップするカラム
- グループ別の個別指示(あれば)
ライティング(1求人あたり6並列)
bolt並列実行24〜180円職種名ライター
17文字以内の職種名を生成。NGワード25個・禁止記号を回避。カラム専用のシステムプロンプトで呼出
inputInput
- 方針(トーン・攻め・カラム別指示)
- 元の求人データ全体
outputOutput
- 職種名(17文字以内)テキストのみ
キャッチコピーライター
35〜256文字のキャッチコピーを生成。最大の差別化ポイント1つを端的に訴求。カラム専用プロンプト
inputInput
- 方針(トーン・攻め・カラム別指示)
- 元の求人データ全体
outputOutput
- キャッチコピー(35〜256文字)テキストのみ
仕事内容ライター
400〜600文字の仕事内容を生成。ファーストビュー設計・スマホファースト。数字は{{placeholder}}で出力
inputInput
- 方針(トーン・攻め・カラム別指示)
- 元の求人データ全体
outputOutput
- 仕事内容(400〜600文字)テキストのみ
アピールポイントライター
箇条書き3〜5個。「特徴」ではなく「ベネフィット」で記述。数字で裏付け
inputInput
- 方針(トーン・攻め・カラム別指示)
- 元の求人データ全体
outputOutput
- アピールポイント(箇条書き3〜5個)テキストのみ
求める人材ライター
必須条件と歓迎条件を明確に分離。ハードルを下げる表現を心がける
inputInput
- 方針(トーン・攻め・カラム別指示)
- 元の求人データ全体
outputOutput
- 求める人材(必須+歓迎)テキストのみ
整形ナノ(事実系7カラム一括)
事実系7カラムを一括で読みやすく整形。内容は一切変更せず箇条書き・改行で見やすくするだけ
inputInput
- 勤務時間・曜日
- 休暇・休日
- 勤務地の補足
- アクセス
- 給与の補足
- 待遇・福利厚生
- その他
outputOutput
- 整形済み7カラム(JSON)
検査
bolt並列実行0.12円職種名チェックナノ
職種名のルール適合を検査する
inputInput
- リライト後の職種名
- NGワードリスト
outputOutput
- pass/fail
- 17文字以内か
- NGワード有無
- 禁止記号有無
仕事内容チェックナノ
仕事内容の品質を検査する
inputInput
- リライト後の仕事内容
- 元の仕事内容
outputOutput
- pass/fail
- 200文字以上か
- ファーストビュー有無
- 事実との矛盾
- 数値改ざん有無
残り3カラムチェックナノ
キャッチ・アピール・求める人材をまとめて検査
inputInput
- リライト後のキャッチコピー
- リライト後のアピールポイント
- リライト後の求める人材
- 元データ
outputOutput
- pass/fail
- 文字数チェック
- 事実との矛盾チェック
組み立て
0円CSV組み立て
全カラムを結合し、プレースホルダーを実数値に置換してIndeed CSV 65列を出力する。全求人CSV + 変更分のみCSVの2種類を生成
inputInput
- gpt-5.1の5カラム
- 整形ナノの7カラム
- 保護カラム(約50列・元データ維持)
- プレースホルダー値(salary_min, area等)
outputOutput
- 全求人CSV(65列)
- 変更分のみCSV(Indeedアップロード用)
paymentsコスト合計(30件・4グループ想定)
0.02〜0.10円
1〜8ステップ(ツール呼出回数による)
0.52円
分類10 + 偵察4 + 会話1 + 方針1 + 整形4 + 検査12
約24円
4グループ × 5カラム = 20回
約180円
30件 × 5カラム = 150回