OpenAIのモデルとgpt_index(llama_index)を使ってビジネスに関する質問応答botを構築

openai

サイシキ代表の藤倉です
久々になってしまいましたが、弊社でも優先的に取り組んでいきたい事例が出てきましたので、簡単な内容ではありますが記事にまとめていきたいと思います。

ご存知のようにOpenAIがChatGPTを公開してから、(いくらか問題は残るものの)その発言の人間らしさや情報構築の精度の高さに皆が驚かされている昨今です。
今回ご紹介するOpenAIが提供するdavinci-003はそのChatGPTの前身とも言われているモデルで、このモデルから得られるembeddingでQAを行うbotを作成したいと思います。
残念ながらChatGPTは執筆時の現在はAPIが公開されていないためdavinci-003を使用していきますが、十分に賢いものになっています。

この記事では、ほぼ公式のチュートリアルを手元のデータで再現したものになりますが、その方法についてご紹介して、最後に簡単な考察とビジネスシーンへの展望について記載します。
(チュートリアルに関してはN番煎じの内容にはなりますが、弊社が提携している早大の研究室の新規学生の方に向けた資料の一部として活用するため、こちらにも記載を残してみたいと思います)

用語紹介(ふんわりめ)
・ChatGPT:強化学習を使用してGPTをより会話に適した形に調整したモデル
・GPT Index(この記事でコードないしはリポジトリを指す場合はgpt_index):LLMなどで作成されたembeddingを使いやすくするツール
・LLM(Large Language Model):大量のパラメータを持つモデルで大規模データを学習したモデル。この記事の文脈ではdavinci-003やChatGPTが該当
bot:対話ができるシステム。従来のQAでは回答は対象内の文字スパンだけを返していたが、davinci-003では応答文章の自動生成ができるためこのように呼称


事前準備

※執筆時現在は無料期間の設定がありますが、有料の操作が含まれるためご注意ください

OpenAIのSecretKeyを取得する

※無償化サービスが終わったタイミングでクレジットカードの登録が必要になる可能性がありますが、執筆時にはカード情報の登録も必要ありませんでした

まずは次のリンク先からOpenAIのアカウントを作成してログインを行ってください。
https://beta.openai.com/signup/

その後右上からView API Keysをクリックし、左手側のAPI Keysを開きます。
Create New Secret Keyをクリックすると、無作為なパスワードが表示されますので、これをコピーして控えておきます。
※一度この表示を消すと2度と表示されないため、紛失した場合は新規のSecretKeyの発行が必要になります

gpt_indexの準備

以下のリンク先がgpt_indexのリポジトリとなります。
https://github.com/jerryjliu/gpt_index

インストールはpipで以下のように指定します。
pip install gpt-index

ちなみに私の場合はDockerを使用して環境を閉じ込めているので以下のようにバージョンを固定しています(0.2.3は執筆時の最新版)。
RUN python3.8 -m pip install gpt-index==0.2.3

余談ですが今後もライブラリの大幅なアップデート(仕様変更)が見込まれますので、ビジネス用途の場合は再現性は確保したほうが得策だと思われます。

デモデータの準備とコーディング

社内のSandbox環境のJupyterNotebookを使用しているため、後述のスクショはセルごとの結果が表示されます。
もちろん通常のPython(.py)で試していただいても同様の結果になります。

使用するデータ

弊社のトップページの文章で試してみました。
https://www.sai-shiki.com/

すべては掲載しませんが上記のようなページの文章部分をコピペして、手作業で以下のようにexample.txtとしてまとめました(33行ほど)。

依存ライブラリのimport〜対象の抽出まで

import os
from gpt_index import GPTSimpleVectorIndex, SimpleDirectoryReader

os.environ["OPENAI_API_KEY"] = "ここにOpenAIのSecretKeyを記載"

data_dir = "../../dataset/sandbox/gpt_index/" # 実際に.txtをおいているディレクトリを指定
documents = SimpleDirectoryReader(data_dir).load_data()

※上記例ではわかりやすさのためにコード上にSecretKeyを記載していますが、この状態のままgitで管理やGithubへのアップロードなどはしないように注意してください。

筆者の環境はDockerですので、docker run時に--env-file ./.env.txtのオプションを追加しています。
.env.txtの中身は以下のようになっています。

OPENAI_API_KEY=<SECRET KEY>

あとは.env.txtを.gitignoreに記載して管理しないようにしましょう。

SimpleDirectoryReader(data_dir).load_data()で指定したディレクトリ以下にあるファイルを探索し、次に行うindex作成の対象とします。

インデックスの作成

index = GPTSimpleVectorIndex(documents)

いくつか方法はありますが、今回は一番シンプルなGPTSimpleVectorIndex()を使用します。
内部でOpenAIのAPIを呼び出すため、この処理から課金対象となります(執筆時は筆者環境では無料範囲内でした)。

