💬

1番手早く自社サービスAPIとGPTを接続する方法 (OpenAI.functions + SlashGPT)

2023/09/23に公開

自社サービスとしてAPIを公開しているが、ユーザーにAPIを使って何が実現できるのかというのが伝えきれていない、使ってもらうハードルが高いということはよくあると思います。また色々なユースケースごとにAPIを呼び出すプラグラムをつくっていくのも工数がかかります。
ユーザーがこんなことしてほしいと自然言語で入力すると対応する自社サービスのAPIが呼び出される。そんな夢のような仕組みがOpenAIから2023年6月に提供されたfunctionという仕組みとSlashGPTを組み合わせることで驚くほど簡単にできますので紹介します。

準備

概要フロー

OpenAI GPTは2021年9月時点のインターネット、SNSの情報をもとに学習した内容で回答を作成します。その時点ですでによく使われていたPublicなAPIであれば(例:YahooFinanceの株価問い合わせなど)追加情報を送らなくても対象PublicAPIを呼び出すコードを生成してくれます。しかし、自社サービスの新しいAPIなどは自社サービスのAPI仕様をまずGPTに教える必要があります。その後GPTに自然言語でといあわせて、もし自社サービスAPIを呼ぶべきとGPTが判断したときはGPTの応答にfunction_callが指定されてきます。その応答を受け取ったSlashGPTはfunctionを実行して、APIの応答を再度GPTになげることでユーザーへの最終回答を得ます。

このあと、一つずつ解説していきます

SlashGPTとは?

SlashGPT中島聡が開発したChatGPTなどのLLMエージェントを手軽に開発するためのツールです。SlashGPTを使えば、jsonファイルを記述するだけでChatGPTを使ったLLMエージェントやチャットアプリを手軽に、簡単につくることができます。

OpenAI.Functions

Open AIでchatに対する応答を要求するAPIChatCompletion.createfunctionsパラメタに任意のAPI仕様をわたすと、GPTがそのAPIを呼ぶべきと判断した時に、応答のなかなにfunction_callというが追加され、関数名、パラメータをGPTが指定してくれるというものです。

Request param例

functions = [
    {
        "name": "get_current_weather",
        "description": "Get the current weather",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "The city and state, e.g. San Francisco, CA",
                },
                "format": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"],
                    "description": "The temperature unit to use. Infer this from the users location.",
                },
            },
            "required": ["location", "format"],
        },
    },

Response 例

{'role': 'assistant',
 'content': None,
 'function_call': {'name': 'get_current_weather',
  'arguments': '{\n  "location": "Glasgow, Scotland",\n  "format": "celsius"\n}'}}

SlashGPTによる外部APIの実行

連携させたい自社サービスのAPI仕様ごとに異なります。実際は自分たちの手元にすでにあることを想定しています。この記事ではGithubのGraphQL APIを例に使用します。

function 定義の作成

通常のAPIの場合はOpenAPIの形式で準備しますが、GraphQLの場合は共通で下記のものが利用できます。
https://github.com/snakajima/SlashGPT/blob/main/resources/functions/graphql.json

追加resourceとして、Github GraphQLが対応しているSchemaも準備します
 https://docs.github.com/ja/graphql/overview/public-schema からDLしたスキーマをよく使うもの2000行程度にカットしたものを準備します。

manifest の作成

GPTと通信するChatApp:SlashGPTのAgentの動作を決定するmanifestファイルを作成します。

  • 下記のようにfunctions,resourceの定義を行い、上記ファイルパスを設定します。
  • 外部APIを呼び出す時に必要なendpoint等を actionsの中に指定しています。
  • API Key (secret)等は.envファイルに下記のappkeyの項目のprefixに 'SLASH_GPT_ENV_'を追加した環境変数として定義しておきます。(この例ではSLASH_GPT_ENV_GITHUB_TOKEN)
  • Userの質問とともに、GPTに渡される文章をpromptとして定義します。さらにこのなかに上記APIに関する補足情報resourceも含めます。

重要: ここで定義したpromptの質がChatAppサービスの質、ユーザー体験を決定します。チューニングポイントです。

