書籍概要

生成AIアプリ開発大全
――Difyの探求と実践活用

著者
発売日
更新日

概要

Chat GPTをはじめとした生成AIサービスが躍進しています。Gemini,ClaudeやAzure OpenAI,Llamaなど生成AIのサービスは日々能力が向上し,さまざまなビジネスシーンですでに活用されています。本書で解説するDIfy(ディファイ)とは,各種生成AIを使用してアプリケーション開発ができるプラットフォームです。しかもオープンソースで利用可能です。Webサービス版Difyではすぐに自分が使いたいアプリを作ることができます。さらにDockerを使用すれば,個人や自社の環境で開発ができるようになります。本書はアプリを作りながらさまざまな視点からDIfyの活用方法の解説をします。例を挙げるとAIチャットボット,RAG(Retrieval-Augmented Generation),エージェント,ワークフロー,ノードの活用,各種ツールやAPIの使い方,チャットフローの作り方まで詳しくフルカラーで説明します。最終的にはDockerで完全クローズドなシステムを構築するまで完全解説します。Difyは作りたいアプリをノーコード・ローコードで実現できます。その威力と影響力に刮目するでしょう。生成AIの可能性にITエンジニアは興奮が止まらないかもしれません。500ページを超えるボリュームで全方位から詳しく解説します!

こんな方におすすめ

  • 生成AIを利用してアプリケーション開発をしてみたいITエンジニア
  • 生成AIの可能性を調査している方,またはこれから活用してみたい方
  • 各種生成AIでアプリケーション開発できるDIfyの機能を知りたい方

本書の補足情報

筆者による「生成AIアプリ開発大全」サポートページ
https://nova-join-5c4.notion.site/AI-1a1b1102fb3380b48d8df6fa1c62da0c

サンプル

samplesamplesamplesamplesample

目次

第1章 生成AIの理解と活用

1.1 生成AIの回答の仕組みとユーザーアプリケーション

1.2 Difyの役割と課題ドリブン開発

  • 1.2.1 Difyの登場
  • 1.2.2 なにを作りたいのか?
  • 1.2.3 人間とAIの新しい協業
  • 1.2.4 Difyで始める課題ドリブン開発

1.3 Difyとはどのようなものか?

  • 1.3.1 オープンソースの利点
  • 1.3.2 ノーコード,ローコード開発の魅力
  • 1.3.3 APIとして呼び出しが可能
  • 1.3.4 ローカル環境で動く安心感
  • 1.3.5 正直,ここが物足りないDify

第2章 チャットボットの作成

2.1 さっそくDifyを使ってみる

  • 2.1.1 Difyの始め方:クラウド版とコミュニティ版
  • 2.1.2 Difyアカウントの作成
  • 2.1.3 最初のアプリケーション作成
  • 2.1.4 アプリケーションのテスト
  • 2.1.5 アプリケーションの公開
  • 2.1.6 チャットボットWebアプリケーションの共有
  • 2.1.7 次のステップへ

2.2 LLMのモデルの登録

  • 2.2.1 デフォルトモデルを確認してみよう
  • 2.2.2 他のLLMを使いたい
  • 2.2.3 API料金について
  • 2.2.4 Geminiを使えるようにしてみよう
  • 2.2.5 Geminiモデルでテストする

2.3 LLMパラメータの調整

  • 2.3.1 パラメータ設定の基本
  • 2.3.2 パラメータの違いを体験してみよう
  • 2.3.3 LLMパラメータの仕組みを理解しよう
  • 2.3.4 Temperature:創造性温度調整
  • 2.3.5 TopP:選択肢の絞り込み
  • 2.3.6 2つのパラメータの関連
  • 2.3.7 実践:用途に応じた設定

2.4 プロンプトを考える

  • 2.4.1 プロンプトの重要性
  • 2.4.2 システムプロンプトとユーザープロンプト
  • 2.4.3 Zero-Shot LearningとFew-Shot Learning
  • 2.4.4 Zero-ShotLearning
  • 2.4.5 Few-ShotLearning
  • 2.4.6 CoTで問題を解いてみる
  • 2.4.7 まとめ

2.5 Webページにチャットボットを埋め込む

  • 2.5.1 さあ埋め込んでみよう!
  • 2.5.2 こんなに簡単でいいの?

2.6 履歴の確認と監視について

  • 2.6.1 ログの確認方法
  • 2.6.2 ログの重要性
  • 2.6.3 チャットボットの監視
  • 2.6.4 監視とログ,その真価

第3章 RAGを使いこなす

3.1 RAGとは何か?

  • 3.1.1 4つのステップで理解するRAG
  • 3.1.2 類似度検索を理解しておこう
  • 3.1.3 RAGのすごいところ
  • 3.1.4 RAGをDifyで構築する

3.2 ナレッジの構築

  • 3.2.1 ナレッジベースを作成してみよう
  • 3.2.2 テキストの前処理とクリーニング
  • 3.2.3 インデックスモードと埋め込みモデルの選択
  • 3.2.4 検索設定
  • 3.2.5 ちゃんと検索できるかテストしてみる

3.3 チャットボットでRAGを行ってみる

  • 3.3.1 新規アプリの作成
  • 3.3.2 プロンプトとコンテキストの設定
  • 3.3.3 モデルの選択
  • 3.3.4 デバッグとプレビュー
  • 3.3.5 実際にチャットしてみる

3.4 RAGのポイントは入力データにあり

  • 3.4.1 データの下ごしらえ
  • 3.4.2 なぜ分割(チャンク)が大事なの?
  • 3.4.3 データの整え方
  • 3.4.4 文学作品をAIに読ませる
  • 3.4.5 PDFからの単純な変換の罠
  • 3.4.6 「テキストのパラグラフ化手法」の登場
  • 3.4.7 パラグラフ化の効果
  • 3.4.8 出力結果を統合してベクトル化
  • 3.4.9 きれいに並んだデータの威力
  • 3.4.10 まずはここから始めよう

3.5 ハイブリッド検索について

  • 3.5.1 リランクで検索結果をもう一段階磨く
  • 3.5.2 Cohereのモデルを使うには?
  • 3.5.3 ハイブリッド検索でさらに網羅的に

第4章 エージェントの作成

4.1 エージェントとは

  • 4.1.1 なぜAIエージェントの時代と言われるのか
  • 4.1.2 AIエージェントの簡単なしくみ
  • 4.1.3 AIエージェントを構築するには

4.2 DifyでAIエージェントを作る

  • 4.2.1 エージェントの選択と作成
  • 4.2.2 コンテキストを登録
  • 4.2.3 ツールを登録
  • 4.2.4 「手順」にプロンプトを書く
  • 4.2.5 個別のツールが機能するか会話でテストする
  • 4.2.6 まとめ

4.3 ツールの連携の実例

  • 4.3.1 時間と情報検索の連携
  • 4.3.2 Web検索と計算の連携
  • 4.3.3 ナレッジと計算の連携
  • 4.3.4 まとめ

4.4 マルチモーダル対応の実例

  • 4.4.1 マルチモーダルの可能性
  • 4.4.2 エージェントの設定
  • 4.4.3 画像を読んで質問をする
  • 4.4.4 PDFファイルを読み要約してもらう
  • 4.4.5 まとめ

第5章 ワークフローの作成

5.1 AIアプリ開発の基本技術

  • 5.1.1 通常のワークフローとAIワークフローの違い
  • 5.1.2 Difyを使ったワークフローはどんなものか

5.2 さっそく作ってみよう

  • 5.2.1 ワークフローの新規作成
  • 5.2.2 「開始」ノードの設定
  • 5.2.3 LLMノードの追加
  • 5.2.4 LLMノードの設定項目
  • 5.2.5 テスト実行
  • 5.2.6 「終了」ノードをつなぐ
  • 5.2.7 ワークフローを公開する

5.3 ワークフロー公開の2つのモード

  • 5.3.1 アプリを実行
  • 5.3.2 バッチでアプリを実行

