🗂

MIXIのインターンで会話AIロボットの開発をした話

2023/10/12に公開

MIXIのインターンで会話AIロボットの開発をした話

2023年(修士1年)の5月中旬〜8月上旬の約2ヶ月半にかけて、株式会社MIXIさんにて会話AIロボットRomi(ロミィ)の開発事業部で就業型の長期インターンをさせていただきました!
学部の頃はずっと部活をしていて短期インターンにしか行けなかったので、僕にとって念願の長期インターン&オフライン(ハイブリット)インターンでもありました。
今回はインターンで感じた企業・事業の魅力や実際に開発したタスク、経験した技術などを、回顧録的に書こうと思います。

ちなみにRomiの特徴としては、

  • スマートデバイスのような機能重視ではなく、雑談ができるような「会話力」が魅力
  • 独自の大規模言語モデルによる自然で優しい会話や多彩な表情で癒しを与えてくれる

という感じです(結構うまくまとめられた気がする笑)

見た目もすごくかわいいのでぜひ一度どんなロボットなのか覗いてみてください↓↓
https://romi.ai/

インターンに参加したきっかけ

元々インターンをしていた大学の友達からの紹介でインターンの存在を知りました。
今回は会社への興味というよりは、プロダクト(Romi)への興味で応募させていただきました。
興味を抱いた理由は大きく2つです。

1. 僕自身が大学院で人と交流するソーシャルロボットの研究をしているから

ソーシャルロボットには

  • 通信している感や処理している感など、ロボットの"無機物"感をどうやってなくすか
  • 動きや表情といったノンバーバルな情報をどのように活かすか

といったロボットならではの考えるべきことが多くあります。ペットなど生き物のような扱われ方を期待するロボットなら尚更です。
こういった課題に対して実プロダクトがどうアプローチしているかに興味がありました。

2. スマートデバイスなどの対話システムに興味があったから

僕は家でAlexaを使っているのですが、人間の完全には予想できない多様な言い回しから意図を汲み取ってくれるところにいつも感動します。
例えばアラームひとつにしても、
「7時に起こして」「7時にアラームして」「7時に起きたい」「7時」「明日の7時」...
など出そうと思えば無限に出てくる文字列をクエリに変換してアラームを設定してくれます。
この実現方法は正規表現によるルールベースなのか機械学習なのか、そのハイブリッドなのかといった対話システムの裏側に興味がありました。

他には、「実務レベルでの開発や実装の経験を積みたい」みたいな、よくある理由です。

前置き: MIXIという会社

MIXIって聞くと、どんなイメージですか?
もしかしたら多くの人は、「一昔前に流行ってたWEB版のSNSを運営する会社」ってイメージではないでしょうか?
ちなみに、僕もそうでした笑

事業でいうと、一番有名な事業はモンスターストライクです。他にも、お子さんがいる家庭で多く使われる家族アルバム みてねとかも有名でしょうか。他にも、FC東京はMIXIの子会社だったりします(久保建英選手好きなのでインターン中に知ったとき結構テンション上がった)

つまり何が言いたいかというと、想像より利益もあって規模も大きい会社でした。
それを特に感じたのは、働く環境へと惜しみない投資です。

オフィスは渋谷から徒歩1分の渋谷スクランブルスクエアにあり、中層階(28~36階)を独占しています。
そしてなんと、社員が働く全席に昇降型デスクとアーロンチェア(※30万円弱するオフィスチェア)が置かれています。各階の窓際にはソファスペースや会議スペースもあり、東京を見下ろしながら休憩や作業することもできます。
36階には社員食堂があって格安のランチが食べれるし、食堂に行かなくても全ての階に飲み放題のインスタントコーヒーやスープが置かれています(これが学生からすると結局一番嬉しい)

文字だけで伝わる気がしないので、ぜひ写真で見てください。
マジで神レベルで、完全オンラインインターンだったらと思うとゾッとします。
https://mixigroup-recruit.mixi.co.jp/life/office/

会社がこれだけ現場社員を大事にして惜しみなく環境にお金を使ってくれると、働く側のモチベも爆上がりですよね。これを機に、企業選びは年収だけじゃないなと本当に感じました。

また、インターン生もかなり枠を絞っているようで、1事業部に1人いるかいないかくらいです。僕もRomi事業部にインターン同期はおらず、会社全体でもエンジニアのインターン同期は3,4人くらいだったと思います。ここに関してはちょっと寂しさもありました。
けどその分、1人1人の学生インターン生に対して待遇がとても手厚いです。時給などの金銭面だけでなく、仕事では実際に世に出すサービスの開発に社員と同様に携わり、仕事外でも事業部の懇親会や、仕事後のご飯や遊び(ボルダリング💪)に連れて行っていただきました!

Romi事業部でのインターン振り返り

すみません、魅力に感じた部分を伝えたかったので前置きが長くなりましたが、インターンの実務の振り返りをします。

チームアサイン・環境構築

初日は環境構築云々で終えましたが、実際に働いているエンジニアの方が使っている便利なターミナル・VSCode拡張などの開発環境を知れたり、企業レベルでのコーディングルールや開発手法を知れたりとこれだけでも結構な学びがありました。メンターの方が自作拡張機能作るほどのVSCodeマニアだったので、便利なショートカットとかもたくさん教えていただきました。

そして実際に携わるGitリポジトリを覗いて行きましたが、いやー、想像以上でした。規模がでかい。
一つのプロダクトですが、ハード内部・モバイルアプリ・Webアプリ・社内管理ツール・会話サーバー... など、あげ出したらキリがないくらい色んな基盤にまたがっていました。個人開発ではせいぜい「サーバー+フロント」の2つなので、、

