開発実績一覧へ
AI自動化・エージェント開発人材派遣・人材紹介

人材派遣会社向け AI業務自動化 SaaS

面談の録音をアップロードするだけで、文字起こしからスキルシート・推薦文の作成、CRMへの反映までを支援する。

面談の録音から文字起こし・スキルシート作成・推薦文作成・CRM連携までを自動で進める人材派遣会社向けSaaSの画面イメージ

Overview

プロジェクト概要

人材派遣会社向けに、面談の音声からスキルシートや推薦文を自動で作り、社内のCRMとの連携や求人とのマッチングまで支援する、生成AIを活用したマルチテナントSaaSを開発しました。面談の録音をアップロードするだけで、AIが文字起こしを行い、経歴・スキル・希望条件を整理したスキルシートと推薦文を作ります。契約後の定期フォロー面談の音声を要約し、早い段階での状況把握に使える仕組みも用意しました。

開発期間は2024年10月から2025年4月までの約7か月、体制はエンジニア・デザイナー・テスターの3名です。要件はお客様の事業側で整理・確定されたものを共有いただき、それをもとに、画面構成の設計から内部の仕組みの設計、実装までを当社が担当しました。デザインと動作検証を除く、設計と実装のほぼすべてを担当しています。

※ お客様との守秘義務のため、お客様名・製品名は記載していません。掲載している画面とデータは、説明用に再構成したイメージです。

分類
生成AIを活用したマルチテナントSaaSの開発
開発期間
2024年10月〜2025年4月(約7か月)
体制
3名(エンジニア1名 / デザイナー1名 / テスター1名)
利用者
人材派遣・人材紹介会社の営業担当、コーディネーター(エンジニアではない方が中心)
業種
人材派遣・人材紹介
ロール
画面構成の設計 / 内部の仕組みの設計 / データベース設計 / フロントエンド / バックエンド / 外部サービス連携(Dify・Salesforce) / 非同期処理基盤
技術
Next.js 15 / React 19 / TypeScript / Node.js / Express / MySQL / BullMQ / Redis / Dify / Salesforce / ffmpeg
導入前の課題:録音の聞き直し、面談メモの手作業での整理、スキルシート・推薦文の一からの作成、CRMへの再入力

01 — 導入前の課題

面談が終わっても、事務作業が終わらなかった

導入前は、営業担当やコーディネーターが、面談のあとに録音を何度も聞き直し、面談メモを手作業で整理していました。そこからスキルシートと推薦文を一から作り、さらに同じ情報をCRMへ入力し直す必要がありました。時間がかかるうえに、書類の品質は担当者ごとにばらついていました。

  • 録音を何度も聞き直して内容を確認
  • 面談メモを手作業で整理
  • スキルシート・推薦文を一から作成
  • 同じ情報をCRMへ入力し直す
面談録音のアップロード画面イメージ:処理の進行状況と、抽出された氏名・経歴・保有スキル・希望条件が表示されている

02 — 録音のアップロードと文字起こし

録音をアップロードするだけで、面談内容が整理される

担当者は、面談の録音ファイルを画面にドラッグ&ドロップするだけです。アップロードが終わると、「音声を確認 → 文字起こし → 情報を整理」の進み具合が画面に表示され、氏名・経験職種・経歴・保有スキル・希望条件が項目ごとに整理されます。要約・文字起こし・キーワードは、タブで切り替えて確認できます。音声はMP3に変換したうえで分割し、既定で最大10並列で文字起こしします。

  • 録音ファイルをドラッグ&ドロップでアップロード
  • 処理の進み具合を、ステップごとに画面で確認
  • 経歴・スキル・希望条件を項目別に自動で整理
  • 分割した音声を並列に文字起こしし、失敗時は再試行

開発中の課題と解決

長い音声を、文の途中で切らずに分割する

課題
面談の録音は長時間になることがあり、外部の音声認識には一度に送れる長さの制限がありました。一定の時間で単純に区切ると、文の途中で音声が切れ、文字起こしの精度が落ちます。
解決
無音の区間を検出して、自然な区切りで分割する仕組みを実装しました。無音の区間が見つからない場合は時間による分割に、それも難しい場合はさらに単純な分割に切り替える、3段階の安全策を用意しています。成功した割合が既定の基準(80%)を下回った場合は、品質に問題があると判定します。
候補者情報とスキルシート・推薦文のプレビューが並び、修正ボタンと確認済みボタンが表示された画面イメージ

03 — スキルシート・推薦文の自動作成

面談内容から提出書類まで。担当者は確認・修正するだけ

