生成AIシステム開発の失敗事例から見えてきた課題
一昨年のChatGPT登場を受け、マクニカ ネットワークス カンパニーのシステムチームも、生成AIを使ったチャットボットの開発に着手した。社内の製品情報やナレッジ、対応履歴を学習させ、製品仕様や独自のトラブルシューティング手法を活用できるボットの実現を目指したという。
しかし、いざユーザーに使ってもらうと、期待したような精度の高い回答は得られなかった。「例えば、日本語で質問しているのに英語で回答されるなどの問題が発生しました」と山本氏は振り返る。
この時点では、システムチームは精度改善の糸口もつかめずにいた。「どこに問題があるのかもわからない状態でした」と山本氏。そこでチャットボットの構成を分析したところ、いくつかの課題が浮かび上がった。
RAGの理解とチーム連携の重要性
精度向上への第一歩は、チャットボットの構成を理解することだった。同社のチャットボットは「RAG(Retrieval Augmented Generation)」による一般的な構成を採用していた。
RAGは大きく分けて3つの処理から成る。まず「Retrieval」では、ユーザーの入力に関連するデータを検索して取得する。次に「Augmented」で、プロンプトを基にユーザーの入力した文章と検索結果によりプロンプトを拡張。最後に「Generation」で、拡張されたプロンプトから文章を生成する。
山本氏が相談を受けたチャットボットは、RAG構成を実装するためにLlamaIndexというライブラリを使用していた。データベース部には、製品のマニュアルや仕様書などの英語PDFと自社の日本語データが格納されており、これらを検索対象としていた。
プロンプト部分は日本語で回答するように作成され、LLMにはAzure OpenAI ChatGPT3.5 Turboが使用されていた。山本氏はこれらのシステム状況を確認した上で、ヒアリングから見えてきた課題を整理した。
- 各コンポーネントの処理がどうなっているのか理解されておらず、各コンポーネントの精度や動作を確認する仕組みが無い
- チャットボットの対象となるユーザー業務の詳細が定義されていない
- システムチームはユーザー業務の詳細を理解していない
課題の1つ目は、ライブラリの中身を理解せずにそのまま検索から生成までを実装していたため、各処理の詳細が理解されていなかったことだ。山本氏は「ライブラリの各処理を理解した上で、必要な部分は分解し、処理ごとの精度や動作を確認する仕組みを作ることが重要」と指摘する。
課題の2つ目と3つ目については、「ユーザーチームとシステムのチーム分かれた状態で実施をしていたため、ユーザーチームの業務の調整が実施されなかったことと、それによりシステムチームがユーザーチームの詳細を理解できていなかったことが問題でした」と山本氏。
検索と生成を分けて考える
対策としてまず取り組んだのが、RAGの「検索(Retrieval)」と「生成(Augmented Generation)」を切り分けて捉え直すことだった。精度低下の主因は、検索部分で適切な結果が得られていないことにあると山本氏は指摘する。
「まずは検索精度の向上に注力し、それから文書生成の精度を高めるアプローチを取りました」。質問と回答の距離を計算し、一定以上離れた回答は採用しないようにするなどの工夫を施したという。
文書生成については、検索で得られた結果を基に期待する文書が生成できているかを確認。複数の情報ソースを活用することで、さらなる精度向上を目指した。
言語の壁を乗り越える
英語と日本語が混在することによる弊害も、看過できない問題だった。「言語ごとにデータベースを分けて構築し、それぞれの言語のデータを格納するようにしました」と山本氏。
加えて、日本語の質問を英語に、英語の質問を日本語に自動翻訳し、適切なデータベースに問い合わせる仕組みも用意した。さらに、生成された回答を質問と同じ言語に翻訳して出力する機能も実装。これにより、言語の壁を乗り越えることに成功したのである。
RAG構成の実行環境
改善を重ねた結果、RAG構成は次のようになった。まず、各言語ごとにデータベースとプロンプトを用意。そこから得られた情報を統合し、共通のLLMで回答を生成する。質問文の翻訳と回答の翻訳も、同じLLMを活用している。