関数呼び出し:GPTチャットボットを何にでも統合する
関数呼び出し:GPTチャットボットの統合
AIアシスタントを作成してみてください。例えば、「最寄りのタイ料理レストランで最も早い予約をして、カレンダーを更新してください」と言うことができるAIアシスタントです。言語モデルは引き続き境界を押し広げ、進化し続けています。ChatGPTを開発したOpenAIは、最近、GPTモデルに機能呼び出しという強力な新機能を導入しました。機能呼び出しは、外部ツールやAPIと通信するチャットボットの作成を簡素化し、AIパワードアプリケーションの新たな可能性を切り拓くものです。
本記事では、機能呼び出しの概念、その影響、そしてAIシステムとのインタラクションにおける変革的な影響について、世界中の最新ニュースをお届けするチャットボットであるNewsGPTを作成することで掘り下げていきます。
NewsGPTの実行例。コマンドラインインターフェースでは、ユーザーが「アメリカの最新ニュースは何ですか?」と質問し、ジャーナルやソースへのリンク付きの5つの記事のリストを受け取ります。
機能呼び出しとは何ですか?
機能呼び出しは、OpenAIのGPT-4-0613およびGPT-3.5 Turbo-0613モデルの新機能です。これらのAIモデルは、ユーザーのプロンプトに基づいて機能呼び出しの必要性を検出し、通常のテキストの代わりに構造化された呼び出し要求で応答します。
機能呼び出しにより、チャットボットは他のシステムと対話することができるようになり、GPTモデルがリアルタイム情報を必要とする質問やトレーニングセットに含まれないデータが必要な質問などに応答できるようになります。言い換えれば、機能呼び出しは、AIモデルが「外部の世界とのやり取り方」を教える別の方法を提供します。
機能呼び出しの目的は何ですか?
機能呼び出し以前は、GPT言語モデルの機能を拡張する方法は2つしかありませんでした:
-
ファインチューニング:言語モデルを例文の応答を提供することでさらにトレーニングすることです。ファインチューニングは強力なテクニックですが、トレーニングデータの準備には多大な作業(およびコスト)が必要です。また、OpenAIがGPT-3.5およびGPT-4モデルでこの機能を有効にするまで、古いモデルしかファインチューニングすることはできません。
-
埋め込み:プロンプトにコンテキストデータを追加することで、ボットの知識を豊かにし、より正確な応答を生成することができます。ただし、このコンテキストは多くのトークンを占有するため、コストがかかり、複雑な応答を構築するためのトークンが少なくなります。
機能呼び出しは、GPTの機能を拡張するための3番目の方法を追加し、モデルが私たちに代わって関数を実行するように要求できるようにします。その後、モデルは関数の結果を取得し、現在の会話にシームレスに組み込める人間が読める応答を生成します。
機能呼び出しの使い方
機能呼び出しの導入により、GPT APIとのインタラクション方法が変わります。これらの関数がなかった場合、インタラクションは次のように単純でした:
-
APIにプロンプトを送信します。
-
応答を受け取ります。
-
繰り返します。
機能呼び出しを使用すると、シーケンスがより複雑になります:
-
ユーザープロンプトと呼び出し可能な関数のリストを一緒にAPIに送信します。
-
GPTモデルは、通常のテキスト応答または関数呼び出しの要求のいずれかで応答します。
-
モデルが関数呼び出しを要求した場合、チャットボットの役割はそれを実行し、結果をAPIに返すことです。
-
提供されたデータを使用して、モデルは一貫したテキスト応答を形成します。ただし、一部の場合、APIは新しい関数呼び出しを要求する場合があります。
機能呼び出しを使用したGPT APIとのより複雑なインタラクションを示す図。
チャット補完APIを使用した機能呼び出し
モデルが関数を呼び出せるようにするには、チャット補完APIを使用する必要があります。APIは、JSONペイロードを含むPOSTリクエストを受け取り、処理するメッセージのリストを含みます。APIに送信される典型的なプロンプトは次のような形式です:
{
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "太陽系には何個の惑星がありますか?"
}
]
}
role: user
は、content
がユーザー生成であることをAPIに通知します。GPT APIは、次のような応答を返す可能性があります:
{
"id":"chatcmpl-7WVo3fYwerpAptzeqU46JamOvgBzh",
"object":"chat.completion",
"created":1687983115,
"model":"gpt-3.5-turbo-0613",
"choices":[
{
"index":0,
"message":{
"role":"assistant",
"content":"太陽系には8つの惑星があります。それらは次の通りです。\n\n1. 水星\n2. 金星\n3. 地球\n4. 火星\n5. 木星\n6. 土星\n7. 天王星\n8. 海王星"
},
"finish_reason":"stop"
}
],
"usage":{
"prompt_tokens":15,
"completion_tokens":44,
"total_tokens":59
}
}
role: assistant
はGPTモデルによって生成されたメッセージに対応しています。会話の流れを維持するために、各リクエストでAPIに完全なメッセージ履歴を提供する必要があります。たとえば、前の質問をさらに掘り下げたい場合、対応するJSONペイロードは次のようになります:
{
"model":"gpt-3.5-turbo",
"messages":[
{
"role":"user",
"content":"太陽系には何個の惑星がありますか?"
},
{
"role":"assistant",
"content":"太陽系には8つの惑星があります。それらは次の通りです。\n\n1. 水星\n2. 金星\n3. 地球\n4. 火星\n5. 木星\n6. 土星\n7. 天王星\n8. 海王星"
},
{
"role":"user",
"content":"2番目の惑星についてもっと教えてください。"
}
]
}
言語モデルが関数を呼び出すことができるようにするためには、ペイロードに関数のリストを追加する必要があります。たとえば:
{
"model":"gpt-3.5-turbo-0613",
"messages":[
{
"role":"user",
"content":"ニューヨークの天気はどうですか?"
}
],
"functions":[
{
"name":"get_current_weather",
"description":"指定された場所の現在の天気を取得します",
"parameters":{
"type":"object",
"properties":{
"location":{
"type":"string",
"description":"都市と州、例:サンフランシスコ、CA"
},
"unit":{
"type":"string",
"enum":[
"摂氏",
"華氏"
]
}
},
"required":[
"location"
]
}
}
]
}
関数を呼び出すためにモデルを「gpt-3.5-turbo-0613」に切り替えたことに気付いたかもしれません。モデルが関数を呼び出すことを決定した場合、私たちはrole: assistant
のタイプのレスポンスを受け取ります。このレスポンスには次のようにfunction_call
プロパティが定義されます:
{
"id":"chatcmpl-7WWG94C1DCFlAk5xmUwrZ9OOhFnOq",
"object":"chat.completion",
"created":1687984857,
"model":"gpt-3.5-turbo-0613",
"choices":[
{
"index":0,
"message":{
"role":"assistant",
"content":null,
"function_call":{
"name":"get_current_weather",
"arguments":"{\n \"location\": \"ニューヨーク、NY\"\n}"
}
},
"finish_reason":"function_call"
}
],
"usage":{
"prompt_tokens":81,
"completion_tokens":19,
"total_tokens":100
}
}
私たちのタスクは、提供された引数でget_current_weather
を実行することです。OpenAIは関数を実行しません。代わりに、チャットボットの役割はそれを実行し、返されたデータを解析することです。
天気データを取得したら、それを新しいfunction
というタイプの役割を使用してモデルに送信します。たとえば:
{
"model":"gpt-3.5-turbo-0613",
"messages":[
{
"role":"user",
"content":"ニューヨークの天気はどうですか?"
},
{
"role":"assistant",
"content":null,
"function_call":{
"name":"get_current_weather",
"arguments":"{\n \"location\": \"ニューヨーク, NY\"\n}"
}
},
{
"role":"function",
"name":"get_current_weather",
"content":"気温:57F、天候:雨"
}
],
"functions":[
{
"name":"get_current_weather",
"description":"指定された場所の現在の天気を取得します",
"parameters":{
"type":"object",
"properties":{
"location":{
"type":"string",
"description":"都市と州、例:サンフランシスコ、CA"
},
"unit":{
"type":"string",
"enum":[
"celsius",
"fahrenheit"
]
}
},
"required":[
"location"
]
}
}
]
}
APIには、元のプロンプト、モデルからの関数呼び出し、およびコード内で天気関数を実行した結果など、すべてのメッセージ履歴が渡されることに注意してください。これにより、言語モデルは関数が呼び出されたコンテキストを理解することができます。
最後に、モデルは初期の質問に応じた正しくフォーマットされた回答で返信する場合があります。
{
"id":"chatcmpl-7WWQUccvLUfjhbIcuvFrj2MDJVEiN",
"object":"chat.completion",
"created":1687985498,
"model":"gpt-3.5-turbo-0613",
"choices":[
{
"index":0,
"message":{
"role":"assistant",
"content":"ニューヨーク市の天気は現在、57度華氏の雨です。"
},
"finish_reason":"stop"
}
],
"usage":{
"prompt_tokens":119,
"completion_tokens":19,
"total_tokens":138
}
}
NewsGPTの構築
関数呼び出しについて詳しく学ぶために、リアルタイムで最新のニュースにアクセスできるPythonチャットボット「NewsGPT」を構築します。このボットは、NewsAPI.orgから取得するデータの種類を決定するために関数呼び出しを使用します。
ボットを構築するためには、次のものが必要です:
-
OpenAI APIキー。APIリクエストには費用がかかるため、クレジットカードが必要です。ただし、新しいアカウントは最初の3ヶ月間に$5のクレジットを受け取ります。
-
NewsAPI APIキー。NewsAPI.orgで登録し、無料のスターターキーを取得してください。
-
Python 3。
プロジェクトのセットアップ
必要な依存関係をインストールしてください:
$ pip install openai tiktoken
プロジェクトは1つのファイルで構成されています。ファイル名をnewsgpt.py
とします。まず、必要なすべてのインポートを追加します:
import openai
import tiktoken
import json
import os
import requests
次に、いくつかの定数を定義します:
-
使用するGPTモデル。長い会話やより多くのコンテキストを処理するため、16kトークンの制限を持つ
gpt-3.5-turbo-16k
を使用します。 -
モデルに対して基本的な目的を指示するシステムプロンプト。
-
文字列やメッセージのトークン数をカウントするために使用されるエンコーディング。言語モデルの制限を超えないようにするために必要です。
-
チェーン内で呼び出す関数の最大数(後述)。
llm_model = "gpt-3.5-turbo-16k"
llm_max_tokens = 15500
llm_system_prompt = "ユーザーのリクエストに応じて最新のニュースと見出しを提供するアシスタントです。利用可能な関数呼び出しを使用して、常に最新の速報を取得してください。"
encoding_model_messages = "gpt-3.5-turbo-0613"
encoding_model_strings = "cl100k_base"
function_call_limit = 3
すべてのOpenAIモデルにはトークン制限があります。この制限を超えると、APIは要求に応答する代わりにエラーをスローします。したがって、トークンの数を数えるための関数が必要です。公式の例のドキュメントからこの関数を使用します:
def num_tokens_from_messages(messages):
"""リストのメッセージで使用されるトークンの数を返します。"""
try:
encoding = tiktoken.encoding_for_model(encoding_model_messages)
except KeyError:
encoding = tiktoken.get_encoding(encoding_model_strings)
num_tokens = 0
for message in messages:
num_tokens += 4
for key, value in message.items():
num_tokens += len(encoding.encode(str(value)))
if key == "name":
num_tokens += -1
num_tokens += 2
return num_tokens
呼び出すための関数の定義
次に、ニュースAPI.org APIにクエリを送信して最新ニュースを取得するための関数を定義します:
def get_top_headlines(query: str = None, country: str = None, category: str = None):
"""newsapi.orgからトップのヘッドラインを取得します(APIキーが必要です)"""
base_url = "https://newsapi.org/v2/top-headlines"
headers = {
"x-api-key": os.environ['NEWS_API_KEY']
}
params = { "category": "general" }
if query is not None:
params['q'] = query
if country is not None:
params['country'] = country
if category is not None:
params['category'] = category
# newsapi.orgから取得 - 参考:https://newsapi.org/docs/endpoints/top-headlines
response = requests.get(base_url, params=params, headers=headers)
data = response.json()
if data['status'] == 'ok':
print(f"newsapi.orgから{data['totalResults']}件の記事を処理しています")
return json.dumps(data['articles'])
else:
print("リクエストが失敗しました。メッセージ:", data['message'])
return '記事が見つかりませんでした'
GPTにこの関数について通知するために、特定のJSON構造を使用して説明する必要があります。公式のドキュメントでは、次のように形式が説明されています:
signature_get_top_headlines = {
"name":"get_top_headlines",
"description":"国と/またはカテゴリー別のトップニュースヘッドラインを取得します",
"parameters":{
"type":"object",
"properties":{
"query":{
"type":"string",
"description":"検索するためのフリーフォームのキーワードまたはフレーズ"
},
"country":{
"type":"string",
"description":"ヘッドラインを取得する国の2文字のISO 3166-1コード"
},
"category":{
"type":"string",
"description":"ヘッドラインを取得するカテゴリー",
"enum":[
"business",
"entertainment",
"general",
"health",
"science",
"sports",
"technology"
]
}
},
"required":[
]
}
}
関数呼び出しを使用したチャット補完APIの使用
次に、いくつかのタスクを実行するcomplete
関数を定義します:
-
メッセージの末尾にシステムプロンプトを追加します。このシステムメッセージは、GPTモデルが果たす役割を定義するのに役立ちます。
-
トークンの合計数がモデルの制限を超える場合、古いメッセージを削除します。
-
GPT APIにリクエストを送信します。
-
リストの末尾からシステムメッセージを削除します。
def complete(messages, function_call: str = "auto"):
"""OpenAIのGPTから補完を取得します"""
messages.append({"role": "system", "content": llm_system_prompt})
# トークン制限を超えないように古い補完を削除する
while num_tokens_from_messages(messages) >= llm_max_tokens:
messages.pop(0)
print('処理中...')
res = openai.ChatCompletion.create(
model=llm_model,
messages=messages,
functions=[signature_get_top_headlines],
function_call=function_call
)
# システムメッセージを削除し、LLMからの応答を追加する
messages.pop(-1)
response = res["choices"][0]["message"]
messages.append(response)
# モデルが要求した関数を呼び出す
if response.get("function_call"):
function_name = response["function_call"]["name"]
if function_name == "get_top_headlines":
args = json.loads(response["function_call"]["arguments"])
headlines = get_top_headlines(
query=args.get("query"),
country=args.get("country"),
category=args.get("category")
)
messages.append({ "role": "function", "name": "get_top_headline", "content": headlines})
ボットを完成させるために、ユーザーからの入力を継続的に受け付け、回答を提供するメインループを作成します:
print("\nこんにちは、私はNewsGPTです。最新のニュースAIアシスタントです。さまざまな国のさまざまなカテゴリのニュースを提供できます。")
print("以下はいくつかの例です:\n - 最近の科学の発見について教えてください\n - アメリカの最新のニュースは何ですか?\n - イーロン・マスクは最近何をしていますか?")
messages = []
while True:
prompt = input("\n何を知りたいですか? => ")
messages.append({"role": "user", "content": prompt})
complete(messages)
# LLMは関数呼び出しを連鎖することができます。これは制限を実装しています
call_count = 0
while messages[-1]['role'] == "function":
call_count = call_count + 1
if call_count < function_call_limit:
complete(messages)
else:
complete(messages, function_call="none")
# 最後のメッセージを表示する
print("\n\n==レスポンス==\n")
print(messages[-1]["content"].strip())
print("\n==レスポンスの終わり==")
次に、OpenAIとNewsAPIのAPIキーの環境変数を定義する必要があります:
export OPENAI_API_KEY=YOUR_API_KEY
export NEWS_API_KEY=YOUR_API_KEY
最後に、ファイルをロードしてチャットボットを実行します。
$ source .env
$ python newsgpt.py
NewsGPTのテスト
特定のトピックや人物について問い合わせることもできます。たとえば:
=> イーロン・マスクは最近どうしていますか?
作業中...
newsapi.orgから記事を1つ処理中
作業中...
==レスポンス==
最近、イーロン・マスクはMetaのCEOであるマーク・ザッカーバーグとの諍いについてニュースになっています。ワシントン・ポストの記事によると、マーク・ザッカーバーグはテック業界において自分自身をより関連性のある存在にしようとしており、彼とイーロン・マスクの間には競争関係があるようです。記事では彼らの争いと、ザッカーバーグがマスクのオンラインの敵対心とオフラインの騒動に対抗しようとしている様子が語られています。詳細については[こちら](https://www.washingtonpost.com/technology/2023/06/24/elon-musk-mark-zuckerberg-fight-meta-twitter-rival/)をご覧ください。
==レスポンスの終わり==
このボットはカテゴリも認識できるため、健康関連のニュースをリクエストすることもできます:
健康に関する重要な進展はありますか?
作業中...
newsapi.orgから1000の記事を処理中
作業中...
==レスポンス==
健康カテゴリの最新の見出しに基づいて、以下はいくつかの重要な進展です:
1. [最近移植された腎臓患者における帯状疱疹眼症の症例](https://www.cureus.com/articles/164429-a-case-of-herpes-zoster-ophthalmicus-in-a-recently-transplanted-renal-patient?score_article=true) - この症例報告では、腎臓移植を受けた51歳の男性の臨床経過と帯状疱疹眼症の発症が紹介されています。
2. [良い食事に基づく気分改善のための主なアドバイス](https://news.google.com/rss/articles/CBMilQFodHRwczovL3d3dy5jYW5hbDI2LmNvbS9nZW5lcmFsL2N1YWxlcy1zb24tbG9zLXByaW5jaXBhbGVzLWNvbnNlam9zLWEtc2VndWlyLXBhcmEtbWVqb3Jhci1lbC1lc3RhZG8tZGUtYW5pbW8tYS1iYXNlLWRlLXVuYS1idWVuYS1hbGltZW50YWNpb24tLTM0NTMwM9IBAA?oc=5)(スペイン語) - この記事では、良い食事を通じて気分を改善するためのアドバイスが提供されています。
3. [夏にお腹の脂肪を減らす方法](https://news.google.com/rss/articles/CBMiXmh0dHBzOi8vbS5hei1qZW5hdGEuYmcvYS81LXpkcmF2ZS1pLWtyYXNvdGEvNjM1Mzkta2FrLWRhLXN0b3BpdGUta29yZW1uaXRlLW1hem5pbmktemEtbGlhdG90by_SAWJodHRwczovL20uYXotamVuYXRhLmJnL2EvNS16ZHJhdmUtaS1rcmFzb3RhLzYzNTM5LWthay1kYS1zdG9waXRlLWtvcmVtbml0ZS1tYXpuaW5pLXphLWxpYXRvdG8vYW1wLw?oc=5)(ブルガリア語) - この記事では、夏にお腹の脂肪を減らすためのアドバイスが提供されています。
4. [RCCの診断から治療、毒性管理、そしてそれ以上へのまとめ](https://news.google.com/rss/articles/CBMiZ2h0dHBzOi8vd3d3LmNhbmNlcm5ldHdvcmsuY29tL3ZpZXcvcmVjYXAtZnJvbS1yY2MtZGlhZ25vc2lzLXRvLXRyZWF0bWVudC10b3hpY2l0eS1tYW5hZ2VtZW50LWFuZC1iZXlvbmTSAQA?oc=5) - この記事では、腎細胞癌の診断、治療、管理について説明しています。
5. [CRSを対象としたがん免疫療法の進展と課題のレビュー](https://news.google.com/rss/articles/CBMiYmh0dHBzOi8vd3d3LmFqbWMuY29tL3ZpZXcvcmV2aWV3LWhpZ2hsaWdodHMtcHJvZ3Jlc3MtY2hhbGxlbmdlcy13aXRoLWNycy1pbi1jYW5jZXItaW1tdW5vdGhlcmFwaWVz0gEA?oc=5) - このレビューでは、CRS(サイトカイン放出症候群)を標的としたがん免疫療法の進展と課題についてハイライトされています。
これらは健康分野の最近の進展の一部です。詳細な情報については、提供されたリンクをクリックしてフル記事をお読みください。
==レスポンスの終わり==
それは国々でも可能であり、特定の地域に関するニュースをボットにクエリすることができます:
フランスの最新ニュースは何ですか?
作業中...
newsapi.orgから34の記事を処理中
作業中...
==応答==
以下はフランスの最新ニュースの見出しの一部です:
1. 「Diplôme national du brevet session 2023」- 国立教育省が2023年セッションの国家試験を発表しました。[詳細を読む](https://news.google.com/rss/articles/CBMiTGh0dHBzOi8vd3d3LmVkdWNhdGlvbi5nb3V2LmZyL2RpcGxvbWUtbmF0aW9uYWwtZHUtYnJldmV0LXNlc3Npb24tMjAyMy0zNzg1NjDSAQA?oc=5)
2. 「Cyclisme: la Nordiste Victoire Berteau sacrée championne de France après sa victoire sur les routes de Cassel」- ノール地方のVictoire Berteauがフランスの自転車競技で優勝しました。[詳細を読む](https://news.google.com/rss/articles/CBMiiQFodHRwczovL3d3dy5mcmFuY2V0dmluZm8uZnIvc3BvcnRzL2N5Y2xpc21lL2N5Y2xpc21lLXZpY3RvaXJlLWJlcnRlYXUtc2FjcmVlLWNoYW1waW9ubmUtZGUtZnJhbmNlLWFwcmVzLXNhLXZpY3RvaXJlLWEtY2Fzc2VsXzU5MDg4NDcuaHRtbNIBAA?oc=5)
3. 「Guerre en Ukraine: comment les capitales étrangères réagissent-elles à la rébellion de la milice Wagner en Ru」- ウクライナのワグナー民兵の反乱に対する外国の首都の反応。[詳細を読む](https://news.google.com/rss/articles/CBMiwAFodHRwczovL3d3dy5mcmFuY2V0dmluZm8uZnIvbW9uZGUvZXVyb3BlL21hbmlmZXN0YXRpb25zLWVuLXVrcmFpbmUvZ3VlcnJlLWVuLXVrcmFpbmUtY29tbWVudC1sZXMtY2FwaXRhbGVzLWV0cmFuZ2VyZXMtcmVhZ2lzc2VudC1lbGxlcy1hLXJlYmVsbGlvbi1kZS1sYS1taWxpY2Utd2FnbmVyLWVuLXJ1c3NpZV81OTA4NzY2Lmh0bWzSAQA?oc=5)
4. 「Marche des fiertés LGBT+: six jeunes mineurs interpellés pour homophobie」- LGBT+プライドマーチ中に逮捕された6人の未成年者。[詳細を読む](https://news.google.com/rss/articles/CBMifmh0dHBzOi8vd3d3LnJ0bC5mci9hY3R1L2p1c3RpY2UtZmFpdHMtZGl2ZXJzL21hcmNoZS1kZXMtZmllcnRlcy1sZ2J0LXNpeC1qZXVuZXMtbWluZXVycy1pbnRlcnBlbGxlcy1wb3VyLWhvbW9waG9iaWUtNzkwMDI3Nzg4M9IBAA?oc=5)
5. 「ATP 500 Queen's - De Minaur a dominé Rune avec autorité: le film de la demi-finale」- Alex de MinaurがATP 500 Queen'sの準決勝でRuneを圧倒しました。[詳細を読む](https://news.google.com/rss/articles/CBMimwFodHRwczovL3d3dy5ldXJvc3BvcnQuZnIvdGVubmlzL2F0cC1sb25kcmVzLzIwMjMvYXRwLTUwMC1xdWVlbi1zLXN1aXZlei1sYS1kZW1pLWZpbmFsZS1lbnRyZS1hbGV4LWRlLW1pbmF1ci1ldC1ob2xnZXItcnVuZS1lbi1kaXJlY3Rfc3RvOTY3MTM4My9zdG9yeS5zaHRtbNIBAA?oc=5)
これはフランスの最新ニュースの一部です。特定のニュース記事についての詳細情報が必要な場合はお知らせください。
改善のアイデア
このシンプルなボットは、1つの関数呼び出しでもかなり高機能です。さらに多くの機能を統合した場合の可能性を想像してみてください。以下は、NewsGPTを強化するためのいくつかのアイデアです:
-
元の記事を取得して要約し、ニュースを分析する。ペイウォールを回避したり、ウェブスクレイピングを行ったり、RSSフィードやAPIがコンテンツを提供しているかどうかを確認する必要があります。
-
エンドポイントを追加する。NewsAPIは、日付やカテゴリでニュースを検索したり、ソースを絞り込んだりするためのエンドポイントを提供しています。
-
天気や金融などのソースからリアルタイムデータを取得するなど、追加の統合を取り入れる。
結論
関数呼び出しは、OpenAIのGPTモデルの強力な機能であり、外部ツールやAPIとより決定論的かつ構造化された方法でやり取りすることができます。この機能は、従来不可能だった現在の情報を提供し、それ以上のタスクを実行することができる、よりダイナミックでレスポンシブなAIアプリケーションの基盤となります。
楽しい開発を!
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles