watsonx.aiによりPythonでGranite-3.0-8B-Instructを使用したLangChainツールの呼び出し

著者

Anna Gutowska

AI Engineer, Developer Advocate

IBM

このチュートリアルでは、ReActエージェント用に事前構築されたLangChainツールを使用し、各ツールに適切なユースケースを区別する機能を紹介します。主にオープンソースのLangChain Pythonパッケージを使用します。

ツール呼び出しとは

ツール呼び出し (関数呼び出し) は、人工知能(AI)エージェントが、トレーニング済みの大規模言語モデル(LLM) では利用できない最新の情報を必要とする特定のタスクを実行できるようにするインターフェースです。IBM Graniteモデルや OpenAI のGPT(生成的事前トレーニング済みトランスフォーマー))モデルなどのLLMは、トレーニングで使用される情報にのみアクセスできます。LangChainを通じてアクセスできるデフォルトのツールには、SQLデータベース・クエリーを操作したり、Wikipediaの情報にアクセスしたりするためのツールなどが含まれています。事前に構築されたツールの包括的なリストについては、 LangChain のドキュメンテーションをご覧ください。

カスタム・ツールは、このチュートリアルで説明する@toolデコレーターやLangChain Runnablesの使用など、さまざまなメソッドを使用して定義できます。非同期ツールは、StructuredToolクラスまたはBaseToolクラスを使用して作成できます。それぞれのアプローチの違いについては、 LangChainの公式ドキュメンテーションをご覧ください。カスタム・ツールの例については、IBMの関数呼び出しチュートリアルを参照してください。

さまざまなAIエージェントのタイプと従来のLLMチャットボットとの違いに関するより詳細な概略については、AIエージェントの解説をご覧ください。

前提条件

IBM Cloud アカウントが必要です。

ステップ

ステップ1. 環境を設定する

いくつかのツールから選択することはできますが、このチュートリアルでは、Jupyter Notebookを使用するためにIBMアカウントを設定する方法について説明します。

  1. watsonx.ai ™にログインします。IBM Cloudアカウントを使用します。

  2. watsonx.ai プロジェクトを作成します。

    プロジェクトIDはプロジェクト内から取得できます。「管理」タブをクリックし、「全般」ページの「詳細」セクションからプロジェクトIDをコピーしてください。このチュートリアルではこのIDが必要になります。

  3. Jupyter Notebookを作成します。

    このステップでは、このチュートリアルからコードをコピーできるノートブック環境が開きます。あるいは、このノートブックをローカル・システムにダウンロードし、watsonx.aiプロジェクトにアセットとしてアップロードすることもできます。さらにGranite®のチュートリアルを表示するには、 IBM® Graniteコミュニティをご覧ください。このチュートリアルはGithubでも公開されています。

ステップ2. watsonx.ai RuntimeのインスタンスとAPIキーを設定する

  1. watsonx.ai Runtimeサービス・インスタンスを作成します(適切なリージョンを選択し、無料インスタンスであるLiteプランを選択)。

  2. APIキーを生成します。

  3. watsonx.ai Runtimeサービス・インスタンスを、 watsonx.aiで作成したプロジェクトに関連付けます。

ステップ3. 関連ライブラリーをインストールしてインポートし、認証情報を設定する

このチュートリアルには、いくつかのライブラリとモジュールが必要です。以下を必ずインポートしてください。インストールされていない場合は、pipのクイックインストールで問題を解決できます。ここで使用するフレームワークと開発者ツールキットは、LangChainとLangGraphです。

:このチュートリアルは、Python 3.11.9を使用して構築されており、Python 3.10.12を使用するGoogle Colabとも互換性があります。Pythonのバージョンを確認するには!python --version コマンドをコードセルに入力します。

#installations
!pip install -q langchain \
    "langchain_community<0.3.0" \
    langgraph \
    youtube_search \
    pyowm \
    ionic-langchain \
    python-dotenv

!pip install -qU langchain-ibm
#imports
import os