5.4 知識をつなげて統合する

  • 5.4.1 社内相談窓口というユースケース
  • 5.4.2 知識取得ノードをつなげる
  • 5.4.3 総務担当者ノードを追加
  • 5.4.4 責任者ノードを追加
  • 5.4.5 実行例:上司のパワハラ相談

5.5 議事録を作成する

  • 5.5.1 まずは簡単な議事録を作成
  • 5.5.2 もっと詳細にまとめるように改造する
  • 5.5.3 この方法のポイント

5.6 DSLのエクスポートとインポート

  • 5.6.1 DSLのエクスポート
  • 5.6.2 DSLのインポート
  • 5.6.3 DSLエクスポートの別の方法
  • 5.6.4 実践的なアドバイス:DSLの効果的な活用法

第6章 各種ノードの型

6.1 壱ノ型=開始-終了:アルファでありオメガである

  • 6.1.1 ノードとは何か?
  • 6.1.2 すべての始まりは「開始」から
  • 6.1.3 [開始]-[終了]は最も基本な組み合わせ
  • 6.1.4 この中で何が起こっているのか
  • 6.1.5 入力フィールドの設定を理解しよう
  • 6.1.6 複数の入力フィールドの設定
  • 6.1.7 出力変数も複数指定OK! でも少し注意が必要

6.2 弐ノ型=開始-LLM-終了:究極の型

  • 6.2.1 なぜ「究極」なのか
  • 6.2.2 LLMの追加
  • 6.2.3 変数はいたるところで設定できる
  • 6.2.4 この型の真の力
  • 6.2.5 CoTをLLMノードで実装するヒント

6.3 参ノ型=条件分岐:条件によって処理を分ける

  • 6.3.1 単純な条件分岐IF/ELSE
  • 6.3.2 各分岐にLLMをつなげて設定する
  • 6.3.3 終了ノードの追加
  • 6.3.4 実行してみる
  • 6.3.5 ELIFについて
  • 6.3.6 質問分類器で自動振り分け
  • 6.3.7 質問分類器の設定

6.4 四ノ型=知識取得:RAGで知識を得る

  • 6.4.1 なぜワークフローでRAGなのか
  • 6.4.2 開始ノード設定
  • 6.4.3 知識取得ノードの追加と設定
  • 6.4.4 LLMノードの追加
  • 6.4.5 終了ノードにつなげる
  • 6.4.6 ワークフローでのRAGの応用

6.5 伍の型=変数を取り出す:パラメータ抽出

  • 6.5.1 パラメータ抽出とは?
  • 6.5.2 実際に作ってみよう
  • 6.5.3 パラメータ抽出のパターン集
  • 6.5.4 シンプルな配列パターンの例
  • 6.5.5 パラメータ抽出の真価

6.6 六ノ型=繰返し処理:イテレータで回す

  • 6.6.1 最も簡単な繰り返し処理をつくる(果物カラーガイド)
  • 6.6.2 テストしてみる

6.7 七ノ型=定型文の処理:テンプレートはどう使うのか

  • 6.7.1 繰り返し処理を行ったあとはどうする?
  • 6.7.2 テンプレートはもっとすごい
  • 6.7.3 テンプレートの基本
  • 6.7.4 もう少し複雑なテンプレート
  • 6.7.5 入力処理でのテンプレート活用
  • 6.7.6 テンプレートの型の本質
  • 6.7.7 テンプレートを使いこなすコツ

6.8 八ノ型=コード実行:ラストワンマイルの切り札

  • 6.8.1 コードノード,使ってみよう
  • 6.8.2 いろいろなサンプル
  • 6.8.3 httpxでAPIを呼ぶ

6.9 九ノ型=API召喚術:HTTPリクエストノードでAPI連携

  • 6.9.1 なぜHTTPリクエストノードを使うの?
  • 6.9.2 地名から緯度経度を取得する例をつくろう
  • 6.9.3 実行してレスポンスを確認しよう
  • 6.9.4 データを抽出・整形する(コードノード)
  • 6.9.5 再び実行してみる

