함수 호출이라고도 하는 툴 호출은 인공 지능(AI) 에이전트가 훈련을 받은 대규모 언어 모델(LLM)에서 사용할 수 없는 최신 정보가 필요한 특정 작업을 수행하게 해주는 인터페이스입니다. IBM® Granite 모델, OpenAI의 GPT(사전 훈련을 받은 생성형 트랜스포머) 모델과 같은 LLM은 훈련에 사용된 정보만 조회할 수 있습니다. SQL 데이터베이스 쿼리 작업, Wikipedia 정보 조회를 위한 툴을 비롯해 LangChain을 통해 액세스할 수 있는 기본 도구는 다양합니다. 사전 구축된 도구를 전부 보시려면 LangChain 문서를 읽어보세요.
맞춤형 툴은 이 튜토리얼에서 다룰 @tool 데코레이터 또는 LangChain Runnables를 사용하는 등 다양한 방법으로 정의할 수 있습니다. 비동기 툴은 StructuredTool 또는 BaseTool 클래스를 사용하여 만들 수 있습니다. 접근 방식의 차이점은 LangChain 공식 문서에서 알아보세요. 맞춤형 툴 예시는 IBM 함수 호출 튜토리얼에 소개되어 있습니다.
다양한 AI 에이전트 유형에 대한 심층 정보, 기존 LLM 챗봇과의 차이점은 AI 에이전트 설명서에서 알아보세요.
IBM Cloud 계정이 필요합니다.
여러 툴 중에서 선택할 수 있지만, 이 튜토리얼에서는 Jupyter Notebook을 사용하기 위해 IBM 계정을 설정하는 방법을 안내합니다.
IBM Cloud 계정을 사용하여 watsonx.ai에 로그인합니다.
watsonx.ai 프로젝트를 생성합니다.
프로젝트 내에서 프로젝트 ID를 가져올 수 있습니다. 관리 탭을 클릭합니다. 그런 다음 일반 페이지의 세부 정보 섹션에서 프로젝트 ID를 복사합니다. 이 튜토리얼에는 이 ID가 필요합니다.
Jupyter Notebook을 만듭니다.
이 단계에서는 이 튜토리얼의 코드를 복사할 수 있는 Jupyter Notebook 환경이 열립니다. 또는 이 노트북을 로컬 시스템에 다운로드하여 watsonx.ai 프로젝트에 에셋으로 업로드할 수 있습니다. 더 많은 Granite 튜토리얼을 보려면 IBM Granite 커뮤니티를 확인하세요. 이 튜토리얼은 Github에서도 보실 수 있습니다.
watsonx.ai 런타임 서비스 인스턴스를 만듭니다(적절한 지역을 선택하고 무료 인스턴스인 Lite 요금제를 선택합니다).
API 키를 생성합니다.
watsonx.ai 런타임 서비스 인스턴스를 watsonx.ai에서 생성한 프로젝트에 연결합니다.
이 튜토리얼에는 몇 가지 라이브러리와 모듈이 필요합니다. 다음 항목을 가져와야 합니다. 설치되지 않은 경우, 빠른 PIP 설치로 이 문제를 해결할 수 있습니다. LangChain과 LangGraph 프레임워크와 개발자 툴킷을 사용합니다.
참고: 이 튜토리얼은 Python 3.11.9를 사용하여 작성되었으며 Python 3.10.12를 사용하는 Google Colab과도 호환됩니다. Python 버전을 확인하려면 !python --version 명령을 코드 셀에서 실행하세요.
자격 증명을 설정하려면 1단계에서 생성한 WATSONX_APIKEY와 WATSONX_PROJECT_ID가 필요합니다. 이는 디렉터리의 .env 파일에 저장하거나 자리 표시자 텍스트에 입력할 수 있습니다. 또한 API 엔드포인트 역할을 하는 URL도 설정합니다.
이 튜토리얼에서 사용하는 날씨 도구에는 OpenWeather API 키가 필요합니다. 생성하려면 OpenWeather 계정을 만드세요. 계정을 만든 뒤 "API 키" 탭을 선택하고 무료 키를 표시합니다.
이 튜토리얼에서는 ChatWatsonx 래퍼를 사용하여 채팅 모델을 설정합니다. 이 래퍼는 툴 호출과 체이닝의 통합을 간소화합니다. 우리는 granite-3-8b-instruct 모델을 사용합니다. 자세한 내용을 알아보려면 ChatWatsonX 문서에 있는 API 참고 자료를 사용하는 것이 좋습니다.
LLM을 초기화하려면 모델 매개변수를 설정해야 합니다. 이때 에이전트 할루시네이션을 제한하기 위해 모델의 온도를 구성해야 합니다.
Tool 클래스를 사용하면 툴을 호출 가능하게 만들 수 있습니다. 툴에 대한 설명을 간단명료하게 하는 것도 중요합니다. 또한 return_direct 부울 속성에 따라 툴 응답을 사용자에게 직접 반환해야 하는지가 결정됩니다. 마지막으로 pydantic의 선택적인 args_schema 속성입니다. BaseModel 유형은 모델에 추가 정보나 유효성 검사를 제공하는 데 사용됩니다.
그리스로 다음 휴가를 계획 중이며, 이에 대해 자세히 알아보고 여행을 준비하고 싶다고 상상해 봅시다. 먼저 내장형 LangChain 날씨 툴을 설정합니다. 이 툴은 이전에 생성한, OPENWEATHERMAP_API_KEY를 사용하는 OpenWeatherMapAPIWrapper를 사용합니다.
다음으로 LangChain을 통해 제공되는 YouTube 검색 패키지를 사용하여 사전 구축된 YouTube 툴을 설정해 보겠습니다. 이 단계는 여행지 관련 동영상을 찾을 때 유용합니다.
마지막으로 Ionic을 사용해 온라인 쇼핑 툴을 설정해 보겠습니다. 이 툴은 온라인에서 판매 중인 사용자 쿼리와 관련된 항목을 반환합니다.
우리가 LLM에 제공하는 여러 도구 목록을 설정해 봅시다. 목록을 인쇄해서 어떻게 로드되었는지 확인할 수도 있습니다. 사용 가능한 LangChain 툴 전체 목록은 LangChain 문서에서 확인하세요.
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.', func=<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>>)]
툴 호출은 일반적으로 LLM이 호출할 도구의 이름과 해당 인수를 반환하는 것을 의미합니다. 추출된 정보를 다른 목적으로 사용하거나 이 인수를 사용하여 툴을 호출할 수 있습니다. 함수 호출 튜토리얼에서 더 많은 예시를 확인하세요.
사실 툴을 실행해서 아웃풋을 얻는 것이 항상 함축적이지는 않습니다. 이 튜토리얼에서 두 가지 접근법을 모두 살펴봅니다.
기존 툴 호출을 수행하기 위해 사용자 쿼리를 제공하고 사전 구축된 bind_tools 방법을 사용하여, 반복할 때마다 툴 목록을 LLM에 전달하기만 하면 됩니다.
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})
Output:
{'tool_calls': [{'id': 'chatcmpl-tool-7a15abba7d3c4419970d807ac0c8d353',
'type': 'function',
'function': {'name': 'youtube_search',
'arguments': '{"query": "greece"}'}}]}
tool_calls 아웃풋에서 볼 수 있듯 LLM은 적절한 툴 호출과 인수를 올바르게 식별합니다. LLM은 툴 자체를 실행하지 않습니다. 우리는 다음 단계에서 이 작업을 해봅니다.
툴 호출을 실행하려면 먼저 미리 빌드된 LangGraph create_react_agent 헬퍼 방법을 사용하여 ReAct 에이전트를 만들어야 합니다. 이 함수는 채팅 모델과 사용 가능한 툴을 잇는 다리 역할의 그래프를 생성하여 에이전틱 툴 호출을 가능하게 합니다. 다음 다이어그램에서 이 그래프를 확인하세요.
이제 에이전트에게 툴 호출이 필요한 질문을 할 수 있습니다. 먼저 모델에게, YouTube에서 그리스 관련 영상 URL을 반환하라고 요청합시다. HumanMessage 클래스를 사용하여 사용자 쿼리를 LLM에 전달합니다.
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 툴을 호출하는지 확인해 보겠습니다.
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})]
모델은 적절한 툴을 식별하고, 추출된 인수로 툴을 실행하고, 도구 아웃풋을 합성할 수 있었습니다. 이제 곧 있을 여행을 위해 LLM에 100달러 미만의 여행 가방을 요청해 보겠습니다. 이 툴은 가격을 센트 단위로 검색하도록 설계되어 있습니다. 따라서 이 시나리오에서는 10,000센트(미화 100달러와 동일) 미만의 여행 가방을 요청합니다.
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 툴을 사용하여 Python에서 ReAct 에이전트를 생성했으며, 여기에 함께 사용된 watsonx는 granite-3-8b-instruct 모델을 사용했습니다. 여러분은 youtube_search , weather_search , onic_search 툴을 사용했습니다. 이 튜토리얼에서는 종래의 툴 호출을 구현하는 방법, 툴을 실행하는 에이전틱 접근 방식을 보여주었습니다. 이렇게 나온 아웃풋은 에이전트가 사용 가능한 기능을 사용하여 자체 워크플로를 만든 방법을 보여주는 중요한 예시입니다. 에이전트에게 부여된 툴은 사용자 문의에 답변하는 데 중요한 역할을 합니다.
생성형 AI로 워크플로와 프로세스를 자동화하는 강력한 AI 어시스턴트 및 에이전트를 구축, 배포, 관리하세요.
믿을 수 있는 AI 솔루션으로 비즈니스의 미래를 설계하세요.
IBM Consulting AI 서비스는 기업이 AI 활용 방식을 재구상하여 혁신을 달성하도록 지원합니다.