from langchain_ibm import ChatWatsonx
from langgraph.prebuilt import create_react_agent
from langchain_core.tools import Tool
from langchain_core.messages import HumanMessage
from langchain_community.tools import YouTubeSearchTool
from langchain_community.utilities import OpenWeatherMapAPIWrapper
from ionic_langchain.tool import IonicTool
from dotenv import load_dotenv

load_dotenv(os.getcwd()+"/.env", override=True)

認証情報を設定するには、ステップ1で生成したWATSONX_APIKEYとWATSONX_PROJECT_IDが必要です。ディレクトリーの.envファイルに保管するか、プレースホルダー・テキストを置き換えることができます。また、APIのエンドポイントとして機能するURLも設定します。

WATSONX_APIKEY = os.getenv('WATSONX_APIKEY', "<WATSONX_APIKEY_HERE>")
WATSONX_PROJECT_ID = os.getenv('WATSONX_PROJECT_ID', "<WATSONX_PROJECT_ID_HERE>")
URL = "https://us-south.ml.cloud.ibm.com"

このチュートリアルで使用されている気象ツールには、OpenWeather APIキーが必要です。これを生成するには、 OpenWeather アカウントを作成します。アカウントを作成したら、「APIキー」タブを選択して、無料キーを表示します。

OPENWEATHERMAP_API_KEY = os.getenv('OPENWEATHERMAP_API_KEY', "<OPEN_WEATHERMAP_API_KEY_HERE>")

ステップ 4.LLM を初期化する

このチュートリアルでは、ChatWatsonxラッパーを使用してチャット・モデルを設定します。このラッパーは、ツールの呼び出しとチェーンの統合を簡素化します。granite-3-8b-instruct モデルを使用します。詳細については、ChatWatsonx ドキュメンテーションのAPI リファレンスをご覧ください。

LLMを初期化するには、モデル・パラメーターを設定する必要があります。エージェントのハルシネーションを制限するには、ここでモデルの温度を設定することが重要です。

llm = ChatWatsonx(
    model_id="ibm/granite-3-8b-instruct",
    url = URL,
    apikey = WATSONX_APIKEY,
    project_id = WATSONX_PROJECT_ID,
    params = {
        "decoding_method": "greedy",
        "temperature": 0,
        "min_new_tokens": 5,
        "max_new_tokens": 2000
    }
)

ステップ 5. 組み込みツールを設定する

Toolクラスを使用して、ツールを呼び出し可能にすることができます。ツールの明確かつ簡単な説明も重要です。さらに、 Return_direct ブール属性で、ツール応答をユーザーに直接返すかどうかを決定します。最後に、pydantic.BaseModelタイプのオプションのargs_schema属性は、追加情報や検証をモデルに提供するために使用されます。

次の休暇にギリシャ旅行を計画していて、詳細を知り旅行に備えたいと考えているとしましょう。まず、組み込みのLangChain気象ツールをセットアップします。このツールは、先ほど生成したOPENWEATHERMAP_API_KEYを使用するOpenWeatherMapAPIWrapperを利用します。

weather = OpenWeatherMapAPIWrapper(openweathermap_api_key=OPENWEATHERMAP_API_KEY)

weather_search = Tool(
    name="weather_search",
    description="Get weather for a city and country code, e.g. Athens, GR",
    func=weather.run,
)

次に、LangChainから入手できるYouTube検索パッケージを使用して、事前に構築されたYouTubeツールをセットアップします。この手順は、旅行先に関する動画を見つけるのに役立ちます。

youtube = YouTubeSearchTool()

youtube_search = Tool(
    name="youtube_search",
    description="Search YouTube for video links.",
    func=youtube.run,
)

最後に、 Ionic を使って オンラインショッピングツール を設定しましょう。このツールは、eコマース・マーケットプレイスを通じて販売されているユーザーのクエリーに関連するアイテムを返します。

ionic_search = IonicTool().tool()

LLM に提供する複数のツールのリストを設定しましょう。リストを印刷して、どのように読み込まれたかを確認することもできます。利用可能な LangChain ツールの拡張リストについては、 LangChain のドキュメンテーションを参照してください。

tools = [weather_search, youtube_search, ionic_search]
tools

Output:

[Tool(name='weather_search', description='Get weather for a city and country code, e.g. Athens, GR', func=<bound method OpenWeatherMapAPIWrapper.run of OpenWeatherMapAPIWrapper(owm=<pyowm.owm.OWM - API key=************************611450cc, subscription type=free, PyOWM version=(3, 3, 0)>, openweathermap_api_key='******************')>),

Tool(name='youtube_search', description='Search YouTube for video links.', Functionc=<bound Method BaseTool.run of YouTubeSearchTool()>),

Tool(name='ionic_commerce_shopping_tool', description='\nIonic is an e-commerce shopping tool...[abbreviated]', verbose=True, func=<bound method Ionic.query of <ionic_langchain.tool.Ionic object at 0x17f6e5510>>)] 

ステップ6:ツールの呼び出し

ツール呼び出しは通常、呼び出すツールの名前とその引数を返すLLMを指します。抽出された情報は他の目的に使用することも、これらの議論を使用してツールを呼び出すこともできます。詳細な例については、関数呼び出しのチュートリアルを参照してください。

実際には、ツールの実行とそのアウトプットの取得が必ずしも意味するわけではありません。このチュートリアルでは、両方のアプローチについて説明します。

関連するツールと引数を返す

従来のツール呼び出しを実現するためには、ユーザー・クエリーを指定し、事前構築済みのbind_toolsメソッドを使用して、反復ごとにツールのリストをLLMに渡すだけで済みます。

llm_with_tools = llm.bind_tools(tools)
response = llm_with_tools.invoke([("human", "What are some youtube videos about greece")])
response

Output:

AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'chatcmpl-tool-7a15abba7d3c4419970d807ac0c8d353', 'type': 'function', 'function': {'name': 'youtube_search', 'arguments': '{"query": "greece"}'}}]}, response_metadata={'token_usage': {'completion_tokens': 21, 'prompt_tokens': 578, 'total_tokens': 599}, 'model_name': 'ibm/granite-3-8b-instruct', 'system_fingerprint': '', 'finish_reason': 'tool_calls'}, id='chat-5fe7a26b8f954c179c4995e873bff91e', tool_calls=[{'name': 'youtube_search', 'args': {'query': 'greece'}, 'id': 'chatcmpl-tool-7a15abba7d3c4419970d807ac0c8d353', 'type': 'tool_call'}], usage_metadata={'input_tokens': 578, 'output_tokens': 21, 'total_tokens': 599})

response.additional_kwargs

Output:

{'tool_calls': [{'id': 'chatcmpl-tool-7a15abba7d3c4419970d807ac0c8d353',
'type': 'function',
'function': {'name': 'youtube_search',
'arguments': '{"query": "greece"}'}}]}

アウトプットに見られるように、LLMは適切なツールの呼び出しと引数を正しく識別します。LLMはツール自体は実行しません。これは次のステップで行います。

ツール呼び出しを実行し、そのアウトプットを取得します

ツール呼び出しを実行するには、まず事前に構築されたLangGraphのcreate_react_agentヘルパー・メソッドを使用してReActエージェントを作成する必要があります。この機能は、チャット・モデルと利用可能なツールの間のブリッジとして機能するグラフを作成し、エージェントによるツール呼び出しを可能にします。このグラフは次の図で表されます。

agent_executor = create_react_agent(llm, tools)

ツールの呼び出しが必要な質問をエージェントに尋ねることができるようになりました。まず、モデルにギリシャに関するYouTube動画のURLを返すよう依頼できます。HumanMessageクラスを使用すると、ユーザーのクエリーをLLMに渡すことができます。

user_query = "What are some YouTube videos about Greece"
response = agent_executor.invoke({"messages": user_query})
response["messages"]

Output:

[HumanMessage(content='What are some YouTube videos about Greece', additional_kwargs={}, response_metadata={}, id='1adba6c0-32e6-4bbd-92a6-7d21b0177439'),
AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'chatcmpl-tool-b4b5bf452404424ba4d6d9c26e53c6ce', 'type': 'function', 'function': {'name': 'youtube_search', 'arguments': '{"query": "Greece"}'}}]}, response_metadata={'token_usage': {'completion_tokens': 22, 'prompt_tokens': 578, 'total_tokens': 600}, 'model_name': 'ibm/granite-3-8b-instruct', 'system_fingerprint': '', 'finish_reason': 'tool_calls'}, id='chat-5f41aee6736842749285aa7fbff50f65', tool_calls=[{'name': 'youtube_search', 'args': {'query': 'Greece'}, 'id': 'chatcmpl-tool-b4b5bf452404424ba4d6d9c26e53c6ce', 'type': 'tool_call'}], usage_metadata={'input_tokens': 578, 'output_tokens': 22, 'total_tokens': 600}),
ToolMessage(content="['https://www.youtube.com/watch?v=waQY2Ucpbd0&pp=ygUGR3JlZWNl', 'https://www.youtube.com/watch?v=NMlBB2pK5qo&pp=ygUGR3JlZWNl']", name='youtube_search', id='1ccf3137-2c10-495e-86ad-a548a3434243', tool_call_id='chatcmpl-tool-b4b5bf452404424ba4d6d9c26e53c6ce'),
AIMessage(content='Here are some YouTube videos about Greece:\n\n1. [Greece Travel Guide | Top 10 Tourist Attractions](https://www.youtube.com/watch?v=waQY2Ucpbd0&pp=ygUGR3JlZWNl)\n2. [Greece Travel Guide | Top 10 Tourist Attractions](https://www.youtube.com/watch?v=NMlBB2pK5qo&pp=ygUGR3JlZWNl)', additional_kwargs={}, response_metadata={'token_usage': {'completion_tokens': 117, 'prompt_tokens': 677, 'total_tokens': 794}, 'model_name': 'ibm/granite-3-8b-instruct', 'system_fingerprint': '', 'finish_reason': 'stop'}, id='chat-801e3b596a174ac88246b507c93e5869', usage_metadata={'input_tokens': 677, 'output_tokens': 117, 'total_tokens': 794})]

成功です。AIMessage に見られるように、モデルは適切なツールの呼び出しを正しく識別しました。ToolMessageでは、モデルが組み込みのLangChain YouTubeツールを使用して期待どおりのアウトプットを返したことがわかります。最後に、AIMessageはLLMがツールの応答を合成したことを示します。

次に、モデルにギリシャの天気について尋ねて、予想どおりにweather_searchツールを呼び出すかどうかを判断します。

user_query = "What is the weather in Athens, GR"
response = agent_executor.invoke({"messages": user_query})
response["messages"]

Output:

[HumanMessage(content='What is the weather in Athens, GR', additional_kwargs={}, response_metadata={}, id='a0c4b69c-988a-4f7d-9b8a-4780305f8e2a'),
AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'chatcmpl-tool-9a0c07a3b35f4c69a351c5540ab663f8', 'type': 'function', 'function': {'name': 'weather_search', 'arguments': '{"__arg1": "Athens, GR"}'}}]}, response_metadata={'token_usage': {'completion_tokens': 26, 'prompt_tokens': 579, 'total_tokens': 605}, 'model_name': 'ibm/granite-3-8b-instruct', 'system_fingerprint': '', 'finish_reason': 'tool_calls'}, id='chat-eeed087050e049f0ad715f3615c7fdda', tool_calls=[{'name': 'weather_search', 'args': {'__arg1': 'Athens, GR'}, 'id': 'chatcmpl-tool-9a0c07a3b35f4c69a351c5540ab663f8', 'type': 'tool_call'}], usage_metadata={'input_tokens': 579, 'output_tokens': 26, 'total_tokens': 605}),
ToolMessage(content='In Athens, GR, the current weather is as follows:\nDetailed status: few clouds\nWind speed: 4.47 m/s, direction: 23°\nHumidity: 58%\nTemperature: \n - Current: 15.15°C\n - High: 15.74°C\n - Low: 14.1°C\n - Feels like: 14.24°C\nRain: {}\nHeat index: None\nCloud cover: 20%', name='weather_search', id='587b0230-b667-41de-97b9-3779554d2559', tool_call_id='chatcmpl-tool-9a0c07a3b35f4c69a351c5540ab663f8'),
AIMessage(content='The current weather in Athens, GR is:\n- Detailed status: few clouds\n- Wind speed: 4.47 m/s, direction: 23°\n- Humidity: 58%\n- Temperature:\n - Current: 15.15°C\n - High: 15.74°C\n - Low: 14.1°C\n - Feels like: 14.24°C\n- Rain: None\n- Heat index: None\n- Cloud cover: 20%', additional_kwargs={}, response_metadata={'token_usage': {'completion_tokens': 125, 'prompt_tokens': 733, 'total_tokens': 858}, 'model_name': 'ibm/granite-3-8b-instruct', 'system_fingerprint': '', 'finish_reason': 'stop'}, id='chat-6719a5ca266a439bb10ed410db25c5ef', usage_metadata={'input_tokens': 733, 'output_tokens': 125, 'total_tokens': 858})]