筆者はまだ試せていませんが、Pineconeなどのベクトルデータベースなどを使用すると本番環境などで扱いやすそうですね。
ひとまずは以下のようにローカルストレージに作成したindexを保存します。

 index.save_to_disk(data_dir + 'index.json')

次回からは以下のようにindexをそのままロードするだけです。
同じデータを何度も計算する必要がないため、地球とお財布に優しいですね。

index = GPTSimpleVectorIndex.load_from_disk(data_dir+'index.json')

ここまでの作業で下準備となるindexの作成が完了しました。
さて、ここでindexという変数に埋め込み表現が含まれているため、この文脈に対してquery(質問)を実際に投げて行きたいと思います。

デモ結果

Q:会社名は?
A:会社名は不明です。

Q:どんなサービスを手掛けていますか?
A:当社では、自然言語処理AIからWebシステム制作まで一貫してサポートを行っています。プロジェクトの策定、AIシステムの開発・運用、Webシステムの開発・運用、文書を精査するAI、チャットボット、検索システム、コンサルティング、データ分析、Webシステムなどを手掛けています。

Q:どんなサポートがありますか?
A:当社では、自然言語処理AIからWebシステム制作まで一貫してサポートを提供しています。プロジェクトの策定、AIシステムの開発・運用、Webシステムの開発・運用、文書を精査するAI、チャットボット、検索システム、コンサルティング、データ分析、Webシステムなどをサポートしています。

考察

最初の会社名を問う質問についてですが、会社情報に関しては私がうっかりexmaple.txtに含めていませんでした。
その一方で、しっかりと見つからなかった旨を報告できている点はかなり賢いです。

2, 3点目の質問について、内容が適切なだけではなく構築された文章までしっかりとしています。davinci-003の内部で要約に親しい処理が発生し、必要な情報が残っているものと思われます。

webのリソースを使用してLLMの学習を行っている関係か、今回のようなWebコンテンツ(もしくは類するもの)に対してはかなり良い結果が出せるのかもしれません。

今後の展望

読者の皆様の気になる点は以下になるでしょうか。

  • ビジネスでどのように使えそうか
  • 既存ビジネスへの転用(ファインチューニング)

ビジネスでどのように使えそうか

例えば今回は企業情報について抽出を行いましたが、これをそのまま拡張する場合はより賢いスクレイピングを行うことができます。

例えば、筆者は学生の頃にファッション業界で複数の契約先企業のアパレルグッズに関する情報をスクレイピングする業務を行ったことがありますが、HTML要素で指定しなくとも自然言語でqueryを出すだけで簡単に、そして柔軟に情報を抽出することができるようになりそうです。

昔)クラス名がpriceとdiscount-priceの要素を引っ張ってきて、priceが打ち消されている場合はdiscount priceを優先して取得して…よしA社終わった!B社は…あれdiscount-priceじゃなくてsales-priceか…企業毎にスクリプト分けておかないとなぁ…

上記の例が今ではqueryで「今の値段は?」と聞くだけです。企業毎にスクリプトを分ける必要もありません。

情報をスクレイピングして自社DBに保管して情報を売りにするサービスやお問い合わせ対応などのQAに関するサービスは状況が一転しそうですね。

新規ビジネスへの活用については本当にアイデア次第でいくらでも可能性があるものと思います。
このあたりについては別記事にまとめたいと思います。

既存ビジネスへの転用(ファインチューニング)

業界ごとに特有の問題そして表現方法があるため、従来のAI開発では基盤モデルに対してファインチューニングを行ってその上で専用のソリューションを提供することが一般的でした。
(実際に弊社では法曹系と医療系のパートナー企業様がおりますが、効果的なアプローチが全く異なっています)

davinci-003についてOpenAIのサービス上にはファインチューニングについて記載があり、こちらを利用すると従来のように業界特有の表現に最適化していくことができるかもしれません。
https://openai.com/api/pricing/#faq-fine-tuning-pricing-calculation

またファインチューニング以外のアプローチですが、単純にindexにその業界に関連するテキスト(例えば法律なら判例、医療ならカルテなど)を含めるだけでも精度が向上する可能性があります。
上記はまだ仮説に過ぎないため実際に着手して数値で確認していきたいところです。

さいごに

本記事ではOpenAIの提供するdavinci-003とQAなどのベクトル操作と管理を簡単にしてくれるgpt_indexを使用してQAボットの作成を行いました。
弊社では新手法や旧来手法を問わず、pros/consを提示しながら課題に応じて最適なサービスをご提案してございます。
自然言語処理についてサポートが必要になりましたら弊社までご相談いただければ幸いです。

お問い合わせ: https://www.sai-shiki.com/contact/
メールアドレス: office@sai-shiki.com