6
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python × Dify × RAGで学ぶ業務システム開発入門【第1回 業務システム全体設計編】

6
Last updated at Posted at 2026-06-16

はじめに

近年、多くの企業で生成AIの導入が進んでいます。
Claude や ChatGPT などの生成AIを活用することで、文章作成・要約・コード生成・問い合わせ対応など、さまざまな業務を効率化できるようになりました。

しかし実際の現場で求められているのは、生成AIを単体で使うことだけではありません

具体的には次のようなニーズが増えています。

  • 社内文書をAIで検索したい(RAG)
  • ExcelデータをWebシステムと連携させたい
  • 評価コメントをAIに自動生成させたい
  • よくある質問にAIが自動回答するチャットボットを作りたい

さらに人事・研修業務では、生成AIだけでは対応できない継続的なデータ管理も必要です。

社員情報の管理
研修履歴の管理
評価結果の集計
Excel帳票の出力
権限管理
操作履歴の管理

つまり、生成AIだけでは業務システムは完結しません。
データベース・Webアプリケーション・Excel自動化・RAGを組み合わせて、はじめて実務で使えるシステムになります。

そこで本連載では、「人事・研修業務」をケーススタディとして取り上げ、以下の技術を組み合わせた業務システムを段階的に構築していきます。

技術 役割
Python / Flask Webアプリケーション本体
SQLite データの永続管理
pandas / openpyxl Excel業務の自動化
Dify 生成AI・RAGのプラットフォーム
RAG 社内文書の検索・FAQ対応

完成済みのシステムを配布するのではなく、

要求定義
  ↓
要件定義
  ↓
設計
  ↓
実装
  ↓
テスト

という実際のシステム開発プロセスを体験しながら学ぶことを目的としています。

本連載を通して、業務システム開発の基礎だけでなく、生成AIやRAGを業務に活用するための実践的な知識と技術を身につけていきましょう。

想定読者

レベル 内容
対象 Pythonの基礎文法を学んだことがある方
歓迎 Webアプリを作ったことがない方
歓迎 生成AIを業務に活かしたい方
対象外 完成したコードだけほしい方

本連載は「作って終わり」ではなく、なぜそう設計するのかを重視しています。
設計の意図を理解することで、他のシステムにも応用できる力が身につきます。

本連載で作るシステム

システム名

AI・RAGを活用した人事・研修業務支援システム

主な利用者

人事担当者   ── 社員管理・評価管理・帳票出力
研修担当者   ── 研修登録・出席管理・評価コメント生成
受講生      ── 日報提出・研修履歴確認
一般社員    ── 社内文書検索・FAQチャットボット

完成イメージ(機能ツリー)

AI人事・研修業務支援システム
├── ログイン・認証
├── 社員管理
│   ├── 社員一覧・検索
│   ├── 社員登録・更新・削除
│   └── 部署管理
├── 研修管理
│   ├── 研修一覧・登録
│   ├── 出席管理(出席率自動計算)
│   ├── 理解度管理(テストスコア)
│   └── 課題提出管理
├── 日報・週報管理
├── 評価管理
│   ├── 評価集計(pandas)
│   └── AI評価コメント自動生成(Dify)
├── Excel業務自動化
│   ├── 社員台帳Excel取込
│   ├── 研修結果Excel取込
│   └── 評価シートExcel出力
├── RAG社内文書検索
│   └── 就業規則・マニュアル・評価基準書
└── FAQチャットボット

なぜ人事・研修業務を題材にするのか

業務システム開発の学習教材として、人事・研修業務を選んだ理由は明確です。

1. 業務の種類が多い

社員管理     → CRUD(登録・参照・更新・削除)の基本
研修管理     → 複数テーブルの関連(リレーション)
Excel取込    → ファイル処理・データ変換
評価集計     → pandas による数値処理
AI連携      → Dify API・プロンプト設計
文書検索     → RAG・ベクトル検索

一つのシステムで、業務システム開発に必要な要素をほぼすべてカバーできます。

2. 誰でも業務イメージが持てる

「有給休暇の申請」「研修の出席管理」「社員台帳の更新」など、実際の職場で見聞きしている業務なので、要件の理解が速いです。

3. AIとの組み合わせが自然

評価コメントの文章生成や社内規則の質問応答は、生成AIが最も得意とする用途です。
「なぜAIを使うのか」が明確なため、AI活用の意義が体感できます。

利用シーンを具体的に見てみる

実際にどのような場面でこのシステムが使われるのかを確認します。

シーン1:社員管理

利用者:人事担当者

現在の業務(Before)
Excel の社員台帳を手動で更新
→ ファイルがいくつも存在して最新版がわからない
→ 検索ができない

