こんにちは、スクーティー代表のかけやと申します。
弊社は生成AIを強みとするベトナムオフショア開発・ラボ型開発や、生成AIコンサルティングなどのサービスを提供しており、最近はありがたいことに生成AIと連携したシステム開発のご依頼を数多く頂いています。
先日OpenAI社から最新の言語モデルであるo1-preview/miniがリリースされましたが、Difyのv0.8.1アップデートで早速これらのモデルが使用できるようになっていました(本記事執筆時点でのDify最新バージョンはv0.8.3)。
この記事では、Difyのv0.8.1アップデートで追加されたOpenAIの最新モデルo1-previewとo1-miniを使用する方法についてご紹介します。最後に簡単に、o1-previewとGPT-4oを切り替えて出力を比較するワークフローも作ってみましたので、ぜひそちらもご覧ください!
Difyとは
Difyとは、プログラムを書かずに簡単にAIアプリを作成できる超便利ツールです。
Difyについては以下の記事をご覧ください!
- Difyってなに?という方:DifyでSEO記事作成を試してみる
- Difyでワークフローの作り方:Difyのワークフローを使って今度こそSEO記事を作成する【2024年6月更新】
Difyの環境構築方法やバージョンアップ方法は本家のレポジトリを参照することをおすすめします。特にバージョンアップ方法はバージョンごとに微妙に方法が変わってきているため、最新版を確認する必要があります。
本記事の検証は、MacOSのローカルPC上に、Dify v0.8.1で検証しました。
Dify v0.8.1アップデートの概要
Difyの v0.8.1では、ユーザーエクスペリエンス向上のため、多数の機能強化、新機能追加、そして重要なバグ修正が行われました。中でも特筆すべきは以下の点です。
1. OpenAI o1シリーズモデルのサポート
v0.8.1の目玉となるのが、OpenAIの最新モデルであるo1-previewとo1-miniのサポートです。これらのモデルは、従来のモデルよりも複雑なタスクにおける推論能力に優れ、科学、コーディング、数学などの分野でより高度な問題解決を可能にします。
o1-previewは、高度な推論能力を備えたモデルですが、処理速度が遅く、利用料金も高額です。一方、o1-miniは、o1-previewよりも処理速度が速く、費用対効果に優れたモデルです。Dify.AIでは、これらのモデルを用途に合わせて使い分けることができます。
2. ワークフローの強化
複数の並列実行における問題や、条件分岐ノードにおける同時出力問題など、ワークフローに関する複数のバグが修正されました。これにより、より安定したワークフローの実行が可能になります。
3. UI/UXの改善
アップロード画像アイコンの配置ずれ修正や、Markdown段落マージンの調整など、UI/UXに関する細かな改善が行われました。これらの改善により、より快適にDify.AIを利用できるようになります。
4. その他の機能強化とバグ修正
BedrockにおけるClaudeモデルのサポート強化、クロスリージョン推論のサポート追加、エディターによるAPIキー作成機能の実装など、様々な機能強化が行われました。また、Ollama埋め込みモデルに関するエラーや、ローカライズ翻訳、変数EntityTypeのバグなど、複数のバグが修正されました。
Dify v0.8.1へのアップデート方法
Difyをv0.8.1にアップデートするには、以下の手順に従います。
基本的にリリースノートに記載しているコマンドラインを実行するだけです。
# 1.docker-compose.yamlファイルのバックアップ (任意)
cd docker
cp docker-compose.yaml docker-compose.yaml.$(date +%s).bak
# 2.最新コードの取得
git checkout main
git pull origin main
# 3.サービスの停止 (dockerディレクトリで実行)
docker compose down
# 4.データのバックアップ
tar -cvf volumes-$(date +%s).tgz volumes
# 5.サービスのアップグレード
docker compose up -d
DifyでOpenAI o1モデルを使用する方法
Dify v0.8.1にアップデート後、特に特別な設定なくOpenAI o1モデルを使用することができます。
Dify上で行うモデルの初期設定に関しては、上記で紹介した「DifyでSEO記事作成を試してみる」の記事をご覧ください。本記事では割愛します。
右上メニューから「Settings」を選択し、Difyのモデル設定画面で、o1-preview/miniが表示されていることを確認します。v0.8.1以降のバージョンアップが上手くいっていれば、下記のようにOpenAIのモデル一覧にo1-preview/miniが表示されます。
エージェントやワークフローを作成する画面でも、モデルの選択肢にo1-preview/miniが表示されていることがわかります。
上記ではとりあえずo1-preview/miniが使用できることのみを確認していますが、Difyを業務利用する場合は他にも様々な設定をいれる必要があります。このあたりをまるっと依頼したいというご要望がございましたら、ぜひお気軽にご連絡ください!
Difyでo1-previewを使ってみる
o1-previewはコーディング能力がとにかく高いということで、プログラミングコンテストの問題を解くというタスクを、o1-previewとGPT-4oにさせてみて、結果を比較しました。
検証にあたり、以下のような簡単なワークフローを作成しました。
詳細は割愛しますが、最初の入力でo1-previewかGPT-4oかを選択し、選択されたモデルで全く同じプログラミングコンテストの問題を、全く同じプロンプトで回答するというものです。
第一問
長さLcmの竿の上をn匹のアリが毎秒1cmのスピードで歩いています。アリが竿の箸に到達すると竿のしたに落ちていきます。また、竿の上は狭くてすれ違えないので、に匹のアリが出会うと、それぞれの反対を向いて戻っていきます。各アリについて、現在の竿の左端からの距離xiはわかりますが、どちらの方向を向いているのかはわかりません。全てのアリが竿から落ちるまでにかかる最小の時間と最大の時間をそれぞれ求めなさい。 制約: 1≦L≦10^6、1≦n≦10^6、1≦xi≦L
o1-previewの出力
L = 10
n = 3
x_list = [2, 6, 7]
t_min = 0
t_max = 0
for xi in x_list:
t_min_i = min(xi, L - xi)
t_max_i = max(xi, L - xi)
t_min = max(t_min, t_min_i)
t_max = max(t_max, t_max_i)
print(t_min)
print(t_max)
GPT-4oの出力
def calculate_time(L, n, positions):
min_time = 0
max_time = 0
for pos in positions:
# 各アリについて最小到達時間を計算(近い方の端までの距離)
min_time = max(min_time, min(pos, L - pos))
# 各アリについて最大到達時間を計算(遠い方の端までの距離)
max_time = max(max_time, max(pos, L - pos))
return min_time, max_time
# 与えられた入力
L = 10
n = 3
positions = {2, 6, 7}
# 結果を計算
min_time, max_time = calculate_time(L, n, positions)
print(f"最小時間: {min_time}")
print(f"最大時間: {max_time}")
よくわからないと思いますが、両方とも正解です。
なんならコメントを付けてくれているGPT-4oのほうが親切な気もします。
第二問
重さと価値がそれぞれwi, viであるようなn個の品物があります。これらの品物から、重さの総和がWを超えないように選んだときの、価値の総和の最大を求めなさい。 制約:1≦n≦100、1≦wi,vi≦100、1≦W≦10000
o1-previewの出力
n = 4
items = [(2, 3), (1, 2), (3, 4), (2, 2)]
W = 5
# DPテーブルの初期化
dp = [0] * (W + 1)
# 各品物についてDPテーブルを更新
for wi, vi in items:
for w in range(W, wi - 1, -1):
if dp[w - wi] + vi > dp[w]:
dp[w] = dp[w - wi] + vi
# 結果の出力
print("最大の価値の総和:", max(dp))
GPT-4oの出力
def knapsack(n, items, W):
# DPテーブルを作成
dp = [[0] * (W + 1) for _ in range(n + 1)]
# DPテーブルを埋める
for i in range(1, n + 1):
weight, value = items[i - 1]
for w in range(W + 1):
if w >= weight:
# アイテムを選ぶ場合と選ばない場合の価値の最大を選択
dp[i][w] = max(dp[i - 1][w], dp[i - 1][w - weight] + value)
else:
# アイテムを選ばない場合
dp[i][w] = dp[i - 1][w]
# 最大価値を返す
return dp[n][W]
# 入力
n = 4
items = [(2, 3), (1, 2), (3, 4), (2, 2)]
W = 5
# 実行
max_value = knapsack(n, items, W)
print("最大価値:", max_value)
こちらも両方とも正解です。
・・・ということで、差が付きませんでした汗
ただ、o1-previewは論理的な思考やコーディング能力が優れており、GPT-4oは文章作成能力が優れていることがわかっているので、用途に応じてモデルを切り替えてタスクをやってもらうということがやりやすくなりました!