SlashGPTで、No-CodeでAIエージェントを作る方法
SlashGPTは、LLM(主にGPT, PaLMも可)を使った様々なプロトタイプを作るために作った「Playground(遊び場)」です。会話の途中で、"/"(Slash)で始まるコマンドで、エージェント(=チャットボット)を切り替えたり、LLMを切り替えたり出来るので、SlashGPT という名前をつけました。
SlashGPTは、様々なAIエージェントを、コードを書かずに、Matafile(および、それに付随する function の定義)を JSON 形式で記述するだけで簡単に追加できること、を目的に作っています。とにかく「私自身にとって便利」なことを最優先にしています(つまり、私自身が1番のユーザーです)。
今回は、Metafileの作り方を解説します。分かりやすい例として、Open WeatherのAPIを活用して、各地の現在の天気を調べてくれる"weather"を例に挙げて説明します。Metafile は以下の通りです。
{
"title": "Open Weather",
"description": "Gets Weather Info",
"bot": "Weather",
"source": "snakajima, https://openweathermap.org",
"temperature": "0.0",
"functions": "./resources/weather.json",
"actions": {
"get_current_weather": {
"url": "https://api.openweathermap.org/data/2.5/weather?q={location}&appid={appkey}",
"appkey": "OPENWEATHER_API_KEY"
}
},
"model": "gpt-3.5-turbo-16k-0613",
"sample": "What is the weather in Seattle today?",
"samplej": "東京の天気は?",
"prompt": [
"Don't make assumptions about what values to plug into functions.",
"Ask for clarification if a user request is ambiguous.",
"When presenting weather, please describe:",
"description (such as 'sunny' or 'rain')",
"temperature (both in Fahrenheit and Centigrade, NEVER in Kelvin)",
"wind",
"air pressure",
"visibility"
]
}
"title": "Open Weather"
は、weatherエージェントをアクティベートした時にユーザー向けに表示されるタイトルです。
"description": "Gets Weather Info"
は、dispatcher と呼ばれる特殊なエージェント(後述)が、どのエージェントをアクティベートすべきかを決めるために使われる説明文です。ChatGPTのプラグインのdescriptionと同じ役割を果たします。
"bot": "Weather"
は、ユーザーと対話する際に、表示されるエージェントの名前です。これはオプションで、指定しないと、単に"GPT"と表示されます。
"source": "snakajima, https://openweathermap.org"
は、作者や出典を示しますが、これはプログラム上は何の役割も果たさない、コメントのようなものです。
"temperature": "0.0"
は、LLMを呼び出す際に使うtemperatureです。指定しないと 0.7 になります。数字が1に近い方が、クリエイティビティを発揮しますが、その分、出鱈目なことも言い始めます。
"functions": "./resources/weather.json"
は、このエージェントが呼ぶことの出来るfunction (複数も可能)の定義ファイルへのリンクです(オプション)。Metafileの中に書かずに、別ファイルとして提供します。
./resources/weather.jsonの中身は以下の通りです。
[
{
"name": "get_current_weather",
"description": "Get the current weather",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city, e.g. San Francisco"
}
},
"required": ["location"]
}
}
]
このファイルに定義されている関数は、get_current_weather一つだけで、パラメータは、場所を指定するlocation一つで、必須です。Python形式で書けば、以下の通りになります。
def get_current_weather(location:str):
ChatGPTのプラグインの場合、関数は、OpenAPI形式のYAMLで指定しますが、functionの場合は、この例のように、JSONのschemaとして定義するのです。
"actions": {
"get_current_weather": {
"url": "https://api.openweathermap.org/data/2.5/weather?q={location}&appid={appkey}",
"appkey": "OPENWEATHER_API_KEY"
}
}
は、functionの実行方法を指定しています。このケースでは、Open WeatherのREST APIを指定しています(それ以外の方法もありますが、ここでは省略します)。OpenAPI形式だと、これもYAML内で指定しますが、functionの場合に、関数の定義と実装は切り離されているので、ここで指定しています。
urlだけを指定すると、HTTP-GETが、method に"POST"を指定すると、HTTP-POSTが使われます(パラメターはJSONフォーマットでBODYとして渡されます)。
ここでは指定していませんが、HTTP Headersをここで指定することも可能です。例えば、appkeyをBearerトークンとして使う場合、
"headers": {
"Authorization": "Bearer {appkey}"
}
のように指定します。
"appkey": "OPENWEATHER_API_KEY"
はソースコードに直接書きたくない(=Gitで管理したくない)シークレットキーなどを .env ファイルで指定する場合に使います。これが指定してあると、.envファイルからそのkey(このケースでは、OPENWEATHER_API_KEY)にアサインされた値を取り出し、functionのargumentsに追加し、urlを展開する際に(Pythonのformatを使って展開します)、functionのパラメータと同様に参照することが可能になります(自分の環境で"weather"を走らせる際には、Open WeatherのWebページで、app key(無料版)を取得してください)。
urlのvalueの中に{location}と{appkey}が含まれていますが、これが展開(argumentsの適切な値が代入)されます。locationが"Los Angels"で、Open Wetherのapp keyが"abcde"だった場合(つまり、.envファイル内に、OPENWEATHER_API_KEY=abcd
と指定されていた場合)、実際にHTTP-GETでアクセスするurlは、
https://api.openweathermap.org/data/2.5/weather?q=Los%20Angels&appid=abcde
になります。
"model": "gpt-3.5-turbo-16k-0613"
は、使うべきLLMモデルを指定しています。指定しない場合、"gpt-3.5-turbo-0613"が使われます。
"sample": "What is the weather in Seattle today?"
"samplej": "東京の天気は?",
は、文字通り、サンプルqueryです。/sample
と打つことで、これを自動入力できるので、テストやデモに使っています。"sample"で始まるものは全て呼び出すことが可能で、"samplej", "sample_test" などの形で、複数指定することが可能です。
"prompt": [
"Don't make assumptions about what values to plug into functions.",
"Ask for clarification if a user request is ambiguous.",
"When presenting weather, please describe:",
"description (such as 'sunny' or 'rain')",
"temperature (both in Fahrenheit and Centigrade, NEVER in Kelvin)",
"wind",
"air pressure",
"visibility"
]
は、このエージェントと会話する際に指定する system promptです。プロンプトの書き方については、他でも色々と解説されているので、ここでは詳しく書きませんが、このケースでは、Open WeatherのAPIから取得したデータをどう表示すべきかを指示しています。
weatherエージェントは、SlashGPTを立ち上げてから、/weather
と入力するとアクティベートされます。
You(dispatcher): /weather
Activating: Open Weather
You(weather): 東京の天気は?
Function: get_current_weather(location=Tokyo)
Weather: 東京の天気は、雨です。現在の気温は華氏303.5度(摂氏約25.3度)で、風速は6.17メートル/秒です。気圧は1004ヘクトパスカルで、視界は10000メートルです。
ちなみに、SlashGPTを立ち上げた時に、最初にアクティベートされるdispatcherエージェントは、weatherエージェント向けの質問が来ると、自動的にweather エージェントをアクティベートして、その質問に答えさせる機能がついています。Metafileのdescriptionは、ここで活用されます(dispatcherについては、別の機会に詳しく解説します)。
You(dispatcher): 東京の天気は?
Function: categorize(question=東京の天気は?,category=weather)
Activating: Open Weather
Function: get_current_weather(location=Tokyo)
Weather: 東京の天気は、雨です。現在の気温は華氏303.5度(摂氏約30.5度)で、風速は6.17メートル/秒です。気圧は1004ヘクトパスカルで、視界は10000メートルです。
SlashGPTは、最初に立ち上げた時は、manifestsフォルダーの中にあるmanifestファイル全てを一つのセットとして読み込み、それらで定義されたエージェント間を、"/{エージェント名}"
で自由にアクティベートできるようにします。エージェントの一覧は、/help
コマンドで参照することが可能です。
Agents:
/aiagents AI Agents
/browser Internet Browser
/cal Calendar
/cook Home Cooking System
/currency Currency Converter
/definitive Definitive Facts
/dispatcher Main Dispatcher
/drone2 Drone Pilot
/home2 Home Automation
/kayak Kayak (not accessible yet)
/noteable WIP: Noteable
/weather Open Weather
/webpilot Web Pilot AI
/wolfram Wolfram
/worldnews World News
manifestファイルは、prompts, roles2, rpg1 フォルダーの中にも複数入っており、それらに切り替える際には、それぞれ/roles1
, /roles2
, /rpg1
コマンドを使います。最初のセットに戻る際には、/resetコマンドを使います。
ちなみに、以上に書いた仕組みを使うと、ChatGPT向けに作られたプラグインの多く(ログインが不要で、OpenAI以外からのアクセスをブロックしていないもの)を、そのまま SlashGPT 上で動かせるようになります。YAML形式で定義されたものを JSON schemaに変換し、manifest ファイルを作るだけで、Pythonのコードは一切追加する必要はありません。
manifests 内にあるエージェントのうち、webpilot, wolfram, worldnews, currency, aiagentsはChatGPTのプラグインを移植したものです。
kayakも移植を試みましたが、アクセスがブロックされてしまうため、動きません。
noteable は一部のAPI(get_user_info)は動くのですが、肝心なもの(create_notebookなど)がエラーになってしまい、原因を究明中です。
ちなみに、ChatGPTのプラグインの一覧は、GPT Storeで公開されており(非公式)、そこでYAMLファイルやプロンプトを参照することも可能です。もし、特定のプラグインをSlashGPTで動かしてみたい、と思う方がいれば、是非ともチャレンジし、Pull Requestを下さい。
人工知能を活用したアプリケーションやサービスを活用し、内発的動機付けで行動するエンジニア、起業家、社会起業家をサポートするコミュニティーです。 singularitysociety.org
Discussion