AIに手足ができる!Zapier Natural Language Actions + LangChainがすごいので試してみた【LangChain・Zapier NLA・OpenAI】

2023.03.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

新規事業統括部Passregiチームの山本です。

3/16にLangChainのサイトで、Zapier Natural Language Actions(以下Zapier NLA)との連携についての記事がありました。

https://blog.langchain.dev/langchain-zapier-nla/

今回は、このページを参考に、簡単な解説や考えたこと、実際に動かしてみた様子について記載しようと思います。

(補足)

実現されること(何がすごいのか)

早速ですが、今回の方法(Zapier NLA + LangChain)でどうなるかについて記載します。実際に実行する手順は、次節の「動かしてみる」をみてください。

状況として、Aさんが「昨日、〇〇から届いたメールを、要約してSlackの✕✕というチャンネルに書いといて」とBさんに指示した場合を考えてみます(後述のサンプルプログラムの処理と同じ内容です)。この時の、人手で行う作業を細字で、プログラムなど自動で行われる処理を太字で表しています。(実際の動きと異なる点もあるかもしれませんが、おおよそは以下の通りかと思います)

すべて人手で行う(今まで)

まずは、全てBさんが行う場合を考えてみます。GmailやSlackなどは素晴らしいサービスですが、この方法だとサービス間を人手でつなげる必要があり、また、要約もBさんが考える必要があります。

  • (Aさんが指示する)
    • Bさんが考えながら操作する
      • Gmailからメールを探す必要があると考える。Web画面から操作して、メールを検索する。それっぽいメールを取り出し内容を見る。
      • メールの内容を要約する必要があると考える。内容を考えて要約する。
      • Slackに投稿する必要があると考える。Slackのアプリを開き、指定されたチャンネルを探し、そこに考えた要約の文章を投稿する

(ChatGPTなどを利用する)

本記事の趣旨とは少しズレますが、最近話題のChatGPTなどのチャットボットを利用して要約をやらせることもできます。こうすると、ほぼ手を動かす作業になって時間を短縮できます。また、要約のスキルも不要になり、ほぼ誰でも作業できるようなります。

  • (Aさんが指示する)
    • Bさんが考えながら操作する
      • Gmailからメールを探す必要があると考える。Web画面から操作して、メールを検索する。それっぽいメールを取り出し内容を見る。
      • メールの内容を要約する必要があると考える。ChatGPTなどのAIに要約してもらう。
      • Slackに投稿する必要があると考える。Slackのアプリを開き、指定されたチャンネルを探し、そこに要約した文章を投稿する

Zapier NLAを利用する

Zapier NLAを利用することで、Web画面やアプリから操作せず、単純な自然言語の指示で実行できるようになります。各サービスを詳しく知らなくても作業ができ、時間も短縮できそうです(今回はGmailとSlackという簡単なものですが、他のサービスでも同様に効率化できそうです)。ただ、依然として、人(Bさん)が指示・操作するという手間が残ります。

  • (Aさんが指示する)
    • Bさんが考えながら操作する
      • Gmailからメールを探す必要があると考える。Zapier NLAに自然言語で指示を出して、Gmailでメールを検索してもらう。
      • メールの内容を要約する必要があると考える。ChatGPTなどのAIに要約してもらう。内容を考えて、要約する。
      • Slackに投稿する必要があると考える。Zapier NLAに自然言語で指示を出して、Slackに投稿してもらう。

Zapier NLA + LangChainを利用する

LangChainのagentを利用することで、何を実行するかまで含めてagentが考えて実行してくれます。これによって、人が考えて操作する、という部分も自動化することができます。(Aさんの指示以降がすべて太字(自動処理)になってしまいました)

  • (Aさんが指示する)
    • LangChain(agent・AI)が考えながら実行する
      • メールを探す必要があると考える。Zapier NLAのactionsからGmailが使えそうなことを見つける。Zapier NLAに自然言語で指示を出して、Gmailでメールを検索してもらう。
      • メールの内容を要約する必要があると考える。内容を要約する。
      • Slackに投稿する必要があると考える。Zapier NLAのactionsからSlackが使えそうなことを見つける。Zapier NLAに自然言語で指示を出して、Slackに投稿してもらう。

つまり

人が指示するだけで、今まで人が行っていた箇所(そもそも何をしなければいけないか考える・各サービスを利用する・その過程で思考が必要な作業を行う)を、AIを使ってすべて自動で実行することができるようになる、という驚きの仕組みです。メタ的な思考・操作までAIに任せてしまおうという発想がすごいですね!

