見出し画像

OpenAIのFunction calling機能を活かした、LangChain 「OpenAI Functions Agent」を試す

LangChainから、従来のMRKL Agentのツール選択にOpenAI の 関数呼び出し機能を活用した新たなAgentが公開されていました。

早速試してみます

  • 公式サンプルを少しアレンジしながら google colab で試してみます。

インストールほか

# ライブラリーのインストール
!pip install langchain==0.0.200
!pip install openai
!pip install google-search-results
!pip install wolframalpha

# 環境変数の準備
import os
os.environ["OPENAI_API_KEY"] = "YOUR API KEY"
os.environ["SERPAPI_API_KEY"] = "YOUR API KEY"
os.environ["WOLFRAM_ALPHA_APPID"] = "YOUR API KEY"

# サンプルDB
!wget https://www.sqlitetutorial.net/wp-content/uploads/2018/03/chinook.zip
!unzip chinook.zip

# 必要ライブラリインポート
from langchain import SerpAPIWrapper, SQLDatabase, SQLDatabaseChain
from langchain.utilities.wolfram_alpha import WolframAlphaAPIWrapper
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType
from langchain.chat_models import ChatOpenAI

Agentの定義

従来のLangChainのAgent定義から基本的に変更ありません。
インスタンス初期化時(一番下の行)に、AgentType.OPENAI_FUNCTIONSを指定します。

# Function colling対応のモデルを指定
llm = ChatOpenAI(temperature=0.0, model="gpt-3.5-turbo-0613")

# SQLデータベースのサンプル
db = SQLDatabase.from_uri("sqlite:////content/chinook.db")

# toolのインスタンス
search = SerpAPIWrapper()
wolfram = WolframAlphaAPIWrapper()
db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)

# ツールの準備
tools = [
    Tool(
        name = "Search",
        func=search.run,
        description="useful for when you need to answer questions about current events. You should ask targeted questions"
    ),
    Tool(
        name="WolframAlpha",
        func=wolfram.run,
        description="useful for when you need to answer questions about math and science"
    ),
    Tool(
        name="MusicSales-DB",
        func=db_chain.run,
        description="useful for when you need to answer questions about MusicSales. Input should be in the form of a question containing full context"
    )
]

# AgentType.OPENAI_FUNCTIONSを指定
mrkl = initialize_agent(tools, llm, agent=AgentType.OPENAI_FUNCTIONS, verbose=True)

実行サンプル(その1)

mrkl.run("一番売れてるアーティスト名を調べて")

> Entering new  chain...
Invoking: `MusicSales-DB` with `What is the best-selling artist?`

> Entering new  chain...
What is the best-selling artist?
SQLQuery:SELECT artists.Name, COUNT(invoice_items.TrackId) AS TotalSales
FROM artists
JOIN albums ON artists.ArtistId = albums.ArtistId
JOIN tracks ON albums.AlbumId = tracks.AlbumId
JOIN invoice_items ON tracks.TrackId = invoice_items.TrackId
GROUP BY artists.Name
ORDER BY TotalSales DESC
LIMIT 1
SQLResult: [('Iron Maiden', 140)]
Answer:The best-selling artist is Iron Maiden with 140 total s
> Finished chain.

The best-selling artist is Iron Maiden with 140 total sales.一番売れているアーティストはIron Maidenです。総売上数は140です。

> Finished chain.
'一番売れているアーティストはIron Maidenです。総売上数は140です。'

実行サンプル(その2)

mrkl.run("現在の日本の総理大臣の年齢の10を底とした対数をとって")

> Entering new  chain...
Invoking: `Search` with `{'query': '現在の日本の総理大臣の年齢'}`
65 years (July 29, 1957)
Invoking: `WolframAlpha` with `{'input': 'log(65, 10)'}`
Assumption: log(65, 10)
Answer: log(10)/log(65) 現在の日本の総理大臣の年齢の10を底とした対数は、おおよそ1.812です。

> Finished chain.
'現在の日本の総理大臣の年齢の10を底とした対数は、おおよそ1.812です。’

まとめ・感想

  • OpenAI APIの機能追加を受けて LangChain 側の実装がどうなるのか興味がありましたが、今までのLangChainの開発方針を踏襲して、とても自然な形で機能が実装されています。

  • 今回のAgentを使うことで、従来のAgentに比べて、明らかに動作がキビキビした動作です。今までAgentの動作は少しもっさりしている印象でしたし、動作が不安定な時もありました。これなら安心して実戦?で使える!すばらしい。😀

LangChainの作者さん、貢献者の方々のパワー、鬼速い開発スピードにはただただ驚くばかりです。

現場からは以上です。


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