6.10 拾ノ型=パラレル実行:ノードを同時に実行する

  • 6.10.1 パラレル実行の基本の型
  • 6.10.2 実際にやってみよう
  • 6.10.3 終了ノード以外でパラレル実行の結果を受ける
  • 6.10.4 注意点やコツなど
  • 6.10.5 活用例をいくつか
  • 6.10.6 まとめ

6.11 拾壱ノ型=ファイル処理:あらゆるファイルを読むこと

  • 6.11.1 ドキュメントを読み込み要約する
  • 6.11.2 ワークフローの作成
  • 6.11.3 画像ファイルを読み,解説してもらう
  • 6.11.4 音声ファイルを読んで文字起こし
  • 6.11.5 リスト処理で振り分けて処理する

6.12 拾弐ノ型=構造化出力:非構造データを構造化する

  • 6.12.1 テキストから構造化出力
  • 6.12.2 画像から構造化出力(名刺リーダーのユースケース)

6.13 まとめ:十二の型,その先にある無限の可能性

第7章 各種ツールの使い方

7.1 エージェントとワークフローでのツールの扱いの違い

  • 7.1.1 エージェントとワークフローとでは使い方が異なる
  • 7.1.2 エージェントで作ってみてからワークフローで使う

7.2 Webブラウジングをつくる

  • 7.2.1 エージェントでつくる
  • 7.2.2 ワークフローでつくる
  • 7.2.3 まとめと実践的なポイント

7.3 コードインタプリターをつくる

  • 7.3.1 エージェントでつくる
  • 7.3.2 実行をして確認
  • 7.3.3 ワークフローで実現(パラメータ抽出を使う場合)
  • 7.3.4 結果をテンプレートでまとめて実行まで
  • 7.3.5 ワークフローで実現(構造化出力を使う場合)
  • 7.3.6 まとめ:CodeInterpreterの2つの実現方法

7.4 ワークフローをツールとして組み込む

  • 7.4.1 なぜワークフローをツール化するとよいのか
  • 7.4.2 ワークフローをツールとして保存する
  • 7.4.3 ツールを使ってみる
  • 7.4.4 ツールの設定と実行
  • 7.4.5 実行してみよう
  • 7.4.6 なぜこれがすごいのか

7.5 カスタムツールの作成

  • 7.5.1 カスタムツールの正体
  • 7.5.2 GitHubAPIで試してみよう
  • 7.5.3 カスタムツールの設定
  • 7.5.4 テストボタンで動作確認
  • 7.5.5 ちょっとした疑問=レスポンスの制御について
  • 7.5.6 OpenAPI(swagger)仕様で最も重要な部分はどこか

7.6 まとめ:創造のための三つの極意

  • 7.6.1 極意その一:型で基礎を固める
  • 7.6.2 極意その二:ツールで可能性を広げる
  • 7.6.3 極意その三:手法を使い分ける
  • 7.6.4 創造への扉が開かれた

第8章 チャットフローの作成

8.1 チャットフローを理解する

  • 8.1.1 なぜ最後にチャットフローなのか
  • 8.1.2 チャットフローの特徴
  • 8.1.3 チャットフローの実践的な活用
  • 8.1.4 チャットフローの発展性

8.2 チャットフローを作ってみよう

  • 8.2.1 最も簡単なQ&Aボットから始める
  • 8.2.2 実行してみる
  • 8.2.3 もう少し賢くしてみよう
  • 8.2.4 実行してみよう
  • 8.2.5 知識を使って賢くする
  • 8.2.6 実行してみる

8.3 マルチモーダルに対応してみよう

  • 8.3.1 マルチモーダルの可能性
  • 8.3.2 マルチモーダルチャットフローの仕組み
  • 8.3.3 チャットフローを作成する
  • 8.3.4 画像をアップロードできる設定をする
  • 8.3.5 実行してテストする
  • 8.3.6 ドキュメント処理ルートの実装
  • 8.3.7 ドキュメントの読み込みに対応する
  • 8.3.8 実行してテストする
  • 8.3.9 実用的な使用例を考える

