LangChainにおけるAgentとToolについて

機械学習技術 自然言語技術 人工知能技術 デジタルトランスフォーメーション技術 画像処理技術 強化学習技術 確率的生成モデル 深層学習技術 Python 本ブログのナビ
Introduction

ChatGPTとLangChainの概要及びその利用について“で述べたLangChainについて引き続き述べる。前回は、ChatGPTとそれを利用するフレームワークであるLangChainの概要について述べた。今回は、自律的に外部と干渉して言語モデルの限界を超える機能を持つAgentについて述べたいと思う。

LangChainにおけるAgentとToolについて

LangChainの目的の一つは、”GPTの概要とアルゴリズム及び実装例について“でも述べているGPTを用いたChatGPTのような言語モデルではできないタスク、例えば言語モデルが学習した知識の範囲外の情報についての回答や、論理的に複雑なタスク、あるいは計算が必要なタスクなどに対応できるようにすることにある。Agentモジュールはそれらを実現するための強力なツールとなる。

そのような機能を実現するために、Agentモジュールには”Tool”と”Agent”という2つのサブモジュールがある。以下にそれぞれについて述べる

<Tool>

Toolは言語モデル単体ではできないことをできるようにするモジュールであり、目的に合わせた様々な機能がある。ツールは、エージェントが世界と対話するために使用できるインターフェースであり、実態としては以下の情報が組み合わせされたものとなっている。

(1)ツールの名前
(2)ツールが何であるかの説明
(3)ツールへの入力が何であるかのJSONスキーマ
(4)呼び出す関数
(5)ツールの結果をユーザーに直接返すべきかどうか

以下に個々のToolについて述べる。現在、公式ページには61個のツールが掲載されている。

1.Alpha Vantage: 強力で開発者に優しいデータAPIとスプレッドシートのセットを通じて、リアルタイムおよび過去の金融市場データを提供する

2.Apify: Webスクレイピングとデータ抽出のためのクラウドプラットフォームであり、さまざまなWebスクレイピング、クロール、データ抽出のユースケースのためのアクターと呼ばれる1000以上の既製のアプリのエコシステムを提供している。たとえば、Google検索結果、InstagramとFacebookのプロフィール、AmazonやShopifyの製品、Googleマップのレビューなどを抽出するために使用できる。

3. ArXiv: ArxivAPIWrapperを使用して、科学記事や記事に関する情報を取得できる

4.AWS Lambda: エージェントに提供されるツールのリストにAWS
Lambdaを含めることで、必要な目的のためにAWSクラウドで実行されているコードを呼び出す機能をエージェントに付与できる。

5.Bash: エージェントにシェルへのアクセスを与える

6.Bearly Code Interpreter: Bearly Code Interpreterは、コードのリモート実行を可能にする。これにより、エージェントのコードサンドボックスに最適で、コードインタプリタなどの安全な実装が可能になる。

7.Bing Search: MicrosoftのWeb検索エンジンであるbingにアクセスする。

8.Brave Search: Brave Webサイトにアクセスして検索する。

9.ChatGPT Plugins: LangChain抽象化内でChatGPTプラグインを使用する。

10.Connery Action: Conneryは、AIのためのオープンソースのプラグインインフラストラクチャとなる。Conneryを使用すると、一連のアクションを含むカスタムプラグインを簡単に作成し、LangChainエージェントにシームレスに統合できる。Conneryは、ランタイム、承認、秘密管理、アクセス管理、監査ログ、その他の重要な機能などの重要な側面を処理する。

11.Dall-E Image generator: OpenAI Dall-Eは、ディープラーニングの方法論を使用して「プロンプト」と呼ばれる自然言語の説明からデジタル画像を生成するためにOpenAIによって開発されたテキストから画像へのモデル、OpenAI LLMを使用して合成されたプロンプトから画像を生成する。

12.DataForSeo: DataForSeoは、APIを介して包括的なSEOおよびデジタルマーケティングデータソリューションを提供する

13.duck-duck-go search: duck-duck-go検索

14.E2B data analysis: E2Bデータ分析サンドボックスを使用すると、次のことができます。 – Pythonコードを実行する – matplotlibを介してチャートを生成する – 実行中にPythonパッケージを動的にインストールする – 実行中にシステムパッケージを動的にインストールする – シェルコマンドを実行する – ファイルのアップロードとダウンロード

