😺

SlashGPTで、No-CodeでAIエージェントを作る方法

2023/07/14に公開

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を下さい。

シンギュラリティ・ソサエティ

Discussion