スキルセットからユーザベクトルを作ってみた
Introduction
こんにちは、chckと申します。普段はAI Labという研究部門でResearch Engineerとして他チームの実験サポートや研究成果の社会実装などをしています。
みなさんは調べ物など業務上特定の専門知識が必要な場面で、社内に◯◯について詳しい人はいないか紹介してもらったり、またはいなかったので調べながらやりきった後で似たような業務をやっている人が実は近くにいた、なんて経験はないでしょうか。弊社CyberAgentはありがたいことに年々社員数が増え、今では7000人を超えています[1]。この規模では上記のような人づての紹介はいろいろと大変です。
本稿では、各個人の発信しているテキスト情報からその人を形成する特徴を集約し、自身に近しいスキルセットを持つ人を検索してみます。
Approach
私の所属がAI Labということもあり、スキルセットが含まれるであろう各個人の発信しているテキスト情報を
- chat_u: 自身が発言したSlack Chat
- code_u: 自身が書いたソースコード
- paper_u: 自身が書いた論文
の3つとし、これらのテキスト情報を何らかの特徴抽出器によってベクトル化します。テキストの特徴抽出方法は色々考えられますが、今回は簡略化のためLLMによる特徴抽出を行います。今回はGoogle Cloudの gemini-1.5-pro[2]を採用しましたが、抽出器ごとの比較実験も面白そうですね。
最終的に1ユーザ1ベクトルとしたいので、特徴抽出を行う前に情報の圧縮を行います。
以下は私のSlack Chatのサンプルです。
[
'既存研究サーベイやりましょう、実験と評価はいつも通りで',
'DSの暗黙的な知見を定量評価している',
'二郎分類といいラーメン界にはなにかロマンがあるようですな',
'それは確かにGKEもうちょいスリムにするしかないですね',
]
このようにユーザあたり大量のテキストが紐づいているため、雑多なテキストを以下のプロンプトによって要約し、そのテキストをユーザごとの特徴テキストとします。
f"""以下はあるユーザーの Slack 上のチャットメッセージデータです。
このユーザーの説明文を生成してください。
この際、以下に注意してください。
- できるだけその人を特定できるような説明にすること
- 情報はできるだけ冗長にすること
- テキストの装飾は不要です
■ Chat Messages
{chats}
■ 出力フォーマット
# 説明文
- 説明文
# 専門知識
- 専門知識1, 専門知識2, 専門知識3
# 技術スタック
- 技術スタック1, 技術スタック2, 技術スタック3
# 興味関心
- 興味関心1, 興味関心2, 興味関心3
# 性格
- 性格1, 性格2, 性格3
"""
これによって得られた要約が以下です。
"""
# 説明文
2014年新卒入社の機械学習エンジニア兼リサーチャー。入社後は広告配信システムのバックエンド開発を経て、AI Labに異動し、自然言語処理や画像処理を用いた広告効果予測や生成、推薦システムの開発に従事。社内外の様々なプロジェクトや研究活動に携わっており、特にMLOpsやクラウド技術に精通している。社内向け技術ブログや論文執筆、学会発表、研修講師、採用活動などアウトプットも多い。プライベートではゲーム、アニメ、漫画、映画、ラーメン、不動産など多岐にわたる趣味を持ち、最近はゲーム実況AIの開発に熱中している。
# 専門知識
- 機械学習、深層学習、自然言語処理、画像処理、マルチモーダル学習
# 技術スタック
- Python, GCP, AWS, Azure, TensorFlow, PyTorch, Docker, Kubernetes
# 興味関心
- MLOps、クラウドコンピューティング、ゲームAI、生成AI、推薦システム
# 性格
- 責任感がある、コミュニケーション能力が高い、好奇心旺盛
"""
1ユーザ1要約テキストが得られました。ここでの工夫として出力例をZero shotで与えることで、ユーザごとの入力フォーマットを統一しています。
この要約テキストを更に Vertex AI Text Embeddingのtext-multilingual-embedding-002 によって 768次元のベクトルに変換します。
この操作をpaper_u・code_u・chat_uそれぞれに対して行い、1ユーザ3つのスキルセットベクトルを作ります。あとはベクトル間の類似度計算などでユーザ推薦や検索ができます。chat_u以外のサンプルはAppendixを参照してください。
Dataset
Approach項で説明した3種類のテキストデータの詳細です。
本来はユーザのユニーク数を増やすべきですが、論文・ソースコード・Slackといった3つの情報を豊富に持つユーザはAI Labのような研究部門に限られるため、データの対象をAI Lab所属メンバーに限定しています。
dataset | #samples | #users | description |
---|---|---|---|
paper | 789 | 120 | 人手で収集[3]。公開している論文のabstractのみを対象とした。共著に関しては貢献率を考えず一律で共著のユーザそれぞれの論文とみなした。 |
code | 1095 | 74 | GitHub APIを用い、CyberAgentAILab orgで公開しているソースコードのうち、簡略化のため readme.md , requirements.txt , pyproject.toml の3ファイルのみを対象とした。 |
chat | 106329 | 188 | Slack APIを用い、対象ユーザのSlack上の公開メッセージを収集。 |
Evaluation & Discussion
Approach項のプロセスによって作られた3種類のデータ由来のベクトルを評価してみます。
ベクトルの評価方法は公開されているデータセットをベンチマークとして色々タスクを解く方法などがありますが、本稿では ユーザテキストからスキルセット特徴が得られているか? が重要です。
そこでスキルセットらしさを測る指標として、ユーザの所属チームを考えます。例えばインフラチームではインフラのスキルを持ったユーザが、デザインチームではデザインのスキルを持ったユーザが集まっているはずです。私の所属するAI Labでは研究領域ごとに大きく6つの所属があります。
AI Lab
├── Activity Understanding
├── Creative
├── Econ
├── Graphics
├── Interactive Agent
└── ResearchOps
専門チームには似たようなスキルセットのメンバーが集まるという仮説から、 今回作ったベクトルから研究領域チームを分類できるか? というdownstream taskを考えます。
簡単のため、論文・ソースコード・チャットベクトルは結合せず、3つのデータからそれぞれGBDTで多クラス分類モデルを作り評価した結果が以下の表です。
dataset | F1-Micro | F1-Macro | F1-Weighted |
---|---|---|---|
chat | 0.45 | 0.17 | 0.34 |
code | 0.53 | 0.29 | 0.47 |
paper | 0.58 | 0.47 | 0.58 |
スキルセットの説明力として、chat<code<≒paperなのは直感に近いかなと思います。
今回はテキストの前処理とベクトル抽出をLLMに丸投げしてしまったので、特にノイズの大きいSlackチャットやソースコードに関してはTF-IDFによるキーワードの重み付けや、各データドメインに特化した特徴抽出器を使うことで性能が改善する可能性があります。
研究領域分類によってある程度定量的な評価ができましたが、スキルセットのベクトル化の真骨頂は可視化にあります。PCAやt-SNEといった次元圧縮手法の1つであるUMAPを用いて、得られたユーザベクトルを2次元に落としてみます。1点1点がユーザで、考察のため分類タスクでも使った研究領域で色分けしています。この色分けがうまくいっているベクトルほど、各研究領域ないしスキルセットの特徴が得られていると言えます。
まずSlackチャットを使ったベクトルです。左隅で孤立している数点に関しては、インターンシップ生がまとまっていました。その性質上チャットデータが少なく、自己紹介などインターンシップにありそうな特徴が得られたと考えられます。それ以外は、多少研究領域ごとの色分けが見られるものの、全体的に混じり合っています。チャットテキストだけではスキルセットの抽出は難しいとも言えそうです。
次にソースコードを使ったベクトルです。Slackチャットよりは色ごとにまとまっています。特に赤点でプロットしているCreative領域のクラスタが左右にゆるく分かれています。左側の赤く広いクラスタが主にComputer Visionのメンバー、右側に点在しているメンバーが CMA
、CMA-ES
[4] というパラメータ最適化系の専門用語を多く含むメンバーでした。
CreativeはAI Labの中で一番大きい領域で、Computer Vision、NLP、Audioといった各モダリティ毎の専門の他、言及したような最適化の専門メンバーも属しているため、同じ色でもこのような分布になったと考えられます。
そして論文を使ったベクトルです。これは研究領域の色に関係なく、左右に大きく分かれているのが特徴的です。右のベクトルの元となったテキストをいくつか見てみると、以下のようにAbstractの少ないサンプルのようです。先程のインターンの例も含め、所属時期によってデータが十分に得られないコールドスタート問題は今後も起こり得るため、他の情報から補うなど何かしらの対応が必要でしょう。
[
'提供された情報が抽象的な内容の1文のみであるため、詳細なユーザーの説明を生成することはできません。 \n\n与えられたアブストラクトは、"off-policy evaluation"という機械学習における重要なテーマに触れている可能性があります。 \n\nユーザーの説明を生成するためには、より多くの情報が必要です。例えば、完全なアブストラクト、論文のタイトル、著者名、所属機関などが挙げられます。',
'提供された情報が抽象的な文章1つのみであるため、詳細なユーザーの説明を生成することはできません。 \n\n与えられたアブストラクトは画像のトリミングに関するものであることから、このユーザーは**コンピュータビジョン**または**画像処理**の分野に携わっている可能性があります。 \n\nより詳細なユーザーの説明を生成するには、より多くの論文アブストラクト、またはその他の情報(出版年、共著者、所属機関など)が必要です。',
'提供された情報が抽象的な文章1つのみであるため、詳細なユーザーの説明を生成することはできません。 \n\n与えられたアブストラクトは、自然言語処理における最近の進歩に関するものである可能性を示唆しています。 \n\nユーザー説明を生成し、研究テーマと専門分野を特定するには、より多くの情報が必要です。 少なくとも、完全なアブストラクトと、可能であれば他の論文のアブストラクトも提供してください。',
]
逆に左側の塊に注目すると、各領域ごとにきれいに色分けされていることがわかります。これは分類モデルでの評価結果からもわかるように、著者のAbstractからその人のスキルセットを説明できると言えます。
最後に、私のベクトルをクエリに、それに近いスキルセットを持つユーザを3人ずつ出してみます。先頭がクエリに対するコサイン類似度、2列目がそのユーザのベクトルの元となったLLMで要約したテキストを載せています。
以下はSlackチャットデータでの例です。
Query user description: '# 説明文 2014年新卒入社の機械学習エンジニア兼リサーチャー。入社後は広告配信システムのバックエンド開発を経て、AI Labに異動し、自然言語処理や画像処理を用いた広告効果予測や生成、推薦システムの開発に従事。社内外の様々なプロジェクトや研究活動に携わっており、特にMLOpsやクラウド技術に精通している。社内向け技術ブログや論文執筆、学会発表、研修講師、採用活動などアウトプットも多い。プライベートではゲーム、アニメ、漫画、映画、ラーメン、不動産など多岐にわたる趣味を持ち、最近はゲーム実況AIの開発に熱中している。 # 専門知識 - 機械学習、深層学習、自然言語処理、画像処理、マルチモーダル学習 # 技術スタック Python, GCP, AWS, Azure, TensorFlow, PyTorch, Docker, Kubernetes # 興味関心 - MLOps、クラウドコンピューティング、ゲームAI、生成AI、推薦システム # 性格 - 責任感がある、コミュニケーション能力が高い、好奇心旺盛\n'
====================
0.8552 '# 説明文 このユーザーは、深層学習や機械学習、特に音声処理や自然言語処理の分野に興味を持つエンジニア/研究者です。QiitaやZennで技術記事を執筆しており、自身のブログを持たず外部のプラットフォームで積極的に情報発信しています。Twitterでは技術系の情報や人物をフォローしており、最新の技術動向に敏感です。また、AI Labに所属しており、アドベントカレンダーの執筆など、積極的に技術コミュニティに貢献しています。ハードウェアにも関心があり、マイクアレイ用ハウジングの設計や発送も行っていることから、研究開発から実装まで幅広く携わっていると思われます。 # 専門知識 - 深層学習, 機械学習, 音声処理, 自然言語処理 # 技術スタック - Python, 機械学習ライブラリ, ハードウェア設計ツール # 興味関心 - 人工知能, 音声技術, 自然言語処理, ハードウェア開発 # 性格 - 好奇心旺盛, 情報感度が高い, 実行力がある, 協調性がある'
0.8447 '# 説明文 このユーザーは、自然言語処理(NLP)チームに所属し、広告画像の分析やT5などの言語モデルを用いたテキスト生成に興味を持つ研究者です。ACL2024に参加するなど、積極的に学会活動にも参加し、最新の研究動向にも精通しています。また、論文読み会を主催するなど、チームへの貢献意欲も高く、メンバーからの信頼も厚い人物です。 # 専門知識 - 自然言語処理, - 広告画像分析, - テキスト生成 # 技術スタック - Python, - T5, - Google Docs # 興味関心 - 自然言語処理, - 広告, - 最新の研究動向 # 性格 - 積極的, - チームワークを重視, - 研究熱心'
0.8416 '# 説明文 このユーザーは、開発業務に携わっており、日々の日報を Slack 上で共有しています。業務内容は、開発内容の検討やアルバイトなど多岐に渡ります。技術スタックとしては、Python、PyTorch、ONNX、GPUaaS などを使用しており、特に深層学習や機械学習に精通している可能性があります。また、用語集を作成するなど、チームへの貢献意識も高く、新しい技術や効率的な実装方法にも関心を抱いています。 # 専門知識 - 深層学習, 機械学習, Python # 技術スタック - Python, PyTorch, ONNX, GPUaaS, AI Platform # 興味関心 - 深層学習技術の応用, 効率的な実装方法, チームへの貢献 # 性格 - 勤勉, 探求心が高い, 協調性がある'
チャットの前処理用プロンプトにスキルセットには遠い、性格という項目を出力させておりそれに引っ張られてしまいました。チャットデータでは口語的な内容が多いため、具体的なスキルセットというよりは興味関心や性格を重視したマッチング結果となりました。このように前処理に使っているプロンプトは改良の余地があります。
次にソースコードでの例です。使用技術が抽出できていることでマッチングに効いていることがわかります。
Query user description: '# 業務内容 - GCP(Google Cloud Platform)のGKE(Google Kubernetes Engine)を用いたMLflowやAimなどのプラットフォーム構築、運用自動化、ユーザー管理などを担当している。 - ハイパーパラメータチューニング、データセットの管理、可視化などの業務を行っている。 - 生成、キャプション生成、セマンティックセグメンテーション、パノプティックセグメンテーションなどの研究開発を行っている。 - 商品説明文からのキャッチコピー生成など、広告クリエイティブに関する研究開発を行っている。 - 広告画像の解析、編集、およびそれらを用いた深層学習モデルの学習、推論を行っている。 - Docker、Terraformを用いたインフラストラクチャ構築やWebアプリケーションのフロントエンド、バックエンド開発を行っている。 - 大規模データセットの処理、分析、可視化を行っている。 # 使用技術 - Kubernetes, GCP, GKE, MLflow, Aim, Hugging Face, Transformers, Vertex AI, Langchain, PyTorch, Torchvision, OpenCV, scikit-learn, Matplotlib, CUDA, Tensorboard, CoreML, ONNX, JavaScript, React, WordPress, AWS, Lightsail, Aurora, WAF, ALB, Cognito, Node.js, pnpm, Slidev, Google Drive, Google Spreadsheet, BigQuery, Pub/Sub, Cloud Functions, Slack, Secret Manager, Cloud Scheduler, Eventarc, Google Apps Script, clasp, jest, gts, PyScaffold, Apache Beam, TensorFlow, pandas, spaCy, MeCab, OpenNMT, AllenNLP, Streamlit, annoy, FastAPI, uvicorn, pydantic, Stable Diffusion, keras'
====================
0.9334 '# 業務内容 - GCP(Google Cloud Platform)上で、バナー画像を用いたCTR(Click Through Rate: クリック率)予測や広告関連のデータ分析、機械学習モデルの開発、デプロイを行っている。 - 広告画像のレイアウト要素の検出や、商品説明文と画像からキャッチコピーを生成するモデルの開発、評価を行っている。 - 大規模な画像ファイルデータ(数百テラバイト規模)をAWS S3からGCP BigQueryに転送し、機械学習データセットに変換するパイプラインの構築を行っている。- YOLOを用いた物体検出モデルの開発、Triton Inference Serverへのデプロイを行っている。 - Stable Diffusionを用いて生成した広告画像のレイアウト要素検出を行うために、YOLOのファインチューニングを行っている。 - CRNN(Convolutional Recurrent Neural Network)を用いて、画像からテキストを抽出するモデルの開発を行っている。 - BERT(Bidirectional Encoder Representations from Transformers)を用いて、商品説明文と画像からキャッチコピーを生成するモデルの開発、評価を行っている。 - VAE(Variational Autoencoder)を用いて、色のパターンを条件としたコピー生成モデルの開発を行っている。 # 使用技術 - Python, Tensorflow, PyTorch, Apache Beam, Google Cloud Platform(GCP: BigQuery, Dataflow, AI Platform, Cloud Functions, Cloud Storage, Cloud SDK), AWS(S3, SageMaker, EMR), Docker, Kubernetes, Triton Inference Server, uv(Python環境管理ツール), poetry(Pythonパッケージ管理ツール), pysen(Python静的解析ツール), pytest(Pythonテストツール), Tensorboard, Jupyter Notebook, OpenNMT, MeCab, scikit-learn, OpenCV, pandas, numpy, matplotlib, seaborn, Streamlit, Hugging Face Datasets, Google Cloud Vision API, AllenNLP, annoy, FastAPI, Gradio, Torchserve, uv, direnv, Terraform, Google Apps Script, clasp, gts, jest, ONNX, CoreML, CUDA, CuDNN, React, Node.js, npm, Ruff, PySpark, JavaScript'
0.9252 '# 業務内容 - 大規模言語モデル(LLM)と画像処理を用いた、広告作成のための基礎的な要素技術の開発を行っている。 - 画像からのレイアウト要素検出、レイアウト生成、キャプション生成、画像編集など、様々な画像処理タスクに取り組んでいる。 - 画像処理と自然言語処理を組み合わせたマルチモーダルな深層学習モデルの開発と評価を行っている。 - 特に、広告画像のレイアウト生成、画像編集、画像からのキャプション生成などに焦点を当てている。 - 大規模データセットを用いた深層学習モデルの学習、評価、デプロイを行っている。 - Google Cloud Platform (GCP) や CyberAgent Internal Platform (CIU) などのクラウドプラットフォームを用いた機械学習システムの開発と運用を行っている。 - 研究成果を論文としてまとめ、国際会議に投稿している。 # 使用技術 - Python, PyTorch, TensorFlow, Keras, CUDA, OpenCV, Hugging Face Transformers, Hugging Face Datasets, DeepSpeed, XFormers, SentencePiece, NVIDIA TensorRT, Triton Inference Server, Docker, Google Cloud Platform (GCP), CyberAgent Internal Platform (CIU), Git, Poetry, direnv, Jupyter Notebook, Slurm, MeCab, fugashi, ipadic, BERT, Open Neural Machine Translation (ONMT), BiLSTM, LSTM, VAE, ResNet, Stable Diffusion, YOLO, EfficientDet, BiFPN, Mask R-CNN, Faster R-CNN, RetinaNet, SSD, Cascade Mask R-CNN, HTC, FreeAnchor, RegNet, Panoptic FPN, RepPoints, Guided Anchoring, Double Heads, DetectoRS, Instaboost, Sparse R-CNN, SoftTeacher, DINO, DAB-DETR, PAA, PISA, FSAF, SOLO, CentripetalNet, CARAFE, LVIS, DiffusionDet, GLIP, LayoutDM, CRNN, Allennlp, Streamlit, Annoy, FastAPI, uvicorn, hydra, MMDetection, MMCV, MMEngine, MMDeploy, MMYOLO, MMRotate, OpenCOLE, layoutlib, cr-renderer, japanese-stable-diffusion, japanese-clip, manga109api, manga-ocr, ray, ray-proxy, proboscis-data-tree, yfinance, pinjected, injected-utils, langchain, langchain-openai, langchain-community, chromadb, llama-cpp-python, fastdtw, colormath, pyemd, elkai, sko, pynomaly, colour-science'
0.9143 '# 業務内容 - 広告画像の要素検出を行うための研究開発を行っている。 - 広告画像からキャッチコピーを生成する研究開発を行っている。 - 画像のキャプション生成、セマンティックセグメンテーション、パノプティックセグメンテーションに関する研究開発を行っている。 - 画像のクロッピングに関する研究開発を行っている。 - テキストのレンダリングに関する研究開発を行っている。 - 日本語の安定拡散モデルの開発を行っている。 - 画像からの文字サイズチェックを行う研究開発を行っている。 - 3Dオブジェクトの形状推定に関する研究開発を行っている。 - 物体検出に関する研究開発を行っている。 - 画像のインペインティングに関する研究開発を行っている。 - 合成テキスト画像の生成に関する研究開発を行っている。 - 大規模言語モデルと視覚アシスタントに関する研究開発を行っている。 - 推薦システムの開発を行っている。 - OCR(光学文字認識)に関する研究開発を行っている。 # 使用技術 - Python - PyTorch - Tensorflow - Keras - OpenCV - CUDA - Google Cloud Platform (GCP) - Google Cloud Storage (GCS) - Google Cloud Dataflow - Google Cloud Vision API - BigQuery - Google Spreadsheet - Triton Inference Server - TensorRT - Docker - Hugging Face - Stable Diffusion - YOLO - CRNN - BERT - MeCab - BERT - Open Neural Machine Translation (ONMT) - BiLSTM-LSTM - CVAE - ResNet - AlexNet - VGG - apex - Amp - DistributedDataParallel - Pycocotools - CoreML - ONNX - EfficientNMS - Gradio - Streamlit - annoy - MLPlatform - kubectl - pyenv - poetry - FastChat - Llama 2 - ControlNet - LoRA - FID - MLPlatform - Seam Carving - TridentNet - RetinaNet - Mask R-CNN - SyncBatchNorm - MViTv2 - skia-python - pygame - PIL - numpy - matplotlib - h5py - scipy - gPb-UCM - LaMa - Hydra - pango - cairo - wand - layoutlib - opencole'
最後に論文の例です。こちらもソースコード同様、スキルセットに近しい専門的な単語が拾えています。
Query user description: '# 研究テーマ 画像や配信設定などのマルチモーダルデータを用いて、広告間の相対的な順位を予測するモデルを構築し、広告配信の効率化を目指す。具体的には、どの広告を優先的に配信すべきかを推定する手法を提案している。 推薦システムに関する研究。特に、ランディングページのデザインにおいて、ボタン、テキスト、アイコンといった複数のデザイン要素に対して適切なカラーパレットを推薦するシステムを開発している。 様々なウェブアプリケーションにおけるマルチモーダルデータの活用に関心を持ち、深層学習を用いたデータ分析手法の研究を行っている。特に、複数のモダリティ間の関係性を捉えることに重点を置き、BERTベースのエンコーダや、モダリティ内・モダリティ間の注意機構を用いたモデルの開発に取り組んでいる。 # 専門分野 - 機械学習, 深層学習, コンピュータビジョン, デザイン, 広告効果予測, マルチモーダルデータ分析, カラーパレット推薦'
====================
0.9061 '# 研究テーマ - 研究テーマ1の説明: ユーザーインターフェースのデザイン、特にレイアウト、色、ユーザーの行動分析に焦点を当てた研究を行っている。 - 研究テーマ2の説明: 動画要約、特に深層学習を用いた手法や、色と空間情報を利用した手法に焦点を当てた研究を行っている。 # 専門分野 - 専門分野1: ユーザーインターフェースデザイン - 専門分野2: コンピュータビジョン - 専門分野3: 深層学習'
0.8963 '# 研究テーマ - 色の計算: 特に、画像やベクターグラフィックにおける色の役割、選択、表現、及び操作に関する研究を行っている。具体的な応用として、画像編集やベクターグラフィック処理における色の自動化や支援などが挙げられる。 - 連続表現学習: 画像処理やコンピュータグラフィックスのタスクに応用可能な、色の連続的な表現方法の学習に関する研究を行っている。 # 専門分野 - コンピュータグラフィックス, 画像処理, 色彩科学'
0.8904 '# 研究テーマ - **デザインタスクにおける人工知能の応用**: ユーザーインターフェースデザイン、コンテンツ生成、レイアウト生成など、様々なデザインタスクを支援・自動化するAI技術について研究しています。特に、ユーザーの意図や創造性を理解し、それを反映したデザインを生成する技術に焦点を当てています。 - **マルチモーダルインタラクションを用いたデザイン支援**: グラフィックデザイン、Webデザインなど、視覚的な要素が重要なデザイン分野において、視覚情報だけでなく、音声、テキスト、ジェスチャーなど、複数のモダリティを組み合わせたインタラクション手法を研究しています。これにより、より直感的で効率的なデザインプロセスを実現することを目指しています。 # 専門分野 - 人工知能 - ヒューマンコンピュータインタラクション - グラフィックデザイン'
データ毎のベクトルの類似度Top5を表にまとめました。値の分布からも、チャットより論文やソースコード由来のユーザベクトルがより類似度の高いユーザが引けることがわかります。
@1 | @2 | @3 | @4 | @5 | |
---|---|---|---|---|---|
chat | 0.8552 | 0.8446 | 0.8435 | 0.8415 | 0.8413 |
code | 0.9333 | 0.9252 | 0.9143 | 0.9118 | 0.9036 |
paper | 0.9060 | 0.8962 | 0.8904 | 0.8759 | 0.8742 |
Summary
チャット・ソースコード・論文という3つのテキストデータからユーザーのスキルセットを抽出、検索に利用できるかといった実験をやってみました。結論として、十分なデータ量と適切に前処理を行えばスキルセットを説明するようなユーザベクトルを作ることができました。Datasetの項では紹介していませんでしたが、1ユーザーあたりのデータ量の目安は、500 chats、5 codes、7 abstracts程あれば今回使ったデータと似た条件で有効なベクトルを作ることができそうです。
今後の課題はたくさんあります。今回のアプローチはLLMを多用しており、特にユーザテキストを集約するプロセスで情報を要約しすぎてしまい、スキルセットを説明する特徴が残らない問題がありました。ハルシネーション含め大局的には影響しない程度の要約になるようなプロンプトの改善が重要です。
定量評価に分類タスクを行いましたが、ソースコードと論文は特徴量のリーク問題があります。論文だったら共著のユーザ同士、ソースコードなら同じRepositoryのContributor同士が、同じテキストを持ってしまいます。稼働量やファイル単位のCommit割合で重みをつけ、特徴量が重複しない工夫があると良さそうです。同じ研究部門メンバーのベクトルが似通うのは自明であり、本来は部門外で似たスキルセットの方を推薦したいので、よりリークに厳しいテキストを揃えられると良いでしょう。エンジニアの場合は論文ではなく技術ブログなど、その人を説明するあらゆるテキストが検討できます。精度によっては分類自体もLLMで行っても良さそうです。
また「◯◯について詳しい人はいますか?」といった自然言語による検索において、LLMに参照させる追加情報として今回のEmbeddingをindex化しておくRAG(検索拡張生成)[5]を用いる方法も考えられます。今回は議論のしやすいよう自身の所属部門での実験でしたが、データを全社に拡張することでより幅広いスキルセットによる検索・推薦が可能です。似たような課題をお持ちの方の参考になれば幸いです。
CyberAgent AI Lab Advent Calendar 2024 はこの記事で最後になります。アドベントカレンダーをAI Lab単体で開催するのは初の試みでしたが、お楽しみ頂けましたでしょうか。CyberAgent AI Labではこのようなちょっとしたアイディアを形にすることが好きなEngineer/Researcherを募集しています。まずはカジュアル面談からでも気軽にご連絡ください。この記事の執筆にあたり実験含め協力頂いたshunyoさん、Aozora Inagakiさん、Kosuke Yamadaさん並びに、ここまで読んで頂いた方共々ありがとうございました。ハッピークリスマス!!
Appendix
論文Abstractのサンプル。
[
'Vector graphic documents present multiple visual elements, such as images, shapes, and texts. Choosing appropriate colors for multiple visual elements is a difficult but crucial task for both amateurs and professional designers. Instead of creating a single color palette for all elements, we extract multiple color palettes from each visual element in a graphic document, and then combine them into a color sequence. We propose a masked color model for color sequence completion and recommend the specified colors based on color context in multi-palette with high probability. We train the model and build a color recommendation system on a large-scale dataset of vector graphic documents. The proposed color recommendation method outperformed other state-of-the-art methods by both quantitative and qualitative evaluations on color prediction and our color recommendation system received positive feedback from professional designers in an interview study.',
'We consider learning a continuous and scalable vector representation of color, called color2vec, for design applications that involve a color palette. A color palette presents thematic color specification to the design documents, and implicitly encodes semantics of styling. We aim to represent color palette in an unified common embedding, which we model after popular word embedding models. In our approach, we first extract color palette from a given design image and convert to a sequence of colors in a certain color space, and we attempt to learn a word embedding model from the palettes. We demonstrate that our color2vec representation can be successfully applied in the downstream task of advertising effect prediction.',
'There is increasing interest in the use of multimodal data in various web applications, such as digital advertising and e-commerce. Typical methods for extracting important information from multimodal data rely on a mid-fusion architecture that combines the feature representations from multiple encoders. However, as the number of modalities increases, several potential problems with the mid-fusion model structure arise, such as an increase in the dimensionality of the concatenated multimodal features and missing modalities. To address these problems, we propose a new concept that considers multimodal inputs as a set of sequences, namely, deep multimodal sequence sets (DM2S2). Our set-aware concept consists of three components that capture the relationships among multiple modalities: (a) a BERT-based encoder to handle the inter- and intra-order of elements in the sequences, (b) intra-modality residual attention (IntraMRA) to capture the importance of the elements in a modality, and (c) inter-modality residual attention (InterMRA) to enhance the importance of elements with modality-level granularity further. Our concept exhibits performance that is comparable to or better than the previous set-aware models. Furthermore, we demonstrate that the visualization of the learned InterMRA and IntraMRA weights can provide an interpretation of the prediction results.',
'Webサイトやアプリの訪問者に対して各個人の嗜好に合わせた商品訴求が可能なオンライン広告の隆盛に伴い,大量のユーザに多様な配信が可能な広告配信プラットフォームの重要性が増している.各プラットフォームでは独自のアルゴリズムが構築されており,運用担当者は広告クリエイティブの運用による広告効果の改善に力を注いている.このような背景の中で,ユーザの反応が得られるようなより多くの広告クリエイティブを制作し入稿する作業が重要になる.しかし,各プラットフォームでは広告配信に利用できる広告数に上限があるため,広告クリエイティブを入稿する優先順序を決める必要がある.本研究では,オンライン広告の管理構造に着目し,広告間の相対的な順位を学習することで,どの広告から配信すべきかの推定を行う手法を提案する.まず,広告クリエイティブの画像や配信設定といったマルチモーダルなデータから広告間の相対的な順位を予測するモデルを構築する.そして広告の配信データを用いたオフラインでの予測検証を行い,提案手法の有効性を示す.',
'Color plays an important role in users’ attitudes and purchase intentions in the context of advertising. In landing page design, designers usually struggle with getting appropriate color palettes for multiple design elements, such as buttons, texts, and icons. Therefore, we build a color recommendation system for landing page design. To learn different color palettes for each design element instead of a single palette for the overall design, we use a color sequence combining multiple color palettes of design elements. We train a masked color model for color sequence completion and advertising performance prediction. Further, the system allows users to recolor a specified element in the image based on recommended colors. We conduct a user study by collecting qualitative feedback from professional graphic designers through interviews, which validates the usability of the proposed color recommendation system for landing page design.',
]
Abstracts要約プロンプト。
f"""以下はあるユーザーの複数の論文の abstracts です。
このユーザーの説明文を生成してください。
この際、以下に注意してください。
- できるだけその人を特定できるような説明にすること
- 情報はできるだけ冗長にすること
- テキストの装飾は不要です
■ Abstract
{abstracts}
■ 出力フォーマット
# 研究テーマ
- 研究テーマ1の説明
- 研究テーマ2の説明
# 専門分野
- 専門分野1, 専門分野2, 専門分野3
"""
得られたAbstracts要約テキスト。
"""
# 研究テーマ
画像や配信設定などのマルチモーダルデータを用いて、広告間の相対的な順位を予測するモデルを構築し、広告配信の効率化を目指す。具体的には、どの広告を優先的に配信すべきかを推定する手法を提案している。
推薦システムに関する研究。特に、ランディングページのデザインにおいて、ボタン、テキスト、アイコンといった複数のデザイン要素に対して適切なカラーパレットを推薦するシステムを開発している。
様々なウェブアプリケーションにおけるマルチモーダルデータの活用に関心を持ち、深層学習を用いたデータ分析手法の研究を行っている。特に、複数のモダリティ間の関係性を捉えることに重点を置き、BERTベースのエンコーダや、モダリティ内・モダリティ間の注意機構を用いたモデルの開発に取り組んでいる。
# 専門分野
- 機械学習, 深層学習, コンピュータビジョン, デザイン, 広告効果予測, マルチモーダルデータ分析, カラーパレット推薦
"""
ソースコード(readme.md, pyproject.toml, requirements.txt)サンプル。
"""
{
"readmes": ["# An easy-to-use [MLflow](https://mlflow.org/docs/latest/what-is-mlflow.html) to track experiments, flexible more users. ## Quick start ### 1. Install MLflow CLI on your training environment ```shell poetry add mlflow ``` or ```shell pip install mlflow ``` ### 2. Set environment variables ```shell cat scripts/.env.example ``` You must set `MLFLOW_CLIENT_ID` and `MLFLOW_TRACKING_URI` in your environment variables before running mlflow. It is OK to use direnv or export command, but **do not commit** their environment variables to GitHub. ### 3. Integrate MLflow with your code ```python from os import environ from pathlib import Path from random import random, randint import mlflow # ... authorize_mlflow() mlflow.set_tracking_uri(environ["MLFLOW_TRACKING_URI"]) mlflow.set_experiment("sample") with mlflow.start_run(): # Log a parameter (key-value pair) mlflow.log_param("param1", randint(0, 100)) # Log a metric; metrics can be updated throughout the run mlflow.log_metric("foo", random()) mlflow.log_metric("foo", random() + 1) mlflow.log_metric("foo", random() + 2) # Log an artifact (output file) if not Path("/tmp/outputs").exists(): Path("/tmp/outputs").mkdir(exist_ok=True) with open("/tmp/outputs/test.txt", "w") as f: f.write("hello world!") mlflow.log_artifacts("/tmp/outputs") ``` See [examples](examples), and read [integrations](https://mlflow.org/docs/latest/tracking.html#automatic-logging). "],
"deps": [
"[tool.poetry] name = "xxx" version = "0.1.0" description = "An easy-to-use platform to track experiments, flexible more users." authors = ["chck"] readme = "README.md" [tool.poetry.dependencies] python = "^3.9" gevent = "^21.12.0" psycopg2-binary = "^2.8.6" google-cloud-storage = "^1.38.0" [tool.poetry.dev-dependencies] [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.poetry]",
"name = "yyy" version = "0.1.0" description = "" authors = ["chck"] [tool.poetry.dependencies] python = "^3.9" google-api-python-client = "^2.9.0" google-cloud-storage = "^1.38.0" mlflow = "^2.7.1" [tool.poetry.group.admin] optional = true [tool.poetry.group.admin.dependencies] polars = "^0.19.2" connectorx = "^0.3.2" absl-py = "^1.4.0" pyarrow = "^13.0.0" [tool.poetry.dev-dependencies] [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api",
"accelerate>=0.12.0 torch>=1.5.0 torchvision>=0.6.0 datasets>=1.17.0 evaluate git+https://github.com/huggingface/transformers@fc296f419e451d3c595a68455f18e20a3819fcd5#egg=transformers scikit-learn mlflow-skinny google-auth google-cloud-storage numpy==1.26.4 langchain>=0.1.14 langchain-community>=0.0.31 langchain-core>=0.1.4 langchain-openai>=0.1.1 python-dotenv==1.0.1 pillow==10.3.0 mlflow==2.13.0 google-cloud-storage>=2.16.0 google-auth>=2.29.0 spacy==3.7.4 textstat=0.7.3", "", … "[tool.poetry] package-mode = false [tool.poetry.dependencies] python = ">=3.9,<3.12" aim = "^3.23.0" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api",
]
}
ソースコード要約プロンプト。
f"""以下はあるユーザーが Contribute したリポジトリの README, requirements.txt, pyproject.toml のファイルの内容のリストです。
このユーザーがどのような開発や研究をしているか、どのような技術スタックを使っているかを推測してください。
この際、以下に注意してください。
- できるだけその人を特定できるような説明にすること
- 情報はできるだけ冗長にすること
- テキストの装飾は不要です
- 業務内容, 使用技術 のみに絞って説明してください。これ以外の情報は不要です。
■ README
{texts}
■ pyproject.toml, requirements.txt
{deps}
■ 出力フォーマット
# 業務内容
- 業務内容1の説明
- 業務内容2の説明
# 使用技術
- 使用技術1, 使用技術2, 使用技術3
"""
得られたソースコード要約テキスト。
"""
# 業務内容
- GCP(Google Cloud Platform)のGKE(Google Kubernetes Engine)を用いたMLflowやAimなどのプラットフォーム構築、運用自動化、ユーザー管理などを担当している。
- ハイパーパラメータチューニング、データセットの管理、可視化などの業務を行っている。
- 生成、キャプション生成、セマンティックセグメンテーション、パノプティックセグメンテーションなどの研究開発を行っている。
- 商品説明文からのキャッチコピー生成など、広告クリエイティブに関する研究開発を行っている。
- 広告画像の解析、編集、およびそれらを用いた深層学習モデルの学習、推論を行っている。
- Docker、Terraformを用いたインフラストラクチャ構築やWebアプリケーションのフロントエンド、バックエンド開発を行っている。
- 大規模データセットの処理、分析、可視化を行っている。
# 使用技術
Kubernetes, GCP, GKE, MLflow, Aim, Hugging Face, Transformers, Vertex AI, Langchain, PyTorch, Torchvision, OpenCV, scikit-learn, Matplotlib, CUDA, Tensorboard, CoreML, ONNX, JavaScript, React, WordPress, AWS, Lightsail, Aurora, WAF, ALB, Cognito, Node.js, pnpm, Slidev, Google Drive, Google Spreadsheet, BigQuery, Pub/Sub, Cloud Functions, Slack, Secret Manager, Cloud Scheduler, Eventarc, Google Apps Script, clasp, jest, gts, PyScaffold, Apache Beam, TensorFlow, pandas, spaCy, MeCab, OpenNMT, AllenNLP, Streamlit, annoy, FastAPI, uvicorn, pydantic, Stable Diffusion, keras
"""
-
Google Cloudのデータプライバシー規約により与えたプロンプトやレスポンスの学習は行われません ↩︎
-
GitHubやSlackと異なり論文は公開先が一般化されていないため、学会ごとに逐一人手で検索しました。今思えばArxivやGoogle ScholarはAPIがあるため、こちらで取り切れない論文のみ自力で取得すればよかったです。もっとスマートな方法あれば教えて下さい。 ↩︎
-
https://towardsdatascience.com/building-an-observable-arxiv-rag-chatbot-with-langchain-chainlit-and-literal-ai-9c345fcd1cd8 ↩︎
Discussion