このモデルは、呼び出す適切なツールを識別し、抽出された議論を使用してツールを実行し、ツールのアウトプットを合成することができました。それでは、旅行のために100米ドル未満のスーツケースを探すようLLMに依頼します。このツールはセント単位の価格を検索するように設計されていることに注意してください。したがって、このシナリオでは、10,000セント(100米ドルに相当)未満のスーツケースを求めています。

user_query = "Find some suitcases for less than 10000"
response = agent_executor.invoke({"messages": user_query})
response["messages"]

Output:

[HumanMessage(content='Find some suitcases for less than 10000', additional_kwargs={}, response_metadata={}, id='8b207035-150a-4390-aff3-8b09ef85a592'),
AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'chatcmpl-tool-b011e718b18e41dcbcae2f7786af263d', 'type': 'function', 'function': {'name': 'ionic_commerce_shopping_tool', 'arguments': '{"__arg1": "suitcases, 10, 0, 10000"}'}}]}, response_metadata={'token_usage': {'completion_tokens': 41, 'prompt_tokens': 582, 'total_tokens': 623}, 'model_name': 'ibm/granite-3-8b-instruct', 'system_fingerprint': '', 'finish_reason': 'tool_calls'}, id='chat-e38c8568d1754636a6a92082561180bd', tool_calls=[{'name': 'ionic_commerce_shopping_tool', 'args': {'__arg1': 'suitcases, 10, 0, 10000'}, 'id': 'chatcmpl-tool-b011e718b18e41dcbcae2f7786af263d', 'type': 'tool_call'}], usage_metadata={'input_tokens': 582, 'output_tokens': 41, 'total_tokens': 623}),
ToolMessage(content='[{"products": [{"links": [{"text": "Details", "type": "pdp", "url": "https://go.ionic.click/Ch4CKd"}], "merchant_name": "Walmart", "merchant_product_id": "811277349", "name": "Zimtown Hardside Lightweight Spinner Orange 3 Piece Luggage Set with TSA Lock", "price": "$69.99", "status": "available", "thumbnail": "https://i5.walmartimages.com/asr/b809a274-ccc7-4ca4-b4f1-e848b4412fe6.314144bcd13e5467a33cb99e8dd5237c.jpeg?odnHeight=100&odnWidth=100&odnBg=ffffff", "brand_name": "Zimtown", "upc": "273109526768"}, {"links": [{"text": "Details", "type": "pdp", "url": "https://www.amazon.com/dp/B071HHX6VF?tag=ioniccommer00-20&linkCode=osi&th=1&psc=1"}], "merchant_name": "Amazon", "merchant_product_id": "B071HHX6VF", "name": "Amazon Basics Expandable Hardside Luggage, Suitcase with Wheels, 30-Inch Spinner with Four Spinner Wheels and Scratch-Resistant Surface, Black", "price": "$74.49", "status": "available", "thumbnail": "https://m.media-amazon.com/images/I/41jJcuMYSdL._SL160_.jpg", "brand_name": "Amazon Basics", "upc": "841710177190"}, .....[abbreviated],
AIMessage(content='Here are some suitcases that are less than 10000:\n\n1. [Zimtown Hardside Lightweight Spinner Orange 3 Piece Luggage Set with TSA Lock](https://go.ionic.click/Ch4CKd) - $69.99\n2. [Amazon Basics Expandable Hardside Luggage, Suitcase with Wheels, 30-Inch Spinner](https://www.amazon.com/dp/B071HHX6VF) - $74.49\n3. [SwissGear Sion Softside Expandable Luggage, Blue, Carry-On 21-Inch](https://www.amazon.com/dp/B01MFBVKDF) - $80.73\n4. [Travelers Club Midtown Hardside Luggage Travel, Rose Gold, 4-Piece Set](https://www.amazon.com/dp/B07RS4PK3J) - $95.19\n5. [American Tourister Stratum 2.0 Expandable Hardside Luggage with Spinner Wheels, 28" SPINNER, Slate Blue](https://www.amazon.com/dp/B0B2X1BDFH) - $89.97\n6. [Wrangler Smart Luggage Set with Cup Holder and USB Port, Navy Blue, 20-Inch Carry-On](https://www.amazon.com/dp/B07SLG6WZ2) - $39.99\n7. [Wrangler Hardside Carry-On Spinner Luggage, Lilac, 20-Inch](https://www.amazon.com/dp/B0C7YWMBGP) - $40.00\n8. [Protege 20 inch Hard Side Carry-On Spinner Luggage, Black Matte Finish (Walmart.com Exclusive)](https://go.ionic.click/qJqBRA) - $29.87\n9. [Wrangler Wesley Rolling Duffel Bag, Tannin, Large 30-Inch](https://www.amazon.com/dp/B07XKWMLJ5) - $44.00\n10. [U.S. Traveler Boren Polycarbonate Hardside Rugged Travel Suitcase Luggage with 8 Spinner Wheels, Aluminum Handle, Lavender, Checked-Large 30-Inch](https://www.amazon.com/dp/B085B4D852) - $79.99', additional_kwargs={}, response_metadata={'token_usage': {'completion_tokens': 612, 'prompt_tokens': 2794, 'total_tokens': 3406}, 'model_name': 'ibm/granite-3-8b-instruct', 'system_fingerprint': '', 'finish_reason': 'stop'}, id='chat-d08201ff6ef84c428e7ae44372396926', usage_metadata={'input_tokens': 2794, 'output_tokens': 612, 'total_tokens': 3406})]

