はじめに
こんにちは、中村友亮(なかむら ゆうすけ)と申します。私は早稲田大学基幹理工学部情報通信学科4年生で河原研究室に所属しており、普段は自然言語処理についての研究を行っています。
現在はLLM(大規模言語モデル)のHallucination(AIモデルが事実とは異なる回答を生成してしまう現象)の低減やベンチマークに興味を持っており、関連する研究に取り組んでいます。
自然言語処理を用いた実サービスの開発に取り組むことのできるインターンシップに参加したいと思い、早稲田大学データ科学センターの産学連携型キャリア教育プログラムを通して、2023年8月1日から9月20日の期間、AIトランスフォーメーションセンターのインターンシップに参加させていただきました。
インターンシップでは「社内文書を利用したマルチターンQA」をテーマとして研究開発に取り組みました。本レポートでは取り組んだ上記の内容とインターンシップの流れについて具体的な作業内容と併せて紹介したいと思います。
インターン参加前の私
今後インターンシップに参加させる方に向けて、インターンシップに参加する前の私のスキルについて紹介しておきます。
- プログラミングスキル:PythonでAtCoderのABCのC~D問題が解ける程度。コードについて他人のレビューをもらったことはなく、とりあえず機能すればよいという意識で記述していた
- コードのバグ修正は都度print関数で出力して行っており、デバッグツールの使用経験なし
- GitHubは自分の記述したコードをコマンドでアップロードしたことがある程度
- Microsoft Azureの使用経験はなし
- バックエンド、フロントエンドに関してはほとんど知識がない状態
- 大学の講義でICTに関しては一通り学習していた
インターン活動内容
社内文書を利用したマルチターンQAに取り組む背景
OpenAIによるChatGPTのリリースを皮切りに、生成AI、特にLLM(Large Language Model)の性能や利便性に対して大きな注目が集まっており、ビジネスの場においても多くの分野・企業にて生成AIの導入が進められています。その有用性は、社内データを参考文書としたシングルターンのQAにおいても確認されています。*1
検証されているのは、質問に対してLLMが一度だけ回答を返すシングルターンのQAですが、ユーザーの質問に対して対話を続けることによって、ユーザーが知りたい情報を提供するマルチターンの回答方式を導入することでより利便性を高め、幅広く回答できるようになると考えられます。 その仮説の下で、今回は「社内文書を利用したマルチターンQA」の開発に取り組みました。
開発の形式としては、Know Narratorのコードを参考に技術検証用アプリケーションを開発するという流れで進めていきました。
最終成果物
2ヶ月弱のインターンでこちらのマルチターンQAアプリケーションを開発しました。
検証用のデータを参照して、ユーザーの質問に対しChatGPTが対話形式に回答を生成することができます。
2ヶ月のスケジュール
週3日9:30~17:30まで勤務(12:00~13:00昼休憩) 勤務日数や曜日に関しては自分の都合に合わせてインターン開始直前まで融通していただきました。
週 | フェーズ | 詳細 | |
---|---|---|---|
8月1週目 | 環境構築、Azure AI | 機能をAzureサービス(Azure OpenAIを含む)を利用して開発 | |
8月2週目 | Azure AI | 同上 | |
8月3週目 | バックエンド | PythonのフレームワークであるFastAPIを利用してAPIを開発 | |
8月4週目 | フロントエンド | JavaScriptのフレームワークであるVue.jsを利用してUIなどの部分を開発 | |
8月5週目 | フロントエンド | 同上 | |
9月1週目 | 精度検証 | 暫定版のプロトタイプで機能を検証 | |
9月2週目 | 精度改善、ブログ執筆、発表準備 | 同上 | |
9月3週目 | 最終調整、発表 | 成果物と経験等についてAITCメンバーに発表 |
インターンの各フェーズの詳細
インターン時のスケジュールについて詳細は以下の通りです。
8月1週目(環境構築、Azure AI)
貸与PCのセットアップなど開発環境の構築やインターンの進行についての説明を受けました。Microsoft Azureの利用についても説明いただき、Azureを用いたAI部分の開発にも取り掛かり始めました。
8月2週目(Azure AI)
PCの自宅利用申請が完了したので、ここからリモートでの作業が始まりました。内容としてはAIパートの続きです。
- Form Recognizerを使って社内データ(pdf)をテキスト化
- テキストを塊(チャンク)として小さく分け、インデックスとして保存
- ユーザークエリに対してCognitive Searchを用い、インデックスから類似文書(参照するべきと考えられる文書)を検索
- 検索した文章を参考にユーザークエリに対してChatGPTによる回答を生成
といったセクションに分かれてそれぞれのコーディングを進めていきました。 様々なリソースのAPI を使いながらAzure に慣れました。
8月3週目(バックエンド)
AIパートに一区切りをつけ、FastAPIを用いたAPIの開発に取り組みました。 今までFastAPIに触れたことがなかったので1からの学習となりました。 ここでは、正確に学習を進めるために公式ドキュメントをきちんと確認することの重要性を知りました。
実装した機能は以下2つです。
- 利用可能なモデルの一覧表示機能
- 指定したモデルを用いて質問文に対する回答生成
ここからはGitHubを用いての開発となります。 それに伴いpushやpull requestなど基本的な流れに加え、コードの可読性や保守性を高める記述法などについてメンターの方に説明していただき、記述したコードに対して数人のエンジニアの方々からレビューをいただいていました。 この時点でVisual Studio Codeのデバッグモードなども使い始めており、エンジニアが実際にどのように開発を行っているかについて大まかな理解をしたうえで、開発に取り組むことができるようになっていたように思います。
8月4~5週目(フロントエンド)
APIの機能の実装を終え、ローカル上で実際にブラウザアプリを利用できるようにフロントエンドの開発に取り掛かりました。 メンターの方に他サービスで実際に使用されたコードをもとにプロトタイプを用意していただいており、今回のアプリに合わせて変更が必要な点をVue.jsを用いて記述していくという流れで開発を進めていきました。Pythonなどの言語とは記述のルールがかなり異なっており、個人的には今回のインターンの中で最も苦しんだパートだと思います。
9月1週目(精度検証)
1カ月間の開発を経て、質問文から社内データを参照しマルチターンで回答を生成・表示するというサービスが形になったのでここからは精度検証に移ります。 最初に従来のシングルターンのQAから、マルチターンのQAの期待する効果について整理しました。 その後、実際に出来上がったマルチターンのQAで検証しました。 そして検証結果をもとに、実装していたマルチターンのQAが抱えている課題と改善すべき点についてメンターの方々と相談し、次の週で改善に取り組むべき課題を決定しました。 課題と実装した対策について簡単に述べておきます。
課題
- ユーザークエリに対して文書検索すると2ターン目以降会話の流れと関係のない文書が参照され、流れとずれた回答をしてしまう。
- 回答で手順などが列挙された際に、各手順について質問を重ねても前のターンと同じ列挙の回答が生成されてしまう。
対策
- 文書検索(Cognitive Search)の検索クエリに過去の対話履歴を加える。
- 2ターン目以降、質問に十分な回答をするために、新たに参照文書が必要かどうか一度ChatGPTに判定させ、必要時のみ参照文書を更新する。
9月2週目(性能改善、バックエンド)
前週に掲げた改善目標に基づいて実装作業を行いました。 基本的にはバックエンドのコーディングでしたが、バックエンドでの変更に伴ってフロントエンドに対しても変更を加えました。
9月3週目(発表準備、発表)
発表までは、成果物の整理、スライドの準備にほとんどの時間を費やしました。 発表本番では、お話したことのない方を含む十数人のISIDの社員の方々に対しての発表ということで緊張するところもありましたが、様々な目線での質問・疑問をお聞きして、どういうところが疑問点となりうるのか、事前に言語化しておくことの重要性の再確認など、学びを多く得ることができました。 発表後の時間ではブログの細かな確認・変更と片づけを行っていました。
学びや経験
2ヶ月間で得た技術的知識
2カ月のインターンを通して成長した点について説明します。
- コーディング
前述のように機能さえすればよいというコードの書き方をしていたところから、可読性を意識した頑健なコードの記述ができるようになりました。入出力の値の型を定義することで、この関数にはどんな値が入るべきなのか参照でき、後からのコードの修正や変更が容易になります。デバッグモードとの相性も良く、バグの特定・修正にかかる時間が体感で分かるほど大きく減少しました。
- GitHub
コードのアップロード自体はしたことがありましたが、開発のフローに則って実践的な活用を出来るようになりました。共同開発をしたことがなかったのでGitHubの真の利便性、価値に気づかされることとなりました。
- Microsoft Azure
リソースグループの作成から各機能の役割、デプロイ、実際の活用までを学びました。今回利用したサービスは主にAzure OpenAI、Cognitive Search、Blob Storageといった機能になります。
- FastAPI(+バックエンド知識)
PythonでAPIを構築するためのフレームワークです。開発途中でミドルウェアの指定が必要となり、バックエンドとフロントエンドのやり取りや、ユーザーがAPIを利用したときにバックエンドでは実際にどのようなことをやっているのかということについても理解が深まりました。
- Vue.js(+フロントエンド知識)
JavaScriptのフレームワークです。Pythonでクローリングを行ったことがあったのでHTMLタグなどについてはある程度なじみがありましたが、JavaScriptについては無知に等しかったので理解や慣れるためにかなり苦労しました。フロントエンドについて深く理解したとまでは言えませんが、webアプリケーションがどのように動作しているか、どのような役割を果たしているのかについてコードを追いながら学習しました。
リモートでのインターンのメリット・デメリット
インターン期間中、ISIDでは主にリモートで勤務していました。そこで自分が感じたリモートワークのメリット・デメリットなどについても少し紹介したいと思います。
- メリット
オフライン出社していた最初の数日間では、自宅から品川にあるISIDのオフィスまで往復で2時間ほどかかっていたので、単純にその分の自由な時間が増えるというのが一番大きな点だと思います。満員電車に揺られながらの出勤による疲れもあり、リモートワークになってからは疲労感が大きく改善されました。
- デメリット
「分からないところなどあれば気にせずに連絡してくださいね」と仰っていただいていましたが、やはりちょっとした疑問点などについて聞きづらいというところはあるかと思います。ただし、メンターの方が進度などについて通話で確認する時間を頻繁に取ってくださっていたので、孤立しているというような感覚はほとんどありませんでした。
もう一つ、直接リモートワークとは関係ありませんが、始業直後30分ほどの朝会によるメリットを感じることも多かったです。
参加者がそれぞれ順番にその日の調子について一言二言の雑談とともに報告を行っていき、その後業務についての確認を進めていくのですが、個人的には業務の始まりへとスムーズにモチベーションを持っていくことの助けになるように思います。
また他の方がどのような状態なのかを把握できるので、リモートワークでの孤立感を感じなかった理由の一つでもありました。エンジニアの方々はちょっと確認したいことなどをその場で確認なさっていたので、そういった面でもメリットがあると思います。
振り返りと今後の自分について
今回約2カ月の間インターンシップに参加させていただいて抱いた感想としては、ソフトウェア開発においてのコーディングでは、趣味や研究としてのコーディングと異なり、連携を常に意識し続ける必要があるのだということです。
AI、バックエンド、フロントエンドそれぞれのパートでコーディングを行いましたが、いずれの場合も他のパートの存在を前提として進めていきました。
そのうえで、たとえ将来フロントエンド部分の開発には直接かかわらない仕事に就いたとしても、フロントエンドの知識をある程度有していれば、コードの質を高めることにつながるのだと気づかされました。今後はフロントエンドをある程度理解していると言えるよう、個人的に学習を重ねていこうと考えるようになりました。
締めの言葉
個人開発や競プロをされている方の中には、難易度の高いコーディングを行うことができるような方もおられるかと思います。そういった方々でもこうしたインターンで得られる多くの気づきや経験があると思います。私もインターンを通して自己研鑽では鍛えることの難しいスキルが多く存在すると知りました。
研究などで書くコードだから体裁よりも内容が大事と思っている方もぜひ一度開発系のインターンシップに参加してみることをお勧めします。ISIDでは技術トレンドのキャッチアップも最新のものまで追っていて、取り扱った内容もかなり興味深かったです。
メンターの皆様の手厚いサポートのおかげもあり、インターンとしてとても充実した日々を過ごすことができたと思います。特に太田さんには開発者としての心構えまで様々なことをご教授いただきました。直接のかかわりがないのにもかかわらずサポートいただいた方々にもとても感謝しております。インターンシップで得た多くの経験を今後の研究や人生設計にも生かしていければと思います。
インターン生
中村友亮
メンターからのコメント
太田
2ヶ月弱お疲れ様でした!中村さんは、わからないところも自分なりに調べて、きちんと自走できる方でした。 実装も早く、メンターとしても安心でした。ぜひ、ISIDで経験したことを大学でもどんどん活かしてください!
岩本
キャッチアップが早く、バックエンドに関しては基礎部分をこちらからレクチャーした後はほとんど自走できる状態になっていたと思います。今回実施していない要件定義やテスト、CICDについても概要だけお伝えさせてもらいましたが、SIerの仕事に少しでも興味を持ってもらえたら幸いです。今後のご活躍を祈念しております。
阿田木
お疲れ様でした。フロントエンドは未経験ということでしたが、短い期間でキャッチアップいただきました。不明点があればすぐに聞いていただけたこともあり、期間内に目標までに実装ができたと思います。今後のご活躍を期待しています。