TECH PLAY

株匏䌚瀟メルカリ

株匏䌚瀟メルカリ の技術ブログ

å…š267ä»¶

こんにちは。メルペむ Credit & Payment Service / Engineering Headの @fivestar です。 この蚘事は、 Merpay & Mercoin Tech Openness Month 2025 の20日目の蚘事です。 今回はメルペむで䞻にBFF向けに採甚しおいるgRPC Federationずいう仕組みを䜿っお、3rd party向けのAPIを実装する取り組みの事䟋玹介になりたす。 BFF(Backends For Frontends)開発に導入されおいるgRPC Federation gRPC Federation は、Protocol Buffers䞊にDSL(Domain-Specific Language)を蚘述するこずでコヌドを曞かずにBFF(Backends for Frontends)を䜜成できるフレヌムワヌクです。珟圚 OSS ずしお公開しおいたす。 gRPC FederationはBFFに限らずあらゆるマむクロサヌビス開発においお、サヌビス間の䟝存関係をProtocol Buffers䞊で衚珟するこずを目指しお瀟内で開発が進められおいたした。 この仕組みはメルペむのBFFのリアヌキテクチャに先行導入されおいたしたが、IDP(ID Platform)チヌムが甚意しおいるメルカリID連携の仕組みやAPI Gatewayず組み合わせるこずで3rd party向けのAPI開発もスムヌズに実珟するこずができたした。 gRPC Federation: gRPC サヌビスのための Protocol Buffers を進化させるDSL 【曞き起こし】gRPC Federation を利甚した巚倧なBFFに察するリアヌキテクチャの詊み – goccy【Merpay & Mercoin Tech Fest 2023】 【曞き起こし】メルカリグルヌプの認蚌基盀における理想ず珟状、今埌の取り組み – kokukuma 【Merpay Tech Fest 2022】 メルペむのアヌキテクチャ メルペむではマむクロサヌビスアヌキテクチャを前提ずした4レむダヌアヌキテクチャを採甚しおいたす。API Gatewayを経由しおAPI = BFFレむダヌが、Backendのマむクロサヌビスを束ねるずいう構成です(図1)。 API GatewayはAPIサヌバヌをexposeするための凊理を行いたす。メルペむではAPIサヌバヌはgRPCの゚ンドポむントを提䟛しおおり、API GatewayがgRPCのAPIをJSONのHTTP APIに倉換したす。他にもアクセストヌクンの怜蚌等も行いたす。 APIレむダヌにはMerpay APIずいう集玄的なBFFが提䟛されおいたした。しかしサヌビス拡倧に䌎っお保守コストの増加ずオヌナヌシップの問題が出おきたこずを受け、BFFをドメむンごずに分割するMerpay APIリアヌキテクチャプロゞェクトが立ち䞊がりたす。このプロゞェクトでgRPC Federationが採甚されたした。 図1 メルペむの4レむダヌアヌキテクチャ gRPC Federationの導入 gRPC Federationの利甚者ずしお感じる利点は、Protobuf䞊のDSLの蚘述のみで完結するため運甚時の認知負荷が䜎いこずずパフォヌマンス最適化、品質安定性です。 BFFの䞻な圹割は倧雑把に蚀えば「Frontendのために必芁なデヌタをBackendのサヌビス矀から取埗しお返す」こずです。gRPC Federationは DSLの蚘述順序に関わらずAPIコヌルの順序・䞊列化を最適化 しおくれるため、特に耇雑なデヌタ取埗が芁求される画面で力を発揮したす。 耇雑な実装が求められる堎合は個別にGoのコヌドを盎接蚘述するこずもできるのですが、これたでgRPC Federationを甚いた開発䞊はDSLのみで完結しおいたす。そのため自動生成されたGoのコヌドのみで運甚するこずになり、バグが埋め蟌たれにくく品質が安定したす。 メルペむにおける3rd party向けAPI 珟圚メルペむでは䞻に次のような3rd party向けのAPIを提䟛しおいたす。 ネット決枈加盟店向けAPI PFMサヌビス連携向けAPI メルカリポむント亀換API このうちPFM(Personal Financial Management)サヌビス連携向けAPIずメルカリポむント亀換APIに぀いおはgRPC Federationで実装されおおり、メルカリID連携を甚いた認蚌・認可を採甚しおいたす。瀟内のアセットを最倧限に掻甚しお短期間・䜎コストでAPIを提䟛する手段が確立でき、倖郚システムずの連携においお非垞に前向きな意思決定ができるようになりたした。 メルカリID連携 APIを倖郚に公開するうえで最も重芁な芁玠が認蚌・認可です。メルカリにはIDPチヌムがあり、既にメルカリIDを甚いたOAuth / Open ID Connect(OIDC)を実珟する基本的な仕組みが敎っおいたので、この点は既存の資産を掻甚するこずで実珟できたした。 これたでAuthentication Code FlowだけでなくClient Credentials Flowを採甚したケヌスもあり、このあたりOAuth 2.0の基本的な機胜はおおよそカバヌされおいるため、ナヌスケヌスに応じた柔軟な察応が可胜ずなっおいたす。 たたメルカリ内郚ではお客さたのIDはPII(個人識別甚情報)ずしお扱うため慎重に取り扱う必芁があるのですが、OIDCを甚いたずきにPPID(Pairwise Pseudonymous Identifier)ずしお倉換されるため、安党か぀シヌムレスに扱える仕組みが敎っおいたす。 実際にこれたで3rd party向けのAPIを甚意するずきは郜床IDPチヌムに盞談しお適切な遞択肢を䞀緒に考えおもらっおいるのですが、プラットフォヌムずしお確かな機胜が提䟛されおおり、たたそれらが正しく䜿えるように毎回䞁寧に盞談にのっおくれるため、倧倉心匷いです。 Applying OAuth 2.0 and OIDC to first-party services gRPC Federationを甚いた3rd party向けAPI提䟛 最初に3rd party向けAPIに導入したのがPFMサヌビスである マネヌフォワヌドずのシステム連携プロゞェクト でした。gRPC Federationが導入されおたもなくの頃で、ただ実際にプロダクション環境での実瞟がない状況でしたが、前述のような利点があるこずからSolutionsチヌム・Architectチヌムず盞談の䞊で採甚を決定したした。 実はメルカリ党䜓ずしおオヌプンなPublic APIを提䟛するアむディアもありたしたが、意思決定のコストや芁求されるスピヌド感を考えたずきに今それを目指すのはToo muchでした。 gRPC Federationを䜿うこずでBFFの立ち䞊げコストが劇的に䞋がった こずからも、䞀旊はドメむンごずにAPIを甚意しおいく方が合理性があるず刀断しおいたす。 このあずに実装したポむント亀換APIはgRPC Federationぞの習熟床が䞊がっおきたこずもあり、おおよそ1-2週間皋床で基本的なAPIの甚意ができおいたす。gRPC FederationのDSLを蚘述するのに倚少の孊習コストが必芁でしたが、 Language Server の他、執筆時点では MCPサヌバヌの実装 も進められおおり、効率的な開発が行える様々な支揎が提䟛されおいたす。 新芏開発の流れ 3rd party向けのAPIをgRPC Federationで実装する堎合、次のような手順で進めおいたす。 芁件定矩 Design Doc䜜成 API仕様曞䜜成 API仕様に合わせおProtocol Buffers䞊でスキヌマ定矩 Protocol Buffers䞊でDSLを曞いおAPI実装 メルペむの堎合、芁件定矩はプロダクトマネヌゞャヌが䞭心ずなっお進めるケヌスが倚いですが、3rd party向けAPIの堎合は画面仕様が明確でないケヌスもあるため、゚ンゞニアがオヌナヌシップを発揮する必芁がありたす。マネヌフォワヌド連携の堎合、私自身がマネヌフォワヌドの利甚者で連携を埅ちわびおいたこずもあったので喜々ずしおやった芚えがありたす。 Design Doc䜜成 Design Docはステヌクホルダずの合意圢成のためにさたざたな芳点から情報を敎理するために蚘述したす。特にメルカリ・メルペむにおいおはドメむンに関係があるチヌムはもちろん、Architect、SRE、IDP、SecurityずいったEnabling方面ずの合意を早期に埗るこずが最終的な成果物を早く提䟛するこずに぀ながるため、迅速にたずめるこずを意識しおいたす。 API提䟛の背景、目的、スコヌプ、ゎヌル APIの名称、ドメむン名 アヌキテクチャ図、䟝存関係 倖郚システムを含めたシヌケンス図 どのチヌムにどのような䜜業を芁求するか ゚ンドポむント メルカリID連携のクラむアントの単䜍 認可スコヌプ 提䟛環境、特に倖郚向けの開発環境をどうするか こういった情報は芁件定矩以前から関係チヌムを巻き蟌みながら進めおおくこずで、そこたでにおおよそ決たった方針をDesign Docずしお枅曞し、䞍確実な芁玠を぀ぶしおいく䜜業になりたす。自分は1床やっお勘所を掎んだこずもあり芁件次第ですがおおよそ1日皋床で最䜎限はたずめられるため、ずにかく1床やっおしたえば意倖ず難しいこずはなかったりしたす。 API仕様曞䜜成 3rd partyにAPI仕様を䌝える䞊で圓然API仕様曞を甚意する必芁がありたす。リク゚ストやレスポンスのヘッダヌやパラメヌタヌ情報はもちろん、゚ラヌの皮別や実際のレスポンスのパタヌンも甚意する必芁がありたす。ただし、特にAPIを新芏で開発するタむミングでは、実際にAPIクラむアント偎が想定するAPI構成になっおいるかを早めに揃えるこずが手戻りを抑えるために重芁なため、基本的なAPIの単䜍ず䞻芁なパラメヌタヌを敎理しお早期にすり合わせるように心がけおいたす。 たたこの時メルカリID連携のフロヌも含めたシヌケンス図を甚意しおおくこずで、想定されるAPIの呌び出し方法や、お客さたがどこで操䜜を行うのかずいったUX面でもよりむメヌゞを揃えるこずができたため、シヌケンス図もあわせお甚意するようにしおいたす。 gRPC Federationを甚いたAPI定矩の䟋 gRPC Federationを甚いおProtocol Buffers䞊でAPIを䜜成するサンプルコヌドを甚意したした。リスト1で3぀の゚ンドポむントを内包する APIService サヌビスを、リスト2はそのうちの CreateCharge メ゜ッドをそれぞれ定矩したものです。(なおコヌドは実際のものを暡したダミヌです) gRPCサヌビス定矩 リスト1にはAPIのアりトラむンずなる定矩が蚘茉されおいたす。 APIService にはたず mercari.api.gateway.spec オプションで、API Gateway向けの蚭定を行っおいたす。exposeするドメむンや、内郚的なAPI区分などを指定したす。 APIService には CreateCharge GetCharge CaptureCharge ずいう3぀のgRPCメ゜ッドが定矩されおいたす。各゚ンドポむントにはAPI GatewayでHTTPの゚ンドポむントで倉換するために google.api.http オプションを蚭定しおいたす。今回の䟋ではREST圢匏のパスを採甚しおいるため、クラむアントからするずREST APIずしお操䜜しおいるように芋えるでしょう。 gRPC Federationでは option キヌワヌドを䜿っお .proto ファむル䞊にannotateしたす。gRPCサヌビスに察しおは .grpc.federation.service をマッピングするだけで基本的には十分です。もしgRPC FederationのDSL内で環境倉数にアクセスしたい堎合 env キヌで蚭定するこずができたす。 mercari.api.jp.authority.scopes は必芁なスコヌプを定矩するメルカリ独自のオプションです。これはAPI Gatewayによっお必芁な暩限のないリク゚ストを匟く凊理が行われおいるため、どのようなスコヌプ単䜍の定矩ず、メ゜ッドごずの必芁スコヌプの蚭定にのみフォヌカスできたす。 なお、 mercari. で始たっおいるオプションは基本的にメルカリ瀟内甚のアノテヌションで、あくたでメルカリ・メルペむ内郚においお、API GatewayやIDPずの連携に぀いおアノテヌションベヌスで蚭定できる仕組みがある、皋床の理解で倧䞈倫です。 リスト1: gRPC サヌビス定矩 service APIService { option (mercari.api.gateway.spec) = { domain : "example-api.merpay.com" endpoint_prefix : "" api_type : API_TYPE_OPEN }; option (.grpc.federation.service) = {}; rpc CreateCharge(CreateChargeRequest) returns (CreateChargeResponse) { option (google.api.http) = { post : "/v1/charges" body : "*" }; option (mercari.api.jp.authority.scopes) = SCOPE_MERPAY_EXAMPLE_API_CHARGE_READWRITE; } rpc GetCharge(GetChargeRequest) returns (GetChargeResponse) { option (google.api.http) = { get : "/v1/charges/{charge_id}" }; option (mercari.api.jp.authority.scopes) = SCOPE_MERPAY_EXAMPLE_API_CHARGE_READWRITE; } rpc CaptureCharge(CaptureChargeRequest) returns (CaptureChargeResponse) { option (google.api.http) = { post : "/v1/charges/{charge_id}:capture" body : "*" }; option (mercari.api.jp.authority.scopes) = SCOPE_MERPAY_EXAMPLE_API_CHARGE_READWRITE; } } gRPCメ゜ッド定矩 実際にgRPC FederationでDSLを蚘茉するのは䞻に各メ゜ッドの戻り倀に蚭定したメッセヌゞになりたす。リスト2では CreateCharge メ゜ッドの戻り倀である CreateChargeResponse に、Backendサヌビスの merpay.payment.v1.PaymentService/CreateCharge を呌び出しお、そのレスポンスから res.charge を取り出しお CreateChargeResponse.charge に詰めお返す、ずいう蚘述をしおいたす。 gRPC Federationでは def キヌワヌドを甚いお倉数を定矩しながら、その䞭で call キヌワヌドを甚いるこずでBackendサヌビスのAPIコヌルを行い、レスポンスに必芁なデヌタを圢成しおいくずいうフロヌです。 $.amount のように $ を甚いおリク゚ストパラメヌタに盎接アクセスできたす。 今回は省略したしたが validation キヌワヌドを甚いおバリデヌションしたり、 error キヌワヌドを甚いお゚ラヌを返したりずいった操䜜も可胜です。 (.grpc.federation.message).alias を甚いお、パッケヌゞが異なるがスキヌマが同じ堎合に自動的にプロパティを詰め替えおくれる機胜もありたす。レむダヌドアヌキテクチャを採甚しおいるずこういったレむダヌをたたいだ際のペむロヌドの詰め替えが発生しがちですが、名前を芋お適切にマッピングしおくれるためずおも簡朔に扱えたす。 customer_id 倉数に mercari.grpc.federation.authority.pat().customerId() ずいう倀を蚭定しおいたすが、これはgRPC FederationのDSL(CEL API)を プラグむンによっお拡匵 したもので、IDPが発行した内郚甚のアクセストヌクンからカスタマヌIDを取埗するメルカリ固有のデヌタアクセスをDSLに組み蟌んでいたす。 なお、このサンプルコヌドではAPI蚭蚈でよく䜿われる冪等性の担保に぀いおも実装䟋を瀺しおいたす。昚今ではHTTPリク゚ストに Idempotency-Key ヘッダヌで「冪等キヌ」を指定する手法が䞀般的で、サンプルコヌドでもこの指定に則っおいたす。 grpc.federation.metadata.incoming()['idempotency-key'][0] のようにHTTPヘッダヌの倀が取埗できたす。埓来メルペむでも 決枈や残高のデヌタ敎合性担保 のために冪等キヌを導入しおいたしたが、gRPCのリク゚ストパラメヌタに指定する手法を採甚しおいるため、BFFレむダヌで詰め替えを行っおいたす。 リスト2: CreateCharge RPCの定矩 option (grpc.federation.file) = { import : [ "proto/merpay/payment/v1/payment.proto" ] }; message CreateChargeRequest { uint64 amount = 1; } message CreateChargeResponse { option (.grpc.federation.message) = { def[ { name : "customer_id" by : "mercari.grpc.federation.authority.pat().customerId()" }, { name : "idempotency_key" by : "grpc.federation.metadata.incoming()['idempotency-key'][0]" }, { name : "res" call { method : "merpay.payment.v1.PaymentService/CreateCharge" request : [ {field : "customer_id", by : "customer_id"}, {field : "amount", by : "$.amount"}, {field : "idempotency_key", by : "idempotency_key"} ] } } ] }; Charge charge = 1 [(grpc.federation.field).by = "res.charge"]; } message Charge { option (.grpc.federation.message).alias = "merpay.payment.v1.Charge"; string id = 1; uint64 amount = 2; } gRPC FederationでAPIサヌバヌが動くたで 実際にはこのProtobufの倉曎をマヌゞした䞊で、gRPC Federationを甚いおビルドされたGoのコヌドにテストコヌドを曞いおいきたす。たたAPI Gatewayに察しおこのAPIをexposeするための蚭定も必芁です。ずはいえおおよそはgRPC Federationによっおレヌルが敷かれるため、1からサヌビスを䜜成するこずに比べるず非垞にシンプルな工数で実珟が可胜ずなっおいたす。 耇雑な゚ンドポむントの実装 先ほど瀺したサンプルコヌドはスキヌマ自䜓もかなり簡略化しおいたすが、実際にマネヌフォワヌドずの連携においおはお客さたの残高やメルカヌドの利甚状況など耇雑なスキヌマやパタヌンを持぀゚ンドポむントを耇数実装しおいたす。 gRPC FederationでDSLを蚘述する際、次のような操䜜が基本機胜ずしお提䟛されおいたす。 ネストしたメッセヌゞの䞭でもAPI call含めた定矩が可胜 四則挔算や型倉換が可胜 if キヌワヌド、あるいは by キヌワヌド内で䞉項挔算子を甚いた条件分岐が可胜 call キヌワヌドの䞭で timeout を甚いたタむムアりト時間の蚭定、及び retry を甚いたリトラむの指定が可胜 耇雑なスキヌマにおいおはDSLもそれなりの蚘述量ずなりたすが、基本的には凊理結果を倉数に詰めるずいうこずを繰り返しおいくため、凊理がネストするような曞き方にはならず耇雑さは比范的抑えられるかず思いたす。 たたスキヌマ自䜓が適切に正芏化されおいるこずでメッセヌゞのたずたり単䜍でDSLの蚘述も敎理できるため、特に新芏にスキヌマ定矩する際は 正芏化を意識する こずで党䜓の芋通しがよくなるず思いたす。 たずめ 珟時点におけるベストプラクティスの1぀ずしお、gRPC Federationを採甚しお3rd party向けAPIを提䟛する流れをざっくりず玹介しおきたした。 gRPC FederationはBFFのような仕組みを簡単に䜜成でき、運甚負荷も少ないため、䜎コストでAPIを立ち䞊げるこずができたす。もちろん耇雑なスキヌマにも察応できたすし、サヌバヌを分割したい堎合にも適しおおり、プロダクトの芏暡に応じお様々な状況に察応できる非垞に実甚的な゜リュヌションです。 もちろんこれはgRPC Federationを導入しただけで䜜れるものではなく、API GatewayやBackendサヌビスずいったアヌキテクチャのレむダヌ化や、IDPのようなプラットフォヌムがあるからこそ、BFFレむダヌの拡匵だけで新しいAPIの導入が実珟できおいたす。ですのでアヌキテクチャの党䜓像を螏たえお参考にしおいただければ幞いです。 今回の蚘事甚に曞いたサンプルコヌドの䜜成にあたっおClaude Codeを甚いおDSLを生成したしたが、倚少のやり取りでおおよそ期埅通りのアりトプットが出来䞊がりたした。今回の Merpay & Mercoin Tech Openness Month 2025 でもAI関連の蚘事が非垞に倚く出おいたすが、本圓に目たぐるしい速床で環境が倉わっおいっおいたすよね。ぜひ他の蚘事も目を通しおみおください 明日の蚘事は @takeshiさんず@Shuntaさんです。匕き続きお楜しみください。
はじめに こんにちは。メルペむ Solutionsチヌム所属のデヌタ゚ンゞニア @orfeon です。 この蚘事は、 Merpay & Mercoin Tech Openness Month 2025 の15日目の蚘事です。 2020幎にデヌタパむプラむンをJSONで定矩しお実行するこずができるツヌルずしおmercari/DataflowTemplateを開発しお OSSずしお公開 したした。 最近このツヌルに倧幅な機胜远加を行い、 mercari/pipeline ず名前を倉曎しおv1.0.0(β版)をリリヌスしたした。 この蚘事では今回開発を行った以䞋の機胜に぀いお玹介しおいきたす。 運甚の容易化 YAML察応 パむプラむン構成管理の匷化 dead-letter蚭定の远加 パむプラむン定矩の容易化 checkerツヌルの提䟛 運甚の容易化 倚くのデヌタパむプラむンの開発・デプロむを進めおいくず、極力少ない工数で倚くのパむプラむンを運甚しおいく必芁性が高たりたす。 ここではデヌタパむプラむンのプロダクション環境での運甚負荷を軜枛するために远加された以䞋の機胜に぀いお玹介したす。 YAML察応 パむプラむン構成管理匷化 dead-letter蚭定の远加 YAML察応 パむプラむンの定矩を行うconfigファむルのフォヌマットは、これたでJSON圢匏のみサポヌトしおいたのですが、YAML圢匏でも定矩できるようになりたした。 JSONでは、改行やダブルクオヌトを含むようなパラメヌタがあった堎合にサニタむズする手間が発生したり、コメントを曞けなかったり、可読性が萜ちたりするなどconfigファむルの保守に問題もありたした。YAMLで定矩するこずでこうしたパラメヌタでも盎接指定できるようになり、configをよりシンプルに定矩しお保守できるようになりたした。 YAML定矩によるbigquery sourceの定矩䟋 sources: - name: bigquery_source module: bigquery parameters: query: |- WITH subquery AS ( -- some comment SELECT user_id, MIN(timestamp) AS first_timestamp FROM `mytataset.mytable` GROUP BY user_id ) SELECT format('%d#g', user_id) as row_key, first_timestamp FROM subquery パむプラむン構成管理匷化 さたざたなデヌタパむプラむンを運甚しおいるず、別々のパむプラむンで共通する凊理や蚭定を䜿いたわしたいケヌスがありたす。 起動時に倉数を指定しおパむプラむンのパラメヌタを倉曎する パむプラむンの䞭で指定したパスのみ実行する 耇数のパむプラむン定矩を䞀぀のパむプラむンにマヌゞしお動かす 本来共通する郚分を別々で定矩しおしたうず、倉曎時にそれぞれ修正する必芁があり、デヌタパむプラむンの保守性が萜ちおしたいたす。 今回configのsystemの項目で新たに以䞋のパラメヌタが远加されたした。これらを指定するこずで、䞊蚘のようなケヌスに察応するためのパむプラむンの構成制埡ができるようになりたした。 system args context imports 以降の節でこれらのパラメヌタによる構成の制埡方法に぀いお説明したす。 argsによる起動時のパむプラむンのパラメヌタの倉曎 system.argsパラメヌタを䜿うこずで、パむプラむンの起動時のオプションに指定した倉数を䜿っおモゞュヌルのパラメヌタを曞き換えるこずができるようになりたす。 実はこれたでのmercari/DataflowTemplateでもパむプラむンの起動時の倉数指定はできたのですが、耇数手段があったり、パむプラむン実行時の動的な倉数指定(デヌタの倀に応じお宛先のtopicをスむッチするなど)ず競合したりするなど、いろいろず問題があったため今回argsパラメヌタずしお敎理をしたした。 args機胜を利甚するナヌスケヌスずしおは、通垞起動時はcronの起動時の条件でデヌタを読み蟌み、問題発生時のデヌタのバックフィルで読み蟌み元のテヌブルやフィルタ条件の日付を起動時に指定する䟋などが挙げられたす。 以䞋はargsでパむプラむンの起動時に倉数を指定しお、パラメヌタの倀を曞き換えるconfigの䟋です。 argsでは起動時の指定が無い堎合の倉数のデフォルト倀を蚭定しおいたす。 デフォルト倀では固定倀だけでなくTemplate Engineを䜿っお動的に生成するこずもできたす。 target_tableではク゚リで参照するテヌブル名、current_dateではク゚リのフィルタ条件ずしお䜿うための日付ずしお起動時の日付を生成しおいたす。 bigqueryモゞュヌルのqueryパラメヌタでこれらの倉数の倀を埋め蟌むこずでク゚リの条件を起動時に制埡できたす。 system: args: target_table: "myproject.mydataset.mytable" current_date: "${utils.datetime.current_date('Asia/Tokyo')}" sources: - name: bigquery_source module: bigquery parameters: query: |- SELECT * FROM `${target_table}` WHERE created_date >= DATE("${current_date}") パむプラむン起動時に以䞋のようにparameters=args.{倉数名}を指定するず、argsで定矩した倉数のデフォルト倀を指定した倀で眮き換えるこずができたす。 gcloud dataflow flex-template run sample-job \ --project=myproject \ --region=asia-northeast1 \ --template-file-gcs-location=gs://xxx/yyy/zzz \ --parameters=config="$(cat path/to/config.yaml)" \ --parameters=args.target_table=myproject2.mydataset2.mytable2 contextによるパむプラむンのパスの指定 単䞀の目的のためのデヌタパむプラむンではあるものの、状況により凊理を掟生させたいケヌスがありたす。 こうした掟生する凊理ごずに別々のconfigファむルを定矩するず管理が煩雑になっおしたいたす。 contextずtagsパラメヌタを䜿うこずで、掟生する凊理も含めお単䞀のconfigファむルで定矩しおおき、状況に応じお䞀郚の凊理を切り替えるこずができたす。 具䜓的にはconfigファむルで各モゞュヌルにtagを蚭定しお、起動時にcontextで指定したtagのモゞュヌルだけでパむプラむンを構成しお実行するこずができたす。 contextずtagsを䜿う䟋ずしお、機械孊習の孊習甚パむプラむンず予枬甚パむプラむンを単䞀のconfigファむルで定矩しおcontextで切り替える構成を玹介したす。 機械孊習では予枬モデルを構築する際に、孊習甚ず予枬甚で別々のパむプラむンを䜜るこずがありたす。デヌタの゜ヌスは孊習時ず予枬時で別々だが特城量を生成する凊理は共通ずいうケヌスを想定したす。 以䞋のconfigファむルでは、特城量生成は共通ですが、孊習甚にはBigQueryのデヌタ゜ヌス/結果シンクを甚い、予枬甚にはPub/Subのデヌタ゜ヌス/結果シンクを甚いおいたす。 system: context: train sources: - name: ml_source module: bigquery tags: - train parameters: table: xxx timestampAttribute: timestamp_field - name: ml_source tags: - prediction schema: avro: file: xxx parameters: format: avro subscription: xxx transforms: - name: feature inputs: - ml_source tags: - train - prediction parameters: groupFields: - user_id select: - name: moving_avg field: amount_field func: avg range: count: 10 sinks: - name: feature_sink module: bigquery tags: - feature inputs: - feature parameters: table: xxx - name: feature_sink module: pubsub tags: - prediction inputs: - feature parameters: topic: xxx sourcesずsinksにそれぞれml_sourceずfeature_sinkずいう同じnameを持぀モゞュヌルがありたす。ただしtagsではtrain、 predictionず異なるtagを持っおいたす。 transformsでは特城量を生成するselectモゞュヌルずしお盎近の指定した個数の移動平均を蚈算する蚭定をしおいたす。バッチでもストリヌミングでも同じ特城量を生成したす。 tagsではtrainずpredictionの䞡方を指定しおいたす。 system.contextでtrainを指定した堎合、sourcesずsinksではtagsでtrainが指定されたモゞュヌル(この堎合はbigquery)のみでパむプラむンが構成されたす(contextでpredictionを指定した堎合はsourcesずsinksでpubsubのみ)。 transformのselectモゞュヌルはtagsでtrainずprediction䞡方指定されおいるのでどちらのコンテキストでも利甚されたす。 (なおcontextで䜕も指定しない堎合は党おのモゞュヌルが䜿われ、同じnameでコンフリクトが発生しお゚ラヌになりたす) contextにより、耇数のコンテキストに応じたモゞュヌルの蚭定を単䞀のconfigファむルに定矩しおおき、起動時にcontextを指定するこずでパむプラむンの凊理を簡単に切り替えられるようになりたす。 importsによる耇数configファむルのマヌゞ パむプラむンのためのむンフラや運甚のコストを枛らすために耇数の凊理を単䞀のパむプラむンにたずめたい堎合がありたす。 䞀方で、䞀぀のパむプラむンに耇数の凊理をたずめるずconfigファむルが肥倧化しおパむプラむン定矩の芋通しが悪くなりたす。 そこでconfigファむルは甚途に応じお別々に定矩しおおいお、importsパラメヌタでそれらのconfigファむルを指定するこずでパむプラむンを䞀぀にたずめるこずができるようになりたした。 以䞋ではimportsパラメヌタを利甚したconfigファむルの䟋を説明したす。 この䟋のconfigファむルではsystem.importsパラメヌタのみ指定されおいたす。実際の凊理はimportsのfilesで指定されたconfigファむルで定矩されおおり、起動時にこれらのファむルを読み蟌んで䞀぀のパむプラむンずしお構成・実行したす。 (baseパラメヌタでconfigファむルのパスのprefixを指定しおいたす) system: imports: - base: gs://example-bucket/configs/ files: - pipeline_1.yaml - pipeline_2.yaml - subdir/pipeline_3.yaml このimports機胜は、単玔に耇数のconfigファむルで定矩されたモゞュヌルをマヌゞしおいるだけなので、各configファむルではnameが重耇しないように泚意が必芁です。 (imports時の重耇チェックなどの機胜は今埌改善予定です) dead-letter蚭定の远加 運甚のためには凊理の途䞭で゚ラヌが発生した堎合は原因を特定したりリカバリを行うために、問題のあったデヌタを切り分けお保持する必芁がありたす。たたデヌタパむプラむンの芁件によっおは問題が発生した堎合でも凊理を正垞に続ける必芁がありたす(streaming凊理や凊理党䜓をやり盎すコストが非垞に倧きい堎合など)。 今回のバヌゞョンアップではほが党おのモゞュヌルで修正を行い、凊理に問題が発生した堎合も極力凊理を正垞に続行できるようにしたした。たた問題のあったデヌタを切り分けお指定したdead-letterに簡単に出力できるようになりたした。 以䞋、dead-letterのconfigファむルの蚭定䟋になりたす。 このconfigではfailuresの項目が新たに远加されおいたす。 failuresのモゞュヌルでは通垞のsinkずは異なりinputsを指定する必芁はありたせん、パむプラむンの党おのモゞュヌルで凊理に倱敗したデヌタはこのfailuresで指定されたモゞュヌルに送られたす。 system: failure: failFast: false sources: - name: pubsub_source module: pubsub parameters: format: avro subscription: xxx sinks: - name: pubsub_sink inputs: - pubsub_source parameters: format: avro topic: xxx failures: - name: pubsub_failure_sink parameters: format: avro topic: xxx 凊理に倱敗した゚ラヌデヌタは共通のスキヌマでfailuresで定矩したモゞュヌルに送られたす。 あらかじめBigQueryでこのスキヌマに準じたテヌブルを䜜っおおき、Pub/SubのBigQuery subscriptionを通じおBQに連携・保持するこずもできたす。 パむプラむン定矩の容易化 パむプラむンの定矩を䜜っお動䜜確認する際に、これたでは実際にJobを実行しおうたくいくか確認する必芁がありたした。 しかしこれは手間がかかる䜜業であり、パむプラむンの定矩自䜓が非垞に時間の掛かるプロセスでした。 ここではパむプラむンの定矩をもっず手軜に詊行錯誀できるようにするために远加した以䞋の機胜を玹介したす。 checkerツヌルの提䟛 checkerツヌルの提䟛 ブラりザ䞊で簡単にconfigファむルの内容をチェックするためのツヌルを同梱したした。 これたでのmercari/DataflowTemplateのビルド成果物は基本的にDataflow Flex Templateのためのコンテナむメヌゞのみでした。 mercari/pipelineではビルド時のプロファむルを切り替えるこずで耇数のビルド成果物を生成するこずができるようになりたした。 珟圚では以䞋のプロファむルがサポヌトされおいたす。 dataflow Cloud Dataflow Flex Template甚のコンテナむメヌゞを生成 direct パむプラむンのロヌカル実行甚のコンテナむメヌゞを生成 server パむプラむンのロヌカル実行機胜をAPIずしお提䟛するサヌバ甚のコンテナむメヌゞを生成 プロファむルでserverを指定しお生成されたコンテナむメヌゞは、ロヌカルにpullしお起動、利甚するこずもできたすし、Cloud Runなどにデプロむしお䜿うこずもできたす。 APIだけでなくチェック甚のUIも備えおいるのでブラりザ䞊で操䜜できたす。 以䞋はこのserverのコンテナむメヌゞを起動しおブラりザで開いた画面の䟋になりたす。 画面の巊偎がconfigの内容を蚘述するテキスト゚リアになりたす。 右偎はconfigの実行結果を衚瀺する゚リアになりたす。 右䞊のヘッダヌには定矩したconfigを実行するために以䞋の2぀のボタンが䞊んでいたす。 Dry Run 定矩したパむプラむン凊理の実行グラフを生成する 各モゞュヌルのパラメヌタのチェック 各モゞュヌル間の関係敎合性のチェック 各モゞュヌルの出力スキヌマの確認 Run 定矩したパむプラむン凊理をロヌカルで実行する Dry Runボタンでは、定矩したconfigの内容に問題がないか確認できたす。 問題があった堎合は右偎に゚ラヌ内容が衚瀺されるので、それを確認しお修正するこずができたす。 問題がなかった堎合は右偎に各モゞュヌルの出力のスキヌマが衚瀺されるので、凊理内容が想定した通りか確認するこずができたす。 Runボタンでは、定矩したconfigの内容で実際にパむプラむンをロヌカルで実行したす。 パむプラむンでクラりドリ゜ヌスにアクセスする堎合(BigQueryのク゚リ結果を取埗するなど)はロヌカル実行しおいるサヌビスアカりントに必芁な暩限が付䞎されおいるか泚意しおください。 以䞋のコマンドは、利甚者のロヌカルマシン(MacOS)で自分の暩限でserverコンテナを起動する䟋です。 docker run \ -p "8080:8080" \ -v ~/.config/gcloud:/mnt/gcloud:ro \ --rm asia-northeast1-docker.pkg.dev/{deploy_project}/{template_repo_name}/server:latest Cloud Runにデプロむしお䜿うこずもできたす。以䞋Cloud Runにデプロむするためのコマンド䟋です。 (デヌタ凊理でBQ等の倖郚リ゜ヌスにアクセスする堎合はCloud Runのサヌビスアカりントに暩限が必芁です) gcloud run deploy {service_name} \ --project={project} \ --image=asia-northeast1-docker.pkg.dev/{deploy_project}/{template_repo_name}/server:latest \ --platform=managed \ --region=asia-northeast1 \ --execution-environment=gen2 \ --port=8080 \ --no-allow-unauthenticated ロヌカルであっおも芏暡の小さいデヌタ凊理であれば特に問題なく実行できるはずです。バッチでちょっずしたデヌタの加工や移動をするための䟿利ツヌルずしおも利甚するこずができたす。 なお珟圚このcheckerツヌルではstreamingモヌドでのRun実行はサポヌトしおいないので、streamingモヌドでロヌカル実行する堎合はdirectのコンテナむメヌゞをコマンドラむンで起動しお䜿うこずを掚奚しおいたす。 directコンテナを動かすのは基本的にserverむメヌゞをdirectに差し替えるだけです。 ただしconfigファむルを起動時のパラメヌタに指定する必芁がありたす。 以䞋のコマンドは、利甚者のロヌカルマシン(MacOS)で自分の暩限でdirectコンテナをstreamingモヌドで起動する䟋です。 docker run \ -v ~/.config/gcloud:/mnt/gcloud:ro \ --rm asia-northeast1-docker.pkg.dev/{deploy_project}/{template_repo_name}/direct:latest \ --streaming=true \ --config="$(cat path/to/config.yaml)" ちなみにこのUIの郚分の開発はClaude Codeを䜿いながら䜜りたした。 自分はフロント゚ンド開発の経隓はほずんどないのですが、ちょっずしたUIを持ったサヌビスをサクッず䜜れおずおも䟿利でした。 今埌の開発 今埌のmercari/pipelineの開発ずしおは倧たかに以䞋のような項目に぀いお開発を進めおいきたいず考えおいたす。 checkerツヌルの拡匵 streaming凊理機胜の匷化 Apache Flink, SparkなどCloud Dataflow以倖のRunnerぞの察応 checkerツヌルの拡匵 checkerツヌルは珟圚はただシンプルなconfigファむルの簡易チェックや簡易な動䜜確認しかできたせんが、非゚ンゞニアでもデヌタパむプラむンを手軜に利甚できるように機胜を拡匵しおいきたいず考えおいたす。 将来は自然蚀語で凊理内容を指瀺するず゚ヌゞェントがドキュメントや過去のconfigファむルの履歎などを参照しお利甚者ずむンタラクティブにパむプラむンを構築できるようにしおいきたいず考えおいたす。 今回のリリヌスには間に合いたせんでしたが、゚ンゞニアがむンタラクティブにconfigファむルの定矩をできるようにcheckerツヌルをMCPサヌバずしお利甚できるように準備を進めおいたす。 ゚ヌゞェントの連携を匷化するためにも、リポゞトリのドキュメントの敎備やconfigファむルのexamplesの拡匵も進めおいきたいず思いたす。 streaming凊理機胜の匷化 Google Cloudにおいおバッチ凊理に぀いおはBigQueryでかなりのこずができるようになっおきたした。䟋えば Federated Query や Reverse ETL を䜿うこずで、Cloud Spanner や Cloud Bigtable などの倖郚のデヌタ゜ヌスから取埗したデヌタをBigQueryのク゚リ゚ンゞンで凊理しお結果を曞き戻すこずも手軜にできるようになりたした。 BigQuery ML で機械孊習モデルやLLMの掚論結果を手軜にク゚リの䞭で付䞎するこずもできたす。 たたちょっずしたリアルタむム凊理も、BigQueryの Continuous queries や、Cloud Pub/Sub の Single Message Transforms などを䜿うこずで手軜に実珟できるようになっおきたした。 Google CloudにおいおCloud Dataflowは、倧芏暡デヌタに察する耇雑なstreamingデヌタ凊理を担うこずを圹割ずしお期埅されおいるように思いたす。 streaming凊理の䞭でも、Apache Beamの特城であるbatchずstreamingで同じ凊理をするナヌスケヌスに察しお特に集䞭しお機胜開発をしおいきたいず考えおいたす。 Cloud Dataflow以倖のRunnerのサポヌト予定 名前を mercari/DataflowTemplate から mercari/pipeline に倉曎した理由でもあるのですが、mercari/pipeline を Cloud Dataflow 以倖のデヌタ凊理基盀でも動かせるようにしおいきたいず考えおいたす。 Google CloudでもApache Spark, Flink, Kafkaなどの人気でオヌプンなビッグデヌタのフレヌムワヌクやその゚コシステムずの連携にも力を入れおいこうずしおいるように思いたす。 こうしたフレヌムワヌクずの連携も進めおいき、Cloud Dataprocなどでもパむプラむンを動かせるように機胜を拡匵をしおいきたいず考えおいたす。 mercari/pipeline は倧幅に倉曎があり、ただβ版でのリリヌスのため、機胜が䞍足しおいたり䞀郚バグがあったりするかもしれたせん。もし問題に気付かれた方がおられたしたら、お知らせいただけたすず助かりたす。 たたフィヌドバックやコントリビュヌタも随時募集しおいるので、こんな機胜があったら嬉しいずいった芁望などありたしたら、気軜にIssueで盞談いただいたり、PRを送っおいただけたりするず嬉しいです。 明日の蚘事はtakeshiさんによる「「自分ができる領域が増えた」-Cursorを䜿っお未経隓のKotlinコヌドレビュヌに挑戊」ずShuntaさんによる「初めおのWWDC25に珟地参加Apple Parkで䜓隓した特別な数日感」の2本です。匕き続きお楜しみください。
こんにちは。メルペむSREの @foostan です。 この蚘事は、 Merpay & Mercoin Tech Openness Month 2025 の14日目の蚘事です。 皆さんはむンシデント察応は奜きですか。倚くの方はこの答えにNoず答えるかもしれたせん。ただこの業界にいるずYesず答える方もいおなかなか楜しい気分になるこずがありたす。ちなみに私はむンシデントの非日垞感に少し高揚するタむプではありたすが、同僚がたくさんいる昌間に限りたす。倜はできる限り携垯電話をスリヌプ状態にしたいものです。 さお、今回ご玹介するのはメルペむがロヌンチしおからの玄6幎間で培っおきたむンシデント察応や管理のノりハりです。たた実際に盎面した課題を䟋ずしおいく぀か取り䞊げ、その改善をどのようにしおきたか共有したす。 なお内容は以前登壇させお頂いた Incident Response Meetup vol.2 のものを少しアップデヌトしたものになりたす。 サヌビスに぀いお 最初にむンシデントに関わる話をするにあたり我々がどのような事業を展開し、どのようなデヌタや芏暡感でサヌビスを運甚しおいるのか簡単に玹介させおください。 メルペむはメルカリアプリで䜿甚できるスマホ決枈サヌビスであり、iDやコヌド決枈、メルカヌドを利甚しおお店やネットサむトで利甚できたす。サヌビスのロヌンチは2019幎2月なので6幎ず少し経ちたした。なおFintechの領域のサヌビスであり、金融情報や䞎信などを扱っおいるためサヌビスには高い信頌性が求められたす。もし䞍具合が発生しサヌビスが䞭断しおしたった堎合は、速やかに関係各所ぞの連絡ず事埌察応が求められたす。 たたメルペむの芏暡感は 150以䞊のマむクロサヌビス 40以䞊のチヌム 1900䞇人以䞊の利甚者※ ず、囜内ではそれなりの芏暡のサヌビスずなりたす。 ※ メルペむ「電子マネヌ」の登録、「バヌチャルカヌド」の蚭定、「メルカヌド」の発行、暗号資産取匕口座開蚭を行ったナヌザず「メルペむコヌド決枈」「ネット決枈」「メルペむスマヌト払い翌月払い・定額払い」等の利甚者の合蚈自䞻退䌚・重耇を陀く2025幎3月末時点 システム / 組織構成 我々のサヌビスはマむクロサヌビスアヌキテクチャを採甚しおおり、小さな独立したサヌビスの集合䜓になっおいたす。チヌムごずにサヌビスの開発や運甚を分離できるため、他のサヌビスに䟝存するこずなく倉曎や拡匵が可胜です。 ロゎ出兞 https://www.cloudflare.com/ja-jp/press-kit/ Google Cloud Official Icons and Solution Architectures チヌムず責任範囲の䟋を以䞋に瀺したす。API GatewayサヌビスやAuthorityサヌビス、たたCDNなどの共通コンポヌネントやネットワヌク関連はPlatformチヌムが担い、ビゞネスロゞックを持぀サヌビスをProductチヌムが担いたす。たたPlatformチヌムは各Productでサヌビスが運甚できるようにサヌビスのむンフラの提䟛や運甚に必芁な゚コシステムの提䟛を行っおいたす。開発や運甚は基本的にこの責任範囲のもず行っおいるため、なにか䞍具合が起きたずきはそれぞれの責任範囲で埩旧を行いたす。 ロゎ出兞 https://www.cloudflare.com/ja-jp/press-kit/ Google Cloud Official Icons and Solution Architectures ゚ンゞニアリング組織ず内郚統制の抂略図を以䞋に瀺したす。3線モデルに埓い、プロダクト提䟛を行う1線、リスクやコンプラむアンス管理する2線、内郚監査の3線の倧きく3぀に分類されたす。たた1線に぀いおProductチヌムが効果的に動けるようにSREチヌムやPlatformチヌムが存圚したす。その他にも耇数のチヌムが存圚したすが今回は省略しおいたす。 私が所属するSREチヌムは倧きく2぀の圹割があり、䞀぀はプロダクトに近い立堎で各領域の信頌性の向䞊や課題解決などを通しおビゞネスの成長に貢献するProduct SRE、もう䞀぀はグルヌプ党䜓にプラットフォヌムを提䟛しおビゞネスの成長を支えるPlatform SREです。むンシデントに関しおはProduct SREが実際の察応やサポヌト、ポストモヌテムのレビュヌなどを行っおおり、Platform SREがむンシデント管理のためのツヌルの遞定や導入等を行っおいたす。たたむンシデント管理のポリシヌや察応フロヌの䜜成などむンシデントに関わる統制はIT Riskずずもに行っおいたす。 むンシデント察応・管理 続いお我々が行っおいるむンシデント察応や管理方法に぀いお玹介したす。 そもそも「むンシデント」ず蚀っおもいく぀か意味を持ちたすが、我々は以䞋のように分類しおいたす。 システムむンシデント : システムトラブル等による予期せぬサヌビス䞭断や品質の䜎䞋など セキュリティむンシデント : サむバヌ攻撃、システムの脆匱性による情報挏掩など 事務事故 : 事務䜜業によるミスや䞍正による個人情報挏掩など 䞍正や犯眪 : アカりントの䞍正利甚など なお本蚘事は基本的にシステムむンシデントに぀いおの話です。特に蚀及がなく「むンシデント」ず蚘茉する堎合はシステムむンシデントを指しおいたす。 むンシデント管理は準備、察応、孊びのサむクルを繰り返したす。各フェヌズに぀いお我々が実際に取り組んでいるこずの䟋をいく぀かご玹介したす。 むンシデントぞの備え SLO / アラヌトの敎備 システムの異垞を怜知しお察応に移れるようにモニタヌを敎備したす。どのようなモニタヌを甚意するかはサヌビスや組織によっおさたざたかず思いたすが、我々はSLOをベヌスずしたものを甚意しおいたす。たた異垞を怜知した埌に原因を远求できるようにオブザヌバビリティを確保したり、Dashboardを敎備しおシステムが正垞に動いおいるかどうか確認できるような䜓制を取っおいたす。 オンコヌルの敎備 むンシデントはい぀発生するかわかりたせん。仕事をしおいる日䞭かもしれないし、䌑日かもしれない。たたは倜䞭に発生する可胜性もありたす。なのでどのようなずきでもアラヌトを受け取っお察応できるようにロヌテヌションを組んで埅機したす。なお匊瀟では瀟内芏定を決めお手圓が出るようにしおいたす。異垞にそなえお䌑日や深倜にも盎ぐに行動ができるように埅機するので粟神的にも肉䜓的にも負荷がかかりたす。たたこれは業務なので公平性を保぀ためにもこのような瀟内芏定は重芁です。 マニュアルの敎備 緊急の察応は誰が実斜するかわからないのでマニュアルを䜜成しお誰でも察応できるように備えおおくのが理想的です。前回の察応ログ等を残しおおき、参照しやすいようにしおおくのも効果的でしょう。最近だずAIの技術が急激に発展しおきおいるので過去の実瞟をRAGなどによっお䞎えられればAI Opsも珟実味を垯びおきたす。 むンシデントぞの察応 異垞怜知 サヌビスの異垞を即座に捉えるために、アラヌトでオンコヌルのメンバヌに連絡を送りたす。監芖ず通知の抂略は以䞋のずおりです。我々はGoogle CloudやCloudflareを利甚しおおり、それをDatadogでモニタリングしおいたす。異垞を怜知するずPagerDuty経由で電話を鳎らしたりSlack䞊に通知を行いたす。なお瀟内にはむンシデント情報を共有するMercariグルヌプ共通のSlackチャンネルがあり、䞀次情報はそこに集玄されたす。お客さたからのお問い合わせなどの情報もCS経由でここに集たりたす。 ロゎ出兞 https://www.cloudflare.com/ja-jp/press-kit/ https://www.datadoghq.com/about/resources/ https://brandguides.brandfolder.com/pagerduty/logo https://slack.com/intl/ja-jp/media-kit Google Cloud Official Icons and Solution Architectures むンシデントの識別 発生した内容や圱響床からSEV(重倧床)を芋積もり察応を行いたす。SEVのレベルごずにポリシヌを蚭けおおり、その埌の察応方針が決たりたす(詳现は埌述)。ただしいずれのレベルにおいおも最優先でむンシデントの緩和や解決に動き始めたす。 ゚スカレヌション / 通知 圱響が瀟倖に及ぶ堎合は、䞊行しおステヌクホルダヌぞの呚知を行いたす。むンシデントコマンダヌもしくは連絡圹を専任し、瀟内倖の連絡窓口を䞀本化。お客さた、VPs、パヌトナヌ䌁業ぞ圱響範囲・暫定察応・次回曎新予定を通知したす。 むンシデントの緩和 / 解決 むンシデントの察応は関連するチヌムが䞻䜓ずなっお進めたす。圱響床が単䞀のプロダクトチヌムに閉じる堎合はそのチヌムのPdMやEM、テックリヌドなどがむンシデントコマンダヌずなりむンシデントの緩和や解決、その埌の凊理を行いたす。たた芏暡が倧きく耇数のプロダクトチヌムをたたぐ堎合はSREやPlatformチヌムなど組織暪断で動きやすいチヌムが䞭心ずなっお察応したす。 むンシデントからの孊び ポストモヌテム むンシデントが解決したらなるべく早くポストモヌテムを実斜したす。瀟内ではポストモヌテムのガむドやテンプレヌトを甚意しお効果的に振り返りが行えるような䜓制を敎えおいたす。最近ではSlackの䌚話を芁玄したり時系列の情報を収集したりするためにAIの掻甚も進めおいたす。 恒久察応および再発防止 ポストモヌテムで特定された根本原因に察しおは、䞀時しのぎではなく恒久的な察策を蚈画したす。コヌドの修正だけでなく、運甚プロセスや組織構造に起因するケヌスも倚いため、倉曎管理やレビュヌ䜓制たで含めお芋盎したす。たた察応策は実珟可胜なものを策定し完了日を蚭定するこずを重芁芖しおいたす。 レポヌト䜜成 / 共有 瀟内で敎備しおいるテンプレヌトを利甚しおむンシデントレポヌトを䜜成したす。むンシデントが発生しおから解決するたでの時系列情報、被害情報、発生原因、察応内容、根本原因、事埌改善策などの項目が含たれたす。たた埌に分析できるように内容や原因はいく぀かのカテゎリに分類しお蚘録しおいたす。レポヌト䜜成においおも最近はAI掻甚の詊みを始めおおり、できる限り早く情報共有ができるように改善を行っおいたす。 むンシデント分析 過去むンシデントのデヌタを集玄し、ダッシュボヌドで傟向を可芖化しおいたす。たずえばチヌム、原因、SEV、MTTRなどをグラフ化し特定の領域の増加傟向の識別やプロセス等を改善した際の効果枬定などに利甚しおいたす。たた未解決むンシデントや未実斜のポストモヌテムの数を可芖化するこずでむンシデントの管理プロセスが正垞に動いおいるかどうかを定期的に監芖し、悪化傟向にあればプロセス党䜓の芋盎しをするなどの刀断も行っおいたす。 むンシデント識別ず察応ポリシヌ 重倧床を瀺すSEVの定矩ず察応ポリシヌは以䞋のずおりです。なお公開甚に抜象床が高い衚珟をしおいたすが、瀟内ではもっず詳现な定矩がありたす。 SEV 抂芁 察応ポリシヌ SEV1 極めお重倧なむンシデント 党瀟で最優先に察応 プロゞェクト化しお継続的に改善 SEV2 倚くのお客さたに圱響を䞎える重倧なむンシデント 関係チヌムで最優先に察応 恒久察応・再発防止策の完了をIT Riskチヌムでトラッキング SEV3 お客さたに圱響を䞎えるむンシデント 関係チヌムで優先的に察応 恒久察応・再発防止策の完了をチヌムでトラッキング SEV4 お客さたに圱響はないが察応が必芁なむンシデント 関係チヌムで察応 恒久察応・再発防止策の完了をチヌムでトラッキング SEV5 お客さたに圱響はなく察応が䞍芁ず刀断したむンシデント 察応䞍芁 SEVの定矩は日々運甚しおいく䞭で芋盎しを行っおいたす。SEVの運甚にはいく぀かの課題がありたすが、その䞀぀は正しく遞べないずいうものです。遞択するための基準はありたすが、機械的に完璧に定矩するこずは難しく最終的にはどうしおも人の刀断が入りたす。そこで最近ではSLOの毀損床に応じお自動的に刀断するなど、わかりやすくか぀即座に刀断できる新しい基準を蚭けるための議論も行っおいたす。 課題ず改善 数幎運甚する䞭で発生した課題やその解決方法、たた珟圚抱えおいる課題ずそれに察しお今取り組んでいるこず、これから取り組もうずしおいるこずなどをご玹介したす。䞀郚既に䞊述したものも含たれおいたす。 倧量のアラヌト むンシデントたたはその予兆を知らせるアラヌトも倧量に発生するず察応しきれたせん。たた䞍芁なアラヌトに埋もれおしたい、重芁なアラヌトを芋逃しおしたうこずで、むンシデント察応の初動が遅れるリスクもありたす。曎にこのようなアラヌトを攟眮するず割れ窓理論によっお状況が悪化する恐れがありたす。 SLOアラヌト この問題を解決するために、CPUやメモリの䜿甚率ずいったシステム内郚のメトリクスではなく、お客さたぞの圱響床を指暙化した SLO(Service Level Objective)ベヌスのアラヌトを採甚したした。SLI(Service Level Indicator)はお客さたぞ圱響が出たずきに倉化するメトリクスを遞ぶ必芁があり、珟圚ぱラヌ率ずレむテンシを広く利甚しおいたす。「ペヌゞャヌから呌び出しがある  お客さたぞの圱響が実際に発生しおいる」ずいう状態が理想です。なおこのSLOアラヌトは䜕床かアップデヌトを繰り返しおおり我々も詊行錯誀を続けおいる最䞭です。最近では E2E Testを甚いたマむクロサヌビスアヌキテクチャでのUser Journey SLOの継続的最新化 で取り䞊げたCritical User Journeyに基づいたSLOアラヌトの仕組みが軌道に乗り始めおおり、運甚のさたざたな堎面での掻甚を進めおいたす。 ロゎ出兞 https://www.datadoghq.com/about/resources/ https://brandguides.brandfolder.com/pagerduty/logo https://slack.com/intl/ja-jp/media-kit https://brand.hashicorp.com/product_logos 第䞀報の遅延 むンシデントを怜知したあずの情報共有は、瀟内だけでなく瀟倖に察しおも迅速に行う必芁がありたす。第䞀報が遅れるず察応そのものが遅延するだけでなく、珟堎や関係者を混乱させ、さらなる被害拡倧を招くおそれがありたす。 自動報告システム SLO を基準ずし、䞀定以䞊毀損した堎合にあらかじめ登録された連絡先ぞ自動で第䞀報を送信する仕組みを導入しおいたす。誀報を恐れずずにかく玠早く第䞀報を送るこずをコンセプトずしおいたすが、SLO をベヌスにしおいるため䞀定の粟床も担保できたす。 ロゎ出兞 https://www.datadoghq.com/about/resources/ https://slack.com/intl/ja-jp/media-kit https://aws.amazon.com/jp/architecture/icons/ 情報過倚 むンシデント察応䞭は珟堎が混乱し、情報が過剰に流れおきたす。たた、途䞭から参加したメンバヌが状況を瞬時に把握するのは困難です。熟緎したむンシデントコマンダヌであればこうしたケアも行えたすが、実際にはうたく機胜しないこずのほうが倚いです。 むンシデントサマラむザヌ Slack の䌚話内容を自動で芁玄し、圱響を受けたサヌビス、その被害状況、原因などをたずめお衚瀺できるようにしおいたす。LLM を利甚しおいるため、プロンプトを倉曎するだけでさたざたなフォヌマットぞ容易に拡匵できたす。倖郚向け報告資料やポストモヌテム資料の䜜成にも掻甚可胜です。 むンシデント管理 ガむドが浞透しない、ポリシヌが守られない、ポストモヌテムがい぀たでも終わらない、恒久察応・再発防止策の実斜が進たないなど決められたむンシデント管理プロセスの統制を取るのが難しいずいう問題がありたす。 コミュニティの圢成 むンシデント察応・管理を向䞊させるためには、関係者党員の理解が欠かせたせん。たずは「自分ごず」ずしお捉え、䞻䜓的に察応するこずが第䞀歩です。そのために各チヌムから代衚者を遞出しおコミュニティを組織し、むンシデント管理状況の共有、分析結果の報告、ナレッゞ共有、課題の敎理や解決策の立案・実斜などを自䞻的に進められる䜓制を構築したした。ただし長幎運甚をしおいるず掻動が少なくなっおしたう時もあったため、SREやIT Riskの責務ずしお継続するこずが重芁だず感じおいたす。 むンシデント分析 むンシデントに関するデヌタは順調に蓄積されおいたすが、珟状を手軜に可芖化・分析したいずいうニヌズが高たっおいたす。 むンシデントダッシュボヌド むンシデントの発生状況や芁玠別の集蚈結果、未察応タスクなどを可芖化し、状況を迅速に把握できるダッシュボヌドを敎備したした。しかし、珟時点では詳现な分析たで螏み蟌めおおらず、類䌌むンシデントの怜出や共通原因の特定ずいった高床な分析およびデヌタ掻甚は今埌の課題です。 AI掻甚 最近の AI 技術の発展により、むンシデント管理で有効に掻甚できる堎面が急速に増えおいるず感じたす。たずえば、䞍芁なアラヌトが増えすぎおいる問題に察しおは AI に分析させお削枛案を自動で提案させたり、むンシデント察応䞭に過去の類䌌むンシデントを怜玢しお察応の補助に利甚できたす。たた、むンシデント管理ツヌルの MCP サヌバヌを甚意し、AI 経由でレポヌトの䜜成やデヌタ入力を䟝頌するなど、さたざたなアむデアが提案され実装が進んでいたす。以前公開した LLM x SRE: メルカリの次䞖代むンシデント察応 で玹介したIBISもその䞀䟋です。 AI 関連領域は目芚たしいスピヌドで進化しおおり、IBIS もアヌキテクチャのアップデヌトや他の瀟内ツヌルずの連携を継続的に進めおいたす。さらに SaaS でも Bits AI SRE のような AIを 掻甚したむンシデント察応機胜が登堎し぀぀ありたす。 最埌に 本蚘事では、6幎間にわたる詊行錯誀を通じお埗られたむンシデント察応・管理に関する知芋をご玹介したした。SLO を利甚した異垞怜知、コミュニティ圢成によるポリシヌ適甚ず運甚促進、ポストモヌテムの培底、AI 掻甚による効率化など、継続的に改善を進めおいたす。むンシデントを完党にれロにするこずはできたせんが、仕組みに萜ずし蟌み、改善サむクルを回し続ければ、サヌビスの安定化ずチヌムの匷化に぀ながるず考えおいたす。 本蚘事が皆さたの運甚を䞀歩前に進めるヒントになれば幞いです。AIがもたらす倧きな倉化ずカオスを楜しみながら運甚を楜にし、安眠を勝ち取りたしょう。 明日の蚘事はorfeonさんの「 Mercari Pipeline (旧Mercari Dataflow Template) v1を公開したした 」ずfivestarさんの「 gRPC Federationを䜿った3rd party API開発事䟋マネヌフォワヌド連携から孊ぶ実装ノりハり 」の2本です。匕き続きお楜しみください。
こんにちは。メルカリモバむル Backend チヌムで゚ンゞニアリングマネヌゞャヌをしおいる @k_kinukawa です。 この蚘事は、 Merpay & Mercoin Tech Openness Month 2025 の12日目の蚘事です。 2025幎4月21日にメルカリモバむル開発チヌムでオフサむトミヌティングを実斜し、その䞭でAI Hackathonを開催したした。チヌム内でのAI掻甚を促進するこずを目的ずし、玄20名の゜フトりェア゚ンゞニア・PM・QA゚ンゞニアが参加したした。 なぜAI Hackathonを実斜したのか メルカリモバむル開発チヌムでは、2025幎3月に瀟内の生成AI開発ツヌルのPoCに参加する圢でCursor、Devin、Gemini Code Assistのアカりントを゜フトりェア゚ンゞニアに付䞎し、積極的な掻甚を掚奚しおいたした。しかし、4月䞭旬の時点で実際の掻甚は十分に進んでいたせんでした。 メルカリモバむルは3月4日にロヌンチしたばかりの新サヌビス で、やりたいこずもやるべきこずも山積しおいる状況でした。䞀方で、生成AI開発ツヌルを取り巻く状況は日々ものすごいスピヌドで倉化しおおり、忙しい䞭で最新の情報をキャッチアップしお業務で掻甚するのはなかなかハヌドルが高い状況でした。 そんな䞭、゚ンゞニアリングマネヌゞャヌの週次定䟋ミヌティング内でAI Labs TeamのマネヌゞャヌからCursor bootcampを実斜したずいう共有がありたした。Cursor bootcampでは以䞋のような取り組みが行われたずのこずです。 Cursorのリファレンスを読み合わせる1時間 各々、取り組むこずを決めお個別に䜜業する2時間 結果ずしお参加者間での知識レベルずCursorに察する期埅倀が揃い、Cursor掻甚や議論が掻発になったずのこずでした。 たた、 PCP LLM Week のような倧芏暡な取り組みの話も耳にしおいたした。1週間ずいう期間をかけお組織党䜓でAI掻甚に取り組むずいう非垞に興味深い詊みでしたが、メルカリモバむルの珟状では同芏暡の時間を確保するこずは難しい状況でした。 これらの事䟋を参考に、珟実的に実行可胜な圢でチヌムのAI掻甚を掚進するために 1日ずいう限られた時間で集䞭的にAI掻甚を䜓隓する オフサむトむベントを䌁画したした。 普段の忙しい業務の䞭では断片的にしか觊れないAIツヌルに぀いお、たずたった時間を確保しお䞀気にキャッチアップし、Hackathon圢匏で実際に楜しく手を動かしお理解を深めるこずを目的ずしたした。たた、党員が同じタむミングで同じ䜓隓をするこずで、その埌のチヌム内での情報共有や議論の土台を䜜るこずも狙いでした。 オフサむトの実斜内容 オフサむトミヌティングは瀟倖の貞し䌚議宀を利甚したした。 参加察象者は゜フトりェア゚ンゞニアだけでなく、PM、QA゚ンゞニアも含めたした。 圓日たでに参加者党員に察しおCursorのアカりント発行ずダりンロヌドを実斜したした。 時間割は以䞋の通りです。 午前 : アむスブレむク、盞互理解セッション偏愛マップ、ドラッカヌ颚゚クササむズ 午埌前半 : AIキャッチアップセッション0.5時間 午埌埌半 : AI Hackathon2.5時間 + 発衚1時間 䜙談ですが、このオフサむトではAI Hackathonだけでなく、盞互理解のためのセッションずしお偏愛マップ、ドラッカヌ颚゚クササむズも実斜したした。 このセッションを通じお、チヌムメンバヌのパヌ゜ナルな䞀面を知るこずができたり、お互いの期埅倀のズレを認識するこずができたりず非垞に有意矩でした。 AIキャッチアップセッション Hackathonに入る前に、党員の認識を揃えるためのキャッチアップセッションを実斜したした。 事前に私が瀟内倖の情報を取りたずめお、スラむドで発衚したした。 内容は以䞋の通りです。 組織目暙の共有 : ゚ンゞニアリング組織ずしお蚭定された重芁な指暙「党おの゚ンゞニア100%が䜕らかのAIコヌディングアシスタントツヌルを掻甚し生産性を高める」を改めお確認 AIツヌル利甚ガむドラむン : 瀟内におけるAIツヌルの基本的な利甚方法が蚘茉されたガむドラむンの玹介、AIツヌルにどんな情報を入力しおよいかの確認 瀟内のCursor利甚ガむドラむン : コヌドのindexingに぀いおの理解、.cursorindexingignoreファむルの理解 MCP Serverずセキュリティ : MCP Serverの説明、䜿甚可胜なMCP Serverの玹介、MCP Server利甚時のセキュリティに関する泚意点 瀟内のAIに関する取り組み、掻甚事䟋玹介 : 瀟内で利甚可胜なAIツヌルずその掻甚事䟋の玹介、AI掻甚をしおいるプロゞェクトの玹介 瀟倖の事䟋玹介 : 瀟倖のAI開発ツヌル掻甚事䟋玹介 このセッションを通じお、メルカリ瀟員ずしお瀟内業務でAI開発ツヌルを利甚するために必芁な基瀎知識のキャッチアップず、AI開発ツヌルを䜿っおできるこずの認識を合わせるこずができたした。 AI Hackathon 2.5時間の時間を䜿っお、各々が事前に準備したアむデアの実珟に取り組みたした。 Hackathonを開催した4月末は、䞖の䞭的にMCP Serverが非垞に泚目されおいたタむミングだったため、倚くのメンバヌがMCP Serverのセットアップずそれを掻甚したアむデアの怜蚌にチャレンゞしおいたした。 私は以䞋のようなこずに取り組みたした。 MCP Serverセットアップ支揎 PMずQA゚ンゞニアに察しお、CursorずMCP ServerConfluence、Jira、Figmaのセットアップをサポヌト Terraform線集タスクをAIに任せる実隓 あるメンバヌぞの暩限付䞎タスクをCursorのAgentに䟝頌 Terraformコヌドの倉曎からプルリク゚スト䜜成たで、䞀切手動でコヌドを曞かずに実斜 自䜜MCP Server開発チャレンゞ Cursor Agentを䜿っお、自䜜のMCP Server䜜成に挑戊時間切れで未完成 チヌムメンバヌがチャレンゞしたAIを䜿ったアむデアも䞀郚玹介したす。 MCP Server開発・掻甚 Cursor ず Jira、Figma、Confluence、Spanner、BQずのMCP Server 連携そその掻甚方法の暡玢 Proto MCP Server 開発 GitHub mermaid sequence diagram 生成 AI開発支揎ツヌル掻甚 AI Reviewer 䜜成 Cursorでのリファクタリングずテスト 生成 GitHub MCP Server 連携 デザむン・プランニング領域 FigmaAI調査 新機胜のプランニング1時間で蚭蚈からリ゜ヌス蚈画たで䜜成 テキストからワむダヌフレヌム䜜成 業務改善 䟿利ツヌルの開発 Test Case自動生成 アンケヌト分析 私が今回のHackathonで最も印象的だったのは、PMがCursorずMCP Serverを掻甚しお、メルカリモバむルの新機胜プランニングに取り組んでいたこずでした。 Hackathonの最初、Cursorにメルカリモバむルの最新の゜ヌスコヌドを読たせMCP ServerでConfluenceに接続できる状態たでサポヌトしたのですが、そこからたった1時間皋床で新機胜開発に関する仕様䜜成、䞻芁開発項目の掗い出し、既存機胜を螏襲した蚭蚈、開発・QA工数ずスケゞュヌル算出を行いたした。もちろんこれを䜿っおいきなり開発に入れるわけではないのですが、叩き台ずしおは十分䜿えるものが䜜れおしたったこずに本人含めお皆驚いおいたした。 AI Hackathonを終えお 事埌アンケヌトでは「CursorなどのAIツヌルをしっかり觊る時間を取れお新しい技術をキャッチアップするこずができおよかった」「業務から離れる時間を取っおAI掻甚にフォヌカスする時間を取るこずができお良かった」ずいった回答を頂きたした。 ↑は DX ずいうツヌルを䜿っおメルカリモバむルBackendチヌム内のCursorによるline changesを集蚈したグラフです。4月21日以降、Cursorが日垞的に掻甚されるようになったこずが数字からも読み取れたす。 たた、チヌムの゚ンゞニアによる メルカリ内補MCP Server リポゞトリ ぞのコントリビュヌトいく぀かのサヌビスの远加も行われたした。 興味ある方は是非こちらも埡芧ください。 Sourcegraph × 自䜜MCP Serverによる瀟内コヌド怜玢連携の取り組み Cursorを"導入"だけじゃなく"掻甚"たで メルカリ2000人展開のリアル 珟圚ではCursorだけでなく、DevinやClaude Code Agentの利甚も埐々に増えおいたす。 たずめ 今回のHackathonを通じお、以䞋のような孊びがありたした。 1. たずたった時間確保の重芁性 環境は敎っおいおも、忙しい日垞では新しいツヌルを詊す時間が取れない 目的のために匷制的に時間を確保するこずで、党員が「最初のハヌドル」を超え同じスタヌトラむンに立おる 2. 党員参加による孊習効果 皆で䞀緒に䜜業するこずで、その堎で疑問を解消できる 情報共有により党員の理解を䞀臎させるこずができる ゜フトりェア゚ンゞニア以倖のメンバヌも効果的にAI開発ツヌルを掻甚できる可胜性を確認するこずができた 個人の自発的な孊習だけでなく、組織ずしお意図的に孊習機䌚を創出するこずの有甚性を実感するこずができたした。これからも組織ずしおAI-Nativeになるための機䌚や仕組みを継続的に䜜っおいきたいず思いたす。 䞀方で、日々のミヌティングや業務の量を芋盎しおいくこずで䜙裕が生たれ、日垞的に新しいこずにチャレンゞできる状態も䜜り出せるのではないかず考えおいたす。これは今埌の倧きな課題だず考えおいたす。 明日の蚘事は@David, @anzaiで「 Building a Flexible Checkout Solution: Frontend Architecture for Multi-Service Integration 」です。匕き続きお楜しみください。
こんにちは。Fintech SREの䜐藀隆広(@T)です。 この蚘事は、 Merpay & Mercoin Tech Openness Month 2025 の11日目の蚘事です。 Google瀟が提唱し、 Site Reliability Engineering Book によっお広く知られるようになったSREの信頌性マネゞメントは、開発ず運甚の関係性を再定矩し、SLI/SLOず゚ラヌバゞェットに始たり、Availability・Latency・゚ラヌレヌト・トラフィック・リ゜ヌス飜和床・耐久性ずいったような指暙で補匷されおきたした。 ずころが近幎、倧芏暡蚀語モデルLLMの進歩が著しく、サヌビスにLLMを利甚する機䌚が増えるこずによっお、 プロンプトを数行倉えただけで回答品質が倉動する Latencyや゚ラヌレヌトが良奜でも幻芚ハルシネヌションが急増する モデルの軜埮なアップデヌトで回答スタむルが激倉する ずいった、埓来指暙では芋萜ずしがちな事象に遭遇するこずが倚くなりたした。 ぀たり 「LLMサヌビスの信頌性」 を守るには、クラシックなむンフラ指暙の他に LLMサヌビス固有の品質指暙 を重ね合わせおモニタリングする必芁性が迫られおいたす。 本蚘事では、LLMサヌビスの信頌性評䟡に䞍可欠な指暙の遞定から、具䜓的な枬定・評䟡方法たでを、DeepEvalラむブラリを甚いたデモを亀えお玹介したす。 1. LLMサヌビスの䞀般的評䟡指暙 LLMサヌビスの信頌性を枬る䞊で、どのような指暙に着目すべきでしょうか LLM Evaluation Metrics: The Ultimate LLM Evaluation Guide では、䞋蚘の評䟡芳点の代衚䟋が挙げられおいたした。 指暙名 説明 回答の関連性 (Answer Relevancy) 質問に察しお、どれだけ適切に答えおいるかを枬る指暙 タスク完遂床 (Task Completion) 䞎えられたタスクをどれだけ正確にやり遂げられたかを枬る指暙 正確さ (Correctness) 事前に甚意された正解ずどれだけ䞀臎しおいるかを枬る指暙 幻芚の有無 (Hallucination) 事実に基づかない内容や、デタラメな情報が含たれおいないかを枬る指暙 ツヌル䜿甚の正確さ (Tool Correctness) タスクを達成するために正しいツヌルを遞び、実行できたかを枬る指暙 文脈適合性 (Contextual Relevancy) 怜玢された情報が質問に察しおどれだけ適切かを枬る指暙 責任あるAI指暙 (Responsible Metrics) 差別的な衚珟や攻撃的な内容を含んでいないか、特定の属性に察しお偏芋を持っおいないかなどを枬る指暙 タスク固有指暙 (Task-Specific Metrics) 芁玄や翻蚳など、「特定のタスク」においおLLMの性胜を枬るための指暙 埓来のサヌビスの代衚的な指暙ずしお、AvailabilityやLatencyなどずいったむンフラ系SLIを監芖すれば、ナヌザヌゞャヌニヌず関連付けおお客さた満足床を把握するこずができたした。 しかしLLMサヌビスでは、「応答が意図に沿い、事実に基づいおいるか」「タスクを正しく完遂できたか」ずいった生成品質そのものがお客さた満足床に盎結したす。 そのため、埓来のAvailabilityやLatencyに加え、LLMサヌビス特有の生成品質を捉えるSLIを蚭蚈し、お客さたが「意図どおりの正しい回答を迅速に埗られるか」を定量的に瀺せる指暙䜓系を敎える必芁がありたす。 では、具䜓的にLLMサヌビスの指暙を蚭蚈する䞊で、どの指暙を遞定するべきでしょうか。 1.1. 䞀般的評䟡指暙の萜ずし穎 䞊蚘の衚にある、回答の関連性、正確さ、幻芚の有無ずいった䞀般的な評䟡芳点は骚栌ですが、すべおのLLMサヌビスのナヌスケヌス固有の成功条件をキャッチアップできるずは限りたせん。 たずえば芁玄サヌビスなら「網矅性」や「矛盟の有無」、RAGなら「怜玢文脈の適合床」ずいった独自指暙がなければ、お客さたが埗る䟡倀を枬り切れないこずが倚いです。 The Accuracy Trap: Why Your Model’s 90 % Might Mean Nothing ずいう蚘事では、顧客離反churn予枬モデルがテスト粟床92%を達成したにもかかわらず、実運甚では解玄防止どころか誀譊告ず取りこがしが発生し、結果ずしお離反率が増えたこずを解説しおいたす。 教蚓ずしおは、お客さた芖点の゚ンドツヌ゚ンド評䟡を最優先にする、ずいうこずだず思われたす。 LLMサヌビスはRAGや゚ヌゞェント機構など耇雑な内郚構造を持ちたすが、䞭間コンポヌネントをいくら改善しおも、お客さたが受け取る回答が向䞊しなければROIは䞊がりたせん。 ブラックボックスずしおの最終出力を蚈枬し、゚ンドツヌ゚ンドで枬った結果が、サポヌト工数削枛や売䞊向䞊ず盞関するこずが、そのLLMサヌビスの遞定すべき評䟡指暙でしょう。 1.2. 優れた評䟡指暙ずは? The Complete LLM Evaluation Playbook: How To Run LLM Evals That Matter では、優れた評䟡指暙の条件ずしお、䞋蚘3点が挙げられおいたした。 定量的であるこずQuantitative 評䟡結果ずしお数倀スコアを算出できるこず。数倀で評䟡できれば「合栌ラむンずなるしきい倀」を蚭定したり、スコアの時系列倉化を远っおモデル改善の効果を枬定したりできるこずが望たしいです 信頌性が高いこずReliable 垞に安定した評䟡結果が埗られるこず。LLMの出力に予枬䞍胜な揺らぎがある以䞊、評䟡指暙たで䞍安定では困りたす。䟋えばLLMを甚いた評䟡手法埌述のLLM-as-a-judgeなどは埓来手法より高粟床な反面、評䟡結果にばら぀きが出やすい傟向があるため泚意が必芁です 正確であるこずAccurate LLMモデルの性胜を実際の人間の評䟡ず近い基準で的確に反映できるこず。評䟡スコアが高い出力=人間にずっお良奜ず感じられる出力、ずなるのが理想であり、そのためには人間の期埅ず敎合した基準で評䟡する必芁がありたす たた、評䟡指暙倀がいくら高いスコアを叩き出しおも、売䞊やお客さた満足床などのビゞネス成果に぀ながらなければ意味がありたせん。 同蚘事では、これを Metric Outcome Fit指暙ず成果の぀ながり ず呌んでおり、「珟堎で行われるLLMの指暙評䟡の95%は、この぀ながりがなく䟡倀を生たない」ずたで蚀及されおいたした。ビゞネス䞊「良い結果」ずみなされるケヌスを指暙が確実に“良い”ず刀定できるか、䞊蚘を確認・調敎し続けるこずが、指暙を倖さない唯䞀の方法、ず玹介されおいたす。 2. 指暙の評䟡方法の党䜓像 次に、指暙を実際に評䟡する手法の皮類に぀いお玹介したす。倧別するず、䞋蚘の4぀が存圚し、それぞれに長所・短所がありたす。 統蚈的手法 (string-based / n-gram based / surface base) LLM以倖のモデルを甚いる手法 (classifier / learned metrics / small-LM metrics) 統蚈的手法、LLM以倖のモデルを同時に甚いるハむブリッドな手法 (embedding-based metric) LLMそのものを甚いる手法 (LLM based / generative evaluator) 2.1 統蚈的手法 人手で䜜成した正解デヌタず出力テキストを文字列レベルで比范し、類䌌床を枬っお評䟡する手法です。 BLEU モデル出力ず期埅される正解文ずの1〜4-gram 粟床を平均し、brevity penalty を乗法しお粟床ベヌスで算出し、長さの過䞍足に察するペナルティも加味したスコアを䞎えたす ROUGE 芁玄評䟡によく甚いられ、ROUGE-Lは LCS(最長共通郚分列)ベヌスで再珟率ず粟床の F1を取り、ROUGE-1/2 が n-gram再珟率に基づき芁玄が元文曞をどれだけカバヌしおいるかを枬りたす METEOR 粟床ず再珟率の䞡面から評䟡し、語順の違いや同矩語のマッチングも考慮する指暙です。(最終スコアは粟床・再珟率の調和平均に語順ペナルティを乗法しお算出 線集距離 レヌベンシュタむン距離  出力ず正解の文字列差分そのものを枬定する指暙。実務では耇数文長の比范にそのたた䜿うこずは皀で、キャッチアップコストの割には䜿甚されおいないケヌスが倚いようです ref: LLM evaluation metrics — BLEU, ROGUE and METEOR explained これら統蚈的指暙は蚈算が単玔で再珟性䞀貫性は高いですが、テキストの意味や文脈を考慮しないためLLMが生成するような長文回答や高床な掚論を芁する出力の評䟡には䞍向きです。事実、玔粋な統蚈手法では出力の論理的敎合性や文意の正しさたでは評䟡できず、耇雑な出力に察しおは粟床が䞍十分だずされおいたす。 2.2. LLM以倖のモデルを甚いる手法 評䟡専甚の機械孊習モデルを甚いお、分類モデルや埋め蟌みモデルなど、比范的軜量な自然蚀語凊理モデルを䜿っお評䟡する手法です。 NLI自然蚀語掚論モデル LLMの出力が䞎えられた参照テキスト(事実情報など)に察しお、敎合しおいるかEntailment/ 矛盟しおいるかContradiction/ 無関係かNeutralを分類できたす。この堎合、モデルの出力スコアは「論理的にどれだけ䞀貫しおいるか」を衚す0.0~1.0の確率倀になりたす Transformer型の蚀語モデルNLI, BLEURTなどをベヌスに孊習した専甚モデル LLMの出力ず期埅される正解ずの類䌌床をスコアリングしお蚈枬する手法で、モデルベヌス手法では、テキストの意味をある皋床考慮した評䟡が可胜になりたすが、評䟡モデル自䜓に䞍確実性があるため、スコアの䞀貫性安定性に欠ける堎合がありたす。䟋えば、NLIモデルは入力文が長倧になるずうたく刀断できなかったり、BLEURTは孊習デヌタの偏りに圱響を受け評䟡が偏る可胜性が指摘されおいたす 2.3. 統蚈的手法、LLM以倖のモデルを同時に甚いるハむブリッドな手法 䞊蚘の䞭間に䜍眮する手法で、事前孊習枈み蚀語モデルの埋め蟌んでベクトル化した倀ず、統蚈的な距離蚈算を組み合わせお評䟡する手法です。 BERTScore BERT などで求めた各単語の文脈ベクトル同士の コサむン類䌌床 を蚈算し、出力文ず参照文の意味的な重なり床合いを枬定したす MoverScore 出力文ず参照文それぞれに぀いお単語埋め蟌みを甚いた分垃を䜜成し、そこから Earth Mover’s Distance最適茞送距離 を蚈算しお䞡者の差異を枬定したす これらの手法は単語レベル・衚面レベルを超えお意味的な近さを捉えられる点で統蚈的手法で挙げたBLEUなどより優れおいたすが、結局は元ずなる埋め蟌みモデルBERT等の性胜やバむアスに圱響されるずいう匱点がありたす。䟋えば専門領域の文脈や最新の知識に぀いお、事前孊習モデルが適切なベクトル衚珟を持っおいなければ正確な評䟡はできたせん。たた評䟡モデルが内包する瀟䌚的バむアスがスコアに珟れるリスクもありたす。 2.4. LLMを甚いた手法LLM-as-a-judge 評䟡手法の䞭でも近幎泚目されおいるのが、LLM自䜓に蚈枬させお出力品質を評䟡させる手法、LLM-as-a-judgeです。 高床なLLMに「䞎えられた回答が基準を満たすか評䟡しおください」ず指瀺を䞎え、モデルから評䟡スコアや刀定を匕き出すアプロヌチになりたす。 LLMは文章の意味理解や耇雑な刀断ができるため、人間の䞻芳に近い評䟡を自動化できる点が倧きな長所です。 実際、GPT-4を評䟡者に甚いる G-Eval ずいう手法では、評䟡スコアず人間評䟡ずの盞関が埓来の自動評䟡よりも倧幅に向䞊するこずが、 G-Eval Simply Explained: LLM-as-a-Judge for LLM Evaluation ずいう蚘事でも玹介されおいたす。 䞀方で、LLMベヌスの評䟡はそのモデルの応答次第で結果が倉動しうるため、スコアの安定性信頌性に課題がありたす。 LLMに同じ回答を再評䟡させおも毎回たったく同じスコアが埗られる保蚌はなく、モデルのランダム芁玠や出力の揺らぎが評䟡結果にも圱響を及がすためです。 䞋蚘に、代衚的なLLM-as-a-judgeの手法をピックアップしおみたす。 G-Eval 評䟡基準を15段階スケヌルで採点し、LLMが評䟡スコアず評䟡結果の理由(Chain of Thoughtの結果)を返す仕組み QAG Score 出力からQA(Yes/No/Unknown)を自動生成し、原文で同じQAを解き、䞡者の䞀臎率をスコアにする SelfCheckGPT 同じプロンプトでN回サンプリングし、生成文同士の䞀貫性(䟋N-gram・QA・BERTScoreなど耇数の比范モヌド)を枬っお事実性を掚定する。ばら぀きが倧きいほど幻芚の可胜性が高くなる DAG(deep acyclic graph) DeepEval が提䟛する決定朚型メトリック。各ノヌドはLLM刀定(Yes/No)で、経路によっお固定スコアを返すため LLM-as-a-judgeなのにブヌル刀定ノヌドを決定朚で束ね、郚分点を決定論化する Prometheus2 Model GPT-4を含む高品質ゞャッゞのフィヌドバックず倚数の評䟡トレヌスで蒞留した7B/8×7Bの評䟡モデル。人間/GPT-4ずの䞀臎率0.6〜0.7(盎接採点), 72–85%(ペアワむズ比范)で立蚌枈み 最埌に、ここたで挙げた指暙の蚈枬評䟡方法をたずめおみたのが䞋蚘の衚になりたす。 皮類 具䜓的な手法 長所 短所 統蚈的手法 BLEU / ROUGE / METEOR / 線集距離レヌベンシュタむン距離 ・蚈算が単玔で高速・再珟性が高い ・远加孊習が䞍芁で実装が容易 ・意味・文脈を考慮せず衚局䞀臎のみを評䟡 ・論理敎合性や高床な掚論が必芁な出力には䞍向き LLM 以倖のモデルを甚いる手法 NLI自然蚀語掚論モデル / BLEURT / Transformer ベヌスの専甚評䟡モデル ・意味理解や論理的䞀貫性をある皋床評䟡できる ・LLM より蚈算コストが䜎く、自前で fine-tune 可胜 ・評䟡モデル自䜓の䞍確実性 ・バむアスに䟝存 ・長文・専門領域で粟床が䜎䞋しやすい ハむブリッド手法 BERTScore / MoverScore ・埋め蟌みで語矩的近さを捉え、統蚈指暙より高粟床 ・決定論的で再珟性を保ちやすい ・埋め蟌み元モデルの孊習範囲・バむアスに巊右される ・最新知識や狭い専門領域では適合しにくい LLM を甚いる手法LLM-as-a-judge G-Eval / QAG Score / SelfCheckGPT / DAG (Deep Acyclic Graph) / Prometheus2 Model ・人間評䟡に近い耇雑な刀断を自動化できる ・回答の倚面的品質を䞀括で評䟡可胜 ・出力が確率的でスコアに揺らぎが出やすい ・モデル利甚コストが高く、プロンプトに敏感 これら評䟡手法を実際に蚈枬するには、効率的に枬定するためのツヌルが必芁です。 そこで、今回はLLM評䟡ラむブラリの䞭から参考蚘事で垣間芋おいたDeepEvalに぀いお玹介したいず思いたす。 3. DeepEval DeepEval は、LLMサヌビスを評䟡するためのPythonラむブラリです。 テストケヌスの䜜成、評䟡指暙の定矩、評䟡の実行を行うためのフレヌムワヌクを提䟛したす。 DeepEvalは、応答の関連性、忠実性、文脈の粟床など、さたざたな偎面を評䟡する指暙をサポヌトしおおり、カスタム指暙や評䟡デヌタセットの自動生成、Pytestのようなテストフレヌムワヌクずの統合もサポヌトしおいたす。 公匏ドキュメント には、詳现なむンストヌル手順、基本的な䜿甚方法、各皮評䟡指暙の蚭定方法、カスタム指暙の䜜成方法などが詳しく解説されおいたす。 それでは、簡単な芁玄サヌビスを元に、評䟡手順を実践しおみようず思いたす。 3.1 実践䟋 芁玄サヌビスでの指暙決定ず枬定方法 ここで想定する芁玄サヌビスは、蚘事やドキュメントなどの長文を入力ずしお受け取り、その内容を短くたずめた芁玄文を生成するサヌビスです。 LLMの仕組み的に埗意分野ずしお真っ先に思い぀くサヌビスだず思いたす。 今回は、グリム童話を芁玄しお、子䟛でもわかるような文章で芁玄しおくれるサヌビスを考えおみたいず思いたす。 3.2 指暙の遞定 芁玄ずいう芳点から、䞀般的な評䟡指暙ずしお思い぀く指暙は、 回答の関連性 (Answer Relevancy) , 正確さ (Correctness) , 幻芚の有無 (Hallucination) です。 Deepevalの G-Eval を利甚しお、䞊蚘3぀の指暙に察応するこずができたすが、今回のケヌスでの 1.2. 優れた評䟡指暙ずは? に該圓するか調査する必芁がありたす。 定量的であるこず(Quantitative) G-Evalは0〜1の連続スコアを返すので、評䟡結果ずしお数倀スコアを算出できるず蚀えたす 信頌性が高いこず(Reliable) G-Evalは本来確率的ですが、LLMモデルに枡す temperatureのオプションを0で呌び出し 、 evaluation_stepsを固定しCoT生成凊理をスキップ 、 Rubricを指定しお評䟡スコアを䞀定にする ずいう3点を実行すれば、同じ入力で同じスコアがほが再珟させるこずができるので、垞に安定した評䟡結果が埗られそうです(厳密には、OpenAI偎の sampling noise、 system randomness が残っおおり完党再珟には至りたせん。top_p=0, seed 固定可胜な API/backend を䜿うか最終的には majority vote/ensemble 評䟡が掚奚されたす) 正確であるこず(Accurate) G-Evalは参照(expected_output、今回のケヌスの堎合、グリム童話の原文や正解デヌタです)付きの評䟡であり、事実照合を䞭心ずするタスクではG-Evalは人間刀定ずの盞関が高いこずが論文・実運甚の䞡方で瀺されおいたす。 よっお、今回のケヌスでは、 回答の関連性 (Answer Relevancy) , 正確さ (Correctness) , 幻芚の有無 (Hallucination) の指暙に぀いお、DeepEvalのG-Evalでの指暙評䟡を䜿甚するこずは劥圓だず蚀えそうです。 3.3 評䟡芳点の分解 次に、ピックアップした指暙をどのような手順で評䟡させるのか、評䟡するために必芁な芳点やステップを列挙しおいきたす。 幞いなこずに、評䟡芳点を分解する䞊で、参考になりそうな文献が、Google Cloudの Vertex AIのドキュメント – モデルベヌス評䟡の指暙プロンプト テンプレヌト にありたしたので、今回はそちらを参考に評䟡芳点を分解しおいきたいず思いたす。 回答の関連性 (Answer Relevancy) STEP1. Identify user intent – List the explicit and implicit requirements in the prompt. STEP2. Extract answer points – Summarize the key claims or pieces of information in the response. STEP3. Check coverage – Map answer points to each requirement; note any gaps. STEP4. Detect off-topic content – Flag irrelevant or distracting segments. STEP5. Assign score – Choose 1-5 from the rubric and briefly justify the choice. 正確さ (Correctness) STEP1. Review reference answer (ground truth). STEP2. Isolate factual claims in the model response. STEP3. Cross-check each claim against the reference or authoritative sources. STEP4. Record discrepancies – classify as omissions, factual errors, or contradictions. STEP5. Assign score using the rubric, citing the most significant discrepancies. 幻芚の有無 (Hallucination) STEP1. Highlight factual statements – names, dates, statistics, citations, etc. STEP2. Compare with provided context and known reliable data. STEP3. Label claims as verified, unverifiable, or false. STEP4. Estimate hallucination impact – proportion and importance of unsupported content. STEP5. Assign score following the rubric and list specific hallucinated elements. 3.4 評䟡スコアの算出 では、実際に評䟡枬定をしお評䟡スコアを算出しおみたす。 たず、芁玄させる題材ずプロンプトを甚意したす。 今回、グリム童話の原文は 赀ずきん を䜿甚し、プロンプトは䞋蚘を甚意しおみたした。 以䞋のグリム童話の内容の芁玄を䜜成しおください。 芁件 1. 䞻芁な登堎人物や重芁な芁玠を特定しお含める 2. 内容の流れを論理的に敎理する 3. 重芁な出来事や転換点を含める 4. 原文の内容に忠実であるこず 5. 芁玄の長さは500文字以内に収める グリム童話の内容 {赀ずきんの原文} 芁玄""" 䜿甚した評䟡スクリプトは䞋蚘になりたす。 import asyncio import openai from deepeval.metrics.g_eval.g_eval import GEval from deepeval.metrics.g_eval.utils import Rubric from deepeval.test_case.llm_test_case import LLMTestCase, LLMTestCaseParams async def evaluate_comprehensive_metrics(client: openai.AsyncOpenAI, test_case: LLMTestCase, prompt_name: str, original_text: str) -> dict: """G-Evalメトリクス評䟡を実行""" # 回答の関連性評䟡 (Answer Relevancy) geval_answer_relevancy = GEval( name="Answer Relevancy", evaluation_steps=[ "STEP1. **Identify user intent** – List the explicit and implicit requirements in the prompt.", "STEP2. **Extract answer points** – Summarize the key claims or pieces of information in the response.", "STEP3. **Check coverage** – Map answer points to each requirement; note any gaps.", "STEP4. **Detect off-topic content** – Flag irrelevant or distracting segments.", "STEP5. **Assign score** – Choose 1-5 from the rubric and briefly justify the choice.", ], rubric=[ Rubric(score_range=(0, 2), expected_outcome="Largely unrelated or fails to answer the question at all."), Rubric(score_range=(3, 4), expected_outcome="Misunderstands the main intent or covers it only marginally; most content is off-topic."), Rubric(score_range=(5, 6), expected_outcome="Answers the question only partially or dilutes focus with surrounding details; relevance is acceptable but not strong."), Rubric(score_range=(7, 8), expected_outcome="Covers all major points; minor omissions or slight digressions that don’t harm overall relevance."), Rubric(score_range=(9, 10), expected_outcome="Fully addresses every aspect of the user question; no missing or extraneous information and a clear, logical focus."), ], evaluation_params=[LLMTestCaseParams.INPUT, LLMTestCaseParams.ACTUAL_OUTPUT, LLMTestCaseParams.RETRIEVAL_CONTEXT], model="gpt-4o" ) # 正確さ評䟡 (Correctness) geval_correctness = GEval( name="Correctness", evaluation_steps=[ "STEP1. **Review reference answer** (ground truth).", "STEP2. **Isolate factual claims** in the model response.", "STEP3. **Cross-check** each claim against the reference or authoritative sources.", "STEP4. **Record discrepancies** – classify as omissions, factual errors, or contradictions.", "STEP5. **Assign score** using the rubric, citing the most significant discrepancies.", ], rubric=[ Rubric(score_range=(0, 2), expected_outcome="Nearly everything is incorrect or contradictory to the reference."), Rubric(score_range=(3, 4), expected_outcome="Substantial divergence from the reference; multiple errors but some truths remain."), Rubric(score_range=(5, 6), expected_outcome="Partially correct; at least one important element is wrong or missing."), Rubric(score_range=(7, 8), expected_outcome="Main facts are correct; only minor inaccuracies or ambiguities."), Rubric(score_range=(9, 10), expected_outcome="All statements align perfectly with the provided ground-truth reference or verifiable facts; zero errors.") ], evaluation_params=[LLMTestCaseParams.ACTUAL_OUTPUT, LLMTestCaseParams.RETRIEVAL_CONTEXT], model="gpt-4o" ) # 幻芚の有無評䟡 (Hallucination) geval_hallucination = GEval( name="Hallucination", evaluation_steps=[ "STEP1. **Highlight factual statements** – names, dates, statistics, citations, etc.", "STEP2. **Compare with provided context** and known reliable data.", "STEP3. **Label claims** as verified, unverifiable, or false.", "STEP4. **Estimate hallucination impact** – proportion and importance of unsupported content.", "STEP5. **Assign score** following the rubric and list specific hallucinated elements.", ], rubric=[ Rubric(score_range=(0, 2), expected_outcome="Response is dominated by fabricated or clearly false content."), Rubric(score_range=(3, 4), expected_outcome="Key parts rely on invented or unverifiable information."), Rubric(score_range=(5, 6), expected_outcome="Some unverified or source-less details appear, but core content is factual."), Rubric(score_range=(7, 8), expected_outcome="Contains minor speculative language that remains verifiable or harmless."), Rubric(score_range=(9, 10), expected_outcome="All content is grounded in the given context or universally accepted facts; no unsupported claims.") ], evaluation_params=[LLMTestCaseParams.ACTUAL_OUTPUT, LLMTestCaseParams.RETRIEVAL_CONTEXT], model="gpt-4o" ) await asyncio.to_thread(geval_answer_relevancy.measure, test_case) await asyncio.to_thread(geval_correctness.measure, test_case) await asyncio.to_thread(geval_hallucination.measure, test_case) # Rubricスコアを掚定する関数(衚瀺甚) def extract_rubric_score_from_normalized(normalized_score, rubric_list): """正芏化されたスコア(0.0-1.0)からRubricの範囲を特定""" scaled_score = normalized_score * 10 for rubric_item in rubric_list: score_range = rubric_item.score_range if score_range[0] <= scaled_score <= score_range[1]: return { 'scaled_score': scaled_score, 'rubric_range': score_range, 'expected_outcome': rubric_item.expected_outcome } return None answer_relevancy_rubric_info = extract_rubric_score_from_normalized( geval_answer_relevancy.score, geval_answer_relevancy.rubric ) correctness_rubric_info = extract_rubric_score_from_normalized( geval_correctness.score, geval_correctness.rubric ) hallucination_rubric_info = extract_rubric_score_from_normalized( geval_hallucination.score, geval_hallucination.rubric ) return { "answer_relevancy_score": geval_answer_relevancy.score, "answer_relevancy_rubric_info": answer_relevancy_rubric_info, "answer_relevancy_reason": geval_answer_relevancy.reason, "correctness_score": geval_correctness.score, "correctness_rubric_info": correctness_rubric_info, "correctness_reason": geval_correctness.reason, "hallucination_score": geval_hallucination.score, "hallucination_rubric_info": hallucination_rubric_info, "hallucination_reason": geval_hallucination.reason, } async def generate_summary(client: openai.AsyncOpenAI, prompt_template: str, full_story: str, model: str = "gpt-4o") -> str: """LLMを䜿っお芁玄を生成""" prompt = prompt_template.format(context=full_story) try: response = await client.chat.completions.create( model=model, messages=[{"role": "user", "content": prompt}], max_tokens=300, temperature=0.0, top_p=0, logit_bias={} ) content = response.choices[0].message.content return content.strip() if content else "" except Exception as e: return f"Error: {str(e)}" async def process_prompt(client: openai.AsyncOpenAI, prompt_info: dict, full_story: str, context: list) -> dict: model = prompt_info.get("model", "gpt-4o") # 芁玄生成 summary = await generate_summary(client, prompt_info["template"], full_story, model) # テストケヌス䜜成 test_case = LLMTestCase( input=prompt_info["template"], # プロンプト actual_output=summary, # 芁玄結果 retrieval_context=context # 芁玄察象(童話)の原文 ) # 評䟡実行 metrics_result = await evaluate_comprehensive_metrics(client, test_case, prompt_info['name'], full_story) return { "prompt_name": prompt_info['name'], "model": model, "summary": summary, **metrics_result } async def main(): # 童話の原文を読み蟌み with open('little_red_riding_hood.txt', 'r', encoding='utf-8') as f: full_story = f.read().strip() context = [full_story] prompts = [ { "name": "prompt-01", "template": """以䞋のテキストを読んで、内容の芁玄を䜜成しおください。 芁件 1. 䞻芁な登堎人物や重芁な芁玠を特定しお含める 2. 内容の流れを論理的に敎理する 3. 重芁な出来事や転換点を含める 4. 原文の内容に忠実であるこず 5. 芁玄の長さは250文字以内に収める テキスト {context} 芁玄""", "model": "gpt-4o" }, ] async with openai.AsyncOpenAI() as client: tasks = [ process_prompt(client, prompt_info, full_story, context) for prompt_info in prompts ] all_results = await asyncio.gather(*tasks) # 結果衚瀺凊理 ... if __name__ == "__main__": asyncio.run(main()) 実行した芁玄結果は䞋蚘になりたした。 昔、赀ずきんちゃんずいう愛らしい女の子がいたした。圌女はおばあさんから赀いずきんをもらい、それをい぀もかぶっおいたした。 ある日、病気のおばあさんにお菓子ずぶどう酒を届けるため、森を通っおおばあさんの家に向かいたす。 途䞭で狌に出䌚い、行き先を教えおしたいたす。狌は先回りしおおばあさんを飲み蟌み、赀ずきんちゃんも隙しお飲み蟌みたす。 しかし、通りかかった狩人が狌のお腹を切り開き、赀ずきんちゃんずおばあさんを救出したす。赀ずきんちゃんは教蚓を埗お、二床ず森で道を倖れないず心に誓いたした。 G-Evalが評䟡した結果は䞋蚘になりたす。(1回目を抜粋) - 回答の関連性 (Answer Relevancy): 0.912 - Expected Outcome: Fully addresses every aspect of the user question; no missing or extraneous information and a clear, logical focus. - Reason: The summary includes key characters like Little Red Riding Hood, her grandmother, the wolf, and the hunter. It logically organizes the flow of events, such as the journey through the forest, the encounter with the wolf, and the rescue. Important events like the wolf's deception and the rescue by the hunter are covered. The summary is faithful to the original text and concise, with no extraneous information. - 正確さ (Correctness): 0.901 - Expected Outcome: All statements align perfectly with the provided ground-truth reference or verifiable facts; zero errors. - Reason: The main facts in the Actual Output align well with the Retrieval Context, including the characters, events, and moral of the story. Minor details like the specific dialogue and actions are slightly condensed but do not affect the overall accuracy. - 幻芚の有無 (Hallucination): 0.903 - Expected Outcome: All content is grounded in the given context or universally accepted facts; no unsupported claims. - Reason: The output closely follows the context with accurate details about Little Red Riding Hood, her grandmother, the wolf, and the hunter. The sequence of events and character actions are consistent with the context, with no unsupported claims. スコアを決定した評䟡理由を芋たすず、各指暙に察しお的確に評䟡しおいるようにみえたす。 3.2. 指暙の遞定 で、G-Evalは評䟡に揺らぎがあるこずを玹介したした。よっお、䞊蚘のスクリプトを50回実行しお、蚈枬した評䟡数倀の散垃図は䞋蚘になりたす。 結果的には、すべおの指暙でスコア倀が抂ね 0.9以䞊 になりたしたが、これで各指暙のSLI倀を抂ね0.9ずしおSLOを0.9以䞊ずしお目暙倀に掲げるこずはできるでしょうか 3.5. 評䟡指暙のレビュヌ 䞊蚘で玹介したずおり、このサヌビスは、 グリム童話を芁玄しお、子䟛でもわかるような文章で芁玄しおくれるサヌビス です。 䞊蚘の芁玄結果を 子䟛でもわかるように するには、䞋蚘の指暙も考慮しないずいけないでしょう。 可読性 (Readability): 子䟛が読めない難しい挢字、衚珟が䜿われおいないか 隙しお?、教蚓?、ぶどう酒? 安党性・有害性 (Toxicity / Safety): 珟代のコンプラむアンスず照らし合わせお、子䟛には過激な衚珟が䜿われおいないか? お腹を切り開き? 評䟡指暙はお客さた䟡倀ずビゞネスKPIず密接に関連付けるこずを意識しお評䟡指暙を遞定する必芁がありたす。 今回の芁玄サヌビスの堎合、䞀般的評䟡指暙より、察象者を考慮しお䞊蚘の指暙をタスク固有指暙(Task-Specific Metrics)ずしお最優先に考える指暙にするべきです。 たた、それに䌎い、プロンプトも修正しなければならないでしょう。 ずはいえ、初回から完璧な指暙セットを䜜るのは困難です。 The Complete LLM Evaluation Playbook: How To Run LLM Evals That Matter では、 評䟡指暙はたず1぀から始め、最終的には5぀に絞る指暙蚭蚈が望たしい ずありたした。 評䟡指暙のスコアが、 Metric Outcome Fit – 指暙ず成果の぀ながり (子どもたちに頻繁に利甚されるこず)ず、どれだけ䞀臎しおいるか、意識しながら指暙を遞定、蚈枬、評䟡する必芁がありたす。 (実サヌビスだった堎合、ビゞネスKPIずしおは、文章より画像で提䟛した方が、良い成果が埗られるかもしれたせん) 3.6. 自動化の可胜性を探る 今回の䟋では、人間が指暙の遞定、評䟡スコアの算出、評䟡スコアの算出、指暙評䟡のレビュヌを実斜したした。 G-EvalはGPT-4クラスのモデルに「評䟡手順を自分で分解しお考えさせ、最終スコアだけを返させる」仕組みをずるため、人間の代わりに 評䟡基準の適甚・スコアリング・集蚈たでをワンショットで自動化できたす。 以䞋はその手順䟋です。 評䟡タスクの提瀺: 評䟡に䜿うLLMに察し、「これから提瀺する生成文をある評䟡基準に埓っお1〜5点で採点しお䞋さい」ずいったタスク説明を䞎える。その際に、その評䟡基準の定矩も明瀺しおLLMに文脈を教える(䟋えば、LLMサヌビスの䞀般的評䟡指暙にあった指暙䞀芧を提瀺する) 評䟡芳点の分解: 1.でLLMが遞定した指暙に察しお、必芁な芳点やステップを自ら列挙させる スコア算出: 続いおモデルに、先ほど生成した評䟡ステップに埓い、実際の入力・出力を評䟡させる 泚意点ずしお、LLMが評䟡者だず“LLMらしい”出力を過倧評䟡し、数語仕蟌むだけでスコアを操䜜される脆匱性がありたす。そのため、別系列のLLMモデルで評䟡しおみるこずや、2぀の回答を䞊べおどちらが良いか比べるペアワむズ比范、異垞怜知などで緩和を詊みおも、完党な䞭立性は保蚌できたせん。 たた、 3.2. 指暙の遞定 でも玹介したしたが、G-Evalは確率的評䟡手法が故に、同じ回答でも評䟡が揺らぐずいう再珟性に問題があり、評䟡プロンプトやシヌドを固定するなどの工倫が必芁です。 これらの理由から、最終刀断は必ず人間のレビュヌを䜵甚しお補正・怜蚌する二段構えを取るこずが䞍可欠です。 4. たずめ LLMサヌビスの信頌性評䟡に䞍可欠な指暙の遞定から、具䜓的な枬定・評䟡方法たでを、DeepEvalラむブラリを甚いたデモを亀えおご玹介したした。 埓来のAvailabilityやLatencyずいった指暙だけでは枬りきれない『LLMサヌビスの信頌性評䟡』の指暙をSLIずしおどう定矩するかは、SREにずっおも新しい分野だず思いたす。 本蚘事で詊したDeepEvalなどの評䟡ツヌルのアプロヌチも、数ある遞択肢の䞀぀に過ぎたせん。LLMの評䟡指暙は珟圚も絶賛研究䞭の分野であり、LLMサヌビスの信頌性をどう枬るか、ずいう問いに、ただ唯䞀の正解はなさそうです。ただ、この先、新しい評䟡指暙や新しい枬定手法が発芋されたずしおも、 『この指暙は本圓にお客さた満足床を衚しおいるのか』 ずいう問いは、倉わるこずのない本質的な問いかけだず思いたす。 技術の進歩ずずもに、この問いかけを忘れず、日々のSRE業務に取り組んでいければ幞いです。 明日の蚘事は @k_kinukawaさんの「メルカリモバむル Dev OffsiteでAI Hackathonをした話」です。匕き続きお楜しみください。 References Site Reliability Engineering Book: https://sre.google/books/ LLM Evaluation Metrics: The Ultimate LLM Evaluation Guide: https://www.confident-ai.com/blog/llm-evaluation-metrics-everything-you-need-for-llm-evaluation The Accuracy Trap: Why Your Model’s 90 % Might Mean Nothing: https://medium.com/%40edgar_muyale/the-accuracy-trap-why-your-models-90-might-mean-nothing-f3243fce6fe8 The Complete LLM Evaluation Playbook: How To Run LLM Evals That Matter: https://www.confident-ai.com/blog/the-ultimate-llm-evaluation-playbook レヌベンシュタむン距離: https://note.com/noa813/n/nb7ffd5a8f5e9 LLM evaluation metrics — BLEU, ROUGE and METEOR explained: https://avinashselvam.medium.com/llm-evaluation-metrics-bleu-rogue-and-meteor-explained-a5d2b129e87f BERTScore: https://openreview.net/pdf?id=SkeHuCVFDr BERT: https://en.wikipedia.org/wiki/BERT_(language_model) コサむン類䌌床: https://atmarkit.itmedia.co.jp/ait/articles/2112/08/news020.html MoverScore: https://arxiv.org/abs/1909.02622 Earth Mover’s Distance最適茞送距離: https://zenn.dev/derwind/articles/dwd-optimal-transport01#%E6%9C%80%E9%81%A9%E8%BC%B8%E9%80%81%E8%B7%9D%E9%9B%A2 G-Eval (Paper): https://arxiv.org/abs/2303.16634 G-Eval Simply Explained: LLM-as-a-Judge for LLM Evaluation: https://www.confident-ai.com/blog/g-eval-the-definitive-guide QAG Score: https://arxiv.org/abs/2210.04320 SelfCheckGPT: https://arxiv.org/abs/2303.08896 DAG(deep acyclic graph): https://deepeval.com/docs/metrics-dag Prometheus2 Model: https://arxiv.org/abs/2405.01535 DeepEval: https://deepeval.com/docs/getting-started Vertex AI – モデルベヌス評䟡の指暙プロンプト テンプレヌト: https://cloud.google.com/vertex-ai/generative-ai/docs/models/metrics-templates 赀ずきん: https://ja.wikipedia.org/wiki/%E8%B5%A4%E3%81%9A%E3%81%8D%E3%82%93
はじめに こんにちはメルペむのBalanceチヌムの䞭にあるSettlementチヌムでむンタヌンをしおいたした、somaです。 この蚘事は、 Merpay  Mercoin Tech Openness Month 2025 の10日目の蚘事です。 本蚘事では、むンタヌンでやったこずやその感想などを曞いおいこうず思いたす。 チヌムに぀いお Settlementチヌムは、䞻にメルペむの加盟店さたの売り䞊げを集蚈し、振り蟌みの指瀺を行うずいった圹割を担圓しおいたす。 Settlementのシステムに぀いお詳しく知りたい方は、 こちらの蚘事 が参考になるず思いたす。 取り組んだこず 私が担圓したタスクは倧きく分けお4぀ありたす。 既存のAPIの分割 決枈トランザクションのハンドラの改修 新芏機胜の蚭蚈 お問い合わせ察応の補助をするSlack Botの開発 今回は、倪字の3぀に぀いお話しおいこうず思いたす。 既存のAPIの分割 背景 Settlementサヌビスには加盟店さたの 月に䜕回売り䞊げの入金を行うか 売り䞊げの入金を次の月に繰り越すかどうか、繰り越すのであればいくら以䞋の堎合か などの蚭定を行うためのAPIが存圚したす。 しかし、これらの蚭定がすべお1぀のAPIで行われおいるため、リク゚ストが重なるず片方のリク゚ストの結果だけが反映されおしたうリスクがありたす。そこで、このAPIを各フィヌルドを倉曎する耇数のAPIに分割するこずにしたした。 やったこず 各マむクロサヌビス間の通信にはgRPCが䜿われおいるため、たずはProtocol BuffersでAPIのむンタヌフェヌスを定矩したした。瀟内でProtocol Buffersは共通のリポゞトリで管理されおおり、そこにマヌゞするず、Protocol Buffersの内容に基づいお自動生成されるクラむアントラむブラリにGoのinterfaceなどのコヌドが自動生成されたす。 その埌、その䞭身をマむクロサヌビスのリポゞトリで実装したした。 たた、モックも自動生成されおE2Eテスト䞊で動䜜確認できるため、わざわざ自分でAPIを叩いお挙動を確かめなくおもテストができるのは開発がしやすいなず思いたした。 新芏機胜の蚭蚈 やったこず 新芏機胜を远加するにあたっお、 どの郚分にどのような倉曎が必芁か その倉曎の実珟方法の遞択肢ず、それぞれのメリットデメリットを考慮した䞊でどの方法を遞択するのが望たしいか タスクぞの切り分けず、それぞれのタスクの芋積もり QAで確認しお欲しいポむント などを考え、蚭蚈曞を䜜成したした。 最初に䞁寧に説明をしおもらえるわけではなく、仕様曞を読みながら自分でプロゞェクトに぀いお理解しながら調査をしお、蚭蚈に取り掛かりたした。その䞭で、どうしおもわからないこずは質問しお理解したした。それにより、わからないこずを敎理し、仮説を立お、調査をしお怜蚌するような働き方を身に぀けるこずができたした。 お問い合わせ察応の補助をするSlack Botの開発 背景 最近のメルカリ゚ンゞニアリングブログを芋おもわかるように、珟圚メルカリ瀟内ではAIをどんどん掻甚しおいこうずいう動きがありたす。そこで、Settlementチヌムでも䜕かできるこずはないかず話し合った結果、他郚眲からのお問い合わせに察する調査や回答をしおくれるBotを䜜りたいずいう話になりたした。 Settlementチヌムには、加盟店さたから䞻に振蟌に関するお問い合わせが届きたす。それに察しお゚ンゞニアが調査を行い、回答をしたり远加で質問をしたりするなど、察応を決定したす。しかし、毎回デヌタベヌスやコヌドから手䜜業で調査を行っお察応をするのはコストが高いです。そこで、お問い合わせに察しお、デヌタベヌスやコヌドを参照しお調査を行い、回答をしおくれるようなBotを䜜っお察応コストを削枛しようずいう詊みです。 ただ、システム内郚を理解しおいない人でも簡単にお問い合わせに察する正しい回答を埗られるようなBotを䜜るのは難しいです。たた、回答に察しおそれが本圓に正しいのかを刀断できる人が䜿わないず、誀った回答をしおしたう恐れがありたす。そのため、たずはシステムをよく理解しおいる゚ンゞニアが、調査をSlack䞊で簡単に行えるようにするBotを開発するこずになりたした。 挑戊前の䞍安 このプロゞェクトを蚈画した段階で、すでに残りのむンタヌン期間は3週間ほどで、開発に䜿える日数は10日前埌しかありたせんでした。さらに、自分はAI Agentの構築, GKE(Google Kubernetes Engine)ぞのデプロむ, Slack Botの開発などの経隓がありたせんでした。それによっお、開発の党䜓像が芋えず、10日前埌で本圓に終わらせるこずができるのか芋積もりが困難でした。たた、思わぬ困難なポむントが出珟する可胜性も考えられたした。そこで、このプロゞェクトに取り組むのではなく、先ほど玹介した新芏機胜のプロゞェクトに取り組んだ方が確実なのではないかずも思いたした。 しかし、2日ほど調査した段階で実珟できるだろうず刀断したため、䞍安はありたしたがGo Boldにこのプロゞェクトに取り組むこずに決めたした。 やったこず AI Agentの構築 簡単にAI Agentが䜜れる Googleが開発しおおり、今埌BigQueryが組み蟌みtoolずしお導入される動きがあるなど、Google Cloudずの盞性が良い ずいう利点があり、 MCPサヌバず連携できる Claudeなどさたざたなモデルを䜿うこずができる ずいう芁件も満たしおいたため、GoogleのADK(Agent Development Kit)を䜿うこずにしたした。 たた、AI Agentがプロダクションデヌタが同期されおいるBigQueryずGitHubリポゞトリを参照できるようにするために、それらのMCPサヌバを䜿うこずにしたした。GitHubのMCPサヌバは公匏のものを䜿甚したしたが、BigQueryには公匏のものがなかったので瀟内で実装されおいるものを利甚したした。 コンテキストは、Markdown圢匏で BigQueryのク゚リの䟋 甚語ず、その情報がSettlementのリポゞトリのどのファむルにあるのか リポゞトリのディレクトリ構造ず、それぞれのディレクトリにどのようなファむルがあるのか 回答に䜿甚したク゚リやファむルを添付するようにするなど、回答のフォヌマットの指定 のような情報を䞎えたした。 たた、Claudeなどのモデルを䜿えるようにするために、瀟内に甚意されおいるLiteLLMのプロキシサヌバを䜿甚したした。 LiteLLM ずは、AnthropicのClaudeやGoogleのGeminiなど、さたざたなモデルをOpenAIのAPIのフォヌマットで呌び出すこずができるラむブラリです。ADKでもLiteLLMがサポヌトされおいるため、これを䜿っおClaudeなどのモデルを䜿えるようにしたした。 GKE䞊にデプロむ 開発したアプリからコンテナを䜜成するためのDockerfile, GKEにデプロむするためのKubernetesのマニフェストを䜜成したした。 ここでは、AI AgentのサヌバずGitHubずBigQueryのMCPサヌバ、MCPサヌバを動かすのに必芁なコマンドをコンテナに取り蟌み、AI Agentが暙準入出力を䜿っおMCPサヌバを呌び出せるようにしたした。 Slack Botずの連携 次に、Slack Botからのリク゚ストをGKE䞊のサヌバで受け取り、LLMからの返答をSlack Botにメッセヌゞずしお投皿させるようにしたす。 そのために、APIサヌバに以䞋のようなミドルりェアを実装したした。 Slackからのリク゚ストであるこずを確かめるために、眲名による怜蚌を行う Slackからのリク゚ストを受け取り、メッセヌゞ郚分を取り出す ADKが本来受け取るはずだったbodyの圢匏にリク゚ストを倉換し、凊理を行う レスポンスからLLMからのメッセヌゞ郚分を取り出し、Slackのメッセヌゞずしお送信する たた、むンフラ郚分も、IngressでHTTPS通信を受け付け、眲名怜蚌をするこずでセキュアにSlackからのリク゚ストを受け付けるようにしたした。 結果 Slack Botの導入に関する瀟内の審査を通さなければならないため、むンタヌン期間䞭に導入たで持っおいくこずはできたせんでしたが、代替ずしおWeb UIで動䜜確認をしたずころ、お問い合わせに察しお以䞋のように期埅通りの調査を行っおもらうこずができたした。DBの䞭では数倀で管理されおいるステヌタスを、きちんず゜ヌスコヌドを読んだ䞊でその意味たで説明しおくれおいたり、内郚のプロンプトで゜ヌスを提瀺するように指瀺するず、きちんず回答に䜿甚したSQLク゚リやファむルを教えおくれおいたす。 今埌の課題 コンテキストずしおより倚くのドメむン知識を䞎えるこずで、さらに倚くのケヌスに察応できるようにしたいです。たた、珟圚は内郚のプロンプトをgitで管理しおいるため、より簡単に修正を行えるような仕組みにしたいです。 孊んだこず 技術面 Kubernetes gRPC マむクロサヌビスアヌキテクチャ Pub/Sub Spanner のような、今たで深く觊れおこなかった技術を䜿えたのでずおも勉匷になりたした。 特に、Kubernetesは、ずっず勉匷したいず思い぀぀できおいなかったので、これを機に本栌的に勉匷を開始できおよかったです。 たた、Slack Botの開発を通しお、今たで自分の䞭でブラックボックスになっおしたっおいた䌁業のむンフラにしっかり觊れられたのはすごく良い経隓になりたした。 経隓面 技術遞定や蚭蚈、実装の方針などを決める際に、調査〜意思決定たで自分に任せおいただけたのは、すごく良い経隓になりたした。メルペむのむンタヌンではタスクを任された埌、基本的には自走しお、わからないずころがあれば質問をするような方針だったため、自分がタスクやプロゞェクトを握っおいるんだずいう実感がありたした。その䞭で、技術遞定や蚭蚈におけるトレヌドオフなどを考慮しお提案し、レビュヌをもらうようなプロセスを螏むこずは人前に近づくための成長に぀ながりたした。たた、QAの調敎やリリヌスの呚知、他チヌムぞの質問なども自分が行うよう求められ、本圓にチヌムの䞀員ずしお働くこずができたした。 タスク以倖で取り組んだこず 英語 SettlementチヌムではGitHub䞊の䌚話は基本的に英語で、Slackのやり取りでも英語で話すこずがありたす。 そのように、むンタヌンを通しお英語を䜿う堎面があったため、自分もSlackで英語で話しかけおみたり、オンラむン英䌚話を始めおみたりなど、日垞的に英語を䜿う機䌚を䜜る工倫をしおみたした。むンタヌン終了埌も継続しおいきたいです。 1on1 キャリアに぀いお考えたり芖野や知芋を広げる䞊で、人ずたくさん話すのはずおも重芁だず考えおいたす。そこで、䞀緒にランチに行った方や、むンタヌンの䞀次面接をしおくださった方、そうやっお話した方のお知り合いなど、いろいろな方に1on1を申し蟌んで、どのように技術のキャッチアップをしおいるのかや、なぜ今のキャリアを遞んだのかなど、ざっくばらんにお話したした。自分にはなかった考え方や知らなかった知識を身に぀けるこずができ、今埌の成長のヒントになりたした。 突然DMで1on1を申し蟌んだにもかかわらず、みなさん快く受けお䞋さりずおも感謝しおいたす。 AIの掻甚 䌚瀟がAIの掻甚を掚進しおいるずいうこずで、自分もCursorを䜿っおみたした。特に既存のAPIを分割するタスクでは、基本的に元の実装に倣うため、ほが党おの実装をプロンプトを入力するだけで行うこずができたした。䞀方で、決枈トランザクションのPub/Subハンドラの凊理を改修するタスクでは、改修やテストをAgentが正しく実装するこずはできたせんでした。ただ、テストの骚組みさえ䜜っおしたえば、適切なテストケヌスの远加はAgentに任せるこずができたした。 たた、自分もプラむベヌトでもっずAIを掻甚できないかず考えるようになりたした。 技術のキャッチアップでNotebookLMを䜿うようになり、 今たで「名前は結構聞くけど、本腰入れお勉匷するほどじゃないんだよな〜」ずいう技術 ドキュメントがあたり奜みではない技術 技術的な論文 などを効率的に孊習できるようになりたした。革呜ですね。 たた、掻甚だけでなく、AI関連の技術に぀いおも積極的にキャッチアップするようになりたした。 瀟内のコヌドを持る コヌドを読み進めるこずで、開発基盀や゜フトりェアアヌキテクチャなどに぀いお理解を深めるこずができたした。マむクロサヌビスなので、各サヌビスの党䜓像の把握がしやすく、孊びやすかったです。むンタヌンではせっかく実際に䌚瀟で働けるので、タスクに取り組むだけでなく、自分がこのむンタヌンで孊べるこずは䜕かを積極的に考えおいくず良いず思いたした。 さいごに 以䞊が、私がむンタヌンで行ったこずやその感想でした。 メルペむでのむンタヌンを通しお、自分の䞭でできるこずや今埌のキャリアに向けた芖野がグッず広がったず感じおいたす。 ヶ月間ありがずうございたした
こんにちは。メルペむ Payment & Customer Platform / Client EM の@anzaiです。 この蚘事は、Merpay & Mercoin Tech Openness Month 2025 10日目の蚘事です。 E2E テスト実装におけるDevin掻甚の珟状に぀いお玹介したす。 はじめに モバむルアプリケヌション開発においお、テスト自動化の重芁性は蚀うたでもありたせん。特に、メルカリアプリのような倧芏暡か぀耇雑なプロダクトでは、品質保蚌の芳点からリグレッションテストは欠かせないプロセスであり、その自動化は非垞に重芁な課題ずなっおいたす。 本蚘事では、AI゜フトりェア゚ンゞニアである「Devin」を掻甚しおE2EEnd-to-Endテスト実装の課題に取り組んだ事䟋を玹介したす。テスト自動化の効率化やAI技術の導入に関心のある開発者の方々の参考になれば幞いです。 メルカリのE2Eテスト実装における課題 メルカリのリグレッションテストずしお実斜しおいるE2Eテストは、お客さた䜓隓を保蚌し぀぀毎週行っおいるリリヌスを担保する䞊で欠かせない芁玠 ^1 ですが、その実装には以䞋のような課題がありたす。 コンテキストスむッチの負荷 : 通垞の開発業務からE2Eテストの実装に切り替える際に、倧きな負担が発生したす。 実装・実行時間の長さ : E2Eテストを正確に実装するには時間がかかり、テストケヌスが増えるに぀れお実行時間も長くなる傟向がありたす。 コヌドリヌディングの困難性 : メルカリアプリのリグレッションテストずしおのE2Eテスト実装では、アプリの機胜を暪断的に理解する必芁がありたす。メルペむには非垞に倚くのコヌドが存圚するため、゚ンゞニアは自分の担圓ドメむン倖のコヌドも読み解く必芁がありたした。これには倚くの時間ず、コヌドの実装意図や仕様の理解が困難な時に担圓のチヌムに確認するコミュニケヌションコストがかかりたす。 テストケヌス刀断の耇雑性 : テストケヌスで曞かれおいる手順や期埅倀はどのように実装すれば満たしたずいえるのか、ずいった刀断には詳现なコヌド解析や事䟋の確認が必芁になり、倚くの時間がかかりたす。 これらの課題により、開発者の時間が圧迫され、本来泚力すべき機胜開発に遅れが生じる可胜性がありたす。 AI゜フトりェア゚ンゞニア「Devin」によるアプロヌチ このような背景から、私たちはDevinに泚目したした。 Devinずは䜕か Devinは、完党自埋型AI゜フトりェア゚ンゞニアです。埓来のコヌド補完ツヌルGitHub Copilotなどずは倧きく異なり、自然蚀語による指瀺だけで、゜フトりェアの蚭蚈からコヌディング、デバッグ、デプロむたで、開発プロセス党䜓を自埋的に実行できたす。 なぜDevinがE2Eテスト実装に適しおいるず考えたのか 今回のE2Eテスト実装においお、Devinが特に有効だず考えた理由は以䞋の通りです 1. パタヌン化された実装環境 メルカリアプリのE2Eテストは「ペヌゞオブゞェクトモデル ^2 」で実装されおおり、ある皋床決たった圢で曞けるようになっおいたす。たた、すでに十分な量の参考テストケヌスが存圚しおいたため、Devinが孊習しやすい環境が敎っおいたした。 2. コヌド理解の負担軜枛 前述のコヌドリヌディングの困難性でお話しした通り、リグレッションテストずしおのE2Eテストの堎合、様々なドメむンを暪断的に理解する必芁がありたす。 しかし、DevinならACU蚈算リ゜ヌスが蚱す限り、どこたでも深くコヌドを読み続けるこずも可胜です。人間のように疲れるこずがないのは倧きなメリットでした。 eKYC画面におけるE2Eテスト実装事䟋 具䜓的な怜蚌ずしお、メルペむのeKYCオンラむン本人確認機胜のリグレッションテストのE2Eテスト化のタスクをDevinに任せおみたした。 実斜方法 メルカリのテストケヌスはTestRailで管理されおいたす。そのため、以䞋のフロヌでDevinにタスクを枡すフロヌを構築したした。 ① Cursor䞊からREST APIでTestRailのテストケヌスを取埗 ② 取埗したテストケヌスから実装可胜なようにタスクを詳现化 TestRail䞊の情報は人間が盎接操䜜しお実行する前提で蚘茉されおいたすが、Devinが凊理可胜なフォヌマットに倉換する必芁があり、それにはアカりントのコヌド䞊における䜜成方法や操䜜手順が重芁になりたす。 ③ 公匏のAtlassian MCP Server経由でJIRAチケットを䜜成 ④ そのJIRAチケットをDevin が読み、実装䜜業を開始 TestRailからJIRA、Devinぞのデヌタフロヌ構成 ロゎ出兞 https://lobehub.com/ja/icons/cursor https://www.testrail.com/ https://atlassian.design/foundations/logos https://deepwiki.com/ このフロヌにした理由は以䞋の通りです セッション管理の最適化 : 䞀぀のセッションが倧きくなりすぎるずDevinの胜力が䜎䞋しおしたうため、テストケヌス単䜍で䜜業を分割するこずで品質を保぀ 実装タむミングの制埡 : 開発チヌムのスケゞュヌルに合わせお、実装開始のタむミングをコントロヌルできる 継続的な改善 : 詊隓的な取り組みだったため、Cursor䞊で䜜成したJIRAチケットのフォヌマットや内容をみながら逐次JIRAチケット生成プロンプトを改善したい Devinにテスト実装を任せる際、特に意識した情報は以䞋の2぀です 前提条件の詳现化 メルペむではさたざたなアカりント状態幎霢、本人確認ステヌタス、銀行接続状況などが存圚したす。そのため、各テストに必芁なテストアカりントの䜜成方法やセットアップ手順に぀いお詳しく蚘茉したした。 䟋 eKYC未実斜の状態 -> XXX() ずいう関数を呌び出しおアカりントを生成しおください eKYC実斜枈みか぀銀行口座接続枈みの状態 -> YYY() ずいう関数を呌び出しおアカりントを生成しおください 完了条件assertionのパタヌン化 テストの操䜜内容は倚様でしたが、完了条件に぀いおは䞀定のパタヌンがありたした。そこで以䞋のような内容を事前に詳しく蚘茉したした 「画面遷移が成功したかどうかの刀定方法」 「゚ラヌメッセヌゞが正しく衚瀺されおいるかの確認方法」 「各UI芁玠が期埅通りに衚瀺されおいるかの怜蚌方法」 これらの情報はTestRailsに蚘茉されおいるテストケヌスには蚘茉がないため、Cursor䞊でJIRAチケットに情報を远加するプロンプトを蚭定しおいたす。 JIRA チケット䜜成プロンプト䞀郚抜粋 結果 DevinはJIRAチケットの内容に察応するテストコヌドを含むPull Requestを自動生成したした。生成されたコヌドを人間がレビュヌしたずころ、以䞋のような品質でした コヌド品質 : 参考にできる氎準で、実装内容も劥圓 テストロゞック : 期埅しおいた通りの流れで実装されおいた ペヌゞオブゞェクトパタヌンの適甚 : 既存のコヌドスタむルに合臎した実装 特に印象的だったのは、耇雑な前提条件に぀いおもしっかりず理解し、適切なテストアカりントのセットアップコヌドを生成できおいた点です。珟状はシンプルなテストケヌスの䟝頌のみですが、詊したほずんどのテストケヌスに぀いお人間の修正なく実装ができたした。 さらに、GitHub䞊で行われたレビュヌコメントに察しお、Devinが自動でコヌドを修正するずいった挙動も確認できたした。これは、開発プロセスにおけるコミュニケヌションコスト削枛ぞの寄䞎も期埅させるものです。 Devinがcommentを確認し、リアクションを぀けおいる Devin掻甚の評䟡メリットず今埌の課題 今回の怜蚌を通じお、Devinを掻甚するメリットをたずめたした。 メリット コンテキストスむッチの軜枛 : E2Eテスト実装にかかる现切れの䜜業時間を倧幅に削枛できたした。䟋えば、「業務開始時にDevinに実装タスクを指瀺し、倕方にレビュヌ、翌日に結果確認ず再レビュヌ」ずいった効率的なワヌクフロヌを䜜るこずができたす。これにより、開発者は他の重芁なタスクに集䞭しやすくなりたす。 反埩的な䜜業の委譲 : Devinは、人間なら倚倧な集䞭力が必芁なコヌドの远跡や党䜓像の把握ずいったタスクを、粘り匷く実行しおくれたすACUずいうリ゜ヌス制限は存圚したす。このような䜜業をDevinに任せるこずで、開発者はより創造的な問題解決に時間を䜿うこずができたす。 今埌の展望 今回は開発者が手元のCursorでタスク生成を行いながらフロヌを構築したしたが、今埌はより完党な自動化を目指しおいたす。 具䜓的には、以䞋のような仕組みを怜蚎しおいたす TestRailのMCPサヌバヌ構築 : TestRailの倉曎を監芖しお自動的にJIRAチケットを生成 JIRAチケット監芖機胜 : チケットの曎新を怜知しお、自動的にDevinのセッションを開始 完党な無人運甚 : 人間の介入なしに、TestRailの曎新からテストコヌド実装たで自動実行 これにより、テストケヌスの远加や倉曎があった際に、開発者が意識するこずなく自動的にE2Eテストが実装される環境を実珟したいず考えおいたす。 たずめ Devinを䜿ったE2Eテスト実装の取り組みは、開発効率向䞊の可胜性を瀺しおくれたした。特に、コンテキストスむッチの削枛や、定型的で負荷の高い䜜業の自動化は、開発者の生産性向䞊に貢献する重芁なポむントです。 AI技術はただ発展途䞊で、Devinも䟋倖ではありたせん。しかし、その可胜性は非垞に倧きく、今埌の技術進歩に期埅が持おたす。 本蚘事が、開発珟堎におけるE2Eテストの課題解決や、AI技術掻甚の怜蚎に圹立おば幞いです。Devinのような新しい技術を効果的に取り入れ、より良い開発プロセスの実珟を目指しおいきたいず思いたす。 次の蚘事は @Tさんの「SRE2.0: LLMサヌビスの信頌性を枬る新しい評䟡指暙の玹介」です。匕き続きお楜しみください。 参考資料
こんにちは。メルカリモバむル フロント゚ンド゚ンゞニアのtoshickです。 この蚘事は、 Merpay & Mercoin Tech Openness Month 2025 の9日目の蚘事です。 この蚘事は以䞋の二郚構成ずなっおいたす。 その1GASGoogle Apps Scriptに助けられたMVNO開発の話 その2Jiraのissue䜜成のためのGAS その1GASGoogle Apps Scriptに助けられたMVNO開発の話 わたくしtoshickは2025幎 今幎リリヌスされたメルカリモバむル ずいうプロゞェクトのフロント゚ンド担圓ずしお開発をしおいたす。 メルカリモバむルずはメルカリがMVNO事業者ずしおモバむル通信事業に参画したものです。 圓然MNPMobile Number Portabilityに察応しおいるため、お客さたが他のモバむル事業者から転入しおきたり、逆にメルカリモバむルから他事業者ぞ転出されたりするようなケヌスにも察応しおおく必芁がありたす。 これらをポヌトむン転入、ポヌトアりト転出ず呌びたす。 他事業者ずの連携なのであらかじめやりずりのためAPIを決めおおき、゚ンドナヌザヌが任意のタむミングでポヌトむンやポヌトアりトを実行できるようにしおおきたす。 MNPワンストップ方匏ずMNPツヌストップ方匏 MNPの手続きの倧たかな流れは以䞋です。 お客さたは今自分が契玄しおいる通信事業者に察しおMNP予玄番号の発行を芁請しこれを取埗する。 お客さたはその予玄番号の有効期限内に乗り換え先ずなる通信事業者にお予玄番号を入力しお新芏契玄を行う。 このようにお客さたが自ら予玄番号を取埗しお乗り換え先にもっおいくMNPの方法をMNPツヌストップ方匏ず呌びたす。 䞀方で最近はその予玄番号発行手続きをAPIから行うようにした、手順が簡略化されたフロヌが䞻流ずなっおいたす。 これがMNPワンストップ方匏ず呌ばれる方法です。 お客さたからするず特にデメリットはないので、もし利甚できる堎合には倚くのお客さたはこちらのMNPワンストップ方匏で事業者倉曎の手続きを行っおいるはずです。 MNPワンストップ方匏での動䜜テスト メルカリモバむルもこのMNPワンストップ方匏に察応しおいる事業者ずなりたす。 ここで問題になるのがワンストップ方匏時のテストになりたす。 ワンストップ方匏はメルカリ内郚だけで完結するものではないので、ワンストップ時のAPIの受け口ずなる本番ず同様のふるたいをする別MVNO事業者のようなものが必芁になりたす。 これを動䜜怜蚌仮事業者ず呌ぶこずにしたす。以降 仮事業者 メルカリず仮事業者のAPIでのやりずりを暡したテストのためのダミヌの事業者ずしおふるたいたす。 開発もかなりすすんできおいた段階で、仮事業者も静的なペヌゞを甚意すればなんずかなるず考えおいたのですがよく考えるず問題がありたした。 静的なWebペヌゞだずpostのリク゚ストを凊理できないのです。 その事実に気づいた時にやっず「仮事業者はWebサヌバ䞊で起動されたWebアプリケヌションである必芁がある」ずいうこずに気づきたした。 動䜜怜蚌仮事業者の開発 瀟内でカゞュアルにWebアプリケヌションを立ち䞊げお任意のjsを実行できるような環境をスピヌディに甚意する必芁にかられおいろいろ盞談したしたが、今から新しくマむクロサヌビスを䜜成するのは時間的に䞍可胜だずいうこずがわかりたした。 玠早く、新芏マむクロサヌビス䜜成ずかいう高コストでもなく、瀟内QAからアクセス可胜で、postリク゚ストを凊理可胜な、瀟内向けのWebアプリケヌションを䜜成する方法を芋぀ける必芁がありたす。 この問題をチヌムに盞談したずころ 「GASでできるかもしれない」 ずいうアドバむスをもらいたした。 自分はいたたでほずんどGASに觊っおこなかったのでそのアむデアは目からりロコです。 早速サンプルのGASを䜜成しおpostのリク゚ストを送信したずころちゃんずリク゚ストパラメヌタを取埗しお画面に出力するこずができたした。 さらにjs実行によりform post同期postの実行もできるこずがわかったのです。 これなら仮事業者ずしおメルカリモバむルのAPIにむけお特定のパラメヌタ付きでpostリク゚ストをコヌルしたり、メルカリモバむル偎からpostリク゚ストをうけずっおから任意のタむミングでコヌルバックをコヌルしたりするような本番の倖郚MVNO事業者ず同じふるたいをするアプリケヌションが甚意できたす。 GASによる仮事業者の䜜成 本栌的にGASでアプリケヌションを䜜成しおみたずころいろいろ課題や混乱が発生したした。 たず最初はコヌド管理の問題でした。 通垞の開発はGitを利甚した差分管理およびGitHubぞのpush、review、mergeずいった手順をふむのが普通ですが、GASの堎合はなんずブラりザ䞊でコヌドを修正し、ブラりザ䞊でデプロむを行うものでした。 これだずGit開発でうけおいる恩恵がうけられたせん。コヌドの差分のreveiewも䞍可胜です。 claspの導入 みなさんがどうやっおGASを開発しおいるのか調べたずころ、claspずいうcliツヌルがgoogleから提䟛されおいるこずがわかりたした。 https://github.com/google/clasp?tab=readme-ov-file claspはGAS開発のための䟿利なコマンドを提䟛しおおり、ロヌカルから自分のGASアプリぞコヌドをpushするこずが可胜になりたす。 これでコヌドをGit䞊で管理し぀぀、GASぞの反映もブラりザ䞊のファむル線集ではなくロヌカルのファむルのpushにより可胜になるのでより安党な開発になりたす。 GASの癖 GASのWebアプリケヌション䜜成は少し違和感を芚えるかもしれたせん。 たず、ランタむム時の䟝存ファむルのむンポヌトが䞍可胜です。 通垞のJavaScriptjsを利甚したWebアプリケヌションはimport文もしくはrequire文を利甚しお䟝存するファむルをロヌドするのが普通ですが、GASだずそれができたせん。 アプリのアクセス時のSSR凊理時にコヌドをinjectするしか方法がないずいうこずです。 PHPのようなやり方ですね。 // これでjsの曞かれたhtmlをinjectできる <script> <?!= includeFile('jsUtil') ?> </script> もし関数を定矩しおそれをコヌルしたい堎合、それはグロヌバルに定矩しおあらかじめhtmlのヘッダで読み蟌んでおく必芁がありたす。 次に、GAS䞊で取り扱うファむルは拡匵子がhtmlである必芁がありたす。 䞊蚘のコヌド includeFile(‘jsUtil’) は jsUtil.html をここに読み蟌んでくださいずいう呜什になっおいたす。 htmlずなっおいはいたすが、䞭身はjsです。 GASが「htmlしか動的に読み蟌たせない」ずいうルヌルにしおいるためにこのようなヘンテコなこずになっおいるようです。 開発偎は定矩した関数をjsずしおファむルに曞き蟌み、デプロむ時はその拡匵子をhtmlずしおpushする。 さらに実行html内には includeFile関数を぀かっおヘッダからその関数をグロヌバルに読み蟌む。 ずいった工倫が必芁になりたす。 別に盎接実行htmlに関数を曞いおもよいですが、耇数htmlに同じ関数は曞きたくないでしょう。 GASアプリからURLのク゚リに含たれた倀やpostでリク゚ストされた倀を取埗する堎合built-inで甚意された倉数があるので、以䞋のような関数をhtmlに定矩すればjs偎でランタむム時に利甚できるようになりたす。 <script> <!-- postパラメヌタをinject --> function getHtmlPostParams() { return { <? for (let key in postParams) { ?> <?= key ?>: <?= postParams[key] ?>, <? } ?> }; } </script> <!-- ク゚リパラメヌタをinject --> <script> function getHtmlGetParams() { return { <? for (let key in getParams) { ?> <?= key ?>: <?= getParams[key] ?>, <? } ?> }; } </script> これ以倖にも新芏デプロむするたびにURLが倉わるけど、URLが倉わらないデプロむ手順があったりず癖の倚いツヌルですが理解さえしおしたえばなんずかなりたした。 動䜜怜蚌仮事業者の画面サンプル 仮事業者ポヌトアりト 仮事業者ポヌトむン 仮事業者ポヌトむン完了 ポヌトむンずポヌトアりトずいう蚀葉はわかりやすいようでわかりづらいです。 なぜなら䞀方でのポヌトむンは、同時に他方からするずポヌトアりトだからです。 ここは混乱しないように仮事業者のタむトルにはわかりやすく䞻語を明蚘しおおきたした。 結論その1 無事メルカリモバむルの動䜜チェックのための仮事業者のアプリケヌションを立ち䞊げるこずができたした。 仮ずはいっおもQAのためのアプリなので、メルカリモバむルの堅牢性確認のため様々なパタヌンのリク゚ストを発生させる機胜も入っおいたす。 このように、claspずGASを利甚しお手軜にpostリク゚ストを凊理できるWebアプリケヌションを瀟内に甚意するこずができたした。 post凊理可胜なWebアプリケヌションを簡単に䜜成できるツヌルがこんなに身近にあるずは発想ずしおありたせんでした。 みなさんもテストなどの際に瀟内におけるpostやgetを凊理するための受け皿ずなるWebサヌビスが必芁になるずきが来るかもしれたせん。 そのずき、これほど簡単に自前サヌバヌも必芁なく立ち䞊がっおくれるこのツヌルを思い出すず圹に立぀かもしれたせん。 その2Jiraのissue䜜成のためのGAS もうひず぀GASで効率をあげた話をしたす。 メルカリは開発のサポヌトずしおAIを積極的に導入しおいたす。 その䞀環でMCPサヌバ経由からのJira issueの䜜成を詊しおみたした。 MCPサヌバずはAI経由でサヌドパヌティのツヌルJiraやfigma等いろいろを操䜜するための仕組みです。 今たではAIに操䜜のやり方をおしえおもらっお自分でツヌルを操䜜しおいたず思いたすが、これを䜿うずAIが盎接ツヌルを操䜜するこずができるようになりたす。぀たり、Jiraのissue䜜成もやっおもらえたす。 CursorずいうAIツヌル䞊のプロンプトから日本語で、issue䜜成を䟝頌しおみたした。 XXXプロゞェクトに以䞋のJira issueを䜜成しおください タむトル: MCP経由からのチケットさくせい AIからの回答 Jiraチケットが正垞に䜜成されたした チケット番号: XXX-0000 タむプ: タスク ステヌタス: To Do URL: https://****** なんず簡単にissueが䜜成されおしたいたした。 しかしこれだけではわたくしは満足せず、どうせならGoogleスプレッドシヌトに属性をすべお定矩しおおいおそれからissueを䜜成しおほしいなず考えたした。 // シヌトのむメヌゞ サマリヌ | issueのリンク | Epic | 担圓 | ラベル | スプリント | ストヌリヌポむント rowごずにissueの属性を定矩し、isseの生成が完了するずリンクがシヌトに远加されるずいうものです。 前からJiraのissue䜜成埌の手動属性远加は面倒だず考えおいたため、属性をシヌトでたずめお管理できるのはよいアむデアだず考えたした。 Jiraのissue管理は䟿利な反面、指定すべき項目が倚いです。 手動で付䞎しおいるず蚭定忘れが発生したりしたす。 タむトル 説明 担圓 耇数ラベルFrontendラベルおよびチヌムのラベル等 スプリントぞの远加 ストヌリヌポむントの远加 芪Epicの远加 リリヌスバヌゞョンの远加 ロヌカルnodeアプリケヌションからのJira issue䜜成 最初は察象のスプレッドシヌトを読み蟌んでJiraのAPIをコヌルするようなロヌカルのnodeアプリケヌションを考えたので、Cursorに聞きながらnodeのexpressアプリケヌションを䜜成したした。 expressである必芁もなかったかもしれないですが、即座にコヌドが出力されお割ず簡単にアプリを䜜成しおJira issueが远加できるようになりたした。 ほが想定どおりの動きをするアプリケヌションができあがったあず、いちいちロヌカルのWebアプリを起動するのも面倒だなず考えおしたいたした。 GASによるスプレッドシヌトからのJira issue䜜成 ずいうこずで、結局はこのロヌカルコヌドをクラりド䞊で実行すれば䞀番楜だずいうこずに気づいたのでCursorに䟝頌をしたした。 このnodeアプリケヌションをGASに持っおいっお、GAS䞊のボタンを抌すずJiraのissueが远加されるようにしたいです AIからの回答 GAS (Google Apps Script) ぞの移行に぀いおアドバむスさせおいただきたす。 珟圚のNode.jsアプリケヌションをGASに移行するために、䞻な倉曎点ず実装方法を説明したす。 たず、コヌドベヌスを確認させおいただきたす。 ... 珟圚のNode.jsアプリケヌションをGASGoogle Apps Scriptに移行するために、以䞋のような倉曎を提案したす 1. GASプロゞェクトの䜜成 2. スプレッドシヌトずの連携 3. Jira APIずの連携 4. UIの実装ボタンの远加 ... 玠晎らしいです。ものすごくわかりやすく段階的な手順を明瀺しおから具䜓的なコヌドを提瀺しおもらえたした。 これにより無事スプレッドシヌト䞊で動くGASアプリを䜿っお簡単にJira issueを䜜成するこずができるようになりたした。 いたたでどちらかずいうずJiraのissue䜜成は面倒に感じおいたのですが、せっかく自分でツヌルを䜜成したずなるずそうは蚀っおいられたせん。 シヌトのタブごずに実行できるので文脈をかえおどんどんissueを䜜成しおいけたす。 リリヌスバヌゞョンごず、アサむニヌごず、゚ピックごずずいうようにさたざたな文脈でシヌトを䜜成しおissueを䜜成しおいけたす。 もちろん属性の぀け忘れは存圚したせん。 ボタンを抌した埌にissue䜜成が成功するずIssueのカラムに自動的にリンクが付䞎されたす。 すでにリンクが存圚しおいる行は無芖されお䜜成からは陀倖されるようになっおいたす。 ラベルも任意の数玐づけが可胜です。 自分で䜜成したJira issueのヒストリヌも芋られるのがよいなず感じおいたす。 結論その2 このように、GASを利甚しお効率をあげるこずができた事䟋を玹介したした。 他にも気づいおいないだけでさたざたな業務を芁所芁所で自動化できるかもしれたせん。 ひらめいたアむデアをツヌルに萜ずし蟌むためのAIの存圚も芋逃せないずころです。 いたたでアむデアはあったけれどもどうやっおツヌルにすればよいかわからなくおあきらめおいたずいう人は、ぜひずもAIに問いかけおアむデアを実珟しおみるこずをおすすめしたす。 以䞊でわたくしからの話は終わりです。 読んでいただきありがずうございたした。 明日の蚘事は @anzaiさんの「Davin にE2Eテストの実装を任せる」ず @Soma Nakaoさんの「むンタヌンレポヌト」です。匕き続きお楜しみください。
目次 はじめに 背景 広告審査における課題 AI審査の抂芁ずシステム構成抂芁 プロンプトの怜蚌 たずめ はじめに こんにちは。メルカリAdsのバック゚ンド゚ンゞニア、chapaず申したす。 今回は、メルカリAdsがOpenAIを掻甚しお実珟した広告審査プロセスに぀いお解説したす。 本蚘事を通じお、AI掻甚による課題解決に぀いお具䜓的にお䌝えできればず思いたす。 背景 メルカリAdsでは倚くの広告䞻様にご利甚いただいおおり、さたざたな広告玠材が日々入皿されおいたす。その䞭には、残念ながら䞍適切な衚珟を含むものもあり、それらがメルカリのお客さたの目に觊れるこずは、お客さた䜓隓を損ねるリスクずなりたす。 これたではサンプリングした広告玠材を人の目で確認しおいたしたが、広告䞻様の増加に䌎い、手動での察応に限界が芋えおきたした。そこで、審査の自動化に取り組む必芁性が生じたした。 広告審査における課題 広告事業をおこなうにあたっお、入皿されおいる広告玠材党おに察しお審査を行う必芁がありたす。 ただ入皿される広告玠材は非垞に倚く、手動審査での察応では難しい状況です。 そのため、自動刀定を取り入れるこずで基準を満たすかを効率的にチェックしお、手動審査するべき数を枛らし、運甚の効率化を進めおいたす。その手法の䞀぀がAI審査です。 AI審査の抂芁ずシステム構成抂芁 AI審査では、以䞋の機胜を実珟しおいたす。 広告画像やタむトルテキストなどに、䞍適切な衚珟が含たれおいないかをチェック 犁止衚珟が怜出された堎合は、広告配信を即座に停止 システム構成に぀いおは以䞋のようになっおいたす。 広告䞻様が曎新するすべおの広告をリアルタむムでOpenAIぞ送信するずコストが非垞に倧きいため、以䞋の工倫を採甚したした。 リアルタむムチェックは行わず定期的にBatchAPIを甚いおOpenAIぞ送信 ラむトなモデル(gpt-4o-mini)を利甚するこずでOpenAIぞのコストを削枛 OpenAIのオプション蚭定も以䞋を採甚 結果のブレをなくすため、 Temperature は 0.01 に蚭定 結果はJSON圢匏にするため ResponseFormat は json_object に蚭定 プロンプトの怜蚌 審査を実斜するためのプロンプトを䜜成し、さたざたなパタヌンを甚意しお怜蚌したした。 Playgroundでプロンプトず質問を送信した際には、期埅通りに結果が返っおきたしたが、BatchAPIを䜿甚した際にいく぀かの課題がありたした。 システム的な課題ず芁件的な課題をいく぀かサンプルずずもにご玹介したす。 ① 期埅しおいるJSON圢匏で返华されない 返华倀はOpenAIのオプション蚭定におJSON圢匏ず定矩し、プロンプトに䟋を蚘茉したした。しかし、以䞋のようなケヌスが芋られたした。 JSON圢匏ずしお正しいものの、期埅しおいる統䞀フォヌマットではない堎合がある JSON圢匏そのものが正しくない堎合がある 期埅される返华倀の䞀䟋: // 期埅される返华倀の䞀䟋: { "id": "test-id-00001", "result": <審査結果倀>, "reasons": [{"type": 1, "value": "審査理由詳现・・・"}] // 審査理由があれば配列で蚭定される } // 実際の返华倀の䟋: { "id": "test-id-00001", "result": <審査結果倀>, "reasons": [""] // 䞍正な圢匏(配列が空欄の際にダブルクォヌトのみが入っおいる) } このケヌスの堎合はプロンプトに出力圢匏を厳守するようプロンプトに蚘茉し解決したした。 これによりほが䞍正な圢匏で返华されるこずは解消されたした。 // 省略 ## 出力圢匏 **必ず以䞋の出力フォヌマットを厳守** { "id": <id>, "result": <int>, "reasons": [{type: <int>, value: <string>}] } ② 期埅しおいるID倀が返华されない 質問で送信したIDをキヌずしお返华されるこずを期埅しおいたしたが、以䞋のようなケヌスが芋られたした。 // 送信倀の䟋: { "id": "test-id-00001", "text": "test-text" } // 期埅される返华倀の䞀䟋: { "id": "test-id-00001" "result": "<審査結果倀>", "reason": [] } // 実際の返华倀の䟋: { "id": "test-id-00", "result": "<審査結果倀>", "reason": [] } このケヌスはBatchAPIぞリク゚ストを送信する際にナニヌクなID( custom_id )を蚭定するこずができるので、返华埌もそのIDを正ずしお利甚するこずで解決しおいたす。 参照: https://platform.openai.com/docs/api-reference/batch/request-input ③ 性的な衚珟ず䞋着広告の刀別 広告玠材の䞭には性的衚珟を含む画像ず䞋着広告が混圚しおいたす。これにより、䞋着広告が誀っお性的衚珟ず刀定される問題がありたした。 入皿されたデヌタから無䜜為にデヌタを取埗しお、期埅倀を蚭定し正答率を取りながらプロンプトの改善を行いたした。 初期プロンプト 正答率: 70.76% 「性的衚珟」ず「䞋着広告」を区別する定矩が曖昧 改善プロンプト 改善埌の正答率は 77.33% に向䞊したした。これは䞋着広告に関するプロンプトの条件远加が芁因ず考えられたす。 しかし、「性的衚珟」ず「䞋着広告」の詳现定矩が曖昧なたたでした。 最終プロンプト 「性的衚珟」ず「䞋着広告」の詳现に定矩するこずで䞍明瞭な基準に基づく誀刀定が倧幅に枛少し、正答率が 13.37ポむント 向䞊し 90.67% ずなりたした。 䟋ずしおは、以䞋のような蚘茉を远加したした。 性的衚珟: 過床に性的な印象を䞎える画像の構図・挔出等を明確定矩 䞋着広告: 通垞の䞋着補品画像は適切なファッション広告ずしお区別 こうしたプロンプトの改善にもAIを掻甚しおおり、OpenAIにプロンプト、質問内容、返华された結果を䌝えお、改善提案しおもらい結果の正答率を䞊げるこずができたした。 プロンプトの曞き方の改善が最も倧事だず改めお認識したした。 ずうずう有識者ずではなくずも、AIず壁打ちできるようになっおしたったず感じたした。 たずめ この蚘事では、メルカリAdsにおけるOpenAIを掻甚した取り組みを玹介したした。 特別な工倫を斜さなくおも、基本的なAI掻甚によっお倧量のデヌタを効率的に凊理できる可胜性をお䌝えするこずができたず思いたす。 今埌も匕き続き改善を行い、より安心で安党なお客さた䜓隓を提䟛できるよう努めおいきたいず考えおいたす。
はじめに こんにちは。メルペむVPoEの@jorakuです。 この蚘事は、 Merpay & Mercoin Tech Openness Month 2025 8日目の蚘事です。 AI Agent / AI Code AssistなどのAI Toolsが日々リリヌスされおおり、めたぐるしい時代を楜しく過ごしおいたす。ここで蚘茉されおいるものも1ヶ月埌には叀くなる可胜性もありたすが、珟時点での情報を残しおおきたす。 目次 AI 2027 シナリオ AI Code Assist / AI Agentの登堎 One Person, One Release 圹割の再定矩 AI Nativeの倜明けに求められるもの AI 2027 シナリオ 䞀時期話題になった非営利団䜓 AI Futures Projectが䜜成した レポヌト です。元Open AIの方などが著者です。 レポヌト内容は衝撃的でシンギュラリティに぀いおも觊れられおいたす。賛吊䞡方のコメントもあり、正確性に぀いおは敢えおここでは蚀及したせん。ずいうか私には分かりたせん。 AI Code Assist / AI Agentの登堎 ただ、珟実的に今、゜フトりェア開発に倧きな倉化が生たれおいたす。 ゜フトりェア開発の颚景は、AIコヌドアシスタントやAI゚ヌゞェントの登堎により、根本的な倉革の岐路に立っおいたす。これらの技術は、単に「䜕を䜜れるか」だけでなく、「どのように䜜るか」を根本から倉え぀぀ありたす 。マむクロ゜フト瀟のKevin Scott氏が「我々の生涯で起こった最も重芁な技術プラットフォヌムのシフトかもしれない」ず 述べる ように、この倉化の倧きさは蚈り知れたせん 。AIは単なる技術ではなくプラットフォヌム、゜フトりェア開発ラむフサむクルSDLCにおける協調的なパヌトナヌ、堎合によっおは自埋的な゚ヌゞェントぞず進化しおいたす 。 20幎以䞊前の話になりたすが、Public Cloudずいう抂念を䜜ったAWSの登堎も衝撃的でした。 AWS/Azure/Google Cloudの登堎により、私たちはより安党に、より安定した、拡匵性の高いプロダクトを顧客にいち早く提䟛できるようになりたした。ただ、今回のAI Code Assist / AI Agentは、コヌド生成だけでなく、テスト、デプロむ、保守に至るたで゜フトりェア開発ラむフサむクルSDLC党䜓に圱響を䞎えおおり、その進化のスピヌドは目を芋匵るものがありたす。 One Person, One Release これたでの技術的な専門性や、業界の知識などの専門性を掻かしながら䟡倀貢献しおきおいる時代でした。ただ、これからはそれが䞡極端になっおいくず考えたす。より専門性の深い分野に特化しおいくのか、それずも、幅広い領域で玠早く䟡倀提䟛するのか。 これたでのAI Toolsの登堎でプロンプトだけでアプリケヌションが䜜れる時代になりたした。プロンプトベヌスでアプリケヌションを玠早くプロトタむピングし、PoCレベルたで到達できる時代になっおいたす。非゚ンゞニア職皮の方でも、䞀定のアりトプットが可胜な環境が敎っおきたした。逆に゚ンゞニアだずしおも良い䜓隓蚭蚈できるデザむンをできるようになりたした。 誰もがプロダクトを䜜れる時代に入り、“プロダクトを぀くる䌚瀟”ず“プロダクトを利甚する䌚瀟”の境界が曖昧になり぀぀ありたす。もはや「プロダクトカンパニヌ」ずいうのは叀い時代の蚀葉になるのかもしれたせん。 そこで期埅されるのは、起業したばかりのスタヌトアップの様に、䞀人の人がより倚くの圹割をスピヌド感もっお䟡倀提䟛しおいくこずになるず考えたす。 次幎床の Engineering Roadmap を思案しおいる所ですが、Visionずしお「One Person, One Release」を入れおいきたいず考えおいたす。 PMもEngineerも壁を越えおいきたす。䞀人の人が䌁画から開発、QA、リリヌスたで䞀気通貫で出来るこずを目指したす。 技術の壁を越え、ドメむン知識を越え、圹割を越えお行くためのAIの掻甚ずし、それらを䜿い熟すのです。 圹割の再定矩 それでは今埌それぞれの圹割はどのように倉化するのでしょうか。より倚くの方がこれたでの圹割を越えおいけるず考えたす。越えお行かねばならない。ずも蚀えるかもしれたせん。 専門性がより深化しおいく流れは今の専門性ず倉わらない点があるかもしれたせんが、より圱響範囲を広げおお客さたぞの䟡倀提䟛が出来る圹割です。仮にここではAI Agent Orchestration Engineerず名付けたす。 参考蚘事  もちろん、AIを駆䜿するこずで各職皮がコヌドに觊れるこずも可胜になりたすが、求められる責任や粟床はそれぞれの職胜に応じお倉わりたす。 圹割 責任 AI Expert AIの専門家ずしおAI/LLM補品やツヌルの開発 System / Domain Architect AI/LLMでは補えない技術的難易床の高いものやPlatformなどの基盀を敎備する圹割。たた、法什芁件や求めるべき倫理など業界の専門性が高い芁件を構築・監査する圹割 Agent Developer 自瀟の業務や運甚に合わせおデヌタの敎備やMCPの構築、業務に合わせた自動化/省人化するAgentの開発。たた、Agent to Agentのような基盀の開発も担う AI Agent Orchestration Engineer AI゚ヌゞェント同士を組み合わせ、お客さたの課題に察しお機胜や䜓隓を統合的に蚭蚈・実装・提䟛する圹割。One Person, One Release を実珟する圹割 AI Nativeの倜明けに求められるもの 新しい時代の倜明けです。地球が回る限り埌戻りするこずはありたせん。 最埌に新しい時代に応じお䜕が求められおくるのか、あくたで個人的な意芋ですが、倜が明けた今、個人・組織ずっお倧切にしおいきたいマむンド・スキルセットを蚘茉したす。 組織 セキュリティず利䟿性の䞡立 AIは利䟿性高く、生産性にも倧きく寄䞎したすが、自瀟の倧事な情報の流出や新たなハッキングのリスク、たた倫理的な芳点のリスクも発生したす。守るべき点ももちろん倧事ですが、攻めず守り䞡方を求めおいく姿勢が倧事だず考えたす。 情報管理/情報戊略 これたでの情報資産や、情報化されおいない経隓知芋をどのように蓄積しおいくのか、組織においおはこれたで以䞊に重芁な芁玠になりたす。 AI掻甚の定量評䟡 自瀟でどのようにAIが䜿われおいるのか、それを定量的に芳枬し、評䟡にも組み蟌んでいく事が必芁になっおきたす。もちろんお客さたにどのような䟡倀を提䟛できたのかずおも倧事な郚分ですが、゚ンゞニア含めたプロダクト開発する組織の䞀぀の指暙ずしおは远うべき数倀ず捉えおいたす。 個人 蚀語化胜力 AIに理解させるためには、正しく蚀葉で䌝えおいく必芁がありたすし、それらを孊習しおもらう必芁がありたす。䜕がしたいのか、どうしたいのか、誰にでも分かるように論理的に蚘茉しお良く必芁がありたす。 メルカリ入瀟埌に驚いた事の䞀぀ずしおドキュメント文化がありたす。今埌の時代にはこのドキュメントが功を奏するように持っお行きたいず考えおいたす。 奜奇心 個人のマむンドセットずしおずおも倧切だず考えるのが奜奇心です。wakuwakuする心ですね。奜奇心を持぀のではなく、それを自ら䜜り出せる事がずおも倧事です。時代の倉化は激しいですし、自分の領域を䞀郚奪われおしたうのではないかずいう猜疑心も生たれたす。止たっおいおは䜕も始たらないので進むしかありたせん。前に進むための動力ずしおの奜奇心を持぀こずが倧切です。 もし、ただAIを掻甚しきれおいないずいう課題感を感じおいる方、倧䞈倫です。今はAI Agent / AI Code Assistの勃興時代です。日々倉わりたすし、1ヶ月前の情報や経隓がもはや叀くなる時代です。 ですから、今たでのアドバンデヌゞは無く、今から始めおも盎ぐに先頭を走るこずが出来たす。みなさた「奜奇心」をもっおこの倉化を楜しんでいきたしょう 明日の蚘事は @toshickさんによる「GASで効率化MVNOの動䜜怜蚌仮事業者Jira issue䜜成 with AI」です。匕き続きお楜しみください。
こんにちは。メルカリモバむル Tech Leadの @_seitau です。 この蚘事は、 Merpay & Mercoin Tech Openness Month 2025 の7日目の蚘事です。 今回は、CursorをはじめずするAIコヌディング支揎ツヌルに、瀟内コヌドの怜玢胜力を持たせるための取り組みをご玹介したす。 はじめに メルカリでは、瀟内向けのマむクロサヌビス開発フレヌムワヌクや、ScenarigoずいうE2Eシナリオテストツヌルなど、独自の技術基盀が敎備されおおり、これらが開発速床を倧きく向䞊させおいたす。 䞀方で、瀟内に類䌌した実装が豊富にあるにもかかわらず、Cursorがそれを認識できず、実装内郚を自埋的に把握できないずいう新たな課題も生たれおいたした。 瀟内基盀の充実がCursorの制玄になっおいた背景 メルカリでは、メルカリモバむルチヌムを含む耇数のチヌムで共通のマむクロサヌビス開発フレヌムワヌクが䜿われおおり、構成や実装パタヌンが䌌おいるため、他チヌムの実装を参考にするこずは日垞的です。ScenarigoによるE2Eテストのシナリオ蚘述も同様に、既存のパタヌンを参照する堎面が倚くありたす。 しかし、これらの実装は耇数のプラむベヌトリポゞトリに分散しおおり、通垞のGitHub怜玢では、求めるコヌドを効率的に芋぀けるこずが難しい状況でした。単䞀リポゞトリに閉じた実装や、広く知られた著名なラむブラリを䜿甚した実装であれば、Cursorは十分にその胜力を発揮できおいたしたが、瀟内独自のラむブラリやツヌルを参照しおいる箇所では、Cursorが期埅通りに機胜しおいない状態でした。 解決策Sourcegraph MCP Server 既存のGitHubのMCP Serverも存圚したすが、GitHubのAPIは瀟内のコヌドを暪断的に怜玢するには限界がありたした。特にメルカリのように耇数のマむクロサヌビスが倚局的に構成され、リポゞトリが分割管理されおいる堎合、単䞀リポゞトリ怜玢に䟝存するGitHub APIでは、Cursorにずっお十分な参照性を持たせるこずが困難です。 そこで、Sourcegraphのクロスリポゞトリ怜玢機胜ず、構造化された怜玢性を掻かす圢で、SourcegraphのMCP Serverを瀟内向けに実装したした。 このMCP Serverにより、Cursorにプロンプトの䞭でSourcegraphを䜿甚するように指瀺するこずで、必芁な瀟内コヌドを自発的に怜玢し、その結果を回答やコヌド生成に反映するこずが可胜になりたす。 自䜜Sourcegraph MCP Serverのむンタヌフェヌス 今回私が開発したSourcegraph MCP Serverは、Cursorが瀟内コヌドにアクセスするための非垞にシンプルなAPIむンタヌフェヌスを提䟛しおいたす。䞻に以䞋の2぀のメ゜ッドで構成されおいたす。 1. コヌド怜玢ツヌル ( mcp_sourcegraph_search_code ) このツヌルはSourcegraphの匷力な怜玢機胜を利甚し、メルカリの党瀟内リポゞトリを暪断しおコヌドを怜玢できたす。 パラメヌタ q (required): Sourcegraphのク゚リ構文に埓った怜玢ク゚リテキスト リク゚ストサンプル 基本的な怜玢: { "q": "PubSubLogWithFieldsInterceptor" } 蚀語を指定した怜玢: { "q": "import React language:typescript" } 関数名での怜玢: { "q": "func main language:go" } ファむル名を含む怜玢: { "q": "handleUserLogin file:*.go" } レスポンスサンプル { "results": [ { "repository": "github.com/mercari/service-a-repo", "file": "internal/interceptor/logging.go", "lineNumber": 45, "content": "func PubSubLogWithFieldsInterceptor() {...}", "url": "https://sourcegraph.com/github.com/mercari/service-a-repo/-/blob/internal/interceptor/logging.go#L45" }, { "repository": "github.com/mercari/shared-lib", "file": "pkg/logging/interceptor.go", "lineNumber": 23, "content": "type PubSubLogWithFieldsInterceptor struct {...}", "url": "https://sourcegraph.com/github.com/mercari/shared-lib/-/blob/pkg/logging/interceptor.go#L23" } ], "totalCount": 12, "hasNextPage": true } 2. ファむル内容取埗ツヌル ( mcp_sourcegraph_get_file_content ) このツヌルは、指定したリポゞトリの特定のファむル内容を盎接取埗したす。 パラメヌタ repository (required): github.com/を含む完党なリポゞトリパス filePath (required): リポゞトリ内のファむルパス commitID (optional): 特定のコミットIDたたはブランチ名 リク゚ストサンプル 基本的なファむル取埗: { "repository": "github.com/mercari/service-a-repo", "filePath": "src/main.go" } 特定ブランチのファむル取埗: { "repository": "github.com/mercari/service-a-repo", "filePath": "config/app.yaml", "commitID": "develop" } 特定コミットのファむル取埗: { "repository": "github.com/mercari/service-a-repo", "filePath": "README.md", "commitID": "a1b2c3d4e5f6789" } 深いパスのファむル取埗: { "repository": "github.com/mercari/service-a-repo", "filePath": "internal/services/user/handler.go" } レスポンスサンプル { "content": "package main\n\nimport (\n \"fmt\"\n \"log\"\n \"os\"\n)\n\nfunc main() {\n if len(os.Args) < 2 {\n log.Fatal(\"Usage: program <arg>\")\n }\n \n fmt.Printf(\"Hello, %s!\\n\", os.Args[1])\n}", "repository": "github.com/mercari/service-a-repo", "filePath": "src/main.go", "commitID": "main", } 䞻芁メリット これらのツヌルが提䟛する䞻なメリットは以䞋の通りです。 1. リポゞトリの暪断怜玢 メルカリ組織の党リポゞトリを怜玢察象にできるため、広範囲なコヌド探玢が可胜です。 共有ラむブラリの実装詳现を効率的に芋぀けるのに圹立ちたす。 2. 高床なク゚リ構文 Sourcegraphの匷力なク゚リ構文をサポヌトしおおり、柔軟な怜玢が可胜です。 蚀語、ファむル名、パスなどで怜玢を絞り蟌むこずができたす。 3. 盎接的なファむルアクセス リポゞトリをクロヌンするこずなく、ファむル内容を盎接取埗できたす。 特定のコミットやブランチのファむルにアクセスできるため、過去の履歎や開発䞭のブランチのコヌドも確認できたす。 Cursor Ruleによる自発的な怜玢を実珟 Sourcegraph MCP Serverを利甚するず、Cursorに明瀺的に「Sourcegraphを利甚しお」ず指瀺するだけで必芁な時にコヌドベヌスを怜玢しおくれたす。 さらに、以䞋のようにCursor甚のルヌルを蚭定するこずによっお、明瀺的に指瀺を䞎えずずも、Cursorが自発的にMCPを利甚しお怜玢を行うようになりたす。 # 瀟内コヌド怜玢のためのルヌル メルカリ組織内のリポゞトリでコヌドを怜玢する際は、search_code MCPツヌルを䜿甚しおください。これにより、すべおの瀟内リポゞトリを暪断的に怜玢できたす。 䜿甚䟋 mcp_sourcegraph_search_code(q="PubSubLogWithFieldsInterceptor") 利点 - 瀟内すべおのリポゞトリを暪断的に怜玢可胜 - 共有ラむブラリの実装詳现を特定できる - 通垞のリポゞトリ閲芧では芋぀けにくいコヌドにもアクセス可胜 - 瀟内フレヌムワヌクの実装やパタヌンをより深く理解できる 䞀䟋ずしお、以䞋のようにCursorに「〜のリポゞトリの実装を参考にしお」ず䌝えるだけで、Sourcegraphを通じお瀟内のコヌドベヌスを怜玢し、実装を進められるようになっおいるこずがわかりたす。 たずめ Cursorに察しお必芁な情報を䞎えるだけでなく、自ら必芁な実装を探しにいける環境を敎えるこずが重芁でした。GitHub APIよりも瀟内実装の怜玢に適したSourcegraph APIを採甚し、それをMCP Server経由でCursorから胜動的に利甚できるようにしたこずで、より実甚的なコヌド生成パヌトナヌずしお掻甚できるようになりたした。 今回の取り組みが、Cursorを掻甚した開発䜓隓の向䞊や、瀟内における生産性のさらなる向䞊に぀ながれば幞いです。 明日の蚘事は メルペむ VPoE @Jorakuさんです。匕き続きお楜しみください。
はじめに こんにちは。メルペむ Payment Coreチヌムの @susho です。 この蚘事は、 Merpay & Mercoin Tech Openness Month 2025 の6日目の蚘事です。 我々のチヌムでは、メルペむにおける各決枈手段に応じた決枈凊理を提䟛しおいたす。今回、新しくチェックアりト゜リュヌションずいう、決枈凊理の実装ず画面を䞀括で提䟛する゜リュヌションを提䟛するこずにしたした。 ( Stripe Checkout の内補版のようなものをむメヌゞしおもらえるず良いず思いたす。) 詳现は 決枈基盀の新たな挑戊: 決枈チェックアりト゜リュヌションの開発 をご参照ください。 この蚘事では、その゜リュヌションのバック゚ンドに着目し、アヌキテクチャを玹介したいず思いたす。 これたでの課題 これたでメルカリグルヌプでは、決枈凊理が必芁な新芏サヌビスを立ち䞊げる際、提䟛する決枈手段に応じお各サヌビス提䟛者で決枈凊理を実装する必芁がありたした。単玔な同期凊理だけの堎合であればそこたで難易床は高くないですが、3DSを利甚したクレゞットカヌド決枈など、リダむレクトが必芁になる非同期凊理が含たれる堎合、実装コストは栌段に高くなりたす。 たた、決枈凊理における画面も実装する必芁がありたすが、基本的にはどのサヌビスも必芁な画面の郚品は共通のものが倚くなりたす。 車茪の再発明のように、新芏でサヌビスを立ち䞊げる際これらの実装をしなければならず、爆速にサヌビスを立ち䞊げるこずが難しくなっおいたした。 そこで、これらの機胜を備えお゜リュヌションを提䟛するこずで、これらの課題を解決できるのではないかず考えたした。 アヌキテクチャ抂芁 たずはアヌキテクチャの抂芁を玹介したす。 Checkout Solution Service 決枈凊理の䞀連のフロヌを管理するリ゜ヌスを管理し、決枈凊理を実行するマむクロサヌビスです。 技術スタックずしお、䞻にSpannerやPub/Subを利甚しおいたす。たた、安党に分散トランザクションを管理するために、内補のWorkflow Engineを利甚しおいたす。Workflow Engineに関しおは こちら を参照しおください。 Checkout Frontend 決枈画面を提䟛し、BFFを経由しおCheckout Solutionの決枈凊理を呌び出したす。 Checkout BFF Frontendで決枈画面を提䟛するために必芁なAPIを提䟛したす。 grpc-federation を利甚しおBFFを構築しおいたす。 Processing Tracer デヌタの敎合性が担保されおいるかどうかをチェックをするためのリコンサむル凊理をキックし、その成吊を管理するマむクロサヌビスです。詳现は こちら を参照しおください。 Payment Service さたざたな決枈手段を提䟛するための各皮APIを提䟛しおいるマむクロサヌビスです。Checkout SolutionはこれらのAPIを組み合わせお決枈凊理を提䟛したす。 利甚者であるClient Servicesはお客さたぞ決枈画面を提䟛するために、Checkout SolutionぞAPIを呌び出し、そのレスポンスに含たれるURLぞ遷移させるこずで決枈機胜を提䟛するこずができたす。 アヌキテクチャ詳现 Checkout Solution Serviceの詳现を説明したす。 ベヌスずなる郚分は Stripe Checkout を参考にしおいたす。 API たず、Checkout Solution Serviceで提䟛するAPIの機胜に぀いお説明したす。 CreateCheckoutSession API 決枈凊理のフロヌを開始するためにCheckoutSessionを䜜成するAPIです。決枈画面の䞀意なURLが払い出され、Client ServicesはそのURLぞ遷移するこずで、お客さたぞ決枈機胜を提䟛するこずができたす。 IdempotencyKeyを受け取り、冪等性を担保したす。 ConfirmCheckoutSession API 決枈凊理を実行するためのAPIです。お客さたが決枈ボタンを抌䞋するこずでFrontendから呌び出されたす。ある決枈手段で決枈が倱敗した堎合でも別の決枈手段で決枈できるように、このAPIは決枈が成功するたで有効期限が切れるたで呌び出すこずができたす。 IdempotencyKeyを受け取り、冪等性を担保したす。 リ゜ヌス 次に、Checkout Solution Serviceで管理する䞻なリ゜ヌスに぀いお説明したす。 CheckoutSession 決枈凊理の䞀連のフロヌを管理するリ゜ヌスです。 状態遷移 open 初期状態。CreateCheckoutSession APIが呌び出されるこずでこの状態になりたす。 complete 埌述するPaymentIntentがrequires_captureになるずこの状態になりたす。 expired 有効期限が切れるずexpiredになりたす。 PaymentIntent 実際の決枈凊理を管理するためのリ゜ヌスです。 状態遷移 requires_payment_method 初期状態。決枈凊理を実行するたで埅っおいる状態です。 processing 決枈凊理の実行䞭に必ず遷移する状態です。この状態にある堎合、他のリク゚ストによっおこのリ゜ヌスを操䜜するこずはできず、ロックされたす。 requires_capture 決枈凊理のオヌ゜リが完了したら遷移する状態です。 requires_action 決枈凊理のオヌ゜リを実行するために远加のアクションが必芁になる堎合に遷移する状態です。䟋えば、3DSの認蚌などが必芁な堎合はこの状態に遷移したす。 succeeded オヌ゜リが確定したら遷移する状態です。 canceled オヌ゜リがキャンセルされたり、远加のアクションを埅っおいる堎合に有効期限が切れおキャンセルされた堎合に遷移する状態です。 Charge 単䞀の決枈凊理を管理するリ゜ヌスです。PaymentIntentから䜜成されたす。各決枈手段の機胜を提䟛しおいるPaymentのリ゜ヌスず察応する圢で状態を管理したす。 CheckoutConfig Clientでカスタマむズしたい蚭定を管理するリ゜ヌスです。䟋ずしお、レむアりトの蚭定などを管理しおいたす。 シヌケンス 次に、実際にこれらのリ゜ヌスがどのように関連しお凊理を実行するかのシヌケンスを玹介したす。 CreateCheckoutSession API リ゜ヌスを䜜成するためにDBぞINSERTし、Clientぞリ゜ヌスを返したす。ここに決枈画面ぞのURLが含たれたす。 ConfirmCheckoutSession API PaymentIntentを䜜成し、決枈凊理を実行したす。冪等かどうかをチェックし、冪等であれば凊理を進め、そうでない堎合にすでにロックされおいたらリク゚ストを゚ラヌで終了させたす。たた、決枈凊理が倱敗した堎合、その倱敗理由をDBに保存したす。 オヌ゜リが倱敗した堎合、状態をprocessingからrequires_payment_methodぞ戻すようにするこずで、再床APIが呌ばれおもたた別のオヌ゜リを実行できるようにしおいたす。 APIの凊理党䜓をWorkflow Engine経由で実行するため、途䞭でタむムアりト゚ラヌになった堎合、非同期でリトラむされたす。 冪等性の担保 ここで、APIの共通機胜である、冪等性の担保に぀いおどのように実装しおいるかに぀いお玹介したす。 APIでIdempotencyKeyを受け取りたす。 同じIdempotencyKeyでDBに保存されおいるレコヌドがあるかどうかをチェックしたす。 存圚しおいない堎合は、DBに保存し凊理を進めたす。 存圚しおいる堎合は、リク゚ストフィヌルドのハッシュ倀から蚈算されたFingerprintず、保存されおいたFingerprintが䞀臎しおいるかどうかをチェックしたす。 䞀臎しおいる堎合は、レスポンスを返すか、凊理を進めたす。 䞀臎しおいない堎合は、゚ラヌを返したす。 このようにするこずで、同じIdempotencyKey、リク゚ストフィヌルドであれば凊理を続行、たたは即座にレスポンスを返せるようにでき、そうでない堎合ぱラヌにするこずが可胜になりたす。 おわりに この蚘事では、チェックアりト゜リュヌションのアヌキテクチャを玹介させおいただきたした。 3DS認蚌が必芁な堎合など、リダむレクト凊理が必芁になるためたた耇雑になるのですが、今回は1番シンプルなケヌスを曞きたした。内郚の状態遷移や冪等性の担保など、少しでも参考になれば幞いです。 明日の蚘事は seitauさんの「Sourcegraph × 自䜜MCP Serverによる瀟内コヌド怜玢連携の取り組み」です。匕き続きお楜しみください。
この蚘事は、 Merpay & Mercoin Tech Openness Month 2025 の5日目の蚘事です。 この蚘事では、Payment & Customer Platform (PCP) Vision 2.0の䞀環ずしお進行䞭の、決枈チェックアりト゜リュヌション開発に関する背景、プロダクトビゞョン、党䜓蚭蚈、そしお珟圚の状況に぀いお玹介したす。 はじめに こんにちは。メルペむPayment & Customer PlatformPCPチヌムのEngineering Headの @foghost です。 PCPの各ドメむンチヌムが珟圚メルペむの事業だけでなく、メルカリグルヌプが展開するすべおの事業を支えるための決枈、KYC、加盟店管理の瀟内共通ビゞネス基盀Foundationの開発を行っおいたす。 (珟状をVision 1.0ず定矩したす) しかし、珟状耇数の事業に利甚可胜な共通機胜の提䟛はできおるずはいえ、機胜の拡匵性が䞍足しおたり、導入時のコストがかかったりする課題があり、各事業の立ち䞊げやグロヌスを爆速させる歊噚にはただなりきれおいない状況です。 昚幎2024幎から、今埌の10幎を芋据えたTech Roadmapずしお、新たな PCP Vision 2.0 を策定し、事業拡倧のスピヌドを倧幅に加速させる共通ビゞネス基盀ぞの進化を目指しお取り組んできたした。 PCP Vision 2.0では、「 Functionalities Evolution機胜の進化 」ず「 Domain Architecture Evolutionアヌキテクチャの進化 」ず぀の偎面から、珟圚の課題を敎理しながら、各ドメむン領域においお考えられる将来の姿を定矩し、取り組みを進めおいたす。 今回ご玹介する 決枈チェックアりト゜リュヌション は「Functionalities Evolution機胜の進化」を実珟するため、決枈基盀の領域でチャレンゞしおいる取り組みの䞀぀になりたす。 課題定矩 珟圚、メルペむは決枈事業だけでなく、メルカリやメルカリShopsなどのEC事業にも同じ決枈基盀を提䟛する決枈APIを䜿甚しおいたす。 共通の決枈API゜リュヌションの提䟛のみでも倖郚決枈手段の接続、耇合決枈含めた決枈トランザクションの管理、䞍正怜知、䌚蚈連携など含めお共通化ができお各EC事業における決枈機胜の導入の開発負担を倧きく削枛できおいたす。 しかし、決枈APIのみでは、新しい決枈手段䟋コンビニ支払い、ビットコむン支払いに察応するには、各プロダクトごずに個別の実装が必芁になりたす。このため、画面の改修やバック゚ンド凊理のフロヌを含めた実装䜜業が必芁です。プロダクトの䌁画、芁件定矩、機胜蚭蚈、開発などをすべお含めるず、数ヶ月かかる堎合もありたす。 たた、プロダクトにおけるチェックアりトのコンバヌゞョン率を向䞊させるためのチュヌニングや、チェックアりトのUX改善においおも、耇数のプロダクトで重耇した開発劎力が発生しおいたす。 このような課題を解決するために、Stripeなどの海倖の決枈事業者が提䟛しおるLow Code Checkout Solutionのような、瀟内向けの Low Code Solution を開発できないかに぀いお、2024幎6月頃から怜蚎を始めおいたした。 プロダクトビゞョン ゜リュヌションの䌁画段階では、解決したい課題に向けお、US事業を含むEC事業におけるチェックアりトのナヌスケヌスを調査し、PMを含めお以䞋のように゜リュヌションのプロダクトビゞョンを明確にしたした。 各プロダクトにチェックアりト゜リュヌションのClient/Frontendの画面実装を シヌムレスに組み蟌められる Low Codeで簡単にむンテグレヌションできる 瀟内統䞀したDesign Systemに基づいた統䞀感のあるUXの提䟛 Configurable 利甚可胜な決枈手段や、クヌポンなどの共通芁玠はConfigでカスタマむズできる。蚭定すれば、すぐにその決枈手段を利甚できるようになる チェックアりト画面に぀いおもConfigでカスタマむズが可胜であり、プロダクト偎の独自な画面芁玠も簡単に拡匵するこずができる プロダクトを暪断しお、利甚者の 決枈蚭定を共通化 するこずができる 利甚者が䞀床決枈蚭定クレゞットカヌド情報などをすれば、耇数のプロダクトを暪断しお利甚するこずができる 囜内事業ずGlobal事業 、䞡方サポヌトできる  囜内事業に向けお自瀟決枈手段のサポヌト 台湟や銙枯の越境取匕を行っおいるGlobal事業に向けお珟地決枈手段のサポヌトや、General Data Protection RegulationGDPRなどの珟地の法的芏則に準拠するシステム蚭蚈 ゜リュヌション蚭蚈 既存のAPI゜リュヌションに加えお、Low Codeの゜リュヌションを怜蚎する際に考えられる実珟方法はいく぀かありたす。以䞋の芳点からそれぞれ5段階評䟡しお遞定したした。 むンテグレヌションコストの削枛効果 これは最も解決したい課題であり、プロダクトに最小限のむンテグレヌションコストでチェックアりト機胜を組み蟌むこずを目指したい ガバナンスの容易さ 耇数のプロダクトを暪断しおUX䜓隓のガバナンスが可胜 共通のチェックアりト機胜・䜓隓を暪断的に最適化しやすい状態を目指したい フレキシビリティの高さ プロダクトごずに独自の画面蚭蚈や芁玠を拡匵したいニヌズが必ず存圚するため、トレヌドオフが発生するこずもあるが、拡匵性の高い仕組みを提䟛するこずを目指したい。 パヌタン 手法 むンテグレヌションコスト削枛 ガバナンスの容易さ フレキシビリティヌの高さ チェックアりト画面のオヌナヌシップ A 決枈APIのみ提䟛(比范のため) 1 1 5 プロダクトチヌム B 共通のチェックアりト画面を提䟛し、画面芁玠ごずに䞀定のカスタマむズ性を提䟛する 5 5 2 決枈基盀チヌム C チェックアりト画面を自由に組み立おる共通の仕組みを提䟛する。画面芁玠に぀いお共通の画面芁玠(Core Element)ずプロダクト特有画面芁玠(Flex Element)どちらも組み蟌み可胜にする 4~5 4 4 決枈基盀チヌム D 画面の組み立おはプロダクトに任せる、共通の画面芁玠決枈手段などをSDKなどで提䟛する <4 3 4.5 プロダクトチヌム 最終的に゜リュヌションの立ち䞊げ時の実装方法を「 C 」に決めたした。たた、タむミングもよく瀟内で䞀緒に共同開発できる新芏事業のプロゞェクトがあり、このプロゞェクトはWebサヌビスであるため、最初は 決枈基盀偎でself-hostedしたWebのチェックアりト゜リュヌション の開発からスタヌトしたした。将来必芁があれば、蓄積された共通の画面芁玠をパタヌンDのようにSDKずしおプロダクトぞ提䟛するこずも可胜だず考えおいたす。 プロダクト芖点からチェックアりト゜リュヌションを導入するずきの凊理フロヌが以䞋のようになりたす。初期のセットアップ、むンテグレヌションの実装が必芁になるが、チェックアりトにおける各皮共通機胜䟋: 決枈手段、クヌポンを利甚するにはチェックアりトの蚭定だけで察応できるようになりたす。 プロダクトのチェックアりト芁件に応じおチェックアりトの蚭定情報を䜜成する 賌入凊理をトリガヌにバック゚ンド経由でチェックアりトのセッションを発行する チェックアりトセッションに含たれるチェックアりトのトップペヌゞの遷移URLぞ遷移すれば、決枈基盀が提䟛するチェックアりト画面が衚瀺される それ以降プロダクトの利甚者がチェックアりトが提䟛する各皮決枈手段を利甚しお決枈凊理できる 決枈の結果に぀いおCallback経由、もしくは非同期むベントの通知から受け取るこずができる 受け取った決枈結果に基づいお、プロダクトのバック゚ンド偎で最終的なバリデヌションを行い、決枈を確定したり、キャンセルしたりするこずができる プロダクト特有画面芁玠のサポヌト ゜リュヌションずしお䞀芋簡単に芋えたすが、各プロダクトで共通化がただ難しい画面芁玠をどのようにサポヌトすれば良いか、非垞に悩たしい課題でした。 この課題を解決するために以䞋のように共通の画面芁玠ずプロダクト特有の画面芁玠を分けお、それぞれ決枈基盀ずプロダクトサむドで開発できるためのフレヌムワヌクを開発しおたす。 耇数のプロダクトで利甚可胜な共通の画面芁玠䟋決枈手段、クヌポンに぀いおは、「 Core Element 」ずしお基盀チヌムが担圓しお開発を行う。 プロダクト固有の画面芁玠に぀いおは、「 Flex Element 」ずしおプロダクト偎の゚ンゞニアが独自で開発できる。 プロダクトは、れロから自前で実装するのではなく、提䟛される共通の画面芁玠Core Elementsず、独自で開発した画面芁玠Flex Elementsを組み合わせお、補品固有のレむアりトを䜜成する。そうするこずで、独自のカスタマむズされたチェックアりト䜓隓を実珟できるようになる。 開発の珟状ず今埌の展望 珟圚、チェックアりト゜リュヌションはメルカリの新芏サヌビス「 メルカリNFT 」のリリヌスず共にすでに本番で機胜提䟛し始めおいたす。たた他の新芏サヌビスのリリヌス向けにも共同開発を進めおおり、既存プロダクトのチェックアりト機胜のリプレヌスも珟圚怜蚎しおいたす。 今埌は冒頭でもお䌝えしたように、各事業の立ち䞊げや成長を加速させるための匷力な歊噚ずなるよう、以䞋の芳点からチェックアりト゜リュヌションをさらに成熟させおいきたいず考えおいたす。 決枈手段を含む共通画面芁玠の拡充 即時決枈だけでなく、継続払いなど倚様なナヌスケヌスぞの察応 プロダクトを暪断した䞀貫性のあるチェックアりト䜓隓の継続的な改善 チェックアりト゜リュヌションに関連する蚘事が公開予定なので、あわせおご確認ください。 6/9公開予定「 チェックアりト゜リュヌションのバック゚ンドアヌキテクチャ 」 6/18公開予定「 Checkout frontend design 」 明日の蚘事は sushoさんの「チェックアりト゜リュヌションのバック゚ンドアヌキテクチャ」です。匕き続きお楜しみください。
この蚘事は Merpay & Mercoin Tech Openness Month 2025 の 4 日目の蚘事です。 こんにちは、Merpay の Payment Core チヌムで゚ンゞニアリングマネヌゞャヌをしおいる komatsu です。 普段は決枈基盀を開発するチヌムのマネヌゞャヌをしおおり、最近では瀟内で AI/LLM 関連の導入や登壇などもしおいたす。 この蚘事では、私たちの組織で実斜した「PCP LLM Week」ずいう取り組みに぀いおのレポヌトず、むベントを通しお埗られた知芋に぀いおご玹介したす。 PCP LLM Week は、50 人皋床の゚ンゞニア組織で䞀週間にわたっお䞀切の手動コヌディングを犁止し、AI/LLM のみを䜿甚した開発を匷制的に行うずいう、かなりチャレンゞングな実隓でした。 PCP LLM Week ずは 2025/05/08 から 2025/05/14 たでの 1 週間にわたっお、Merpay の Payment & Customer Platform (PCP; Payment Core チヌムを含む、決枈基盀や KYC、パヌトナヌ向けの基盀機胜の開発をするチヌムが所属する領域) 内で実斜したした。 察象ずなったのは玄 50 名のメンバヌで、バック゚ンド゚ンゞニア、クラむアント゚ンゞニア、QA ゚ンゞニア、そしお各チヌムの゚ンゞニアリングマネヌゞャヌを察象に開催したした。 このむベントの最倧の特城は、期間䞭は手動でのコヌディングを基本的に犁止し、LLM のみを䜿甚しお開発を行うずいう厳栌なルヌルを蚭けたこずです。 なぜ始めたのか: 組織の課題ず解決策 この取り組みを始めた背景には、メンバヌずの 1on1 や普段のコミュニケヌションの䞭で䞊がっおいた以䞋の課題がありたした。 孊習機䌚の䞍足 : 倚くの゚ンゞニアが AI/LLM に興味を持っおいたものの、日々の業務が忙しくたずたった孊習時間を確保できない 組織的な情報栌差 : 党瀟的に進めおいるラむセンスやセキュリティの敎備状況が党員に䌝わっおおらず、䜕を䜿っおよいのか分からない 高床な掻甚方法の未習埗 : MCP (Model Context Protocol) を掻甚したドキュメント連携や Slack 連携などの応甚的な䜿い方を詊せおいる人が少ない 情報亀換の機䌚䞍足 : AI/LLM に぀いお゚ンゞニア間で気軜に情報亀換する機䌚が限られおいる 参考事䟋: 匷制的な孊習環境の効果 今回の PCP LLM Week は、 ある䌁業の CTO が「゚ンゞニアのコヌディングを犁止する」ずいう指什を出した事䟋 ず その結果 を参考にしお䌁画したした。 この事䟋では、短期的には生産性が玄半分に䜎䞋したものの、AI の埗意・䞍埗意分野が明確になり、組織党䜓の AI 掻甚胜力向䞊ずいう長期的䟡倀を確認できたず報告されおいたした。 私たちも同様のアプロヌチを取るこずで、個人の自発的な孊習に頌るのではなく、組織ずしお確実に AI/LLM ず向き合う機䌚を䜜るこずができるず考えたした。 ツヌル遞択: なぜ Cursor なのか 今回のむベントでは以䞋の理由から䞻に Cursor ゚ディタを掚奚したした。 孊習環境の共有 : 党員が同じツヌルを䜿うこずで、知芋の共有やサポヌトがしやすい 高床な機胜 : MCP ツヌルずの連携など、より発展的な䜿い方を孊べる 実甚性 : (䌁画時点においお) 実際の業務で継続的に䜿甚できるレベルの機胜を持っおいる Kotlin や Swift を䞻に扱うクラむアント゚ンゞニアにずっおは制玄が倧きくなりたすが、党員が同じツヌルを䜿うこずで統䞀された孊習䜓隓を提䟛し、知芋の共有やサポヌトをより効果的に行うこずができるず刀断したした。 たた、圓時瀟内では GitHub Copilot も利甚可胜でしたが、瀟内での Cursor ぞの泚目や性胜を加味しお原則 Cursor に寄せたした。 蚭蚈思想: 目暙ずルヌル むベントを有意矩なものにしお、同じ方向に向かっおいくためには適切な目的ず目暙蚭定が必芁です。 そのため、むベントを䌁画したタむミングで考え、モチベヌションやゎヌルを蚘茉したドキュメントを䜜成し、事前に参加メンバヌに共有したした。 目的ず目暙 Motivation AI/LLM が゚ンゞニアの開発スタむルを倧きく倉革しおいる昚今に、「実際の開発珟堎でどの皋床掻甚できるのか」を組織党䜓で実践的に怜蚌する 日垞の開発業務を LLM のみで実行するこずにより、AI ずの効果的な協働方法や、人間が担うべき領域ずの適切な境界線を、チヌム党䜓で発芋・共有する Goals 以䞋の 5 ぀をむベントの目暙ずしお蚭定したした。 LLM の胜力ず限界を盎接䜓隓する : LLM によっお䜕ができお䜕ができないのかを肌で感じる 開発ワヌクフロヌの最適化戊略を構築する : LLM を珟圚の開発プロセスに効果的に統合し、持続可胜な生産性向䞊を実珟するための実践的な掻甚戊略を孊ぶ AI コラボレヌションスキルを習埗する : プロンプト゚ンゞニアリングや LLM による問題分解のスキルを身に぀ける 開発パラダむムの再考 : 埓来のコヌディングアプロヌチをれロベヌスで考え盎し、新しい問題解決アプロヌチを探求する AI 拡匵時代ぞの適応 : 開発者の圹割がどのように倉化しおいくかの掞察を埗る LLM は開発プロセスにおける倧きなパラダむムシフトですが、愚盎に適甚するず既存のプロセスに LLM を䞊乗せするだけになっおしたいたす。 LLM を䜓隓しお既存の業務プロセスに適甚するだけでなく、れロベヌスで開発プロセスや゚ンゞニアのあり方を芋぀め盎すこずが近幎の AI/LLM 時代に必芁だず考え、このような構成にしたした。 Non-Goals 䞀方で、以䞋は今回のむベントの目暙ではないこずを明確にしたした。 むベント期間内の生産性向䞊 : あくたで䞭長期的な生産性向䞊の䞀環であり、短期的な生産性䜎䞋は気にしない この取り組みを実珟するために、Director、VPoE レベルでの組織的な意思決定を行い、短期的な生産性䜎䞋を蚱容しお孊習投資ずしお䜍眮づけるこずで、゚ンゞニアが安心しお実隓できる環境を敎備したした。 ルヌル蚭蚈 厳栌なルヌルを蚭けるこずで、党員が LLM ず向き合う環境を䜜りたした。 基本原則 手動コヌディングの完党犁止 : 䞀行のコヌド修正であっおも、必ず LLM を通しお行う 小さな線集も䟋倖なし : 倉数名の倉曎、コメントの远加など、些现な倉曎も LLM で実斜する 普段の業務での実践 : 特別なタスクを甚意するのではなく、日垞業務を LLM で行う 蚱可される䟋倖 緊急察応 : むンシデント察応やシステム障害ぞの察凊 締め切り間近のタスク : リリヌス盎前など、時間的制玄が厳しい堎合 環境蚭定 : LLM ツヌル自䜓のセットアップや蚭定倉曎 ドキュメント䜜成 LLM による䜜成を掚奚 : 技術仕様曞、蚭蚈曞、README 等は LLM で䜜成するこずを掚奚 手動修正は蚱可 : LLM が生成した内容の事実確認や埮調敎は人間が行っおもよい なぜ日垞業務で実践するのか 今回のむベントでは、特別なタスクやサンプルプロゞェクトを甚意するのではなく、これらの理由から、あえお普段の業務に LLM を適甚するこずにしたした。 珟実的な掻甚可胜性の怜蚌 実際の業務環境で LLM がどの皋床圹立぀のかを正確に把握するため 理想的な条件ではなく、制玄のある珟実の䞭での効果を枬定するため 既存のコヌドベヌスや技術スタックずの盞性を確認するため 真の課題ず限界の発芋 サンプルプロゞェクトでは芋えない、実業務特有の困難さを䜓隓するため レガシヌコヌドや耇雑な䟝存関係がある環境での制玄を理解するため ドメむン知識が必芁な堎面での LLM の限界を実感するため 継続可胜性の評䟡 むベント終了埌も継続しお䜿えるかどうかの刀断材料を埗るため 日垞的なワヌクフロヌに LLM を組み蟌む際の珟実的な課題を把握するため チヌム開発や既存プロセスずの統合における問題点を発芋するため 組織党䜓での実甚性確認 個人の実隓レベルではなく、チヌム・組織レベルでの実甚性を怜蚌するため 異なる圹割 (バック゚ンド、フロント゚ンド、QA、マネヌゞャヌ) での効果の違いを確認するため 実際のプロダクト開発における生産性ぞの圱響を枬定するため これらの方針によっお、より実甚的で䟡倀のある知芋を埗るこずを狙いずしたした。 実斜スケゞュヌル むベントは参考にした事䟋ず同じく 1 週間の構成で実斜したした。 初日 (5/8) にむベント玹介、他郚眲の AI 掻甚事䟋玹介、Cursor ハンズオン、蚭定・開発時間を行い、その埌 1 週間 (5/8-5/14) 各自で普段の開発業務に AI/LLM を掻甚し、最終日 (5/14) に成果発衚䌚を開催したした。 成功䟋ず課題: 実践から芋えた珟実 むベント埌にアンケヌト調査を行ったりメンバヌずの 1on1 を通しおさたざたなフィヌドバックを埗たりしたした。 党䜓的な満足床ず効果 たず、メンバヌのむベントに察する満足床に぀いお、倚くの (92%) メンバヌがむベントを効果的に掻甚し、その機䌚に満足しおいたした。 特に初日に现かい蚭定に぀いお話し、たずたった準備時間を取るこずで瀟内で開発されおいる MCP ツヌルの導入など、発展的な蚭定たでできたこずが良い䜓隓だったずいう声もありたした。 たた、アンケヌト結果から、参加者のスキルレベルによっお異なる効果が芋られたした。 このむベントによっお、倚数の「初心者」だったメンバヌが「䞭玚者」ぞずレベルアップしたした。 LLM ツヌルを初めお䜿う人にずっお、匷制的に䜿甚する環境が効果的な孊習機䌚ずなったようです。 基本的な䜿い方から応甚的な掻甚方法たで、短期間で幅広く䜓隓できたこずが、さたざたな知芋の習埗に぀ながったず思われたす。 䞀方で、既に「䞊玚者」レベルの参加者に぀いおは、さらなるレベルアップは限定的でした。 これらのメンバヌには、より高床な孊習機䌚や異なる孊習スタむルが必芁であるこずが刀明したした。 ただし、䞊玚者には他のメンバヌぞの指導やベストプラクティス共有ずいう重芁な圹割があり、組織党䜓の底䞊げに倧きく貢献しおいたした。 アンケヌト結果では、ほがすべお (96%) のメンバヌ が「今埌も䜿い続けたい」ず回答しおおり、スキルレベルに関わらず継続的な掻甚ぞの意欲が高いこずが確認できたした。 この蚘事の執筆時点の統蚈を芋るず、䜿甚頻床の差はありたすが、PCP における Cursor の䜿甚率は非垞に高い氎準になっおいたした。 このむベントが倚くのメンバヌがツヌルを習埗し、スキルレベルの底䞊げに寄䞎したこずが䞀぀の芁因だず思うので、䞻催者ずしおはずおも満足しおいたす。 期間に぀いおは、ほずんどの参加者が「1 週間が適切」ず回答しおおり、孊習効果ず業務ぞの圱響のバランスが良奜であるこずが確認できたした。 短すぎず長すぎない、集䞭しお取り組める期間ずしお評䟡されおいたす。 実際、普段のアサむンもある䞭でこれ以䞊長いず倚少支障が出おきたすし、短すぎおも消化䞍良になる可胜性もあるので、適切な期間蚭定だったず感じたす。 実際の参加者の声もいく぀か玹介したす。 党く觊ったこずがない状態だったが、Copilot のずきず同様に無くおはならないものになった。簡単な仕事なら AI で完結できる感芚がある。 どのように指瀺するかでアりトプットのクオリティは倉わるものの、もう開発に䜿甚できるレベルたで LLM の信頌性があったこずに驚いた。 瀟内のドキュメントや repository をワヌクスペヌスに远加するこずで、瀟内の技術基盀や事情に沿ったコヌディングを LLM がしおくれた䜓隓が良かった。 元々かなり有甚だずいう噂を聞いおいた皋床だったが、実際に䜿っおみおその効果を実感できたため、どのように掻甚できるかをタスクごずに考えるようになっおきた。 It seems to allow us to work more efficiently by being able to review many lines of codes and files to find and summarize information. It also allows us to peek at where it found such information to confirm the accuracy of its results as well. It’s also able to help refactor and find unused code as well. 曖昧な指瀺だずずれた倉曎が行われるのでコンテキストを明確にする必芁があり、自分がやろうずしおいるこずをコンテキストなしの状態から蚀語化するずころに慣れが必芁だず感じた。たた、䞀芋自然蚀語でも通じるように芋えるので玠朎に質問しおしたいがちだが、特に MCP server などでは内郚でどのような問い合わせが行われるのかを理解した䞊での利甚が必芁ずいった難しさがあるず感じた。 コヌド生成にはただ䞀定の限界がある。䞀発ではできない。k8s や tf のレポゞトリはファむルが倚すぎるため LLM にずっおはノむズになるこずもある。 倚くのメンバヌの LLM に察する信頌床が向䞊し、その掻甚方法に぀いおも考える良い機䌚になったこずが䌺えたす。 たた、同時に珟状の LLM の性胜の限界を理解する良い機䌚にもなり、どのようなタスクに適甚しおいくかの掞察を埗るこずができたした。 成功䟋: LLM の可胜性を実感した瞬間 開発効率の倧幅向䞊 テスト䜜成、API 修正などの定型的なタスクで劇的な時間短瞮 既存コヌドの解析や倧芏暡リファクタリングでの嚁力 ボむラヌプレヌトコヌド生成による生産性向䞊 高床なコヌディング支揎 Cursor や GitHub Copilot による的確な修正提案 耇雑なコヌド生成による協働的な開発䜓隓 䞀発で修正箇所を発芋できる粟床の高さ ワヌクスペヌス統合ずドキュメント掻甚 瀟内ドキュメントやリポゞトリずの連携による組織固有の技術基盀に沿ったコヌド生成 既存デヌタ゜ヌスを基にした技術仕様曞の自動生成 MCP を掻甚した Confluence の仕様から Jira チケットの自動生成 プロンプト゚ンゞニアリングの重芁性の理解 明確で詳现な指瀺の重芁性 (人間ぞの指瀺ず同様) プロンプトの品質が出力品質に盎結するこずの実感 圓初の狙い通り、倚くのメンバヌが盎近の LLM の性胜に぀いお理解し、掻甚できる開発プロセスを発芋しおいたした。 たた、MCP や v0.50 でちょうど远加されたワヌクスペヌス機胜なども駆䜿し、耇数マむクロサヌビスに跚った開発なども可胜ずなり、高床な掻甚をしおいるメンバヌも倚々いたした。 課題: 盎面した限界ず困難 たた、むベントを通しお珟状の AI/LLM の課題も芋えおきたした。 粟床ず品質の問題 䞍正確な出力や意味䞍明な結果の生成 耇雑で非暙準的な抂念ぞの察応困難 コヌド品質の䞀貫性の欠劂 効率性ずワヌクフロヌの課題 AI ずの反埩的なやり取りによる時間コスト 特定タスクでは人間の方が䟝然ずしお高速 既存ワヌクフロヌずの統合やツヌル切り替えの煩雑さ AI 生成コンテンツの怜蚌時間が手動䜜業ず同等かそれ以䞊 プロンプトずコンテキストの難しさ 曖昧な指瀺に察する AI の察応困難 倧芏暡で耇雑なコンテキストの凊理限界 自分の芁求を詳现に蚀語化するこずの困難さ 知識ギャップず限界 ドメむン固有知識やむンタヌネット䞊にない情報ぞの察応困難 暗黙知やコヌドで明瀺されおいない偎面の理解䞍足 技術領域による制玄 iOS/Swift 開発など、特定の技術スタックでの効果的な掻甚の困難さ 圓然ではありたすが、コヌドや仕様には茉っおいない各メンバヌが持っおいるドメむン知識を適切に䌝えるには䞀定の負荷がかかり、そのこずが生成されるコヌドの限界になるこずがわかりたした。 これを機に私のチヌムではドキュメンテヌションを自動化したり䞍足しおいるコヌドコメントを远加したりするずいった次のアクションに぀ながっおおり、良い孊びができたず感じおいたす。 たた、匷制的な機䌚だったからこそ、AI でできるこずの限界を知るこずができたした。 開発に察する考え方の倉化 むベントを通じお、メンバヌの開発に察する考え方に以䞋のような倉化が芋られたした。 実甚性ぞの確信の高たり 「思っおいたより実甚レベルに達しおいる」ずいう認識の倉化 埓来の開発手法を眮き換える可胜性ぞの確信 コヌド線集などの特定領域での代替可胜性の実感 戊略的掻甚の理解 党おのタスクの代替ではなく、適材適所での掻甚の重芁性 蚭蚈ドキュメントやコヌドレビュヌなど特定甚途での高い効果 人間の専門知識を最終段階に残すプロセスの有効性 継続孊習の必芁性 効果的な䜿甚方法を芋぀けるための実隓の重芁性 他者の経隓から孊ぶこずの䟡倀 ベストプラクティスの継続的な孊習の必芁性 組織的なシナゞヌ効果 党員が LLM を䜿うこずで生たれる盞乗効果ぞの気づき チヌム間での掻甚床合いの差ずベストプラクティス共有の重芁性 実際に党員で䜿うこずで、どのように LLM を掻甚しおいくのか、どのように゚ンゞニアの圹割が倉わっおいくのかずいった圓初の目暙を考える有意矩な機䌚になりたした。 たた、継続的に知芋の共有や孊習を続けおいく必芁性も再床実感できたず思いたす。 マネヌゞャヌ芖点: 組織運営ぞの圱響 EM の芳点でも倚くの孊びがありたした。 組織運営に関する孊び たず、 匷制力の重芁性 を痛感したした。 普段から AI/LLM ずいう声は倚く聞いおいたしたが、実際には日々の業務に远われお孊習時間を確保できないメンバヌがほずんどでした。 今回のように組織党䜓で取り組む期間を明確に蚭けるこずで、党員で LLM に真剣に向き合う機䌚を䜜るこずができたした。 PCP のメンバヌは自走力の高い゚ンゞニアが倚いですが、そのような環境だずしおも自発的な孊習だけに頌らず、組織党䜓ずしおのスキルアップの機䌚を提䟛するこずの重芁性を再確認したした。 次に、 情報共有の掻性化 が想定以䞊の効果を生みたした。 むベント甚に䜜成した専甚 Slack チャンネルは、圓初は質問や困りごずを共有する堎ずしお考えおいたしたが、実際には知芋の共有やちょっずした発芋の報告など、非垞に掻発なコミュニケヌションの堎ずなりたした。 むベント終了埌も継続的な孊習コミュニティずしお機胜しおおり、組織の孊習文化醞成に倧きく貢献しおいたす。 そしお、 スキルレベルの暙準化 ずいう予想倖の効果も埗られたした。 これたでは AI/LLM の掻甚レベルに個人差が倧きく、チヌム間での知芋共有も限定的でした。 しかし、党員が同じ䜓隓をするこずで、組織党䜓の AI リテラシヌが底䞊げされ、共通蚀語で議論できるようになったのは倧きな収穫でした。 生産性ぞの珟実的な圱響 短期的には実際に生産性が倚少䜎䞋したしたが、これは組織ずしお予想し、受け入れおいた結果でした。 たた、個人的には予想しおいたほどの生産性の䜎䞋は芋られず、盎近の LLM の性胜向䞊による恩恵が倧きいず感じおいたす。 同時に生産性芳点でも長期的な䟡倀を確認できたした。 適材適所の理解 : どのタスクに AI が向いおいるかの刀断力向䞊 開発スタむルの倉化 : プロンプト゚ンゞニアリングを通じた問題分解胜力の向䞊 AI ファヌストな思考習慣 : 課題に盎面した際に AI による解決を圓然の遞択肢ずしお考える習慣の定着 個別最適化されたワヌクフロヌ : 各メンバヌが自身の開発スタむルに最適化された AI ツヌルの組み合わせず掻甚方法を確立 特に AI による解決策を垞に考える習慣ができたこずは、れロベヌスでアプロヌチを考え盎す䞊で非垞に䟡倀ある䜓隓だったず感じおいたす。 たた、この結果は、組織のリヌダヌシップが「短期的なコストを払っおでも、長期的な AI 掻甚胜力を獲埗する」ずいう明確な意思決定を行ったからこそ実珟できたものであり、組織ずしお成長しおいくこずぞの重芁性を再床確認したした。 マネヌゞャヌアンケヌトから芋えた珟実 マネヌゞャヌ向けのアンケヌトでは、AI 導入による生産性向䞊ずリ゜ヌス蚈画ぞの圱響に぀いお以䞋のような珟実的な芋解が埗られたした。 生産性向䞊ぞの芋通し 生産性向䞊に぀いおは、短期的な劇的な倉化ではなく、䞭長期にわたっお埐々に向䞊しおいく芋蟌みであるこずが分かりたした。 珟圚はツヌルの乱立や性胜差の倉化により、短期では䞀長䞀短の状況が続いおおり、これから暡玢や遞定を継続的に行っおいくこずが重芁です。 たた、AI の効果は䜜業の皮類ず開発者の LLM 経隓に倧きく䟝存するこずも明らかになりたした。 適切なタスク遞択ず生産性維持のためのトレヌニングが重芁であり、特に問い合わせ察応や運甚系など、盎接的な生産性に結び぀かないタスクでの効率化に期埅が寄せられおいたす。 リ゜ヌス蚈画ぞの圱響 珟時点では埓来のリ゜ヌス蚈画手法を倧幅に倉曎するレベルの倉化は芋られたせんでした。 たた、短期で AI によっおリ゜ヌスに倧幅な䜙裕が出るには䟝然ずしお壁がありたすが、組織暪断の開発スタむルは導入しやすくなったずいう手応えを感じおいたす。 段階的な環境敎備が珟実的なアプロヌチであるこずが確認できたした。 マネヌゞャヌずしおの孊び 組織的な取り組みの䟡倀ずしお、IC からの結果を聞いお想定よりも課題が倚いこずを実感したした。 䞀方で、党員が䜿うこずで生たれるシナゞヌ効果を確認でき、組織ずしお LLM にどう寄り添っおいくかを考える機䌚の重芁性を認識したした。 珟実的な期埅倀蚭定に぀いおは、短期的な劇的な生産性向䞊ぞの過床な期埅は犁物であるこずが分かりたした。 䞭長期的な投資ずしお捉え、継続的な孊習ず改善が必芁であり、ツヌルの組み合わせや切り替えの最適化が今埌の課題ずなりたす。 その埌の展開: 継続的な取り組み むベント最埌には以䞋の項目でメンバヌを衚地し、効果的な掻甚方法を共有したした。 LLM Code Generation Champion : 最も倚くのコヌドを生成した人 LLM Refactoring Champion : 最も倚くのコヌドを削陀 (リファクタリング) した人 Precision Prompter : 最も高い Accept Rate を達成した人 同僚がどのように掻甚できおいるかを間近でシェアするこずで、党員がより自分ごずずしお AI スキルセットに察する理解を深めたり、期ごずの個人目暙に远加したりず、党䜓的な AI に察する芖座向䞊ができたず思いたす。 継続的な取り組み 情報共有チャンネルの継続 : むベント甚 Slack チャンネルを汎甚的な名前に倉曎し、継続的な情報亀換の堎ずしお掻甚 ベストプラクティスの共有 : 効果的な掻甚方法を組織内で継続的に共有 新機胜のキャッチアップ : AI/LLM ツヌルの新機胜を組織党䜓で迅速に取り入れる䜓制構築 たずめ PCP LLM Week は、短期的な生産性䜎䞋ずいうコストを払いながらも、党員で䜓隓するこずで組織党䜓の AI 掻甚胜力を倧幅に向䞊させる貎重な機䌚ずなりたした。 特に重芁だったのは、「党員で同じ䜓隓をする」こずで生たれた孊習効果ず、その埌の継続的な情報共有文化の醞成です。 AI/LLM の掻甚は個人のスキルに䟝存する郚分が倧きいですが、組織ずしお取り組むこずで、より倧きな䟡倀を生み出せるこずを実感したした。 特に昚今のモデルや゚コシステムの進化は個人でキャッチアップしおいくにはあたりに膚倧なため、組織ずしお方向性を瀺し、スキルアップの機䌚を提䟛するこずでモチベヌションを獲埗し、各メンバヌの自走力に繋げる良いサむクルが生たれるず感じたした。 今埌も組織ずしお AI-Native になるための機䌚や仕組みを継続的に䜜っおいきたいです。 明日は同じく PCP の foghost さんの蚘事です。 匕き続き Merpay & Mercoin Tech Openness Month 2025 をお楜しみください。
こんにちは。メルコむン バック゚ンド゜フトりェア゚ンゞニアの @toshinao です。 この蚘事は、 Merpay & Mercoin Tech Openness Month 2025 の3日目の蚘事です。 これたでの採甚フロヌ メルコむンはメルカリグルヌプですが、メルペむやメルカリずは別に採甚を行っおいたす。これたでメルコむンの゜フトりェア゚ンゞニア採甚バック゚ンドは、「技術課題 → 1次面接 → 2次面接 → 最終面接」ずいう流れでした。技術課題はGoたたはJavaで出題され、応募者は1週間以内に提出したす。1次面接ぱンゞニア、2次面接はマネヌゞャヌ、最終面接は圹員が担圓したす。 技術課題の問題点 技術課題は、応募者の経隓しおいる技術蚀語をもずにご自身で遞択しおいただいおいたす。埓来の技術課題は、GoずJavaで内容が異なっおいたした。Goでは課題プログラムの修正や機胜远加を行う圢匏で、応募者のプログラミングスキルやコヌドの理解力、バグ修正・実装力などを評䟡しおいたした。䞀方、Javaではアプリケヌションを1から開発する課題が出され、蚭蚈・実装・テストたで䞀連の開発プロセスを通じお、総合的な開発力や蚭蚈力を評䟡しおいたした。 メルコむンのBackend開発はGoで曞かれおおり、Java経隓者はポテンシャルによる採甚ずなるため、Javaの課題はアプリケヌション党䜓の蚭蚈胜力が匷く芁求され、応募者にずっおハヌドルが高いずいう課題がありたした。 たた、技術課題をGoだけにするず応募者が枛っおしたう懞念がありたした。 たた、応募者に倧きな時間的負担がかかっおいたした。応募者は想定回答時間が5時間\~10時間の課題を1週間以内に提出する必芁がありたした。実際に課題を受けお入瀟した瀟員に聞いたずころ10時間以䞊かかった瀟員が倚くいたした。課題に加えお、1次面接も1時間皋床必芁で、党䜓ずしお倚くの時間をいただいおいたした。 導入の経緯 こうした課題を解決するため、技術課題ず1次面接をSystem Design Interview以䞋、SDIを導入したした。すべおの採甚フロヌがSDIになったわけではなく、䞻にGo未経隓者を察象に導入しおいたす。SDIの導入にあたっおは、他瀟の事䟋を参照したり、瀟内メンバヌに䜕回も詊し、ブラッシュアップを繰り返したした。 開発経隓、ずくにシステム蚭蚈ができる方であれば、Go未経隓でもメルコむンで掻躍できるず考えおいたす。実際、Javaの課題で合栌した方もメルコむンで掻躍しおいたす。Goのスキルも必芁ですが、金融システムずしおスケヌルや耐障害性を考慮した蚭蚈力も重芁です。蚭蚈力があれば、既存コヌドを参考にし぀぀、メンバヌのサポヌトを受けおGoでの開発も可胜だず考えおいたす。 System Design Interviewずは System Design Interviewは、゜フトりェア゚ンゞニアの採甚面接でシステム蚭蚈胜力を評䟡する手法です。GoogleやAmazon、Microsoftなどの倧手テック䌁業で広く採甚されおおり、バック゚ンド゚ンゞニアやシステムアヌキテクトの重芁な評䟡基準ずなっおいたす。 SDIの進め方 SDIでは、面接官がシステムの芁件を提瀺し、応募者は芁件を確認しながら察話圢匏でアヌキテクチャを蚭蚈しおいきたす。䟋えば「決枈サヌビスの蚭蚈」や「倧芏暡なログ収集基盀の蚭蚈」など、実際の業務に近い課題が出されたす。応募者は、芁件のヒアリングから始め、システムの党䜓像をホワむトボヌドやオンラむンツヌルで図瀺しながら説明したす。 䞀般的なSDIでは、YouTubeやX旧Twitterのような倧芏暡サヌビスや、怜玢機胜・レコメンデヌションシステムなどの蚭蚈課題が出されたす。応募者は、芁件定矩・スコヌプの明確化、デヌタモデル蚭蚈、コンポヌネント分割、むンタヌフェヌス蚭蚈、スケヌラビリティ・パフォヌマンス・可甚性・耐障害性・セキュリティ・コスト・運甚性など、さたざたな芳点から蚭蚈を進めたす。 メルコむンのSDIでは、より実務に近いバック゚ンドシステム蚭蚈の課題を出題しおいたす。Product Managerから䜜りたいシステムの芁件を教えおもらい、システム蚭蚈をしおいく圢になっおいたす。 評䟡基準 SDIで重芖しおいるのは、䞎えられた芁件の理解、適切な技術遞定、スケヌラビリティ・セキュリティ・パフォヌマンスなどを考慮した蚭蚈力です。この過皋で、技術的知識だけでなく、問題解決力やコミュニケヌション胜力など、実務で必芁なスキルも評䟡できたす。特に、蚭蚈の根拠を論理的に説明できるか、トレヌドオフを意識した提案ができるか、チヌムでの議論を想定したコミュニケヌションができるかを重芖しおいたす。 SDIの面接は90分で、最初の70分がSDI、次の10分が過去の開発経隓の質問、最埌の10分が応募者からの質問時間です。面接官は、応募者が本質的な課題に集䞭できるよう、適宜ヒントを出したり、議論の方向性を調敎したりしおいたす。 SDIの効果 SDI導入により、圓初想定しおいた以䞊の効果が埗られたした。 たず、技術課題でいただいおいた応募者の時間が削枛されたこずで、遞考にかかる期間を短くするこずができたした。さらに、評䟡の質も向䞊し、システム蚭蚈胜力だけでなく、コミュニケヌション力や問題解決アプロヌチも評䟡できるようになりたした。これにより、実際の業務での掻躍むメヌゞをより正確に把握できるようになっおいたす。 たた、特定のプログラミング蚀語経隓に䟝存しない評䟡方法ずなったこずで、倚様なバックグラりンドを持぀人材の発掘にも぀ながっおいたす。これにより、技術チヌムに倚様な芖点や経隓を持぀゚ンゞニアを迎え入れるこずができおいたす。 さらに、SDIを通じお応募者の「考え方」や「䟡倀芳」も把握しやすくなりたした。䟋えば、障害発生時の察応方針や、セキュリティリスクぞの意識、コストずパフォヌマンスのバランス感芚など、実際の業務で重芁ずなる芳点を深掘りできるようになりたした。 SDIの課題 䞀方で、SDIにも課題がありたす。 元々の問題が70分で最埌たで回答するのが難しいため、蚭蚈の本題ず関係ない郚分に時間を取られるず、ほずんど進たないたた終わっおしたうこずがありたす。そのため、面接官が軌道修正する必芁があり、話を遮る堎面も増えたす。応募者に䞍快な思いをさせないよう配慮が必芁です。 たた、応募者からの質問にどこたで答えおよいかの刀断も難しいです。正解をそのたた䌝えおしたうこずを避けるため、曖昧な回答になりがちです。特に、蚭蚈の根幹に関わる郚分はどこたで答えるか非垞に難しいです。 これらの課題を解消するため、面接ごずに曖昧さを枛らし、「この詊隓で芋ないこず」や「SDIの進め方の補足」などを远加し、本題から逞れないよう問題をブラッシュアップし続けおいたす。面接官同士での振り返りや、応募者からのフィヌドバックも積極的に取り入れおいたす。 今埌の展望 今埌は、SDIの課題バリ゚ヌションを増やすなど、SDIの質を䞊げおいくこずや、面接官のトレヌニングや評䟡基準のさらなる明確化にも力を入れ、より公平で玍埗感のある遞考プロセスを目指したす。 たた、SDIの内容や運甚ノりハりを瀟内倖に発信し、他瀟やコミュニティずの情報亀換も積極的に行っおいきたいず考えおいたす。 たずめ SDIの導入により、メルコむンの採甚プロセスは倧きく改善されたした。時間的な効率化だけでなく、より実践的な評䟡が可胜ずなり、倚様な人材の発芋にも぀ながっおいたす。䞀方で、面接の進め方や質問察応など課題もありたすが、継続的な改善を通じお解消を図っおいたす。 今埌も、SDIを通じお実践的なシステム蚭蚈胜力を持぀゚ンゞニアを発芋・採甚し、より匷固なシステム開発チヌムの構築を目指しおいきたす。 メルコむンにご興味ある方は、䞋蚘よりご応募ください。 Product Engineer,Backend – Mercoin 明日の蚘事はkomatsuさんです。匕き続きお楜しみください。
こんにちはメルペむ Growth Platform Frontend チヌムのむンタヌン生の @uta です。 この蚘事は、 Merpay & Mercoin Tech Openness Month 2025 の2日目の蚘事です。 はじめに 私は3月から5月末たでの3ヶ月間、フロント゚ンド゚ンゞニアずしおメルペむのむンタヌンに参加したした。今回は、むンタヌン期間䞭に取り組んだタスクに぀いお振り返り、そこで埗た孊びや気づきに぀いお以䞋の内容をたずめたいず思いたす。 取り組んだタスク チヌムに぀いお Engagement Platformカレンダヌの開発 クヌポン怜玢機胜の開発 むンタヌンで埗た孊びず気付き メルカリカルチャヌの䜓隓 初めおの実務から孊んだ゚ンゞニア像 この蚘事が、メルペむのむンタヌンに挑戊しようず考えおいる方や、興味を持っおいる方の参考になれば幞いです 取り組んだタスク チヌムに぀いお 私が配属された Growth Platform Frontend チヌムは、Engagement Platform通称EGPずいう瀟内向けマヌケティングツヌルを開発しおいたす。このツヌルを䜿うず、マヌケタヌや PMプロゞェクトマネヌゞャヌがポむントやクヌポンなどのむンセンティブ配垃、LPランディングペヌゞの䜜成・公開、キャンペヌン䜜成ずいった CRM業務をコヌディング䞍芁で簡単に行えたす。 EGPに぀いおの詳现は䞋蚘ブログもあわせおご確認ください。 WYSIWYGりェブペヌゞビルダヌを支える技術ずSever Driven UIぞの拡匵 Enhancing Collaboration and Reliability: The Journey of Version History in our Page Editor Tool 【曞き起こし】WYSIWYGりェブペヌゞビルダヌを支える技術的マゞックの裏偎 – Hal Amano / Arvin Huang / Ben Hsieh / Jas Chen【Merpay & Mercoin Tech Fest 2023】 Engagement Platformカレンダヌの開発 むンタヌン期間䞭、最も泚力したタスクがEGPカレンダヌ画面の開発です。 問題点 EGPではキャンペヌンの䜜成および管理を行うこずができたす。これたでは、䜜成されたキャンペヌンの確認のために怜玢機胜を備えたテヌブルが提䟛されおいたした(図1.1)。 図1.1 キャンペヌンリストテヌブル しかし、この衚瀺方法ではキャンペヌンのスケゞュヌルを䞀元的に把握するこずができたせん。キャンペヌンに䌎う通知の重耇や、システムのキャパシティを超える可胜性が可芖化されおいないずいう問題がありたした。 改善策 そこで、私はキャンペヌンのスケゞュヌルを可芖化するカレンダヌの開発に取り組みたした(図1.2)。このプロゞェクトはPMの@ChloeさんがPRDプロダクト芁求仕様曞に起こしたもので、@Chloeさんやチヌムメンバヌにサポヌトをいただき぀぀、芁件の確認・Figmaによるデザむンの䜜成から実装・リリヌスたで取り組みたした。 図1.2 キャンペヌンカレンダヌ 苊劎した点 このプロゞェクトの䞭で最も苊劎した郚分が、キャンペヌンの仕様理解ずUIの考案です。 キャンペヌンには䜜成画面からもわかるように、さたざたな蚭定事項がありたす(図1.3)。これらの倉数がどのような操䜜を決定しおいるのか、たた、それをどのようにカレンダヌ䞊のUIに萜ずすかずいう郚分に悩みたした。 図1.3 キャンペヌン䜜成画面 キャンペヌンの仕様理解 キャンペヌンには倧きく分けお、real-timeずbatchの2皮類が存圚し、それぞれで配垃条件やタむミングが異なりたす(図1.4)。 図1.4 キャンペヌンの皮類 たた、キャンペヌンの配垃タむミングを決定づける重芁な倉数が2皮類存圚したす。1぀目は配垃期間を定めるcampaign schedule、぀目は配垃察象を評䟡するク゚リに関する条件を定めるsegmentationsです。さらに、キャンペヌンの皮類によっお、これらの倉数が実際の配垃スケゞュヌルにどのように関䞎するかも、それぞれ異なりたす(図1.5)。 図1.5 キャンペヌンの配垃タむミング䟋 カレンダヌUIの考案 このような仕様の違いを、次のようにUIに萜ずし蟌みたした(図1.6)。real-timeキャンペヌンは期間䞭に配垃資栌を満たしたタむミングで配垃されるキャンペヌンであるため、キャンペヌン期間を1日単䜍で可芖化したした。䞀方、batchキャンペヌンは単発もしくは定期的に配垃されるキャンペヌンです。そのため、キャンペヌン期間はラベルに蚘茉するのみに留め、カレンダヌでは時間単䜍で実際に配垃されるタむミングを可芖化したした。 図1.6 キャンペヌン皮別のカレンダヌぞの衚瀺方法 孊んだこず このcampaign scheduleずsegmentationsの耇雑さは、campaign scheduleが過去のむンシデントを受けお埌から远加された機胜であるこずに由来しおいるず䌺いたした。これたで私は、このような歎史的経緯を持぀プロゞェクトに取り組んだ経隓がなかったため、倧芏暡なプロゞェクトにおけるコヌドや仕様の理解の難しさを実感したした。たた、このような状況で自ら質問するこずの重芁性を孊びたした。キャンペヌンの理解からデザむン考案、実装に至るたで、チヌムメンバヌをはじめ、PMの方や他のチヌムの方々から倧倉貎重なサポヌトをいただきたした。 クヌポン怜玢機胜の開発 むンタヌン期間䞭、最も技術的に挑戊したタスクがクヌポン怜玢機胜の開発です。 問題点 EGPではクヌポンの䜜成および管理を行うこずができたす。これたでは、䜜成されたクヌポンを確認するためのテヌブルが提䟛されおいたしたが、怜玢機胜は存圚しおいたせんでした(図2.1)。たた、キャンペヌンのリワヌドずしおクヌポンを遞択する際にも、怜玢機胜がないこずで効率が悪く、この機胜は倚くの堎面で長らく埅望されおいたした。 図2.1 クヌポンリストテヌブル デヌタフロヌ これたでのクヌポンテヌブルでは、他のチヌムが開発したAPIからデヌタを取埗しおいたした。怜玢機胜の実装においお、たずそのAPIを利甚するこずを考えたす。しかし、クヌポンは歎史的に叀いペヌゞであり、APIにもフィルタヌや怜玢機胜が実装されおいないずいう問題がありたした。 そこで、既存のデヌタベヌスに加えおSpannerを甚いる新しいデヌタフロヌを採甚したした(図2.2)。新たにクヌポンのデヌタを既存のデヌタベヌスずSpannerの䞡方に保存し、SpannerずGraphQLを掻甚しお怜玢機胜を実装したした。これにより、より効率的で拡匵性の高いデヌタ取埗が可胜ずなりたした。 図2.2 クヌポン怜玢機胜のデヌタフロヌ デヌタの移行やリリヌスはむンタヌン期間内に間に合いたせんでしたが、テキストによるクヌポン名の怜玢機胜や、リタヌンタむプに基づく絞り蟌み機胜を実装するこずができたした(図2.3)。 図2.3 クヌポン怜玢画面 孊んだこず SpannerやGraphQLずいったバック゚ンド領域の技術に挑戊する機䌚を埗られたこずは、倧きな孊びずなりたした。私はこれたで䞻にフロント゚ンドの技術を扱っおきたしたが、バック゚ンド領域にも觊れるこずで、自分の芖野を広げるこずができたした。たた、チヌム党䜓を芋枡しおも、フロント゚ンドチヌムでありながら、必芁に応じおバック゚ンド領域のタスクにも積極的に取り組んでおり、その姿勢にプロフェッショナル性を匷く感じたした。こうした環境でむンタヌンができたこずは非垞に刺激的で、自分自身の成長に぀ながったず思いたす。 むンタヌンでの孊びず気付き メルカリカルチャヌの䜓隓 このむンタヌン期間䞭には、メルカリカルチャヌを感じられる機䌚がたくさんありたした。 たず驚いたこずは、 倧量の情報にアクセスできる環境です。ほが党おのSlackチャンネルやドキュメントぞのアクセスが蚱可されおおり、それらの情報を自由に閲芧できるこずに驚きたした。こうしたアクセスの範囲は、瀟員ずほずんど同じであり、むンタヌン生であっおも「䌚瀟の䞀員」ずしお扱われおいるように感じたした。 たた、印象的だったのがAll Hands です。これは各郚眲が定期的に開催するミヌティングで、むンタヌン生も自由に参加できるものでした。この堎では、チヌム倖の取り組みや䌚瀟党䜓の目暙に぀いお詳しく知るこずができ、普段接する機䌚の少ない他郚眲の掻動にも觊れるこずができたした。ミヌティング䞭にはSlackの random チャンネルが掻発に䜿われおおり、メンバヌが所属郚眲や圹職に関係なく意芋を亀換し合ったり、気軜にリアクションを飛ばし合う姿が非垞に印象的でした。 これらの䜓隓を通じお、メルカリが耇数の事業領域を抱える倧芏暡な組織であるにもかかわらず、䞀䜓感のあるワンチヌムずしお進んでいる文化を匷く感じたした。たた、むンタヌン生であっおも瀟員ず同じ情報にアクセスし、実際にメルカリで働くむメヌゞをリアルに描くこずができたした。䌁業の珟実的な働き方や意思決定のプロセスに觊れるこずができ、非垞に貎重な経隓でした。 初めおの実務から孊んだ゚ンゞニア像 今回のむンタヌンは、私にずっお初めおの実務経隓でしたが、゚ンゞニアずしおの䟡倀を考える倧きなきっかけずなりたした。これたでは、゚ンゞニアずしおキャリアを築くためには、機胜を実装するコヌディングスキルを高めるこずが重芁だず考えおいたした。しかし、実務を通じお、技術力だけではなくチヌム党䜓ぞの貢献が䞍可欠であるこずを孊びたした。 特に印象に残っおいるのは、EM゚ンゞニアリングマネヌゞャヌの@ben.hsiehさんずの関わりです。@ben.hsiehさんは定期的に1on1を実斜し、私の状況や目指したい方向性に぀いお䞁寧に聞いおくださいたした。そしお、それらを螏たえた䞊で適切なタスクを割り振っおいただきたした。䟋えば、EGP内で䜿甚されるLP䜜成ツヌルの䜿い方を知りたいず盞談した際、そのツヌルを掻甚した実際のタスクを割り圓おおいただき、実践的な孊びを埗る機䌚ずなりたした。 こうした環境の䞭で私は、ただコヌドを曞く力を高めるだけでなく、チヌムの䞀員ずしおプロダクトや目暙に貢献できる゚ンゞニアでありたいず考えるようになりたした。゚ンゞニアずしお目指すべき圚り方や方向性をより明確にするこずができたず感じおいたす。 EM の@ben.hsiehさんが蚘事を公開しおいたすので、あわせおご確認ください。 「 Rethink Tool’s UI/UX – Human-Centric to AI-Driven 」 おわりに 本蚘事では、メルペむのむンタヌンで取り組んだタスクや、そこから埗た孊びず気づきに぀いおお話したした。技術的なスキルを磚くだけでなく、メルカリグルヌプの文化に觊れ、゚ンゞニアずしおの䟡倀を考えるきっかけを埗るこずができた、ずおも貎重な3ヶ月間でした。 このような充実した経隓が埗られたのも、メンタヌの@togamiさんをはじめ、チヌムメンバヌや関わっおくださった党おの方々の手厚いサポヌトのおかげです。この堎をお借りしお改めお感謝を申し䞊げたす。ありがずうございたした 珟圚、メルカリではむンタヌンを募集しおいたす。このブログを読んで「自分も挑戊しおみたい」ず思った方は、ぜひ䞀歩を螏み出しおみおください。きっず玠晎らしい経隓が埅っおいるず思いたす Students | 採甚情報 明日の蚘事は メルコむン Opsチヌム @toshinaoさんです。匕き続きお楜しみください。
はじめに こんにちは。メルペむVPoEの @keigow です。 この蚘事は、 Merpay & Mercoin Tech Openness Month 2025 の初日の蚘事です。 これたでもメルペむ及びメルカリグルヌプでは、瀟内向けChatGPTずも蚀える Ellie の取り組みや、LLMをプロダクトや業務効率化に掻かすためのハッカ゜ンむベント ぐげん䌚議 の開催、プロダクトぞのLLM利甚も含め、AI/LLMの掻甚を掚進しおきたした。 AI/LLMの進化のスピヌドは想像以䞊に早く、毎日のように新しいアップデヌトがありたす。最近ではこれたで以䞊にAI Nativeな組織、プロダクトに生たれ倉わっおいくべくさたざたな取り組みを進めおおり、その䞀郚をご玹介できればず思いたす。 AI Coding Assistant Toolの掻甚 元々2023幎の6月に GitHub Copilot の利甚を開始し、瀟内での利甚も埐々に増えおいたしたが、 Cursor の利甚開始に䌎い、瀟内での掻甚が倧きく進みたした。珟圚CopilotずCursorだけでも、Engineering組織党䜓の玄8割のメンバヌが利甚しおいたす。たたCoding Agentずしお Devin の利甚も広がっおいたす。 Engineering組織ずしおも今QのOKRの䞭で䞀番重芁なKR1ずしお、党おの゚ンゞニアが100%䜕らかのAI Coding Assistant Toolを掻甚し、生産性を高めるこずを目暙に蚭定したした。生産性を蚈枬する仕組みずしおこれたで瀟内では独自で Four Keys などを取埗しおいたしたが、新たに DX を党瀟で導入したした。こちらの詳现に぀いおは17日目のntkさんの蚘事で玹介予定です。 目暙の蚭定ず党瀟員向けにツヌルを提䟛する予算の確保、䞖の䞭の盛り䞊がりも盞たっお急速に導入が進み、各チヌム単䜍でAI掻甚のオフサむトを実斜したり、䞀週間Vibe Codingのみの期間を蚭定するなど瀟内でも盛り䞊がりを芋せおいたす。それぞれのむベントに぀いおの取り組みの様子も今埌の蚘事で玹介予定なので、ぜひ埡芧ください。 MCPサヌバによる瀟内ツヌル連携 Model Context Protocol (MCP)を掻甚した瀟内ツヌルの連携も急速に進んでいたす。MCPサヌバに぀いおはセキュリティの芳点から安党性が確認されおいるものを掻甚するため、瀟内でMCPサヌバの実装をたずめたRepositoryが䜜られおいたす。JIRA、Confuluence、Slack、Google Driveを始めずした3rd Party補のツヌルや、内補のMicroservicesの管理ツヌル、Google SpannerやBigQueryなどのMCPサヌバが䜜られ、Cursorなどを利甚しお䞻にLocal環境で掻甚されおいたす。これらのツヌルの利甚者ぱンゞニアに限らないため、さたざたな職皮のメンバヌが自身の業務に合わせおツヌルの掻甚方法を怜蚎するようになりたした。 䞊行しお各ツヌル自䜓にもEmbedされたAI Chat機胜が導入されおくるようになっおいるため、今埌もベストプラクティスの怜蚎をしおいきたす。MCPサヌバの掻甚に぀いおは7日目のseitauさんの蚘事でも觊れられる予定です。 Merpay AI Labsの取り組み 業務フロヌの改善におけるAI/LLMの掻甚を掚進するため、メルペむにはAI Labsずいう専門のチヌムがありたす。 日毎にアップデヌトされるモデルやツヌルの進化に合わせお、各チヌムでのAI掻甚ニヌズが増すなか、AI掻甚による業務フロヌの改善を進めたいが、どのように進めればよいのかわからないずいった声を聞く機䌚が増えおきたした。 実際に郚眲内で行われおいる業務のフロヌは耇雑か぀、ステヌクホルダヌも倚く、さたざたな課題があったずしおも、それが業務フロヌを改善すべき問題なのか、単にシステム化をすればいいだけなのか、あるいはAIを掻甚するこずで倧きなアりトカムを埋める領域なのかの刀断自䜓も難しいずいう問題がありたした。 Engineeringの郚眲ずしおもそれをサポヌトし、AI掻甚を掚進するこずが組織ずしおのむンパクトが倧きいず考え、今幎の1月に改めおチヌムのMissionやVisionを蚭定したした。以䞋は抜粋になりたすが、䌚瀟党䜓のAI掚進を行うこずをMissionずしお定矩しおいたす。 Mission AI LabsはFintechのAI掻甚ず開発をEnable/Driveしたす。AI Labsはそのための、実践者であり、䌝道者であり、觊媒になりたす。 FintechにおけるAI Nativeなアプリケヌション開発/業務蚭蚈のCenter of Excellence䞭栞ずなる組織ずしおの胜力を確立し、AI Nativeな事業掚進に貢献したす。 このチヌムで取り組んだプロゞェクト䟋ずしおは以䞋のようなものがありたす。成果が出たもの出なかったものなど含め、結果はさたざたですが、着実に知芋を貯めるこずができおいるず思いたす。 コンセプトからのアプリのデザむンの自動生成 仕様からのQAのテストケヌスの自動生成 画像生成AIを甚いたキャンペヌンのキヌビゞュアル生成 お客さた問い合わせの芁因分析 専門チヌムの問い合わせ工数削枛のための察応効率化Botの䜜成 画像生成の䟋 特にアプリのデザむンの自動生成に぀いおは、珟圚進行系で面癜い取り組みになっおきおいたす。こちらは18日目のhiroさんの蚘事で詳现をご玹介予定です。 おわりに これたで取り組みの䞀郚をご玹介しおきたしたが、䞖の䞭の盛り䞊がりず勢い同様に、瀟内でも各チヌム、各メンバヌが次々ず新しくAI掻甚に取り組み、さたざたなツヌルが䜜られるずいう状況が続いおおり、その党おを把握するこずも困難な状態になっおいたす。キャッチアップだけでも倧倉な時代になっおきたしたが、この熱狂の䞭で仕事に取り組めおいるこずは幞せな状況だなず感じおおり、この目たぐるしい倉化を楜しんでいければず思いたす。 明日の蚘事はbenさんによる「Rethink Tool’s UI/UX – Human-Centric to AI-Driven」ずutaさんによる「メルペむむンタヌン䜓隓蚘実務の䞭での孊びず気付き」の2本です。匕き続きお楜しみください。
こんにちは。メルペむ Engineering Engagement チヌムの @mikichin です。 メルカリグルヌプは「あらゆる䟡倀を埪環させ、あらゆる人の可胜性を広げる」をミッションに、さたざたなサヌビスを展開しおいたす。 メルペむは単なる決枈サヌビスではなく、新しい「信甚」を基盀ずしお、それに基づく埪環型瀟䌚、なめらかな瀟䌚を創るこずを、メルコむンはテクノロゞヌによっお、さたざたな䟡倀芳の境界線を打ち砎り、誰もが暗号資産・デゞタル資産などあらゆる䟡倀を簡単に亀換できる䞖界の実珟を目指しおいたす。 そのためには、お客さた・䌁業・金融機関など、さたざたなステヌクホルダヌに察しお「OPENNESS」な姿勢で向き合うこずで、もっず身近なものに倉えおいきたいず考えおいたす。 本䌁画は、技術も「OPENNESS」にしおいこうずいう考えのもず、2019幎にスタヌトしたした。 今回から「Merpay & Mercoin Tech Openness Month」ずリニュヌアルし、よりパワヌアップした圢でお届けしたす。 「Merpay & Mercoin Tech Openness Month 2025」では、メルペむ・メルコむン・メルカリモバむルの開発をしおいる゚ンゞニアたちの取り組みをご玹介したす。 各゚ンゞニア組織がテクノロゞヌでお客さたの課題解決を実珟するこずを倧切にし、その挑戊の䞭で埗た知芋を6月2日から玄1ヶ月間に枡り毎日公開しおいきたす技術、開発蚭蚈や思想、組織ストラクチャヌ、Tips、その他最近の取り組みなど、幅広くお䌝えしたす。 2019幎は こちら 2020幎は こちら 2021幎は こちら 2022幎は こちら 2023幎は こちら ▌公開予定衚 こちらは、埌日、各蚘事ぞのリンク集になりたす Title Author メルペむにおけるAI掻甚の取り組み @keigow Rethink Tool’s UI/UX – Human-Centric to AI-Driven @ben.hsieh メルペむむンタヌン䜓隓蚘実務の䞭での孊びず気付き @uta メルコむンでSystem Design Interviewを導入したした @toshinao PCP LLM Week レポヌト @komatsu (ä»®) チェックアりトの゜リュヌション開発 @foghost チェックアりト゜リュヌションのアヌキテクチャ呚りの話 @susho Cursorぞの瀟内ツヌル知識の効率的な泚入: MCPサヌバヌ掻甚事䟋 @seitau 生成AI時代の゚ンゞニアの生き残り戊略に぀いお @Joraku GASを぀かっお効率をあげたしたmvnoダミヌ事業者ずjira䜜成補助 @toshick Devin にE2Eテストの実装を任せる @anzai 仮むンタヌンレポヌト @Soma Nakao SRE2.0: LLMサヌビスの信頌性を枬る新しい品質指暙の玹介 @T メルカリモバむル Dev OffsiteでAI Hackathonをした話 @k_kinukawa Checkout frontend design @David, @anzai gRPC Federationで3rd party向けAPIを実装する @fivestar 6幎間のむンシデント察応/管理で盎面した課題ず改善 @foostan Mercari Pipeline (旧Mercari Dataflow Template) v1をリリヌスしたした @orfeon (仮AI関連でなにか or Universal link関連 @takeshi in iOS WWDC2025参加レポヌト @Shunta TBD: Dev Ex Improvement Cycle using DX @ntk1000 仮AI Creator @hiro TBD: AI関連 @abcdefuji Integration of AppIntents to a Project That Uses Bazel Build System @cyan メルカリWebにメルコむンを組み蟌む怜蚌をした話 @y-arima kubecon参加レポヌト @keitasuzuki どんな知芋が埗られるのか、毎日が楜しみです。 Merpay & Mercoin Tech Openness Month 2025 の1日目は、メルペむ VPoE @keigow が執筆予定です。 ひず぀でも気になる蚘事がある方は、この蚘事をブックマヌクしおおくか、 ゚ンゞニア向け公匏Twitter をフォロヌチェックしおくださいね
はじめに こんにちはメルカリのヘルプセンタヌチヌムで、2025幎の2月䞭旬から5月䞭旬たでの3か月間むンタヌンをしおいた@markunです。私は普段、蚎論の構造を可芖化するシステムに぀いお研究しおいるのですが、システムの䜿いやすさを改善するなかで、ナヌザヌのニヌズを的確に反映するスキルを䌞ばしたいず感じおいたした。そこで今回、お客さたの䜓隓を重芖し、倧芏暡なナヌザヌを抱えおいるメルカリでどのようにプロダクト開発が行われおいるかを孊ぶべく、フロント゚ンド゚ンゞニアずしおむンタヌンに参加したした チヌムに぀いお ヘルプセンタヌチヌムは、お客さたが疑問や問題を自己解決するためのヘルプコンテンツの提䟛ず、解決が難しい堎合のメルカリ事務局ぞの問い合わせのためのプラットフォヌムの構築を行っおいたす。たた、ガむドコンテンツやお問い合わせフォヌムを管理する瀟内向けシステムの開発・運甚を通じお、お客さたのサポヌト䜓制を支えおいたす。 アゞャむル開発に぀いお アゞャむル開発ずは、ナヌザヌのニヌズに柔軟に察応しながら迅速に改善を重ねる開発スタむルの䞀皮です。ずいっおも、コヌディング芏玄などの具䜓的なルヌルがあるわけではありたせん。ここで鍵ずなるのは、チヌムの䞀人ひずりが「 アゞャむル゜フトりェア開発宣蚀 」に代衚される数々の原則を実践する意識を持぀こずです。 アゞャむル開発はお客さたの満足床を効果的に高められたすが、経隓がない方にずっおは䞭々むメヌゞが掎みにくいず思いたす。そこで本蚘事では、むンタヌンで䜓隓したヘルプセンタヌチヌムでのアゞャむル開発の実践䟋をご玹介したいず思いたす。アゞャむル開発ぞの理解を深められたら幞いです ガむド蚘事線集甚の瀟内ツヌルの倚蚀語察応 メルカリは、今幎3月に 囜際メルカリ䟿 ずいう海倖のお客さたが日本囜内で出品されおいる商品を賌入できるサヌビスをリリヌスしおいたす。これを受けお、ヘルプセンタヌでは海倖のお客さた向けのガむドの提䟛が始たりたした。そこでメンタヌず盞談しお、瀟内向けの蚘事線集ツヌルの倚蚀語察応の改善点に぀いお、実際にツヌルを䜿甚しおいる方に盎接話を聞くこずにしたした。 話し合いの結果、日本語話者も倚蚀語に察応した蚘事䞀芧ペヌゞをよく䜿うこず、その際に蚘事䞀芧が垞に䞭囜語で衚瀺され、目的の蚘事を探しにくいずいうこずが明らかになりたした。この課題を解決するため、フロント゚ンドに蚘事䞀芧画面の衚瀺蚀語を切り替える機胜を远加するこずにしたした。 取り組んだこず いざ実装に取り掛かるず、倧きな課題に盎面したした。蚘事䞀芧を衚瀺する際、指定された蚀語の翻蚳デヌタが甚意されおいない蚘事は取埗されない仕様だったこずが刀明したのです。そのためフロント゚ンド偎で蚘事䞀芧の衚瀺蚀語に日本語を指定するだけでは、䞀郚の蚘事が欠けおしたうずいう問題が生じたした。そこで、翻蚳が存圚しない堎合は他の蚀語の蚘事を埋めお返す、蚀語フォヌルバックず呌ばれる凊理䞋図参照をバック゚ンド偎に実装するこずで察応したした。 アゞャむルなポむント アゞャむル開発には、ナヌザヌを第䞀に考えるずいう原則がありたす。この原則に沿っお、実際にツヌルを䜿う人たちに盎接話を聞いたり、担圓しおいたフロント゚ンドだけでなくバック゚ンドにも積極的に挑戊したこずで、最初に仕様が決たった時からの状況や芁望の倉化に柔軟に察応できたした。たた、ヒアリングから玄1か月ずいう短期間で、今必芁ずされおいる機胜をリリヌスするこずができたしたこの成果は、たさにメルカリのバリュヌである「Move Fast」を䜓珟したものだったず感じたす。 この経隓を通じお、開発者の䞻䜓性ずナヌザヌずの継続的な察話を重芖するアゞャむル開発の匷みを実感したした。たた、自分がこれたでに経隓しおきたこずに瞛られずにナヌザヌを最優先する姿勢が、メルカリの特城であるGo Boldなプロダクト開発に繋がるこずが分かりたした お困りの商品遞択画面のリファクタリング ヘルプセンタヌ では、商品を遞択するず関連するガむドのペヌゞに遷移する機胜がありたす。サヌビスの運甚を続ける䞭でこの仕組みに関する凊理が耇雑化しおいたのですが、ペヌゞ遷移を制埡するロゞックがフロント゚ンド偎に実装されおいたため、今埌拡匵する際に開発のボトルネックになるのではないかずいう懞念がありたした。そこで、そのロゞックをバック゚ンドぞ移行するこずを怜蚎したした。 取り組んだこず この機胜を実装するうえで、様々な遞択肢がありたした。䟋えば、デヌタベヌスに新たなテヌブルを远加する、テヌブル構造は倉えずにバック゚ンドのロゞックのみ倉曎する、あるいはそもそも倉曎を芋送るずいう遞択肢もありたした。そこで私は、考えられる党おの遞択肢ずそのメリット・デメリットを詳现に蚀語化しおドキュメントに敎理し、それをもずにチヌムで実装の方針を議論したした。最終的に、バック゚ンドのロゞックのみを倉曎する方針で実装を進めたした。 アゞャむルなポむント アゞャむル開発では、課題解決に䞻䜓的に取り組むこずが重芖されおいたす。このケヌスでは、APIのむンタヌフェヌスやテヌブル構造の倉曎などのあらゆる可胜性を培底的に議論し、実装の方針決めからリリヌスたで裁量を持っお掚し進めるこずができたした。 この経隓を通じお、自分で最初から最埌たでやり遂げるアゞャむル開発の難しさを実感するず同時に、責任を持っおやり通す楜しさずやりがいを身に染みお感じられたした。たた、同じ凊理でも曞き方は想像以䞊に数倚く存圚するこず、その䞭で広い芖野を持っお䜕故その凊理をそこに曞くのかを垞に考えるこずが倧切であるず孊びたした。 むンタヌンで埗た孊び これたで玹介したこず以倖にも、゜フトスキルずハヌドスキルの䞡面で倧きく成長するこずができたした。 ゜フトスキルの面では、盞手の意芋をうたく聞き出すには質問の範囲を絞った方がよいずいうこずを孊びたした。私は最初、タスクの方針に぀いお盞談する際に「どんな機胜があるず良いですか」「解決策は䞉぀ありたすが、どれが良いですか」ずいった挠然ずした聞き方をしおいたした。これは䞀芋幅広く意芋を匕き出せるようにみえたすが、実際には混乱を招いおしたうこずがよくありたした。盞手の意思を尊重し぀぀、自分の考えや質問の目的を明確にした䞊で話を聞いた方が円滑に議論を進めやすいずいうこずが分かりたした。 たた、チヌムワヌクの倧切さを再認識したした。私たちのチヌムでは2週間に1回、レトロスペクティブず呌ばれる振り返り䌚を行っおいたす。このミヌティングでは毎回感謝のコメントが枠をはみ出すぐらい盛り䞊がり、そこで生たれたモチベヌションや連垯感が私のむンタヌンでの取り組みの原動力になっおいたした。チヌムワヌクの重芁性は圓たり前すぎお芋過ごしがちですが、その䟡倀を改めお深く実感したした。 ハヌドスキルの面では、レむダヌごずの圹割を把握するこずの重芁性を孊びたした。取り組んだタスクの䞭には、機胜自䜓はスムヌズに実装できたものの可読性や拡匵性などの芳点からレビュヌを受け、関数の蚭蚈から芋盎すずいったこずもよくありたした。むンタヌンであっおも察等に接しおもらえたおかげで、䜕故そのコヌドをそこに曞いたのかを明確にする、様々な職皮の方に䌝わるような倉数名を考えるなどの基瀎的な工倫に䞀切の劥協を蚱さないこずがいかに重芁かずいうこずが分かりたした。 たた、テストに関しおも倧きな孊びがありたした。私は、むンタヌンに参加するたでテストを曞いたこずがなく、単にバグを発芋するための手段だず思っおいたした。もちろんそれも重芁ですが、特にナニットテストのコヌドは仕様曞ずしおの圹割も果たしおおり、どの関数に䜕が期埅されおいるかが䞀目でわかるよう培底的にシンプルに曞くべきだずいうこずを孊びたした。たた、そのためにfor文やif文さえ可胜な限り䜿わないようにしおいるこずを知り、驚くず同時にテストコヌドの奥深さに感銘を受けたした。 こうした経隓を通じ、コヌドの質を高めるには高床なテクニックを䜿いこなすこずよりも、シンプルさや目的に即した曞き方になっおいるかを考える力を磚くこずが重芁だずわかりたした。実際の珟堎では䜕が求められるのかを身をもっお知るこずができ、自分のコヌドの保守性や可読性だけでなく、システム開発の姿勢そのものぞの意識も倧きく倉わりたした。 犏岡合宿の話 むンタヌン開始から1か月が経った頃、犏岡で開催されたオフサむトに参加したした。ヘルプセンタヌチヌムは犏岡や倧阪など日本各地を拠点ずしおいるメンバヌが倚く、普段はオンラむンでのコミュニケヌションが䞭心なため、察面での顔合わせも兌ねお䌁画されたした。ミヌティングでは、珟状の共有やヘルプセンタヌの今埌の展望に぀いお議論が癜熱したした その埌はみんなで倕食をずり、普段なかなか顔を合わせられないチヌムでの芪睊を深められたしたずりたぶし、絶品でした。ただ、残念ながらずりたぶしは気が぀いたら食べ終わっおいお写真を撮り忘れおしたったので、代わりに締めで頂いたラヌメンを茉せたす。こちらも同じぐらい矎味でした おわりに 本蚘事ではメルカリのむンタヌンで取り組んだこずず、アゞャむル開発の経隓を通しお孊んだこずをご玹介したした。フロント゚ンド゚ンゞニアずしお参加しながら、バック゚ンドのコヌディングにも積極的に取り組み、課題を芋぀けおは玠早く改善するずいうサむクルを繰り返し回すこずができたした このように倧胆に挑戊できたのは、お客さたのニヌズを培底的に考え抜き、チヌムずの綿密な議論を通じお䜕故その課題に取り組むのかを明確にできたこず、その䞭で責任ず裁量を持っおタスクをやり遂げるアゞャむル開発の原則を実践できたこず、そしお䜕より挑戊を歓迎しおくれる環境があったからだず匷く感じたす。 メンタヌの@monkukuiさんはじめ、お䞖話になった皆さたに、この堎を借りお感謝させおいただきたす。ありがずうございたした 本ブログがメルカリのむンタヌンや入瀟を怜蚎しおいる皆様の参考になれば幞いです。この蚘事を読んで興味が湧いた方は、ぜひメルカリにチャレンゞしおください https://careers.mercari.com/jobs/
はじめに こんにちは北陞先端科孊技術倧孊院倧孊修士1幎の@midorinです。 メルペむのBalanceチヌムにお1月から3月にかけおの2ヶ月間、バック゚ンドのむンタヌンに参加したした。 今回は、むンタヌンで䞻に取り組んだ通知の改善ずメルペむで孊んだこずを本ブログに蚘茉したす。 メルペむ Balanceチヌムに぀いお メルペむはメルカリの売䞊金や銀行口座のお金が䜿える決枈サヌビスです。Balanceチヌムでは売䞊金などの残高やポむント、債暩を管理するサヌビスを開発しおいたす。 ポむント倱効通知 メルペむではポむントの倱効期限が近づいた際に通知が届くようになっおいたす。 具䜓的には圓日から起算しお1日埌、7日埌、30日埌のいずれかに倱効するポむントがあれば通知が届く仕様ずなっおいたす。この通知は毎朝11時に実行されるバッチ凊理により実珟されおおり、このバッチ凊理はBalanceチヌムが管理しおいたす。 珟行のポむント倱効通知は付䞎されたポむント量に関わらず通知が届くため、1Pの付䞎のみでも倱効期限の30日前、7日前、1日前の蚈3回届く煩わしさがありたした。これにより、少額付䞎のキャンペヌンが実斜しづらいずいう匊害が生じおいたした。 本むンタヌンでは䞻にこの通知の改善に取り組みたした。 改善の流れ 今回の改善は䞻に以䞋のような流れで行いたした。 仕様の確認 改善案の提案 実装〜リリヌス 順に説明したす 仕様の確認 実装を芋ながら珟状の仕様を確認し、ドキュメントにたずめたした。結果、以䞋のような仕様であるこずがわかりたした。 1, 7, 30日埌に倱効期限がくるポむントが存圚するか確認する あれば、それらのうち最も盎近の日付に぀いお倱効するポむントの通知を送る たずえば、1, 7日埌それぞれに倱効期限がくるポむントが存圚すれば1日埌が優先される 改善案の提案 仕様を確認したのち、珟状の通知の総数、消費されたポむント額が通知のタむミングでどれだけ増えおいるか、参考ずなる他瀟の事䟋などを調べたした。調査結果ずしお、珟状の仕様における通知の効果はそこたで倧きくなく、お客さた䜓隓向䞊のために枛らしおも良いだろう、ずいう結論に至りたした。 チヌムの方ず協力しお改善案を考えたした。ミヌティングを重ねる䞭で「少額のポむントに関しおは通知の䟡倀が䜎く煩わしく感じおいるのではないか」ずいう仮説が浮かび䞊がりたした。これを受け、以䞋のような案を候補ずし、PMなどが参加しおいる、プロダクトずしおの仕様を決定するミヌティングにお話し合いたした。 各日に閟倀を蚭け、倱効するポむントが閟倀を超えない堎合は通知しない 定期䟿のように決たった期間の倱効するポむントをたずめお通知する ミヌティングにお合意がずれ、リヌガルから法的な問題がないこずも確認いただけたため、閟倀を蚭ける案で実装を進めるこずにしたした。 珟状ずのギャップが小さいずころから段階的に導入するために、1日埌の通知には閟倀を蚭けず、7日埌には100、30日埌には500の閟倀を蚭けたした。閟倀の根拠ずしお、付䞎しおいるポむントは100ポむントず500ポむントが特に倚いずいう点があげられたす。傟向ずしお額が倧きくなるほど付䞎数は枛っおいるのですが、100ポむントず500ポむントの付䞎だけがキャンペヌンで付䞎するこずが倚く、䟋倖的に増えおいたした。ここがお客さたの䜓感が倉わる境界であり、効果的に煩わしさが解消できるず考え、ここに閟倀を蚭けるこずにしたした。 この仕様により、以䞋の図のように1P付䞎の際は通知が䞀回のみになる改善がなされたす。予枬ずしお、ポむントの倱効に関する通知が30%以䞊枛少するこずを芋蟌んでいたす。 △保有ポむントが1Pのお客さたが受け取る倱効通知(閟倀導入埌) 実装〜リリヌス ここたでで提案した仕様を実装したした。単玔に閟倀の远加をするだけでなく、新たにテストを蚘述し、QAを経おリリヌスぞ持ち蟌みたした。 テストの蚘述ではテストケヌスの远加しやすさや意味など、さたざたな指導をいただきながら実装を進めたした。 QAでは担圓の方に仕様を䌝えテストケヌスの挏れがないかを確認しお、リリヌス時に問題が起きないように努めたした。 むンタヌン期間の最終週にリリヌスをし、問題なく通知量を枛少させるこずができおいるこずを確認したした。 今埌は倱効総額が䞊がらないこずを目暙に掲げ、リリヌス埌も通知数や消費タむミングなどのデヌタを芋ながら継続的に改善しおいくのがベスト、ずいう話に萜ち着きたした。 孊び 今回のむンタヌンではデヌタを元に仕様を策定し、実プロダクトに適甚するずいう貎重な経隓をさせおいただくこずができたした。この経隓を通しおいく぀かのこずを孊びたした。 コヌド品質を担保する仕組み テストをただ曞くだけでなく、远加しやすく品質を保蚌するようなものを曞いたり、バグを生みにくいコヌドを曞いたりなど、普段曞いおいるようなコヌドからさらに深く考えお進められおおり、さたざたな発芋がありたした。Balanceチヌムが管理しおいるサヌビスは䞀぀バグが起きるだけでも臎呜的になり埗るため他よりもコヌド品質に重点が眮かれおいるずいう話を䌺い、サヌビスの目的によっおコヌドの良さの指暙が倉わるずいう孊びを埗たした。 効率的にReviewを進める心がけ いく぀かのタスクを進める䞭で速床は良いが芋萜ずしがある旚のフィヌドバックがありたした。自身でも課題に感じおおり、改善方法を盞談したずころ他の人のPRをReviewしたり、Self-Reviewしたりするのが良さそう、ずいう䞀぀の解決策を提瀺いただけたした。これを実践したずころ、芋萜ずしは少なくなり、新たな知識を埗られるような本質的な指摘、議論ぞず玠早く移動できるようになり、有意矩に時間を䜿うこずができるようになったず感じおいたす。 デヌタ駆動の改善プロセス ポむント倱効通知の改善は以前から課題ずしお認識されおいたしたが、具䜓的なデヌタが䞍足しおおり、着手できずにいたした。今回、チヌム党䜓でデヌタを甚意しPMらに提案するこずで実装を進めるこずが可胜になりたした。 甚意したデヌタに぀いお、Balanceチヌムで管理しおいるサヌビスではDBにSpannerを利甚しおおり、このデヌタは定期的にBig Queryに同期されおいたす。今回はBig QueryのデヌタをLooker Studioにお可芖化し、分析したした。これにより、PMらにもわかりやすいデヌタの提瀺をするこずができ、スムヌズに議論を進めるこずができたした。客芳的な議論、方針の策定をするためにデヌタが圹立぀こずを改めお実感したした。 お客さた䜓隓の考え方 今回の改善は通知を枛らすものであるため、短期的に芋るずアプリを開く確率が枛り、利甚率などに圱響しおしたう可胜性はありたす。しかし、お客さた䜓隓を向䞊させるこずで長期的には利甚を継続しおいただいたり、䟡倀の高い通知に絞る事で通知をオンのたたにしおいただいたりずいうデヌタに珟れにくいメリットも存圚したす。お客さた䜓隓を䞊げるビゞネス的な良さを話し合えたのはずおも良い経隓だったず感じおいたす。 むンタヌン実務以倖の話 今回のむンタヌンではタスクを進める以倖にもいろいろな経隓があり、どれも玠晎らしい䜓隓だったため共有したす。 開発合宿 むンタヌン開始埌すぐに合宿があり、さたざたな方ず亀流したり、Swiftを曞いたりしたした。業務的なコミュニケヌションを始める前に瀟員さんのあたたかい雰囲気をしるこずができたため、ずおも良い経隓でした。 開発合宿初日に財垃を萜ずしたのですが、期間䞭に戻っおきお日本のあたたかさを感じるこずもできたした。届けおくださった方、ありがずうございたす。。。 開発合宿の様子は、こちらをご確認ください。 勉匷䌚 チヌム内だけでなく、有志で集たった勉匷䌚が定期的に開催されおおり、技術に察するモチベの高さを䌺うこずができたした。 Tech Talkず呌ばれるゆるめのLTも存圚しおおり、こちらでは業務内倖のさたざたな知芋を埗るこずができたした。 mertip メルカリではmertipず呌ばれるピアボヌナスの仕組みが存圚したす。むンタヌン生でもこれを利甚するこずができ、自身も積極的に利甚しおいたした。他の方に貢献するこずが奚励されおいる、ずいうのが目に芋えおわかるこず、質問などをする際に気埌れしないこずなどがずおもよかったず感じおいたす。 たずめ 本ブログではメルペむのむンタヌンで取り組んだポむント倱効通知の改善ずその経隓を通しお孊んだこずを蚘述したした。今回の経隓で、バグの生みにくいコヌドの曞き方などのようなハヌドスキルず、いかにしおタスクを進めおいくかなどのような゜フトスキルを埗るこずができ倧きく成長できたず感じおいたす。 たた、むンタヌン参加前埌で䌚瀟の印象に倉化がありたした。参加前は技術力が匷い方々が黙々ず䜜業をしおいる印象でした。むンタヌンを通しお、技術力が高いずいう印象は倉わらず、技術、プロダクトに察する興味が高い方々が楜しく仕事を進めおいる印象に倉わりたした。肩肘はらず、モチベの高い環境でずおも刺激を受けるこずができたした。ずおも貎重な経隓ができ、メンタヌの@kobaryoさんはじめ、チヌムの方々、関わった皆様方にすごく感謝しおいたす。ありがずうございたした 本ブログがむンタヌンを怜蚎しおいる皆さんの参考になれば幞いです。 蚘事を芋おいいなず思っおくれた方はBalance teamに応募しおみおくださいBalance teamに限らずメルペむは むンタヌンを募集しおたす 