今までChatGPTなどのAIに思考させることはできましたが、結果をもとに各サービスのAPIを実行するには別途プログラムを作成する必要がありました。しかし、Zapier NLAのような仕組みによってAIをそのまま様々なサービスに接続することができ、まさに手足ができたという感じだと思います(少し言い過ぎかもしれませんが)。

(※ 現状だとZapier NLAでactionsの設定は人手で行う必要があります、後述)

動かしてみる

ということで、実際にうごかしてみます。

OpenAI APIキーを取得する

OpenAIに登録し、下のページから発行します。

https://platform.openai.com/account/api-keys

Zapier NLA APIキーを取得する

Zapier NLAのAPIのページにアクセスします

https://nla.zapier.com/api/v1/dynamic/docs

「For Testing or Production (Server-side only mode)」の項目に書かれている通り、「1.」の「Dev App provider」のページにアクセスします。

https://nla.zapier.com/dev/provider/debug/

最初の状態だと、「User」「Information」「User」の箇所が下の画像のようになっているので、「log in here」からログインし、Zapierへのアクセスを許可します。

すると、以下のようにアクセスが許可された状態になり、API Keyが表示されます。

(APIキー確認)

以下のコマンドで、APIキーが有効か確認できます。「」の箇所は上のAPI Keyに書き換えてください。

curl -v \
    -H "Content-Type: application/json" \
    -H "x-api-key: <API_KEY>" \
    'https://nla.zapier.com/api/v1/check/'

(Windows(Windows 10以降?)であれば、以下のコマンドで実行可能です。curlに”.exe”をつけないと、エイリアスされている別のコマンドが実行されてしまい、エラーが出力されます)

curl.exe -v -H "Content-Type: application/json" -H "x-api-key: <API_KEY>" 'https://nla.zapier.com/api/v1/check/'

以下のように表示されれば成功です(user_idの部分は数字が入っていました)

{"success": true, "email": "yamamoto.hiroki@classmethod.jp", "user_id": *******}

実行する

下のガイドにしたがって実行していきます。

https://langchain.readthedocs.io/en/latest/getting_started/getting_started.html

https://langchain.readthedocs.io/en/latest/modules/utils/examples/zapier.html

(必要に応じて、実行するフォルダや、Pythonの仮想環境を作ると良いかと思います)

mkdir test-zapier-nla
cd test-zapier-nla
python -m venv venv
source venv/Scripts/activate

# Windowsの場合
.\venv\Scripts\activate.bat

必要なライブラリをインストールします(手軽で良いですね!)

pip install langchain
pip install openai

上のQuickstart Guideにかかれているように、step 0として使用するアクションを設定しておきます。(この作業が必要なのは、少し違和感がありますね)

https://nla.zapier.com/dev/actions/にアクセスします。(上の説明には”demo”/acionsのページにアクセスするように書かれていますが、おそらく”dev”/actionsのページが今回利用する方です)

以下のようにアクションを2つ作成します。上図下部の「Add a new action」のボタンを押し、Actionや、設定を行い、下図下部の「Enable Action」ボタンを押します。(適宜、各サービスへのアカウントへのアクセスを許可する必要があります。)(各サービスへの連携は、ZapierのMy AppsのConnectionとして管理されているようです。)

下のような状態になればOKです。

上のQuickstart Guideのページのサンプルプログラムを実行してみます。ただ、残念なことに自分は指示に記載されている銀行からメールを受け取ったことはないので、先程、Zapierに登録した際にメールを要約して、Slackのチャンネルに送るようにしてみます(他のサービスを利用した処理を実行させたい場合は、適宜actionを追加し、agent.runの部分を書き換えてください)。

  • プログラム

・の箇所は書き換えてください。APIキーは秘密鍵なので、キーを書いたコードを共有しないように注意してください(コードに直接書くのを避けたい場合は、export・setなどを利用してください)。slack_channel_nameはご自分のSlackに合わせて適宜書き換えてください。

import os

from langchain.llms import OpenAI
from langchain.agents import initialize_agent
from langchain.agents.agent_toolkits import ZapierToolkit
from langchain.utilities.zapier import ZapierNLAWrapper

slack_channel_name = "#zapier-nla-test"

# get from https://platform.openai.com/
os.environ["OPENAI_API_KEY"] = os.environ.get("OPENAI_API_KEY", "<取得したOpenAIのAPIキー>")

# get from https://nla.zapier.com/demo/provider/debug (under User Information, after logging in):
os.environ["ZAPIER_NLA_API_KEY"] = os.environ.get("ZAPIER_NLA_API_KEY", "<取得したZapier NLAのAPIキー>")

llm = OpenAI(temperature=0)
zapier = ZapierNLAWrapper(zapier_nla_api_key=os.environ["ZAPIER_NLA_API_KEY"])
toolkit = ZapierToolkit.from_zapier_nla_wrapper(zapier)
agent = initialize_agent(toolkit.get_tools(), llm, agent="zero-shot-react-description", verbose=True)

# agent.run("Summarize the last email I received regarding Silicon Valley Bank. Send the summary to the #test-zapier channel in slack.")
agent.run(f"Summarize the last email in my gmail regarding 'Zapier API'. Send the summary to the {slack_channel_name} channel in slack.")
  • 実行結果

意図どおり、Slackの指定したチャンネルに、メールの内容が書かれたメッセージが届きました。

(ちなみに元のメールの文面はこれです。元の文章が短いので要約されているかは判断しにくいですが、同様の内容のまま文章が書き換えられていることがわかります。)

また、Pythonでは下のように出力されました。

先程、設定したactionを利用しながら、命令されたことを実行している様子がわかります。(緑色がAgentの思考内容だと思われますが、「Thought」のように、現状や次にやるべきことを解釈・整理しながら、処理されているのがすごいですね!)

考えたことなど

要約などの思考が伴う部分をAIに任せたり、各サービスが利用しやすいように自然言語で実行できるようになってきました。これにより、メタ的な部分も含めてAIに実行させやすくなってきて、こうした自動化が(Zapierにかぎらず)どんどん進んで行きそうです。逆に、こうしたAgentを通して利用してもらえるように、自社サービスなどに自然言語によって実行できるインタフェースを用意するのが主流になるかもしれません(Zapier NLAのように)。

ただ、こういった自動化においてよくあることですが、人手による確認はしておきたい状況は出てくると思います。“大事なことは一旦Slackに確認メッセージを投稿して、確認してから実行してください”みたいな指示もしたいところです(そもそも指示に加えなくても、agentが察して質問してくるようになるかもしれないですね!)。

(Zapierで各サービスとのConnectionを有効化する作業や設定は必要ですが)途中Zapier NLAのActionを作成する必要があったのが、ここは少し想定と違った印象です。指示するAIがZapierのすべてのActionを検索して適切なものを選択すれば、予めActionを用意しなくても指示を実行できそうな気がします(現状Zapier NLAがBeta版なので、そのうち改良されてこの作業が不要になると嬉しいですね(個人の見解です))。

ただしそれだと何でも実行できてしまいそうなので、Connection(サービスを実行する許可)の設定も、実行時に許可を求めるような形になりそうな気がします。現在のスマートフォンのアプリでも、適宜必要な許可を求めるようになっているのと同じ形です。

補足・想定質問・FAQ

  • AI(Agent)が何でも実行できるの?
    • 今回の方法では、Zapier NLAのActionとして作成した(許可した)処理しか実行できなさそうです(気になる方は、更に各ドキュメントを読んでいただけると良いかと思います)
  • Zapierが自然言語で組めるってこと?
    • Zapが自動で作成されるの?という意味であればNoです(3/18現在)。Agentが適宜Actionを実行します。実際、Zapierのマイページの「Zaps」に何か新規で作られたということはありませんでした(そもそもZapsを作る必要が無くなるという側面もあるかと思います。もちろん定型作業であれば、Zapsを作成してOnOffを切り替えたり、ログを残せるので良い面もあります)。そのうちZapsを作成できるようになるかもしれません(個人の見解です)。一旦Agentに実行させて、出力をログからどのActionを利用したか分析して作成するという手もあるかと思います。

まとめ・感想

Zapier Natural Language ActionsとLangChainを使ってみました。それについて簡単な解説をしてみました。

「サービスから情報を取得し、思考が必要な作業を行って、サービスに結果を渡す」という今まで人手で行っていた作業が、指示1つでAIに実行させられるになりました。まさしくAIに手足ができたと言えると思います。

自動化によってますます便利になって効率化されていく中で、そもそも「何をするのか」というところがさらに大事になっていきそうです。

次はZapier NLA+LangChainの2つ目の使い方(OAuth)を試してみたいと思います。