見出し画像

プログラミング無しでChatGPTを並列化してメールで結果を受け取る方法: Daguを使ったノーコードワークフロー

この記事では、無料で使えるワークフローエンジンであるDaguを用いて、誰でも簡単にChatGPTを並列で呼び出す自動化方法を紹介します。具体的には、Dagu上でワークフローを作り、ChatGPTのAPIを実行し、結果を自動的にメールで送信する方法を解説します。

なぜDaguを使うのか

Daguは、オープンソースで無料で使えるワークフローエンジンです。以下のような特徴があります。

  • ノーコード(プログラミング不要)でワークフローを作成できる

  • ブラウザ上でワークフローの作成や実行など全ての操作ができる

  • Macにコマンドをインストールするだけで使える

Dagu のインストールと起動

Mac でターミナルを起動し、以下のコマンドを実行してインストールします。

brew install yohamta/tap/dagu

インストールしたら、次のコマンドを実行してDaguを起動します。

dagu server

ブラウザで以下のURLにアクセスすればDaguの画面が表示されます。
http://localhost:8080

複数のプロンプトを同時に実行する方法

Dagu でワークフローを作成することで、複数のプロンプトを同時に実行し、それぞれの結果を1つのメールにまとめて送信することもできます。これにより、一度に複数の質問に対する回答を得ることができ、効率的に情報収集ができます。

プロンプトの準備

まずは実行したいプロンプトをリストにして準備します。この例では、以下の3つのプロンプトを同時に実行してみましょう。

  1. "最高に面白いローグライクゲームのアイデア"

  2. "独創的なVRゲームのアイデア"

  3. "宇宙をテーマにしたシミュレーションゲームのアイデア"

ワークフローの設定

Dagu で新しいワークフローを作成して、編集ボックスに以下をコピペし、保存します。


params: GOAL1="独創的なVRゲームのアイデア" GOAL2="最高に面白いローグライクゲームのアイデア" GOAL3="宇宙をテーマにしたシミュレーションゲームのアイデア"
env:
  - OPENAI_API_KEY="ChatGPTのAPIキー"
  - MY_EMAIL="送り先のメールアドレス"
  - FORMAT: >-
      a[0,0]=[Goal]\n
      a[i,1-5]=a[i,0]を達成するためのアイデアを5つ出したものです。\n
      a[i+1,0]=a[i,1-5]の中で最も良いと思われるアイデアです。\n
      \n
      これを用いi=0-5まで計算した上、結果をHTMLの55列合計25マスの表にしてください。\n

smtp:
  host: "smtp.mailgun.org"
  port: "587" username: "Mailgun のユーザ名"
  password: "Mailgun のパスワード"

steps:

  - name: ask chatgpt 1
    executor:
      type: http
      config:
        timeout: 1200
        headers:
          Authorization: "Bearer $OPENAI_API_KEY"
          Content-Type: "application/json"
        silent: true
        body: |
          { "model": "gpt-3.5-turbo", "messages": [
              {"role": "system", "content": "Act as a state-of-art chat AI. Please output the result in a table format with 5 rows and 5 columns. Format your reply in HTML code styled with beautiful CSS. Use Japanese."},
              {"role": "user", "content": "[Goal]${GOAL1}\n${FORMAT}"}
            ] 
          }
    command: POST https://api.openai.com/v1/chat/completions
    output: API_RESPONSE1

  - name: ask chatgpt 2
    executor:
      type: http
      config:
        timeout: 1200
        headers:
          Authorization: "Bearer $OPENAI_API_KEY"
          Content-Type: "application/json"
        silent: true
        body: |
          { "model": "gpt-3.5-turbo", "messages": [
              {"role": "system", "content": "Act as a state-of-art chat AI. Please output the result in a table format with 5 rows and 5 columns. Format your reply in HTML code styled with beautiful CSS. Use Japanese."},
              {"role": "user", "content": "[Goal]${GOAL2}\n${FORMAT}"}
            ] 
          }
    command: POST https://api.openai.com/v1/chat/completions
    output: API_RESPONSE2

  - name: ask chatgpt 3
    executor:
      type: http
      config:
        timeout: 1200
        headers:
          Authorization: "Bearer $OPENAI_API_KEY"
          Content-Type: "application/json"
        silent: true
        body: |
          { "model": "gpt-3.5-turbo", "messages": [
              {"role": "system", "content": "Act as a state-of-art chat AI. Please output the result in a table format with 5 rows and 5 columns. Format your reply in HTML code styled with beautiful CSS. Use Japanese."},
              {"role": "user", "content": "[Goal]${GOAL3}\n${FORMAT}"}
            ] 
          }
    command: POST https://api.openai.com/v1/chat/completions
    output: API_RESPONSE3

  - name: get result 1
    executor:
      type: jq
      config:
        raw: true
    command: ".choices[0].message.content"
    script: "$API_RESPONSE1"
    output: MESSAGE_CONTENT1
    depends:
      - ask chatgpt 1

  - name: get result 2
    executor:
      type: jq
      config:
        raw: true
    command: ".choices[0].message.content"
    script: "$API_RESPONSE2"
    output: MESSAGE_CONTENT2
    depends:
      - ask chatgpt 2

  - name: get result 3
    executor:
      type: jq
      config:
        raw: true
    command: ".choices[0].message.content"
    script: "$API_RESPONSE3"
    output: MESSAGE_CONTENT3
    depends:
      - ask chatgpt 3

  - name: convert escaped unicode to plain HTML 1
    command: "sh"
    script: |
      input="${MESSAGE_CONTENT1}"
      unescaped=$(echo -e "$input" | sed 's/\\u003c/</g' | sed 's/\\u003e/>/g')
      echo "$unescaped"
    output: MESSAGE_CONTENT1
    depends:
      - get result 1

  - name: convert escaped unicode to plain HTML 2
    command: "sh"
    script: |
      input="${MESSAGE_CONTENT2}"
      unescaped=$(echo -e "$input" | sed 's/\\u003c/</g' | sed 's/\\u003e/>/g')
      echo "$unescaped"
    output: MESSAGE_CONTENT2
    depends:
      - get result 2

  - name: convert escaped unicode to plain HTML 3
    command: "sh"
    script: |
      input="${MESSAGE_CONTENT3}"
      unescaped=$(echo -e "$input" | sed 's/\\u003c/</g' | sed 's/\\u003e/>/g')
      echo "$unescaped"
    output: MESSAGE_CONTENT3
    depends:
      - get result 3

  - name: send mail
    executor:
      type: mail
      config:
        to: "$MY_EMAIL"
        from: "$MY_EMAIL"
        subject: "goal seek result"
        message: |
          <html>
            $MESSAGE_CONTENT1
            $MESSAGE_CONTENT2
            $MESSAGE_CONTENT3
          </html>
    depends:
      - convert escaped unicode to plain HTML 1
      - convert escaped unicode to plain HTML 2
      - convert escaped unicode to plain HTML 3

