ChatGPTなどのLLMを使ったインテリジェントアプリケーションの構築

Autify, Inc.

チャットボットは決して新しいものではありません。
しかし、従来のチャットボットは事前にプログラムされた回答を返すことがほとんどで、ユーザーのエンゲージメントは低く、世間一般には普及しませんでした。
ところが、ChatGPTがリリースされて以来、チャットボットを取り巻く状況は大きな変化を遂げています。
ChatGPTは、さまざまな話題についてあまりにも自然な対話が可能で(とはいえまだ間違えることは少なくないものの)この領域への関心が再び高まっています。

ChatGPTなどのシステムの基盤には、LLM(大規模言語モデル)と呼ばれる機械学習モデルの存在があります。
ChatGPTの成功を受けて、多くの開発者や組織が独自のLLMを開発し始め、オープンソースコミュニティでも同様の動きが見られました。
MetaがLLAMAシリーズをリリースしたことが引き金となり、OSSコミュニティでさまざまなLLMが開発されたのです。
幅広い作業をChatGPTと同じくらい上手にこなせるLLMもあります。

このようなLLMは、汎用性が非常に高く、さまざまなタスクに対応する能力があります。
そのため、新しいタイプのインテリジェントアプリケーションを開発するのに適しています。
また、既存のアプリケーションにインテリジェント機能を追加するためにLLMを使い始めた企業も少なくありません。

そんなLLMですが、2023年の9月にオーティファイはテストシナリオの作成をLLMがサポートするStep Suggestions」という機能をリリースしました。
この記事では、LLMとは何か、ChatGPTがテスト自動化ツールAutifyでどのように活用されているか、LLMをどのように応用すればインテリジェントな機能を提供できるかを探っていきます。

LLMとは?

LLM(Large Language Model)とは、大規模言語モデルを指します。次の特徴を持つ、特殊なモデルの一種です。

  • Transformerアーキテクチャに基づいている
  • 言語モデルを目的としてトレーニングされている
  • パラメータ数は100億以上(10億以上もLLMと見なされる)

通常、LLMのトレーニングには、数テラバイトものテキストデータが使われます。
そのため、人間の知識が大量に詰め込まれているだけでなく、言語能力や推論能力もあるわけです。
LLMにうまく指示を与えることで、これらの能力を発揮させることができます。

パワフルなLLMはクローズドソースとして開発されているものがほとんどです。
ChatGPTなどのモデルは、Webインターフェースを通してアクセスできます。
クローズドソースモデルを運用すると、長期的にはコストがかかるものの、ローカル環境に大規模モデルを導入する手間を省くことができます。

LLMの主な制約は「コンテキストウィンドウ」

LLMをうまく運用するには、LLMの主な制約を理解しなければなりません。
それは、「コンテキストサイズには上限がある」ということです。
コンテキスト(文脈)とは、トランスフォーマーモデルの作業記憶内にあるテキストのうち、今すぐ利用可能なテキストの量を指します。
理想的には、コンテキストサイズが無制限のLLMが欲しいですし、その実現に向けた取り組みも行われていますが、現状、LLMのコンテキストウィンドウは制限されています。

ある情報がコンテキストウィンドウの外に出た場合、LLMはその情報にアクセスできなくなります。
例として、「LLMとチャットしている途中、APIキーを教えた」というケースを考えてみましょう。チ
ャットを続け、APIキーがコンテキストウィンドウの外に出てしまった場合、「APIキーを教えて」と命令しても、LLMはキーにアクセスできず、回答できません。

通常、オープンソースモデルのコンテキストサイズは2048または4096です。
GPT-4の最新版のコンテキストウィンドウは128,000トークンで、非常に多くのタスクを処理するのに十分でしょう。
ですが、コンテキストウィンドウの制限を回避するために、LangChainなどの賢いソリューションも導入されています。

AutifyのStep Suggestions機能では、非常に長いページを検証する際はHTMLページのサイズを小さくするなど、複数のテクニックを用いてコンテキストサイズの制限を回避しています。

LLMとうまくやり取りする方法

LLMとうまくやり取りするには、特殊なスキルが必要です。
最近では、LLMとやり取りするのが主な仕事の「プロンプトエンジニア」を採用している企業もあるほどです。

