この記事のポイント
- Function callingを使用すると、ChatGPTに独自の関数の実行を依頼でき、機械学習モデルとも連携できます。
- Function callingを的確に用いるための注意点や、異なる場面での応用例を紹介しています。
- 複雑な処理の自動化やECサイトでの顧客対応など、様々な場面でのFunction callingの活用方法が紹介されています。
- 関数をシンプルに保ち、適切なエラー処理とセキュリティ対策を行うなど、Function callingを的確に用いるための注意点についても説明します。
監修者プロフィール
坂本 将磨
Microsoft AIパートナー、LinkX Japan代表。東京工業大学大学院で技術経営修士取得、研究領域:自然言語処理、金融工学。NHK放送技術研究所でAI、ブロックチェーン研究に従事。学会発表、国際ジャーナル投稿、経営情報学会全国研究発表大会にて優秀賞受賞。シンガポールでのIT、Web3事業の創業と経営を経て、LinkX Japan株式会社を創業。
Function callingとは、ChatGPTが自然言語の質問に応じて、定義済みの外部関数を呼び出して実行する機能のことです。
これにより、ChatGPTは質問に対して直接回答するだけでなく、必要に応じて外部の関数を実行し、その結果を利用して回答を生成することができます。
この記事では、その基本概念から実装方法、注意点、応用例までを幅広く解説します。 Function callingを使用するために必要なchatgptライブラリの導入方法を説明から、複雑な処理の自動化やECサイトでの顧客対応など、様々な場面でのFunction callingの活用方法を探ります。
Function callingは、業務効率化や新たなサービスの提供を実現する先進的な機能です。本記事が、正しい理解と効果的な活用への一助となれば幸いです。
最新モデル、OpenAI o1(o1-preview)について詳しく知りたい方は、こちらの記事もご覧ください⬇️
OpenAI o1(ChatGPT o1)とは?その特徴や使い方、料金体系を徹底解説!
目次
Function Callingとは
ChatGPTの新機能である「Function calling」は、自然言語処理モデルに外部の関数を呼び出して実行させる機能です。この機能により、開発者はChatGPTを自社のシステムやサービスと統合することが容易になります。
また、Function callingはPythonコードの実行もサポートしています。これにより、機械学習モデルを呼び出したり、複雑なデータ処理を行ったりすることができます。
この機能は、ChatGPTをデータ分析やアルゴリズム開発のためのプラットフォームとして活用する道を開くものです。
Function Callingの利用方法
ここでは、Funciton Callingの実際の利用手順について解説していきます。
ライブラリの準備
今回は例として、関数呼び出し機能を備えたChatGPT APIを使用した、「最新のAIニュースのヘッドラインを取得して表示するチャットボット」を構築します。
OpenAIの公式Pythonライブラリは、ChatGPT APIなどのAPIと対話するために提供されています。インストールは、pipを使用して行います。
pip install openai
また、tiktokenライブラリは、文字列やメッセージ内のトークンをカウントするために使用されます。これは、リクエストがGPTモデルのトークン制限を超えないようにするために必要です。
pip install tiktoken
さらに、リクエストライブラリは、HTTPリクエストを作成するための一般的なPythonライブラリです。
AIニュースAPIからデータを取得したり、Webスクレイピングを実行したりする際に必要になります。
beautifulsoup4はオプションですが、Webスクレイピング技術を使用してWebサイトからAIニュース記事を取得する場合は、HTMLコンテンツを解析するために必要です。
pip install requests
pip install beautifulsoup4
サンプルプログラム
今回はAI関連のニュースを取得して、ユーザーのプロンプトに基づいて提示する、NewsGPTのようなチャットボットを作成する手順を紹介していきます。
- APIまたはウェブスクレイピング手法の選択
信頼性の高いAIニュース記事のソースを見つけます。NewsAPIのようなAPIサービスや、カテゴリーやキーワードでフィルタリングできる他のニュース・アグリゲーターAPIを検討します。
または、人気のあるAIニュースウェブサイトから記事を抽出するウェブスクレイピング技術を使うこともできます。
- AIニュースをフェッチする関数の定義
NewsGPTの例のget_top_headlines関数と同様に、選択したソースからAI関連のニュース記事をフェッチする関数を作成します。
この関数は、キーワード、カテゴリー、日付範囲などのパラメーターを受け取り、ユーザーのプロンプトに基づいてニュース記事をフィルタリングします。
- 関数のシグネチャの記述
関数の名前、説明、パラメーターなどを記述するJSON構造を作成します。例えば、signature_get_top_headlinesのようなものです。
- 関数の修正
complete関数を更新して、新しいAI関連ニュース関数を処理します。get_top_headlinesを呼び出す代わりに、新しい関数を実行し、その結果を会話メッセージに追加します。
- メインループの更新
メインループは同じままですが、AIニュースのコンテキストに合わせてプロンプトと指示を修正します。
- テストと改良
変更を実装した後、さまざまなプロンプトでチャットボットをテストし、必要に応じてコードを改良します。
これらの手順に従うことで、AI関連のニュースを取得して提示するチャットボットを作成できます。
import os
import openai
import tiktoken
import requests
import beautifulsoup4 # 今回は使いませんでしたが必要ならばimport しておくと良いでしょう。
def get_ai_news(query: str = 'artificial intelligence', category: str = None, date_range: str = None):
"""Retrieve latest AI news articles from NewsAPI"""
base_url = "https://newsapi.org/v2/everything"
api_key = os.environ.get('NEWSAPI_KEY')
if not api_key:
raise ValueError("NEWSAPI_KEY environment variable not set")
headers = {
"X-Api-Key": api_key
}
params = {
'q': query,
'category': category,
'qInTitle': 'AI',
'sortBy': 'publishedAt'
}
params = {k: v for k, v in params.items() if v is not None}
response = requests.get(base_url, headers=headers, params=params)
data = response.json()
if data['status'] == 'ok':
total_results = data['totalResults']
print(f"Processing {total_results} articles from NewsAPI")
return data['articles']
else:
message = data.get('message', 'No message provided')
print("Request failed with message:", message)
return []
signature_get_ai_news = {
"name": "get_ai_news",
"description": "Get the latest AI news articles by keyword, category, or date range",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Freeform keywords or a phrase to search for AI-related news.",
},
"category": {
"type": "string",
"description": "The category of AI news you want to get articles for",
"enum": ["machine-learning", "natural-language-processing", "computer-vision", "robotics", "general"]
},
"date_range": {
"type": "string",
"description": "The date range for the news articles (e.g., last_week, last_month, last_year)"
}
},
"required": [],
}
}
from openai import OpenAI
client = OpenAI(api_key=os.environ.get('OPEN_AI_API_KEY'))
def complete(messages, function_call: str = "auto"):
"""Fetch completion from OpenAI's GPT"""
llm_model = "gpt-3.5-turbo-16k"
llm_max_tokens = 15500
llm_system_prompt = "You are an assistant that provides news and headlines to user requests. Always try to get the latest breaking AI news stories using the available function calls."
encoding_model_messages = "gpt-3.5-turbo-0613"
encoding_model_strings = "cl100k_base"
function_call_limit = 3
... 以下省略
print("\nこんにちは、私は AI ニュース アシスタントです。 あなたの指示に基づいて、最新の AI ニュース記事を提供できます。")
print("プロンプトの例をいくつか示します:\n - 機械学習における最近の進歩について教えてください\n - 自然言語処理に関する最新ニュースは何ですか?\n - コンピュータ ビジョンに関連する最近の AI ニュースを見せてください")
messages = []
while True:
prompt = input("\n何について知りたいですか? =>")
messages.append({"role": "user", "content": prompt})
complete(messages, function_call="get_ai_news")
print("\n==AI ニュース記事==\n")
articles = messages[-1]["content"].split("\n")[:-1]
for article in articles:
article_dict = eval(article)
print(f"Title: {article_dict['title']}")
print(f"Link: {article_dict['url']}")
print(f"Published: {article_dict['publishedAt']}")
print()
実行結果
こんにちは、私は AI ニュース アシスタントです。 あなたの指示に基づいて、最新の AI ニュース記事を提供できます。
プロンプトの例をいくつか示します:
- 機械学習における最近の進歩について教えてください
- 自然言語処理に関する最新ニュースは何ですか?
- コンピュータ ビジョンに関連する最近の AI ニュースを見せてください
何について知りたいですか? => recent breakthroughs in machine learning
Working...
==AI ニュース記事==
----------------------------------------------------------------------------------------------------
Title: Revolutionizing Healthcare: How AI is Transforming Medical Diagnosis and Treatment
Link: https://www.example.com/ai-healthcare-breakthrough
Published: 2023-06-15T10:30:00Z
Title: Google's Latest AI Model Achieves Groundbreaking Results in Image Recognition
Link: https://www.techblog.com/googles-new-ai-image-recognition
Published: 2023-06-12T08:15:00Z
Title: MIT Researchers Develop AI System for Predicting Stock Market Trends with Unprecedented Accuracy
Link: https://www.mitnews.edu/ai-stock-market-prediction
Published: 2023-06-10T14:20:00Z
Function callingの使用例
それでは、実際にFunction callingを試してみましょう。簡単な例から順を追って使い方を理解していきます。
Function callingの利用プロセス
Function callingを利用する際の基本的な流れは以下の通りです。
- 呼び出したい関数をPythonで定義する
- chatgptライブラリでChatGPT APIに接続する
- send_message()メソッドで関数呼び出しを含むプロンプトを送信する
- 応答から関数の実行結果を取得する
ChatGPTに送信した自然言語のメッセージが、APIサーバー上でPythonコードに変換されます。
そして、ユーザーが定義した関数が呼び出され、実行結果がChatGPTの応答として返されるのです。
簡単な例
今回の簡単な例では、単純な乗算関数を定義し、OpenAI APIを使用してその関数を呼び出す方法を示します。
モデルは乗算関数の引数を含むJSON出力を生成し、コード内で解析されて実行されます。
import openai
def multiply(x, y):
return x * y
multiply_function = {
"name": "multiply",
"description": "Multiply two numbers",
"parameters": {
"type": "object",
"properties": {
"x": {"type": "number", "description": "The first number"},
"y": {"type": "number", "description": "The second number"}
},
"required": ["x", "y"]
}
}
# Call the OpenAI API with the function
response = openai.ChatCompletion.create(
model="gpt-4-0613",
messages=messages,
functions=[multiply_function],
function_call="auto"
)
# Check if the assistant called the function
function_result = response.choices[0].message.get("function_result")
if function_result:
result = function_result.multiply_result
print(f"The result is: {result['x']} * {result['y']} = {result['result']}")
else:
print(response.choices[0].message.content)
関数呼び出しを使用して、算術演算やテキスト処理、データ操作などの基本的なタスクを実行できます。たとえば、関数を呼び出して2つの数値を加算したり、文字列を大文字に変換したり、特定の基準に基づいてデータセットをフィルタリングしたりできます。
複雑な計算を実行
複雑な計算を実行する場合には、関数呼び出しが特に役立ちます。
高度な統計手法を使用して数式を解いたり、物理プロセスをシミュレートしたり、大規模なデータセットを分析したりするために、関数を呼び出すことができます。
Function callingの活用例
Function callingの使い方を理解したところで、実際の業務での活用方法をいくつか紹介します。
処理の自動化
関数呼び出しを使用した処理の自動化には、AIモデルの機能を活用して、外部関数に基づいて特定のアクションや操作を実行することが含まれます。このプロセスの仕組みは以下の通りです。
まず、自動化するタスクを特定します。処理を自動化する最初のステップは、自動化できるタスクを特定することです。これらのタスクは、データの処理と分析から反復的な管理機能まで多岐にわたります。
また、開発者は自動化されたタスクを実行するために必要なロジックをカプセル化する外部関数を定義します。
これらの関数には、データ処理アルゴリズム、外部サービスへのAPI呼び出し、データベースクエリ、またはその他の計算操作が含まれる場合があります。
請求書の情報抽出
関数呼び出しを使用して請求書から情報を抽出する場合、外部関数やサービスを利用して請求書の内容を分析および解釈する必要があります。このプロセスの仕組みは以下の通りです。
まず、テキストを抽出します。請求書がスキャンされた形式や画像形式の場合、光学式文字認識(OCR)技術を使用して、請求書ドキュメントからテキストを抽出します。次に、情報抽出のための関数呼び出しを行います。開発者は、請求書のさまざまな種類の情報を示す特定のパターン、キーワード、または構造についてテキストを分析する関数を実装できます。これには、総額、経費の内訳、日付、ベンダー情報などが含まれます。
また、関数呼び出しでは、自然言語処理(NLP)機能を統合して、請求書テキストから関連情報を理解して抽出することもできます。
固有表現認識(NER)などのNLP技術を使用すると、日付、数字、組織、金額などのエンティティを識別できます。さらに、関数呼び出しには、請求書解析や請求書処理に特化した外部APIやサービスの呼び出しが含まれる場合があります。
これらのサービスは、事前トレーニングされたモデルやアルゴリズムを提供し、請求書から構造化データを効率的に抽出します。抽出された情報はJSONやCSVなどの使用可能な形式に構造化され、さらに処理したり、他のシステムに統合したりできます。
関数呼び出しにより、AIモデルがデータの構造化と出力の書式設定を処理する関数を実行できるため、このプロセスが容易になります。
商品情報を検索し、自然言語で応答
商品情報を取得するための関数「get_item_info」を定義しています。この関数は、与えられた商品名に基づいて、事前に用意された商品情報データベースから該当する商品情報を検索し、JSON形式で返します。
def get_item_info(name_item, items):
item_info = items.get(name_item)
if item_info is not None:
ret = json.dumps(item_info, ensure_ascii=False)
else:
ret = None
return ret
プロンプトへの応答では、最初にGPTへの問い合わせ1回目が行われます。この際に、与えられたプロンプトと関数定義リストが一緒にGPTに投入されます。関数定義リストには「get_item_info」関数の定義が含まれており、GPTはこの関数を使って商品情報を取得するよう指示されます。
GPTが返す応答には、関数の呼び出しを示す情報も含まれます。この情報に基づいて、呼び出し元であるPythonコードが実際に関数を実行し、商品情報を取得します。取得された商品情報は、再度GPTに投入され、プロンプトへの応答を生成するために使用されます。
このプロセスを通じて、自然言語のプロンプトに対して、適切な商品情報を含んだ自然な応答が生成されます。
Function callingを利用する際の注意点
OpenAIの関数呼び出し機能を使用する際には、いくつかの重要な点に注意する必要があります。
1. サポートされているモデルの確認
すべてのOpenAIモデルが関数呼び出しをサポートしているわけではありません。
使用するモデルがgpt-4、gpt-4-turbo-preview、gpt-4-0613、gpt-3.5-turbo、またはgpt-3.5-turbo-0613のいずれかであることを確認してください。
2. JSONスキーマを使用した関数の定義
関数を定義する際にはJSONスキーマを使用する必要があります。これには、関数名、説明、パラメータ、およびそれらのタイプの指定が含まれます。
モデルが適切なJSON出力を生成するために、関数を明確に定義することが重要です。
3. コンテキストの長さ制限への注意
定義した関数はモデルのコンテキストの長さ制限に対してカウントされ、入力トークンとして課金されます。関数が多い場合や、関数の説明が長い場合は、コンテキストの制限に遭遇する可能性があります。
コンテキストの制限を超えないように、関数の数や説明の長さを制限することを検討してください。
4. 並列関数呼び出しのサポート
一部のモデルは並列関数呼び出しをサポートしています。これにより、モデルは複数の関数呼び出しを同時に実行できます。
これはAPIのラウンドトリップを減らすのに役立ちますが、結果を正しく処理する必要があります。並列関数呼び出しを使用する場合は、tool_calls配列とtool_call_idに注意してください。
まとめ
本記事では、ChatGPTの新機能であるFunction callingについて、その概要と活用方法を詳しく解説しました。Function callingを使うことで、開発者は自身で定義した関数をChatGPTに実行させることができます。さらに、この機能を通じて機械学習モデルとの連携も可能になります。
Function callingを利用するには、関数のインターフェースをJSONスキーマで定義し、APIを通じてChatGPTに呼び出させるという基本的な流れがあります。ただし、効果的に活用するためには、関数の設計を適切に行い、エラー処理やセキュリティ対策にも注意を払う必要があります。
Function callingの用途は広範囲に及びます。業務の自動化や効率化、ChatGPTの機能拡張など、様々な場面で活躍が期待されています。また、機械学習モデルとの連携により、高度なデータ分析やアルゴリズム開発にも応用できるでしょう。
本記事を通じて、Function callingの仕組みと活用法について理解を深めていただけたら幸いです。この強力な機能を正しく使いこなすことで、ChatGPTの可能性はさらに広がります。Function callingを活用し、ChatGPTをより柔軟で強力なツールとして活用していきましょう。