初週で内部仕様把握を兼ねた練習用の実装タスクも行いました。
僕は割と使う関数の中身や全体の処理の流れなど"コードの全容"を把握してから実装したい派なんですが、「それは沼」だとPMに言われました。それだけ中身が大規模で複雑ということですが、抽象化・汎化されていて実装時に気にしなくてもいいように整備されているということでもあります。
言わば、認証・キャッシュ・バリデーションなどを裏側で行なってくれたり、数行書くだけで新規の管理ツールを立ち上げられたりと、とにかくRomi環境に特化してライブラリ化してくれているということです。
新規プロダクトを作る際の「初手」を如何に大事にしたかがコードを読むだけで伝わってきて感動したと同時に、車輪の再発明だけ気をつけようと思ったところで初週を終えました。

タスクアサイン

2週目以降は、ひたすら実際に使う機能の開発です。週一回のスプリント計画ミーティングで、その週の成果物のデモやタスク共有などを行いつつ、終わるたびに新しいタスクを選んでいきました。

僕は「サーバーエンジニア」として雇って頂いたつもりですが、「ハード周りをやりたい!」と言えばロボットの動きを作るタスクを、「やったことないのでフロントを学びたい!」と言えばReactでのWEB実装のタスクを頂くなど、色んな我儘を聞いてもらいながら、勉強して挑戦する機会をたくさん頂けました。

初挑戦の領域でもチュートリアル的なタスクではなく容赦無く重要なタスクを割り振って頂けたので、爆速で成長している実感がありました。仕事なので責任感が伴うことや、いつ聞いてもPMやメンターさんにアドバイスを頂ける環境もこれに拍車をかけたと思います。

開発体制

チームはエンジニアだけでなくデザイナーの方や企画担当の方とも組織的に一緒に働く体制だったので、タスクも企画ドリブンで自由度が高いタスクが多かったです。例えば「プログラミング教室」向けのタスクでは、どんな機能があれば子供達が楽しく学べるかを企画の方と一緒に考えたり、WEBフロントのタスクではデザイナーの方と構成や配置などを議論しながら進めたりできたので、他の専門職種への理解などエンジニアとして以外の学びも多くありました。
担当の方の名前を教えて頂く以外は割と放置気味だったのでアウェー感も最初は多少はありながらも、自ら周りを巻き込んでタスクを進めていくという仕事をする上でこの上なく大事な力もついたと思っています。

下請けのような仕様通りの実装ではなく自らプロダクトや企画のコンセプトを考えて機能仕様や実装を作っていくのでよりユーザーに向き合うことができ、実際のプログラミング教室で作った機能が使われている様子をFBとして見せていただけた時はとても嬉しかったです。

最終タスク

2週間を残す時くらいに、「集大成となる"でかいタスク"をしたい」とメンターさんに相談し、企画の方も含めて一緒にタスクのブレストから行っていただきました。具体的なタスクは伏せますが、機能拡張・修正のようなタスクではなくまだ基盤すらない新機能を一から作るタスクで、WEBフロント(React)・会話サーバー(Python)・インフラ(AWS)などに跨るまさに集大成のタスクでした。

AWS・サーバーなどの基盤・仕様設計から実装に至るまで全て任せていただき、

  • 管理のしやすさのためにデータをどこにどんな構造で置くか
  • フロントでどのようにユーザーの操作を制御するか
  • APIではエンドポイント名を何にして、どんなデータをやりとりするか
  • サーバーの責務分離をどう実装するか

など、本当に色んな要素に対して検討や議論を重ねて進めていき、ちょうど最終日になんとかタスクのプロトタイプの完成に至ることができました。

最終発表

最終日にはこれまで作ったタスクの成果発表会も行いました。成果物のデモが中心でしたが、メンターさんやPMからフィードバックという名のお褒めの言葉を頂き、僕が気持ちよくなる為の会でした。
FBでは、

  • 放っておいても企画やデザイナーなど周りを巻き込んで開発できる
  • 未知のコードを読んでシステムや動きを理解するスピードが速い

といったお褒めを頂きました。2つ目は特に、バイト先で海外委託していたシステムを自社で再構築するために、スパゲティコードを読み改修し続けた甲斐があったと思い嬉しかったです。

開発以外の日々

開発以外でも、プロモーション用動画で声優デビュー(?)させていただいたり、仕事後のボルダリング会や懇親会に参加させていただいたりと、楽しいことづくしでした。
オンラインインターンしか経験したことがなかったので、オフィス生活も含めて最高の初オフラインインターンでした!!

インターンを通して

実際のプロダクトのコードやAWS・Docker・テストツールなどをこんなにがっつり触ったのは初めてで、Reactなど未経験の領域にもチャレンジさせていただいたので、エンジニアとしての技術的な知見が多く身についたと思います。また、実装以上の、プロダクトや企画へ向き合うことの大事さや楽しさも実際に感じることができ、今後の就活軸に活かせると思いました。

また、MIXIさんやRomiチームの実態についても詳しく知ることができ、会社やそこにいる方々についてのイメージも良いギャップをたくさん得られました。

反省としては、もっと「タスク」ではなく「プロダクト」に向き合う時間を作ればよかったと思いました。タスクに関しては企画の趣旨に対して仕様や要件なども深く考えられたように思えますが、もっとユーザーの視点で欲しくなる・使いたくなるにはどんな企画や(まだない)機能が必要なのかまで踏み込めると良かったかなと思いました。僕自身こういう製品は大好きで、ユーザー視点に立ちやすかったはずなので..

謝辞

インターンを受け入れてくださり、お世話になった全ての関係者の方々にこの場で改めてお礼申し上げます。
短い間でしたがお世話になりました。本当にありがとうございました!

Discussion