8.4 任意に会話を記憶できる会話変数と変数代入

  • 8.4.1 なぜ会話変数が必要なの?
  • 8.4.2 会話変数とは?
  • 8.4.3 変数代入で記憶を保存する
  • 8.4.4 変数代入ノードの追加
  • 8.4.5 実行してみよう
  • 8.4.6 会話変数のさまざまな応用
  • 8.4.7 注意点
  • 8.4.8 まとめ

第9章 APIとしての活用を探る

9.1 APIで自由を手にいれる

  • 9.1.1 DifyはBaaSでもある
  • 9.1.2 APIで広がる可能性

9.2 DifyAPIとしてアクセスする

  • 9.2.1 まずはシンプルなアプリを作る
  • 9.2.2 APIキーを取得する
  • 9.2.3 APIを呼び出してみよう(cURLを使う)
  • 9.2.4 コマンドの説明
  • 9.2.5 どんな動きをしているのか
  • 9.2.6 Pythonでプログラミングをしてみよう
  • 9.2.7 APIを呼び出すプログラムを書いてみよう
  • 9.2.8 もう少し実用的なプログラムに
  • 9.2.9 WebUIで試してみる
  • 9.2.10 ワークフローのAPIについてのまとめ

9.3 チャットボットAPIを使うには

  • 9.3.1 基本的なチャットボット
  • 9.3.2 APIキーを取得する
  • 9.3.3 APIを動かしてみる
  • 9.3.4 Python+Gradioでチャットボットを作る

9.4 ストリーミングに対応する

  • 9.4.1 ストリーミングとは?
  • 9.4.2 さっそく試してみよう
  • 9.4.3 Pythonでプログラミング
  • 9.4.4 プログラムの説明

9.5 エージェントに対応する

  • 9.5.1 エージェントに対応するには
  • 9.5.2 エージェントのAPIを取得する
  • 9.5.3 エージェントAPIをテストする
  • 9.5.4 返信内容を解析してみる
  • 9.5.5 エージェントとしてプログラミングする

9.6 APIでナレッジを操作する

  • 9.6.1 なぜナレッジAPIが必要なの?
  • 9.6.2 ナレッジの仕組みを理解しよう
  • 9.6.3 ナレッジからAPIを取得する
  • 9.6.4 空のデータセットを作成する
  • 9.6.5 テキストをドキュメントに追加してみよう
  • 9.6.6 APIでドキュメントを更新する
  • 9.6.7 ファイルからドキュメントを作成する
  • 9.6.8 ファイルからドキュメントを更新する
  • 9.6.9 その他の主要なナレッジAPI
  • 9.6.10 この章まとめ:筆者の実践例から見たDifyAPIの可能性

第10章 ローカル環境の構築

10.1 Dockerの物語

  • 10.1.1 さまざまな住人が暮らすLinux街
  • 10.1.2 便利な引っ越し箱の登場
  • 10.1.3 Docker……そしてDify

10.2 Dockerを使ったインストール方法

  • 10.2.1 Dockerのインストールの前提条件
  • 10.2.2 事前準備:Gitのインストール
  • 10.2.3 Dockerをインストールする
  • 10.2.4 Dockerはどうやって使うのか
  • 10.2.5 DifyをDocker上でインストールする
  • 10.2.6 Difyのバージョンアップ手順

10.3 Difyの内部構造

  • 10.3.1 docker-compose.yamlを読み解く
  • 10.3.2 各種コンテナの詳細を覗いてみる
  • 10.3.3 Webサービスを見てみよう
  • 10.3.4 Difyの記憶装置を理解する
  • 10.3.5 weaviate
  • 10.3.6 まとめ

10.4 環境変数とカスタマイズ

  • 10.4.1 設定できることを知ろう
  • 10.4.2 環境変数の世界を覗いてみよう
  • 10.4.3 環境変数の文法を解読する
  • 10.4.4 環境変数の設定方法
  • 10.4.5 環境変数の優先順位を理解する
  • 10.4.6 .envファイルの活用
  • 10.4.7 カスタマイズ設定例
  • 10.4.8 トラブルシューティング
  • 10.4.9 まとめ:環境変数マスターへの道