改善後(After)
Webシステムで社員情報を一元管理
→ 常に最新データを参照
→ 名前・部署・入社年度で即時検索

シーン2:研修管理

利用者:研修担当者

現在の業務(Before)
出席表をExcelで管理
理解度テストの結果も別Excelで管理
→ 集計作業に時間がかかる

改善後(After)
システムに入力するだけで出席率・理解度が自動集計
Excelファイルをアップロードするだけでインポート完了

シーン3:AI評価コメント自動生成

利用者:研修担当者

受講者ごとのデータを元に、Dify APIが評価コメントを自動生成します。

入力(システムが送るデータ):

対象者:山田太郎
理解度:85%
出席率:100%
課題提出率:95%

生成AIが出力するコメント:

研修への参加姿勢が非常に良好であり、課題提出状況も優れています。
理解度も85%と高水準を維持しており、基礎知識の定着が確認できます。
今後はさらなる応用技術の習得と、習得した知識のチームへの共有を期待します。

担当者が1人ひとりコメントを書く作業を大幅に削減できます。

シーン4:RAG社内文書検索

利用者:一般社員

就業規則・社内マニュアルなどを自然言語で検索できます。

質問:有給休暇は何日前までに申請が必要ですか?

回答:就業規則第12条に基づき、3営業日前までに申請してください。
     なお、緊急の場合は直属の上長への事前口頭報告が必要です。
     (参照:就業規則 第12条 第2項)

「どの書類の何ページに書いてあるか」を探す時間がゼロになります。

シーン5:FAQチャットボット

利用者:全社員

よくある質問(FAQ)をチャット形式で回答します。

Q: 年末調整の提出期限はいつですか?
A: 毎年11月末日が提出期限です。
   書類は人事部からメールで送付しますので、
   記入後に人事部窓口へご提出ください。

技術スタックの選定理由

技術 用途 選定理由
Python バックエンド全般 業務システム・AI両方に対応できる
Flask Webフレームワーク 軽量でシンプル。学習コストが低い
SQLite データベース インストール不要。開発開始が速い
pandas データ集計・変換 ExcelやCSVの処理が直感的に書ける
openpyxl Excel読み書き Pythonから直接Excelファイルを操作できる
Dify 生成AI基盤 APIキー1つで生成AI・RAGを両立できる
GitHub チーム開発 Pull Request・コードレビューを体験できる

FlaskとFastAPIで迷う方も多いですが、本連載ではテンプレートエンジン(Jinja2)との相性が良く、学習コストの低いFlaskを採用します。
APIサーバーとして分離する設計に慣れてきたらFastAPIへの移行も検討してください。

システムアーキテクチャ

全体構成図

全体構成図.png

レイヤー構造の説明

本システムは3層アーキテクチャで設計します。

プレゼンテーション層(Flask + Jinja2テンプレート)
    ↕ データの受け渡し
ビジネスロジック層(サービスクラス)
    ↕ データの永続化・外部連携