15.EdenAI:エージェントに提供されるツールのリストにEdenaiツールを含めることで、エージェントに次のような複数のタスクを実行する機能を付与できる。(1)スピーチからテキストへ、(2)テキスト読み上げ、(3)テキストの露骨なコンテンツ検出、(4)画像の明示的なコンテンツ検出、(5)物体検出、(6)OCR請求書の解析、(7)OCR IDの解析

16.Eleven Labs Text2Speech: テキスト読み上げ機能を実現するためにElevenLabs APIと対話する

17.Exa search: Exa(旧Metaphor Search)は、LLMが使用するために完全に設計された検索エンジンとなる。自然言語クエリを使用してインターネット上のドキュメントを検索し、目的のドキュメントからクリーンなHTMLコンテンツを取得する。キーワードベースの検索(Google)とは異なり、Exaのニューラル検索機能により、クエリを意味的に理解し、関連文書を返すことができる。

18.File System Tools: PC内のファイルにアクセスし、指定されたパスのファイルの読み込み/書き出しを行う。処理情報の一次保存や情報の読み出しに使う。

19.Golden query:ゴールデンナレッジグラフを使用してクエリとエンリッチメントのための一連の自然言語APIを提供する。例えば、次のようなクエリ。Products from OpenAI、Generative ai companies with series a funding、およびrappers who investは、関連するエンティティに関する構造化データを取得するために使用できる。

20.Google Cloud Text-to-Speech:Google Cloud Text-to-Speechを使用すると、開発者は複数の言語とバリアントで利用可能な100以上の音声で自然な響きの音声を合成できる。

21.Googledrive: LangChainをGoogle Drive APIに接続する。

22.GoogleFinance: Googleファイナンスツールを使用してGoogleファイナンスページから情報を取得する。

23.Google Jobs: Googleジョブツールを使用して現在の求人情報を取得する。

24.Google Lens: Google Lens Toolを使用して画像に関する情報を取得する。

25.Google Place: Google Places APIとつなげる。

26.Google Scholar: Google Scholarとつなげる。

27.Google Search: Google検索コンポーネントとつなげる。

28.Google Serper API: Google Serperコンポーネントを使用してウェブを検索する。

29.Google Trend: Googleトレンドツールを使用してトレンド情報を取得する。

30.Gradio: gradio-toolsは、Gradioアプリを大規模言語モデル(LLM)ベースのエージェントがタスクを完了できるツールに変換するためのPythonライブラリとなる。たとえば、LLMはGradioツールを使用して、オンラインで見つけた音声録音を転写し、それを要約することができる。または、別のGradioツールを使用して、GoogleドライブのドキュメントにOCRを適用し、それに関する質問に答えることもできる。

31.Graph QL: エージェントに提供されるツールのリストにBaseGraphQLToolを含めることで、必要な目的のためにGraphQL APIからデータをクエリする機能をエージェントに付与できます。

32.HuggingFace Hub Tools: テキストI/OをサポートするHuggingface Toolsは、load_huggingface_tool関数を使用して直接読み込むことができる。

33.Human as a tool: 人間はAGIなので、混乱したときにAIエージェントを助けるためのツールとして使用できる。

34.IFTTT WebHooks: IoTデバイスで測定したデータを、Googleスプレッドシートに保存したり、測定したデータに基づいてメール送信したりするために、「IFTTT」というWebサービスを使う。IFTTTは、異なるWebサービス同士を、自動的に連携してくれるWebサービスで、無料で使用できるものとなる。IFTTTは「IF This Then That」の略で、「もし、これをしたら、あれをする」という意味合いです。「This」と「That」にそれぞれ、所望のWebサービスを割り当てることで、プログラミングなどをせずに、新しいサービスを作ることができる。

35.ionic: AIアシスタントのためのプラグアンドプレイeコマースマーケットプレイスで、エージェントにIonicツールを含めることで、エージェント内で直接買い物や取引を行う機能をユーザーに簡単に提供し、取引のカットを得ることができる。