10.5 OllamaでローカルAIチャットボットを作る

  • 10.5.1 システム要件をチェックしよう
  • 10.5.2 モデルのダウンロードと実行
  • 10.5.3 環境変数の設定(外部アクセスを許可する)
  • 10.5.4 外部アクセスの確認
  • 10.5.5 Difyと連携しよう
  • 10.5.6 まとめ

終章 次なる一歩に向けて

サポート

正誤表

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

(2025年7月1日最終更新)

扉裏注意

補足

本書執筆時点でDifyのバージョンは0.15.3でした。入稿直前に1.0.0がリリースされました。解説内容やアプリの操作に極端な修正はありませんが,画面表示などが変更されています。そうしたバージョンの差異を可能な限り説明するため「青色の破線枠」で注意を補足しております。バージョンアップに伴う追加説明は下記URLを参照ください。なお,スマホなどでQRコードを読み取ることで,筆者が更新している情報を容易に参照できます。ぜひご活用ください。

「生成AIアプリ開発大全」サポートページ
https://nova-join-5c4.notion.site/AI-1a1b1102fb3380b48d8df6fa1c62da0c

CHU1.png

読者からのご指摘とフィードバック
https://nova-join-5c4.notion.site/1cbb1102fb338001b6a9c2c37e6a8e31

CHU2.png

本書でリンクされるサポートページ一覧
https://nova-join-5c4.notion.site/Dify-213b1102fb3380eb8b1cdd7bbc427d72

CHU3.png

前づけ部分

P.vii 第3章 実践スキル欄
文書を適切なサイズに分割して検索性能を高められる
文書を適切なサイズに分割して検索性能を高められる
習得スキル欄
検索テストで検索成果が確認できる
検索テストで検索結果が確認できる
P.viii 第5章 実践スキル欄
時間情報を含めた議事録フォーマット作成できるようになる
時間情報を含めた議事録フォーマット作成できるようになる
P.ix 第6章 実践スキル欄
複数のノードを組み合わせた効率的なワークフローが設計できるようなる
複数のノードを組み合わせた効率的なワークフローが設計できるようなる
第8章 習得スキル欄
いままで学んだすべての方法を
いままで学んだすべての方法を

本文

P.9
「やりたいことドリブン」と「したいことドリブン」という言い方でも
「やりたいことドリブン」「したいことドリブン」という言い方でも
P.23 注意の補足

V1.Xから最初のアプリケーションの作成の時点でLLMモデルの選択方法が変わりました。筆者のサポートページを参照してください。

P.32
小規模から始めて、徐々にスケールアップできます。

上記を削除します。

P.36
gpt-4o-mini と Gemini 1.5 Falsh の回答を比較すると、
gpt-4o-mini と Gemini 1.5 Flash の回答を比較すると、
P.51
Few-Shot Learning はZero-Shot Learning と比べると精度は大きく向上します。
Few-Shot Learning はZero-Shot Learning と比べると精度は大きく向上します。
P.72
これらも同様にベクトル化されており
これらも同様にベクトル化されており
P.73
「昼食第は自己負担」はまったく別のベクトルとなり、
「昼食は自己負担」はまったく別のベクトルとなり、
P.77
だいたい日本語1文字で2~3トークン
だいたい日本語1単語で1~2トークン
P.82
検索性能を高められる
検索性能を高められる
P.91
ちょうといい塊でテキストを分割してくれます。
ちょういい塊でテキストを分割してくれます。
P.113
最低言必要なものは
最低必要なものは
P.131
本当の魔術はここから始まります。
本当の魔術はここから始まります。
P.191
業界・業種(industory)
業界・業種(industry)
開始/{x}industory
開始/{x}industry
P.243
jinja2
Jinja2
P.301
これを「拾の型」の
これを「拾壱ノ型」の
P.307
gpt-4o-mini-20204-07-18
gpt-4o-mini-2024-07-18
P.308
パラメータ「response_to」をONにして
パラメータ「response_format」をONにして
P.333
wikipedia_serch
wikipedia_search(スペル修正)
P.500
docker-compose.yml
docker-compose.yaml
P.516
docker-compose.yml
docker-compose.yaml

商品一覧