{
  "title": "GitHubMetrics",
  "description": "Metrics about GitHub repo",
  "about": "kozayupapa",
  "temperature": "0.0",
  "functions": "./resources/functions/graphql.json",
  "resource": "./resources/functions/github_basic.graphql",
  "actions": {
    "call_graphQL": {
      "type": "graphQL",
      "url": "https://api.github.com/graphql",
      "appkey": "GITHUB_TOKEN",
      "headers": {
        "Authorization": "bearer {appkey}"
      }
    }
  },
  "prompt": [
    "You are an expert in GraphQL and use call_graphQL function to retrieve necessary information.",
    "Ask for clarification if a user request is ambiguous.",
    "When you see errors in your code, fix it and rerun it up to `Two times`",
    "Here is the schema of GraphQL query:",
    "{resource}"
  ]  

動作確認方法

この記事の例で使用しているmanifestは slashGPTに取り込んでもらっているので、RepositoryをCloneすればすぐに試せます。

  1. Secret等の準備
  2. 起動% python ./SlashGPT.py
  3. manifestを選択You(GPT): /gitm
  4. あとは実際の質問プロンプトを入力するだけです。以下のように外部サービスのAPIの応答を利用しないと答えられない質問にも答えてくれます!

例1:

You(gitm): Github snakajima/SlashGPTのmain branchへのauthor user ごとに 2023-9-1からのコミット数を取得して多い順にuser名、commit数のリストソートして出力して
1. snakajima: 32
2. isamu: 26
3. kozayupapa: 5
4. ystknsh: 4

注意:  どんな回答にも正確に答えてくれるわけではないです。たとえば上記の質問を直近1ヶ月のとかえると正しく解釈してくれません。このあたりは与えるAPI仕様を関係ある部分はフルセットで入力することと、promptを工夫するといったことが考えられます。

また答えの内容が正しくないこともありますので、最初は自分たちが正解をしっている質問でためしてみてください。slash GPT上で/verboseと入力すると詳細のログも出力されるので製品レベルにするには、 APIの応答、GPTへのリクエスト、応答等 地道に追っていくことも必要になると思います。

まとめ

functionsを利用することで、任意のAPIを呼び出してその結果をつかってGPTに回答してもらうことがスムーズに実現できます。そしてAPI定義さえあれば、その拡張はコードを書く必要もなくmanifestに記述するだけで 対応可能です。NoCodeで自分たちのサービスとGPTをつないでみてください!

参考:NLUIの時代の幕開け

中島さんのメルマガ2023/6/27より

NLUI (Natural Language User Interface)の時代の幕開けが、この「function call」のリリースによって、本格的に始まった、という事実です。
LLM(Large Language Model:大規模言語モデル)の応用は、さまざまなものが試みられていますが、LLMには「得意なこと」と「不得意なこと」があります。LLMは、基本的には「辻褄があうように次の単語を見つけ出す」ことが得意な言語モデルなので、文章の要約、文脈の理解、翻訳などは得意ですが、数学は苦手だし、知らないことを聞かれた時には答えをでっちあげてしまうことすらあります。
上のホーム・オートメーションの例のように、ユーザーからのリクエストに応じて、適切な関数を呼び出す作業は、「文脈の理解(ユーザーが望んでいることの理解)」と「翻訳(自然言語から、function callへの翻訳)」であり、LLMが得意とすることなのです。
現在、企業が使うシステムの多くはデータベース化されており、そこでは莫大な数の人が、人間からのリクエストに応じて、そのデータベースに変更を加えたり、データベースからデータを取り出す作業をしています。ざっと思いつく例を挙げれば、

ホテル・美容室・マッサージなどのサービス業の予約受付業務
飲食業の注文受付業務
カスタマー・サポート
アンケート・世論調査
必要経費・仮払金・立替金などの入力業務
企業間の注文受付業務
小売・卸売業の在庫管理、売上予想、仕入れ管理
工事現場の進捗管理・報告
などです。企業によっては、雇われている人の大半がそんな作業をしていると言っても過言ではありません。

LLMは、まだまだ「汎用人工知能」と呼んで良いほど賢くはありませんが、適切な使い方をすれば、「十分に使えるレベル」であり、ものによっては「人間よりも役に立つ」レベルにすらなっています。
今後多くの仕事が、LLMを活用したNLUIによって、効率化・自動化されるだろうと思いますが、単に効率化・自動化だけを目指すと、「安かろう悪かろう」になってしまうので、同時に、そのサービスを受ける人にとって「より良い体験」が得られるようになるように作り込むことが何よりも大切です。
これまでの「音声認識」「音声合成」だけを活用した効率化・自動化は(例:巷で広く使われている、自動音声応答システム)、まさに「安かろう悪かろう」と言えるユーザー体験しか提供出来てきませんでしたが、それが一気に「人間のオペレータと話すよりも便利」なユーザー体験を提供することが可能になったのです。
上に列挙したような仕事が効率化・自動化されることにより、人間の職が奪われる、失業者が増えるなどの心配をする人がいますが、時代の流れを止めることが出来ません。少子高齢化が加速する先進国では、労働者不足が深刻であり、労働者が不足している分野での人工知能の活用は、特に積極的に進めるべきだと私は考えています。
さらに言えば、アプリやウェブサイトが提供するGUIを使いこなせない人も大勢いるし、私のように、この業界で働いている人間でも、なかなか目指す部分に到達できないことがしばしばです。GUIと比べると、NLUIを活用すれば、よりユーザーに寄り添った「痒い所に手が届く」ユーザー体験を提供することが可能であり、ここは私のような、ソフトウェア・エンジニアの力の発揮しどころだ、とつくづく思います。

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

Discussion