Gemini 1.5 Pro × Dify で作るo1（高度推論）的ワークフロー

# 記事の概要

Difyの開発元アカウントがDifyでOpenAIのo1モデルを再現するようなワークフローを紹介していたので、試そうと思います。

通常のLLMにプロンプトを投げると、思考時間0秒（思いついたまま）で推論することになりますが、o1（高度推論）的なワークフローで推論を行うことで、思考時間を与えることができ、精度向上につながるとされています。

https://x.com/dify_ai/status/1840432446363599329

ただ、筆者は従量課金恐怖症のため、試すだけなら無料で試したいと思い、３大LLM（GPT-4o/Claude 3.5 Sonnet/Gemeni 1.5 Pro）の中で唯一無料枠があるGeminiのAPIを使って、無料枠内でこのワークフローを試す手順を作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/6bf26cf2-a66e-6089-9158-e2a13f3f74c3.png)

# 構築手順

## Gemini 1.5 ProのAPIキー取得

以下から、取得可能なので取得します。

https://ai.google.dev/gemini-api/docs?hl=ja

# ワークフロー

以下のワークフローを利用します。
基本的には、もとのワークフローを日本語に修正したのと、Gemini APIの無料枠のレート制限に対応するため、「スリープコード」という「ただ待つだけ」のノードを追加しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/6bf26cf2-a66e-6089-9158-e2a13f3f74c3.png)

以下に、今回作成したワークフローを格納しています。

https://drive.google.com/drive/folders/1hA42_A5uI3B2Ep7rKgHgr3jj7uD7MCh7?usp=drive_link

## メインのワークフロー

### 「開始」ノード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/6becec00-099b-24eb-a7fb-b8912d832363.png)

### 「タスク ブレイクダウン」ノード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/882de028-e42f-5d18-840f-40e197f12cd3.png)


```
あなたは詳細なステップ・バイ・ステップの思考ができるAIアシスタントです。質問を受けた際は、即座に回答せず、問題解決のプロセスを対応するステップに分解し、ステップ・バイ・ステップの推論を行ってください。各ステップの名称と作業内容の説明のみを提供し、自身で解決はしないでください。最低3つのステップを設けるようにしてください。
```
### 「タスク 抽出」ノード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/46a8ec10-8103-585a-a327-41b0b1e3c706.png)

```
内容からステップの配列を抽出し、以下のような形式で出力してください：
[
	{
	"name": "ステップ名",
	"content": "作業内容の説明"
	},
	{
	"name": "ステップ名",
	"content": "作業内容の説明"
	},
		...
]
```

### 「スリープコード（60s）」ノード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/2fbb79ea-97a4-fef5-5de0-7f56ef1a08dc.png)


### 「イテレーション」ノード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/898226ab-b946-5c40-9513-2c2805e76896.png)


### 「パース タスク」ノード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/800d83b7-9491-37e3-e0df-78fa421b909b.png)

```
def main(step) -> dict:
    # Clean to get a dictionary containing only step name and content
    step_name = step['name']
    step_content = step['content']
    return {
        'name': step_name,
        'content': step_content
    }

```

### 「タスク 実行」ノード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/90e325c3-ec22-5355-6171-3df265a08eb7.png)

```
## 質問
"""{{#1733666009746.input_text#}}"""

## タスクの背景
これはワークフローの1ステップです。前段階のワークフロー処理で問題をN個のステップに分解します。

## タスク
問題から分解されたステップに基づいて、指定されたステップのタスクに回答してください。現在のタスク名：{{#1733667819329.name#}} 、タスクの説明：{{#1733667819329.content#}}

## 初期化
質問全体に答える必要はありません。このステップに対する質問の分析と回答のみを行ってください。

## 出力
回答をMarkdown形式で出力してください。例は以下の通り：
 - {{#1733667819329.name#}}：[ステップの回答]
```

### 「スリープコード（20s）」ノード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/0d3e64f1-dbb2-779d-e53b-5c7ba5fbb9a5.png)


### 「マージ 結果」ノード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/d93ff7e1-afb6-fc99-cb78-5cc181999637.png)

```
{{ step_answer | join("\n")}}
```


