白井氏の自己紹介

白井仁美氏(以下、白井):「LayerX Biz Boost 〜セキュリティチェックシート一次回答の取り組み〜」と題して、LayerXの白井から発表します。

自己紹介です。ハンドルネームは「yakipudding」で活動しています。2023年3月にLayerXに転職してきて、機械学習エンジニアをやっています。

LayerXは法人向け支出管理サービス「バクラク」シリーズを提供しているんですが、ふだん(私)はそのAI-OCR機能の開発を行っています。

それとは別でLLMを活用した社内向けプロダクト「LayerX Biz Boost」の開発にも取り組んでいるので、今回はこちらについて発表します。

LayerXについて

まずLayerXについて説明します。LayerXはスタートアップで、バクラク事業とFintech事業とPrivacy Tech事業、LayerX LLM Labsの4つの事業を行っていて、私はバクラク事業部のメンバーです。

このバクラクシリーズは、いわゆる経理向けのシステムです。例えばイベントを開催する時に、みなさんが何か申請をしたり、稟議を通したり、実際に買ったもののレシートを経費精算のために提出したりすると思うんですけれど、そういったものに使うワークフローのシステムがあります。

あるいは物を買った時、経理の方に「請求書が届いたので支払いをお願いします」というかたちでやるものや、ビジネス用のカードを提供するサービスです。

おかげさまで、バクラクは多くのお客さまに導入いただいていて、現在では累計5,000社突破というかたちで成長しています。

LayerX Biz Boostについて

最初にお話しした「LayerX Biz Boostというのは何ぞや?」というと、単純にLLMを活用した社内向けの業務効率化ツールの名前です。ちなみにこの名前は、ChatGPTに「キャッチーな名前をつけてくれ」と言ったら(これを)出してくれたので、そのまま採用しています(笑)。

中身は、社内向けのChatGPTやセールスチーム向けに商談の文字起こしと要約をしてくれるもの、あるいは今回発表するセキュリティチェックシートの一次回答。ほかにも発表できないものもいろいろあるんですが、多くの機能をそろえています。

ちなみにLayerX Biz Boostがなぜできたのかとか、背景、あるいは商談文字起こしのところとかは、別のスライドや記事があるので、興味がある方はぜひ見てみてください。

「セキュリティチェックシート」とは何か

今回の本題の「セキュリティチェックシート一次回答」(について)です。馴染みのない方にとってはおそらく「セキュリティチェックシートって何ぞや?」だと思うんですが、要はセキュリティに関する質問票です。

先ほどお話ししたように、法人向けにサービスを提供していく上で、利用者のお客さまが「バクラクってセキュリティ的に大丈夫なの? うちの請求書とかを預けて大丈夫なのか?」というところを確認するためのものです。

お客さまからセキュリティに関する質問を受けたら、セキュリティの担当者が回答するというのが業務フローとして存在します。

「セキュリティチェックシート」に関するつらいところ

ここのつらいところが、お客さまごとに質問形式が本当に多種多様になっていることです。セキュリティチェックシートには「こういうテンプレートがあるよ」というものがあるかというと、正直ありません。

「大まかにこういう観点で見てね」と経済産業省から提供されているものはあるんですが(笑)。そこには具体的な質問があるわけではないので、各社で作成され継ぎ足され、秘伝のタレ化してしまっています。

セキュリティに関することなので基本的には同じようなことは聞いているんですが、聞き方や答え方が微妙に違って。例えば上(の質問)は○×の回答を求めていて、下(の質問)は自由記述。でも中身は似ているようなことを聞いている状態です。

ということで、回答する担当者からすると答えるのがめちゃくちゃつらい作業になったり、あるいは質問数がめちゃくちゃ多くて大変なものになっています。

ということで、「よし、じゃあこれをLLMに回答させてみよう」というのが(今回の取り組みの)きっかけでした。

「セキュリティチェックシート」をLLMに回答させるための仕組み

仕組みとしてはけっこうよくあるやつなんですが、質問文で「責任者を定めていますか?」というものが来たら、それをベクトル化して、過去に回答したものや想定質問みたいな事前に用意していたものから参考情報を取り出して、「この参考情報があったから質問に回答してね」というかたちでGPTに回答を生成してもらうという、いわゆるRAG(Retrieval Augmented Generation)と呼ばれているような、けっこうあるあるなやり方を使っています。

