8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

魔法にかけられて~ねぇねぇ、わたしってちゃんとできてる?@Dify~

Last updated at Posted at 2025-08-25

:pencil2:研修の後は・・・

こんにちは!小売業界で教育の仕事をしておりますAki-icmです。
みなさん研修を受講したことはありますか?
研修の後は研修アンケートや事後課題があって、「ちょっとめんどくさい」と思っているそこのあなた!!

   研修アンケートや事後課題って研修担当者にはとっても大事なんです!!

研修運営もPDCAサイクルなんです。←仕事は全部そうですよね!

私たち研修担当者はまず「研修のねらい・目的」を立てます。
研修のねらい・目的は一言でいうと・・・
研修を通じて「受講者にどうなってほしいのか」を明確にしたものです。
このねらい・目的に対してカリキュラムを組み実施します。
PDCAサイクルの Plan と Do というところです。

じゃあ、Check はどうしてるの?というと・・・
研修アンケートや事後課題から行っているのです!

事後課題は受講者が研修で学んだ成果を発揮できるように実施しているんです!!
決して研修担当者の為にやっているわけではないことをご理解くださいね:sweat_drops:

つまり、
自分が Plan(計画)を立てて Do(実施)した研修が、研修のねらい・目的を達成できているかどうかをCheck(評価)して次の研修でAction(改善)する
というPDCAサイクルで仕事をしております。

でも・・・
研修アンケートも事後課題も客観的に評価するのって難しくない!?
だって人間だもの・・・
売上や客数みたいに数値じゃないんだもん・・・
ねぇねぇ、わたしってちゃんとできてる?

ということで
Dify を使って、Check(フィードバック)してくれるWEBアプリを作ってみました!!
今回はフィードバックしやすいように研修アンケートのみでやってみます。

:clap:完成したもの

作り方

Dify のワークフローはこちら↓↓

はい!頑張りました・・・

みてここ!!

ver 4です!!
いろいろ試行錯誤してここに至るのです。
その過程は最後にお伝えするとして、各機能をお伝えしますね。

コード実行

開始ノードからアウトプットされたデータを1行ずつLLMノードに送るコードです。←AIに教えてもらいました。

# 必要なライブラリをインポート
import json
import re
import requests
import csv
from io import StringIO

# Difyが呼び出すメイン関数
def main(**kwargs) -> dict:
    """
    CSVファイルをダウンロードして1行ずつObjectに変換し、LLMに渡せる形式にする
    """
    # 1. 入力変数をkwargsから安全に取得
    input_file = kwargs.get('input_file', {})

    # input_file が文字列なら JSON に変換
    if isinstance(input_file, str):
        try:
            input_file = json.loads(input_file)
        except json.JSONDecodeError:
            return {'rows': []}

    # URL取得
    file_url = input_file.get('url', '')
    if not file_url:
        return {'rows': []}

    # 2. CSVファイルをダウンロード
    response = requests.get(file_url)
    # エンコーディング(UTF-8かShift_JISか環境次第)
    response.encoding = 'utf-8'
    csv_text = response.text

    # 3. CSVを1行ずつパース
    f = StringIO(csv_text)
    reader = csv.DictReader(f)

    rows = []
    for i, row in enumerate(reader, start=1):
        rows.append(row)

    # 4. 出力(イテレーターノードが1行ずつ展開してLLMへ渡せる)
    return {
        'rows': rows  # Array<Object>
    }

LLMノード

インプットしたデータをコンテキストに設定して、AIに各受講者のフィードバックをしてもらいます。

↑めっちゃたくさんSYSTEMに入力しちゃいました。

研修のねらい・目的やカリキュラムの構成、研修アンケートでどんな質問をしたか、どんな風にフィードバックをしてほしいかなど・・・

これ全部AIに作ってもらいました。
・架空の研修を組み立ててもらう(研修のねらい・目的、カリキュラムの構成、研修アンケートデータ)
・どんなフィードバックをしてほしいかSYSTEMに入力するプロンプト

SYSTEMのプロンプトについてはこんな感じで聞いてます↓

お返事はこんな感じ↓

コード実行2

LLMからアウトプットされたデータをCSVとして整形し、MARKDOWN TO CSV FILE に渡せる形式にするコードです。←AIに教えてもらいました。

# 必要なライブラリをインポート
import json
import re
import csv
import io