LLMの応答からわかるように、モデルはショッピング・ツールを正しく使用して、オンラインで100米ドル未満で購入できる複数のスーツケースを返しました。

概要

このチュートリアルでは、事前に構築されたLangChainツールを使用し、granite-3-8b-instruct モデルを使用したwatsonxでPythonでReActエージェントを作成しました。今回使用したのはyoutube_search 、weather_search 、ionic_search ツールです。チュートリアルでは、従来のツール呼び出しとツールを実行するエージェントアプローチの実装方法について説明しました。ワークフローとアウトプットは、エージェントが利用可能な機能を使用して独自のワークフローを作成する際に行った手順を示すため、重要です。エージェントに付与されたツールは、ユーザーの問い合わせに応答するために不可欠なものです。

関連ソリューション
ビジネス向けAIエージェント

生成AIを使用してワークフローとプロセスを自動化する強力なAIアシスタントとエージェントを構築、デプロイ、管理しましょう。

    watsonx Orchestrateの詳細はこちら
    IBM AIエージェント・ソリューション

    信頼できるAIソリューションでビジネスの未来を構築します。

    AIエージェント・ソリューションの詳細はこちら
    IBM®コンサルティング AIサービス

    IBMコンサルティングAIサービスは、企業がAIをトランスフォーメーションに活用する方法を再考するのに役立ちます。

    人工知能サービスの詳細はこちら
    次のステップ

    事前構築済みのアプリケーションとスキルをカスタマイズする場合でも、AIスタジオを使用してカスタム・エージェント・サービスを構築し、デプロイする場合でも、IBM watsonxプラットフォームが対応します。

    watsonx Orchestrateの詳細はこちら watsonx.aiの詳細はこちら