データ・インフラ層(SQLite / Dify API / Excel)
ファイル 役割
プレゼンテーション app.py / templates/ 画面表示・フォーム受付
ビジネスロジック services/*.py 業務ルール・処理の中心
データ database.db / uploads/ 永続化・ファイル管理
外部連携 dify_service.py AI・RAG API呼び出し

フォルダ構成

human-resource-ai/
├── app.py                   # Flaskアプリ本体・ルーティング
├── config.py                # 設定値(DB接続先・Dify API URLなど)
├── requirements.txt         # 依存パッケージ一覧
├── database.db              # SQLiteデータベース(自動生成)
├── .env                     # 環境変数(APIキーなど ※Gitに含めない)
├── .gitignore
│
├── templates/               # HTMLテンプレート(Jinja2)
│   ├── base.html            # 共通レイアウト(ナビゲーション等)
│   ├── login.html           # ログイン画面
│   ├── employee_list.html   # 社員一覧
│   ├── employee_form.html   # 社員登録・編集
│   ├── training_list.html   # 研修一覧
│   ├── training_form.html   # 研修登録・編集
│   ├── evaluation.html      # 評価一覧・コメント生成
│   ├── report.html          # 評価レポート
│   └── chat.html            # FAQチャットボット
│
├── static/
│   ├── css/
│   │   └── style.css
│   └── js/
│       └── main.js
│
├── services/                # ビジネスロジック
│   ├── employee_service.py  # 社員管理ロジック
│   ├── training_service.py  # 研修管理ロジック
│   ├── excel_service.py     # Excel取込・出力
│   ├── report_service.py    # 集計・レポート生成
│   └── dify_service.py      # Dify API / RAG 連携
│
├── uploads/                 # アップロードファイル一時保存
├── outputs/                 # 生成帳票の出力先
│
└── docs/
    ├── README.md
    ├── er_diagram.png       # ER図
    └── screen_design.md     # 画面設計書

データベース設計(概要)

詳細は第3回で扱いますが、ここで全体像を把握しておきます。

ER図(概念モデル)

image.png

テーブル一覧

テーブル名 概要
employee 社員マスタ
department 部署マスタ
training 研修マスタ
training_history 研修受講履歴(出席・理解度・課題)
evaluation 評価(スコア・AIコメント)
daily_report 日報・週報
user ログインユーザー

画面設計(概要)

詳細は第3回で扱います。主要画面の一覧です。

画面名 URL 主な操作
ログイン /login ID・パスワード入力
ダッシュボード / 各機能へのナビゲーション
社員一覧 /employees 社員検索・一覧表示
社員登録・編集 /employees/new /employees/<id>/edit 社員情報の入力
研修一覧 /trainings 研修検索・一覧表示
研修履歴 /trainings/<id>/history 出席・理解度入力
評価管理 /evaluations スコア入力・AIコメント生成
Excelインポート /import ファイルアップロード
Excelエクスポート /export 帳票ダウンロード
RAG検索 /search 社内文書の自然言語検索
FAQチャット /chat チャットボット

本連載で学べること

Webシステム開発の基礎

# FlaskによるCRUDの基本形
@app.route("/employees")
def employee_list():
    employees = get_all_employees()          # データ取得
    return render_template(                  # テンプレートに渡して表示
        "employee_list.html",
        employees=employees
    )

@app.route("/employees/new", methods=["GET", "POST"])
def employee_new():
    if request.method == "POST":
        create_employee(request.form)        # DB登録
        return redirect(url_for("employee_list"))
    return render_template("employee_form.html")

Excel業務自動化

import pandas as pd

# ExcelをDBにインポートする例
def import_employee_excel(file_path: str) -> int:
    df = pd.read_excel(file_path, sheet_name="社員台帳")
    df.columns = ["employee_no", "name", "department", "position", "hire_date"]
    df["hire_date"] = pd.to_datetime(df["hire_date"]).dt.date

    count = 0
    for _, row in df.iterrows():
        create_employee(row.to_dict())
        count += 1
    return count   # 登録件数を返す

Dify APIによる評価コメント生成

import requests
import os

def generate_comment(name: str, understanding: float,
                     attendance: float, submission: float) -> str:
    prompt = f"""
あなたは人事評価の専門家です。
以下のデータをもとに、研修受講者への評価コメントを
200字以内・前向きな表現・具体的な改善点1つを含めて生成してください。

対象者:{name}
理解度:{understanding}%
出席率:{attendance}%
課題提出率:{submission}%
"""
    response = requests.post(
        "https://api.dify.ai/v1/chat-messages",
        headers={"Authorization": f"Bearer {os.getenv('DIFY_API_KEY')}"},
        json={"query": prompt, "response_mode": "blocking", "user": "hr-system"}
    )
    return response.json().get("answer", "生成に失敗しました")

RAG社内文書検索

def search_document(question: str) -> dict:
    """Dify Knowledgeで社内文書を検索する"""
    response = requests.post(
        f"https://api.dify.ai/v1/datasets/{os.getenv('DIFY_DATASET_ID')}/retrieve",
        headers={"Authorization": f"Bearer {os.getenv('DIFY_API_KEY')}"},
        json={
            "query": question,
            "retrieval_model": {
                "search_method": "semantic_similarity",
                "top_k": 3
            }
        }
    )
    return response.json()

開発環境のセットアップ

第2回以降で実装に入る前に、開発環境を整えておきましょう。

必要なもの

  • Python 3.11 以上
  • Git
  • テキストエディタ(VS Code 推奨)
  • Dify アカウント(無料プランで可)

インストール手順

セットアップは「GitHubからクローンする方法」と「自分でゼロから作る方法」の2通りあります。
状況に合わせてどちらかを選んでください。


パターンA:GitHubリポジトリからクローンする場合

git clone とは、GitHub上にあるリポジトリ(ソースコード一式)を自分のPCにまるごとコピーするコマンドです。

GitHub上のリポジトリ
  └── README.md
  └── requirements.txt
  └── .env.example      ← APIキーのテンプレートが入っている
  └── app.py(雛形)
         ↓  git clone
自分のPC(ローカル)にコピーされる

本連載では、スターターキット(雛形ファイル入り)をGitHubで公開する予定です。
フォルダ構成・requirements.txt.env.example があらかじめ用意されているので、クローン後すぐに開発を始められます。

# 1. スターターリポジトリをクローン
#    (GitHub上のリポジトリURLを指定してローカルにコピーする)
git clone https://github.com/your-org/human-resource-ai.git
cd human-resource-ai

# 2. 仮想環境を作成・有効化
python -m venv venv
source venv/bin/activate      # Mac / Linux
venv\Scripts\activate         # Windows

# 3. 依存パッケージをインストール
pip install -r requirements.txt

# 4. 環境変数ファイルを作成
#    .env.example をコピーして .env を作る(中身は自分で書き換える)
cp .env.example .env
# .env を開いて DIFY_API_KEY などを自分の値に設定する

git clone 後は .git フォルダが作成され、変更履歴の管理が始まります。
チームで開発する場合は、このリポジトリをベースに各自がブランチを切って作業します。
(詳細は第11回「GitHubチーム開発編」で解説します)


パターンB:自分でゼロから作る場合

スターターキットを使わず、一からフォルダとファイルを作りたい場合はこちらです。
「なぜこのファイルが必要なのか」を手を動かしながら理解できます。

# 1. プロジェクトフォルダを作成
mkdir human-resource-ai
cd human-resource-ai

# 2. Gitリポジトリを初期化(このフォルダでGit管理を始める)
git init

# 3. 仮想環境を作成・有効化
python -m venv venv
source venv/bin/activate      # Mac / Linux
venv\Scripts\activate         # Windows

# 4. 必要なパッケージをインストール
pip install Flask pandas openpyxl requests python-dotenv

# 5. インストール済みパッケージを requirements.txt に書き出す
pip freeze > requirements.txt

# 6. .env ファイルを作成してAPIキーを設定する
#    (ファイルの内容は後述の「.env.example」を参照)

git init は「このフォルダをGitで管理する」という宣言です。
git clone との違いは、既存リポジトリをコピーするのではなく新規に管理を始める点です。

コマンド 用途
git clone <URL> GitHub上の既存リポジトリをローカルにコピーする
git init 新しいリポジトリをローカルに作成する

どちらを選べばよいか

状況 推奨
本連載のスターターキットを使いたい パターンA(clone)
一からすべて自分で作りたい パターンB(init)
チーム開発でGitHubを使う予定がある パターンA(clone)→ 自分のGitHubにforkして使う

requirements.txt(初期版)

Flask==3.0.3
pandas==2.2.2
openpyxl==3.1.2
requests==2.32.3
python-dotenv==1.0.1
Werkzeug==3.0.3

.env.example(テンプレート)

# Flask
SECRET_KEY=your-secret-key-here
FLASK_ENV=development

# Dify
DIFY_API_KEY=your-dify-api-key
DIFY_API_URL=https://api.dify.ai/v1
DIFY_DATASET_ID=your-dataset-id

.env ファイルは絶対にGitにコミットしないでください。
.gitignore.env が含まれていることを必ず確認してください。

今後の連載予定

タイトル 主な内容
第1回 業務システム全体設計編(本記事) システム概要・技術選定・アーキテクチャ
第2回 要求定義・要件定義編 業務分析・機能要件・非機能要件
第3回 ER図・画面設計編 テーブル設計・画面遷移図・ワイヤーフレーム
第4回 Flaskログイン機能編 セッション・パスワードハッシュ・認証ミドルウェア
第5回 社員管理CRUD編 一覧・登録・更新・削除・バリデーション
第6回 研修管理編 リレーション・集計・出席率自動計算
第7回 Excel業務自動化編 pandas取込・openpyxl出力・テンプレート活用
第8回 Dify API連携編 プロンプト設計・API呼び出し・エラーハンドリング
第9回 RAG構築編 Knowledgeへの登録・Embedding・検索精度改善
第10回 FAQチャットボット編 チャットUI・会話履歴・ストリーミングレスポンス
第11回 GitHubチーム開発編 ブランチ戦略・Pull Request・コードレビュー
第12回 テスト・デモ編 pytest・テスト設計・デモ・振り返り

おわりに

第1回では、これから構築するシステムの全体像・技術スタック・アーキテクチャを整理しました。

ポイントを振り返ります。

  • 題材:人事・研修業務(業務システムの要素が網羅されている)
  • アーキテクチャ:3層構造(プレゼンテーション / ビジネスロジック / データ)
  • AI活用:評価コメント生成(Dify API)+ 社内文書検索(RAG)
  • 開発プロセス:要件定義から実装・テストまでを体験

次回は**「要求定義・要件定義編」**として、実際の人事・研修業務を分析しながら、システム化するための要求定義書・要件定義書を作成していきます。

「何を作るか」が明確になれば、「どう作るか」は自然に見えてきます。
ぜひ次回もお付き合いください。

次回 : 第2回 Python × Dify × RAGで学ぶ業務システム開発入門【第2回 要求定義・要件定義編】

参考リンク

6
8
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
6
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?