# Difyが呼び出すメイン関数
def main(**kwargs) -> dict:
    """
    LLMノードから出力されたCSV文字列を受け取り、
    途中切れや改行を含んでも安全にMarkdownテーブルに変換する。
    そのままMarkdown to CSV fileノードに渡せる形式で出力。
    """

    # 1. 入力変数をkwargsから安全に取得
    # 入力変数名: csv_file_content, 型: String
    csv_content = kwargs.get('csv_file_content', '')

    if not csv_content.strip():
        return {'markdown_table': ''}

    # 2. CSV文字列を安全に読み込む
    f = io.StringIO(csv_content)
    reader = csv.reader(f)
    rows = list(reader)

    if not rows:
        return {'markdown_table': ''}

    # 3. Markdownテーブル文字列に変換
    header = rows[0]
    md_table = '| ' + ' | '.join(header) + ' |\n'
    md_table += '| ' + ' | '.join(['---'] * len(header)) + ' |\n'

    for row in rows[1:]:
        # 各セル内の改行をスペースに置換、'|' は安全にエスケープ
        row_safe = [cell.replace('\n', ' ').replace('|', '\|') for cell in row]
        md_table += '| ' + ' | '.join(row_safe) + ' |\n'

    # 3. 出力変数: markdown_table, 型: String
    return {
        'markdown_table': md_table
    }

MARKDOWN TO CSV FILE

コード実行2から受け取ったデータをCSVにして出力します。

LLM2ノード

インプットしたデータから、AIに研修担当者へのフィードバックをしてもらいます。←これはテキストでそのままお返事されます。
なので、開始ノードから終了ノードに挟むだけ

ここにたどり着くまで長かった・・・:sob:

フィードバックアプリ@ver 1(成功)

1:Difyで「研修アンケート」(Excelデータ)をアップロード
2:AIのフィードバックをテキストで出力
勉強したものを1番シンプルに実装して、文字の羅列で出力されるものをまず作りました。

フィードバックアプリ@ver 2(失敗)

1: DifyでGoogle Spread Sheet(excelからデータを変更しました)をアップロード
2: アプリ連携でMakeを使ってフィードバック
3: フィードバックデータをGoogle Spread Sheetに追加
でやってみることにしました。

この後手順を教えてくれるのですが、ここでAIさんの素敵なアシスタントにより

1行ずつ処理するにはMakeのIteratorがいいよとのこと
↓作りました、いざ Run once!!

なんか追加されてる!!(G列)
多分出力するデータの設定間違ってるけど、なんか追加できた!
ここからどのデータを入れればよいか探せばできるかも・・・

さぁ次試してみようRun once!!

はい・・・上限でした・・・
Iterater使うとすぐ上限になるって一緒に勉強している方から聞いていたのに・・・:sob:

フィードバックアプリ@ver 3(成功)

image.png
1:1:Difyで「研修アンケート」(CSVデータ)をアップロード
2:AIのフィードバックをテキストで出力
ver 1に改良を加えて見やすいテキストで出力できるようにしました。

:pray:AIに助けられて

ver 3までのWEBアプリでAIにいっぱい助けてもらいました。
今まで生成AIをほとんど使ったことがなかったのですが、AIに教えてもらうことでやりたいことに近づくスピードが速くなりました。多分自分1人で作ったら途方もない時間がかかったと思うのですが、ここまで5時間くらいでできたと思います。(体感ですが・・・)
せっかく早くできたのだから、 もっと上を目指したい!! ということでいろいろ調べることにしました。

:pencil2:調べたこと

①Dify初心者向けの記事や動画を見る ←ここでMARKDOWN TO CSV FILE でファイル出力できることを知る
②コードが分からなかったので、コードについて初心者向けの動画をみる・・・←まったく分からなかった:sob:

調べていると・・・:dizzy:魔法の呪文に出会えたのです!!

ver 3でできたものを記事にした際に、お優しい方が教えてくれたのです!!
↑今はその記事削除しちゃってます・・・この記事に書き換えました!

DifyのコードはPythonのコードとは別物なので、AIにコードの作成をお願いする際に「魔法の呪文」を伝えるとDifyで使えるPythonコードができるのです!!

この「魔法の呪文」はお守りなので、コードが分からない方は要チェックですよ:point_up:

:dizzy:魔法にかけられて出来上がったもの「ver 4」

教えてもらった「魔法の呪文」はAIにコードを作成してもらう際に必ず入力します。
↓私はコードの知識もないし、英語も苦手なので、こんな感じにAIに聞きます。
①前のノードから出力されたもの
②この出力されたものをどのようにしたいのか
③そのためのコードを教えて(魔法の呪文)

これの繰り返しでver 4ができました!

魔法が解けた後に残ったものは・・・

一言!「AIってすごいね!!」
今回の魔法は「AIに頼りきり」でした。でも魔法が解けた後、自分は何をしたんだろう・・・何か身についたんだろうか・・・って思ってしまう自分もいました。
もちろん出来上がったものには満足しています。だけど、自分の知識がもっとあれば、もっと達成感あるんじゃないかなって感じました。
初めてのLINE bot はAIを使わずに作成したのですが、その時の達成感は私史上トップクラスの達成感でした笑←もう1回味わいたい笑

AIってすごい便利だし、可能性が無限大だと思うけど、それにかまけて自分の知識のベースアップやアップロードは怠るべからずですね!

ここまで読んでくださりありがとうございました。

以下、参考文献です。
SYSTEMに入力するプロンプト参考になりました。

You Tube でいろんな初心者向けの動画を見ました。
この方の動画は分かりやすかったし、AIへの付き合い方が勉強になりました。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?