SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

生成AIで自社サービスをパワーアップしよう! 「ChatGPT API」活用ガイド

ワンランク上のチャットBotの作り方 〜ChatGPTに独自機能を実装する方法〜

生成AIで自社サービスをパワーアップしよう!「ChatGPT API」活用ガイド 第2回

その他の活用例

 Function Callingを活用したチャットBotの実装例をあと2つ紹介します。大部分の実装は上記と同じになりますので、関数の部分のみコードを掲載します。先ほどご紹介したコードに組み込む場合は、当該箇所の他に、システムプロンプトの内容と、関数名と関数本体の紐づけを行なっている箇所を適宜修正してください。

自身が知らない情報をGoogleで検索して答えるAI

 通常、ChatGPTは学習が行われた時点までの知識しか持っていませんが、以下のような関数を定義して与えることで、知らない情報を自分で検索しにいくことができるようになります。

 尚、こちらはGoogleのCustom Search JSON APIという仕組みを利用してAPIから検索を実行します。利用するためにはGoogle Cloudのプロジェクトを作成し、APIキーと検索エンジンIDを取得する必要があります。

Google検索を行う関数
import requests

GOOGLE_API_KEY = "<Google APIキー>"
GOOGLE_CSE_ID = "<検索エンジンID>"

def google_search(query):
    
    # クエリの内容を表示(赤字)
    print('\033[31m' + "Google検索: " + query + '\033[0m')

    # 検索APIのパラメータを設定
    params = {
       "q": query, # 検索文言
       "num": 3, # 取得件数
       "key": GOOGLE_API_KEY, # APIキー
       "cx": GOOGLE_CSE_ID # 検索エンジンID
    }

    # APIで検索を実行
    url = "https://www.googleapis.com/customsearch/v1"
    response = requests.get(url, params=params)
    result = response.json().get("items", [])
    
    # 検索結果を返却
    return json.dumps(result)

 関数の仕様は以下のようになります。

Google検索を行う関数の仕様
tools = [
    {
      "type": "function",
      "function": {
          # 関数名
          "name": "google_search",
          # 関数の説明
          "description" : "Googleで情報を検索します。",
          # 引数の定義
          "parameters": {
              "type": "object",
              "properties": {
                  # 引数① 検索ワード
                  "query": {
                      "type": "string",
                  },
              }
          },
      }
    }
]

 引数の内容はシンプルに検索ワードだけで、queryという項目名だけでそれが伝わると判断したため、項目の説明は省略しています。

 この関数をChatGPTに与えると以下のような会話が行えます。

User > CodeZineに公開されているChatGPT API関連の記事のタイトルとURLを教えてください
Google検索: ChatGPT API site:codezine.jp
AI >  最近公開されたChatGPT API関連の記事のタイトルとURLは次の通りです:

1. タイトル: 自社のデータを活用しよう! ChatGPT APIを活用したオリジナルAIチャットBotの作成方法
   URL: https://codezine.jp/article/detail/18630

2. タイトル: データベース開発ツール「SI Object Browser」にChatGPT APIを利用しSQL自動整形機能が追加
   URL: https://codezine.jp/article/detail/18018

3. タイトル: ChatGPT APIをB2B SaaSで本番利用するために超えるべき4つのハードル
   URL: https://codezine.jp/article/detail/18345

以上の記事で、ChatGPT APIに関連した様々なテーマが掲載されています。

 このように、ChatGPTに学習されているはずのない最新の情報がきちんと引き出せていることがわかります。関数の中身を変えればもちろんGoogle検索以外にも利用でき、Slackなどの社内チャットの検索や、ベクターストアから独自知識を取得してくることも可能です。

 注意点として、Function Callingでは関数の実行結果を会話の一部としてAPIに送信する必要がありますが、このようなインプット系の利用方法では実行結果のトークン量が大きくなりがちです。特に、過去の検索結果が履歴に残り続けるような実装になっていると、会話のたびに大量のトークンを消費することになるので注意してください。

 AIに独自知識を与えるという目的においては、前回の記事でご紹介したような、会話のたびに関連知識をプロンプトの一部として与える手法と、こちらのFunction Callingを用いた手法との2つの選択肢が生まれることになります。

 Function Callingを使用する手法は、必要なタイミングで適切なクエリを用いて情報を検索しに行けるので、より精度の高い知識を獲得できる反面、裏を返せばAIが必要と判断したタイミングでしか知識を参照しにいかないということでもあり、こちらが思うように検索処理が実行されない場合もあります。また、APIコールを複数回実行しなければならない都合上、関数が使用される頻度によっては必ずしもトークン効率が良いとも言えません。例えば、冒頭でご紹介した家電を操作するAIに「各家電の現在の状態を参照する」という機能を追加するなら、参照用の関数を与えるよりも、毎回プロンプトに情報を組み込む方が効率的かもしれません。各状況に応じて使用する手段を適切に選択することが重要です。