36.Lemon agent: Lemon Agentは、Airtable、Hubspot、Discord、Notion、Slack、Githubなどのツールで正確で信頼性の高い読み取りおよび書き込み操作を可能にすることで、数分で強力なAIアシスタントを構築し、ワークフローを自動化するのに役立ちます。今日利用可能なほとんどのコネクタは、読み取り専用操作に焦点を当てており、LLMの可能性を制限しており、Lemon AIを使用すると、エージェントが信頼性の高い読み取りおよび書き込み操作のために明確に定義されたAPIにアクセスできるようにすることができる。

37.LLMath: 言語モデルが苦手としている計算を行うtool

38.memorize: 教師なし学習を使用して情報を記憶するためにLLM自体を微調整する。このツールには、微調整をサポートするLLMが必要となる。現在、langchain.llms import GradientLLMのみがサポートされている。

39.Nuclia:Nuclia Understanding APIは、テキスト、Webページ、ドキュメント、オーディオ/ビデオコンテンツなどの非構造化データの処理をサポートする。どこにいてもすべてのテキストを抽出し(必要な場合は音声テキストまたはOCRを使用)、エンティティを識別し、メタデータ、埋め込みファイル(PDFの画像など)、およびWebリンクも抽出し、また、コンテンツの要約も提供している。

40.OpenWeatherMap : OpenWeatherMapコンポーネントを使用して気象情報を取得する。

41.Polygon Stock Market API: Polygon Polygon.io Stocks APIは、すべての米国証券取引所から最新の市場データを照会できるRESTエンドポイントを提供する。

42.PubMed:PubMedは、MEDLINE、ライフサイエンスジャーナル、オンライン書籍からの生物医学文献の3500万以上の引用で構成されている。引用には、PubMed Centralおよびパブリッシャーのウェブサイトからの全文コンテンツへのリンクが含まれる。

43.Python REPL:場合によっては、複雑な計算では、LLMが直接答えを生成するのではなく、LLMが答えを計算するコードを生成し、そのコードを実行して答えを得る方が良い場合がある。簡単にそれを行うために、コマンドを実行するためのシンプルなPython REPLを提供している。このインターフェイスは、印刷されたもののみを返します。したがって、回答を計算するために使用する場合は、必ず回答を印刷する。

44.Reddit search:Reddit検索ツールへの接続。

45.Requests: 指定されたURLへリクエストを送信する。主にWebサイトの情報を取得したり、APIから情報を取得したりする。そのトピックに特化したサブレディットがある。そこにアクセスすれば、そのトピックに関心のある人、つまりターゲット市場に含まれていると思われる人がどんなことを語っているのかを見つけられる。ウェブには、LLMがアクセスできない多くの情報が含まれています。LLMがその情報と簡単に対話できるように、URLを取り込み、そのURLからデータを取得するPythonリクエストモジュールのラッパーを提供します。

46.SceneXplain:SceneXplainは、SceneXplainツールからアクセスできるImageCaptioningサービス。

47.Search Tools:さまざまな検索ツールの使用。

48.SearchApi:SearchApiを使用してウェブを検索する。

49.SearxNG Search API : セルフホストのSearxNG検索APIを使用してウェブを検索する。

50.SerpAPI: GooleやYahoo検索をAPIから行うSerpApiというwebサービスと連携し、ウェブを検索する。

51.semantic scholar API:エージェントでセマンティック・スカラー・ツールを使用する

52.SQL database:ユーティリティを使用してSQLiteデータベースにアクセスする。

53.StackExchange:スタック交換コンポーネントの使用。

54.Tavily Search:TavilyのSearch APIは、AIエージェント(LLM)のために特別に構築された検索エンジンで、リアルタイム、正確、事実に基づいた結果を迅速に提供する。

55.Twilio:Twilio Messaging Channelsは、サードパーティのメッセージングアプリとの統合を容易にし、WhatsApp Business Platform(GA)、Facebook Messenger(パブリックベータ)、Google Business Messages(Private Beta)を通じてメッセージを送信できる。

56. Wikidata: ウィキデータはフリーでオープンな知識ベースであり、人間も機械も読み、編集することができる。ウィキデータは世界最大のオープンな知識ベースの一つとなる。

57.Wikipedia : 人間と機械の両方が読み、編集できる自由でオープンな知識ベースです。ウィキデータは、世界最大のオープンナレッジベースの1つとなる。

