はじめに
こんにちは。SR(Service Reliability)チームでSRE(Site Reliability Engineer、サイト信頼性エンジニア)業務を担当しているChaeseung Lee(argon)です。
SRチームは、Service Engineering室に所属しており、LINEアプリが提供するサービスの品質向上と可用性の確保を目指して技術活動を行い、AWXやRundeck、Concourse CIなどの自動化プラットフォームを運用しています。また、サービスのリリースやイベントに必要な技術的要素を確認し、適切なソリューションを提供することで、開発組織が開発や運用に集中できるようにサポートしています。
私はオープンチャットのSREとして、主にオープンチャットサービスの信頼性を高めることに努めています。同時に、従業員の業務自動化を支援するためのAWXプラットフォームの管理も担当しています。今回の記事では、AWXプラットフォームを運用する中で、繰り返し発生する問い合わせに効果的に対応するため、RAG(Retrieval-augmented generation、検索拡張生成)を活用したAWXサポートボットの導入事例について紹介したいと思います。
AWXサポートボット開発の動機
何かを始めるときはガイドを読むべきだと分かっていても、実際には読まずに始めてしま うことがよくあります。このような問題は、特に初期段階で読むべきガイドの量が膨大な場合や、自分に必要な情報がなかなか見つからないときによく発生します。このとき、ユーザーが早く始めたいと思い、管理側に同じ問い合わせが重複して送られてくると、管理者はそれに対応するために運用リソースを大きく消耗することになります。

上記の問題を解決するために、ガイドを読めば解決できる問い合わせに対しては、自動で一次回答を提供できるシステムが必要だと考え、検索と生成を組み合わせたRAG手法を活用し、AWXサポートボットを開発することにしました。
AWXサポートボットの実装に使用したフレームワークとツールの紹介
詳細を説明する前に、AWXサポートボットの実装に使用したフレームワークとツールを紹介します。

- Slackボットフレームワーク:Bolt for Python
- Slackでは、さまざまな言語ベースのボットフレームワークを提供しています。その中で、個人的に馴染みのあるPythonボットフレームワークを選択しました。
- LLMフレームワーク:LangChain
- LangChainフレームワークは、PythonとJavaScriptの2つの言語で提供されています。
- AWXサポートボットには多くの機能が必要なかったため、LangChainを使うことにしました。もし、より複雑なワークフローや状態管理、マルチエージェントコラボレーションを求める場合は、LangGraphの利用をおすすめします。
- 埋め込みモデル:paraphrase-multilingual-mpnet-base-v2
- 文をベクトルに変換する埋め込みモデルには、SBERTモデルやOpenAIテキスト埋め込みモデルなどさまざまな選択肢があります。その中で、オープンソースのSBERTモデルを選択しました。
- LINEヤフーでは、多国籍のメンバーが一緒にサービスを開発しているため、問い合わせも多言語で寄せられています。これを考慮し、SBERTが提供する性能評価表を参照して、多言語をサポートするモデルの中でテキスト間の類似度比較に最も優れているparaphrase-multilingual-mpnet-base-v2を選択しました。
- ベクトルDB:OpenSearch
- LLM:OpenAI(ChatGPT)
- LINEヤフーでは、適切な用途で申請すればOpenAI APIを使用できるので、OpenAIを選択しました。
- OpenAI Enterpriseの場合、基本的にビジネスデータを学習していないことも考慮しました(参考:https://openai.com/enterprise-privacy/)。
- LangChainフレームワークではOpenAIだけでなく、OllamaやAmazon BedrockなどさまざまなLLMと連携できるため、それぞれの環境に適したLLMを選択できます。
LLMとRAGとは?
RAG手法を理解するには、まずLLM(Large Language Model)とその課題を知る必要があります。
LLMは、膨大な量のデータで事前学習されたディープラーニングモデルです。テキストから意味を抽出し、単語やフレーズ間の関係を理解して出力を生成します。学習したデータに基づいて適切な回答を生成することもありますが、以下のような課題があるため、不適切な回答を生成することもあります。
- 最新情報の反映が難しい:回答は事前学習されたデータに基づいているため、最新の情報を反映できません。
- 誤った情報を生成する可能性:事前学習データにない質問に対しては、不正確または誤った情報が回答として提供される可能性があります。