画像を生成するAI

 ChatGPT APIと同じくOpenAIが公開しているImage Generation APIを使用して自由に画像を生成できるAIも作ってみましょう。以下の関数を与えることで、AIはテキストだけでなく、画像を使って返答を行えるようになります。

 画像生成APIはChatGPT APIと同じOpenAIモジュールでアクセスすることができます。但し、利用には別途料金がかかりますのでご注意ください。

Google検索を行う関数
from PIL import Image
from io import BytesIO
from IPython.display import display

def generate_image(prompt):
    
    # プロンプトの内容を表示(赤字)
    print('\033[31m' + "画像生成: " + prompt + '\033[0m')

    # 画像を生成
    response = client.images.generate(
      model="dall-e-3",
      prompt=prompt,
      size="1024x1024",
      quality="standard",
      n=1,
    )

   # 画像のURLを取得
    image_url = response.data[0].url
    # URLから画像を取得
    img = Image.open(BytesIO(requests.get(image_url).content))
    # 画像を表示
    display(img)

    # 検索結果を返却
    return "画像生成: {}".format(prompt)

 関数の仕様は以下のようになります。プロンプトを英語で作成してもらうために、仕様は全て英語で定義しています。

画像生成を行う関数の仕様
tools = [
    {
      "type": "function",
      "function": {
          # 関数名
          "name": "generate_image",
          # 関数の説明
          "description" : "Generate image from prompt.",
          # 引数の定義
          "parameters": {
              "type": "object",
              "properties": {
                  # 引数① プロンプト
                  "prompt": {
                      "type": "string",
                      "description": "Prompt to generate image (English only)",
                  },
              }
          },
      }
    }
]

 このチャットBotと会話を行った様子はこちらです。

User > あなたがもし人間ならどんな景色の場所に行きたいですか?

AI > もし私が人間なら、美しい自然の中で静かに流れる川や青々とした森林がある場所に行きたいです。そこで風に吹かれながらリフレッシュしたいです。

User > その風景を画像で見せてください。

画像生成: A peaceful riverside surrounded by lush green forests and a clear blue sky.

AI > こちらの画像は、美しい川岸に囲まれた緑豊かな森と澄み切った青空を表現したものです。静かで穏やかな雰囲気が感じられます。

 このように、テキストだけの会話とは一味違う体験を提供することができます。もちろん関数の内容をアレンジすればグラフやその他の形式の表現も扱うことができるようになります。

 上記のコードはGoogle Colaboratory上での実行を想定し、IPythonモジュールを使用してセルの中に画像を直接表示していますが、本来であれば表示処理は連携先のアプリケーションに合わせて実装する必要があります。

まとめ

 今回の記事では、一歩進んだチャットBotの作り方として、Function Callingの使用方法についてご紹介しました。この内容を参考に、ぜひ色々な関数を実装して試してみてください。

 次回の記事では、チャットという形式から離脱して、ChatGPTを汎用自然言語処理モデルとして活用する方法にフォーカスして解説する予定です。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
生成AIで自社サービスをパワーアップしよう! 「ChatGPT API」活用ガイド連載記事一覧

もっと読む

この記事の著者

株式会社ブリューアス AI-TEAM(カブシキガイシャブリューアス エーアイチーム)

 モバイルのアプリを中心にUI/UXデザインから開発保守まで、幅広い実績を持つ会社です。専門的な知識と豊富な開発経験を活かし、AIとサービスの統合を推進しています。 Brewus.inc

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/18833 2024/01/16 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー