ChatGPTを利用して自社プロダクト「CSアナリティクス」に関するQAを解決できないか試してみた

2023.03.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!DA(データアナリティクス)事業本部 サービスソリューション部の大高です。

私は部内のサービス開発チームに所属しており、チームで開発した自社プロダクトとしてデータ分析基盤の「CSアナリティクス」というプロダクトがあります。

このプロダクトについて社内でもQAを行うことがあるのですが、ChatGPTを用いることでこのQAを効率化できないか検証してみました。

前提

今回はいわゆるチャット形式の画面で利用するChatGPTではなく、OpenAI APIを利用して検証します。 APIはChat completionのAPIを利用します。

利用するコード

先日は、以下のエントリのようにコードを準備して試してみました。

今回は、前回作成したものをベースに、以下のようなコードに修正して試してみます。

src/index.ts

import { Configuration, OpenAIApi } from "openai";
import * as dotenv from "dotenv";
dotenv.config();
import * as fs from "fs";

const configuration = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);

function listTargetFiles(dir: string, extensions: string): string[] {
  const files: string[] = fs
    .readdirSync(dir, { withFileTypes: true })
    .flatMap((dirent) =>
      dirent.isFile()
        ? [`${dir}/${dirent.name}`]
        : listTargetFiles(`${dir}/${dirent.name}`, extensions)
    )
    .filter((fileName: string) => fileName.endsWith("." + extensions));
  return files;
}

function loadFiles(files: string[]): string {
  let contents = "";
  files.forEach((path: string) => {
    contents += fs.readFileSync(`./${path}`, "utf-8");
  });
  return contents;
}

export async function ask(content: string, model = "gpt-3.5-turbo-0301") {
  try {
    const files = listTargetFiles("input", "txt");
    const systemContents = loadFiles(files);
    const response = await openai.createChatCompletion({
      model: model,
      messages: [
        { role: "system", content: systemContents },
        { role: "user", content: content },
      ],
    });

    const answer = response.data.choices[0].message?.content;
    console.log(answer);
  } catch (e) {
    console.log(e);
  }
}

const question = "CSA Data Uploaderには、どのような機能がありますか?";
ask(question, "gpt-3.5-turbo");

loadFilesを利用して、特定ディレクトリ内のファイルからシステムメッセージを読み込んで、システムメッセージとして利用します。

また、モデルは先程述べたようにgpt-3.5-turboを指定しています。

システムメッセージに情報を付加して聞いてみる

システムメッセージについては、以下のように説明されています。

The system message helps set the behavior of the assistant. In the example above, the assistant was instructed with "You are a helpful assistant."

システムメッセージを指定することで、振る舞いの設定をすることができるので、こちらを利用して試してみます。

また、モデルの利用についても注釈がありました。

gpt-3.5-turbo-0301 does not always pay strong attention to system messages. Future models will be trained to pay stronger attention to system messages.

gpt-3.5-turbo-0301はシステムメッセージに対する強い注意を常に払うわけではない、ということなので、今回はgpt-3.5-turboを利用します。

URLをシステムメッセージに指定して聞いてみる

まずは以下のようなシステムメッセージを用意します。

input/sample.txt

あなたはカスタマーサポートです。お客様からの質問に答えてください。
対象としている製品は「CSA Data Uploader」です。
---
製品のユーザーガイドはこちらのページです。
https://user-guide.csa-du.cs-analytics.info/v2.1.1/index.html

質問は上記コードにあるとおり 「CSA Data Uploaderには、どのような機能がありますか?」 です。

回答は以下の通りでした。

CSA Data Uploaderには、以下のような機能があります。

1. データのアップロード:CSV、Excel等のフォーマットで保存されたデータを、簡単にアップロードすることができます。

2. データのマッピング:アップロードされたデータを、データベースにマッピングすることができます。

3. バリデーション:アップロードされたデータに構文エラーやレコードの重複がないかチェックすることができます。

4. クエリの作成:データベースからの抽出クエリを簡単に作成することができます。

5. ダッシュボードの表示:抽出クエリを基に、ダッシュボードを作成することができます。

6. スケジューリング:データのアップロードやクエリの実行をスケジュールすることができます。

以上が、CSA Data Uploaderの主な機能です。

素敵な機能ですが「2〜5」については、実際にはCSA Data Uploaderには存在しない機能です。それっぽい機能を推察して提示してくれているようですが、URLとして与えた情報は参照してくれないようです。