### 「サマリ 回答」ノード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/8e835ef1-dfc2-3d86-c55f-0dfd8a22e4d9.png)
```
## オリジナルの質問
"""{{#1733666009746.input_text#}}"""

## タスク
原題を確認し、以下の分析をまとめてください（エラーがある可能性があるため、発見した場合は修正してください）。その後、質問に対する最終的な回答を提供してください。回答は簡潔にしてください。
{{#1733668565368.output#}}
```
※要約が不要であれば、「回答は簡潔にしてください。」は削除してもよい。

### 「終了」ノード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/9f64c270-5927-161d-accf-b69177c7a766.png)


## スリープコード（20S）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/3b6ea197-341f-caed-5d2a-24c38bbc5a61.png)

### 「開始」ノード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/f5a9e201-bb7c-0f4a-0c6a-280d064e5fa9.png)

### 「sleep_10s_1」「sleep_10s_2」ノード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/5fbed7b6-3b59-86db-9f6b-22e05e4bca54.png)


```
import time

def main():
    print("Waiting for 10 seconds...")
    time.sleep(10)
    print("Done waiting!")
    return {'result': 'OK'}
 ```

### 「終了」ノード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/8523e255-da63-d34b-3172-79bae117268e.png)


## スリープコード（60s）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/7fbd4080-0c60-31b5-9475-da48026e5a60.png)

### ノードについては「スリープコード（20s）」とほとんど同じため、割愛



# 結果

「ai agentの定義について検討して」というプロンプトで検証しました。
以下が出力結果です。

```
## AIエージェントの定義に関する分析と回答

与えられたテキストは、AIエージェントの定義を多角的に分析し、段階的に詳細化しています。各ステップの要点をまとめると以下のようになります。

**ステップ1：情報収集と整理**

AIエージェントの定義の**共通点**として「環境内で動作し、目標達成のために自律的に行動する」点が挙げられています。**相違点**は、自律性のレベル、目標の複雑さ、学習能力などです。定義の変遷として、ルールベースからデータ駆動型、そして強化学習を用いた高度なエージェントへの進化が示されています。キーワードは**自律性、目標指向性、環境との相互作用、学習能力**です。

**ステップ2：定義要素の抽出と分類**

AIエージェントの主要要素として、**知覚、表現と推論、行動、学習、目標指向性、自律性** が挙げられています。これらをコア機能（知覚、表現と推論、行動）と発展的な機能（学習、目標指向性、自律性）に分類しています。ボット、AIアシスタント、エキスパートシステムとの違いも明確化されています。最終的に、AIエージェントは「**環境を知覚し、内部表現と推論に基づいて行動を選択し、学習を通じて目標を達成する自律的なシステム**」と定義されています。

**ステップ3：定義の記述と検証**

AIエージェントを「**環境を認識し、目標達成のために自律的に行動を選択し実行する計算システム**」と定義し、ゲームAI、ロボット、チャットボット、自動運転車を具体例として検証しています。定義の網羅性と曖昧さについても考察し、今後の改善点として、ステップ1の情報に基づく修正、種類や特性の分類、知能や学習の定義の明確化を挙げています。

**ステップ4：関連概念との比較と整理**

AIエージェントを「環境を認識し、それに基づいて行動を選択し、目標を達成するために自律的に動作するソフトウェアプログラム」と定義し、ロボット、ボット、AIアシスタント、エキスパートシステムとの関係性を整理しています。ベン図を用いて視覚的に表現していますが、包含関係が複雑なため、図だけでは表現しきれない部分があることを注意喚起しています。


## 最終的な回答

AIエージェントとは、**環境を認識し、目標達成のために自律的に行動を選択し実行する計算システム**です。  学習能力、表現と推論能力を持つことで、複雑な環境にも適応し、高度なタスクを遂行できます。  ロボット、ボット、AIアシスタントなどは、この定義の範囲内に含まれるか、密接に関連する概念です。


## エラーと改善点

* ステップ3と4でAIエージェントの定義が微妙に異なっています。統一した方が良いでしょう。
* ステップ3でステップ1の情報が欠落しているため、検証が不十分です。
* ベン図は包含関係を正確に表現できていないため、別の表現方法を検討する必要があるかもしれません。


より厳密な定義は文脈や目的に依存しますが、上記の回答は一般的な理解に基づいた簡潔な説明となっています。

```


↓↓↓↓　上記のテキストをマークダウンで表示すると以下になります。　↓↓↓↓
↓↓↓↓　上記のテキストをマークダウンで表示すると以下になります。　↓↓↓↓
↓↓↓↓　上記のテキストをマークダウンで表示すると以下になります。　↓↓↓↓

## AIエージェントの定義に関する分析と回答

与えられたテキストは、AIエージェントの定義を多角的に分析し、段階的に詳細化しています。各ステップの要点をまとめると以下のようになります。

**ステップ1：情報収集と整理**

AIエージェントの定義の**共通点**として「環境内で動作し、目標達成のために自律的に行動する」点が挙げられています。**相違点**は、自律性のレベル、目標の複雑さ、学習能力などです。定義の変遷として、ルールベースからデータ駆動型、そして強化学習を用いた高度なエージェントへの進化が示されています。キーワードは**自律性、目標指向性、環境との相互作用、学習能力**です。

**ステップ2：定義要素の抽出と分類**

AIエージェントの主要要素として、**知覚、表現と推論、行動、学習、目標指向性、自律性** が挙げられています。これらをコア機能（知覚、表現と推論、行動）と発展的な機能（学習、目標指向性、自律性）に分類しています。ボット、AIアシスタント、エキスパートシステムとの違いも明確化されています。最終的に、AIエージェントは「**環境を知覚し、内部表現と推論に基づいて行動を選択し、学習を通じて目標を達成する自律的なシステム**」と定義されています。

**ステップ3：定義の記述と検証**

AIエージェントを「**環境を認識し、目標達成のために自律的に行動を選択し実行する計算システム**」と定義し、ゲームAI、ロボット、チャットボット、自動運転車を具体例として検証しています。定義の網羅性と曖昧さについても考察し、今後の改善点として、ステップ1の情報に基づく修正、種類や特性の分類、知能や学習の定義の明確化を挙げています。

**ステップ4：関連概念との比較と整理**

AIエージェントを「環境を認識し、それに基づいて行動を選択し、目標を達成するために自律的に動作するソフトウェアプログラム」と定義し、ロボット、ボット、AIアシスタント、エキスパートシステムとの関係性を整理しています。ベン図を用いて視覚的に表現していますが、包含関係が複雑なため、図だけでは表現しきれない部分があることを注意喚起しています。


## 最終的な回答

AIエージェントとは、**環境を認識し、目標達成のために自律的に行動を選択し実行する計算システム**です。  学習能力、表現と推論能力を持つことで、複雑な環境にも適応し、高度なタスクを遂行できます。  ロボット、ボット、AIアシスタントなどは、この定義の範囲内に含まれるか、密接に関連する概念です。


## エラーと改善点

* ステップ3と4でAIエージェントの定義が微妙に異なっています。統一した方が良いでしょう。
* ステップ3でステップ1の情報が欠落しているため、検証が不十分です。
* ベン図は包含関係を正確に表現できていないため、別の表現方法を検討する必要があるかもしれません。


より厳密な定義は文脈や目的に依存しますが、上記の回答は一般的な理解に基づいた簡潔な説明となっています。


↑↑↑↑　ここまでがLLMの出力のマークダウン化したテキストです。　↑↑↑↑
↑↑↑↑　ここまでがLLMの出力のマークダウン化したテキストです。　↑↑↑↑
↑↑↑↑　ここまでがLLMの出力のマークダウン化したテキストです。　↑↑↑↑






# 感想

推論結果について細かく見ていないので、偏見は強めですが、以下のように通常のLLMに聞くよりも検討された推論になっている気がします。気のせいかもですが。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/34b64bee-785a-f0ea-c5ee-3f7f0394dca6.png)


推論用のワークフローとして使うこと自体にも意味はありますが、このフローを一から作成してみることは、DifyやLLM、AI agentの仕組みを理解する上で、かなり役に立つと思います。