58.Wolfram Alpha: ウルフラムアルファコンポーネントの使用。

59.Yahoo Finance News:エージェントでyahoo_finance_newsツールを使用する。

60.Youtube: YouTube検索パッケージは、大幅にレート制限されたAPIを使用してYouTube動画を検索する。

61.Zapier Natural Language Actions API: Zapier自然言語アクションを使用すると、自然言語APIインターフェイスを介して、Zapierのプラットフォーム上の5k以上のアプリ、20k以上のアクションにアクセスできる。NLAは、Gmail、Salesforce、Trello、Slack、Asana、HubSpot、Google Sheets、Microsoft Teams、その他何千ものアプリをサポートしている。

<Agent>

Agentは、プロンプトの内容に応じてツールを使い分け、自動で解法を生成してくれるロボットの機能を持つ。基本的なステップとしては以下のようになる。

1.ユーザーからのタスクを受け取る
2. 用意されているツールの中から、どれを使うべきか、どんな情報を入力するかを決める
3. Toolを使って結果を得る
4. 3で得られた結果から、タスクが達成できているかを検証する
5. タスクが達成できたとAgentが判断するまで、2から4のステップを繰り返す

現時点では4種類のAgentが存在している。

1. zero-shot-react-description: zero-shot-react-descriptionとは、「ツールの説明文章などから、どのツールを用いるかを決めるAgent」のことで、このツールを用いるためには、各ツールのdescriptionがしっかりと書かれている必要がある。

2. react-docstore: react-docstoreとは、「文書を扱うことに特化したAgent」具体的には、「Searchツールという文書自体を探すツール」と「Lookupツールという文書内で用語を探すツール」

3. self-ask-with-search: self-ask-with-searchとは、「質問に対する答えを事実に基づいて調べてくれるAgent」Google検索APIなどのツールを用いて、検索結果などの何かしらの根拠となる中間的な回答を利用し、質問に対する回答を生成する。

4. conversational-react-description: conversational-react-descriptionとは、「会話を扱うことに特化したAgent」過去のChat上のやりとりを用いて最適な回答を生成する。

ここでのreactは”ReAct(Reasoning and Acting)の概要とその実装例について“で述べているReasoning  Acting」を意味する。

Tool、Agentの実装例

以下のコードはURLにアクセスできるToolを持ったAgentとなる。環境立ち上げ及び、必要なライブラリは、前回の”ChatGPTとLangChainの概要及びその利用について“を参照のこと。

from langchain.agents import AgentType, initialize_agent, load_tools
from langchain_community.chat_models import ChatOpenAI

chat = ChatOpenAI(
    temperature=0,  #← temperatureを0に設定して出力の多様性を抑える
    model="gpt-3.5-turbo"
)

tools = load_tools(  #← LangChainに用意されているToolを読み込む
    [
        "requests",  #← 特定のURLの結果を取得できるToolであるrequestsを読み込む
    ]
)

agent = initialize_agent(  #← Agentを初期化する
    tools=tools,  #← Agentが使用することができるToolの配列を設定
    llm=chat,  #← Agentが使用する言語モデルを指定
    agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,  #←ReAct方式で動作するように設定する
    verbose=True  #← 実行途中のログを表示する
)

result = agent.run("""以下のURLにアクセスして東京の天気を調べて日本語で答えてください。
https://www.jma.go.jp/bosai/forecast/data/overview_forecast/130000.json
""") print(f"実行結果: {result}")

このコードを実行することにより、以下のような出力を得る。

> Entering new AgentExecutor chain...
Question: Please access the following URL and find out the weather in Tokyo in Japanese.
Thought: I should use the requests_get tool to access the provided URL and retrieve the weather information for Tokyo.
Action:
```
{
  "action": "requests_get",
  "action_input": "https://www.jma.go.jp/bosai/forecast/data/overview_forecast/130000.json"
}
```

