自己紹介と、本セッションの概要

北爪聖也氏:では「Teamsチャットボット開発:Azureを使って安全に社内文書を引用できる」ということについて発表します。

簡単に自己紹介をします。株式会社piponの代表をやっている、北爪と申します。piponという会社は、さまざまなデータ解析やシステム開発の受託をしている会社です。人工知能学会に論文を提出したり、バイエル薬品という製薬会社さまとのオープンイノベーションプログラムに採択いただいたりしている会社になります。

ということで今回は、「ChatGPT」と「Teams」などのビジネスチャットを連携することでどんなボットが作れるかを解説したいと思います。

さらに、RAG(Retrieval-Augmented Generation)についてはみなさんいろいろなところで聞いているかなと思うのですが、piponは実は2019年から自然言語解析に取り組んでいて、その当時は、今とは本当に比べものにならない昔の技術を使っていました。

その自然言語解析の歴史から解説をしたいと思います。

TeamsとChatGPTをつないだRAGでどういうことができるか

では、そもそもの本題ですね。(スライドを示して)TeamsとChatGPTをつないで、RAGでどういうことができるかというところですが、こういうことができます。

文書から調べたい疑問をチャットベースで質問することができます。質問に対して回答をボットが返してくれて、そのボットが返したデータが参考にしたデータをURLで示すことができます。

これは実際に監査法人さまと通信キャリアさまに導入しています。受託開発での導入をしていて、大きい会社だと、やはり月に6,000件とか質問があります。その質問に対して人が対応していたんですが、それを自動でボットで対応することができるようになったということで、非常に好評をいただいています。

ではどういう構成なのかというと、AzureのTeamsにMicrosoft Azureの「Bot Service」というサービスを使っています。これがボットのフロントエンドになるサービスです。裏側のバックエンドではWeb Appsというものを使っていて、Web Appsの中でFastAPIでOpenAI Serviceを叩きにいくものと、「Cognitive Search」を叩きにいくものの両方を振り分けているような状況になります。

ユーザーがクエリを出します。例えば「有給取得の方法は何ですか?」とか、「『Outlook』からログインできなくなってしまったんですけど、どうしたらいいですか?」など、さまざまなユーザーからの質問が来ます。

そのクエリに対して社内の情報を「Notion」や、大きい会社さまだとサービス内にあったりする、さまざまなものをベクトルデータベースのCognitive Searchの中に入れて、ユーザーのクエリと社内文章のもっとも意味の近いものを取得してきて、その取得してきた文章を元にAzure OpenAIが回答の生成をするというような構成になっています。

RAGである程度柔軟にチャットボットを作れるところ。これ自体が以前の自然言語解析から考えると非常に新しいわけなのですが、もちろんそれで完璧なボットができるわけではありません。

そこで大事になってくるのが、ログデータをきちんと獲得して、比率でどれくらいチャット数が多かったか、そもそもその回答が正しい、良いものだったのか・悪かったものかを回答ごとにフィードバックをユーザーからもらって、良いのか・悪いのかをきちんとログデータを取って運用改善をしていく必要が非常に大事になります。

悪かった回答がどういうものだったのかに、今さらに機能追加しようとしているのは、GPTが回答できなかったものに対しては有人に切り替えて、人がきちんとマニュアルを提示したり解説をして回答していきます。(そうすることで)本来正しく回答すべきデータが溜まっていきます。

それをさらにFAQデータの形式に直して、Cognitive Searchのベクトルデータベースの中に入れていくことで、どんどんボットが改善していくような体制を作ろうとしています。

自然言語解析の歴史 形態素解析とベクトル化

ということで、このチャットボットが非常に便利になったのですが、以前はぜんぜん違ったというところも、自然言語解析の歴史を簡単に説明できればと思います。

以前は形態素解析というものをして、それを数値に直してベクトル化をして機械学習モデルに当てはめて、どういう単語があるからどういうふうな判断ができるかというようなことを行っていました。

形態素解析というのは、意味のわかる最小単位に文章を分割して、そのあとに解析をするというような手段になります。

例えば、助詞とか句読点などはあまり意味がないものなので、名詞、形容詞、動詞など、意味のあるものに絞って解析をしていきました。

「ベクトル化」と言っているものの一番シンプルなものは、単語の出現回数をカウントするというものになります。

Bag-of-Wordsなどと言われたり、PythonのパッケージではCountVectorizerというものになっていますが、シンプルに単語のカウントをしていく。例えば「Apple computer of the apple mark」という文章があったら「appleは2回出てきて、computerが1回出てくる」というようなものです。

(スライドを示して)文章1のcomputerというものの中にはappleとはないので0で、computerとlinuxにそれぞれ1、1と付いて、他の単語は0、0というようなかたちでベクトル化していきました。

自然言語解析の歴史 文章の特徴を捉える「TF-IDF」の登場

シンプル過ぎてこれだけだとさすがにあまり文章の特徴というものを捉えられないんじゃないかということで出てきたのがTF-IDFというものです。これは、単語の出現頻度だけじゃなくて、文章の中の珍しい単語に重みを付与させてあげるというようなものになります。

例えばこういう文章があります。「私はオレンジとリンゴではリンゴが好きだ」「私は以前は青森に住んでいたが、今は東京都に住んでいる」。こういう文章があった時に、「私」という単語がいっぱい出てきます。ということは、「私」という単語はあまり重要な単語ではないんじゃないかということで、重みを下げて、スコアを下げてあげるようなことをする。

逆にこの文章の中で「オレンジ」という単語は1回しか出てきていないということで、特殊な、重要な意味があるんじゃないかということで、重みを上げてあげる。そんな数値化、ベクトル化をしていました。

こういう数値化は2019年、2020年ぐらいまでは主流でした。今も行っているのですが、その当時の主流でしたというところなの、この課題点としては、出現頻度だったり、出現頻度が少ない単語にシンプルに重みを付けてあげるだけなので、文章の意味は理解できません。

例えば「私はリンゴが好きだ」「私がリンゴが嫌いだ」という文章があったとして、正反対の意味ですが、正反対なことはベクトル上、数値上では解釈できないところが問題でした。

自然言語解析の歴史 「Word2Vec」「BERT」の登場

そこで2016年からWord2Vecが出てきたり、2018年にはBERTというもので文章を理解する、文章をさらに細かい数値ベクトルに直すことができるようになって、意味が取れるようになってきたかたちになります。

自然言語解析の歴史 OpenAIの登場でより解釈ができるように

そしてOpenAIが出てきて、adaというAPIを出すことによって、さらにリッチな数値ベクトルで文章を表現することができるようになって、意味をかなりの(精度の)解釈だったり、「私はリンゴが好きだ」「私はリンゴが嫌いだ」という文章が正反対にあるということを数値で表現することができるようになったかたちになります。

このようなかたちで自然言語解析が進化してきて、今のようなRAGで、ユーザーの質問があった時にその質問の意図や意味を理解して、関連する文章をきちんと取ってくることができて、しかもLLMによってその文章を基にユーザーの意図どおりの回答を生成するということができるようになった。

以前の自然言語解析から比べると非常に革命的なことなので、これだけ大きな話題になっているということになります。

もうそろそろ10分になってしまうかなと思うので……。「TeamsのチャットボットでRAGを使って業務効率化できる」という話で、それが非常に宿命的な、革新的なことなんだよという話をしました。ありがとうございました。