一般的に、人間は自然言語でLLMとコミュニケーションをとることができます。
小規模なモデルは推論能力が限られているため、プロンプトを工夫しなければなりませんが、大規模なモデルは、プロンプトの言葉遣いがあまり正確でなくてもユーザーの意図を理解してくれます。

従来的なアプリケーションとLLMを連携するには、JSONやYAMLなどのプロトコルが使えます。
従来のアプリケーションがパースできるYAMLをLLMに出力させると、最も簡単にLLMをアプリに導入することができます。

Autifyでアプリケーションをテストする際にステップを提案するStep Suggestions機能では、そのような戦略でChatGPTを取り入れています。
AutifyはYAMLを使ってChatGPTとやり取りしますが、そのYAMLの中には自然言語情報を含むフィールドがあるのです。

もちろん、LLMは確率的な判断に基づいてアウトプットするため、多少の間違いは予想されます。
「LLMが無効なYAMLを出力した」「一部の値やパラメータが無効だった」という現象も起きることがありますが、95%の確率で正しく出力できるのであれば、残りの5%のエラーについては回避策を考えれば良いのです。

ありがちな落とし穴とその対処法

独自のソリューションから始める:インテリジェントアプリを開発したり、既存のアプリにインテリジェンスを追加したりする場合、まずはLLMによるAPIアクセスを可能なソリューションから始めましょう。LLMは非常に正確で、既存のLLMを使えば、大規模なLLMを独自に構築する工数とコストを省くことができます。Autifyでは、Step SuggestionsのためのLLMを自社で構築するのではなく、ChatGPTを採用することにしました。

完璧であると思いこまない:人間が間違えるのと同様に、大半の問題については、AI・MLシステムも100%正確に解決することはできません。このことを念頭に置き、間違いを正すための解決策を開発しましょう。

プロンプト・エンジニアリング:大規模モデルでは大きな問題ではないものの、モデルが同じミスを繰り返したり、的外れな内容をアウトプットしたりすることがあります。このようなケースでは、プロンプトを更新するか、どのような回答が欲しいか欲しくないか明示してみてください。言葉で説明するより、例を示したほうがはるかに効果的です。Step Suggestions機能では、最適なステップを提案できるよう、プロンプト・エンジニアリングに注力しました。

自己評価させる:一般的に、LLMは特定のアウトプットを生成するより、アウトプットを評価することのほうが得意です。アウトプットした内容をLLMに自己評価させると、信頼度を推定できます。

アウトプットをモニタリングする:LLMの回答が驚くほどすばらしいこともありますが、とんでもない間違いをアウトプットすることもあります。そのため、本番環境にデプロイしたらアウトプットを積極的にモニタリングし、問題がある場合は率先して解決策を見つけてユーザー・エクスペリエンスに影響が出ないようにするのが大切です。AutifyのStep Suggestions機能は、W&BのWeaveインテグレーションを使って本番環境におけるシステムの使用状況をモニタリングしています。

コンテキストサイズを絶対に超えない:前述のとおり、入力がコンテキストサイズを超えるのはよくありません。例えば、コンテキストサイズが4,000のChatGPTを使っていて、入力のサイズが4,000を超えたら、16,000のバージョンに切り替えるか、アウトプットが損なわれない方法でインプットを小さくしましょう。後者は多大な労力がかかります。

プロンプトはソースコードである:LLMを使った問題解決は、プロンプトとして表現される重要な工程です。プロンプトとプロンプトテンプレートはソースコードと同じように安全に保管することが大切です。そのため、弊社ではプロンプトを拡張機能のソースコードからバックエンドAPIに移しました。また、アプリケーションの状態を表現し、バックエンドとうまくやり取りできるようにするために、複雑なデータ構造を実装しました。

おわりに

この記事では、LLMについて説明し、Autifyでこの新しいモデルがどのように活用されているか、競争力を高めるにこの最先端技術をどのように応用すればよいか解説しました。
また、オーティファイがLLMを利用した独自機能を開発した際に得た技術的インサイトも紹介しました。
これらのナレッジがみなさんのLLMを活用した開発の一助になれば幸いです。

Autifyではこの他にも品質保証やテスト、アジャイル開発に役立つ資料を無料で公開しております。ぜひこちらからご覧ください。