【第1回 DX勉強会ハッカソン】社員間の隠れ仲良し度発見器を開発してみた
はじめに
はじめまして。
株式会社アドバンテッジリスクマネジメント(ARM) DX開発部3年目の中島です😁
ARMでは、2024/8/27, 8/28の2日間、社内でDX勉強会ハッカソンを開催しました🎉
本ハッカソンは、A、B、Cの3チームで開催されたのですが、私はAチームに参加していました。
本記事では、そのAチームの活動内容を共有したいと思います。
DX勉強会ハッカソン自体の詳しい記事は以下を参照してください。
何を作るのか
DX勉強会ハッカソンの開発テーマは、「AIをハックしよう」というものでした。
最近話題の生成AIに乗っかってAIを使おうというものですね。我々Aチームは、さっそく定期Mtgを設定して色々案を出し合いました。
他のチームは目的プロダクトがすぐ決まったのですが、Aチームは中々決まらずにたくさんの議論を行いました。
2日間という短い中で、インパクトがあって簡単に作れて有用なプロダクトを考えるのは難しいですね😓
AIを使うサービスは、使うデータが大事だと考えたので、Aチームは当社の社員プロフィールデータを使うことに決めました。このデータは例えば以下の属性(カラム)を持ちます。
- 趣味
- お気に入りの本や映画、アニメ
- 好きな曲
- 好きな食べ物
- 休日の過ごし方
- ストレス発散法
チーム内での議論を重ねた結果、私たちAチームは「社員間の隠れ仲良し度発見器」を開発しようと考えました!
アイデアの中心は、「社員同士の相性を、もっと簡単に知ることができたら面白いのでは?」というところにあります。具体的には、以下のような仕組みを検討しています。
社員プロフィールデータを生成AIに渡し、そのデータをもとに、社員の1週間の生活ストーリーを生成します。そして、その生活ストーリー同士の類似度をグラフネットワークで可視化する。
この「生活ストーリーの類似度」を使って、社員同士の相性を示すグラフを作成し、「この人と相性が良さそうだよ!」と視覚的にわかる仕組みです。
ちなみに、ここまで議論は重ねましたが…正直なところ「生活ストーリーを使う意義」については深く考えていません(笑)。ただ、この発見器が新しいつながりのきっかけになれば楽しいな、と考えました。
メンバー紹介
Aチームのメンバーは主に以下の4名でした。
-
1年目のフレッシュな新卒
好きな食べ物はプリン!環境構築やフロントエンドとして社員プロフィールデータを表示する部分を担当しました。 -
博士卒データサイエンティスト
好きな食べ物はネパールカレー!機械学習を駆使して生活ストーリーの類似度を出す部分を担当しました。 -
DX開発部2年目のなんくるないさ系エンジニア
好きな食べ物はタコライス!フロントエンド開発として社員プロフィールデータを表示する部分を担当しました。 -
DX開発部3年目のエンジニア(私)
好きな食べ物はバイキング!ローカルLLMの構築と、フロントエンド開発、バックエンドとフロントエンドを繋げる部分を担当しました。
プロダクト開発
ハッカソン当日までの準備
ハッカソン当日までの準備期間として、環境構築や技術調査を行いました。
流石に本番当日で、環境構築に時間がかかったり、テーマの実現不可となるのは避けたいので、以下のタスクを分担して行いました。
- LLMの構築方法の調査
- 社員プロフィールデータの類似度指標化方法の調査
- 必要なソフトのインストール
- ローカルLLMの学習時のデータ形式調査
- フロント画面のデザイン
- Gitlabの構築と接続方法の確立
ハッカソン当日
いざ開発です。
2日間で完成まで漕ぎ着けないといけません。そのため、以下の4つの内容をチームのミニマムサクセスとして開発を進めました。
-
ローカルLLMを構築し社員プロフィールデータから社員の1週間の生活ストーリーを出す。
Ollamaを用いて生成AI(Gemma)を構築し、プロフィールのカラムデータを生成AI(Gemma)に投入して1週間の生活ストーリーを生成します。 -
生活ストーリーの類似度をグラフネットワークで出す。
pythonのライブラリ(SentenceTransformer)で文章をベクトル化し、数値化された相関性をネットワーク図でグラフ化します。 -
社員情報の一覧画面を出し、生活ストーリーも載せる。
Vue.jsを用いて社員の一覧画面とユーザーの個別画面を構築します。また、そのユーザーのストーリーと類似性の高いユーザーを5人抽出し表示します。 -
GithubPagesでデプロイする。
当日の開発状況ですが、基本的に各々に振られたタスクをこなす感じで進めました。わからないところや共有ポイントがあれば、その都度話し合いを行いました。
あとは、チームみんなで本社近くの移動型パン屋さんにお昼ご飯を買いに行って一緒に食べたりしました。🥐
開発内容自体が、正直かなり難しいと思っていましたが、案外すんなりと達成することができました。
特に一番難しかったのは、生成したグラフネットワークをフロントエンドにどうやって連携するかですかね。
ここが本当に大変でした...みんなで知恵を出し合ってなんとか解決しました。
使用技術
- Vue.js(フロントエンド)
- python(バックエンド)
- Ollama(ローカルLLM)
生成AIとしてChatGPTを考えたのですが、APIを叩く場合は有料になるので使いませんでした。
無料で使えるローカルLLMを構築して、生成AIを使うことにしました。
プロダクト
プロダクトを自慢したいのでデモを載せたかったのですが、社員情報満載だったので控えておきます。
プロダクトの概要
- サービス名:CONNECT ARM
- 内容:社員プロフィールデータから算出した社員間の類似度の可視化
- 目的
- 社員プロフィールデータから分かる社員同士の共通点を、AIを使って可視化する
- 社員同士のつながりをさらに深めることに貢献する
- 成果物の特徴
- 生成AIによる各社員の個人ストーリーが読める
- 個人ストーリーのページには、類似度の高い他の社員が表示される
- 社員間の類似度を元にしたネットワークが可視化されている
サービス紹介
トップページはこちらになっています。シンプルで素晴らしいですよね。
真ん中にいるキャラクターは "アドまる"といい、当社のARMミライ☆元気プロジェクトのシンボルキャラクターです。詳しくはこちらを参照してください。
トップページで「個人ストーリーボタン」を押すと以下のような社員の一覧画面がでます。
表示された社員を押下すると、その社員のストーリーと、ストーリーを出すのに用いたプロフィール情報、そのストーリーで類似度の高い人物が5人表示されます。
トップページで「ARMマップボタン」を押すと社員のストーリー間のグラフネットワークが表示されます。
本当は氏名で表示したいのですが大人の事情で数値にしています。また、社員プロフィールデータに十分な情報がなかった人(20%程度)はフィルタリングして表示していません。
ストーリー内容で自身と類似性が高い5人に線を引いている感じです。ちなみに、私は端っこでした笑。
補足
今回の開発でメインとなる部分を簡単に紹介できればと思います。
ローカルLLM
ローカル環境でLLMが使えるOllamaを使いました。
インストールするだけで、LlamaやGemmaなどの人気LLMをローカル環境で動かすことができます。
今回の開発ではGemmaを使い、社員プロフィールデータから社員の1週間の生活ストーリーを作成してもらいました。
詳しくは、以下を参考にしてください。
ストーリー間の類似度の計算方法
SentenceTransformerを用いて計算しました。
SentenceTransformerは、Hugging Faceが提供するライブラリで社員の1週間の生活ストーリーをベクトルに変換します。この得られたベクトルに対し、コサイン類似度を用いることで文章間の類似度を測りました。
詳しくは、以下を参考にしてください。
振り返り
短い期間ですごいプロダクトが作れたと思います。何処かに売ってお金貰えるんじゃないかと思ったくらいです。タレマネ開発会社さんお声がけ待ってます!
個人的には、ローカルLLMの使い方や、文章間類似度の仕組みなどを学べました。
自身のAIスキルが一段と磨かれたと思います。
一番の成果物は、新卒やベテランの方々と濃密な期間を過ごし親睦を深められたことですかね。
反省点としては、もっと写真を撮っておけばよかったことですかね。開発に夢中になりすぎて忘れてました🙇
最後に
当社の開発チームでは、勉強会やハッカソンなどのイベントを開催しています。
これからも開発チームの雰囲気の伝わるトピックを投稿していきます。
ご興味持った方は、ぜひ入社をお持ちしております。
Discussion