このようなワークフローが定義されます。

作成したワークフロー

APIキーとメール送信サーバの設定

ファイルの上の方にある ChatGPT の APIキーを設定する 以下の箇所を書き換えます。メール送信サービスのMailgunは無料で登録できます。

env:
  - OPENAI_API_KEY="ChatGPTのAPIキー"
  - MY_EMAIL="送り先のメールアドレス"

smtp:
  host: "smtp.mailgun.org"
  port: "587"
  username: "Mailgun のユーザ名"
  password: "Mailgun のパスワード"

実行と結果の確認

右上のスタートボタンを押したところ。

実行ダイアログ

1分ほどでワークフローが完了しました。

ワークフローが完了した画面

そして、以下のようなメールが届きます。
ChatGPT から得たレスポンスが3つまとめられています。

届いたメールの内容

この方法を使えば、一度に複数のプロンプトを効率的に実行し、まとめて結果を受け取ることができます。また、ワークフローの設定やスケジュールを変更することで、さまざまなニーズに合わせてプロンプトの実行をカスタマイズすることが可能です。

実行スケジュールを設定すれば、ワークフローが定期的に実行されます。例えば、以下の一行を追加すれば、毎日午前8時に実行するよう設定することができます。

schedule: "0 8 * * *"

これらの手順に従って、DaguとChatGPT APIを組み合わせることで、効率的に複数のプロンプトを処理し、結果を取得できます。

ワークフローツールを利用するメリット

リトライ

Daguはリトライ機構を備えているため一部のAPIリクエストが失敗したとしても、失敗した部分だけをやり直すことができます。

並列実行

複数のプロンプトを並行して実行することで、全体の実行時間を短縮できます。Dayuでは、タスクの並列実行が可能です。

結果の保存と分析

Daguは実行結果を記録するため、後で分析や改善のために保存しておくことができます。

プロンプトの管理

よく使うプロンプトのワークフローを作成することで、プロンプトに名前をつけて管理することができます。

このアプローチをさらに活用する方法

この自動化されたワークフローは、あなたが定期的にChatGPTから情報を取得したい場合に非常に便利です。例えば、ビジネスニュースの要約、天気予報、株価の更新など、毎日の情報を入手することができます。さらに、この方法を使って、他のAPIとも連携させることが可能です。

外部APIとの連携

例えば、天気予報や株価情報を提供する外部APIを利用して、それらのデータをプロンプトの一部としてChatGPTに送信することができます。これにより、よりタイムリーな情報を取得できるようになります。

他システムと連携したカスタムプロンプト

タスクやプロジェクトに関する情報をチームメンバーから収集し、それらの情報をプロンプトに追加してChatGPTに送信することができます。これにより、特定の状況やニーズに応じた回答を取得することができます。

結果のフィルタリング

ChatGPTから得られた回答をフィルタリングし、特定のキーワードやフレーズを含む回答のみをメールに含めることができます。これにより、あなたが関心を持っているトピックに関する情報のみを受け取ることができます。

チームへの自動共有

取得した結果を、チーム全体に送信することで、共有された情報に基づいて議論や意思決定を行うことができます。これにより、全員が同じ情報を持っており、効率的なコミュニケーションが可能になります。

Daguについて

Dagu は私が開発しているオープンソースのワークフローツールです。
https://github.com/yohamta/dagu
ノーコードでワークフローを作成できるため、非エンジニアでもビジネスや業務効率化に役立ちます。

事業への導入や相談に関して、依頼あるいは協業パートナーを募集中です。もしご興味がある場合は、Twitterやメールでご連絡ください。

ご質問がありましたら、コメントいただければ回答いたします。

この記事が気に入ったらサポートをしてみませんか?