テキストをシステムメッセージに指定して聞いてみる

次に、実際にユーザーガイドに記載されているテキストをそのままコピーした、以下のようなシステムメッセージを用意します。

input/sample.txt

あなたはカスタマーサポートです。お客様からの質問に答えてください。
対象としている製品は「CSA Data Uploader」です。
---
はじめに
CSA Data Uploader ユーザーガイドへようこそ
当ページでは、CSA Data Uploader(以下"Data Uploader")の使い方について解説します。

CSA Data Uploaderとは
Data Uploaderは、データ分析環境への「データの受け渡し」に関する以下の処理をスムーズかつ平易に作成・実行するための機能群を提供します。

任意のODBC接続で接続可能なデータソースからデータを抽出する処理
列の選択や文字列変換等、簡易なETL処理
S3へのファイルアップロード処理
上記処理をジョブとして定義し実行
ジョブのスケジュール管理と通知

Data Uploaderでは、AWSに於ける「データ分析環境に於ける作業」の薄緑枠の範囲をサポートします。

CSA Data Uploader のドキュメントバージョン
このドキュメントは、CSA Data Uploaderのバージョン「v2.1.1」を基にした内容で記載しています。

回答は以下の通りでした。

CSA Data Uploaderには、以下の機能があります。

1. 任意のODBC接続で接続可能なデータソースからデータを抽出する処理
2. 列の選択や文字列変換等、簡易なETL処理
3. S3へのファイルアップロード処理
4. 上記処理をジョブとして定義し実行
5. ジョブのスケジュール管理と通知

これらの機能を利用することで、データの受け渡しに関する処理をスムーズかつ平易に作成・実行することができます。

完璧ですね。このことから、システムメッセージを利用することで良いQA対応ができると推察されます。

大量のシステムメッセージは利用できるのか?

次に、大量のシステムメッセージを指定したくなるのですが、実際にユーザーガイドに利用しているテキストファイルをすべてデータソースとして設定すると、400 Bad Requestエラーが発生します。

これは、OpenAI APIのPlaygroundページで同様に検証すると以下のようにエラーが表示されます。

This model's maximum context length is 4097 tokens. However, your messages resulted in 5746 tokens. Please reduce the length of the messages.

つまり、最大長の4097トークンを超えたメッセージを送信しているので、エラーが発生してしまっています。

これはドキュメントにも記載されているAPIの仕様のため、解消するのは難しいです。

事前に用意した情報で学習されるにはどうすればよいのか?

この課題を解決するためには、2つぐらいの方法がありそうでした。どちらも一長一短がありそうですが、利用用途に応じてうまく使い分けると良さそうですね。

Fine-tuning

1つ目はOpenAI APIの「Fine-tuning」を利用する方法です。

こちらはOpenAI APIが提供しているモデルを独自の情報でトレーニングする仕組みです。かなり良さそうではありますが、学習元とするデータセットの準備など含めて、ある程度の手間はかかりそうです。

一方で、APIとして用意されているので固有の言語などに縛られずに利用をすることは可能です。

利用可能なベースモデルは以下とのことです。

  • davinci
  • curie
  • babbage
  • ada

LLamdaIndex

2つ目はオープンソースで公開されているPythonのライブラリ「LLamdaIndex」を利用する方法です。

こちらを利用することで、簡単にファイルやURLから情報を取得して学習させることができます。

一方で、こちらはPythonのライブラリなのでNode.jsで利用するようなことは難しいです。

また、利用可能なモデルは「Defining LLMs — LlamaIndex documentation」に記載のモデルになるようです。

  • text-davinci-003 (デフォルト)
  • text-davinci-002
  • text-curie-001
  • text-babbage-001
  • text-ada-001
  • code-davinci-002
  • code-cushman-001

まとめ

以上、ChatGPTを利用して自社プロダクト「CSアナリティクス」に関するQAを解決できないか試してみました。

現状では、システムメッセージを含めてAPI呼び出しに利用できる情報量に上限があるため、単純なAPIの利用方法では完全なQAのやりとりまでは至ることは難しそうです。

このような用途で利用したい場合には、別途学習を行わせたモデルを用意して利用するべきと思われます。一方で、gpt-3.5-turboのモデルが非常に良いので、こちらを利用したい想いもありますが、現在はベースモデルとしては利用できないようです。GPT-4もリリースされたので、将来的にベースモデルとして対応されるかどうかも気になりますね。

どなたかのお役に立てば幸いです。それでは!

参考