整理された面談内容をもとに、AIがスキルシートと推薦文を自動で作ります。画面の左に候補者情報、右にスキルシートと推薦文のプレビューが並び、担当者は内容を確認して、必要なら修正してから「確認済み」にします。AIが作った書類には誤りが含まれる可能性があるため、自動で確定・送信せず、人が確認してから反映する設計にしました。書類はPDFで出力でき、まとめてZIPでダウンロードできます。

  • スキルシートと推薦文を自動で作成
  • 担当者が確認・修正してから確定する
  • 文字起こし・スキルシート・帳票をPDFで出力
  • AIの処理はDifyの3つの独立したワークフローで構成

開発中の課題と解決

数分かかるAI処理の途中で障害が起きると、ジョブが止まったまま残る

課題
音声のAI処理は数分単位でかかります。その途中で処理プログラムが落ちたり外部APIが詰まったりすると、ジョブが「処理中」のまま止まってしまいました。キューに載せるだけでは、中途半端な状態のジョブが残り続けます。
解決
Redisのジョブキューに加えて、データベース側でジョブの生存確認を一定間隔(既定30秒)で記録する仕組みを作りました。応答が一定時間(既定5分)途絶えたジョブや、想定時間(既定30分)を超えたジョブを定期的な見回りで見つけ、再試行回数の上限の中で自動的にやり直します。変換・分割・文字起こし・AI生成・保存のステップごとに監査ログを持たせ、どの段階で止まったかをすぐ特定できます。
候補者情報の反映、求人候補の提案、定期フォロー面談の要約が並んだ画面イメージ

04 — CRM連携・求人提案・フォロー

面談の情報を、その先の仕事まで活かす

確認済みの候補者情報は、Salesforceへ同期できます。同期は自社システムからSalesforceへの一方向で、項目の対応付けは会社ごとに設定できます。あわせて、候補者に合う求人の提案を支援し、契約後の定期フォロー面談の音声も要約します。フォロー面談の記録はSalesforceの予定として作成・更新され、現在の業務状況や困っていることを早い段階で把握できます。複数の派遣会社が同じ基盤を使うため、会社ごとのデータは行の単位で分けています。

  • Salesforceへの一方向の同期(項目の対応付けは会社ごとに設定)
  • 候補者に合う求人の提案を支援
  • 契約後のフォロー面談を要約して定着を支援
  • 複数の派遣会社が使えるマルチテナント構成

開発中の課題と解決

Salesforceとの同期で、営業担当者のメモを消さずに反映する

課題
スキルシートの内容をSalesforceに同期する際、営業担当者が書き込んだメモをAIが生成した内容で上書きすると、大事な営業情報が失われます。
解決
Salesforce側の1つの項目の中に、AIが生成した情報と営業担当者のメモを区画に分けて持たせました。AI側はAI用の区画だけを更新し、営業担当者のメモはそのまま残します。データが消える危険が特に高い部分なので、このデータの統合と変換の処理に、自動テストを重点的に用意しています。

Scope

担当範囲

要件はお客様の事業側で整理・確定されたものを共有いただきました。ここでいう画面構成の設計は、どの画面にどの情報と操作を置くかという構造面の設計です。見た目のデザインは専任のデザイナーが担当しました。

工程担当
要件の整理・確定お客様の事業側
画面構成の設計(情報と操作の配置)当社
内部の仕組みの設計当社
データベース設計当社
フロントエンド開発当社
バックエンド開発当社
Dify・Salesforceとの連携当社
非同期処理基盤の設計・実装当社
見た目のデザインデザイナー
動作検証(テスト)テスター

デザインと動作検証を除く、設計と実装のほぼすべてを担当しています。

Architecture

使用技術・システム構成

フロントエンド
Next.js 15(App Router) / React 19 / TypeScript / Tailwind CSS。大きな状態管理ライブラリは使わず、Reactの標準機能と軽量なサービス層で構成
バックエンド
Node.js(ESM) / Express 4
データベース
MySQL(mysql2)。ORMを使わずSQLを直接書き、実行内容と性能を細かく制御
マルチテナント
company_id 列による行レベルの分離。認証で得たJWTから解決した company_id による、サーバー側のSQLフィルタで制御
音声処理
ffmpegでMP3に変換し、無音区間の検出 → 時間 → 単純な分割の3段階で切り替え。既定で最大10並列に文字起こし
AI処理
AIワークフロー基盤 Dify。文字起こし用、スキルシート・推薦文生成用、フォロー面談要約用の3つの独立したワークフロー
非同期処理
BullMQ+ioredis(Redis)のジョブキュー / データベース側の生存確認(ハートビート) / 処理ステップごとの監査ログ
CRM連携
Salesforce。自社システムからの一方向の同期。会社ごとに設定できる項目の対応付け
PDF生成
pdfkit+日本語フォント(Noto Sans JP)の埋め込み / archiverによるZIPダウンロード
認証・セキュリティ
JWT / bcrypt / 招待制の登録 / AES-256-GCMによる認証情報の暗号化 / 3段階の権限

主な技術の選定理由

AI処理をDifyに任せる

プロンプトやAIの処理の流れの調整を、プログラムを入れ替えずに行えるようにするためです。会社ごとにフォロー面談の要約プロンプトを変えられる仕組みも、この上に作りました。

BullMQ+Redisに加えて、自前の生存確認

キューだけでは「処理中のまま止まる」ジョブが出るためです。データベース側の生存確認と自動の復旧で、障害があっても回復できる設計にしました。

company_id による行レベルの分離

複数の派遣会社が使うSaaSとして、運用を単純に保ちながら、確実にデータを分けるためです。

キャッシュをプロセス内メモリに限定

呼び出しに時間がかかり更新の少ないSalesforceの項目情報の取得にだけ使い、更新の多い一覧・詳細の画面ではあえて使わない、という使い分けをしました。

Next.js+React+TypeScript

型を効かせることで、画面の実装ミスに早く気づけるようにするためです。デザイナーが作った画面を、部品単位で確実に実装するのに合っています。

Process

開発の進め方

  1. 1

    3名の少人数のチームで、口頭やチャットでこまめに認識を合わせながら進めました。

  2. 2

    当社が実装した内容を、専任のテスターが動作検証したうえで、お客様のリポジトリに反映しました。

  3. 3

    Claude Codeなどの生成AIツールを、コードの生成・調査・テストコード作成の補助に使いました。出力はそのまま取り込まず、内容を確認し、修正したうえで使っています。

Quality & Security

品質・セキュリティ・運用

登録の制限

新規登録は招待制です。招待用のトークンは32バイトのランダムな値を発行し、データベースにはSHA-256でハッシュ化した値だけを保存します。有効期限は既定7日で、使用済みかどうかも記録します。

ログイン情報の保護

パスワードはbcryptでハッシュ化して保存します。JWTの署名鍵は起動時に長さと存在を確認し、不十分な場合はサーバーの起動自体を失敗させます。30分操作がないと自動でログアウトし、5分前に警告を出します。

外部サービスの認証情報

Salesforceの認証情報はAES-256-GCMで暗号化してデータベースに保存し、画面には末尾だけを表示します。

会社間のデータ分離

URL上の会社名は表示のためのもので、権限の判定には使いません。権限の判定は必ずサーバー側で、JWTから解決した company_id によるSQLフィルタで行います。

人による確認

AIが作ったスキルシートや推薦文は、自動で確定・送信しません。担当者が内容を確認してからSalesforceに反映する運用を想定した設計です。

テストと障害時の追跡

データが消える危険が最も高い、Salesforce連携のデータの統合・変換の処理に絞って自動テストを用意しました。処理ステップごとの監査ログで止まった段階を特定でき、取り残されたジョブを検出・報告する復旧用プログラムも用意しています。

Results

成果

面談の録音をアップロードするだけで、文字起こしからスキルシート・推薦文の作成、CRMへの反映までを支援し、障害が起きても自動で回復できる基盤として構築しました。

  • 文字起こし、スキルシート・推薦文の生成、フォロー面談の要約という、性質の違う3つの処理を、それぞれ独立したAIワークフローとして構成しました。
  • Salesforceへの同期を、既存の営業メモを壊さない安全な一方向の連携として実装しました。
  • 複数の人材派遣会社が同じ基盤を同時に使える、マルチテナント構成を実現しました。

FAQ

技術面のよくあるご質問

Q. なぜAIの処理を外部の基盤(Dify)に任せたのですか?
プロンプトやAIの処理の流れの調整を、プログラムを入れ替えずに行えるようにするためです。3つの独立したワークフローを使い分けており、フォロー面談の要約プロンプトは会社ごとに変えられます。
Q. ジョブキューだけでは足りなかった理由は?
処理プログラムが落ちたジョブが「処理中」のまま残るためです。データベース側の生存確認と定期的な見回りで、止まったジョブを自動で見つけてやり直します。
Q. 会社ごとのデータはどう分けていますか?
URL上の会社名は表示用で、権限の判定には使っていません。JWTから解決した company_id によるサーバー側のSQLフィルタで、行の単位で分けています。
Q. Salesforce連携の安全性は?
認証情報はAES-256-GCMで暗号化して保存し、画面には末尾だけを表示します。同期は自社システムからSalesforceへの一方向だけです。
Q. 営業担当者のメモは消えませんか?
1つの項目の中でAIの情報と営業担当者のメモを区画に分け、AI側はAI用の区画だけを書き換えます。この処理には自動テストを重点的に用意しています。

Tech Stack

Next.js 15React 19TypeScriptNode.jsExpressMySQLBullMQ / RedisDifySalesforceffmpeg

Contact

まだ要件が固まっていなくても大丈夫です。

業務内容や課題を整理しながら、実現方法・開発範囲・進め方をご提案します。 まずはお気軽にご相談ください。