💭

Zapier Natural Language Actions (NLA) APIを試してみる

2023/05/01に公開

はじめに

LLM(大規模言語モデル)を扱う際のライブラリの筆頭であるLangChainには、日進月歩で様々なTool[1]テンプレートが追加されています。

Google Search、DuckDuckGo Search[2]、IFTTT WebHooksなどいろいろありますが、その仲間にZapier Natural Language Actions APIがあります。
https://python.langchain.com/en/latest/modules/agents/tools.html

https://platform.zapier.com/zapier_products/natural-language-actions-api

Agentにおいて、LLMと外部AIの連携は、

と、APIごとにCustum Toolをコーディングしてスキーマに合うリクエストになるようにヘルプしてあげる必要があります。

一方、Zapier NLAを使うと間にある正規表現マッチ、コード変換をパスして自然言語での接続ができそうです。(たぶん)

つまり、Zapier NLAを使うことでLLMと外部APIが自然言語のまま連携でき、LangChainで実装したLLM AgentとGmailやGoogle Drive、その他のサービス間のIntegrationが捗りそうです。

ということで、まずZapier NLA単体から試してみました。

🐍TL;DR

下記を行います。

  • Zapier Natural Language Actions (NLA) とは
  • セットアップ(APIキーによる認証)
  • 連携(Gmail, Toggl Track, ChatGPT)
  • VSCodeで実行

参考文献

...完全に類似の先行記事がありましたので、そちらも参照してください。
https://dev.classmethod.jp/articles/demo-zapier-nla/

Langchain連携も試されていますね。
https://dev.classmethod.jp/articles/tried-langchain-with-zapier-nla/

ZennにZapier NLAの記事がなかったので、Zennコミュニティの目に触れれば、と屋上屋を架します。
Zennはクラスメソッドのものなんですけどね。

🌳環境

  • Windows 11
  • VSCode
  • 拡張機能Thunder Client
    • PostmanのようにHTTPリクエストを試す際に便利です。シンプルで使いやすい。

🪛セットアップ

Zapierのアカウント作成

もしまだであれば。

APIキーを取得

下記にアクセスすることで簡単に取得できます。
https://nla.zapier.com/get-started/

OAuth認証については本稿では触れません。

ドキュメントを開く

何事もドキュメントから。
https://nla.zapier.com/api/v1/docs

おさえておくのはこのあたり。

  • 自然言語をインターフェースにすることでユーザー、開発者、LLMに使いやすいAPI
  • 必須フィールドはAI推論(AI guess)される。推論しないようにユーザー設定も可能。オプションフィールドもAI推論、ユーザー設定が選べる
    • APIのスキーマを読まなくて済む。
    • Hallucinationが許されないフィールドは事前設定が可能
  • 与えるパラメーターは、連携先に関わらず自然言語によるinstructionsのみ。

APIキーによる認証を確認(GET)

接続できるか検証するため、https://nla.zapier.com/api/v1/check/を叩いてみます。

Thunder Clientを開きます。ピカチュウのしっぽのアイコンです。

Commitしようね。

認証はx-api-keyヘッダ。

result
{
  "success": true,
  "email": "hoge@example.com",
  "user_id": 12345678
}

アクションを設定

