はじめに
近年、多くの企業で生成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を活用した人事・研修業務支援システム」
本連載で作成するシステムのソースコードは、以下のGitHubリポジトリで公開しています。ソースコードは不定期で更新します。
human-resource-ai
主な利用者
本システムでは、利用者の役割に応じて、社員管理や研修管理、AIを活用した社内情報検索などの機能を利用します。
| 権限・アカウント | 想定利用者 | 利用できる主な機能 |
|---|---|---|
admin |
システム管理者・人事管理者 | すべての機能を利用可能。社員の論理削除も可能 |
staff |
人事担当者・研修担当者 | 社員の登録・編集、研修管理、評価管理、Excel入出力 |
user |
一般ユーザー | ダッシュボード、日報登録、社内文書検索、FAQチャット |
EMP001 |
山田 太郎(社員本人) | 専用マイページ、自分の日報、社内文書検索、FAQチャット |
EMP001はuserロールですが、ユーザー名と社員番号が一致するため、ログイン時に山田太郎の社員情報と自動的に紐づきます。
完成イメージ(機能ツリー)
AI人事・研修業務支援システム
├── ログイン・認証
│ ├── ログイン・ログアウト
│ ├── 権限によるアクセス制御
│ └── 社員番号による本人識別
│
├── 社員専用マイページ
│ ├── 社員情報の確認
│ ├── 研修履歴の確認
│ ├── 最新評価・AIコメントの確認
│ └── 自分の日報の登録・確認
│
├── 社員管理
│ ├── 社員一覧
│ ├── 社員検索
│ ├── 社員登録
│ ├── 社員情報の編集
│ └── 社員の論理削除
│
├── 研修管理
│ ├── 研修一覧
│ ├── 研修登録
│ └── 研修履歴管理
│ ├── 出席率
│ ├── 理解度
│ └── 課題スコア
│
├── 日報管理
│ ├── 日報登録
│ └── 日報一覧
│
├── 評価管理
│ ├── 研修実績の平均値集計
│ ├── 総合評価スコアの自動計算
│ └── AI評価コメント生成(Dify)
│
├── Excel業務自動化
│ ├── 社員台帳のExcel・CSV取込
│ ├── 研修結果のExcel・CSV取込
│ └── 評価一覧のExcel出力
│
├── RAG社内文書検索
│ └── Dify Knowledgeに登録した社内文書の検索
│
└── FAQチャットボット
├── Dify APIによる回答生成
└── 会話履歴を利用した継続的な質問
なぜ人事・研修業務を題材にするのか
業務システム開発の学習教材として、人事・研修業務を選んだ理由は明確です。
1. 業務の種類が多い
社員管理 → CRUD(登録・参照・更新・削除)の基本
研修管理 → 複数テーブルの関連(リレーション)
Excel取込 → ファイル処理・データ変換
評価集計 → SQLiteとPythonによる平均値・総合スコア計算
AI連携 → Dify API・プロンプト設計
文書検索 → RAG・ベクトル検索
一つのシステムで、業務システム開発に必要な要素をほぼすべてカバーできます。
2. 誰でも業務イメージが持てる
「研修実績の管理」「日報の登録」「社員台帳の更新」など、実際の職場で見聞きしている業務なので、要件の理解が速いです。
3. AIとの組み合わせが自然
評価コメントの文章生成や社内規則の質問応答は、生成AIが最も得意とする用途です。
「なぜAIを使うのか」が明確なため、AI活用の意義が体感できます。
利用シーンを具体的に見てみる
実際にどのような場面でこのシステムが使われるのかを確認します。
シーン1:社員管理
利用者:人事担当者
現在の業務(Before)
Excel の社員台帳を手動で更新
→ ファイルがいくつも存在して最新版がわからない
→ 検索ができない
改善後(After)
Webシステムで社員情報を一元管理
→ 常に最新データを参照
→ 社員番号・氏名・部署をキーワードで検索
シーン2:研修管理
利用者:研修担当者
現在の業務(Before)
出席表をExcelで管理
理解度テストの結果も別Excelで管理
→ 集計作業に時間がかかる
改善後(After)
出席率・理解度・課題スコアをWebシステムで一元管理
画面からの入力に加えて、Excel・CSVファイルから研修結果を一括登録
シーン3:AI評価コメント自動生成
利用者:研修担当者
受講者ごとのデータを元に、Dify APIが評価コメントを自動生成します。
入力(システムが送るデータ):
対象者:山田太郎
理解度:85%
出席率:100%
課題スコア:95点
生成AIが出力するコメント:
研修への参加姿勢が非常に良好であり、課題スコアも高い水準です。
理解度も85%と高水準を維持しており、基礎知識の定着が確認できます。
今後はさらなる応用技術の習得と、習得した知識のチームへの共有を期待します。
担当者が1人ひとりコメントを書く作業を大幅に削減できます。
シーン4:RAG社内文書検索
利用者:一般社員
就業規則・社内マニュアルなどを自然言語で検索できます。
質問:有給休暇は何日前までに申請が必要ですか?
回答:就業規則第12条に基づき、3営業日前までに申請してください。
なお、緊急の場合は直属の上長への事前口頭報告が必要です。
社内文書の中から必要な情報を探す時間を短縮できます。
回答内容は、Dify側に登録したKnowledgeとプロンプトの設定によって変わります。
現行のFlaskコードでは、文書名やページ番号などの参照メタデータを個別には取得していません。
シーン5:社員本人のマイページ
利用者:社員・受講者
社員番号EMP001とパスワードpasswordでログインすると、山田太郎専用のマイページへ移動します。
マイページでは、次の情報を確認できます。
- 社員番号、氏名、部署、役職、入社日
- 自分の研修履歴、出席率、理解度、課題スコア
- 最新の総合評価スコアとAI評価コメント
- 最近の日報
日報画面でも、社員本人には自分の日報だけが表示されます。社員情報・研修結果・評価結果は閲覧専用で、日報のみ新規登録できます。
シーン6:FAQチャットボット
利用者:全社員
よくある質問(FAQ)をチャット形式で回答します。
Q: 年末調整の提出期限はいつですか?
A: 毎年11月末日が提出期限です。
書類は人事部からメールで送付しますので、
記入後に人事部窓口へご提出ください。
技術スタックの選定理由
| 技術 | 用途 | 選定理由 |
|---|---|---|
| Python | バックエンド全般 | 業務システム・AI両方に対応できる |
| Flask | Webフレームワーク | 軽量でシンプル。学習コストが低い |
| SQLite | データベース | インストール不要。開発開始が速い |
| pandas | データ取込・変換 | ExcelやCSVの処理が直感的に書ける |
| openpyxl | Excel読み書き | Pythonから直接Excelファイルを操作できる |
| Dify | 生成AI基盤 | APIキー1つで生成AI・RAGを両立できる |
| GitHub | ソースコード管理 | 変更履歴を管理し、ソースコードを共有できる |
FlaskとFastAPIで迷う方も多いですが、本連載ではテンプレートエンジン(Jinja2)との相性が良く、学習コストの低いFlaskを採用します。
APIサーバーとして分離する設計に慣れてきたらFastAPIへの移行も検討してください。
システムアーキテクチャ
全体構成図
レイヤー構造の説明
本システムは3層アーキテクチャで設計します。
プレゼンテーション層(Flask + Jinja2テンプレート)
↕ データの受け渡し
ビジネスロジック層(services配下のサービスモジュール)
↕ データの永続化・外部連携
データ・インフラ層(SQLite / Dify API / Excel・CSV)
| 層 | ファイル | 役割 |
|---|---|---|
| プレゼンテーション |
app.py / templates/ / static/
|
ルーティング・画面表示・フォーム受付 |
| ビジネスロジック | services/*.py |
業務ルール・処理の中心 |
| データ |
database.py / database.db
|
テーブル作成・初期データ登録・データ永続化 |
| ファイル処理 |
uploads/ / outputs/
|
取込ファイル・出力帳票の管理 |
| 外部連携 | services/dify_service.py |
AI・RAG・FAQのAPI呼び出し |
フォルダ構成
human-resource-ai/
├── app.py # Flaskアプリ本体・ルーティング
├── config.py # 設定値(DB接続先・Dify API URLなど)
├── database.py # SQLiteデータベース接続・初期化処理
├── create_admin.py # 管理者ユーザー作成用スクリプト
├── requirements.txt # 依存パッケージ一覧
├── database.db # SQLiteデータベース
├── .env.example # 環境変数の設定例(.envにリネームして使用)
├── .gitignore # Git管理対象外ファイルの設定
├── README.md # プロジェクト説明
│
├── templates/ # HTMLテンプレート(Jinja2)
│ ├── base.html # 共通レイアウト
│ ├── index.html # ダッシュボード
│ ├── login.html # ログイン画面
│ ├── employee_list.html # 社員一覧
│ ├── employee_form.html # 社員登録・編集
│ ├── employee_portal.html # 社員本人用マイページ
│ ├── training_list.html # 研修一覧
│ ├── training_form.html # 研修登録・編集
│ ├── training_history.html # 研修履歴
│ ├── evaluation.html # 評価一覧・AIコメント生成
│ ├── import.html # Excelインポート
│ ├── report.html # 日報・レポート一覧
│ ├── search.html # 社内文書検索(RAG)
│ └── chat.html # FAQチャットボット
│
├── static/ # CSS・JavaScriptなどの静的ファイル
│ ├── css/
│ │ └── style.css
│ └── js/
│ └── main.js
│
├── services/ # ビジネスロジック
│ ├── __init__.py
│ ├── auth_service.py # 認証・セッション管理
│ ├── employee_service.py # 社員管理
│ ├── employee_portal_service.py # 社員本人用データ取得
│ ├── training_service.py # 研修管理
│ ├── excel_service.py # Excel取込・出力
│ ├── report_service.py # 日報・レポート管理
│ ├── evaluation_service.py # 評価管理
│ ├── search_service.py # RAG検索
│ └── dify_service.py # Dify API / RAG連携
│
├── uploads/ # アップロードファイル保存先
│ ├── test_employee.xlsx
│ └── test_training_result.xlsx
│
└── outputs/ # 生成帳票の出力先
└── evaluation_2026-09-19.xlsx
データベース設計(概要)
詳細は第3回で扱いますが、ここで全体像を把握しておきます。
ER図(概念モデル)
テーブル一覧
| テーブル名 | 概要 |
|---|---|
employee |
社員番号、氏名、所属部署、役職、入社日など、社員の基本情報を管理する社員マスタ |
department |
人事部、開発部、営業部などの部署情報を管理する部署マスタ |
training |
研修名、実施期間、研修内容などを管理する研修マスタ |
training_enrollment |
社員と研修の受講申込を管理するためのテーブル。現行画面では未使用 |
training_history |
出席率、理解度、課題スコアなど、社員の研修受講実績を管理するテーブル |
evaluation |
社員の評価スコアと、AIが生成した評価コメントを管理するテーブル |
daily_report |
社員が作成した日報の内容や対象日を管理するテーブル |
user |
システムにログインするユーザー名、パスワード、権限を管理するテーブル |
現行実装では、departmentテーブルは初期部署データを保持していますが、
employeeテーブルのdepartment列とは外部キーで関連付けていません。
社員の所属部署は文字列として保存しています。
また、training_enrollmentテーブルは受講申込管理を想定して定義していますが、
現時点では画面やサービス処理から使用していません。
ログインユーザーと社員情報の紐づけ
現行のuserテーブルにはemployee_id列を設けていません。社員番号でログインした場合は、認証処理でuser.usernameとemployee.employee_noを照合します。
user.username = "EMP001"
↓ 一致確認
employee.employee_no = "EMP001"
↓
山田 太郎のemployee_idをセッションへ保存
↓
社員専用マイページを表示
admin、staff、userは通常のダッシュボードへ、EMP001は山田太郎専用マイページへ遷移します。
画面設計(概要)
詳細は第3回で扱います。主要画面の一覧です。
| 画面名 | URL | 主な操作 |
|---|---|---|
| ログイン | /login |
ユーザー名とパスワードを入力してログイン |
| ダッシュボード | / |
社員管理、研修管理、評価管理などの各機能へ移動 |
| 社員専用マイページ | /my-page |
本人の社員情報、研修履歴、最新評価、最近の日報を確認 |
| 社員一覧 | /employees |
社員番号・氏名・部署による検索、新規登録、編集、論理削除 |
| 社員登録 | /employees/new |
社員番号、氏名、所属部署、役職、入社日などを入力して登録 |
| 社員編集 | /employees/<employee_id>/edit |
登録済みの社員情報を編集 |
| 研修一覧 | /trainings |
登録済み研修の一覧表示、研修登録画面や研修履歴画面への移動 |
| 研修登録 | /trainings/new |
研修名、実施期間、研修内容を入力して登録 |
| 研修履歴 | /trainings/<training_id>/history |
社員ごとの出席率、理解度、レポート点数を入力・更新 |
| 評価管理 | /evaluations |
研修実績から算出した評価スコアの確認、AI評価コメントの生成 |
| Excelインポート | /import |
社員情報または研修結果を記載したExcel・CSVファイルの取り込み |
| Excelエクスポート | /export |
社員評価データをExcelファイルとしてダウンロード |
| 日報 | /reports |
日付、作業内容、所感・メモの登録と一覧表示。社員本人は自分の日報だけを表示 |
| RAG検索 | /search |
社内規則やマニュアルについて自然言語で質問・検索 |
| FAQチャット | /chat |
Dify APIを利用したチャット画面を表示 |
| FAQメッセージ送信 | /chat/send |
質問と会話IDをJSONで送信し、AIの回答を取得 |
| ログアウト | /logout |
ログインセッションを終了してログイン画面へ戻る |
本連載で扱う要素技術
Webシステム開発の基礎
まずは Flask を利用して、業務システムの基本となる CRUD(登録・参照・更新・削除) を実装します。
業務システムの多くは、次の流れで動作しています。
画面から入力
↓
データベースへ保存
↓
一覧表示
↓
編集・削除
# FlaskによるCRUDの基本形
@app.route("/employees")
@login_required
@roles_required("staff", "admin")
def employee_list():
keyword = request.args.get("keyword", "")
return render_template(
"employee_list.html",
employees=get_all_employees(keyword)
)
@app.route("/employees/new", methods=["GET", "POST"])
@login_required
@roles_required("staff", "admin")
def employee_new():
if request.method == "POST":
create_employee(request.form.to_dict())
flash("社員を登録しました", "success")
return redirect(url_for("employee_list"))
return render_template("employee_form.html", employee=None)
この部分では、「URL設計」「HTMLテンプレート」「データベース操作」「POST/Redirect/GETパターン」
といったWeb開発の基本を学びます。
社員番号ログインと専用マイページ
通常のロール認証に加えて、社員番号と同じユーザー名でログインした場合は、該当する社員情報を取得します。
def authenticate(username: str, password: str) -> dict | None:
conn = get_db()
user = conn.execute(
"""
SELECT u.*, e.id AS employee_id, e.name AS employee_name
FROM user u
LEFT JOIN employee e
ON e.employee_no = u.username AND e.is_active = 1
WHERE u.username = ?
""",
(username,),
).fetchone()
conn.close()
if user and check_password_hash(user["password"], password):
return dict(user)
return None
ログインに成功すると、employee_idとemployee_nameをセッションへ保存します。
session["user_id"] = user["id"]
session["username"] = user["username"]
session["role"] = user["role"]
session["employee_id"] = user.get("employee_id")
session["employee_name"] = user.get("employee_name")
if user.get("employee_id"):
return redirect(url_for("employee_portal"))
EMP001でログインした場合は、employee.employee_noが一致する山田太郎のemployee_idがセッションへ保存され、/my-pageへ移動します。
社員専用マイページでは、社員IDをURLやフォームから受け取らず、ログインセッションのemployee_idを使用します。これにより、別の社員IDを指定して他人の情報を表示することを防ぎます。
Excel業務自動化
実際の企業では、多くのデータがExcelで管理されています。
そのため業務システムでは、Excel → システムへ取り込みや システム → Excel出力 が頻繁に行われます。
本システムでは pandas を利用してExcelを読み込みます。
import pandas as pd
# Excel・CSVをDBにインポートする例
def import_employee_excel(file_path: str) -> tuple[int, list[str]]:
errors = []
count = 0
if file_path.lower().endswith(".csv"):
df = pd.read_csv(file_path)
else:
df = pd.read_excel(file_path)
df = df.rename(columns={
df.columns[0]: "employee_no",
df.columns[1]: "name",
df.columns[2]: "department",
df.columns[3]: "position",
df.columns[4]: "hire_date",
})
for i, row in df.iterrows():
try:
create_employee({
"employee_no": str(row.get("employee_no", "")).strip(),
"name": str(row.get("name", "")).strip(),
"department": str(row.get("department", "")).strip(),
"position": str(row.get("position", "")).strip(),
"hire_date": str(row.get("hire_date", ""))[:10],
})
count += 1
except Exception as exc:
errors.append(f"{i + 2}行目: {exc}")
return count, errors
Dify APIによる評価コメント生成
従来の業務システムはデータの保存や検索は得意ですが、「評価コメント作成」「議事録要約」「問い合わせ回答」のような文章生成はできません。
そこで生成AIを利用します。
本システムでは Dify API を経由してAIへデータを送信します。
import requests
from config import Config
def generate_evaluation_comment(
name: str,
understanding: float,
attendance: float,
submission: float
) -> str:
prompt = (
"あなたは人事評価の専門家です。以下の研修データをもとに、"
"200字以内・前向きな表現・具体的な改善点1つを含めた"
"評価コメントを作成してください。\n"
f"対象者:{name}\n"
f"理解度:{understanding}%\n"
f"出席率:{attendance}%\n"
f"課題スコア:{submission}%"
)
payload = {
"inputs": {},
"query": prompt,
"response_mode": "blocking",
"user": "human-resource-app",
}
response = requests.post(
f"{Config.DIFY_API_URL}/chat-messages",
headers={
"Authorization": f"Bearer {Config.DIFY_API_KEY}",
"Content-Type": "application/json",
},
json=payload,
timeout=30,
)
response.raise_for_status()
return response.json().get("answer", "")
送信されるデータは、「氏名」「理解度」「出席率」「課題スコア」です。
AIはそれらの数値を分析し、「研修への参加姿勢は良好であり、理解度も高い水準です。」のような評価コメントを自動生成します。
これにより、人事担当者が一人ひとりのコメントを作成する負担を大幅に軽減できます。
実際のソースコードでは、Dify APIキーが未設定の場合やAPI呼び出しに失敗した場合に、入力された数値をもとにローカルの定型コメントを生成するフォールバック処理も実装しています。
RAG社内文書検索
企業には多くの文書が存在します。
例えば、「就業規則」「社内ルール」「開発標準書」「研修資料」「FAQ」などです。
従来は「フォルダを探す」→「PDFを開く」→「該当箇所を探す」必要がありました。
本システムでは、Knowledgeを設定したDifyチャットアプリを利用します。
「有給休暇は何日前までに申請しますか?」と質問すると、AIが登録済み文書から関連箇所を検索し、「就業規則第15条により、3営業日前までに申請が必要です。」のように回答できます。
これにより、膨大な社内文書の中から必要な情報を迅速に探し出せるようになります。
def search_knowledge(question: str, top_k: int = 3) -> dict:
payload = {
"inputs": {"top_k": top_k},
"query": question,
"response_mode": "blocking",
"user": "human-resource-app",
}
response = requests.post(
f"{Config.DIFY_API_URL}/chat-messages",
headers={
"Authorization": f"Bearer {Config.DIFY_API_KEY}",
"Content-Type": "application/json",
},
json=payload,
timeout=30,
)
response.raise_for_status()
answer = response.json().get("answer", "")
if not answer:
return {"records": []}
return {
"records": [{
"title": "Dify回答",
"content": answer,
"score": 1.0,
}]
}
Knowledgeの検索処理はDify側で行います。Flaskアプリは/chat-messages APIへ質問を送信し、Difyから返された回答を画面に表示します。
開発環境のセットアップ
第2回以降で実装に入る前に、開発環境を整えておきましょう。
必要なもの
- Python 3.11 以上
- Git
- テキストエディタ(VS Code 推奨)
- Dify アカウント(無料プランで可)
※Difyアカウントをお持ちでない方は、以下から登録してください。
https://cloud.dify.ai/
Python環境のセットアップについては、以下の記事をご参照ください。
Python環境セットアップ完全ガイド【Windows / Mac / Linux対応・venv・VSCode実行まで】
インストール手順
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/aiota-jp/human-resource-ai.git
cd human-resource-ai
# 2. 仮想環境を作成・有効化(Windows PowerShell)
python -m venv .venv
.\.venv\Scripts\Activate.ps1
# 3. Pythonのパッケージ管理ツールである pip 自身を最新版に更新する
python -m pip install --upgrade pip
# 4. 依存パッケージをインストール
pip install -r requirements.txt
# 5. 環境変数ファイルを作成
# .env.example をコピーして .env を作る(中身は自分で書き換える)
Copy-Item .env.example .env
# .env を開いて DIFY_API_KEY などを自分の値に設定する
git clone 後は .git フォルダが作成され、変更履歴の管理が始まります。
チームで開発する場合は、このリポジトリをベースに各自がブランチを切って作業します。
実行手順(初回セットアップ)
初めてプロジェクトを実行する場合の手順です。
ポイント
仮想環境(.venv)の作成は初回のみ実施します。
2回目以降は、「仮想環境の有効化」から開始すれば実行できます。
(1) VS CodeのターミナルでPowerShellを選択
(2) 任意のフォルダでGitHubリポジトリをクローン
git clone https://github.com/aiota-jp/human-resource-ai.git
(3) クローンしたプロジェクトへ移動
cd .\human-resource-ai\
(4) 仮想環境を作成して有効化(初回のみ)
python -m venv .venv
.\.venv\Scripts\Activate.ps1
(5) Pythonのパッケージ管理ツールである pip 自身を最新版に更新
python -m pip install --upgrade pip
(6) 必要パッケージをインストール
pip install -r requirements.txt
必要なライブラリが自動的にインストールされます。
(7) 環境変数ファイルを作成
今回は .env.example をコピーして .env を作成します。
※環境変数の内容については、後続の記事で詳しく解説します。
Copy-Item .env.example .env
(8) Flaskアプリケーションを起動
python app.py
(9) 動作確認
ブラウザで以下のURLへアクセスします。
http://localhost:5000
ログイン画面が表示されたら、用途に応じて次のアカウントでログインしてください。
| ユーザーID | パスワード | ロール・用途 | ログイン後の画面 |
|---|---|---|---|
admin |
password |
管理者 | 管理者向けダッシュボード |
staff |
password |
人事・研修担当者 | 担当者向けダッシュボード |
user |
password |
一般ユーザー | 一般ユーザー向けダッシュボード |
EMP001 |
password |
受講者(山田 太郎) | 受講者専用ページ |
上記は学習・動作確認用の初期アカウントです。本番環境では固定パスワードを使用せず、安全なパスワードへ変更してください。
初期アカウントは、アプリケーション起動時にensure_default_users()によって作成されます。既存の同名ユーザーがある場合、パスワードやロールは上書きしません。
ログイン完了後の画面
EMP001でログインすると、通常のダッシュボードではなく「山田 太郎さんのマイページ」が表示されます。
| マイページの機能 | できること |
|---|---|
| 社員情報の確認 | 社員番号、氏名、部署、役職、入社日を確認 |
| 研修履歴の確認 | 研修名、期間、出席率、理解度、課題スコアを確認 |
| 評価結果の確認 | 最新の総合評価スコアとAIコメントを確認 |
| 日報の確認 | 自分の最近の日報を確認 |
| 日報の登録 | 自分の日報を新規登録 |
| 社内文書検索 | 就業規則やマニュアルを自然言語で検索 |
| FAQチャット | 社内FAQをチャット形式で質問 |
おわりに
第1回では、これから構築するシステムの全体像・技術スタック・アーキテクチャを整理しました。
ポイントを振り返ります。
- 題材:人事・研修業務(業務システムの要素が網羅されている)
- アーキテクチャ:3層構造(プレゼンテーション / ビジネスロジック / データ)
- AI活用:評価コメント生成(Dify API)+ 社内文書検索(RAG)
- 社員向け機能:社員番号ログイン+本人専用マイページ
- 開発プロセス:要件定義から実装・テストまでを体験
次回は**「要求定義・要件定義編」**として、実際の人事・研修業務を分析しながら、システム化するための要求定義書・要件定義書を作成していきます。
「何を作るか」が明確になれば、「どう作るか」は自然に見えてきます。
ぜひ次回もお付き合いください。
次回 : 第2回 Python × Dify × RAGで学ぶ業務システム開発入門【第2回 要求定義・要件定義編】
本連載について
本連載の各記事で実装していく内容は以下のとおりです。
| 回 | タイトル | 対応画面 | 主な内容 |
|---|---|---|---|
| 第1回 | 業務システム全体設計編 | ― | システム概要・技術選定・アーキテクチャ |
| 第2回 | 要求定義・要件定義編 | ― | 業務分析・機能要件・非機能要件 |
| 第3回 | ER図・画面設計編 | ― | テーブル設計・画面遷移図・ワイヤーフレーム |
| 第4回 | Flaskログイン機能編 | 🔐 ログイン | セッション・ハッシュ・ロール認可・社員番号ログイン |
| 第5回 | 社員管理CRUD編 | 👤 社員管理 | 一覧・検索・登録・更新・論理削除・入力制御 |
| 第6回 | 研修管理編 | 📚 研修管理 | 研修登録・LEFT JOIN・履歴一括入力・UPSERT |
| 第7回 | Excel業務自動化編 | 📥 取込 / 📤 出力 | pandas取込・openpyxl出力 |
| 第8回 | Dify API連携編 | 📊 評価管理 | API・フォールバック・生成中UI・二重送信防止 |
| 第9回 | RAG構築編 | 🔍 文書検索 | Dify Chat API・質問送信・回答表示・エラー処理 |
| 第10回 | FAQチャットボット編 | 💬 FAQチャット | 会話ID・Fetch API・生成中表示・二重送信防止 |
| 公開編 | Ubuntu VPS・Docker公開編 | 🌐 サービス公開 | Ubuntu VPS・Docker・Nginxを使った本番環境構築とWebアプリケーション公開 |