(スライドを示して)これで「はい」と答えてくれましたね、ということです。

これがLLMに向いていたポイントとしては、想定質問集や過去のセキュリティチェックシートの回答を参考情報としてプロンプトに渡すことで、GPTもわりと答えやすいというか、すぐ近くに答えがあるものをそのまま出せばいいみたいな、お題がそもそも簡単であるというところが1つポイントでした。

GPTはやはり嘘をつくとか(笑)。難しいことを聞くとどうしても“ハレーション”といって嘘をつかれてしまうので、できるだけわかりやすく答えやすいように提供しています。

あるいは「参考情報にないものは答えないで」という聞き方をすることで、わからないものは「わからないと」出力させて、嘘を言わせない工夫もできます。

もう1つ向いていた点としては、参考情報自体のベクトルが作りやすいという話ですね。元のデータがあって、そこから参考情報を取り出すのはあるあるなんですが、それがドキュメントだったりすると、どの部分でembeddingを作るのかとか、チャンク分けをどうするのかといったところが課題になることがけっこう多いです。

セキュリティチェックシートに関しては、元ネタがそもそも一問一答形式で短文なので、そのままembeddingを取ればいいところで楽できるなと、向いているなという部分でした。

発生した2つの課題とそれぞれの解決方法

実際に先ほどのやり方で取り組みをしてみたのですが、課題として、プロンプトで参考情報に「回答:はい」をそのまま渡してしまうと、質問では「いる」と「いない」で逆のことを聞いているのに、GPTの回答は参考情報の回答に対して「はい」と答えちゃうことがありました。

プロンプトが参考情報をもとにと聞いているのでそのまま答えてしまったと思うんですが、実際は「いいえ」なのに、そのまま出力されては困るということがありました。

なので、工夫としては、参考情報のほうは質問形式の「はい」「いいえ」という回答をそのまま使われてしまうと困るので、「セキュリティの責任者を定めています」のように要約させたかたちで与えることで、GPTがちゃんと考えて「いいえ」と答えてくれるという改善をしました。

課題の2つ目は、先ほども説明したんですが、やはり質問の数が多いので、まとめてバッチを実行したんですが、GPTはAPIのリクエストですぐRateLimitErrorが出たり、サーバーエラーが出たりして、扱いがすごく難しいです。

かつ、セキュリティの担当者の要望からすると、ユーザーがWebアプリにアップロードして自動で回答させたいという要望があって、ちょっとがんばらないといけない状況がありました。

ここは正直愚直に対応するしかないというところで、リトライ機構をちゃんと組んで、あとはWebアプリケーションではなくて「Cloud Run」のジョブで非同期で動かせて、その後Slackに通知する仕組みをやりました。

非同期で動かせる機能自体は、先に説明した商談文字起こしの機能でやったので、そこを一部流用して使うようにしています。

(スライドを示して)というところで、課題1、2と対応してきた結果、セキュリティ担当者からは「けっこういいんじゃない?」「本格運用できるんじゃない?」という言葉はもらったんですが、正直まだまだ課題は山盛りです。

「そもそもこのシステムのセキュリティ対応をちゃんとしないといけないよね」とか、「UXを改善しないといけないよね」とか「データが増えるから差分indexingしたいよね」とか、そういったところがいろいろ出てきています。

私の本業がどうしてもAI-OCRの開発でなかなかリソースが足りない。

ということで、興味がある方はぜひカジュアル面談からお話ししましょう。みなさんぜひお気軽にお願いします。

発表は以上になります。ありがとうございました。

質疑応答

司会者:ありがとうございました。では、5分ほど(の)質問タイムに移りたいと思います。Zoomではまだ質問をもらえていないですが、みなさんいかがでしょうか。あれば拾うのでぜひ書いてください。Twitter(現X)では感想をたくさんの方が書いてくれている感じですが、質問は来ていないのかな?

会場のみなさんいかがでしょうか? ありがとうございます。