Observation: {"publishingOffice":"気象庁","reportDatetime":"2024-02-29T10:45:00+09:00",
"targetArea":"東京都","headlineText":"","text":" 東日本は高気圧に覆われています。
一方、東シナ海には低気圧があって、北東へ進んでいます。\n\n 東京地方は、曇りや晴れとなっています。
\n\n 29日は、はじめ高気圧に覆われますが、低気圧が西日本の南岸を東北東へ進み、湿った空気の影響を
受ける見込みです。このため、晴れのち曇りで夜は雨となるでしょう。伊豆諸島では、雨で雷を伴う所がある見込み
です。\n\n 3月1日は、低気圧が東日本の南岸から日本の東へ進み、次第に西高東低の気圧配置となる見込みです。
このため、曇りで明け方まで雨となるでしょう。伊豆諸島では、雨で、雷を伴って激しく降る所がある見込みです。\n\n
【関東甲信地方】\n 関東甲信地方は、晴れや曇りとなっています。\n\n 29日は、はじめ高気圧に覆われますが、
低気圧が西日本の南岸を東北東へ進み、湿った空気の影響を受ける見込みです。このため、曇りや晴れで、夕方から
次第に雨や雪となり、雷を伴う所があるでしょう。\n\n 3月1日は、低気圧が東日本の南岸から日本の東へ進み、
次第に西高東低の気圧配置となる見込みです。このため、はじめ雨や雪となり、雷を伴い激しく降る所があるでしょう。
その後は、曇りや晴れで、関東地方北部や長野県では雪の降る所がある見込みです。\n\n 関東地方と伊豆諸島の海上では、
29日から3月1日にかけて、うねりを伴いしけとなるでしょう。船舶は高波に注意してください。"}
Thought:Final Answer: 東京地方は、曇りや晴れとなっています。29日は、はじめ高気圧に覆われますが、
低気圧が西日本の南岸を東北東へ進み、湿った空気の影響を受ける見込みです。このため、晴れのち曇りで夜は
雨となるでしょう。伊豆諸島では、雨で雷を伴う所がある見込みです。3月1日は、低気圧が東日本の南岸から
日本の東へ進み、次第に西高東低の気圧配置となる見込みです。このため、曇りで明け方まで雨となるでしょう。
伊豆諸島では、雨で、雷を伴って激しく降る所がある見込みです。

> Finished chain.
実行結果: 東京地方は、曇りや晴れとなっています。29日は、はじめ高気圧に覆われますが、
低気圧が西日本の南岸を東北東へ進み、湿った空気の影響を受ける見込みです。このため、
晴れのち曇りで夜は雨となるでしょう。伊豆諸島では、雨で雷を伴う所がある見込みです。
3月1日は、低気圧が東日本の南岸から日本の東へ進み、次第に西高東低の気圧配置となる見込みです。
このため、曇りで明け方まで雨となるでしょう。伊豆諸島では、雨で、雷を伴って激しく降る所がある見込みです。

ここでは、Langchainの「request」Toolを指定し、特定のURLからの情報を取得している。また、コード中のverboseをTrueにしているので、処理中のログも出力されている。

次に複数のToolを組み合わせたサンプルについて示す。ここでは「SerPAPI」というGoogleやその他の検索エンジンから検索結果をAPIで取得できるサービス(予めSerpApi(https://serpapi.com/にてsubscribeしてAPIキーを取得して、環境変数に設定する必要がある。またgoogleの検索結果をハンドリングするためのライブラリをインストールする(pip install google-search-result)必要がある)と、「File」というツールで結果を出力することを行なっている。

from langchain.agents import AgentType, initialize_agent, load_tools  #←load_toolsをインポートを追加
from langchain.chat_models import ChatOpenAI
from langchain.tools.file_management import WriteFileTool  #←ファイル書き込みできるToolをインポート

chat = ChatOpenAI(
    temperature=0,
    model="gpt-3.5-turbo"
)

tools = load_tools(
    [
        "requests_get",
        "serpapi" #←serpapiを追加
    ],
    llm=chat
)

tools.append(WriteFileTool( #←ファイル書き込みできるToolを追加
    root_dir="./"
))

agent = initialize_agent(
    tools,
    chat,
    agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,  #←Agentのタイプを変更
    verbose=True
)

result = agent.run("北海道の名産品を調べて日本語でresult.txtというファイルに保存してください。") #←実行結果をファイルに保存するように指示

print(f"実行結果: {result}")

このコードを動作されると以下のような結果を得る。

> Entering new AgentExecutor chain...
Thought: I will use the Search tool to find information about Hokkaido's 
famous products in Japanese and then save the results in a file named "result.txt".

Action:
```
{
  "action": "Search",
  "action_input": "北海道の名産品"
}
```
Observation: ['北海道には、鮭やホタテ、昆布などの海産物、牛肉や乳製品、じゃがいもなどの農産物ともに、
日本国内トップクラスの生産量を誇る特産品がたくさんあります ...', '北海道の名産品・グルメ人気お取り寄せ
ランキング · 北海道産 カニ · 北海道産 鮭 · 北海道産 山わさび · 北海道産 米 · 北海道産 メロン · 
北海道産 じゃがいも.', '北海道はオホーツク海・日本海・太平洋という3種類の海に囲まれているため、
各地で獲れる海産物の種類が豊富です。 さらに、北海道は土地が広いので、牧場も多く、新鮮な乳製品も有名な
特産品です。 北海道はカニの漁獲量が日本一です。 タラバガニ、ズワイガニ、毛ガニ、花咲ガニなど、
さまざまな種類の ...', '北海道の名物グルメ5選【ご当地グルメ】 · ジンギスカン · ザンギ · スープカレー
 · エスカロップ · 豚丼. 今や全国区で知られる豚丼です ...', '豊かな食材と各地の風土が生んだ「ラーメン」
\u200b\u200b 北海道三大ラーメンといえば札幌の「味噌ラーメン」、函館の「塩ラーメン」、旭川の
「醤油ラーメン」。 このほかにも、釧路や富良野、稚内、帯広など、道内の各地に地域の風土にマッチした麺や
スープを楽しめる、さまざまなご当地ラーメンが存在します。', '北海道のおすすめのご当地グルメや名物・名産品、
お土産をご紹介します。ちゃんちゃん焼き、ルイベ、阿寒のアイヌ料理など情報満載。', '北海道グルメの代表格と
言えばウニやイクラをはじめとする新鮮な海産物。 それらを使った丼や寿司、郷土料理などを楽しみたい。 
回転寿司店も侮ることなかれ、北海道はレベルが高いのだ。 本場のジンギスカンや出来立ての乳製品、ラーメンも
外せない。', '北海道グルメ④【ご当地グルメ】 · 郷土料理「ザンギ」 · ソウルフード「ジンギスカン」 · 
冬の定番鍋「石狩鍋」 · 帯広名物「豚丼」 · 釧路名物「 ...', '函館真昆布 春採り昆布(食べる真昆布) 
ガゴメ昆布 スルメイカ 活〆戸井マグロ 一本釣り活〆戸井ブリ 一本釣り活〆えさん真鱈 海峡根ボッケ「バキバキ」
 鮭 ...']
Thought:I have found information about Hokkaido's famous products in Japanese. Now,
 I will save this information in a file named "result.txt".

Action:
```
{
  "action": "write_file",
  "action_input": {
    "file_path": "result.txt",
    "text": "北海道には、鮭やホタテ、昆布などの海産物、牛肉や乳製品、じゃがいもなどの農産物ともに、
日本国内トップクラスの生産量を誇る特産品がたくさんあります ... 北海道の名産品・グルメ人気お取り寄せ
ランキング · 北海道産 カニ · 北海道産 鮭 · 北海道産 山わさび · 北海道産 米 · 北海道産 メロン · 
北海道産 じゃがいも. 北海道はオホーツク海・日本海・太平洋という3種類の海に囲まれているため、
各地で獲れる海産物の種類が豊富です。 さらに、北海道は土地が広いので、牧場も多く、新鮮な乳製品も
有名な特産品です。 北海道はカニの漁獲量が日本一です。 タラバガニ、ズワイガニ、毛ガニ、花咲ガニなど、
さまざまな種類の ... 北海道の名物グルメ5選【ご当地グルメ】 · ジンギスカン · ザンギ · スープカレー · 
エスカロップ · 豚丼. 今や全国区で知られる豚丼です ... 豊かな食材と各地の風土が生んだ「ラーメン」
\u200b\u200b 北海道三大ラーメンといえば札幌の「味噌ラーメン」、函館の「塩ラーメン」、旭川の
「醤油ラーメン」。 このほかにも、釧路や富良野、稚内、帯広など、道内の各地に地域の風土にマッチした麺や
スープを楽しめる、さまざまなご当地ラーメンが存在します。 北海道のおすすめのご当地グルメや名物・名産品、
お土産をご紹介します。ちゃんちゃん焼き、ルイベ、阿寒のアイヌ料理など情報満載。 北海道グルメの代表格と
言えばウニやイクラをはじめとする新鮮な海産物。 それらを使った丼や寿司、郷土料理などを楽しみたい。 
回転寿司店も侮ることなかれ、北海道はレベルが高いのだ。 本場のジンギスカンや出来立ての乳製品、ラーメンも
外せない。 北海道グルメ④【ご当地グルメ】 · 郷土料理「ザンギ」 · ソウルフード「ジンギスカン」 · 
冬の定番鍋「石狩鍋」 · 帯広名物「豚丼」 · 釧路名物「 ... 函館真昆布 春採り昆布(食べる真昆布) 
ガゴメ昆布 スルメイカ 活〆戸井マグロ 一本釣り活〆戸井ブリ 一本釣り活〆えさん真鱈 海峡根ボッケ「バキバキ」
 鮭 ...",
    "append": false
  }
}
```

Observation: File written successfully to result.txt.
Thought:{
  "action": "Final Answer",
  "action_input": "I have successfully saved information about Hokkaido's famous products in Japanese to a file named 'result.txt'."
}

> Finished chain.
実行結果: {
  "action": "Final Answer",
  "action_input": "I have successfully saved information about Hokkaido's famous products in Japanese to a file named 'result.txt'."
}

問題なく動作するとresult.txtファイルに結果が出力される。

最後にToolを自作して加えるサンプルコードについ述べる。自作のツールも以下のように、名前、機能説明、実行関数を定義すると利用することが可能となる。

tool{
   name="名前",
   description="機能説明",
   func=実行関数
}

この作法は、”セマンティックウェブ技術“で述べているSemantic Web技術を用いたIOT技術であるWoT、あるいはセマンティックウェブサービスに近いものとなる。

サンプルコードは以下のようになる。ここでは自作ツールとしてランダムな数字を生成するものを定義している。

import random  #←ランダムな数字を生成するために必要なモジュールをインポート
from langchain.agents import AgentType, Tool, initialize_agent  #←Toolをインポート
from langchain.chat_models import ChatOpenAI
from langchain.tools import WriteFileTool

chat = ChatOpenAI(
    temperature=0,
    model="gpt-3.5-turbo"
)

tools = [] #← 他のツールは不要なので一旦削除する

tools.append(WriteFileTool( 
    root_dir="./"
))

def min_limit_random_number(min_number): #←最小値を指定できるランダムな数字を生成する関数
    return random.randint(int(min_number), 100000)


tools.append(  #←ツールを追加
    Tool(
        name="Random",  #←ツール名
        description="特定の最小値以上のランダムな数字を生成することができます。",  #←ツールの説明
        func=min_limit_random_number  #←ツールが実行された時に呼び出される関数
    )
)

agent = initialize_agent(
    tools,
    chat,
    agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,  
    verbose=True
)

result = agent.run("10以上のランダムな数字を生成してrandom.txtというファイルに保存してください。")

print(f"実行結果: {result}")

これらを用いることで非常に強力なソリューションを簡易に構築することができる。しかしながら、これらのChainは指向性非巡回グラフ(DAG)でありループを持っていない。より複雑で制御されたフローを構築するには、”オートマトン理論の概要と実装、参考図書“や、”有限状態マシン(FSM:Finite State Machine)の概要と実装、参考図書“で述べているようなステートマシンを用いてループを構成する必要がある。

それらを用いたマルチエージェントアプローチに関しては次回述べることとする。

参考情報と参考図書

ChatGPT/LangChainによるチャットシステム構築[実践]入門

LangChain完全入門 生成AIアプリケーション開発がはかどる大規模言語モデルの操り方

コメント

  1. […] LangChainにおけるAgentとToolについて […]

  2. […] LangChainにおけるAgentとToolについて […]

  3. […] ReActは”プロンプトエンジニアリングの概要とその利用について“で述べているプロンプトエンジニアリングの手法の一つであり、”LangChainにおけるAgentとToolについて“で述べているLangChainのエージェントの活用のシーンでも利用されているものとなる。 […]

タイトルとURLをコピーしました