設定ページ(https://nla.zapier.com/get-started/) に戻り、"Manage Actions"を開きます。

📨Gmail

Gmail送信との連携

ポップアップが出てくるので、アクションを検索し、

"Add a new Action"

フィールド設定画面に推移します。

必須フィールドはAI guessになっていますが、To先だけは怖いので、自分のアドレスにしました。

"Enable Action"で設定完了です。

⏰時間管理アプリ:Toggl Track

もうひとつ、よく使っている時間管理アプリ、Toggl Trackも連携させてみます。(エントリの作成)
https://zenn.dev/ptna/articles/347d5239a01c1d

Toggl Trackとの連携

AIさんにGuessってもらいます。

セットアップは以上です。

Action IDを取得する(GET)

https://nla.zapier.com/api/v1/dynamic/exposed/をGETで叩いてActionIDを取得します。

結果
result
{
  "results": [
    {
      "id": "XXXXXXXXXXXXX",
      "operation_id": "toggl_create_time_entry_1990805",
      "description": "Toggl: Create Time Entry",
      "params": {
        "instructions": "str",
        "Created_With": "str",
        "Duration": "str",
        "Start": "str",
        "Workspace": "str"
      }
    },
    {
      "id": "XXXXXXXXXXXXX",
      "operation_id": "gmail_send_email_3aee697",
      "description": "Gmail: Send Email",
      "params": {
        "instructions": "str",
        "Body": "str",
        "Cc": "str",
        "Subject": "str"
      }
    }
  ],
  "configuration_link": "https://nla.zapier.com/demo/actions/"
}

Actionを実行する(POST)

下記のエンドポイントにidをセットし、POSTします。
https://nla.zapier.com/api/v1/dynamic/exposed/<ACTION_ID>/execute/

📨Gmail

Gmailの実行

instructionsプロパティをもつJSONペイロードを設定します。

実行するとメールが届きます。

結果を見ると、input paramが自動設定されていることがわかります。

result
{
  "id": "XXXXXXXXXXXXXXXXX",
  "action_used": "Gmail: Send Email",
  "input_params": {
    "To": "hoge@example.com",
    "Subject": "Good Night",
    "Body": "Good Night"
  },
  "review_url": "https://nla.zapier.com/execution/01GZ89XDD9CMSMCCZZACP1JBFW/",
  "result": null,
  "additional_results": [],
  "result_field_labels": {},
  "status": "error",
  "error": "Error during execution: The value in the \"To\" field is invalid.",
  "assistant_hint": null
}

⏰Toggl Track

Toggl Trackの実行

こちらも同様にinstructionsをペイロードにPOSTします。

request body
{
 "instructions":"create an new Entry. Description is 'testing Zapier NLA'. Started an hour before. Project should not be specified."
}

エントリーが作成されました。

プロジェクトがno projectになりません。。

🗨️ChatGPT

最後にChatGPTとの連携も試してみます。

Togglと同様、APIキーを設定するだけ。

instructionsに聞きたいことを指定します。

request_body
{
  "instructions":"Quote the most famous line from the poems of William Blake"
}
結果
response
{
  "id": "xxxxxxxxxxxxxxx
  "action_used": "ChatGPT: Conversation",
  "input_params": {
    "User_Message": "\"To see a world in a grain of sand, and a heaven in a wild flower\""
  },
  "review_url": "https://nla.zapier.com/execution/01GZ8262CERACPPKYTJCZTZPAZ/",
  "result": {
    "history[]content": "\"To see a world in a grain of sand, and a heaven in a wild flower\", This is a quote from the English poet William Blake, from his poem \"Auguries of Innocence.\" The line suggests that one can find beauty and meaning in the smallest and simplest of things, and that there is a connection and harmony between all things in the world, no matter how different they may seem.",
    "response__role": "assistant",
    "history_context__tokens_used": "34",
    "request__role": "user",
    "history_context__was_trimmed": "false",
    "history_context__tokens_remaining": "3966",
    "history[]role": "user, assistant"
  },
  "additional_results": [],
  "result_field_labels": {
    "request__role": "User Role",
    "response__role": "Assistant Role"
  },
  "status": "success",
  "error": null,
  "assistant_hint": null
}

あれ...、ChatGPTヘの入力が

"To see a world in a grain of sand, and a heaven in a wild flower"

となって、instructionsから推論されたうえでの入力になっています。したがって回答も

To see a world in a grain of sand, and a heaven in a wild flower\", This is a quote from the English poet William Blake, from his poem \"Auguries of Innocence.\" The line suggests that one can find beauty and meaning in the smallest and simplest of things, and that there is a connection and harmony between all things in the world, no matter how different they may seem.

となっています。

つまり、User MessageがNLAでまず推論され、推論結果がChatGPTに投げ込まれる二段階になるようです。

別のinstructionsを試してみます。

response
{
  "instructions":"Ask gpt about the largest Japanese piano competition"
}

日本で最大のピアノコンペティションについて聞いてみました。

結果
response
{
  "id": "XXXXXXXXXXXXXXXXXXXXX",
  "action_used": "ChatGPT: Conversation",
  "input_params": {
    "User_Message": "What is the largest Japanese piano competition?"
  },
  "review_url": "https://nla.zapier.com/execution/01GZ83C30TE71FTXZFT8G1D03A/",
  "result": {
    "history[]content": "What is the largest Japanese piano competition?, The largest Japanese piano competition is the Hamamatsu International Piano Competition. It is held in Hamamatsu city every three years and is one of the most prestigious and renowned piano competitions in the world.",
    "response__role": "assistant",
    "request__role": "user",
    "history_context__was_trimmed": "false",
    "history_context__tokens_used": "24",
    "history_context__tokens_remaining": "3976",
    "history[]role": "user, assistant"
  },
  "additional_results": [],
  "result_field_labels": {
    "request__role": "User Role",
    "response__role": "Assistant Role"
  },
  "status": "success",
  "error": null,
  "assistant_hint": null
}

質問は、"What is the largest Japanese piano competition?"に少し推論されています。
回答は浜コンこと浜松国際ピアノコンクール。

ピティナさんじゃないってよ。

「世界でも最大規模のコンクール」(最大"規模")

いろいろいじってみましたが、NLAによる推論がどのように活用できるのか、適切なユースケースに思い至りませんでした。LangChainとの連携を考えるとあまり使わないかもしれません。

つまずいたところ

とくにないですが、TogglとのIntegrationで少しつまずきました。

  • Actionの設定を更新するとAction IDが変わります。
  • "Show all options" の中も確認。大事な項目がDo not include a value for this fieldになっていたりします。

おわりに

以上、Zapier NLAを用いてGmail, Toggl Track、ChatGPTで遊んでみました。

Zapier NLAによって、LLMの自然言語によるアウトプットをparseせず、そのままinstructionsという単一パラメーターに突っ込めば、あとはよしなに外部連携を捌いてくれます。
外部APIのスキーマを読んで、LLMの回答をフィールドにparseして、APIを叩くコードを書く手間を省けるので、いろいろな外部連携を試すのに便利そうです。

Web上にまだNLAのユースケースが多くは出ていないので、ぜひ試してみてください。

脚注
  1. Agentが問題解決のための外部情報に接続するために利用できるもの。 ↩︎

  2. Google Custom Searchと異なりAPIキー不要、無料のため開発用に便利です。 ↩︎

Discussion