質問者1:今後の課題のところでセキュリティ対応必要だよねという部分も言及されていたので、(対策は)すでにあると思うんですが、お客さんからいただくセキュリティの質問ということなので、お客さまはセキュリティの部分を気にしているんじゃないかと思うんですが、「ChatGPTにいただいた質問を渡すけど大丈夫ですか?」という話をする必要はあるんでしょうか?

白井:ChatGPTにプロンプトとして参考情報を渡すこと自体は、説明していないですが「Azure OpenAI Service」というGPTのサービスを使っていて、ここで「このデータは学習に使わないでね」というような、契約じゃないですがオプトアウト申請をして通ったものを使っているので、そこの部分に関しては問題はないです。

どちらかというと、Cloud Runのサービスが最低限の社内の人しかアクセスできないように入り口を止めているというところはある程度してはいるんですが、セキュリティ担当者からするともうちょっと堅牢にしたいとか(笑)。そもそも開発者が変なことをできないようにしたいとか、そういう別側のセキュリティ対応で課題があります。

そこがまだ十分にできていないというか、わりと社内向けだから「えいや!」で出して、「最低限だけブロック、その他は後で」みたいなところで、まだタスクが残っているイメージです。

質問者1:わかりました、ありがとうございます。

司会者:ありがとうございます。(次の質問者をさして)どうぞ。

質問者2:セキュリティチェックシートの質問や回答で類似の文章がすごくたくさんあると思うんですが、適切な文章を選んで参考情報にするとか、そういった部分はうまくいきましたか?

白井:そうですね。わりと聞き方が似ていたり、質問・回答が短文だというところで、現状はそれなりにちゃんとしたものが取れていました。ただ一方で、まだまだ使えるものが少ないというか、そもそものデータ数がもうちょっと欲しいというところで、まだちょっと工夫が必要なのかなと思います。

というのも、まだバクラクシリーズを導入してからそこまでの年数が経ったわけでは正直ないので、手元に大量のデータがあるというほどではないという状況があります。

質問者2:ありがとうございました。

質問者3:質問失礼します。セキュリティチェックシートで、たまに数百問の質問が飛んでくることがあると思うんですが、例えばExcelで飛んできた質問をどのようにChatGPT、このシステムに渡しているのかがちょっと気になりました。

白井:ありがとうございます。具体的にどう渡しているかというと、Excelで来たものを、TSV、要はCSVみたいなものに変換させて、それをアップロードして、Cloud RunサービスのWebアプリケーションにアップロードします。そうするとストレージと連携されてCloud Run Jobsが回答するようなかたちになっています。

Webアプリケーション上で、「indexを指定してくれ」みたいなかたちにしているので、データを上げて「ここの部分が質問の列だ」と指定すれば、そこに対してGPTが回答するという、わりとシンプルな仕組みにしています。

質問者3:ありがとうございます。

司会者:あと1名。この質問で最後にさせてもらえればと思います。お願いします。

質問者4:ありがとうございます。セキュリティチェックシート、めちゃめちゃ対応している者です。これを聞いてめちゃくちゃすばらしいなと、「最高や、この会社で働きたい」と思ったんですが。

(会場笑)

半分冗談です……全部冗談です。

例えば、対応している時に固有の言葉だったり、委託先、委託元みたいな、「どこが主語やねん」みたいなやつがけっこうあるなと思っていて。甲乙とか、人間が解釈するのもムズいものもけっこうあったりします。

それはどうされていますか? 課題の1つとしていったん無視なのか、何かしら有用な情報だと思うし、何かしら対策して使ったら結果が変わると思うし……。そういう理解で良いですか?

白井:そこに関しては特別な手当てをしているわけではないんですが、質問文をベクトル化しているところで、ある程度、質問文の単語の1つずつにすごく強い意味を持たせているわけではないので、そういう意味で情報として欠損している可能性があるかなと思っています。

なので、わりと強めの単語がembeddingに行って、そこから類似の質問を検索させてというところが、うまくいけばうまくいくし、うまくいかなければうまくいかないというのは、実際あると思います。

質問者4:ありがとうございます。ぜひ懇親会でも具体的なところをうかがいたいです。

白井:ありがとうございます。

司会者:ありがとうございます。では、これで質疑応答を以上にします。あらためて、ありがとうございました。