メディア

ChatGPTと「外部ツール」を組み合わせる(第5回)

ChatGPTに人が直接指示をするのではなく、外部ツールの出力を与えることで回答の品質を高めることができる。

» 2023年08月29日 07時00分 公開
[畑陽一郎キーマンズネット]

 「ChatGPT」を単独で使うよりも、外部ツールと組み合わせた方がよい場合がある。

 今回はChatGPTの開発元であるOpenAIが公開した6つの戦略から5つ目の戦略*を紹介する(連載記事の一覧はこちら)。テキストベースのChatGPTとの対話から離れて、APIなどを使う。

*OpenAIがベストプラクティスとして紹介した具体例の幾つかはGPT-4でのみ動作する。

戦略5 ChatGPTと外部ツールを組み合わせる

 他のツールの出力をChatGPTに与えることで、ChatGPTの弱点を補うことができる。テキスト検索システムと組み合わせると、質問に関係ある文書をChatGPTに教えることが可能だ。コード実行エンジンと組み合わせると、数学演算やコード実行を支援できる。

 ChatGPTに任せたいタスクの中に、ツールの方が確実に、効率的に実行できる部分があるなら、その部分をツールに任せよう。

戦術1 埋め込みベースの検索を使って、効率的な知識検索を実装する

 ChatGPTは最新の情報を知らず、2021年9月時点の学習データしか利用できない。しかし、最新の情報を入力の一部として与えることでそれを活用できる。最新の情報でなくても質問に関係ある情報を与えた方が回答の質が高まる。さらに全く誤った回答(ハルシネーション:幻影)を減らすことが可能だ。

 ユーザーがある映画について質問したとしよう。その映画に関する質の高い情報(俳優、監督など)をモデルの入力に追加するとよい。短い情報であれば質問文に添えるだけでよいが、大量の情報を与えるなら、コンテクストウィンドウの制限(質問で与えることが可能な単語数などの制限)を乗り越えるため、知識の「埋め込み」を使うとよい。

 GPTの初期の研究では、文章の前半を入力したときに、次に出現する可能性が高い単語を予測することによって文章を生成する能力を高めようとしていた。ChatGPTの能力はこれだけではないが、この考え方は最新のChatGPTにも当てはまる。

 ChatGPTはテキスト文字列を数値ベクトルとして表現することでテキストの類似性や関連性を測る。数値ベクトルが近いほどテキスト文字列が類似した意味を持つ。ユーザーが新たにテキストを埋め込むと、新しい数値ベクトルをChatGPTに追加したことになる。

 ChatGPTは高速なベクトル検索アルゴリズムを備えており、新しい数値ベクトルをすぐに利用できる。ChatGPTは大量のテキストデータの集合(テキストコーパス)を複数の部分(チャンク)に分割し、それぞれのチャンクを埋め込んで保存できる。与えられた質問の文字列を埋め込み、ベクトル検索を実行して、最も関連する(つまり、埋め込み空間で最も近い)テキストの埋め込みチャンクをコーパスから見つける能力をChatGPTは備えている。

 このような使い方をするにはOpenAIなどが公開するAPIを使う。OpenAI Cookbookでは、各種のAPIを利用する方法が公開されている。

戦術2 コード実行を使用して、より正確な計算を実行したり、外部APIを呼び出したりする

 連載第4回で紹介したように、ChatGPTの計算能力は劣っている。複雑な計算や長大な計算を正確に実行することはできない(4桁の整数の掛け算でも誤ることがある)。

 何らかの計算をChatGPTに任せたい場合、ChatGPT自体が計算するのではなく、適切なコードを書いて実行するように指示できる。

 指定したフォーマットに沿って実行したいコードを含めるように指示できる。コードが出力された後、実際の計算を実行できる。さらに必要であれば、コードの実行エンジン(Pythonインタープリタなど)の出力を、次の質問のChatGPTへの入力として受け渡すことができる。

Pythonのコードを、```code goes here```のように三重のバックスティックで囲んで記述して、実行してください。これを使って計算してください。

次の多項式の実数根をすべて求めよ: 3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10.


 この場合、ChatGPTは次のようなコードを出力した。

import sympy as sp
x = sp.symbols('x')
polynomial = 3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10
roots = sp.solve(polynomial, x)
real_roots = [root.evalf() for root in roots if sp.im(root) == 0]
print("Real-valued roots:", real_roots)

 コードを実行する方法がもう一つある、外部APIの呼び出しだ。ChatGPTにAPIの適切な使い方を指示すれば、APIを利用するコードを出力してくれる。ChatGPTに、APIの使い方を示すドキュメントやコードサンプルを提供することで、APIの使い方を指示できる。

Pythonのコードを三重バックスティックで囲んで記述して実行してください。ユーザーが友達にメッセージを送るのに役立つ以下のモジュールにアクセスしてください。

```Python

import message

message.write(to="田中さん", message="仕事の後に会わない?")```.


 OpenAIはChatGPTに生成させたコードについて注意を喚起している。そのようなコードがセキュアかどうか保証されていないためだ。例えば、Webブラウザからアクセスできるサンドボックス環境で実行して結果を取得するとよい。

戦術3 モデルに特定の関数へのアクセスを与える

 OpenAIが提供する「Chat completions API」を使うと、対話形式でのテキスト生成を実現できる。このAPIを使用すると、開発者は自分のアプリケーションやサービスに対話的な機能を統合できる。

 開発者はこのAPIを呼び出してテキストのコンテキストを提供し、APIがそのコンテキストに基づいて続きのテキストを生成する。これにより、ユーザーとの対話を行うアプリケーションやチャットbotを作成できる。

 例えば次のような使い方ができる。関数の説明のリストを渡すことで、ChatGPTは提供されたスキーマに従って関数の引数を生成できる。生成された関数の引数はAPIからJSONフォーマットで返ってくる。これを関数呼び出しの実行に使用できる。関数呼び出しによって提供された出力は、ループを閉じるために次のリクエストでChatGPTにフィードバックできる。具体的な方法はOpenAIのドキュメントで解説(英文)されている。

 ChatGPTとテキストでうまく対話できるようになった後は、多少難易度が上がるものの、外部ツールやAPIの利用へと進んではいかがだろうか。

Copyright © ITmedia, Inc. All Rights Reserved.

会員登録(無料)

製品カタログや技術資料、導入事例など、IT導入の課題解決に役立つ資料を簡単に入手できます。