- 前川喜洋
- 約 3,900 文字
- 7,400 View
目次
概要
Dify (DeFiではない)と Anthropic Claude (OpenAI でも OpenRouter 経由の何かでもOK)を使って簡単に生成AIアプリケーションを構築する方法をご紹介します。
- 前編:ノーコードで生成AIアプリケーションを構築するチュートリアル
- 後編:自作プログラムで機能追加して生成AIの指向性と精度を高めるサンプル
の2本立ての予定です。
対象読者
- 生成AIに興味があるがまだチャット以上の利用法を見出せず手を出せていない方
- お試しに手軽に生成AIアプリケーションを構築してみたい方
- 特にOpenAIに月額費用に躊躇っている方
前提知識・環境
- Docker (Docker Compose)。Windows なら Docker Desktop。後編ではホスト名
host.docker.internalを使用します - “時々生成AIをチャットで活用している”程度のプロンプト操作の知識
取り上げない話題
何が実現可能になるかを示唆する事にフォーカスするので、手段は深堀しません。例えばRAGには触れません。
準備
Anthropic API のAPIキーを取得し、Difyをローカルで起動します。
サービスとして提供されている https://dify.ai/ を使ってもいいですが、APIキーを預けるのは何となく不安なので&後編で便利なのでローカルで話を進めます。
Anthropic API でAPIキー取得
https://console.anthropic.com/settings/plans で電話番号認証後の初回だけ5ドル分の無料お試し枠が貰えます。既に OpenAI や OpenRouter に課金されている方はそちらでも良いですが以下でモデルを指定する箇所では適宜読み替えてください。
モデルによりトークン当たりのクレジットの消費量が異なりますが、コスト軸での選択の目安は以下の通りです。
- Haiku:ガンガン使っても殆ど減らないので感触を探る間は当面これで
- Sonnet:試行錯誤していると目に見えて減っていくので残高注意
- Opus:ごっそり減るのでお試し中の常用は非推奨。比較検証したい時のワンポイントで
もうAnthropicの無料枠を消化してしまった人は https://openrouter.ai/ が使えるかもしれません。入金しなくても謎に0.2ドル程度をタダで使わせてくれたり、仮想通貨(PolygonネットワークのUSDC)決済が出来たりします。
Difyセットアップ
インストール
git clone https://github.com/langgenius/dify するか、https://github.com/langgenius/dify/tree/main/docker の docker-compose.yaml と nginx ディレクトリをダウンロードして、 docker-compose.yaml のある場所で docker compose up -d します。
実行時のディレクトリ直下にボリュームディレクトリ volumes が作成されます。
nginx がポート 80 で起動するので空けておくか services.nginx.ports を適当な値に変えてください。
初期設定
http://localhost/ にアクセスすると初回は「管理者アカウントの設定」画面が表示されます。メールアドレスは適当な値で大丈夫ですが次のサインイン画面で使うので何を入れたかは忘れないでください。
言語設定は日本語のままでもあまり不自由しませんが、ところどころ未翻訳のテキストが空欄で表示されたり undefined になったりしてしまうので出来れば英語の方がお勧めです。
サインインしたら、右上のアカウント名をクリックして設定→モデルプロバイダー→Anthropicにマウスオーバーしてセットアップ、と進んでAPIキーを入力します。そのままだとシステムモデルに Claude 3 Opus が使われてしまうので Haiku を選択します。寄稿時点では claude-3-haiku-20240307 というモデル名でした。ここでClaudeシリーズが選択できない場合は何かしらエラーが発生しています。原因が分からなければAPIキーを再発行&再入力してください。
ちなみに OpenRouter を使用するなどして OpenAI 互換のモデルを使用する場合は一番下の Model providers compatible with OpenAI's API standard, such as LM Studio. で使用できます。が、恐らくDifyの不具合でそれだけではモデルとして使用可能になりません。一度保存したモデル情報を開いて保存しなおすと使用可能になります。
チュートリアル1:シンプルな生成AIチャットbot
特定のテーブル定義に対して特化したSQLを生成するチャットbotを作ってみましょう。
開発
- 画面上部のスタジオ→新しいアプリを作成する、をクリック。タイプにアシスタントを選択し、適当な名前を付けます。後から変更可能です(実はおなじみのAIチャットとして使うだけならここまでで完成してしまっています)
- 画面左の「手順」に以下を入力します。フォーカスを外すと変数追加をリコメンドしてくれます。追加後このままだと短文しか入力できないので両方 ⚙ で「段落」に変更します。
You can behave as an expert of database expert. Provide a clear answer to the main purpose of the order. Omit preamble, phase, and repeating the order. |
動作確認
- ここで画面右上の「公開」をクリックしてください。しなくても動作確認は出来ますが、変更が保存されていません。実はこの時点で完成したアプリケーションとして公開されてしまいますが、これ以外に開発中のアプリケーションを保存する方法が見当たりませんでした。
DDLにCREATE TABLE ~などのDDLを貼り付けてください。DataModelDescriptionsに各テーブルの内容や結合方式などについての説明文を貼り付けてください。必須ではありませんがこれが無いとAIはすぐ存在しないカラムの幻覚を見始めるので強く推奨します。1
(ここで入力した値は永続化されないので、何度も使い回す用に自分でテキストファイルにでも貼り付けて保存しておきましょう)。- 画面右下に薄っすらと入力欄が有るのでそこにSQL生成を依頼するプロンプトを入力してください。
- 速い安い旨いの Haiku でも3,4テーブル程度の結合・集約なども結構な高精度で生成してくれます。
参考までに私が使用した変数の値を下記に貼り付けておきます。少し実務みのある区分値やリレーションを設定してあります。
DDL
-- Project Name : retail |
Data Model Descriptions
# データモデル概要 |
プロンプト:「売上金額と売上数を場所別・商品別・月別に集計するSQL」
アプリケーション公開
ここまでの操作で(公開をクリックした時点で)既にDify上で動作するアプリケーションが完成し公開されています。
画面左のメニューで「概要」で下記の画面が表示されます。UIもAPIも使用可能な上にAPIキー管理機能まで自動で提供されていてまさに至れり尽くせり。プレビューをクリックするとアプリケーションの画面が開きます。
チュートリアル2:外部ツールの使用
文章を生成するだけのLLMに、外部サイトの情報を収集する機能と、グラフを描画する機能を追加します。
開発
- また画面上部のメニューからスタジオ→新しいアプリを作成する→アシスタントを選択して適当な名前で作成してください。
- 「基本アシスタント」をクリックして「エージェントアシスタント」を選択します。

- 画面左側に「ツール」エリアが出現するので、「+追加」をクリックして、 Wikipedia と ChartGenerator の Pie Chart を追加します。

- 「手順」に
ユーザの入力したプロンプトについてWikipediaで検索し、数値の情報をもとにパイチャートを作成してください。と入力します。無くても動作はしますがそのままだと LLM が Wikipedia を参照せず手持ちの情報で回答してしまいがちなので念を押しておきます。
動作確認
「公開」をクリックしてプロンプトに「アメリカの全人口における州ごとの人口のパイチャート」と入力すると若干怪しい動きを見せつつ作図されます。
実は残念ながら現時点では Anthropic の Functions & external tools には直接対応していないらしく、エージェント設定を見るとエージェントモードが ReAct になっています(GPTやGPT互換だと Function Calling のはず)。どうもこの場合Difyは、「LLMが生成した文字列からツール用パラメータっぽい部分をパースしてツールに中継する」という形で Function Calling を模した機能を提供するようで、生成された文字列が一部でもJSONとして破綻(値の中で改行など)していると失敗します。ツールの呼び出しに失敗するとツールを呼び出そうとした文字列がそのまま最終回答文として出力されます。
後編に続く
前編では下記のステップを辿りました。
- チャットbotに手順(Instruction)を与えて特定の問題領域に特化したチャットbotを作る
- 既製のToolを使用して自然言語処理以外の機能を獲得する
後編はこれらを進めて以下の内容を書きます。
- Toolを自作して機能を拡張する
- 生成AIに自分の生成した回答を自己レビューさせる
- 1.RAG用テキストやベクトルデータベースを作る場合にも言えますが、生成AIに前提知識を与える時には詳細な情報に加えてその概要と補足情報などで多面的に与えると精度が上がります。単純に手軽さだけで言えば、データのフォーマットの工夫に腐心するより表現のバリエーションを増やす方が楽です。パケ死ならぬトークン死しますが… ↩