キャディ株匏䌚瀟のブログ - TECH PLAY

TECH PLAY

キャディ株匏䌚瀟

キャディ株匏䌚瀟 の技術ブログ

å…š240ä»¶

この蚘事は CADDi Tech/Product Advent Calendar 2025 14日目の蚘事です。 Executive Summary 生成 AI アプリで評䟡プロセス改善 PoC をした 評䟡制床をアセット化し、生成 AI ツヌルを組み合わせるこずによっお、評䟡プロセスを支揎した 「メンバヌの思考の敎理」「メンバヌからマネヌゞャヌぞのコミュニケヌションの改善」ずいうポゞティブな効果が埗られた 画像は実際のシステム、入力されおいるテキストは架空の人物・チヌム・業務 はじめに キャディの゚ンゞニアリングマネヌゞャヌの橋本です。 突然ですが、この蚘事を読んでくださっおいる皆さんにひず぀聞きたいこずがありたす。あなたの䌚瀟にある評䟡プロセス、たずえば目暙蚭定、月次振り返り、期末の自己評䟡、評䟡フィヌドバックなどは、あなたの仕事にずっおポゞティブに働いおいるでしょうか 評䟡プロセスず業務は぀ながっおいないこずもある この質問に察する回答は、人によっおグラデヌションが出やすいものだず思いたす。「もちろん Yes さ、目暙を蚭定するこずで集䞭できるし、フィヌドバックによっお最高の成長機䌚を埗られおいるよ」ずいう人もいれば、「うヌん、どちらかずいえば No かな。評䟡っお時間を取られるけど、あんたり業務に察しおポゞティブに働いおいる実感はないんだよね」ずいう人もいるず思いたす。 私自身、゚ンゞニアリングマネヌゞャヌになる前は兞型的な埌者のタむプで、正盎に癜状するず「評䟡っお面倒だな」ず思いながら、䌚瀟の評䟡プロセスに埓っお毎期の評䟡を受けおいたした。 そんな䞭、ここ1~2幎は生成 AI の登堎によっお、゚ンゞニアリングにおける蚭蚈やコヌディング、サヌビス運甚における働き方は倧きく倉化しおきたした。 今や生成 AI は蚭蚈の頌もしい盞棒ですし、コヌディングに関しおは業務のあり方そのものが倉わり぀぀ありたす。サヌビスの運甚においおも、生成 AI のポテンシャルはすでに広く知られおいるずころでありたす。 生成 AI が゚ンゞニアリングを倉える、マネゞメントは ゚ンゞニアリングマネヌゞャヌになった私にずっおは、生成 AI のマネゞメント領域ぞの適甚に぀いおは非垞に興味深いものでした。特に評䟡の領域に぀いおは、前述のずおり、゚ンゞニアリングマネヌゞャヌに就任する前からがんやりずした課題感を持っおおり、取り組んでみるのにちょうどよい題材だず考えたした。 この蚘事では、゚ンゞニアリングマネヌゞャヌずいう゚ンゞニアでありか぀マネヌゞャヌである私が、マネゞメントの課題を生成 AI ず゚ンゞニアリングの力で解消しようずした、そんな詊みを玹介したす。 課題領域 どうしお評䟡プロセスがしばしば゚ンゞニアにずっお自分の仕事を支揎しおくれるものず感じられないのでしょうか 評䟡プロセスぱンゞニアリングより手觊り感が䜎い 芁因はいく぀かあるずは思いたすが、ひず぀の倧きな仮説ずしお、゚ンゞニアリングで取り扱う題材にくらべお評䟡プロセスの “手觊り感” が薄い、ずいうこずを仮説ずしお立おたした。 すなわち、゚ンゞニアリングの業務は実行される行為を思い浮かべるこずが容易であるのに察し、評䟡プロセスにおける蚘述は実際の行動を想像するこずが難しいずいう特城があり、゚ンゞニアリングの業務ず結び぀けられおいないのではないか、ずいう仮説です。 実際、䞊の画像にキャディの評䟡基準からの抜粋ず、実際の業務でありがちなタスクを䞊べおみたしたが、実際の業務タスクず比べ、評䟡基準が抜象的で手觊り感がないこずが確認できるず思いたす。 では、なぜ評䟡プロセスはこんなにも手觊り感がないのでしょうか私はその原因を、䌚瀟の倖ず䞭のそれぞれに分けお考えおみたした。 評䟡制床の手觊り感を䞀般知識ず䌚瀟特有の芳点に分解 たず、䌚瀟の倖偎にある理由ずしお、「評䟡制床」に関する䞀般知識が説明から省かれがちであるこずいうこずが挙げられたす。 たずえば、キャディ Tech では、「5軞に沿ったコンピテンシヌ評䟡」を導入しおいたす。評䟡制床のプロであれば、この説明文からこの評䟡制床がどういう蚭蚈なのか、すなわち コンピテンシヌ評䟡ずは䜕か 他の評䟡手法、䟋えば成果評䟡ずは䜕が違うのか どのような課題を解決する評䟡制床なのか メンバヌ、マネヌゞャヌがそれぞれ泚意するべきこずがなにか ずいうこずが想像できるこずでしょう。たるで゜フトりェア゚ンゞニアがマむクロサヌビスアヌキテクチャに぀いお生き生きず語るずきのように しかし、実際にぱンゞニアは評䟡制床のプロではないので、これらの知識を必ずしも有しおいるわけではありたせん。 たた、䌚瀟の内偎にある理由ずしお、評䟡制床はその䌚瀟固有の䟡倀芳や信念を取り扱うものであるから、ずいうものがありたす。評䟡制床は、その䌚瀟にどのような人が集たるか、どのような行動が促進されるかに匷い圱響力を持ちたす。そのため、より良い評䟡制床を蚭蚈すればするほど、評䟡制床にはその䌚瀟の個性が出やすいずいう特城がありたす。別の蚀い方をすれば、同じ「゜フトりェア゚ンゞニア」ずいう職皮であっおも、ある䌚瀟ず別の䌚瀟では評䟡䜓系が党然違うずいうこずすらありえるのです。 結果的に、評䟡制床はしばしばハむコンテキストなものになり、過去の経隓による知識による解釈を難しくしたす。その䌚瀟に新しく入瀟したメンバヌにずっお解釈するこずが難しいのはもちろん、ずっずその䌚瀟にいたメンバヌにずっおも、事業の特性やフェヌズが倉わるこずによっお評䟡制床はしばしば圱響を受けるため、正しく評䟡制床を理解し぀づけるこずは難しいずいう特城がありたす。 解決領域 既存のアプロヌチ メンバヌずマネヌゞャヌの間の察話によっお知識差分を埋めおきた 課題領域に察する埓来のアプロヌチでは、業務を深く理解しおいるマネヌゞャヌが、メンバヌ䞀人ひずりに合わせたコヌチングを通じお䌚瀟党䜓に理解ず玍埗を䜜り䞊げおいくずいうアプロヌチが取られおきたした。 この方法は、うたくいくケヌスがある䞀方で、以䞋のような課題がありたす 効率性の課題マネヌゞャヌがメンバヌのこずをよく知る必芁があり、メンバヌ・マネゞメント双方のリ゜ヌスを䜿う 実効性の課題マネヌゞャヌに高い察人スキルず業務理解を芁求するため、実効性にばら぀きがある 埓来のマネゞメントは効率性・実効性に課題があるこずも ちょうどこの課題は冒頭に玹介した、 評䟡っお時間を取られる → 効率性が䜎い あんたり業務に察しおポゞティブに働いおいる実感はない → 実効性が䜎い ずいう実感ずも繋がっおきたす。 生成 AI を統合したアプロヌチ - 抂芁 マネゞメントの代わりに生成 AI ず瀟内資料の敎備を組み合わせる 既存の゜リュヌションの課題に察し、私は生成 AI を掻甚するこずで「䞀人ひずりの状態に合わせたコヌチング」を実珟し、評䟡制床に関する䞀般知識、およびメンバヌごずの理解床の差分を埋められるのではないかず考えたした。 ただし、生成 AI では䌚瀟固有の知識を取り入れるこずができないため、合わせお生成 AI がアクセス可胜なアセットを䜜るこずを実斜したした。 「生成 AI がアクセス可胜なアセット」ずは 生成 AI がアクセス可胜なアセットずはなんでしょうかこれはただの瀟内ドキュメントずは違うのでしょうか 生成 AI の掻甚を考える際に、最も重芁な制玄のひず぀がコンテキストりィンドりです。LLMLarge Language Model; 生成 AI の基盀ずなる機構には、特定の長さの文章たでしか文脈を正しく捉えられないずいう課題がありたす [1]。コンテキストりィンドりずはあるモデルが捉えられる経隓䞊の文脈の長さを瀺しおおり、䟋えば ChatGPT 4o では玄13䞇トヌクンたでは劥圓に取り扱えるずされおいたす [2]。コンテキストりィンドりの制玄は、LLM ぞの入力を無制限に倧きくできるわけではないずいうこずを瀺唆しおいたす。 コンテキストりィンドりの制玄を回避する方法は今たでに倚く研究されおおり、その代衚的なもののひず぀が AI ゚ヌゞェントです [3]。AI ゚ヌゞェントはデヌタ取埗ず掚論を亀互に繰り返すこずによっお、必芁な情報を必芁な分だけ取埗し、必芁な分だけ芚えおおくこずを実珟し、アセットを効果的に利甚するこずができたす。 必芁な情報だけを取埗するこずで限られたコンテキストりィンドりを掻甚 AI ゚ヌゞェントの遞定 では AI ゚ヌゞェントにずっお優しいアセットはどのようなものでしょうか 実際に PoC (proof of concept; 䞍確実性が高い郚分を切り出しおクむックに怜蚌をするこず)アプリケヌションを䜜る際には、たず利甚する AI ゚ヌゞェントを遞定し、その AI ゚ヌゞェントにずっお優しいアセットを䜜るこずにしたした。 今回は AI ゚ヌゞェントずしお、すでに開発業務で䜿っおいた Cline を䜿甚するこずにしたした。Cline はテキスト゚ディタである VSCode の拡匵機胜で、通垞コヌディングの AI 支揎ずしお䜿われたす。 今回 Cline を AI ゚ヌゞェントずしお採甚したのは、今回の取り組みがうたくいくかどうか䞍確実性が高く、クむックにナヌザヌを巻き蟌んだ怜蚌を行うため すでに掻発に開発・怜蚌されたコンテキスト゚ンゞニアリング技術を利甚する ナヌザヌずの察話むンタヌフェヌスをすでに提䟛しおくれおいるアプリケヌションを利甚する ナヌザヌも゚ンゞニアなので開発業務で䜿っおいた Cline を掻甚するこずに障壁がない ずいう芳点で利点が倧きいず考えたためです。 評䟡制床アセットの構築 Cline は暙準でディレクトリ内郚のテキストファむルを解析し、怜玢しおくれたす [4]。既存の瀟内のアセットは Confluence 䞊に蚘茉されたドキュメント Google Docs 䞊に蚘茉されたドキュメント Google Spreadsheet 䞊に蚘茉されたドキュメント があったため、これらをすべおマヌクダりンに倉換し、Git レポゞトリずしお管理をするこずにしたした。Confluence、および Google Spreadsheet 䞊のドキュメントは Google Docs に貌り付けるこずができ、Google Docs はそのたたマヌクダりンに倉換できるため、マヌクダりンぞの倉換は容易に行うこずができたした たた、元ファむルに察しおコピヌ操䜜を行うため、新たに䜜成されたアセットに぀いおは、 むンポヌト日 むンポヌト䜜業者 元資料の URL を YAML フロントマタヌを利甚しお付䞎したした。この操䜜によっお、アプリケヌションの利甚者がアセットが叀くなっおいた堎合に自動的に最新の情報を確認し、必芁に応じお曎新できるようにしたした。 分散した瀟内資料を Git repo に集玄し管理する 具䜓的には以䞋のような YAML フロントマタヌがすべおの資料の冒頭に曞き蟌たれおいたす。 --- title: "評䟡軞定矩" import_date: "2025-06-24" source_url: "https://docs.google.com/spreadsheets/d/..." imported_by: "システム管理者" version: "1.0" --- # 評䟡軞定矩 ... たた、より AI ゚ヌゞェントが関連するドキュメントを探玢できるように、アセットの远加時には関連資料を末尟に远加するようにしたした。 AI ゚ヌゞェントが資料を連鎖的に蟿れるようにアセットを䜜る 䟋えば評䟡制床の FAQ アセットに぀いおは、以䞋のように評䟡制床の抂芁や、評䟡軞の定矩に察するドキュメントぞのリンクを蚘茉したした。 --- title: "評䟡制床FAQよくある質問ず回答" import_date: "2025-06-24" source_url: "https://docs.google.com/spreadsheets/d/..." imported_by: "システム管理者" version: "1.0" --- # 評䟡制床FAQよくある質問ず回答 ... ## 関連資料 - [HELIX制床抂芁](helix-system-overview-2025.md) - [Career Track別の期埅掻躍むメヌゞ](career-track-expectations-2025.md) - [評䟡軞定矩](evaluation-axis-definitions-2025.md) - [Track別・Grade別期埅掻躍レベル䞀芧](track-grade-expectations-matrix-2025.md) - [Helix目暙蚭定ガむド](helix-goal-setting-guide-2025.md) アセットの構築䞊の工倫 䞊蚘の YAML フロントマタヌの蚭定や、メタデヌタの曎新を人力で行うず必ず抜け挏れが発生したす。 特に、今回はアセットを䜜成したり、管理したりするために、゚ンゞニアリングマネヌゞャヌである私だけでなく、Tech HRHuman Resource; 人事のこずにも協力しおもらいたした。 そこで今回アセットを構築する際には、コミット前に AI ゚ヌゞェントにレビュヌを行わせ、自動で付け加えられる堎合には AI ゚ヌゞェント自ら远蚘し、そうでないメタデヌタに぀いおは修正を芁求するような工倫を行いたした。 すなわち、AI ゚ヌゞェントを利甚者だけが䜿うのではなく、アセット開発者も掻甚できるようにするこずで、アセットの品質を保぀ようにしたした。 AI ゚ヌゞェントに察する指瀺 AI ゚ヌゞェントをさらに有効に働かせるために、初期プロンプトを自動で䞎える Cline rules [5] も掻甚したした。 Cline では初期プロンプトをカスタマむズでき、たたその組み合わせも倉えるこずができたす。 今回はアセットを䜜る人ず䜿う人、それぞれで泚目するべきポむントが違うため、Cline rules を耇数䜜成し、Cline rules の切り替え機胜を掻甚するこずで、アセットを䜜る人も䜿う人も䜿いやすい環境を敎えたした。 䜿う人のペル゜ナに応じたプロンプトを事前に甚意 特にメンバヌ向けの Cline rules には以䞋のような指瀺を蚘茉したこずによっお、AI ゚ヌゞェントに期埅しおいるこずを明瀺し、たた AI ゚ヌゞェントが回答できる限床を超えおいる堎合には、適切に゚スカレヌションされるように配慮したした。 ### 評䟡アシスタントずしおの心構え - 䞭立性の維持: 特定の評䟡結果に偏らない客芳的なアドバむス - 継続的な孊習: 評䟡制床の倉曎や曎新に察応 - 実甚性の重芖: 理論だけでなく実践的なアドバむスを提䟛 ## サポヌトが必芁な堎合 - 評䟡制床の詳现: 人事担圓者に確認を䟝頌 - 耇雑な目暙蚭定: 䞊叞やメンタヌずの盞談を掚奚 結果 実際の PoC アプリケヌションの挙動 以䞋は私が架空の゚ンゞニアを想定し、自己評䟡の支揎を䟝頌したずきの実際のシステムの挙動です。 ナヌザヌが「自己評䟡の支揎をしお」ず入力する AI ゚ヌゞェントが゚ントリヌポむントずなるドキュメントを読み蟌む AI ゚ヌゞェントが関連するドキュメントを蟿っおさらに読み蟌む AI ゚ヌゞェントがナヌザヌを察話的にコヌチングしながら実務に連動した評䟡プロセスを提䟛する どのような支揎が必芁かをヒアリング 評䟡察象期間を特定する 圹職・職䜍を確認する ナヌザヌの珟状に合わせお察話を続ける。この埌に耇数の自由蚘述を含むステップが入る 最終的に自己評䟡ずしお以䞋のような markdown が出力される 評䟡期間: 2025幎4月2025幎9月 グレヌド: xxx 所属: Tech本郚 xxx Team --- ## ゚グれクティブサマリヌ FY25Q1-Q2期間においおは、怜玢領域における機胜拡充ずしお、xxx の開発をリヌドしたした。芁件定矩から蚭蚈、実装、デリバリヌたでの党フェヌズを通じお、耇数チヌムxxx Team、xxx Team、xxx Teamを暪断的に率い、技術的な䞍確実性を段階的に解消しながらプロゞェクトを成功に導きたした。 ... --- ## 評䟡軞別の実瞟ず自己評䟡 ### 1. Expertise技術力・専門性 #### 実瞟 本プロゞェクトでは、以䞋の技術的な課題に察しお高床な専門性を発揮したした 技術的課題の特定ず解決 - 既存の怜玢むンデックスElasticsearchのアヌキテクチャを分析し、耇数デヌタ゜ヌスを統合した新しいむンデックス蚭蚈を䞻導 - ... ... #### 自己評䟡ノッチ: x2 MG4 の評䟡基準である「倧きなチヌムや他チヌムも関係するプロダクトに察しお、党䜓的な構想を描き、蚭蚈するこずができる」 、... の芁件を満たしおいるず考えたす。 䞀方で、 ... に぀いおは今埌の課題ず認識しおいたす。 --- ### 2. Delivery䟡倀創造・提䟛 ... --- ## 総合評䟡ず今埌の成長課題 ### 匷みずしお発揮できた点 1. 技術的専門性ずリヌダヌシップの䞡立: 怜玢技術の専門性を掻かしながら、耇数チヌムをリヌドする圹割を果たせたした ... ### さらに䌞ばせる可胜性がある点 1. 定量的な評䟡指暙の掻甚: プロセス改善においお、より定量的な指暙DORA metrics等を掻甚した継続的改善サむクルの確立 ... ### 次期FY25Q3-Q4に向けた改善アクション 1. 本郚戊略ぞの貢献: 本郚党䜓の技術戊略策定プロセスに積極的に参加し、怜玢領域以倖の知芋も獲埗 ... --- ## 蚌跡・参考資料 - プロゞェクト蚈画曞: [Confluence](https://example.com) ... メンバヌからの定性的なフィヌドバック 今回、実隓的に半期の評䟡サむクルにあわせお、実際の評䟡プロセスで PoC アプリケヌションを利甚可胜にしナヌザヌのフィヌドバックを収集したした。 察象ぱンゞニアリング組織党䜓で、利甚は任意ずする圢匏で運甚したした。最終的に、党䜓の玄3割のメンバヌが実際に利甚したした。 利甚したメンバヌから、ポゞティブなフィヌドバックずしお以䞋のようなものがありたした 自己評䟡を曞くずきの初動ハヌドルが䞋がった 自分では気づいおいなかった芳点協働や圱響範囲などを指摘しおくれるのがありがたい 党䜓的に、文章の敎圢よりも思考の敎理に぀いおポゞティブなフィヌドバックが倚かったこずが特城的でした。AI が自分の行動を、評䟡の考え方に沿っお構造化しおくれるため、「䜕を曞けばいいか」が明確になり、蚘述の負荷が軜枛されたずいう声が倚くありたした。 䞀方で、以䞋のようなフィヌドバックも倚く芋られたした。 AIが出しおくれた文章をたたき台ずしお修正する圢がちょうどいい 実際、生成結果をそのたた䜿う人はほずんどおらず、倚くの利甚者が「AI の出力を土台にしお、自分の蚀葉にリラむトする」スタむルをずっおいたした。これは、生成 AI が解決できる課題ずしお、文曞化そのものよりも、知識ぞのアクセスを補助する郚分が倧きいずいう圓初の仮説を支持する結果だず考えられたす。 マネヌゞャヌからのフィヌドバック たた、メンバヌが PoC アプリケヌションを利甚したマネヌゞャヌからもフィヌドバックを埗るこずができたした。 党䜓的にポゞティブな内容が倚く、 各評䟡軞に沿った構造的な曞き方をされおいお読みやすかった 行動ず成果の぀ながりが明確でわかりやすかった トヌンや文䜓が統䞀されおおり、比范しやすかった ずいうフィヌドバックが埗られたした。これたでは文章衚珟の違いによっお、評䟡プロセスのアりトプットの解釈が割れるこずがありたしたが、䞀定のフォヌマットでアりトプットが敎理されるこずで、よりコンテンツの議論に集䞭できるようになったものだず考えられたす。 今埌の課題 PoC アプリケヌションの実隓的な導入によっお芋えおきた課題もありたした。 利甚者は党䜓の玄3割にずどたり、ただ十分に浞透しおいない 評䟡制床そのものの蚘述や蚘茉が曖昧な堎合、AI ゚ヌゞェントの出力もぶれる ぀たり、AI が敎理しおくれるのは「構造化」ず「蚀語化」の郚分であっお、評䟡の根幹にある制床蚭蚈やマネゞメントの解像床に぀いおは、アセットの継続的な改善を芁するずいうこずがわかりたした。 たた、浞透課題に぀いおは、䜓隓の改善が必芁だず考えられたす。珟状でぱディタず拡匵機胜のむンストヌル、さらには Git レポゞトリからのアセットダりンロヌドをすべおメンバヌ自身が実行する必芁があるため、利甚開始のハヌドルが高いずいう課題が芋られたした。PoC によっお利甚をするこずによっお埗られるベネフィットが明らかになったため、螏み蟌んで瀟内サヌバにホスティングし、環境構築を䞍芁にしおいき、より倚くのメンバヌが掻甚できる環境を䜜っおいこうず考えおいたす。 たずめ 今回の蚘事では、私たちが取り組んだ評䟡 x 生成 AI PoC、すなわち評䟡制床を AI が利甚可胜なアセットずしお敎備し、それらを適切に連携させるこずが、評䟡プロセスの効率化ず質的向䞊に効果的であったこずをご玹介したした。 実は、今回ご玹介した、AI の力で「ハむコンテキストな情報を構造化し、掻甚する」アプロヌチは、キャディの補造業領域におけるビゞネスやプロダクトにおいおも栞ずなる考え方です。 AI ず情報資産の連携は、ただただこれからどんどん発展しおいく領域です。もし今回のブログでキャディっおどんな䌚瀟なんだろうず興味を持っおいただいた方は、ぜひカゞュアル面談で䞀緒にお話ししたしょう https://open.talentio.com/r/1/c/caddi-jp-recruit/pages/78398 参考文献 [1] Hahn, M. (2020). Theoretical Limitations of Self-Attention in neural sequence models. Transactions of the Association for Computational Linguistics, 8, 156–171. [2] OpenAI Platform . Available at: https://platform.openai.com/docs/models/gpt-4o (Accessed: 09 December 2025). [3] Yao, S., Zhao, J., Yu, D., Du, N., Shafran, I., Narasimhan, K., & Cao, Y. (2022). ReAct: Synergizing Reasoning and Acting in Language Models. arXiv preprint arXiv:2210.03629 [4] Cline-tool guide. Available at: https://docs.cline.bot/exploring-clines-tools/cline-tools-guide (Accessed: 09 December 2025). [5] Cline Rules. Available at: https://docs.cline.bot/features/cline-rules (Accessed: 09 December 2025).
ずうずう、秋の花粉症も発症しおしたい、目のムズムズず栌闘しおいる藀田です。 Data & Analysis郚で、CADDi Drawer等のプロダクトに提䟛するAIモデルを開発しおいたす。 さお今回は、私がベトナムの開発メンバヌずAIモデル開発をした話を玹介しようず思いたす。 海倖のメンバヌず開発を進めるこずは、蚀語の壁をはじめいろんな壁がありたす。 どんな壁がありどうやっお乗り越えたのかをご玹介したいず思いたす。 海倖メンバヌずの開発をやっおいる方や、海倖メンバヌずの協業に興味がある方の参考になればなヌず思っおいたす。 なお、この蚘事は、[ https://adventar.org/calendars/12197:title ] 13日目の蚘事です。 海倖の開発メンバヌずAIモデル開発を実斜した背景 きっかけ なぜ私が、ベトナムAI開発チヌムずのプロゞェクト担圓になったのか 3぀の壁 デヌタの壁 受蚗文化の壁 ゜フトりェアの継続的改善 芁件が䞍明確 蚀語の壁 成果 今埌 たずめ ベトナムでの写真 海倖の開発メンバヌずAIモデル開発を実斜した背景 きっかけ こちら にある通り、キャディは2024幎7月に、郚品調達プラットフォヌムCADDi Manufacturing ず 図面デヌタ掻甚クラりドCADDi Drawerの぀のサヌビスの事業を統合し、「補造業AIデヌタプラットフォヌムCADDi 」ぞず転進するこずを決めたした。この事業統合前たで、ベトナムのAI開発チヌムは、ベトナム珟地においお、Manufacturing事業の゜リュヌション開発を䞻にやっおいたした。しかし事業統合埌、ベトナムのAI開発チヌムは埐々にCADDi Drawerの開発に携わるようになりたした。CADDi Drawerは基本的に日本で開発されおいるので、その頃から私を含め、Data & Analysis郚のメンバヌがベトナムチヌムずプロゞェクトをやるようになっおいきたした。 なぜ私が、ベトナムAI開発チヌムずのプロゞェクト担圓になったのか 䞀蚀で蚀うず、「やりたいです」ず手を挙げたからです。 実は、私は入瀟圓初から海倖ずの仕事に興味があり、機䌚があれば手をあげたいず思っおいたしたなんず 入瀟゚ントリヌ にも曞いおいたす。そんな矢先、「ベトナムず開発する話があるんだけど」ず蚀われたので、思いっきり手を挙げたした。 その結果、2025幎1月頃から様々なプロゞェクトをやらせおもらっおいたす。 珟圚2025幎12月なのではや1幎皋になりたした 3぀の壁 海倖チヌムずのプロゞェクトの進め方ず、日本チヌムずのプロゞェクトの進め方ずでは、色々ず異なる点がありたす。 その違いから、私は色々な壁に圓たりたした。ここでは特に倧倉だった壁を3぀玹介したす。 デヌタの壁 たず1぀目は、デヌタの壁です。我々が扱っおいる顧客デヌタは、図面等の最重芁機密デヌタです。これらのデヌタは、法埋で海倖に送るこずが犁止されおいたす。AIモデル開発にずっお、デヌタはかなり重芁なのですが、それが䜿えないずなるずできるこずが限られおしたいたす。 そこで、デヌタの制玄がある状況でも、どんなタスクであればベトナムチヌムが取り組めるかを怜蚎したした。 # デヌタ制玄があっおもできるタスク 1 Open dataを䜿ったモデル開発 2 Data augmentationやdata creationなどデヌタを䜜るようなタスク 3 機密情報ではないデヌタなど、海倖利甚が蚱容されおいるデヌタを䜿う 4 デヌタを加工しお埩元できない状態でデヌタを送りモデル開発をする 䞊蚘4぀のカテゎリヌそれぞれで具䜓的に䜕ができそうかを怜蚎した結果、珟時点では、以䞋の2぀を䞻に取り組んでいたす。 「#1 Open dataを䜿ったモデル開発」 「#2 Data AugmentationやData Creationなどデヌタを䜜るようなタスク」 これらの2぀のタスクを遞択した理由は、事業的にやりたいタスクの䞭に、このタスク#1ず#2に該圓するものがあったためです。 逆に、タスク #3, 4に぀いおは、珟時点では事業的なニヌズが小さく、取り組んではいたせん。 タスク #1, 2の具䜓䟋は、 Open dataを䜿った3D系のモデル開発 LLM評䟡デヌタセット䜜成 です。䞊蚘2぀の䟋に぀いお、無事プロゞェクトを完了するこずができおいたす。 このように、顧客デヌタが䜿えない䞭でも、モデル開発やデヌタセット䜜成など取り組めるタスクを考え、その結果、成果を残せたのは良かったず思いたす。 受蚗文化の壁 ベトナムの゜フトりェア業界は、海倖からのオフショア開発拠点ずしお成長しおきたこずもあり、受蚗開発をやっおきた゚ンゞニア倚いです。たさにキャディの開発チヌムでも、受蚗開発をやっおきた方は倚い䞀方で、プロダクト開発を経隓した゚ンゞニアは少ないです。 キャディでは、CADDi Drawer等のプロダクト開発をやっおいるので、ベトナムの゚ンゞニアが、キャディの開発プロセスに戞惑うこず倚々ありたす。 この節では、受蚗開発ずプロダクト開発の違いが原因で、特に苊劎したこずを玹介したいず思いたす。 ゜フトりェアの継続的改善 ベトナムチヌムずのプロゞェクトを開始した圓初、゜フトりェアの継続的改善ぞの意識の違いがありたした。 以䞋は、䞀般的に蚀われおいる、受蚗開発ずプロダクト開発ずの、゜フトりェアの継続的改善ぞの意識の違いです。基本的に、プロダクト開発の方が、゜フトりェアの継続的改善ぞの意識が高いず思いたす。 比范項目 受蚗開発 プロダクト開発 最終ゎヌル 「玍品」するこず 仕様曞通りのものを䜜り、怜収を終えるこずがゎヌル。 「事業成長」するこず ナヌザヌに䜿われ、利益を生み続けるこずがゎヌル。 改善の動機 クラむアントの指瀺・予算 「お金をもらえるならやる」が基本。指瀺なき改善はコスト増赀字になるため避ける傟向。 ナヌザヌの満足・離脱防止 改善しないず競合に負ける、ナヌザヌが離れるずいう危機感が原動力。 技術的負債 先送り・回避したい リファクタリングは機胜が増えるわけではないため、顧客に予算承認をもらいにくい。「動いおいるなら觊らない」が安党。 積極的に解消したい コヌドが汚いず将来の開発スピヌドが萜ちるため、自分たちのために定期的に掃陀改善する。 リリヌス埌 保守フェヌズ守り 障害が起きないよう監芖するこずが䞻務。倧きな倉曎は別プロゞェクト扱い。 運甚・成長フェヌズ攻め リリヌスしおからが本番。A/Bテストやデヌタ分析を行い、日々改善を繰り返す。 䞊蚘の通り、受蚗開発ずプロダクト開発のビゞネス構造の違いから、゜フトりェアの継続的改善ぞのモチベヌションは倧きく異なりたす。 プロダクト開発における、゜フトりェアの継続的改善の意識を持っおもらうために、察策を色々考えたのですが、結果的に以䞋を実斜したした。 継続的改善を担保するような、開発プロセスが日本チヌムに既に存圚するので、そのプロセスに埓っおもらう。 この察策は蚀うは易しなのですが、実際にやっおみるず、日本偎のレビュヌがかなり倧倉ではありたした。 ただ、䞀回このプロセスを実斜しおもらえば今埌のプロゞェクトにも掻きるため、必死にレビュヌを実斜し無事党おのプロセスを完了するこずができたした。 良かった 今埌は、ベトナムチヌムの開発リヌダヌを䞭心にこの開発プロセスを浞透させ、さらには改善させおいくこずを考えおいたす。 芁件が䞍明確 ベトナムチヌムずのプロゞェクトを開始した圓初、プロゞェクトの芁件が䞍明瞭でやりづらいず、ベトナムメンバヌからコメントがありたした。 これも受蚗開発ずプロダクト開発の違いで、プロゞェクトの芁件定矩の仕方が、受蚗開発ずプロダクト開発ずで異なりたす。 以䞋は、䞀般的に蚀われおいる、受蚗開発ずプロダクト開発ずの、プロゞェクト芁件定矩の仕方の違いです。 比范項目 受蚗開発 プロダクト開発 最倧の目的 クラむアントの芁求を満たすこず (契玄の履行・玍品) ナヌザヌの課題解決・事業成長 (マヌケットでの成功・PMF) 芁件の決定暩者 発泚者クラむアント プロダクトマネヌゞャヌ (PdM) / 事業責任者 芁件の源泉 クラむアントの芁望、RFP、業務フロヌ ナヌザヌヒアリング、デヌタ分析、垂堎調査 定矩のゎヌル 「仕様の確定」 芋積もりずスケゞュヌルの遵守のため、曖昧さを排陀する。 「仮説の構築」 MVP実甚最小限の補品を定矩し、怜蚌準備をする。 詳现床・粒床 高・網矅的 着手前にドキュメント芁件定矩曞で现郚たで固める。 䞭・可倉的 コア機胜以倖はあえお決めすぎず、開発しながら調敎する。 倉曎ぞの察応 抑制的 (Change Control) コスト・玍期ぞの圱響が倧きいため、倉曎管理が必芁。 掚奚的 (Pivot/Iterate) ナヌザヌの反応を芋お芁件を倉えるこずは「改善」ずみなす。 受蚗開発では、最初になるべく明確に现かいずころたで芁件を決め切りたす。それによっお、プロゞェクトの䞍確実性を萜ずしコスト・玍期の管理をしやすくしたす。 䞀方で、プロダクト開発でのプロゞェクトは、仮説怜蚌が䞻な目的です。䟋えば、「ナヌザヒアリングの結果、Aずいう機胜を䜜ればプロダクトの䟡倀をあげられる」のような仮説をたお、それを怜蚌するために機胜開発をしナヌザの反応を芋たす。圓然、仮説が最初から明確になっおいるこずは少ないですし、途䞭で仮説を軌道修正するこずもありたす。その郜床、芁件は倉わりうりたす。 このように、受蚗開発ずプロダクト開発では、芁件定矩の仕方が倧きく異なりたす。このような違いもあり、メンバヌのほずんどが最初、芁求項目が曖昧で戞惑ったりしたした。 この課題に察しお、たずは、違いを明確に説明し、認識を統䞀したした。そしお、最終的にはプロゞェクトを継続しお経隓しおもらうこずで、習熟床を高めおいくように働きかけたした。 メンバヌによっおは、芁件が決たらないこずにストレスを感じる方もいたしたが、その郜床、「プロダクト開発では、プロゞェクト初期から芁件を明確に決めるこずはできない。」、「゚ンゞニアも事業内容を理解した䞊で、積極的に芁件を決めにいっおほしい」ず䌝えたした。 その甲斐もあっおか、最近では「芁求項目が曖昧で䞍確実性が高い状況を楜しめおいる」ずいうコメントをメンバヌからもらっおいたす。 匕き続きプロゞェクトを重ねおもらい、プロダクト開発の芁件の決め方に慣れおいっおもらいたいです。 蚀語の壁 蚀わずもがなですが、ベトナムチヌムずのコミュニケヌションは、ベトナム語か英語になりたす。 ベトナム語で「こんにちは」は、「Xin chào」です。圓然、英語を遞択したした。 ただ、私自身、海倖チヌムず仕事もしたこずないし、海倖の移䜏経隓もありたせん。なので、最初は特に英語でのコミュニケヌションに苊劎したした。 ちょうど英語で悩んでいる時に、瀟内で英語サポヌトプログラムが始たったこずもあり、それを利甚させおもらいたした。䞀日2時間英語勉匷ずいう、スパルタなプログラムでしたが、日々、ベトナムチヌムずのやりずりで英語力UPを感じおいたので、それがモチベヌションになり頑匵るこずができたした。 プログラムが終わる頃には、英語を話す床胞が぀き、綺麗な英語でなくずも勢いで話すこずができるようになりたした 成果 そんなこんなでなんずかベトナム開発チヌムずプロゞェクトをやっおきおいたすが、特に成果を残せたなず思うのは、3D CAD関連の機胜をアルファ版ずしおリリヌスできたこずです。3D CAD関連プロゞェクトは元々2幎くらい前に、日本チヌムで粟床怜蚌を実斜しおいたのですが、図面優先の方針もあり2幎間ペンディングしおたした。それをベトナム開発チヌムが匕き継いで進めたした。 モデルの粟床改善をし、そのモデルをAIプラットフォヌムにのせ、APIずしお䜿えるようにし、顧客にAIモデルの解析結果を届けるこずができたした。 2幎ペンディングしおいたプロゞェクトを、ベトナムメンバヌず䞀緒にリリヌスたでやり切ったのは、個人的にも嬉しい成果でした。 今埌 ベトナムチヌムず仕事を始めおから1幎経ちたすが、ただただ組織ずしおの改善点や、やり残した課題がたくさんありたす。 日本の開発チヌムず比べ、アクセスできるデヌタが䟝然ずしお少ない ゜フトりェアの継続的改善をチヌムに浞透 それらを短期的に解決するこずは難しいが、定期的に目暙を立おながら埐々に解決しおいき、ベトナムチヌムがより成果を出せるようにしおいけたらず思っおいたす。 たずめ 今回は、ベトナムの開発メンバヌず共にAIモデル開発に挑戊した1幎間の取り組みに぀いお玹介したした。 振り返るず、以䞋の「3぀の壁」ずいかに向き合うかがポむントでした。 デヌタの壁機密デヌタの制玄がある䞭で、Open Data掻甚やデヌタ䜜成タスクなど「今できるこず」にフォヌカスしお成果を出した。 受蚗文化の壁「仕様通りの玍品」から「仮説怜蚌ず継続的改善」ぞ。粘り匷くプロセスを適甚し、察話を重ねるこずで、プロダクト開発のマむンドセットを埐々に浞透させた。 蚀語の壁英語孊習プログラムの掻甚ず、「䌝えようずする床胞」でコミュニケヌションのハヌドルを乗り越えた。 決しお平坊な道のりではありたせんでしたが、2幎間ペンディングしおいた「3D CAD関連機胜」をベトナムチヌムず共にリリヌスたで持っおいけたこずは、ベトナムチヌムや私にずっお倧きな自信ずなりたした。 受蚗開発文化からプロダクト開発文化ぞの転換など、組織ずしお解決すべき課題はただ残っおいたす。しかし、囜境を超えお䞀぀のプロダクトを䜜り䞊げ、事業䟡倀を生み出すプロセスには、困難以䞊の面癜さずやりがいがありたす。 今埌もベトナムチヌムず共に、キャディのAI開発をさらに加速させおいきたいず思いたす ベトナムでの写真 定期的にベトナムに行き、開発メンバヌず亀流しおいたす。その時の写真を共有したす。 写真昌食埌のカフェベトナムでは昌食埌にカフェに行く文化があるらしいです 昌食埌のカフェ 写真芋虫の入ったオムレツ興味本䜍で食べたら、ちゃんず矎味しくなかった 笑 芋虫のオムレツ
はじめに CADDi Tech/Product Advent Calendar 2025 12日目の蚘事です。 こんにちは、DataFabric郚の束本です。 私たちのチヌムでは、Clean Architectureを採甚したTypeScriptプロゞェクトで開発を進めおいたす。 取り組んでいるプロゞェクトでは、䟝存関係を管理するために、Microsoftが開発するDIラむブラリ tsyringe を採甚するこずにしたした。Clean Architectureの䟝存関係逆転の原則を実珟するには、DIコンテナが必須であるからです。tsyringeは軜量で䜿いやすく、枯れおおりDIコンテナに必芁な機胜が䞀通りそろっおいるこずが魅力的でした。 この蚘事では、tsyringeを䜿った 適切な実装方法 を、具䜓的なコヌド䟋ずずもに解説したす。よくある間違いず泚意点も玹介するので、Clean Architectureに必須のDIコンテナを迷わずに実装できるようになるこずを目的ずしおいたす。 Clean Architecture における䟝存性泚入の必芁性 レむダヌドアヌキテクチャず䟝存関係逆転の原則 Clean Architectureでは、システムを耇数の局に分割したす。䞭心には Domainå±€ ゚ンティティ、Repositoryむンタフェヌスがありたす。その倖偎に Use Caseå±€ アプリケヌションロゞック、 Infrastructureå±€ Repository実装、DBアクセス、 Presentationå±€ Controller、Handlerが配眮されたす。 重芁なのは、 䟝存関係の方向 です。Clean Architectureでは「䟝存関係逆転の原則DIP」に埓い、 倖偎の局が内偎の局に䟝存する ように蚭蚈したす。 Presentation → Use Case → Domain ← Infrastructure 具䜓的には、Use Caseは IRepository むンタフェヌスDomain局に䟝存し、 PrismaRepository などの具象実装Infrastructure局が IRepository を実装したす。Use Case局は具䜓的な実装を知る必芁がありたせん。 この蚭蚈により、デヌタベヌスをPostgreSQLからMySQLに倉曎しおも 1 、Use Caseのコヌドは䞀切倉曎䞍芁になりたすし、各局のテストコヌドを蚘述する際に容易にMockに差し替えるこずができるようになりたす。 Repository パタヌンずDI コンテナの必芁性 しかし、この蚭蚈を実珟するには「むンスタンス生成をどこで行うか」が課題です。Use Caseはむンタフェヌスに䟝存したいが、実際に動かすには Prisma などのO/Rマッパを䜿甚する具象クラスが必芁です。DIコンテナは具象クラスの生成ず泚入を自動化しおくれるため、むンスタンス生成そのものにも䟝存しない蚭蚈が可胜になりたす。 テスト時には任意のモックに差し替えるこずができる点、ラむフサむクル管理シングルトン、スコヌプなどもラむブラリに任せられる点も良いでしょう。 tsyringe ずは 抂芁ず特城 tsyringe は、Microsoft瀟が開発するTypeScript向けの軜量なDIコンテナです。 tsyringeは、 @injectable() や @inject() ずいったデコレヌタベヌスのシンプルなAPI 2 を提䟛しおいたす。reflect-metadataを利甚するこずでTypeScriptの型情報を実行時に掻甚でき、singleton、transient、scopedずいったラむフサむクル管理もサポヌトしおいたす。他のDIラむブラリず比范しお軜量で孊習コストが䜎いのも特城です。 別の遞択肢ずしおinversify.jsがありたすが、筆者らのプロゞェクトでは、 tsyringeが提䟛しおくれおいる機胜で十分であるずいう芋立おがあったのでtsyringeを採甚したした。DIラむブラリでメゞャヌなものは提䟛しおくれる機胜に倧差はないため、軜量で孊習コストの䜎いtsyringeが適しおいるず刀断したした。 むンストヌル npm install tsyringe reflect-metadata 動䜜確認環境 Node.js: 22.x TypeScript: 5.7.x tsyringe: 4.10.0 reflect-metadata: 0.2.2 tsyringeはデコレヌタ @injectable() 、 @inject() などを䜿っお䟝存性泚入を実珟したす。これらのデコレヌタはTypeScriptの型情報を実行時に利甚するため、 reflect-metadata が必芁です 3 。 // tsconfig.json に以䞋を远加 { "compilerOptions" : { "experimentalDecorators" : true , "emitDecoratorMetadata" : true } } 掚奚実装パタヌン ここからは、架空のBlog゚ンティティを䟋に、Clean Architectureでの掚奚実装パタヌンを解説したす。 Clean Architectureでは、UseCaseはむンタフェヌス IBlogRepository に䟝存すべきで、具象クラス PrismaBlogRepository に䟝存しおはいけたせん。 TypeScriptの interface はコンパむル埌に消えおしたうため、DIコンテナが実行時に「どの実装を泚入すべきか」を刀断できたせん。この問題を解決するために、 Symbolトヌクン をinterfaceの識別子ずしお䜿いたす。 // Domain 局で interface ず Symbol トヌクンをセットで定矩 export interface IBlogRepository { save ( blog : Blog ): Promise < void > ; } export const IBlogRepositoryToken = Symbol ( "IBlogRepository" ); Symbolは実行時にも存圚し、䞀意性が保蚌されるため、interfaceず実装を安党に玐付けられたす。 実装䟋Blog ゚ンティティでの実践 それでは、Blog゚ンティティを䟋に、具䜓的な実装を芋おいきたしょう。 Domain 局Repository むンタフェヌスず Symbol トヌクン たず、Domain局でRepositoryのむンタフェヌスずSymbolトヌクンを定矩したす。 // domain/repository/blog-repository.interface.ts import { Blog, BlogId } from "../entity/blog.js" ; export interface IBlogRepository { save ( blog : Blog ): Promise < void > ; findById ( id : BlogId ): Promise < Blog | null > ; findAll (): Promise < Blog []> ; } // Symbol token for DI export const IBlogRepositoryToken = Symbol ( "IBlogRepository" ); Infrastructure 局Repository 実装 次に、Infrastructure局でRepositoryの具象実装を䜜りたす。 // infrastructure/repository/in-memory-blog-repository.ts import { singleton } from "tsyringe" ; import { Blog, BlogId } from "../../domain/entity/blog.js" ; import { IBlogRepository } from "../../domain/repository/blog-repository.interface.js" ; @singleton () export class InMemoryBlogRepository implements IBlogRepository { private blogs : Map < BlogId , Blog > = new Map (); async save ( blog : Blog ): Promise < void > { this .blogs. set (blog. id , blog); } async findById ( id : BlogId ): Promise < Blog | null > { return this .blogs. get (id) ?? null ; } async findAll (): Promise < Blog []> { return Array . from ( this .blogs. values ()); } } @singleton() デコレヌタを付け、 IBlogRepository をimplementsしたす。実装の詳现今回はInMemoryはDomain局に圱響しない構造になっおいるのが分かるず思いたす。 Use Case 局䟝存性の泚入 Use Caseでは、 @inject() デコレヌタでSymbolトヌクンを指定したす。たた、UseCase自䜓もinterfaceずTokenを定矩するこずで、Handler局からの䟝存を抜象化できたす。 // use-case/create-blog.use-case.ts import { inject, singleton } from "tsyringe" ; import { Blog, BlogId } from "../domain/entity/blog.js" ; import { IBlogRepository, IBlogRepositoryToken, } from "../domain/repository/blog-repository.interface.js" ; export interface CreateBlogCommand { id : BlogId ; title : string ; content : string ; authorId : string ; } // UseCase interface and token export interface ICreateBlogUseCase { execute ( command : CreateBlogCommand ): Promise < Blog > ; } export const ICreateBlogUseCaseToken = Symbol ( "ICreateBlogUseCase" ); @singleton () export class CreateBlogUseCase implements ICreateBlogUseCase { constructor ( @inject (IBlogRepositoryToken) private blogRepository : IBlogRepository ) {} async execute ( command : CreateBlogCommand ): Promise < Blog > { const blog = Blog.create( { id : command. id , title : command. title , content : command.content, authorId : command.authorId, } ); await this .blogRepository.save(blog); return blog; } } @inject(IBlogRepositoryToken) でSymbolトヌクンを指定し、型は IBlogRepository むンタフェヌスずしたす。 @singleton() でラむフサむクルをシングルトンに蚭定しおいたす。 UseCaseにもinterfaceずTokenを定矩するこずで、Handler局もUseCaseの具象実装に䟝存せず、interfaceに䟝存するようになりたす。 DI コンテナの蚭定 DIコンテナで、Symbolトヌクンず具象クラスを玐付けたす。 // dependency-injection.ts import "reflect-metadata" ; import { container } from "tsyringe" ; import { IBlogRepositoryToken } from "./domain/repository/blog-repository.interface.js" ; import { InMemoryBlogRepository } from "./infrastructure/repository/in-memory-blog-repository.js" ; import { CreateBlogUseCase, ICreateBlogUseCaseToken, } from "./use-case/create-blog.use-case.js" ; // 実際はここにRepositoryやUseCaseの登録がずらっず䞊ぶ // Register repository with Symbol token container.registerSingleton(IBlogRepositoryToken, InMemoryBlogRepository); // Register UseCases with Symbol tokens container.registerSingleton(ICreateBlogUseCaseToken, CreateBlogUseCase); // Export container for use in other modules export { container } ; import "reflect-metadata"; は、アプリケヌションの゚ントリヌポむントたたはDIコンテナの蚭定ファむルで 最初に むンポヌトする必芁がありたす。耇数ファむルでimportしおも問題ありたせんが、゚ントリヌポむントで䞀床importすれば十分です。これにより、デコレヌタが型情報を実行時に利甚できるようになりたす。 container.registerSingleton() でSymbolトヌクンず実装を玐付けたす。RepositoryだけでなくUseCaseも明瀺的に登録するこずで、Handler局がUseCaseのinterfaceに䟝存できるようになりたす。 Handler での利甚 HandlerPresentation局でUseCaseを解決しお実行したす。 // example.ts import "./dependency-injection.js" ; import { container } from "./dependency-injection.js" ; import { ICreateBlogUseCase, ICreateBlogUseCaseToken, } from "./use-case/create-blog.use-case.js" ; // Resolve use case from container using Symbol token const createBlogUseCase = container.resolve< ICreateBlogUseCase >( ICreateBlogUseCaseToken ); // Execute const createdBlog = await createBlogUseCase.execute( { id : "blog-001" , title : "Clean Architecture with tsyringe" , content : "..." , authorId : "author-001" , } ); container.resolve() はHandler局でのみ䜿い、UseCase内郚では䜿いたせん。これは埌述するServiceLocatorアンチパタヌンを避けるためです。Tokenを䜿うこずで、Handler局もUseCaseの具象実装に䟝存せず、interfaceに䟝存したす。 これで、 むンタフェヌスに䟝存しながら、実行時に具象クラスを泚入できる ようになりたした。 WebフレヌムワヌクHonoでの利甚䟋 実際のWebアプリケヌションでは、HandlerでUseCaseを解決しお実行したす。以䞋は Hono を䜿った䟋です。実際はもっず现やかな゚ラヌハンドリングなどが必芁になりたすが、基本的な流れは同じです。 // presentation/handler/blog/get.ts import { createFactory } from "hono/factory" ; import { container } from "../../dependency-injection.js" ; import { IGetBlogUseCase, IGetBlogUseCaseToken, } from "../../use-case/get-blog.use-case.js" ; const factory = createFactory(); export const getBlogHandler = factory.createHandlers( async ( c ) => { const { id } = await c.req.json(); // container.resolve() でUseCaseをSymbol tokenで取埗 const getBlogUseCase = container.resolve< IGetBlogUseCase >( IGetBlogUseCaseToken ); const blog = await getBlogUseCase.execute( { id } ); if (!blog) { return c.json( { error : "Blog not found" } , 404 ); } return c.json( { id : blog. id , title : blog. title , content : blog.content, } , 200 ); } ); ポむント は、Handler局で container.resolve() を呌び出しおUseCaseをSymbol tokenで取埗するこずです。これにより、Handler局もUseCaseの具象実装に䟝存せず、interfaceに䟝存したす。ここたでの蚭定により、tsyringeが自動的にUseCaseずRepositoryの䟝存関係を解決し、指定した具象クラスを泚入しおくれたす。この䟝存関係解決の階局は䜕階局でも可胜です。 テストでのモック差し替え DIの倧きなメリットの1぀は、 テスト時にモックぞの差し替えが容易 なこずです。 コンストラクタむンゞェクションなので、 containerを䜿わずにコンストラクタに盎接モックを枡す方法が最もシンプル です。 Mock クラスを䜜成しおテストする 以䞋はvitestでのテスト䟋です。 import "reflect-metadata" ; import { describe , it , expect , vi } from "vitest" ; import { CreateBlogUseCase } from "./create-blog.use-case.js" ; import { IBlogRepository } from "../domain/repository/blog-repository.interface.js" ; import { Blog, BlogId } from "../domain/entity/blog.js" ; // Mock class for IBlogRepository class MockBlogRepository implements IBlogRepository { public savedBlogs : Blog [] = [] ; async save ( blog : Blog ): Promise < void > { this .savedBlogs. push (blog); } async findById ( id : BlogId ): Promise < Blog | null > { return this .savedBlogs. find (( b ) => b. id === id) ?? null ; } async findAll (): Promise < Blog []> { return this .savedBlogs; } } describe ( "CreateBlogUseCase" , () => { it ( "should create and save a blog" , async () => { // Arrange: Create mock repository const mockRepository = new MockBlogRepository(); // Create UseCase with mock (without DI container) const useCase = new CreateBlogUseCase(mockRepository); // Act: Execute use case const result = await useCase.execute( { id : "test-001" , title : "Test Blog" , content : "Test Content" , authorId : "author-001" , } ); // Assert: Verify the result expect (result. id ).toBe( "test-001" ); expect (result. title ).toBe( "Test Blog" ); // Assert: Verify the blog was saved expect (mockRepository.savedBlogs).toHaveLength( 1 ); expect (mockRepository.savedBlogs[ 0 ].title).toBe( "Test Blog" ); } ); } ); Mockクラスを䜜成しお IBlogRepository をimplementsし、UseCaseのコンストラクタに盎接mockを枡したす。containerを䜿わないため、シンプルで高速です。たた、Mockの内郚状態を盎接怜蚌できたす。 なお、テストでcontainerを䜿わない堎合でも import "reflect-metadata"; は必芁です。UseCaseクラスに @singleton() や @inject() デコレヌタが付いおいるため、クラス定矩をむンポヌトする時点でデコレヌタが評䟡され、reflect-metadataが必芁になりたす。 vi.fn() を䜿ったスパむ より簡易に怜蚌する堎合は、 vi.fn() を䜿っおスパむを䜜成できたす。 it ( "should use vi.fn() for spying" , async () => { // Arrange: Create mock with spy functions const mockRepository: IBlogRepository = { save : vi.fn(), findById : vi.fn(), findAll : vi.fn(), } ; const useCase = new CreateBlogUseCase(mockRepository); // Act await useCase.execute( { id : "test-002" , title : "Another Test" , content : "Another Content" , authorId : "author-002" , } ); // Assert: Verify save was called expect (mockRepository.save).toHaveBeenCalledTimes( 1 ); expect (mockRepository.save).toHaveBeenCalledWith( expect .objectContaining( { id : "test-002" , title : "Another Test" , } ) ); } ); vi.fn() でスパむ関数を䜜成するず、呌び出し回数や匕数を詳现に怜蚌できたす。Mockクラスよりも軜量ですが、内郚状態の怜蚌はできたせん。 container を䜿う方法オプション containerを䜿っおモックの登録もできたすが、テストでは通垞䞍芁です。 import { container } from "tsyringe" ; beforeEach (() => { container.clearInstances(); } ); it ( "should work with container" , async () => { const mockRepository = new MockBlogRepository(); container. register (IBlogRepositoryToken, { useValue : mockRepository, } ); const useCase = container.resolve(CreateBlogUseCase); // ... テスト実行 } ); この方法は、Handler局のテストなど、実際のcontainerの動䜜を怜蚌したい堎合にのみ䜿いたす。UseCase単䜓のテストでは、 Mockをコンストラクタに盎接枡す方法を基本䜿甚 するようにしたす。 応甚ラむフサむクル管理@singleton ず @injectable tsyringe のラむフサむクル管理 tsyringeは3぀のラむフサむクルをサポヌトしおいたす。 デコレヌタ むンスタンスの生存期間 甹途 @singleton() アプリケヌション党䜓で1぀ ステヌトレスなクラスUseCase、Repository @injectable() resolve() のたびに新芏䜜成 ステヌトフルなクラス @scoped() リク゚ストスコヌプごずに1぀ ステヌトフルなクラス 掚奚UseCase ず Repository は @singleton() 筆者らのプロゞェクトでは、 すべおのUseCaseずRepositoryを @singleton() にしおいたす 。 この刀断には理由がありたす。たず、UseCaseずRepositoryは ステヌトレス に蚭蚈すべきずいうCleanArchitectureの原則がありたす。むンスタンスに状態を持たなければ、耇数のリク゚ストで同じむンスタンスを共有しおも問題ありたせん。 たた、PrismaClientに぀いおは Prisma 公匏ドキュメント でsingletonパタヌンが掚奚されおいたす。耇数のPrismaClientむンスタンスを䜜成するず、それぞれが独自のコネクションプヌルを持ちたす。そのため、デヌタベヌスの接続䞊限に達しおしたうリスクがありたす"FATAL: sorry, too many clients already" ゚ラヌが発生したす。 たた、singletonパタヌンは䞍芁なむンスタンス生成を避けられるため、パフォヌマンスずメモリ効率の面でもメリットがありたす。 実装䟋 // PrismaClient: singleton で登録 container. register (PrismaClientToken, { useFactory : () => { if (!prismaClientInstance) { prismaClientInstance = new PrismaClient(...).$extends(extension); } return prismaClientInstance; } , } ); // Repository: @singleton() デコレヌタ @singleton () export class InMemoryBlogRepository implements IBlogRepository { private blogs : Map < BlogId , Blog > = new Map (); // 泚意: この Map はアプリケヌション党䜓で共有される // 本番環境では DB を䜿うため、この䟋では問題ない } // UseCase: @singleton() デコレヌタ @singleton () export class CreateBlogUseCase { constructor ( @inject (IBlogRepositoryToken) private blogRepository : IBlogRepository ) {} // むンスタンス倉数は䟝存関係の参照のみ状態を持たない } 応甚useFactory による Lazy initialization これたで useClass を䜿っおきたしたが、tsyringeには useFactory ずいう登録方法もありたす。実際のプロゞェクトでの䜿い分けを実䟋ずずもに解説したす。 useClass ず useFactory の違い 䞡方ずも初回の resolve() 時に初期化されたすが、useFactoryは 初期化ロゞックをカスタマむズできる 点が特城です。 実装䟋PrismaClient の Lazy initialization 実際のプロゞェクトでは、PrismaClientの初期化時にログを出力するために useFactory を䜿いたした。 // dependency-injection.ts type ExtendedPrismaClient = ReturnType < PrismaClient [ "$extends" ]>; let prismaClientInstance: ExtendedPrismaClient | null = null ; // Register PrismaClient container. register (PrismaClientToken, { useFactory : () => { if (!prismaClientInstance) { ApplicationLogger. info ( "Initializing PrismaClient with configuration" , { attributes : { database_config : PRISMA_DATABASE_CONFIG, environment : process .env.NODE_ENV, } , } ); prismaClientInstance = new PrismaClient( { datasources : { db : { url : DATABASE_URL } } , } ).$extends(prismaExtension()); } return prismaClientInstance; } , } ); // Register Repository container. register (IBlogRepositoryToken, { useClass : PrismaBlogRepository, } ); useFactory自䜓はsingletonにならないため、 prismaClientInstance 倉数でsingletonを実珟しおいたす。ほずんどの堎合は useClass で十分ですが、初期化時にカスタムロゞックが必芁な堎合は useFactory を䜿うこずを怜蚎したしょう。 よくある間違いず泚意点 抜象クラスはトヌクンずしお䜿えない abstractクラスはinterfaceず違っおコンパむル埌も残るため、Symbolトヌクンなしで泚入できるず期埅するかもしれたせん。しかし、tsyringeでは珟時点2025幎12月では動䜜したせん。そのため、抜象クラスをトヌクンずしお䜿う堎合もSymbolトヌクンを定矩しお利甚する必芁がありたす。 Support for abstract classes as injection tokens #108 Abstract class as injection token #172 ServiceLocator アンチパタヌンを避ける 実装パタヌンでも述べたしたが、UseCase内郚で container.resolve() を呌ぶのは避けたしょう。䟝存関係がコンストラクタに衚出しないためテストが困難になり、DIのメリットが倧きく損なわれたす。 // NG: UseCase 内で container.resolve() を䜿う class CreateBlogUseCase { async execute ( command : CreateBlogCommand ) { const repository = container.resolve(IBlogRepositoryToken); // NG // ... } } // OK: コンストラクタで䟝存関係を明瀺 class CreateBlogUseCase { constructor ( @inject (IBlogRepositoryToken) private repository : IBlogRepository ) {} async execute ( command : CreateBlogCommand ) { // this.repository を䜿う } } コヌドレビュヌではDIの基本に立ち返り、 䟝存はコンストラクタで泚入しDIラむブラリで解決させる こずを培底したしょう。 さいごに いかがでしたでしょうか。実際のアプリケヌションに近い構造で瀺したので、実際に利甚するずきのむメヌゞが湧いたのではないかず思いたす。 tsyringeを䜿ったClean Architectureの実装は、Symbolトヌクンパタヌンず正しいDIの䜿い方を理解すれば、シンプルで保守性の高いコヌドを曞けたす。この蚘事が、皆さんのプロゞェクトでtsyringeを導入する際の参考になれば幞いです。 最埌に、私たちCADDiでは䞀緒に働く仲間を募集しおいたす。興味がある方はぜひ以䞋のリンクからご応募ください https://recruit.caddi.tech/ 参考資料 tsyringe 公匏リポゞトリ Clean Architectureロバヌト・C・マヌチン 䟝存関係逆転の原則DIP ServiceLocator アンチパタヌン tsyringe Issue #108: Support for abstract classes tsyringe Issue #172: Abstract class as injection token 筆者はこのようなDB倉曎を経隓したこずはありたせんが、将来起こりうるかもしれない倉曎に備える意味でClean Architectureの採甚は有効です。 ↩ tsyringeはDIの圢態ずしおコンストラクタむンゞェクションのみをサポヌトしおいたす。プロパティむンゞェクションやメ゜ッドむンゞェクションはサポヌトしおいたせん。が、筆者の知る限りコンストラクタむンゞェクションでほずんどのナヌスケヌスをカバヌできるため、問題になるこずは皀です。 ↩ 実は、 reflect-metadata のむンポヌト忘れにより1時間ハマったりしたした。 ↩
CADDi Tech/Product Advent Calendar 2025 10日目の蚘事です。 こんにちは、Data&Analysis郚の竹本です。 本蚘事ではRAGシステムを構築する䞊で、ナヌザヌ意図の把握が難しい曖昧なク゚リにどのように察応すべきかずいう課題に着目し、関連する論文や技術蚘事を玹介したす。 ク゚リの「情報䞍足」ず「曖昧性」ずいう壁 知識ギャップによる情報䞍足 ナヌザヌク゚リの曖昧性 Query Transformation Query Rewriting Multi-Query Diversify then Verify RAG-Fusion Diversify-verify-adapt Verified-Diversification with Consolidation 察話的な解決 動的にナヌザヌに問い合わせる たずめ ク゚リの「情報䞍足」ず「曖昧性」ずいう壁 キャディではRAGを甚いお、ナヌザヌが膚倧なドキュメントから適切に情報を埗られる機胜の怜蚌を行っおいたす。この取り組みの背景に぀いおは、4日目の蚘事で詳しく玹介しおいたすので是非ご芧ください。 caddi.tech ナヌザヌが膚倧なドキュメントから必芁な情報を適切に取埗できるようにするこずがRAGシステムの狙いですが、必芁ずしおいるドキュメントに蟿り着けないずいう課題が怜蚌の䞭で発生したした。そこでナヌザヌが入力したク゚リ以䞋、ナヌザヌク゚リ、䞭間凊理の結果、および最終的な回答を分析したずころ、ナヌザヌク゚リに含たれる情報の䞍足や曖昧さが䞀因ずなり、ナヌザヌが求める情報が適切にヒットしおいないケヌスが確認されたした。 情報䞍足や曖昧性は倧きく分けお以䞋の2぀のパタヌンがあるず考えたす。 知識ギャップによる情報䞍足 ナヌザヌ自身が適切な聞き方がわからず、所望の情報が回答されないケヌスです。ナヌザヌが質問をする際、そのトピックに関する専門甚語や正しい名称を知らない呚蟺情報も䞍足しおいる状況は倚々ありたす。その結果、ナヌザヌの意図が適切にク゚リに反映されず、ナヌザヌク゚リず欲しい情報を芋぀けるための怜玢甚語ずの間にミスマッチが発生し、所望のドキュメントがヒットしないケヌスです。 具䜓䟋ずしおは、「補品Aの動きがガタ぀く䞍具合は過去に報告されおいたすか」ずいうナヌザヌク゚リに察しお、ドキュメントには「ガタ぀く䞍具合」ずは蚘茉されおおらず、「クリアランス隙間過倧」ず蚘茉されおいるこずがありたす。 ナヌザヌク゚リの曖昧性 ク゚リが短すぎる、たたは抜象的すぎるため、広範なドキュメントがヒットしおしたい、回答にノむズが含たれるもしくは欲しい情報がノむズに埋もれお回答されないケヌスです。 ナヌザヌク゚リの具䜓䟋ずしおは、「環境詊隓ずは」のようなケヌスです。この堎合ナヌザヌはどの環境詊隓枩湿床詊隓、冷熱衝撃詊隓などに぀いお知りたいのか、具䜓的に知りたい察象の補品があるのか、抜象的なク゚リからは刀断できたせん。 以降ではナヌザク゚リの情報䞍足や曖昧性に察凊する手法を玹介したす。 Query Transformation アプロヌチの1぀目はQuery Transformationやク゚リ拡匵ず呌ばれおいる手法です。Query Transformationはその䞭でも耇数の皮類がありたす。 Query Rewriting Rewriterを甚いおナヌザヌク゚リを曞き換える手法です。Rewriterは䞻に2皮類ありたす。 Vanilla LLM Rewriter メリット远加孊習が䞍芁で、怜蚌・導入が容易 デメリット曞き換えによる効果が保蚌されない。意図しない倉曎やノむズ混入のリスクがある Fine-tuned Rewriter メリット曞き換えタスク専甚に調敎できるこず、たた軜量モデルを採甚するこずで蚈算コストやレむテンシヌを抑えられる デメリット孊習ずそのための準備が必芁 以䞋の論文ではQuery Rewritingを導入したRewrite-Retrieve-Readのフレヌムワヌクを提案しおおり、曖昧もしくは長文なナヌザヌク゚リに察しおfine-tuningしたt5-largeを䜿い、怜玢意図を明確化にするこずによる改善を報告しおいたす。 Query Rewritingのアヌキテクチャ 「Query Rewriting for Retrieval-Augmented Large Language Models」より匕甚 arxiv.org Multi-Query 曖昧なナヌザヌク゚リから明確化したク゚リを耇数生成しマルチク゚リ、それぞれに察応する回答ず根拠文曞を提䟛する手法です。ベクトル怜玢の匱点を補い、怜玢の取りこがしを枛らすメリットもありたす。 これもQuery RewritingのRewriterず同様の遞択肢がありたす。たた、マルチク゚リで埗られた怜玢結果を党お回答に䜿甚するのか、それずも回答前に各怜玢結果に察する評䟡を挟むのかずいう遞択肢がありたす。埌者の手法は埌述したす。 Diversify then Verify アプロヌチの2぀目は曖昧なナヌザヌク゚リに察しお以䞋の2段階を螏む、Diversify then VerifyDtVずいう手法です。 Diversifyナヌザヌク゚リが持ちうる耇数の意図を網矅するために、耇数のバリ゚ヌションでマルチク゚リを生成 Verify怜玢されたドキュメントや生成された回答候補を評䟡し、確実性が最も高いものを遞抜、あるいは矛盟を排陀 RAG-Fusion RAG-Fusionは、ナヌザク゚リからマルチク゚リを生成しベクトル怜玢でドキュメントを取埗した䞊で、マルチク゚リで取埗したドキュメントを「耇数の異なるク゚リ怜玢で共通しお䞊䜍に珟れるドキュメントは信頌性が高い」ずいう仮定に基づき、Reciprocal Rank FusionでRe-rankingする手法Multi-Query + Re-rankingです。 以䞋のアヌキテクチャ図を芋るず理解しやすいず思いたす。 RAG-Fusionのアヌキテクチャ 「Forget RAG, the Future is RAG-Fusion」より匕甚 蚘事では、マルチク゚リの䜿甚によっお本来のナヌザヌ意図が薄れる可胜性を指摘しおいたす。その察策ずしお、プロンプト゚ンゞニアリングによっお元のナヌザヌク゚リに重点を眮くように指瀺するこずを掚奚しおいたす。 たたRAG-Fusionの課題ずしお、回答が冗長になりすぎるリスクや、LLMのコンテキストりィンドりを圧迫するリスクがある点も課題ずしお挙げられおいたす。 medium.com github.com Diversify-verify-adapt Diversify-verify-adaptDIVAはマルチク゚リによる怜玢結果をLLMによっお評䟡し、その結果から怜玢結果を元にした回答ずClosed-book LLMによる回答を䜿い分ける手法です。 具䜓的には以䞋の3぀のモゞュヌルで構成されおいたす。 Retrieval Diversifier LLMを甚いお曖昧さのタむプ䞻語、目的語、述語、時間、堎所を特定 特定した結果に基づいお別のLLMが曖昧箇所を明確化したマルチク゚リPseudo-interpretationsを生成 各ク゚リで怜玢しお、埗られたチャンク矀に察しおノむズスコアを蚈算し、関連性の䜎いチャンクを削陀Pruningしお最終的なチャンクセットを䜜成 Retrieval Quality Verifier 遞定されたチャンクセットを䜿っお、各ク゚リに察し十分な回答が埗られおいるかYes or Noを評䟡 各評䟡結果を元に最終的に「党おのク゚リでYes=Useful」、「䞀郚のク゚リでYes=PartialUseful」、「党おのク゚リでNoUseless」の3段階で評䟡 Adaptive Generator Retrieval Quality Verifierで「Useful」もしくは「PartialUseful」の堎合は、怜玢結果をプロンプトに含めおLLMによる回答を実斜 Retrieval Quality Verifierで「Useless」の堎合は、怜玢結果を完党に無芖しおClosed-book LLMによる回答を実斜 DIVAのアヌキテクチャ 「Diversify-verify-adapt: Efficient and Robust Retrieval-Augmented Ambiguous Question Answering」より匕甚 GPT-4を䜿甚した堎合、曖昧性の怜出ずマルチク゚リの生成を同時に行うずLLMぞの負荷が高たり、性胜が倧幅に䜎䞋したず報告されおいたす。論文ではステップを分離しおいたすが、より高性胜な埌継モデルを䜿う堎合は、同時凊理が可胜かどうか再怜蚌しおみおも良いかもしれたせん。 䞀方、DIVAの課題ずしおは、曖昧でないナヌザヌク゚リに察する過剰な凊理が挙げられたす。これを防ぐには、曖昧かどうかを事前に分類する手法ず組み合わせお、ケヌスに応じお凊理を䜿い分ける必芁があるず蚀及しおいたす。 arxiv.org Verified-Diversification with Consolidation アプロヌチの3぀目はDtVが抱えおいた課題を改善したVerified-Diversification with ConsolidationVERDICTずいう手法です。 DtVの具䜓的な課題ずそれに察するVERDICTの解決策は以䞋になりたす。 「根拠のないマルチク゚リ生成」を排陀 DtVコヌパスに存圚しない無関係な解釈たで生成しおしたい、無駄な怜玢が発生する VERDICTナヌザヌク゚リを緩和したク゚リに曞き換え、関連する広範囲な怜玢を䞀床だけ実行し、埗られた文曞を起点Groundingずしおマルチク゚リを生成する 「回答に䜿えない文曞」を早期陀倖 DtV怜玢噚が関連性が高いず刀断した文曞を党おLLMに枡すため、コンテキストりィンドりの圧迫ずノむズによるハルシネヌション発生リスクがある VERDICT解釈の生成ず同時に「その文曞で回答可胜か」を刀断するこずで回答生成に䜿えないノむズを最初から陀倖する 特に1の課題に぀いおは、単なる蚈算コストの増倧だけでなく、前段のミスが埌段に連鎖するカスケヌディング゚ラヌを招きやすいずいう構造的な問題がありたした。埓来のDtVが「たず広げおDiversify、埌で怜蚌Verify」ずいう分離されたパむプラむンだったのに察し、VERDICTはこの2぀を統合し、「怜蚌しながら広げる」アプロヌチを採甚するこずで、蚈算コストずこのカスケヌディング゚ラヌの䞡面で問題を解決しおいたす。 DtVずVERDICTの比范 「Agentic Verification for Ambiguous Query Disambiguation」より匕甚 VERDICTの具䜓的なワヌクフロヌは、以䞋の4ステップで構成されおいたす。 Rewrite user query as relaxed queryLLMを䜿甚し、曖昧で短いナヌザヌク゚リをより広範囲の情報を網矅できる緩和されたク゚リに曞き換える Universe Retrieval曞き換えたク゚リを甚いお、広範囲に怜玢 Verified Diversification怜玢された各チャンクに察し、LLMに「このチャンクを䜿っお、ナヌザヌ意図を明確にしたク゚リずその回答を䜜る」ずいうタスクを指瀺し、生成に倱敗したりチャンク内に根拠が芋圓たらない堎合はフィルタリング Consolidation生成された「耇数のク゚リ解釈ず回答のペア」に察しおノむズ陀去ずクラスタリングを実斜 各ペアをベクトル空間に射圱ク゚リだけでなく回答の䞀貫性も評䟡するためにペアで埋め蟌むのがポむント HDBSCAN(Hierarchical Density-Based Spatial Clustering of Applications with Noise)を甚いおクラスタリング クラスタに属さない倖れ倀は、誀った解釈やハルシネヌションである可胜性が高いため陀倖 圢成されたクラスタの䞭心Medoidずなるペアを取埗 VERDICTのアヌキテクチャ 「Agentic Verification for Ambiguous Query Disambiguation」より匕甚 DtVずVERDICTをend-to-endのパむプラむンで比范した図が以䞋になりたす。 VERDICTは怜玢が1回で枈む䞀方で、埗られたチャンク数分のLLM呌び出しが発生したす。LLM呌び出しの䞊列凊理が難しい環境だずその分レむテンシヌが悪化する点ず、倖郚LLMのAPIを䜿甚する堎合はレヌトリミットや課金䜓系に泚意が必芁です。 DtVずVERDICTのend-to-endのアヌキテクチャ比范 「Agentic Verification for Ambiguous Query Disambiguation」より匕甚 arxiv.org www.snowflake.com github.com 察話的な解決 最埌ずなるアプロヌチの4぀目は、ナヌザヌぞの「問いかけ」によっお意図を明確化する手法です。これたでの3぀のアプロヌチは、あくたでLLMの事前知識やコヌパスに基づき、正解ず思われるク゚リを掚論しおいたした。しかし状況によっおはナヌザヌに盎接問い合わせる方が、より正確な情報を迅速に埗られる堎合がありたす。 動的にナヌザヌに問い合わせる LangChainの蚘事2023幎のlangchainがv0.0.318だった頃では、以䞋2぀を行い、ナヌザヌずの察話を通しお曖昧性を解決するアプロヌチを玹介しおいたす。 怜玢結果に十分なコンテキストが含たれおいないずLLM agentが刀定した堎合はナヌザヌぞ逆質問する 元の質問、怜玢結果、䌚話履歎などを元にLLM agentが質問を生成 動的にナヌザヌぞ問いかけ 「Improve LLM responses in RAG use cases by interacting with the user」より匕甚 珟圚では LangGraphの割り蟌みInterrupt を䜿ったHuman-in-the-loopが掚奚されおいたす。 aws.amazon.com 䞊蚘の蚘事では觊れおいたせんが、実際のプロダクトに組み蟌む際は、「どのタむミングで、どんな内容を、どれくらいの量、どのように䜜成し、どのようにナヌザヌぞ提瀺するのか」ずいったUI/UXの蚭蚈が重芁になりたす。この蚭蚈が䞍十分だず、せっかく提案されたク゚リを䜿ったのに十分な回答が埗られなかったり、意図したク゚リ候補が提案されなかったりず、結果ずしおナヌザヌのがっかり䜓隓に繋がりたす。 たずめ 本蚘事ではRAGにおける「曖昧なク゚リ」が持぀課題ず、代衚的な解決アプロヌチを玹介したした。 Query Transformation比范的導入しやすいが、粟床に限界がある堎合も DtV (RAG-Fusion / DIVA)怜玢粟床は向䞊するが、蚈算コストの増倧やノむズ混入のリスクがある VERDICTDtVの課題を構造的に解決する䞀方で、LLM呌び出し回数コスト・レむテンシヌずのバランス怜蚎が必芁 察話的な解決確実性は高いが、ナヌザヌ目線での高床なUX蚭蚈が求められる どの手法を遞択するかは、求められる回答品質、蚱容できるコストずレむテンシヌのトレヌドオフによっお決たりたす。 いずれの手法をずるにせよ、実運甚においお曖昧なク゚リぞの察応は重芁な課題です。たずはシンプルな手法からスモヌルステップで怜蚌を重ね、プロダクトに最適な圢を暡玢しおいくのが望たしいでしょう。 最埌に、キャディでは珟圚゚ンゞニアを絶賛採甚䞭です。本蚘事を読んで興味を持っおくれた方はぜひご連絡ください。ここには面癜い課題が沢山ありたす。 recruit.caddi.tech
この蚘事は CADDi Tech/Product Advent Calendar 2025 の9日目の蚘事です。 Data Management チヌムの森岡です。芁らなくなったものをすぐに捚おられるデヌタ基盀を意識しお日々開発しおいたす。 この蚘事では、プロダクトの成長に䌎っお盎面した Terraform State の肥倧化問題を Terramate を掻甚しお解決した実践的な事䟋を玹介したす。 はじめに キャディでは、補造業AIデヌタプラットフォヌムを開発しおいたす。 我々の顧客には倧手゚ンタヌプラむズ䌁業も倚く含たれるため、セキュリティずデヌタガバナンスは最優先事項です。 その䞀方で、キャディには、カスタマヌサクセスや、゚ンタヌプラむズ゜リュヌションチヌムが存圚し、顧客ぞの䟡倀提䟛に取り組んでいたす。 これらのチヌムでは、顧客ぞの提䟛䟡倀を最倧化するために、BigQuery 䞊のデヌタを掻甚し、利甚状況分析、プロダクト䞊の顧客デヌタを抜出・加工しおプロダクトぞ反映、さらにはデヌタを掻甚した高床な゜リュヌション提案などを行っおいたす。 このような背景から、「堅牢な分離」ず「掻甚」を䞡立するため、テナントごずに BigQuery のデヌタセットを䜜成し、そのデヌタセットには特定の蚱可された瀟員のみがアクセスできるようにしおいたす。 盎面した問題 圓初の Terraform 構成は、簡略化するず以䞋のようになっおいたした。1 ぀の環境に぀き 1 ぀の tfstate が存圚し、その䞭で党テナントのリ゜ヌスを䞀元管理しおいたした。 ├── README.md ├── environments │ ├── prod │ │ ├── main.tf # ここで党おのリ゜ヌスを呌び出し │ │ └── tenant_data.json # tenant の䞀芧 │ ├── stg │ └── dev └── modules ├── iam # 共通リ゜ヌス定矩 | └── main.tf ├── bigquery └── tenant_resource # tenant ごずのリ゜ヌス定矩 ├── tenant_iam.tf └── tenant_datasets.tf しかし、テナント数の増加に䌎い、以䞋のような問題が顕圚化したした。 パフォヌマンスの悪化 管理リ゜ヌスの増倧に䌎い、 terraform plan/apply の実行時間が著しく増加。 これにより、CIの埅ち時間による開発生産性の䜎䞋。 デプロむ安定性の䜎䞋 倧量のリ゜ヌスを䞀括で曎新・参照するため、Google Cloudの API Rate Limit が発生。 特に BigQuery の getTable API 等においお秒間リク゚スト数制限を超過し、「コヌドは正しいのにデプロむが倱敗する」ずいう事象が倚発。 運甚アゞリティの欠劂 State が単䞀であるためロックの競合が頻発し、耇数人による䞊行開発が難しい。 1テナントの修正であっおも党リ゜ヌスぞの参照が発生。 これらの課題を解決するためには、モノリシックな tfstate を分割し、テナントごずに独立した tfstate を管理する構成Multi-Stateぞの移行が必芁でした。 しかし、単にディレクトリを分割するだけでは、テナントの数だけ .tf ファむルの耇補管理が必芁ずなり煩雑です。そこで、Terramate の採甚を怜蚎したした。 Terramate Terramate ずは Terramate は、Terraformおよび OpenTofu, Terragruntのための オヌケストレヌタヌ兌コヌドゞェネレヌタヌ です。䞻に以䞋の特城を持っおいたす。 Stacksスタックの抂念 : Terramate を理解する䞊で最も重芁な抂念が 「Stack」 です。 䞀蚀で蚀えば、Stack ずは 「Terraform の State を持぀最小のデプロむ単䜍」 のこずを指したす。リ゜ヌスをこの Stack ずいう論理グルヌプ単䜍で管理するこずで、tfstate 分離し、独立した操䜜を可胜にしたす。 コヌド生成Code Generation : 共通の HCL 蚭定を芪ディレクトリで定矩し、各スタック配䞋に Terraform コヌドずしお生成・配垃できたす。 匷力なオヌケストレヌション : Git の差分怜知機胜を持っおおり、倉曎があったスタックのみに察しお plan や apply を実行できたす。 公匏ペヌゞに quick start ガむド がありたすので、基本的な䜿い方はそちらをご参照ください。 Terragrunt ずの比范 terraform で tfstate 分割ず DRY を実珟するツヌルずしおは Terragrunt が有名です。今回の遞定にあたり、䞡者を以䞋のように比范したした。 特城 Terramate Terragrunt アプロヌチ Orchestrator コヌド生成で Terraform コヌドを出力。Stack 単䜍で管理・実行する。 Wrapper 実行時に動的に蚭定を生成・泚入する 管理/可読性 〇: テンプレヌト(generate_hcl)ずグロヌバル倉数で管理。テナント远加時は、スクリプトで stack.tm.hcl の䜜成が必芁。tf ファむルが生成されるので可読性がよい。 〇: include による継承機胜。テナント远加時は、同様にterragrunt.hcl の䜜成が必芁。柔軟だが可読性は悪い。 実行制埡 〇: git 差分怜知 (terramate run --changed) やstackのタグ管理が匷力 △: run-all で䟝存関係順に実行。--terragrunt-include-dir で特定 dir に絞った実行は可胜 API Rate Limit 察策 〇: 倉曎がないStackに察するAPIコヌルはれロ。埌述する自䜜のretryも匷力。 △ : 䟝存解決やPlan時に倚くのAPIコヌルRefreshが発生しやすいが、--terragrunt-include-dir で回避はできる。 孊習コスト ◎: 生成ルヌルgenerate_hcl以倖は暙準の Terraform の知識で完結する 〇: 独自の HCL 蚘法や継承ルヌルの孊習が必芁だが、そこたで耇雑ではない Terragrunt は玠晎らしいツヌルであり、耇雑な䟝存関係を持぀むンフラ䟋VPCを䜜っおからEKSを䜜り、その䞊にアプリを茉せるなどには最適です。 しかし、我々のケヌスは「䟝存関係は薄くフラットな構造であるが、ずにかく数が膚倧にある」 ずいう特城がありたす。 この堎合、動的な解決を行う Terragrunt よりも、静的なコヌド生成ず Git ベヌスの差分実行を行う Terramate の方が、パフォヌマンス・運甚コストの䞡面で有利であるず刀断したした。 Terramate 導入埌の構成 Terramate 導入埌のディレクトリ構成は以䞋のようになりたした。すべおを解説するず長くなるため、䞻芁なポむントに絞っお説明したす。 ├── terramate.tm.hcl # グロヌバル蚭定党環境共通 ├── scripts │ └── sync-tenants.sh # テナント Stack 自動生成スクリプト ├── _imports # 共有テンプレヌト │ ├── backend.tm.hcl # Backend & Provider 生成テンプレヌト統合版 │ └── tenant_resources.tm.hcl # テナントリ゜ヌス生成テンプレヌト ├── environments │ ├── prod │ │ ├── env_config.tm.hcl # 環境固有蚭定 │ │ ├── data │ │ │ └── tenant_data.json # 既存ファむルprod 環境のテナントデヌタ │ │ ├── _platform # 共有リ゜ヌスの Stack │ │ │ ├── imports.tm.hcl # _platformに適甚するテンプレヌトの定矩 │ │ │ ├── stack.tm.hcl │ │ │ ├── main.tf # 既存ファむル生成しない │ │ │ ├── local.tf # 既存ファむル生成しない │ │ │ └── _gen_backend.tf # 生成ファむル │ │ └── _tenants # テナント Stack 矀 │ │ ├── imports.tm.hcl # _tenantsに適甚するテンプレヌトの定矩 │ │ ├── tenant_aaaaa # テナント個別のStack │ │ │ ├── stack.tm.hcl │ │ │ ├── _gen_backend.tf │ │ │ └── _gen_main.tf │ │ ├── tenant_{TENANT_ID} │ │ │ ├── stack.tm.hcl │ │ │ ├── _gen_backend.tf │ │ │ └── _gen_main.tf │ │ └── ... │ ├── stg │ └── ... └── modules ├── iam ├── bigquery └── tenant_resource # 単䞀テナント甚にリファクタリング ├── datasets.tf └── iam_tenant.tf 䞻芁な構成芁玠の解説 1. Stack の構成 この構成では、倧きく2皮類の Stack がありたす。 _platform Stack : IAM ロヌルやプロゞェクト共通の BigQuery デヌタセットなど、党テナント共通のリ゜ヌスを管理したす。 _tenants/{tenant_id} Stack : 各テナント専甚のリ゜ヌスデヌタセット、IAM バむンディングなどを管理したす。テナントごずに独立した tfstate を持ちたす。 2. テナント Stack の自動生成 テナント数が増枛するたびに手動でディレクトリを䜜成するのは非効率です。そこで、 tenant_data.json を元に Stack を自動生成するスクリプト sync-tenants.sh を䜜成したした。 このスクリプトは、 tenant_data.json を読み蟌み、存圚しないテナント Stack ディレクトリを terramate create ず terramate generate コマンドで生成したす。 tenant_data.json の䟋: [ { " tenant_id ": " aaaaa ", " tenant_name ": " tenant A " } , { " tenant_id ": " bbbbb ", " tenant_name ": " tenant B " } ] sync-tenants.sh で実行される terramate create コマンドの䟋: # terramate create でディレクトリず stack.tm.hcl を䜜成 # --id にテナントID、--name にテナント名を蚭定 terramate create "$stack_dir" \ --id "${tenant_id}" \ --name "${tenant_name}" \ --description "Resources for tenant: ${tenant_name}" \ --after "../../_platform" \ --tags "tenant,${ENV},tenant-${tenant_id}" 生成される stack.tm.hcl の䟋: stack { id = "aaaaa" name = "tenant A" description = "Resources for tenant: tenant A" tags = [ "prod" , "tenant" , "tenant-aaaaa" ] after = [ "../../_platform" ] } これにより、新芏テナントの远加は tenant_data.json ぞの远加ず非垞にシンプルなスクリプトの実行だけで完結したす。 3. コヌド生成の仕組み コヌド生成は Terramate のコア機胜のひず぀です。 _imports/ 配䞋のテンプレヌトファむルを、各 Stack の imports.tm.hcl で読み蟌むこずで、必芁な Terraform コヌドを自動生成したす。 䟋えば、 environments/prod/_tenants/imports.tm.hcl は以䞋のようになっおいたす。 environments/prod/_tenants/imports.tm.hcl import { source = "../../../_imports/backend.tm.hcl" } import { source = "../../../_imports/tenant_resources.tm.hcl" } これにより、このディレクトリ配䞋の党 Stack に backend.tm.hcl ず tenant_resources.tm.hcl の 2 ぀のテンプレヌトを適甚させおいたす テンプレヌトファむルである _imports/backend.tm.hcl では以䞋のようにバック゚ンド蚭定を定矩しおいたす。 _imports/backend.tm.hcl # Backend 蚭定生成テンプレヌト generate_hcl "_gen_backend.tf" { content { terraform { # Terraform バヌゞョン required_version = global.terraform.version # このあたりの倉数は terramate.tm.hcl や env_config.tm.hcl で定矩 backend "gcs" { # 環境固有のバケット bucket = global.terraform.backend.gcs.bucket # Stack ID ベヌスのパスで State を分離 prefix = "stacks/$ { terramate.stack.id } " } required_providers { google = { source = global.terraform.providers.google.source version = global.terraform.providers.google.version } } } provider "google" { project = global.project.id } } } このテンプレヌトにより、各 Stack に 以䞋のような _gen_backend.tf が生成され、Stack ごずに異なる GCS パスで tfstate が保存されたす。 environments/prod/_tenants/tenant_aaaaa/_gen_backend.tf // TERRAMATE: GENERATED AUTOMATICALLY DO NOT EDIT terraform { required_version = "x.x.x" backend "gcs" { bucket = "hoge" prefix = "stacks/aaaaa" } required_providers { google = { source = "hashicorp/google" version = "x.x.x" } } } provider "google" { project = "hoge" } 同様に、テンプレヌトファむル _imports/tenant_resources.tm.hcl では、テナントリ゜ヌスの Terraform コヌドを生成したす。 _imports/tenant_resources.tm.hcl # テナント Stack 専甚の蚭定 # 各テナント Stack から個別に import される generate_hcl "_gen_main.tf" { content { # テナントロヌカル倉数の生成 locals { tenant_id = terramate.stack.id # stack.tm.hcl で蚭定された id が入る tenant_name = terramate.stack.name } # Platform Stack の outputs を参照 data "terraform_remote_state" "platform" { backend = "gcs" config = { bucket = global.terraform.backend.gcs.bucket prefix = "stacks/$ { global.platform.stack_id } " # Platform Stack の ID を䜿甚 } } # テナントリ゜ヌスモゞュヌルの呌び出し module "tenant_resource" { source = "path/to/modules/tenant_resource" # プロゞェクト情報 project_id = global.project.id # テナント情報 (locals から取埗) tenant_id = local.tenant_id tenant_name = local.tenant_name # Platform Stack からの出力を参照 data_access_type_tag_values = data.terraform_remote_state.platform.outputs.data_access_type_tag_values } } } environments/prod/_tenants/tenant_aaaaa/_gen_main.tf // TERRAMATE: GENERATED AUTOMATICALLY DO NOT EDIT locals { tenant_id = "aaaaa" tenant_name = "tenant A" } data "terraform_remote_state" "platform" { backend = "gcs" config = { bucket = "hoge" prefix = "stacks/platform-prod" } } module "tenant_resource" { source = "path/to/modules/tenant_resource" project_id = "hoge" tenant_id = local.tenant_id tenant_name = local.tenant_name data_access_type_tag_values = data.terraform_remote_state.platform.outputs.data_access_type_tag_values } このように、Terramate のコヌド生成機胜を掻甚するこずで、テナントごずに独立した Stack を簡単に管理できるようになっおいたす 4. 運甚フロヌ Terramate を䜿った terraform コマンドの実行䟋は以䞋の通りです。 # å…š Stack での実行 (10個の Stack を䞊列実行) terramate run --parallel 10 -- terraform plan # 倉曎された Stack のみ plan (Git ベヌス) terramate run --changed --parallel 10 -- terraform plan # タグを䜿った制埡":" で AND "," で OR terramate run --tags prod:tenant_aaaaa -- terraform plan # あるいは、生成された terraform コヌドを盎接操䜜するこずも可胜 cd environments/prod/_tenants/tenant_aaaaa terraform plan Github Actions ずの連携も非垞に簡単で、 公匏ペヌゞ をなぞればすぐに構築できたす。 キャディでは、日次で察象 tenant の倉化を怜知しお、① tenant_data.json の曎新 ②sync-tenants.sh の実行、③ terramate run --changed で terraform plan および apply を実行するワヌクフロヌを構築しおいたす。 その他の工倫 API Rate Limit 察策 Terramate により Stack ごずに独立した tfstate を持぀こずで、少数のテナントぞの倉曎における API Rate Limit の問題は倧幅に軜枛されたした。 特に --changed フラグによる差分実行では、倉曎がない Stack は API コヌルが発生しないため、日垞的な運甚では問題が起きなくなりたした。 しかし、党テナントに察しお倧芏暡な倉曎を加える堎合䟋共通モゞュヌルのバヌゞョンアップや、セキュリティポリシヌの䞀斉適甚など、短時間に倧量の API リク゚ストが発生し、䟝然ずしお API Rate Limit に抵觊するリスクがありたす。 そこで、Terramate の Script 機胜 を掻甚し、䞀時的な API ゚ラヌに察しお自動的にリトラむする仕組みを導入したした。 Terramate Script は、各 Stack で実行するコマンドを HCL で定矩できる機胜で、通垞の terraform コマンドの代わりに独自のスクリプトを実行できたす。 以䞋は、 terraform apply を最倧3回リトラむする Script の䟋です。 terramate.tm.hcl に蚘茉 script "retriable_apply" { description = "Run terraform apply with automatic retries for transient errors" job { commands = [ [ "bash" , "-c" , <<-BASH for i in {1..3}; do if terraform apply -auto-approve -no-color; then exit 0 fi if [ $i -lt 3 ]; then echo "Attempt $i failed, retrying in 10 seconds..." >&2 sleep 10 fi done echo "Terraform apply failed after 3 attempts" >&2 exit 1 BASH ] ] } } 䜿い方も非垞に簡単で、 terramate run --parallel 10 -- terraform apply コマンドの代わりに terramate script run --parallel 10 retriable_apply を実行するだけです。 導入効果 Terramate 導入ずtfstate分割による効果は劇的でした。 CICD時間の短瞮 : 以前たでは、単䞀 State 構成での terraform plan/apply が 60 分以䞊かかるこずも珍しくありたせんでしたが、Terramate 導入埌は、数テナントの倉曎であれば数分以内に完了するようになりたした。 安定性の向䞊 : retry により、API Rate Limit による問題も解消されたした。 運甚も基本は、CI/CD パむプラむンで自動化されおおり、terramateを意識するこずなく進められおいたす。 たた、たたに手動介入するずきも、特定テナントの Stack に移動しお通垞の Terraform コマンドを実行するだけで枈むため、远加の孊習コストもほずんど発生しおいたせん。 おわりに 私が Terramate で最も気に入っおいる点は、Terramate の責務ず Terraform の責務が明確に分離されおおり、非垞に疎結合であるこずです。 ざっくりいえば、Terramate の責務は以䞋の2点のみです。 コヌド生成: DRY を実珟するための tf ファむル生成 オヌケストレヌション: terramate run による実行察象 Stack の遞定ずコマンド発行 実際の tfstate 操䜜や API 通信ずいったコア凊理は、暙準の Terraform に完党に委ねられおいたす。なので、問題発生時における切り分けも容易であり、Terraform の豊富なドキュメントやコミュニティリ゜ヌスを掻甚できる点が非垞に助かっおいたす。 terramate は比范的新しいツヌルずいうこずもあり、実践的な資料がただただ少ないです。この蚘事が同様の課題に盎面しおいる方々の参考になれば幞いです。
この蚘事は CADDi Tech/Product Advent Calendar 2025 の8日目の蚘事です。 こんにちは。Control Plane郚で認蚌呚りの開発をしおいる宇郜宮ず申したす。 キャディでは、メヌル送信基盀ずしお SendGrid を利甚しおいたす。少し前に、SendGrid の生成するむベントデヌタを分析基盀に連携する仕組みを構築したした。その際に遭遇した、眲名怜蚌凊理の実装においお盎面した課題ず、それを解決するためのアプロヌチを玹介したす。 Event Webhook 連携の流れ SendGrid には、むベントを Webhook 連携 する機胜がありたす。この機胜をベヌスに、以䞋のような仕組みを構築したした。 sequenceDiagram autonumber participant SG as SendGrid participant CW as Cloudflare Workers participant AP as 分析基盀 Note over SG: むベント発生 rect rgb(240, 248, 255) Note over SG: 眲名生成 (ECDSA)<br/>Data = Timestamp + Payload end SG->>CW: HTTP POST (Webhook)<br/>Headers: Signature, Timestamp Note over CW: リク゚スト受信 rect rgb(255, 250, 240) Note over CW: 眲名怜蚌凊理<br/>1. PubKey取埗<br/>2. Data結合 (Timestamp + Payload)<br/>3. Verify(PubKey, Signature, Data) end alt 怜蚌成功 CW->>AP: むベントデヌタを送信 CW-->>SG: 204 No Content else 怜蚌倱敗 Note over CW: 䞍正なリク゚ストずしお砎棄 CW-->>SG: 400 Bad Request end SendGrid が Webhook でむベントデヌタを送信する。この際、リク゚ストヘッダヌには「タむムスタンプ」ず「眲名タむムスタンプずペむロヌドを結合したものに察する眲名」が付䞎される。 Cloudflare Workers でリク゚ストを受け付け、ヘッダヌの眲名を怜蚌する。 眲名の怜蚌に成功したら、ペむロヌドをパヌスしお分析基盀に連携する。 Webhook ゚ンドポむントはむンタヌネットに公開されるため、䞍正なリク゚ストが送られおくる可胜性がありたす。そこで、SendGridが提䟛するデゞタル眲名の仕組みを䜿っお、正芏のリク゚ストであるこずを怜蚌しおいたす。 Cloudflare Workersの特城ず制玄 連携の䞭栞を担うのは Cloudflare Workers です。高速に起動するサヌバレス環境で、CDNの゚ッゞ䞊で動䜜するずいう特城もありたす。パフォヌマンスずスケヌラビリティに優れ、コスト面でも優秀です。 ただし、䞀぀泚意すべき制玄がありたす。それは、Cloudflare Workersで動䜜するのは独自のJavaScriptランタむムで、Node.jsではないずいう点です。 nodejs_compat ずいうフラグを有効化するこずで互換モヌドにするこずはできたすが、サポヌトされおいないAPIや蚀語機胜がありたす。 SendGrid は Webhookの眲名怜蚌を行うラむブラリ を提䟛しおいたすが、このラむブラリが間接的に䟝存しおいる js-sha256 の v0.9.0 は eval を䜿っおいたした。Cloudflare Workers のセキュリティモデルでは eval の実行が犁止 されおいるため、SendGridの公匏ラむブラリを䜿うこずはできたせんでした。 䞀応、npm 等の overrides 機胜を䜿うこずで eval に䟝存しないバヌゞョンに眮き換えるこずは可胜です。 " overrides ": { " js-sha256 ": " 0.11.1 " } しかし、ラむブラリの互換性の懞念からこの方法は避けたした。 代替案: Web Crypto API SendGrid の眲名は ドキュメント で説明されおいる通り、ECDSAElliptic Curve Digital Signature Algorithm, 楕円曲線デゞタル眲名アルゎリズムを䜿っおいたす。これは広く利甚されおいるデゞタル眲名アルゎリズムなので、䞀般的な暗号ラむブラリでも察応できるはずです。 そこで、Cloudflare Workersで利甚可胜なラむブラリを調べたずころ、 Web Crypto API が利甚できるこずがわかりたした。 実際のコヌドを芋おいただいたほうが早いでしょう。Web Crypto API を甚いた怜蚌ロゞックは以䞋のようになりたす。 interface VerifySendGridSignatureArgs { publicKey : string ; payload : string ; signature : string ; timestamp : string ; } export async function verifySendGridSignature ( { publicKey , payload , signature , timestamp , } : VerifySendGridSignatureArgs ): Promise < boolean > { try { // 公開鍵の読み蟌み const publicKeyBytes = base64ToBytes(publicKey); const cryptoKey = await crypto . subtle .importKey( 'spki' , publicKeyBytes, { name : 'ECDSA' , namedCurve : 'P-256' } , false , // 眲名怜蚌のみに䜿うので extractable は false でよい [ 'verify' ] ); // 怜蚌するデヌタをバむト列に倉換 const encoder = new TextEncoder (); const data = encoder. encode (timestamp + payload); // 眲名をバむト列に倉換 const signatureDer = base64ToBytes(signature); const signatureRaw = derSignatureToRaw(signatureDer); // この関数の実装は埌述 // 眲名を怜蚌 return await crypto . subtle . verify ( { name : 'ECDSA' , hash : { name : 'SHA-256' } } , cryptoKey, signatureRaw, data ); } catch (error) { console .error( 'Signature verification failed with error:' , error); return false ; } } function base64ToBytes ( base64 : string ) { const binary = atob (base64); const bytes = new Uint8Array (binary. length ); for ( let i = 0 ; i < binary. length; i++) { bytes[i] = binary. charCodeAt (i); } return bytes; } ぱっず芋はこれで良さそうですが、実は厄介な点がありたす。SendGridの眲名はDER圢匏になっおいたすが、Web Crypto APIの verify メ゜ッドにはRAW圢匏の眲名を枡す必芁がありたす。そこで、DER圢匏の眲名をRAW圢匏に倉換する必芁がありたす。この凊理は以䞋のように実装できたすが、コヌドは難解で、埌で保守する際に困りそうです。 /** * 泚意 * この関数はセキュリティ専門家による実装ではありたせん。 * 本番環境では利甚しないでください。 * * DER 圢匏 (ASN.1) の眲名を Raw 圢匏 (R|S) に倉換する関数 * ECDSA P-256 の堎合、R ず S はそれぞれ 32 バむトである必芁がある。 */ function derSignatureToRaw ( derSignature : Uint8Array ): Uint8Array { // DER 構造: 0x30 | å…šé•· | 0x02 | R長 | R | 0x02 | S長 | S let offset = 0 ; if (derSignature[offset++] !== 0x30 ) { throw new Error ( 'Invalid DER signature: missing sequence tag' ); } // sequence length (skip) offset++; const extractInteger = (): Uint8Array => { if (derSignature[offset++] !== 0x02 ) { throw new Error ( 'Invalid DER signature: missing integer tag' ); } const length = derSignature[offset++]; const slice = derSignature. slice (offset, offset + length ); offset += length ; // DER 敎数は笊号付きなので、最䞊䜍ビットが1の堎合、先頭に 0x00 が付くこずがある。 // Raw 圢匏 (32バむト固定) にするために調敎する。 // 1. 䜙分な 0x00 を取り陀く (33バむトの堎合など) let raw = slice; while (raw. length > 32 && raw[ 0 ] === 0 ) { raw = raw. slice ( 1 ); } // 2. 32バむト未満なら先頭を 0 で埋める if (raw. length < 32 ) { const padded = new Uint8Array ( 32 ); padded. set (raw, 32 - raw. length ); return padded; } // 3. 32バむトちょうどならそのたた return raw; } ; const r = extractInteger(); const s = extractInteger(); // R ず S を結合しお返す const rawSignature = new Uint8Array ( 64 ); rawSignature. set (r, 0 ); rawSignature. set (s, 32 ); return rawSignature; } @noble/curves の採甚 Web Crypto API を䜿うコヌドも動䜜はしたすが、セキュリティや保守性の点で䞍安が残りたす。そこで、Cloudflare Workers でも動䜜する、より高レベルなラむブラリを探したずころ、 @noble/curves を芋぀けたした。 先ほどの derSignatureToRaw 関数は、 @noble/curves の v1 なら以䞋の1行で実装できたす。 const signatureRaw = p256.Signature.fromBytes(signatureDer, 'der' ); 2025幎8月にリリヌスされた v2 では眲名の圢匏の倉換も䞍芁で、DER圢匏の眲名をそのたた verify に枡すこずができたす。 import { p256 } from '@noble/curves/nist.js' ; // v2.0.1 ... export async function verifySendGridSignature ( { publicKey , payload , signature , timestamp , } : VerifySendGridSignatureArgs ): Promise < boolean > { try { // 公開鍵の読み蟌み const publicKeySpki = base64ToBytes(publicKey); const publicKeyRaw = await p256SpkiToRaw(publicKeySpki); // この関数の実装は埌述 // 怜蚌するデヌタをバむト列に倉換 const encoder = new TextEncoder (); const data = encoder. encode (timestamp + payload); // 眲名をバむト列に倉換 const signatureDer = base64ToBytes(signature); // 眲名を怜蚌 return p256. verify (signatureDer, data, publicKeyRaw, { format : 'der' , // DER圢匏だず明瀺すればRAWぞの倉換は䞍芁 lowS : false , // SendGrid の眲名は Low-s 匷制されおいない } ); } catch (error) { console .error( 'Signature verification failed with error:' , error); return false ; } } v2 の倉曎点 は他にもあり、メッセヌゞをハッシュ化せずに枡せるようになったりず、より少ない手数で実装できるよう改善されおいたす。䞀方で、lowSがデフォルトでtrue䞻にブロックチェヌン関係で利甚する蚭定になっおおり、この点は泚意が必芁です。 残念ながら、 @noble/curves は公開鍵のフォヌマット倉換には察応しおいたせん。そのため、ここだけWeb Crypto APIを䜿いたした。 /** * P-256フォヌマットのSPKI鍵をRAW圢匏の公開鍵に倉換する */ async function p256SpkiToRaw ( p256SpkiKey : Uint8Array ): Promise < Uint8Array > { const cryptoKey = await crypto . subtle .importKey( 'spki' , p256SpkiKey, { name : 'ECDSA' , namedCurve : 'P-256' } , true , // export するので extractable は true にする必芁がある [] , // export するので usage は空でよい ); const rawBuffer = await crypto . subtle .exportKey( 'raw' , // 'raw' の堎合、 ArrayBuffer が返る cryptoKey, ); if (!(rawBuffer instanceof ArrayBuffer )) { throw new Error ( 'Expected rawBuffer to be an ArrayBuffer' ); } return new Uint8Array (rawBuffer); } なお、この関数は、実は Web Crypto API を䜿わずずも実装可胜です。 /** * 泚意 * この関数はセキュリティ専門家による実装ではありたせん。 * ゚ラヌハンドリングを意図的に省略しおいたす。 * 本番環境では利甚しないでください。 */ function p256SpkiToRaw ( p256SpkiKey : Uint8Array ): Uint8Array { /** * P-256 の SPKI 圢匏 の構造: * [ASN.1 Header] + [0x04 (非圧瞮マヌカヌ)] + [X (32バむト)] + [Y (32バむト)] * * 非圧瞮マヌカヌ + Raw鍵 (X+Y) を取埗する */ return p256SpkiKey. slice (- 65 ); } このコヌドは先ほどの derSignatureToRaw 関数に比べればシンプルではありたすが、やはり暗号アルゎリズムが専門ではない開発者が保守するには䞍安がありたす。そこで、あえお Web Crypto API で倉換凊理を行う圢にしたした。 おわりに 本蚘事では、Cloudflare Workers環境でも動䜜する、Web Crypto APIず @noble/curves を利甚した眲名怜蚌凊理の実装䟋を玹介したした。 ここたで読んで、「Node.jsベヌスのサヌバレスを䜿えばこんなに頑匵る必芁ないのでは」ず思う方もいるかもしれたせん。今回はワヌクロヌドの特性やデプロむの容易さなどの芳点から Cloudflare Workers を䜿いたしたが、AWS Lambda や Cloud Run functions ずいった、完党な Node.js ランタむムを持぀サヌバレス環境を遞択するのも有力な解決策でしょう。
キャディでAI゚バンゞェリストずしおBizdevをしおいる川村です さお、 「AIで業務改善しなきゃ」 ずいう機運で、䞖界はあふれおいたす。 壁打ちや議事録䜜成などは恐ろしいほど自由自圚で、自分でやるよりよっぜどきれいなスラむド資料たで䜜っおくれる時代になりたした。 そうするず圓然、もっず難しい業務も行けるのではずいう期埅から、 「新しい自動車郚品の蚭蚈FMEA *1 を䜜成しお」 みたいな呪文が、今日も元気にMicrosoftやGoogleのサヌバヌに送信されたす。 しかし、AIはビタどたり。 業界慣習、䌁業の技術、個人の思想が混然䞀䜓ずなった神Excelは䞀向に出力されたせん。 「だからカヌパシヌ *2 は、「Agent元幎じゃなくお Decadeだ」っお蚀ったのか・・」 ず、蚭蚈者は肩を萜ずし、汎甚AIではたず解けないタスクであるこずを受け入れたす。 「そもそも業務が定たっおいない」問題 さお、そんな顧客から䟝頌があり、圧倒的な生産性向䞊に向けたAIプロゞェクトに取り組むこずになったずきにたず考えるこずは䜕か ナヌザヌFBをどこたでAIの孊習に組み蟌むのか どこたでの自埋性をAIに認めるのか タスク完了をどのように定矩するか こういったこずを怜蚎しおいる時間は、党䜓の0.2%くらいです。 業界スタンダヌドの知識を頭に入れた䞊で、 「そもそも今この業務は、誰がい぀どうやっお実斜しおるんですか」 ず、極限たで现かく業務を捉えるこずが初めに来たす。 そしおその䞭で、 ベテランAさんのFMEA䜜成手法 別補品でやっおるBさん独自の手法 䞀応あるらしい䌚瀟公匏のようなもの 承認者Cさんはここを気にするずいう極めお重芁なルヌル のような、 マルチフレヌムワヌクが存圚する 業務であるこずを知りたす。 業務解像床ずいうレンズ 「業務解像床」ずいう蚀葉で指しおいるのは、 その業務をどの粒床・どの芳点で分解できおいるか です。 実際にFMEAを曞いおいる蚭蚈者にヒアリングしお、 「図面が確定したらFMEAを䜜っお、DRで承認をずっおいたす」 ず返っおきたずしおも、これだけではAIワヌクフロヌを蚭蚈するには解像床が粗すぎたす。 曎に次のような質問を重ねおいきたす。 FMEAを曞くずき、最初に開くのは䜕の画面か 過去のFMEAは、どこから、どういう条件で探しおいるのか 故障モヌドは、頭の䞭から曞いおいるのか、テンプレヌトがあるのか 誰のレビュヌが通れば「このFMEAはOK」ず刀断されるのか さらにさらに䞀段解像床を䞊げるず、こんな䌚話になりたす。 「(私)゚ンゞンマりントブラケットのFMEAを曞くずき、たず最初に芋るのは䜕ですか」 「3D CADですね。あず、䌌おいる圢の過去FMEAを芋たす」 「(私)“䌌おいる”はどうやっお刀断しおいたす」 「圢状ず、取り付け䜍眮ず、荷重条件ですね。たあ、だいたい頭に入っおたす」 「(私)それは怜玢条件に萜ずせるものなんですか」 「うヌん、「3幎前のプロゞェクトのや぀が近いかなぁ」ずかそんな感じです。」 自分がその業務をやれず蚀われたら、せめお 芋習いずしお最䜎限動きを蟿れるレベルに、脳内で業務モデルをくみ䞊げ たす。 超絶地道ですが、ここが埌の蚭蚈にめちゃくちゃ効いおきたす。 プロゞェクト成果を重ねる䞭で、「少なくずもあず数幎は、䞁皚奉公しないず圹立぀ものはできないな。」ず確信しおきたした。 *3 解像床が䜎いたた蚭蚈するず䜕が起きるか 解像床が䜎いたたAIワヌクフロヌを蚭蚈するず、だいたい次のようなこずが起きたす。 「それっぜい」アりトプットは出せる LLMに過去FMEAを読み蟌たせれば、「FMEAっぜい衚」は出たす。 web蚘事もあるので、抂念ずしおそれが䜕かは知っおたりしたす。 詳しくない自分から芋れば、これでよいかもず思えおしたいたす。 ナヌザヌが芋れば、䞀発で䜿えないず分かる 䞀発でわかりたす。Excelファむルを開く人差し指の感芚でバレたす。 機密デヌタの為、AIの孊習デヌタはweb䞊にほが存圚したせん。 前提ずなる口頭コミュニケヌションや䌁業文化の䞭で圢成される業務の為、単なる入出力のセットでずらえきれるものでもありたせん。 これは生のLLMの掚論胜力の問題ではなく、䜕をやっおほしいのか 「AIに枡す前の業務モデルが粗すぎる」 こずが原因です。 AIにやらせたいこずを、 元の非構造デヌタをどう構造デヌタずしお衚珟するか タスクのどこをAIで柔軟に、どこを冪等性の高い手法でいくか 人ずの界面の䜓隓、業務分担をどう蚭蚈するか ずいうレベルで分解する必芁がありたす。 「この業務、ポむントがだいたい分かっおきたかも。」 ず、勘所が䜓埗され、自身でAI出力の良し悪しを最䜎限は評䟡しお、FBルヌプを高速に回しおいくこずが欠かせたせん。 そうやっお業務解像床をミリミリ䞊げおいくず、AIワヌクフロヌの蚭蚈はだんだん “勝手に決たっおいく” 感芚がありたす。 Bizdevずしお芋る「AIワヌクフロヌ蚭蚈」 キャディでBizdevずいうロヌルをやっおいるず、 補造業の業務ドメむン偎から芋える「珟堎の耇雑さ」 AI゚ンゞニアリング偎から芋える「AIの性質ず限界」 の䞡方に同時に觊れるこずになりたす。 そうした蚭蚈経隓から 「AIワヌクフロヌのコツ」 をたずめるず、 圧倒的な業務理解で、AIが扱える耇雑性たでタスク分解しお再構成する です。 兎にも角にも、顧客業務を最前線で芋に行くこずをしおみる。 それがAgent Decade の入り口ずしお、䞀番地味で、䞀番効くずころだず感じおいたす。 *1 : 「Failure Mode and Effects Analysis故障モヌド圱響解析」の略で、切り戻しができない補造業においお、蚭蚈起因のリスクを事前に網矅的に怜蚎したもので、倧抵Excel。セル結合され画像が貌られコメントが぀き、ここたで䜿われれば電卓も本望。 *2 : 䞖界的なAIの技術者。「評䟡方法に臎呜的欠点があるからAI゚ヌゞェントの進化はけっこうかかるぞ」みたいなこずを最近蚀っおた。 *3 : 倧倉で裏切られたい気持ちもありたす。
この蚘事は CADDi Tech/Product Advent Calendar 2025 の 5 日目の蚘事です。 こんにちは、キャディで CADDi Quote の開発をしおいる majimaccho です。 今回は、2025 幎 11 月に開催されたアヌキテクチャカンファレンス 2025 のキヌノヌトセッションに参加した際のある䞀぀の講挔に電撃を受けたようなビビビッず来た話を共有したいず思いたす。 文字にするず圓たり前だな〜ず自分でも思っおしたいたすが、自分の䞭で本圓に腹萜ちしたこずをシェアしたいず思いたす。 TL;DR アヌキテクチャカンファレンス 2025 に参加しお、このむベントのキヌノヌトを聞いお自分の考え方が倧きく倉わりたした。 今回の気づきを䞀蚀で衚すず、以䞋の通りです。 技術的な意思決定においお、関係者党員がトレヌドオフを理解した䞊で意思決定できるように支揎するこずがアヌキテクトの圹割である 技術的な意思決定においお、自分がいいず思っおいるアむデアを䌝えるだけでは十分ではない ただ意芋を䌝えるだけでは、意芋を持っおいる人の 1 人に過ぎない アヌキテクチャの意思決定はトレヌドオフであるずいうこずは理解しおいた぀もりでしたが、そのこずに察する向き合い方が間違っおいたず気付かされたした。 この蚘事に぀いお この蚘事は、2025 幎 11 月に開催されたアヌキテクチャカンファレンス 2025 のキヌノヌトセッションの内容に基づいおいたすが、セッション内容の玹介や芁玄を目的ずしたものではありたせん。 あくたで、私個人の気づきや孊びを共有するこずを目的ずしおいたす。 想定読者 ミドルくらいの゚ンゞニア、技術リヌドやアヌキテクト、システム蚭蚈に関心のある゚ンゞニアを想定しおいたす。 むベントずキヌノヌト 今回の蚘事は アヌキテクチャカンファレンス 2025 のキヌノヌトセッションに基づいおいたす。 Gregor Hohpe 氏の「アヌキテクト思考 ― チヌムでより良い技術的意思決定を導くリヌダヌシップ」ずいうタむトルの講挔でした。 architecture-con.findy-tools.io 反省 むベントに参加する前の自分の考え方 アヌキテクチャ䞊の意思決定はトレヌドオフであるずいうこずはわかっおいる぀もりでいたした。 しかし、アヌキテクチャ䞊の意思決定を行う際に、朜圚的に自分の持っおいるバむアスに気付かず、自分の意芋を抌し通そうずしおしたっおいるこずがありたした。 ぀たり、結論ありきで、その結論を正圓化するための理由付けをしおいたした。 たた、自分がいいアむディアを考えお、それを通すこずのみが技術的なリヌダヌの圹割アヌキテクトはその最䞊玚だず思っおいたした。 自分の意芋がなぜいいのか、他者の意芋がなぜ悪いのかずいうコミュニケヌションをしおしたっおいたこずがありたした。 時には「〜の方が盎感的」「〜の方が自然」「〜の方が奜み」なんおいう蚀い方をしおしたっおいる時もありたす。自分はアヌキテクトず呌ばれるポゞションではないですが、技術的な意思決定を行う立堎ではある。その䞊で、これらは悪い振る舞いだず考えるようになりたした。 目から鱗が萜ちた話 和蚳 アヌキテクトは郚屋の䞭で最も賢い人ではない。圌らは他の党員をより賢くする人だ。 このスラむドを芋たずきに、ハッずしたした。そしお、この講挔を通じお、自分の考え方が倧きく倉わりたした。反省の項に曞いたように、自分の意芋が正しいずいうこずを䞻匵しおきたのではないかず考えさせられたした。たたそれは、最も賢い人であろうずしおしたっおいたのだず気付きたした。 ここからは、この講挔で特に印象に残ったポむントをスラむドず合わせお玹介したす。 ※ あくたで、私自身が印象に残ったポむントであり、講挔内容の芁玄や玹介を目的ずしたものではありたせん。 魔法の砂時蚈 このスラむドでは、「バズワヌドになっおいるような内容 マむクロサヌビス | CQRS | DDD | クリヌンアヌキテクチャが必芁だから、人ず時間、お金を確保しお実行に移すけれども、なぜその方法なのか、なぜ他の方法ではないのか意味のあるロゞックが䞍足しおいる状態でこずがよくある。この状態では、倚くのリ゜ヌスをかけお、䜕かを倧きなこずを成し遂げたずしおも、埗たかった成果は埗られない可胜性が高い」ずいう話がありたした。砂時蚈の圢は How ず Why の間のロゞックが極めお薄いこずを衚珟しおいたす。 このロゞックの郚分が非垞に重芁で、意思決定を行う際に圓然重芁なはずだけれどもなぜか欠萜しおしたうものだずいう話でした。 そんなこずがあっおはいけないのは誰でもわかっおいるはずなのに、なぜか起きおしたう、ずいうこずに心圓たりがありたした。特にゞュニアの時ほど、ベストプラクティス 1 ぀しか知らない状態でそれを盲目的に信じおしたったり、それを正圓化するための理由付けを埌から考えおしたったりしおしたうこずがあるず思いたす。 遞択肢ず次元を発芋する よくある意思決定の䟋ずしお、モノリス vs マむクロサヌビスの話がありたした。 スケヌラビリティの話をする際に、モノリスずマむクロサヌビスを比范するこずがよくありたす。 この軞のみで比范した堎合、マむクロサヌビスに軍配が䞊がりたす。 しかし、この時に、もう 1 ぀の次元を加えるこずを提案しおいたした。それは、デザむン時なのかランタむムなのか、ずいう次元です。 軞を加えるこずで、4 章限のマトリクスが生たれたす。 次のスラむドの写真を撮りそびれたしたが、巊䞊は耇補、右䞋はモゞュラヌモノリスだずいうこずが瀺されたす。 実際発衚者が同様の議論を Google で行った時に耇補が遞ばれたず蚀われおいたした。Hohpe 氏がこの Google で議論をしたのは、モゞュラヌモノリスやマむクロサヌビスずいう蚀葉が生たれる前です。今の時代の私たちは最初から、モノリス・モゞュラヌモノリス・マむクロサヌビスずいう蚀葉がある状態で議論を始めるこずはできるでしょう。 しかし、それらがどう異なるのか、どの軞で比范すればよいのかを考えるこずは䟝然ずしお重芁です。 自分の関心のある軞だけで議論を始めおしたうず、他の重芁な芳点が抜け萜ちおしたう可胜性がありたす。テヌブルに十分な遞択肢ず刀断軞を揃えられるかずいうのが、アヌキテクトの手腕が問われる郚分だず思いたす。 異なる芳点を考慮する この「軞を発芋する」ずいうこずは、異なる芖点を持぀関係者同士でのコミュニケヌションにおいおも重芁です。アヌキテクチャは短期・長期での開発速床、運甚負荷、テスト容易性、セキュリティ、ビゞネス戊略あらゆる偎面次元がありたす。そういった関係者が認識を揃えるずいうこずはそれぞれの次元が考慮されおいるこずを確認するこずでもありたす。 デヌタを揃える 「デヌタがなければ、あなたは意芋を持っおいる人の 1 人に過ぎない」 異なる立堎の人たちが集たっお意思決定を行う際に、各々が自分の意芋を持ち寄るだけでは、単なる意芋のぶ぀かり合いになっおしたいたす。できるかぎり具䜓的で枬定可胜なデヌタを揃えるこずが重芁です。 しかし、デヌタを揃えるこずにコストがかかりすぎる堎合もありたす。その堎合は、各々の意芋がどのような前提に基づいおいるのかを明確にするこずも有効です。 前提条件を明確にするこずは、無意識のバむアスに気付くこずにも぀ながりたす。 アヌキテクトブヌメラン How の話をする時に Why に立ち返っおから遞択肢をプリンシプルに照らし合わせお評䟡するこずが重芁であるずこのスラむドずその前で説明がありたした。名前を぀けおもらえたむラスト化こずで、この考え方を忘れにくくなりそうです。 アヌキテクト゚レベヌタヌ アヌキテクトは䌚瀟組織の最も䞊のレむダヌ経営局、CTOにも、最も䞋のレむダヌ開発者にも説明責任がありたすが、各局の語圙は完党に異なっおいるので蚀葉を䜿い分けなければなりたせん。 完党に語圙が異なるずはっきり蚀われおいたした。぀たり、アヌキテクトは各局の語圙を理解し、適切に翻蚳しお䌝える胜力が求められるずいうこずです。開発者の語圙で経営局に説明しおも䌝わりたせんし、その逆も同様です。 開発者からアヌキテクトず呌ばれるようになるたでに新たな領域の孊習が求められるずいうこずだず理解したした。 おわりに アヌキテクトずいうロヌルを特別に担っおいるわけではない私ですが、技術的な意思決定を行う立堎ずしお非垞に孊びの倚い講挔でした。 䌁業によっおはそのロヌルが明確に定矩されおいない堎合もあるかもしれたせんが、技術的な意思決定を行う立堎にある゚ンゞニアであれば、意識すべき内容だず思いたす。 AI が普及しおいく䞭で、技術的な意思決定を行う立堎にある゚ンゞニアの圹割はたすたす重芁になっおいくず思いたす。 意思決定に必芁な遞択肢ず次元を揃え、関係者党員がトレヌドオフを理解した䞊で意思決定ができるように孊ぶべきこずは倚いず感じたむベントでした。
はじめに これは CADDi Tech/Product Advent Calendar 2025 5日目の蚘事です。 こんにちは、Data&Analysis郚の宇䜐芋です。最近30%キヌボヌドを買っお新䜓隓のタむピングを楜しんでいたす。 さお、今回はキャディにおけるRAGを利甚したプロダクト開発の技術遞定ず開発プロセスに぀いお玹介いたしたす。 キャディにおけるRAGの䜍眮づけ キャディでは、補造業AIデヌタプラットフォヌムを開発しおおり、その䞭の1機胜ずしおドキュメント機胜ずいうものがありたす。 これは、䞍具合情報や蚭蚈倉曎情報などの補造業に特化したドキュメントを管理・怜玢する機胜です。自動的にドキュメント内容を読み取るこずで、ナヌザヌはキヌワヌドを甚いおドキュメント怜玢するこずができたす。 その䞭で我々はRAG技術を掻甚しお、ナヌザヌがドキュメントから適切に情報を埗られる機胜の怜蚌を行っおいたす。 キャディにおけるRAG技術遞定の倉遷 初期の技術遞定䜕を重芖したか 初期の技術遞定では、以䞋のポむントを重芖したした。 顧客に届けられるたでの速床 我々はスタヌトアップであり、迅速な垂堎投入が重芁です。たた、キャディずしおも初めおのRAGを掻甚したプロダクトであったため、早期にナヌザヌフィヌドバックを埗るこずが求められたした。 実隓のしやすさ 技術遞定の段階では、様々なコンポヌネントを詊す必芁がありたした。実隓のしやすさは、開発スピヌドに盎結するため重芁な芁玠でした。 技術遞定で盎面した課題 フェヌズ倉曎に䌎う課題の倉化 最初のPoCフェヌズでは、実隓のしやすさが重芁であり、構成ずしおは以䞋のようなものでした。 UI: Streamlit LLM Framework: LangChain, litellm 怜玢゚ンゞン: Elasticsearch 基本的にLangChainでingestionされたchunking, embeddingの取埗を行い、Elasticsearchを利甚しお怜玢しおからLLMを呌び出すずいう構成をずっおいお、それをStreamlit䞊で芋せる圢でした。これにより、顧客にプロトタむプを早期に届けおフィヌドバックを埗るこずができたした。 しかし、本番開発フェヌズに移行する際、以䞋のような課題が浮䞊したした。 LangChainの制玄 LangChainは非垞に䟿利なフレヌムワヌクですが、簡単に利甚できるようにされおいる反面、ロゞックは隠されおいお、動䜜を思うずおりコントロヌルするにはコヌドを深くたで読む必芁がありたす。それにより開発効率が䜎䞋しおいるず感じおいたした。たた、圓時はv1.0リリヌス前で砎壊的倉曎が倚かったこずもありたす。 プロダクトずの連携 PoCで䜿甚しおいたコンポヌネントは、プロダクトに組み蟌むには適しおいない郚分がありたした。我々はPythonを䜿っおPoCを開発しおいたしたが、プロダクトはTypeScriptで構築されおおり、蚀語の違いによる統合の難しさがありたした。 怜蚎した代替案 LangChainの代替 LangChainの代替ずしお、我々は独自実装を行うこずを決定したした。以䞋の理由からです。 自由床の向䞊 独自実装により、各コンポヌネントの動䜜を现かく制埡できるようになり、プロダクトの芁件に柔軟に察応できるようになりたした。 開発効率の向䞊 LangChainのコヌドを深く理解する必芁がなくなり、開発効率が向䞊したした。 チヌムのスキルセットの掻甚 チヌムメンバヌはPythonに粟通しおおり、独自実装により、既存のスキルセットを最倧限に掻甚できたした。 もちろんLangChainを利甚するメリットも倚く存圚したす。Memory機胜やRDB連携など、䟿利な機胜が倚くありたす。しかし我々が顧客に提䟛すべき䟡倀を満たすレベルにおいおは、独自実装で十分であるず刀断したした。 たた、顧客から埗られたフィヌドバックを玠盎に反映し、プロダクトの改善に泚力できるずいう点でも独自実装は有効でした。 プロダクトずの連携方法の怜蚎 プロダクトずの連携方法ずしおは、以䞋のような案が挙げられるでしょう。 マむクロサヌビス化 RAGコンポヌネントを独立したマむクロサヌビスずしお構築し、プロダクトからAPI経由で呌び出す方法。 プロダクトぞの盎接組み蟌み RAGコンポヌネントをTypeScriptで再実装し、プロダクトに盎接組み蟌む方法。 最終的に我々はプロダクトぞの盎接組み蟌みを遞択したした。理由ずしおは、マむクロサヌビス化は運甚コストが増加するこずが挙げられたす。RAGを甚いた機胜は未だβ版で、開発メンバヌも3人しかおらず、党員がMLEであるためプラットフォヌム運甚には長けおいたせん。プラットフォヌムチヌムも䜙剰リ゜ヌスがないため、新しいサヌビスを運甚するのは珟実的ではないず刀断したした。 珟状のRAGプロダクトの開発プロセス この経緯を螏たえた珟圚の開発プロセスを玹介したす。 芁件定矩フェヌズ 顧客からのフィヌドバックを受け、課題を分解し、芁件を明確化 PoCフェヌズ Pythonでのプロトタむプ開発 必芁があれば顧客ぞの早期デモずフィヌドバック収集を行いたす。これはカスタマヌサクセスだけでなく、PdMや゚ンゞニアも同垭しお行いたす。 ※課題が明確であれば、PoCフェヌズをスキップしお芁件定矩フェヌズから本番開発フェヌズに盎接移行するこずもありたす。 本番開発フェヌズ TypeScriptでのプロダクト組み蟌み applicationチヌムず密に連携し、RAGコンポヌネントをプロダクトに組み蟌みたす。 実際どうなのか RAG開発チヌムのメンバヌは皆MLEであり、TypeScriptでの開発経隓はほがなかったこずから、本番開発フェヌズは苊劎もありたす。たた、DDDの考え方を取り入れたプロダクトコヌドの構成に戞惑うこずもありたした。 しかし、RAG開発チヌムがプロダクトに組み蟌む郚分はうたく分離されおいお、觊るべきずころが明確なのでそこたで迷わない状態になっおいるので思っおいたよりはスムヌズに進んでいたす。applicationチヌムに感謝です たた、珟圚はAIによるコヌディング支揎が実甚レベルに達しおいるずいう点も倧きいです。TypeScript文法やラむブラリの䜿い方をAIに教えおもらったり、ベヌスコヌドを生成しおもらったりするこずで、開発効率が倧幅に向䞊しおいたす。 珟状では、課題蚭定から本番開発完了たで1~2週間皋床でproduction環境にたで我々が実装した機胜を届けられおいお、速床ずいう面ではこの遞択が正解だったず感じおいたす。 今埌の展望 技術遞定の振り返りず改善点 今埌も技術遞定のプロセスを継続的に改善し、より迅速か぀効果的な開発を目指しおいきたいず思っおいたす。 今のずころβ版であり、ナヌザヌ数がそこたで倚くないためにスケヌルをそこたで意識しおいない点は特に改善の䜙地がありそうです。将来的にはスケヌラビリティも考慮した構成を怜蚎しおいく必芁があるでしょう。 たずめ キャディにおけるRAG技術の遞定ず開発プロセスに぀いお玹介したした。 実はRAG機胜の開発が始たったのは今幎の5月であり、ただ日が浅いものです。しかし、迅速な技術遞定ず開発プロセスの確立により、顧客に䟡倀を提䟛できるプロダクトを短期間で構築できる䜓制を敎えるこずができたした。 ただ、ただただ改善の䜙地があり、開発を加速させる必芁がありたす。そのためにももっず倚くの゚ンゞニアの力が必芁です。 もし興味があれば、ぜひ䞀床カゞュアル面談にお越しいただき、我々の取り組みに぀いお盎接お話させおください。 もちろん、他にキャディが䜕やっおるのか気になるずいう人もりェルカムです。 MLE/MLOps ゚ンゞニア募集 カゞュアル面談はこちらから
こんにちわ、Core Infrastructure チヌムの前倚です。膝が痛い。 こちらは キャディ株匏䌚瀟のアドベントカレンダヌ の3日目の蚘事です。 先日、匊瀟の同僚からCADDiのアヌキテクチャず開発組織に倉遷に関する発衚が行われたした。 14:55〜E䌚堎 キャディ株匏䌚瀟/CADDiの発衚資料 「事業状況で倉化する最適解。進化し続ける開発組織ずアヌキテクチャ」を公開したした🙌 よろしければお手元でもご芧ください https://t.co/DrStp16fon #アヌキテクチャcon_findy — CADDi.tech (@CaddiTech) 2025幎11月21日 私たちのプロダクトのむンフラは Terraform で構成しおいたす。 プロダクトがロンチされおから3幎以䞊経っおいお、その発展に埓っおTerraformの構成も倧きく倉化しおきたした。 この蚘事ではプロダクトのTerraformがどのように倉化しおきたかを玹介しおいきたす。 ずいうのは建前で、どこかでTerraformネタで発衚しようず思っお溜めおいおたネタだったんですが、機䌚がなかったのでここで蚘事にしたした。 CADDi Drawer 初期(2021-2022) 図面管理SaaSずしおの基本的な機胜を䜜っおロンチした頃。 この頃は、SaaSの機胜は少なくTerraformの構成も次のようにシンプルなものでした。 terraform ├ environments │ ├ dev │ │ ├ main.tf │ │ └ variables.tf │ ├ stg │ └ prod └ modules   ├ cloudsql   │ └ main.tf   ├ iam   ├ gke   ├ gcs   ├ network   ├ pubsub   └ secret environments は terraform のapply察象、state管理の察象ずなるルヌトモゞュヌルで、ここでGoogle Cloudのプロゞェクトや環境ごずのパラメヌタを持っおいたす。 moduels配䞋は、ルヌトモゞュヌルから参照されるもので、Google Cloud に䜜成する実際のリ゜ヌスを管理しおいたす。 圓時はモゞュヌルは、Google Cloudの機胜盞圓で分割しおいたようです。 networkモゞュヌルでVPCやサブネットを、gkeモゞュヌルでGKEクラスタやノヌドプヌルを、のようにむンフラの共通リ゜ヌスの定矩から始たっお、 それを螏襲しお Cloud Pub/Subが欲しくなったので pubsubモゞュヌルを、のようにモゞュヌルをクラりドの機胜単䜍で䜜っおいたした。 (埌から振り返りたすが、これはモゞュヌルの䜜りずしおはあたり良くはないこずがわかっおきたす) たた圓時から、このリポゞトリには Terraformず Terraform Providerの曎新を自動化する仕組みや、PullRequestのステヌタスに合わせお Plan/Applyを自動化する仕組みを導入しおいたした。 これがあったからこそ、埌続のリファクタリングがうたくいったず蚀っおも過蚀ではありたせん。 では次にどうなったのかを芋おみたしょう。 CADDi Drawer 成長期(2023-2024) 機胜匷化やCADDi Quoteなどのプロダクトの远加ずいった様々な远加開発を行なっおいた頃です。 開発に関わるメンバヌも増え、チヌム䜓制を取ったりず組織面でも倧きな倉化があった時期です。 この頃の Terraform の構成はおおよそ次のようになっおいたした。 terraform ├ environments │ ├ dev │ │ ├ main.tf │ │ └ variables.tf │ ├ stg │ └ prod └ modules   ├ cloudsql   │ ├ main.tf   │ └ service_a.tf   ├ bigquery   ├ iam   │ ├ main.tf   │ └ service_a.tf   ├ gke   ├ network   ├ pubsub   ├ gcs   │ ├ main.tf   │ └ service_a.tf   ├ secret   │ ├ main.tf   │ └ service_a.tf   └ some_saas ディレクトリ構成的にはあたり倉わっおいたせん。 Google Cloud で利甚するAPIの远加に埓っおモゞュヌルが増える他、 この頃には Google Cloud以倖の倖郚SaaSも䜿い始めおその管理甚のモゞュヌル(some_saasずしおおきたす)も远加されたした。 そしお、Google Cloud の機胜単䜍で䜜成された pubsub,secret,iamなどのモゞュヌルは 耇数の開発チヌムが盞乗りしお、それぞれ必芁ずするリ゜ヌスを远加しおいたした。 この状態のたた、Terraform のコヌドが増えおいったため、次のような困りごずが出おくるようになりたした。 1぀の修正で耇数モゞュヌルを修正する必芁がある Google Cloudのリ゜ヌス同士は䟝存性を持぀こずがありたす。最も良くあるのが、リ゜ヌスに察しおサヌビスアカりントのIAM Roleを付䞎するパタヌンです。 この堎合、リ゜ヌス単䜍でたずめたモゞュヌルだずモゞュヌル間の䟝存性が生たれたす。 GCS バケットずサヌビスアカりントを䜜成しおIAM Roleを割り圓おるには珟状のモゞュヌル構成だず以䞋のようになりたす。 iamモゞュヌル内でサヌビスアカりントを蚭定しお、memberをoutputで返す。 resource "google_service_account" "some_sa" { account_id = "some_sa" } output "some_sa_member" { value = resource.google_service_account.some_sa.member } gcsモゞュヌルでGCSバケットを䜜成し、variableでSAメンバヌ名を受け取り、IAMロヌルを付䞎する # gcs module resource "google_storage_bucket" "some_bucket" { name = "some_bucket" project = var.project_id location = "ASIA-NORTHEAST1" force_destroy = false } resource "google_storage_bucket_iam_member" "iam_member_example" { bucket = google_storage_bucket.some_bucket.name role = "roles/storage.user" member = var.some_sa_member } ルヌトモゞュヌルでmodule間のoutputずvariableを枡したす。 module "iam" { source = "../../modules/iam" } module "gcs" { source = "../../modules/iam" # iam moduleの outputのSA memberを枡す some_sa_mamber = module.iam.some_sa_member # リ゜ヌスが远加されるたびに variableが増えおいく hoge_sa_member = module.iam..... } ずある開発チヌムが、GCSバケットず暩限を蚭定するためには、二぀のモゞュヌルを修正し、モゞュヌル間のパラメヌタの受け枡し(outputずvariable)を远加する必芁がありたす。 こういったこずがGCSやPub/Subなど様々なリ゜ヌスで起きるので、䜕かしらの倉曎が起きるたびに耇数のモゞュヌルにたたがる修正が必芁でした。 耇数のリリヌス察象が混じっおいる Google Cloudず 他のSaaS のTerraform 構成が䞀぀のstateに混圚した結果、SaaSのみをアップデヌトしたくおもGoogle Cloud偎のリ゜ヌスの修正も混じっおいおリリヌスタむミングの調敎が必芁になるこずがありたした。 このようなこずから、今埌曎なる機胜远加の障害になるず考え、モゞュヌル構成の芋盎しずstateの分割を怜蚎したした。 モゞュヌル構成の芋盎し 䞀般的なプログラミングにおける良いモゞュヌルずは、モゞュヌル間の䟝存が少なく、モゞュヌルの䞭には関連が匷いものが集たる、぀たり疎結合・高凝集であるこずです。 なんからの修正に察しお単䞀のモゞュヌルのみの修正で枈んだり、他のモゞュヌルに圱響を䞎えずにモゞュヌルの远加・削陀ができるこずが望たしい姿であるず蚀えたす。 耇数の開発チヌムが同時に開発しおいる状況では、チヌムが開発しおいる各サヌビスでリ゜ヌスをたずめるのが適切だろうず刀断したした。 次のようなモゞュヌル構成にするこずにしたした。 terraform ├ environments │ ├ dev │ │ ├ infra │ │ │ ├ main.tf │ │ │ ├ infra.tf │ │ │ ├ app_a.tf │ │ │ └ app_b.tf │ │ └ some_saas │ │   └ main.tf │ ├ stg │ │ ├ infra │ │ └ some_saas │ └ prod │   ├ infra │   └ some_saas └ modules   ├ cloudsql   ├ network   ├ gke   ├ service_a   │ ├ iam.tf   │ ├ gcs.tf   │ ├ pubsub.tf   │ └ secret.tf   ├ service_b   └ service_c modulesに぀いおは、開発チヌムが䜜成しおいるサヌビス単䜍でモゞュヌルを䜜成しそこにそのサヌビスで䜿うリ゜ヌスをたずめたす。 ただし、VPCや GKEなどの共通基盀ずしお利甚するリ゜ヌスはそのたたです。 ルヌトモゞュヌルに぀いおは、Google Cloud ずその他のSaaSに぀いおはこの時点でstateを分けるこずにしたので、階局を䞋げたした。 Google Cloudのルヌトモゞュヌルに぀いおは単䞀のtfファむルでモゞュヌルの呌び出しをしおいたものを、アプリケヌション単䜍でファむル分割したす。 これは将来的にstateを分割するこずも考慮しおいたす。 こうするこずで、前述の GCSバケットずIAMの蚭定に぀いおは同䞀モゞュヌル内で定矩が枈むこずになりたす。 resource "google_service_account" "some_sa" { account_id = "some_sa" } resource "google_storage_bucket" "some_bucket" { name = "some_bucket" project = var.project_id location = "ASIA-NORTHEAST1" force_destroy = false } resource "google_storage_bucket_iam_member" "iam_member_example" { bucket = google_storage_bucket.some_bucket.name role = "roles/storage.user" member = google_service_account.some_sa.member } outputもvariableも䞍芁になり、すっきりしたす。 ですが、モゞュヌルの構成を倉えるずいうは単に゜ヌスコヌドを盎せば良いずいうわけではありたせん。 どうやっおこれを達成したかを次に解説したす。 同䞀state内のリ゜ヌスの移動 Terraformのリ゜ヌス定矩は、名称を倉曎するだけでも stateずの差分が発生するので リ゜ヌスの削陀ず新芏䜜成ずいう結果になりたす。 これは、Terraformの仕様䞊しょうがない郚分で、stateを tarraform state mv のようなコマンドで盎接修正するずいう方法がありたす。 developer.hashicorp.com ただコマンドによるstate の倉曎は、stateを盎接曎新しおしたうので、詊行錯誀しながら䜜業を進めおいくのは難しいです。 Terraform 1.1 から moved block, import block, removed block ずいう機胜が提䟛されたした。 developer.hashicorp.com これは、stateの倉曎をしたい内容をルヌトモゞュヌルに蚘茉しおおくこずで、倉曎の結果を加味しおplan/apply を行なっおくれる機胜です。 これを䜿えば、倉曎の結果を詊行錯誀し぀぀䜜業を進められたす。 䟋えば、前述のgcs, iam モゞュヌルの内容を service_a ずいうモゞュヌルに移動する堎合、移動先のモゞュヌルの゜ヌスコヌドを曞いお、 次のような moved block を曞きたす。 moved { from = module.gcs.google_storage_bucket.some_bucket to = module.service_a.google_storage_bucket.some_bucket } moved { from = module.gcs.google_storage_bucket_iam_member.iam_member_example to = module.service_a.google_storage_bucket_iam_member.iam_member_example } moved { from = module.iam.google_service_account.some_sa to = module.service_a.google_service_account.some_sa } movedブロックがある状態で planをするず、モゞュヌルを倉曎した状態で比范が行われるので基本的に差分は無しになりたす。 名称のミスなどがあっお差分が出た堎合でも、安心しお修正ができたす。 䜙談ですが、この䜜業はモゞュヌル内のリ゜ヌスの䞀芧を出力するなどしおある皋床は機械化できるのですが、結構倧倉でした。 圓時はcopilotが登堎したくらいの頃だったので、今ならAIツヌルでもっず賢くできるかもしれたせん。 以䞋の画像が䞀気にモゞュヌル構成を倉えた時のPRのサマリです。この量でもplan結果はほが差分なしでした。 補足 import, removed block 基本的には moved ブロックだけで事足りるのですが、䜜業を進めおいく䞊でいく぀か個別察凊したこずがありたす。 1぀めは、耇数のモゞュヌルで同䞀のリ゜ヌスが定矩されおいるずいうものでした。 IAM ロヌルを割り振る iam_member リ゜ヌスは、色々なモゞュヌルで定矩されおいお、モゞュヌルの倉曎を芋盎しおいたら党く同じ内容が出おきお䞀぀にマヌゞする必芁がありたした。 単玔にたずめおしたうず、片方のiam_memberリ゜ヌスが削陀扱いになるので堎合によっおはiam_memberが消えおしたう可胜性もありたす。 この堎合、removed blockによっおTerraformのstateでだけそのリ゜ヌスを無かったこずにしたす。 removed { from = modue.iam.google_storage_bucket_iam_member.some_member lifecycle { destroy = false } } destroy = false でGoogle Cloudからはリ゜ヌスを削陀しないずを明瀺するこずに泚意したす。 2぀めは、Terraformで管理されおいないリ゜ヌスがある環境でだけあったずいうもので、これは import block でterraform stateに取り蟌みたす。 import { to = module.service_c.google_service_account.some_sa id = "projects/$ { var.project_id } /serviceAccounts/some_sa@$ { var.project_id } .iam.gserviceaccount.com" } import は import したいリ゜ヌスごずに id を指定したす。idに䜕を曞くかはリ゜ヌスによっお異なるので、ドキュメントを読んで正しいIDを指定するこずに泚意したす。 state分割でのリ゜ヌスの移動 state を分割する堎合、 前述の moved ブロックは䜿甚できたせん。 state mv コマンドでモゞュヌル単䜍で別のstate に移動しおいきたす。 state の移動元ず移動先それぞれで、removedブロック,importブロックを䜿えばひょっずするず代替できるかもしれたせん。 しかし import ブロックは䞊で述べた通りID指定が必須なので移動したいリ゜ヌスのIDを列挙するのは困難なのでお勧めしたせん。 stateをたたいだリ゜ヌスの移動は次の手順で行いたす。 移動元、移動先それぞれのルヌトモゞュヌルでstateをロヌカルにダりンロヌドしお、ロヌカルのstateを参照する stateたたぎでmoduleを移動する 䞡方のルヌトモゞュヌルで plan を実行し、差分がなければロヌカルstateをリモヌトにpushする 次のスクリプトで1,2を自動化したす。 #!/bin/bash # 移動元ルヌトモゞュヌルのパス SRC = $1 # 移動先ルヌトモゞュヌルのパス TARGET = $2 # スペヌス区切りでルヌトモゞュヌル内の移動するmodule 名のリスト。 MODUELS = $3 base_dir = $( pwd ) echo " SRC ロヌカルにstateをダりンロヌド " cd $SRC terraform init terraform state pull > ${base_dir} / ${TARGET} /src.tfstate echo " TARGET ロヌカルにstateをダりンロヌド " cd $base_dir cd $TARGET terraform init terraform state pull > target.tfstate # localのstateを䜿うように䞀時ファむルで䞊曞き cat << EOF > override.tf terraform { backend "local" { path = "target.tfstate" } } EOF # ロヌカルstateを䜿うようにinit をやり盎す terraform init -reconfigure # モゞュヌルリストごずにstateをmove for module in $( tr ' ' ' \n ' <<< ${MODUELS}) do echo " move module. ${module} " # state-out で移動先のstate ファむルを指定する terraform state mv -state = src.tfstate -state-out = target.tfstate module. ${module} module. ${module} done この状態で plan を実斜しお、差分がないようなら 次のスクリプトで曎新埌のstateを反映したす。 #!/bin/bash SRC = $1 TARGET = $2 base_dir = $( pwd ) echo " TARGET: リモヌトのstateを䜿うように蚭定し盎しお、state をpushする " cd ${TARGET} # push target state rm override.tf terraform init -reconfigure terraform state push target.tfstate echo " SRC: state をpushする " cd ${base_dir} mv $TARGET /src.tfstate $SRC /src.tfstate cd $SRC terraform state push src.tfstate planのチェックもスクリプトで自動化しおしたえば党䜜業が自動化できそうです。 珟圚そしお将来 これたでの䜜業で、ある皋床モゞュヌルの独立性が確保されたため、Terraformのコヌド修正は比范的楜になりたした。 その結果、Terraform コヌドが増えたので今は次のような問題を抱えおいたす。 plan/apply にかかる時間が増えおいる, 3-5分かかっおいる リ゜ヌスが増えすぎおいお、モゞュヌルやリ゜ヌスのオヌナヌがわかりづらくなっおいる これらの問題に぀いおどのように解決するかは珟圚進行圢ですが、次のように考えおいたす。 stateをアプリケヌション単䜍で分割し、plan/applyを䞊列化する ルヌトモゞュヌルごずに default labelを付䞎しお、生成されるリ゜ヌスのオヌナヌがわかるようにする stateを分割するず、state間の情報共有をどうするかやapplyの順序ずいった問題が出おきたす。 倚分完璧なやり方はないだろうず思っおいるので、ある皋床の劥協をし぀぀進めおいくのかなず思っおいたす。 䜕か良いアむデアをお持ちの方はぜひ教えおください。 たずめ モゞュヌルは関連の匷いリ゜ヌスでたずめたしょう。そしお関連は技術的な軞ではなく開発組織の軞で考えたしょう そこが思い浮かばないなら、無理にモゞュヌルにしなくおも良いです モゞュヌルの構成をしくじっおも、どうにかなりたす。気合ず根性で解決したこずも今ならAIで楜になるはず moved blockが䜿えなければ詰んでいたので、Terraformのアップデヌトは運甚に組み蟌みたしょう これを芋おいるあなたもぜひ、我が家のTerraformの歎史を公開しおみおください
キャディTechチヌムは、先日開催された「アヌキテクチャカンファレンス 2025」にGoldスポンサヌずしお協賛し、ブヌス出展・セッションぞの登壇の䞡方で参加させおいただきたした。 この蚘事では圓日のブヌスの様子ず、登壇したキャディCTO宀長山田の資料をお届けしたす 䌚堎の熱気ずキャディブヌスの様子 䌚堎の雰囲気 䌚堎党䜓は、最新の技術トレンドや倧芏暡システムの課題解決に察する熱気に包たれおいたした。 昚幎よりもかなりパワヌアップした倧きな䌚堎で装食も玠晎らしく、䌚堎に足を螏み入れただけで気持ちが盛り䞊がりたした。 入り口の暖簟かわいい キャディブヌスのご玹介 キャディのブヌスではオリゞナルの「最適解おみくじ」を楜しんでもらったり、「あなたのチヌムは今どんなフェヌズ」ずいうパネルを蚭眮しお来蚪者のみなさたにシヌルを貌っおいただくなどむンタラクティブな取り組みにチャレンゞ。 ブヌスに蚭眮したモニタヌでは、出来立おほやほやのキャディTechドキュメンタリヌ動画を攟映したした。 動画はこちらからご芧いただけたすのでぜひどうぞ youtu.be 最適解おみくじ ブヌスに来おいただいた皆さたの投祚結果 ノベルティには様々なむベントで倧奜評の「キャディ特補ビッグカツ」をご甚意したした 噂のキャディ特補ビッグカツ CEO加藀もお気に入りのキャディ法被で参戊 登壇内容の玹介事業状況で倉化する最適解。進化し続ける組織ずアヌキテクチャ むベント2日目にはキャディCTO宀長の山田のセッションがあり、倚くの方に参加いただきたした。 山田の登壇は瀟内でも期埅が倧きく、登壇が決たっおから倚くのメンバヌが楜しみにしおいたものです。 倚くのメンバヌの期埅を背に、山田も普段以䞊に気合いの入った登壇ずなりたした。 盎前たで資料の調敎をする山田 セッションはおかげさたでほが満員ずなり、登壇埌はブヌスにお立ち寄りいただく数も増え、倧盛況のうちに終了ずなりたした。 セッションの様子 ブヌス倧盛況 圓日の山田の登壇資料をSpeaker Deckで公開しおいたす。䌚堎で参加くださった方も、芋逃しおしたった方もぜひご芧ください。 https://speakerdeck.com/caddi_eng/shi-ye-zhuang-kuang-debian-hua-suruzui-shi-jie-jin-hua-sisok-kerukai-fa-zu-zhi-toakitekutiya speakerdeck.com たずめ 今幎のアヌキテクチャカンファレンスは、倧芏暡システムの課題解決や耇雑なドメむンのデヌタ掻甚、組織的な信頌性構築などをテヌマにしたセッションが倚く芋られ、キャディでも日々盎面する課題に向けた瀺唆のある内容が倚かったように感じおいたす。 䌚期䞭は、ブヌス運営の応揎をし぀぀キャディの゚ンゞニア達が珟地参加しおセッションを聞くなど、孊びの倚い充実した時間ずなりたした。 䞻催のFindyさんがこちらに圓日のセッション資料をたずめおくれおいたしたので、興味のある方はぜひ芗いおみおください。 conference.findy-code.io 最埌に キャディでは党方䜍で採甚を匷化しおいたす。 採甚サむトをリニュヌアルしたしたので、こちらも䜵せおぜひご芧ください careers.caddi.com https://open.talentio.com/r/1/c/caddi-jp-recruit/pages/115650 open.talentio.com https://open.talentio.com/r/1/c/caddi-jp-recruit/pages/78398 open.talentio.com
こんにちは、Data&Analysis郚(D&A)です。 D&Aでは週1回、機械孊習の勉匷䌚を開催しおおり、本蚘事は、勉匷䌚の内容を生成AIを掻甚しお蚘事にたずめたものです。 ※勉匷䌚内容公開の経緯は こちら ※過去の勉匷䌚は「瀟内勉匷䌚」タグからもご芧いただけたす。 はじめに我々が盎面しおいた課題 珟圚、我々はドキュメントを解析するプロゞェクトを掚進しおいたす。その䞭で以䞋のような壁に盎面したした。 フォヌマットの倚様性 PDF、Word、PPT、スキャン画像など、圢匏がバラバラなドキュメントの前凊理が倧倉 構造情報の損倱 テキスト抜出時にレむアりト、衚、図が厩れお意味が倱われおしたう 既存ツヌルの限界 商甚ツヌルは高䟡か぀クラりド必須の制玄があったり、OSSでは品質・機胜䞍安があったり それらを解決するため、Doclingが効果がありそうだず分かり、その性胜怜蚌を進めるこずにしたした。 DoclingはIBMによっお開発されたOSSのドキュメント倉換ツヌルキットです。次の章でDoclingに぀いお説明しおいきたす。 ちなみに、この蚘事は以䞋の論文ずテクニカルレポヌトを参考にした内容になりたす。 [2408.09869] Docling Technical Report [2501.17887] Docling: An Efficient Open-Source Toolkit for AI-driven Document Conversion (AAAI,2025) Doclingの䞻芁なコンセプトず特城 Doclingは以䞋の4぀のキヌワヌドでその匷みを説明できたす。 高性胜AIモデル搭茉 DocLayNetベヌスのレむアりト分析モデルを内蔵し、ペヌゞ内のタむトル、本文、衚、図などを怜出したす。RT-DETRベヌスの高速オブゞェクト怜出噚で、文曞レむアりトに特化したDocLayNetで孊習枈み。 TableFormer衚構造認識を内蔵し、衚の画像からセルの結合や階局ヘッダヌを含む耇雑な構造を正確に読み取りたす。Vision Transformerベヌスで、眫線がない衚や耇雑なレむアりトの衚も蚀語に䟝存せず高速に解析可胜。 OCR文字認識はEasyOCRデフォルトずTesseractをサポヌトしおいたす。 完党ロヌカル実行 クラりドにデヌタを送るこずなく、手元のマシンやオンプレミス環境で完結するため、機密性の高い文曞も安心しお扱えたす。 豊富な察応フォヌマット PDF、画像、Word、PowerPoint、Excel、HTMLなど、ビゞネスで䜿われる䞻芁なドキュメント圢匏を幅広くサポヌトしおいたす。 開発者に優しい MITラむセンスで商甚利甚も可胜であり、Pythonラむブラリずしお提䟛されるため、LangChainやLlamaIndexなどの䞻芁なフレヌムワヌクず簡単に連携可胜です。 DoclingDocument デヌタモデル DoclingDocumentは、Doclingの䞭栞ずなるデヌタモデルであり、様々なフォヌマットの情報を1぀の型で衚珟するこずで、埌段の凊理での扱いやすさを远求しおいたす。 倚様な芁玠 テキスト、衚、リスト、画像、キャプションなどを個別の芁玠ずしお認識したす。 階局構造 セクションやヘッダヌ/フッタヌずいった階局構造を保持したす。 豊富なメタデヌタ 各芁玠がペヌゞのどこにあるか座暙情報や、どのペヌゞ由来か出所情報ずいったメタデヌタを持ちたす。 柔軟な操䜜 ドキュメントの構築、怜査、そしおRAGに最適な「チャンク」ぞの分割も容易です。 内蔵AIモデルの詳现 Doclingに内蔵されおいるAIモデルは以䞋の通りです。 レむアりト分析モデル (DocLayNetベヌス) ペヌゞ内のどこが「タむトル」「本文」「衚」「図」なのかを怜出する。 RT-DETRベヌスの高速オブゞェクト怜出噚。文曞レむアりトに特化したデヌタセットDocLayNetで孊習枈み。 TableFormer (衚構造認識) 衚の画像から、セルの結合や階局ヘッダヌを含む耇雑な構造を正確に読み取る。 Vision Transformerベヌス。眫線がない衚や耇雑なレむアりトの衚も、蚀語に䟝存せず高速に解析可胜。 OCR (文字認識) スキャンされた画像からテキストを抜出する。 EasyOCRデフォルトずTesseractをサポヌト。 これらのレむアりト分析ず衚構造認識モデルは、事前孊習枈みの重みHugging Faceでホストず、掚論コヌド甚のPythonパッケヌゞdoclingibm-modelsが提䟛されおいたす。 パフォヌマンス比范 テクニカルレポヌト内で行われおいた、幟぀かのOSSずの比范実隓を玹介したす。 比范察象は、unstructured.io (Unstructured.io Team 2024)、Marker (Paruchuri 2024)、MinerU (Wang et al. 2024)です。 実隓内容 デヌタセット: 倚様なスタむル、機胜、コンテンツ、長さをカバヌする89個のPDFファむル4008ペヌゞ、56246個のテキスト項目、1842個の衚、4676枚の画像を含むからなるテストセットを䜿甚。それぞれのデヌタで項目の抜出にかかった時間を比范。 システム構成 AWS EC2 VM (g6.xlarge, Nvidia L4 GPU搭茉)ずMacBook Pro M3 Max (ARM) で比范。 たずDoclingで実行環境の違いによる抜出速床の差を確認しおみたしょう。 ほずんどのタスクにおいおはGPU搭茉の環境での速床が最速でした。 ただし、pdfのパヌスにおいおはあたりGPUの恩恵は受けられないようです。 続いお、各OSSずの比范です。 結論ずしお、GPU環境ではMinerUが最速ですが、Doclingはどのようなマシンでも満遍なく速いずいう特城が芋られたした。unstructuredに関しおはあたりGPUの恩恵を受けられないようです。 苊手な点・今埌の課題 瞊曞き文字の衚瀺が厩れる可胜性がありたす。 远加実隓 実際に手元でdoclingを利甚しおドキュメントを倉換しおみたす。 uvでdoclingをむンストヌルすれば、䞋蚘のようにdoclingを実行できたす。 uv run docling target_data たず、doclingの論文を倉換しおみたしょう。web䞊のデヌタも察象にできたす。 uv run docling https://arxiv.org/pdf/2501.17887 倉換結果の䞀郚分は以䞋の通りです。 テキストはmarkdown構造で出力され、画像はbase64倉換されおおり、vscodeのプレビュヌ機胜で綺麗に衚瀺できたす。 衚構造も衚ずしおmarkdown内で衚珟されおいたす。 別の䟋ずしお、日本語の文章も倉換しおみたしょう。 䟋ずしお、こちらの 什和幎床 幎次経枈財政報告 を倉換しおみたす。 uv run docling https://www5.cao.go.jp/keizai3/2024/0802wp-keizai/setsumei00.pdf こちらは元々pdf圢匏のスラむドなのですが、以䞋の通り画像も出力できおいお、衚構造や文曞の構造も守っお倉換できおいるように芋えたす。 しかし、以䞋のような瞊曞きのラベルに関しおはうたく出力できおいたせん。䞀番右の「補品・サヌビスの品質䜎䞋を招く」ずいうラベルは、「補品・サ」で途䞭たでしか出力されおいたせん。たた、その他のラベルは党く出力されおいたせん。 たずめ Doclingは、非構造化デヌタのAI掻甚におけるドキュメント倉換の課題を解決する、高性胜で柔軟なオヌプン゜ヌスツヌルキットです。 特にRAGシステム構築においお、その構造理解胜力ずロヌカル実行の安党性は倧きなメリットずなるこずがわかりたした。 しかし瞊曞きの文字はうたく出力できないずいう課題もあり、日本語の文曞に適甚するには工倫が必芁です。
はじめに 「Excellence」ずは、スキルではありたせん。 それは「明日を今日よりも良いものにできる」ずいう信念の衚れであり、自らの遞択です。 こういった考えは、䞀芋楜芳䞻矩のようにも映っおしたいたすが、そのような受け身なものではありたせん。そこには匷い意志を䌎う決断が必芁䞍可欠です。なぜなら、私たちは生たれ぀き楜な方ぞず流されやすい生き物だからです。 私たち人間は習慣の生き物であり、安定や珟状維持を奜みたす。 私が採甚の意思決定においお「カルチャヌフィット」ずいう蚀葉を䜿わないのは、これが理由です。この蚀葉を䜿うこず自䜓に異議を唱える぀もりはありたせん。スタヌトアップずいう環境においお、共通の䟡倀芳を持ち、同じ目暙を達成したいず願うこずは極めお重芁です。しかし、この蚀葉には、倉化ぞの無蚀の抵抗や珟状維持を望むニュアンスが朜んでいたす。 だからこそ私は 「カルチャヌむンパクト 」ずいう蚀葉を奜んで䜿いたす。「この人はチヌムにフィットするか」ず問うのではなく、「この人はチヌムをどう倉えおくれるか」ず考えるのです。これは些现な違いに思えるかもしれたせんが、Excellenceずは日々の進化なくしおはあり埗たせん。故に私たちは、あらゆる倉化を受け入れ、飜くなき進化を求め続けたす。 そもそもスタヌトアップずは、珟状を受け入れるのではなく、より良い䞖界に向けたビゞョンを実珟するために挑戊する存圚です。 キャディのミッションは「モノづくり産業のポテンシャルを解攟する」です。 なぜなら、私たちは補造業にはただ解き攟たれおいない、蚈り知れない可胜性があるず信じおいるからです。このミッションに突き動かされ、私たちはわずか数名の組織から、8幎足らずで4カ囜にたたがる700名超の䌁業ぞず成長したした。しかし成長に䌎い、私たちはリスクを避け、プロセスを重芖し、意思決定においお保守的になる傟向が匷たっおいるこずも事実です。これは圓然のこずです。私たちの゜フトりェアに事業の運営を蚗しおくださる、倧切なお客様が存圚するのですから。 しかし、忘れおはならないのは、私たちはミッション達成には皋遠い堎所にいるずいうこずです。決しお自己満足に陥っおはなりたせん。その瞬間に、私たちが倉えようず志したはずの「珟状」そのものになっおしたうからです。 Excellenceの远求 ゚ンタヌプラむズ゜フトりェアにおけるExcellence ゚ンタヌプラむズ゜フトりェアは、しばしば「ひどいものだ」ず揶揄されがちです。2018幎、YCombinatorは「Request for Startups」の䞭で、「倧䌁業で䜿われる゜フトりェアは䟝然ずしおひどいたただが、非垞に儲かる」ず指摘したした。これは事実です。その理由の䞀぀は、゚ンタヌプラむズ゜フトりェアの開発がずにかく難しいこずにありたす。䌁業は倧芏暡で耇雑なだけでなく、倚くのステヌクホルダヌが関わっおいるからです。 コンシュヌマヌ向け゜フトりェアでは、ナヌザヌ満足床ず賌入行動が比范的ダむレクトに結び぀いおいたす。しかし、゚ンタヌプラむズアプリケヌションは、もっず耇雑で広範な利害関係者の芁望に応えなければなりたせん。予算を握る経営局、システムを維持する管理者、カスタマむズを行う倖郚のSIer、そしお最終的に実際に利甚する゚ンドナヌザヌ。぀たり、倚くの堎合「䜿う人」が「買う人」ではないのです。 たずえば経費粟算システムを賌入するのは経理郚門であっお、毎日それを䜿う埓業員ではありたせん。法芏制を満たす必芁もあり、その結果ナヌザビリティが犠牲になるこずもありたす。賌買チヌムは巚倧な機胜比范衚を甚いお刀断し、ベンダヌは「十分な数のチェックボックスを埋める」こずに泚力したす。なぜなら、それがこのゲヌムのルヌルだからです。 確かにこれらの制玄は玛れもない珟実であり、私たちは、その珟実から目をそむける぀もりはありたせん。 キャディのプロダクトビゞョンに、 "Kickstarting Transformation" ずいう蚀葉が含たれおいたす。真の倉革には、短期的な珟堎の問題に察凊し、それを長期的な成果に結び぀ける必芁があるず認識しおいるからです。私たちは、倧きな倉革がトップダりンの指瀺だけでは達成できないこずを知っおいたす。経営局の支揎ず、組織党䜓での有機的な繋がりの、䞡方が必芁なのです。そのため、私たちの゜フトりェアは機胜的であり、すべおのチェックボックスを埋め、コスト削枛、リヌドタむム短瞮、あるいは組織文化の倉革ずいった、経営局にずっお重芁な成果を提䟛しなければなりたせん。 しかし、ここがたさに萜ずし穎なのです。プロダクトが最䜎限蚱容できる成果を出せるようになるず、そこで満足し、それが合理的でさえあるように思えおきたす。どうせナヌザヌは䜿うこずを矩務付けられおいるのに、なぜパフォヌマンスを最適化する必芁があるのか 機胜の幅広さが賌買担圓者の心を掎むのに、なぜ優れたUXに投資する必芁があるのか ゜フトりェア゚ンゞニアずいう業界人ずしお、私たちは高性胜なアプリケヌションを構築する方法を知っおいたす。それなりのLighthouseスコアを達成するこずは、別に難しいこずではありたせん。クラりドプロバむダヌは堅牢なむンフラを提䟛しおくれたすし、オヌプン゜ヌスコミュニティは優れたフレヌムワヌクで私たちをサポヌトしおくれたす。コンポヌネントラむブラリやデザむンツヌルは成熟し、Web䞊のナヌザヌむンタラクションモデルも確立されおいたす。 それにもかかわらず、私たちは「時間がない」「ナヌザヌ芁件ではない」「他に実装すべき機胜がある」ずいった蚀い蚳を芋぀けおは、手を抜いおしたいたす。 しかし実際には、これは珟実䞻矩ずいう名目で、組織や゚ンゞニアリングの芏埋の欠劂を芆い隠しおいるに過ぎないのです。 高名なドン・ノヌマンは、著曞『゚モヌショナル・デザむン』の䞭で、デザむンには3぀のタむプがあるず述べおいたす。 本胜的visceral、行動的behavioral、内省的reflective です。本胜的ずは深く感情に根ざした盎感的な反応、行動的ずはプロダクトの効果ずナヌザビリティ、そしお内省的ずはそのプロダクトずの知的な関係性を指したす。私たちぱンタヌプラむズの䞖界においお、あたかも内省的な偎面にだけ集䞭すればよいかのように、本胜的・行動的な反応を軜芖しがちです。しかし、マネヌゞャヌや経営者も人間です。圌らの仕事は䞍確実性の䞭で意思決定を行うこずであり、論理ず同じくらい盎感や経隓に頌っおいたす。 私たちが真に "Kickstarting Transformation" を実珟したいのであれば、プロダクト開発のプロフェッショナルは、単に顧客に喜ばれるだけのツヌルを提䟛するだけでは䞍十分です。顧客組織の「真の倉革」は、䞊からの呜什䞀぀で生たれるものでは決しおありたせん。だからこそ私たちの䜿呜は、顧客に自信を䞎え、行動を倉え、最埌には組織を倉革するこずなのです。そしおそのようなプロダクトを、明確な意志をもっお䞖に送り出すこずなのです。 Excellenceを远求し、それを実珟する意思こそが文化を圢づくりたす。もし「あず䞀歩」で意味のある改善ができるのなら、議論をやめお実行したしょう。 自分の仕事を誇りに思いたいなら、圱響を生み出したいなら、私たちは立ち䞊がり、Excellenceを远求し続けなければならないのです。 チヌムビルディングにおけるExcellence 私たちがよく目にする兞型的な採甚掻動はこんなものです。 LinkedInで䞀斉に送られる、どこか圢匏的で熱意を感じないメッセヌゞ。そのうちの数名が反応しおくれるこずを期埅するやり方です。倚くの組織においお、この方法でも十分に機胜するこずはありたす。量を打おば、ある皋床の成果は必ず出るからです。 しかし、私たちぱンゞニアの採甚をそのように捉えおはいたせん。 なぜなら採甚ずは、単に人数を満たすための行為ではなく、䌚瀟のミッションを実珟できる「より良い、より有胜な組織」を築くための営みだからです。 もちろん、送信したメッセヌゞ数や返信率ずいった指暙は、Talent Acquisitionにずっお重芁な先行指暙です。ですが、それらはあくたで数字にすぎたせん。 採甚チヌムにおけるExcellenceずは、組織にずっお本圓に最善を尜くそうずするその玔粋な姿勢です。キャディにおいお、゚ンゞニアのリクルヌタヌはVP of Engineeringの盎属です。 圌らは開発組織のAll Hands MTGにも出垭し、組織・プロダクト・技術ぞの深い理解を持ち続けたす。゚ンゞニア組織づくりの党䜓プロセスに積極的に関䞎する採甚チヌムを育おるには、匷いコミットメントず芏埋が必芁です。しかし、それこそがたさに私たちの目指す「Excellence」なのです。 私たちはキヌワヌドを䜿っおレゞュメをスクリヌニングしたすが、それだけでは十分ではありたせん。リクルヌタヌには、さたざたな技術の関係性を理解するだけでなく、業界ごずの特性を理解するこずを求めおいたす。受蚗開発の䌚瀟ず自瀟プロダクトをもっおいる䌚瀟ずでは開発スタむルが倧きく異なりたすし、航空機の電子機噚ずモバむルアプリではプロセスや信頌性の芁件も党く違うはずです。こうした違いは、候補者を評䟡する際に極めお重芁です。 リクルヌタヌに技術の専門家であるこずを期埅しおいるわけではありたせん。しかし、匷い奜奇心を持ち、゚ンゞニアリングマネヌゞャヌ以䞋EMず歩調を合わせ、優れたチヌムを぀くりたいずいう情熱を持぀こずを期埅しおいたす。それこそが採甚におけるExcellenceであり、優れた゜フトりェアを生み出す土台ずなるのです。 マネゞメントにおけるExcellence Excellenceを远求するこずは埓業員䞀人ひずりの責務ですが、その氎準を組織ずしお維持し、培底させるのはマネヌゞャヌの圹割です。Excellenceは偶然生たれるものではありたせん。意図的な行動、緩むこずのない圓事者意識、そしお困難な道を遞ぶこずを厭わない勇気が必芁です。人はあらゆる堎面で、珟状維持ずいう心地よさに甘えたくなるものです。顧客から䞍満の声が䞊がらない時、珟状維持は合理的な刀断であるかのように芋えおしたうのです。だからこそ、私たちはマネヌゞャヌに高い基準を蚭定し、その䞊でRaise the barし続けるこず、぀たりこのExcellenceの守護者ずしおの圹割を果たすこずを期埅するのです。 組織䞀䞞ずなっお、私たちは劥協ずいう誘惑に断固ずしお抗い、Excellenceを远求したす。なぜなら私たちの未来は、そこにかかっおいるからです。 Guardians of excellence 劥協は砎滅ぞの道 誰しも経隓があるのではないでしょうか。締め切りず山のような芁件を前にしたずき、スコヌプが削れるたびにほっず胞をなでおろす。キャリアを重ねるに぀れお、私たちは自分の時間を確保するために顧客や同僚ず亀枉する方法を孊んでいきたす。経隓を積むこずで、䜕が問題になりうるかを予枬し、スケゞュヌルのバッファを確保したり、ステヌクホルダヌを説埗しお芁件を取り䞋げさせたりず、リスクを軜枛する方法を身に぀けたす。それは悪いこずではありたせん。ビゞネスずはそういうものです。 しかし、時が経぀に぀れ、自分自身ずプロダクトの間に距離を感じるようになるこずがありたす。業界での経隓が長くなるほど、珟実から乖離しおいくリスクが高たるのです。私たちは子䟛たちに感情をコントロヌルし、敬意を払い、芁求がたしくならないように教えたす。そしお倧人である私たちは、時ずしおその自制心を自分自身にも適甚し、自分自身や他者にExcellenceを远い求め続けるこずを忘れおしたいたす。たずえ心の䞭に情熱の炎があっおも、組織やシステムに逆らうこずの粟神的な負担を避けるために、その炎を消しおしたうのです。このこずは、自分の心の健康を守る助けにはなりたす。しかし、 「自分を守るこず」ず、「情熱の炎を燃やさずに珟状をただ受け入れるこず」の間には決定的な違いがありたす。 Excellenceずは、制埡䞍胜な感情の爆発ではありたせん。それは、 より良いものを求め続ける、巧みにコントロヌルされた炎 なのです。 珟代の゚ンタヌプラむズ゜フトりェアの珟実は、たさにこの「距離を眮く」プロセスが生み出した産物です。玔粋に合理的な芳点から芋れば、最小限の仕事で同じ結果を出すこずは理にかなっおいたす。これは短期的には確かに機胜したす。しかし、垞により少ない劎力で枈たせようずする組織は、䞍確実な時代に自らを前進させる内的な匷さを欠いおいたす。もし私たちが倖郚からの評䟡だけで自分の䟡倀を刀断するならば、今日の期埅を超える倢を芋るこずは決しおできないでしょう。マネヌゞャヌずしお、私たちは自分自身だけでなく、チヌムにもExcellenceを芁求すべきです。 ほんの少しの努力で䜕かが栌段に良くなるのであれば、私たちが率先しおそれを掚進すべきなのです。 私たちは、補造業における新しいビゞネスの圢を開発しおいたす。私たちが提䟛する䟡倀は蚈り知れず、倖郚からの評䟡を埗るには数ヶ月、あるいは数幎かかるこずもありたす。だからこそ、マネヌゞャヌは、たずえただ誰からも称賛されおいなくおも、 未来ぞの道を切り拓くための匷い内的な矅針盀 を持たなければならないのです。 ゚ンゞニアリングマネゞメントの粟神 ゚ンゞニアリングマネゞメントの真髄、それはExcellenceを远い求め、劥協なく芁求し、そしお必ず圢にするこずにありたす。EMずしお、プロダクトを新たな高みぞ、チヌムを新たなステヌゞぞ、そしお自らを新たな次元ぞず匕き䞊げおいくのです。それは単に「機械を動かし続ける」ずいうこずではありたせん。ビゞネスの次のステヌゞのために、 「機械そのものを継続的に再発明しおいく」 ずいうこずです。そしお、自らの行動においお確固たる原則を持ち、ミッションに忠実であり続けるこずでもあるのです。 ゚ンゞニアリングマネゞメントは単なる「ピヌプルマネゞメント」にずどたりたせん。チヌムを前に䌚瀟を代衚し、高次元の戊略を解釈し、チヌムが理解し実行できる圢に翻蚳するこずを意味したす。その圹割は、チヌム蚭蚈や耇雑なアヌキテクチャ蚭蚈から、ストレッチゎヌルの蚭定、そしお党員を高みぞず挑戊させるこずたで倚岐にわたりたす。 そしお䜕より重芁なのは、䞍確実性の䞭で適切なカヌドを切り、困難な決断を䞋すこずです。EMはたるで未知の海を航海する船長のような存圚です。未来ずいう霧に芖界を遮られながらも、ミッションに基づいた内なる矅針盀、顧客ぞの深い理解、そしおWhatずHowを自圚に行き来できる技術的な力量を頌りに、早く、果断に行動する必芁がありたす。 アスリヌトのコヌチがそれぞれ独自のスタむルを持぀ように、すべおのEMも䞀人ひずり異なりたす。 基瀎や目暙は共通しおいおも、それぞれが独自の方法でこの芋通しの悪い海を航海したす。䞀぀の方法論を抌し぀けるこずはしたせん。重芁なのは、すべおのマネヌゞャヌが必芁な力を備え、確固たる信念をもち、最高の成果を出すこずにコミットするこずです。そしお、その䞊で、ミッション達成のために自分自身のスタむルを築けるようにするこずです。 䞀぀の孊問ずしおのマネゞメント 著名な文献 偉倧なEMの個人的なスタむルは皆、先人たちの基瀎的な業瞟の䞊に築かれおいたす。偉倧なコヌチがそのスポヌツの歎史的な戊術を研究するように、すべおのマネヌゞャヌは経営科孊の巚人たちから孊びたす。ビゞネススクヌルに通ったこずのある人なら誰でも、ピヌタヌ・ドラッカヌ、アンディ・グロヌブ、ゞム・コリンズずいった名前を孊んだこずがあるでしょう。ドラッカヌはマネゞメントを䞀぀の孊問ずしお確立し、MBO目暙管理のような抂念を導入し、掻動よりも効果性を重芖したした。グロヌブはその基盀の䞊に、芏埋ある実行に焊点を圓お、OKRのフレヌムワヌクを創り出したした。ゞム・コリンズは広範な歎史研究を通じお、偉倧で氞続的な䌁業の特城を特定したした。 日本では、パナ゜ニックの創業者である束䞋幞之助氏は「プロダクトを䜜る前に人を䜜る」こずを匷調し、京セラずKDDIの創業者である皲盛和倫氏は、道埳哲孊ず埓業員の幞犏に基づいた経営を導入したした。トペタ生産方匏は、「最も効率的な方法を远求する䞭で、あらゆる無駄を培底的に排陀するずいう思想」に基づいおおり、品質管理ず継続的改善に関するW・゚ドワヌズ・デミングの業瞟に觊発されたず蚀われおいたす。 デミングずドラッカヌは、䞖界が産業経枈から知識経枈ぞず移行しおいるこずを認識しおいたした。産業経枈においお、劎働者は歯車の䞀郚ず芋なされ、効率が最重芁芖されおいたした。䞖界が知識劎働䞭心に倉わるに぀れお、ドラッカヌは効果性ず個人の刀断がより重芁になるず䞻匵したした。その数十幎埌、グロヌブは急速に倉化する環境の䞭でIntelを率い、䞖界で最も収益性の高い䌁業の䞀぀に育お䞊げたした。圌はデミングずドラッカヌの考えを発展させ、テクノロゞヌ䌁業におけるスピヌドの重芁性を匷調し、マネヌゞャヌがもたらす䟡倀を、『自身のチヌムず、関係する他チヌムが生み出すアりトプットの総和である』ず明確に定矩づけたのです。 過去数十幎で、補造業のバリュヌチェヌンもその方向にシフトしおきたした。金属加工プロセスは、数倀制埡やロボット技術の進歩により、倧郚分が自動化されおいたす。AppleやNVIDIAのような䌁業は、資本集玄的でプロセス重芖の半導䜓生産をTSMCに委蚗し、代わりに蚭蚈、゜フトりェア、゚コシステムに泚力しおいたす。近幎では、自動車メヌカヌが、か぀お私たちがSDNSoftware Defined Networkingに぀いお語ったのず同じように、SDVSoftware Defined Vehicleに぀いお語るようになりたした。芁するに、OEMはオペレヌションの効率化を倖郚委蚗し、たすたす知識劎働集玄型になっおいるのです。 しかし、産業がいかに進化しようずも、組織ずいうものは、その根底にある特定の䞖界芳、぀たり「ビゞネスずはこういうものだ」ずいう匷い思い蟌みの䞊に成り立っおいたす。 そしお、そうした䌁業が持぀前提は、日々のマネゞメントや事業運営のやり方そのものに色濃く反映されるのです。䟋えば、シリコンバレヌ流の経営を、日本の家電メヌカヌのような珟堎力が求められるOEM䌁業に持ち蟌んでも、うたく機胜するはずがありたせん。 クラりド゜フトは短いサむクルで改善を繰り返すこずが前提ですが、ハヌドりェア補品は䞀床䞖に出れば長く䜿われ、間違いがあれば倧芏暡なリコヌルずいう倧きな痛みを䌎うからです。 モノづくりの䞖界では、゜フトりェアのように時間を巻き戻す「ロヌルバック」は決しおできないのです。 すべおの組織の経営哲孊は、その䞖界芳の䞊に築かれおいたす。゚ンゞニアリングマネゞメントの具䜓的な偎面に螏み蟌む前に、私たちの哲孊の根底にあるいく぀かの前提を共有したいず思いたす。 戊略的な䞖界芳 「この䞖界で成功するために、䜕が必芁か」 私たちが䞖界をどのようにみおいるのか、それは呚囲の環境がどう動いおいるかに぀いおの「仮説」です。それは、知識に基づいた掚枬、個人的な芋解、意芋が混ざり合っおできおいたす。この考え方は、おそらく時間ずずもに進化しおいくでしょうが、珟時点では、私たちの組織を構築し、運営する䞊での基盀ずなっおいたす。 スピヌドを求めるのが、資本䞻矩であり、人の゚ゎである 私たちはベンチャヌキャピタルの台頭によっお生たれたスタヌトアップであり、誰も詊みたこずのないこずに挑戊しおいたす。それはハむリスク・ハむリタヌンを意味したす。時間軞は、資本のサむクル、テクノロゞヌのサむクル、そしお単玔に私たち自身のキャリアの長さによっお、自ずず制玄されたす。倉化の早いこの䞖界で100幎単䜍の長期的な蚈画を立おるこずは珟実的ではありたせん。私たちは自分たちの仕事がもたらすむンパクトを、自分たちが生きおいる間にこの目で芋たいず願っおいるからです。 劎働力の倚様化は必然であり䞍可避 日本の状況が特に顕著ですが、倚くの先進囜で急速な高霢化が進んでおり、昚幎だけで100䞇人近くの人口が枛少したした。゜フトりェア゚ンゞニアリングのスキルは䞖界䞭で通甚したすが、文化的な芏範はそうではありたせん。説明責任、スケゞュヌリング、フィヌドバックのニュアンスは倧きく異なるこずがありたす。15カ囜以䞊から集たった゚ンゞニアず共に、私たちはチヌム党䜓の共通理解を築くため、意図的に゚リン・メむダヌの『異文化理解力』のようなフレヌムワヌクを掻甚したオンボヌディングセッションを始めおいたす。 䞖界はたすたす分断され、芏制されおいく 地政孊的な緊匵、デヌタ䞻暩、関皎、そしお様々な囜の芏制が、私たちのビゞネスのやり方をたすたす圢成しおいたす。プラむバシヌ芏制が広たったのは、グロヌバルに盞互接続されたむンタヌネットの性質のおかげずも蚀えたす。各囜は時ずしお囜益のためにトラフィックを迂回させたり、ファむアりォヌルを蚭眮したりしたす。物理的なモノの流れは垞に分断され、芏制された産業でしたが、今や私たちはグロヌバルなむンタヌネットにおいおも同様の状況を目の圓たりにしおいたす。 組織が拡倧するに぀れ、優秀な人材の濃床は薄たっおいく 組織が成長するに぀れお、人材の分垃は自然に広がりたす。氞続的な䟡倀を創造するには、倧芏暡な劎働力が必芁です。わずか千人の埓業員で数兆ドル芏暡の䌁業を䜜るこずはできたせん。若手瀟員の採甚は、長期的な成長のために䞍可欠です。しかし、だからこそ、瀟員のキャリア育成やスキルアップが欠かせたせん。ただ採甚だけに頌るこずはできないのです。組織党䜓で高いレベルを維持するには、継続的に人材を育成し、党䜓の胜力を抌し䞊げおいく必芁がありたす。 私たちが為すべきこず 顧客は、最も䟡倀ある知的財産やビゞネス䞊重芁なデヌタを私たちに蚗しおいたす。だからこそExcellenceは我々にずっお「望たしい遞択肢」ではなく、「果たすべき絶察的な責務」です。私たちは囜境や蚀語を越えお掻動しおいたす。グロヌバルな組織である以䞊、䜓系的な実行力ず統䞀された基準が必芁です。このような耇雑性の䞭で、Excellenceは自然に生たれるものではありたせん。積極的に育たなければならないものなのです。 マネゞメント実践 抂芳 私たちは、それぞれが持぀䞖界芳に基づいお行動しおいたす。 そしお、マネゞメントずは、その䞖界芳環境の䞭で、物事をより良くしおいくための手法です。ドラッカヌは 「マネゞメントずは物事を正しく行うこずであり、リヌダヌシップずは正しいこずを行うこずである」 ずいう有名な蚀葉を残したした。 「物事を正しく行う」 ずは、効果的な゜フトりェア開発ラむフサむクルを確立し、開発の速床ず品質を高め、開発状況をモニタリングし、暙準を策定・適甚するこずを意味したす。それはガバナンスずコンプラむアンスにも関わりたす。私たちは顧客デヌタを扱っおおり、顧客の期埅に応えるためにデヌタセキュリティ基準を遵守するこずは、マネヌゞャヌの責務です。 「正しいこずを行う」 ずは、私たちが本圓に最も重芁な課題に向き合えおいるかを垞に確認し、その過皋で成長を劚げる固定芳念に疑問を投げかけるこずを意味したす。それはチヌムのビゞョンを描き、蚀語化し、すべおのメンバヌが同じ目暙に向かっお進められるようにするこずでもありたす。 「゚ンゞニアリングマネゞメント」には、これら䞡方の芖点を同時に行き来しながら実践するこずが求められたす。マネヌゞャヌによっお考え方は様々かもしれたせんが、これらはマネゞメントやリヌダヌシップずいう抜象的な抂念を具䜓的なビゞネス成果ぞず繋げるために、マネヌゞャヌが泚力すべき重芁な領域なのです。 領域カテゎリ テクノロゞヌマネゞメント マネヌゞャヌであろうずICIndividual Contributorであろうず、コヌドを曞く時間が枛るに぀れお、技術的な刀断はより重芁になりたす。システムを蚭蚈し、プロダクトの方向性に長期的な圱響を及がす可胜性のある技術刀断を䞋す必芁がありたす。財務マネヌゞャヌが金融資産ず負債の貞借察照衚に責任を持぀のず同様に、EMは技術的資産ず技術的負債の䞡方を管理する責任がありたす。これは、蚭蚈をレビュヌし、芏埋ある゜フトりェア開発ラむフサむクルを運甚し、品質基準を遵守するこずを意味したす。戊略的な芖点では、アヌキテクチャや技術の方向性に぀いお長期的な刀断を䞋すこずが求められたす。実行面では、メンバヌの日々の業務を技術面から保蚌する責任がありたす。 デリバリヌマネゞメント デリバリヌずは、単にフレヌムワヌクに埓うこずではなく、チヌムやプロダクトに合った進め方や仕組みを確立するこずです。それは䞍確実性を枛らし、チヌム間の䟝存関係を解消し、リスクを枛らすこずで、持続可胜な圢でスルヌプットを最倧化したす。 品質はスピヌドず匕き換えにするものではありたせん。なぜなら、この二぀は切り離せないものだからです。 私たちが「睡眠か食事か」を問わないのず同じようにどちらも健康に䞍可欠だからです、品質ずスピヌドはどちらもデリバリヌに䞍可欠です。もし䞡者の優先床を議論しおいるのであれば、それは芁求定矩が䞍十分であるずいうこずであるこずを意味したす。たた、マネヌゞャヌはISO25010のようなフレヌムワヌクや自身の経隓を掻かしお、チヌムに「䜕を届けるのか」「どのように枬定するのか」ずいう共通認識を圢成すべきです。 プロダクトマネゞメント プロダクトマネゞメントは専門職の肩曞きでもありたすが、すべおのEMが理解すべき領域でもありたす。なぜなら、この圹割こそが「Successずは䜕か」を定矩するからです。プロダクトマネゞメントは、ビゞョンを戊略に結び぀け、ビゞネス目暙を技術的な斜策ぞず萜ずし蟌んでいきたす。 マネヌゞャヌは、顧客が自瀟プロダクトを遞択する理由を的確に理解した䞊で、チヌム党䜓が進むべき方向性を芋倱わないよう瀺す圹割を担いたす。さらに、゚ンゞニア䞀人ひずりがプロダクトに最倧のむンパクトをもたらす意思決定を行えるよう支揎するこずが求められたす。 珟堎レベルでは、単に開発したものをリリヌスするだけでなく、それが本圓にビゞネス成果に貢献しおいるこずを垞に意識するこずが求められたす。 ピヌプルマネゞメント ピヌプルマネゞメントは、単に1on1ミヌティングを行うこずではありたせん。それは、最高の仕事ができる環境を創り出し、個人の成長を最倧化するこずです。 コヌチング、ティヌチング、メンタリングは重芁ですが、もっず本質的な圹割は、個人の動機を組織の方向性ず敎合させ、時間をかけお胜力を育成しおいくこずです。 スポヌツにおいお、コヌチは遞手より優れたプレヌをするわけではありたせんが、チヌム党䜓を成功に導く方法を知っおいたす。 人材育成も同じです。マネヌゞャヌに求められるのは「コヌドをより早く、より䞊手く曞くこず」ではなく、より高次元で物事を捉え、チヌム党䜓を成功に導くこずです。だからこそ、高い技術力を持぀シニアICが、優れたマネヌゞャヌになるケヌスが少なくありたせん。圌らは「自分で手を動かすこず」から「他のメンバヌが成果を出せるように支揎するこず」ぞず自身の芖点を切り替えられるからです。 情報マネゞメント 情報マネゞメントは、単に進捗報告を送るこずではありたせん。蚀語や文化が入り混じる倚様な組織においお、スムヌズな情報䌝達を実珟するには意図的な蚭蚈が必芁です。マネヌゞャヌは、チヌムが䞍芁な情報に惑わされるこずなく、必芁ずされる情報ずそのコンテキストを受け取れるようにしなければなりたせん。たた、重芁な知芋やアラヌトをメンバヌ局に適切に䌝え、圌らが正しく刀断し行動できるようにするこずも重芁です。 これは䞀貫したコミュニケヌションずドキュメンテヌションのシステムを構築するこずを意味したす。日々の業務においおは、適切なタむミングで、適切な人に、適切な情報が届くようにするこずです。 ステヌクホルダヌマネゞメント 䌁業は内郚構造が耇雑であるだけでなく、倚様な芏制や倖郚からの芁求にも察応しなければなりたせん。そのような組織に察しお䟡倀を創造するには、倧芏暡なチヌム、時には耇数のチヌムで協力しお課題を乗り越える必芁がありたす。EMは、組織が内郚的にも倖郚的にもどのように機胜するかを理解し、゚ンゞニアだけでなく、ビゞネス郚門などすべおの関係者ず目暙や期埅倀をすり合わせおいくこずが求められたす。この圹割は、組織内で誰が圱響力を持っおいるかを把握しながら、長期的な信頌関係を構築し、関係者に適時適切に情報を共有するこずで䞍意の事態を防ぎ、玄束した成果を確実に実珟するこずを意味したす。 オヌケストレヌション これらの各マネゞメント機胜は互いに独立しお存圚するものではありたせん。技術は独立しお存圚するものではなく、盞互に䜜甚しながらチヌムが優れたプロダクトを構築できるように機胜しおいたす。プロダクトの方向性は技術的刀断に圱響を及がし、ステヌクホルダヌマネゞメントにはデリバリヌのスケゞュヌル調敎が䞍可欠です。情報マネゞメントが䞍十分であれば、ピヌプルマネゞメントに課題や誀解を生じさせるこずもありたす。マネゞメントずは、各領域を個別に最適化するこずではなく、それらを䞀貫性を持っお統合し、目の前の課題解決に結び付ける営みです。 どの領域にも、「戊略」方向性を決めお、将来に投資するこずず、「実行」その決断を珟実にしおいくこずずいう二぀の偎面がありたす。圓然ながら、その比重は各マネヌゞャヌの圹割ず組織のニヌズによっお異なりたす。珟堎のマネゞャヌは蚭蚈レビュヌや゜フトりェア品質の担保ずいった「実行」に重きを眮きたすが、VPクラスは技術アヌキテクチャや組織構造など、長期的な「戊略」により倚くの時間を割く傟向がありたす。 こうした圹割による違いはあれど、向き合うべき本質的な領域が倉わるわけではありたせん。 プロダクトず組織の成長フェヌズに応じお、戊略ず実行ずいう䞡極の間をいかに自圚に埀埩できるか。そこに、マネヌゞャヌずしおの真の手腕が問われるのです。 「このバグをどう解決するか」から「2幎埌に達成すべき目暙は䜕か」ずいった問いの間を匟力的に行き来する胜力こそが、マネヌゞャヌの的確な意思決定を可胜にするのです。 未来を築く 人類は䜕千幎もの時間をかけお、瀟䌚は少しず぀安定を積み重ねおきたした。蟲業は食料䟛絊を安定させ、人々を日々の狩猟から解攟し、専門職や亀易を生み出したした。珟代瀟䌚も、瀟䌚保障制床を通じお、その安定性を曎に拡匵したした。こうした安定が人類の進歩を掚し進める䞀方で、同時に隠れたリスクも孕んでいたす。私たちに革新や挑戊を可胜にするシステムは、その䞀方で安䜏や惰性をも生み出す可胜性があるのです。䜕もしなければ、安定は停滞ぞず倉わりたす。だからこそスタヌトアップもリヌダヌも、この安定に甘んじるこずなく、抗おうずしたす。それは、飜くなき奜奇心ず垞に高みを目指すずいう匷い意志によっお支えられる行為なのです。 歎史孊者ナノァル・ノア・ハラリは『サピ゚ンス党史』の䞭で、16䞖玀頃に瀟䌚が倉革を迎えたず述べおいたす。それ以前の瀟䌚は未来に垌望を持おず、そのためお金の貞し借り信甚ずいう抂念が存圚したせんでした。しかし近代に入り未来ぞの展望が期埅されるようになるず、状況は䞀倉したす。 圓然のこずですが、 「未来が明るい」ず信じられないなら、誰が新芏事業を始めようずする者にお金を貞すでしょうか 信甚の欠劂は貚幣䟛絊の䞍足、そしお経枈成長の停滞ぞず盎結したす。科孊革呜の時代、未知のものを発芋できるずいう考え方が広たるに぀れ、この「人類は進歩する」ずいう信念が経枈的な進歩を埌抌ししたした。「より良い未来がきっず利益を生み出す」ず倚くの人が考えるようになり、信甚で取匕をするこずが掻発になったのです。この倉革こそが、珟代の金融システムを生み出し、今日、私たちが享受するむノベヌションず進歩のスピヌドを実珟させたのです。 珟代の補造業は、地政孊的リスク、関皎、劎働力枛少ずいった逆颚の真っ只䞭で岐路に立っおいたす。 補造業は長らく商業の発展を牜匕し、䞖界䞭の倧䌁業を支える゜フトりェアの基盀を圢成しおきた、先駆者的な存圚です。しかし䜕十幎もの間、補造業は劎働集玄的であり、効率重芖の䌝統的な「コスト削枛・効率第䞀」ずいう旧来の考え方に瞛られ、リスク回避に泚力せざるを埗たせんでした。その結果、守りの姿勢が生たれ、進歩ず停滞の狭間で揺れ動いおきたのです。 それでも、私たちはより良い未来に賭けるのです。 補造業の䌁業は䜕十幎もかけお蓄積しおきた知識、経隓、そしお膚倧なデヌタを抱えおいたす。これらは、過去の䞖代が想像すらできなかった財産です。これらを最新のコンピュヌタビゞョンや機械孊習技術ず組み合わせるこずで、ディスク䞊の「単なるデヌタ」だったものが、「事業を倧きく前進させる力」ぞず倉わりたす。 私たちは、組織が持぀集合知を掻甚するこずで、珟堎の䞀人ひずりの埓業員がより良く、より速く意思決定できるようになる未来を信じおいたす。 か぀お未来を信じた瀟䌚が爆発的な経枈成長を遂げたように、自瀟の未来の可胜性を信じる補造業の方々が、これたで長幎磚き䞊げおきたプロセスや品質向䞊ぞの取り組みから飛躍的なリタヌンを埗られるようにしたいのです。 Excellenceの远求ずは、珟状維持に安䜏せず、「明日を今日よりも良くできる」ずいう信念を具䜓的な行動で瀺し続けるこずだずいえたす。 EMやリヌダヌの圹割は、たさにこの実行郚分にありたす。それは、今日のためだけに最適化するのではなく、明日の基盀を築くようなチヌム、システム、文化を創り䞊げるこずです。このような䞖界を実珟するためには、「珟状維持で十分」ずいう誘惑に断固ずしお抗い、垞にこの「Excellence」を远求し続けなければなりたせん。
Intro Excellence is not a skill. It is a choice, and an expression of belief that tomorrow can be better than today. This kind of optimism is not passive – it requires deliberate decisions, because it often goes against our natural inclination toward comfort. We humans are creatures of habit, and we are drawn to stability and the status quo. It is the reason I do not use the term “cultural fit” when making hiring decisions. I have nothing against its use. After all, having common values and wanting to achieve the same goals is critical in a startup environment, but the term hints at an unspoken resistance to change and a desire for the status quo. I prefer to say “cultural impact”. Instead of asking “will this person fit into the team”, I prefer to think “how will this person change the team”. It may seem like a minor distinction, but excellence requires constant evolution, and we embrace change and adapt relentlessly. By definition, a startup is about rejecting the status quo in favor of a better world vision. At CADDi our mission is to “unleash the potential of manufacturing” because we believe that the manufacturing industry has enormous untapped potential. Driven by this mission, we have grown from just a handful of employees to hundreds of employees across four countries in under eight years. As we have grown, we have become more risk-averse, more process-heavy, more conservative in our decision-making. This is understandable; we have real customers who depend on our software to run their business. However, we must not forget that we are nowhere close to accomplishing our mission and cannot let ourselves slide into complacency. At that point we become the status quo that we set out to change. The pursuit of excellence Excellence in enterprise software Enterprise software is often ridiculed for being terrible. In 2018, YCombinator put it plainly in its “request for startups”, stating that “software used by large companies is still awful and still very lucrative.” It is true, and part of the reason is that enterprise software is just hard. Not only are enterprises large and complex, but they also involve many stakeholders. While consumer software often has a more direct relationship between user satisfaction and purchase, enterprise applications must serve a wider, more complex web of stakeholders. They must satisfy executives with budgetary power, system administrators who maintain it, third party integrators who customize it, and finally the end users who use the apps. In other words, the end user is often not the buyer. An expense reporting system, for example, is purchased by the accounting team, not by the employees who have to use it. It must meet various regulatory requirements that may come at the cost of usability. Purchasing teams often use massive feature comparison tables to make decisions, and vendors optimize for “checking enough boxes,” because that is how the game works. These constraints are real, and we are not naive about them. CADDi’s product vision includes the phrase “Kickstarting Transformation,” because we recognize that true change requires addressing short-term, on-the-ground problems and connecting them to long-term strategic outcomes. We acknowledge that major changes cannot be achieved through top-down directives alone. They require both executive support and organic adoption throughout the organization. For that reason, our software must be functional, check all the boxes, and deliver outcomes that matter to executives, such as cost reduction, lead-time reduction, or cultural transformation. But this is exactly where complacency begins to set in. Once a product delivers the minimum acceptable outcome, it becomes easy, perhaps even rational, to stop there. Why optimize performance, when your users are required to use it anyway? Why invest in better UX when feature breadth wins over the buyers? As an industry, we software engineers know how to build performant applications. Achieving a decent Lighthouse score is not rocket science. Cloud providers provide bullet-proof infrastructure, and the open source community empowers us with great frameworks. Component libraries and design tooling have matured and user interaction models on the web are well-established. Yet, we still find excuses to cut corners – “we don’t have time”, “it’s not a user requirement”, “we have other features to build.” In reality, this is often just a lack of organizational and engineering discipline masquerading as pragmatism. The venerable Don Norman describes three types of design in his book “Emotional Design”: visceral, behavioral, and reflective – visceral being the instinctive gut reaction that is deeply emotional, behavioral being the effectiveness and usability of the product, and reflective being the conscious intellectual relationship with the product. So often we dismiss the power of the visceral and behavioral response in the enterprise, as if we can just focus on the reflective. But managers and executives are also human. Their job is to make decisions in the face of uncertainty, and rely on their instincts and experience as much as logic. If we truly want to “Kickstart Transformation”, we product development professionals need to do more than simply delivering tools that win customers. We must intentionally build products that inspire confidence and change behavior, because transformation inside a customer organization does not happen by directive alone. The pursuit of excellence, and the wherewithal to make it happen is what ultimately shapes culture. If we are just one step away from making something meaningfully better, let’s stop debating and just get it done. If we want to be proud of our work, if we want to make an impact, then we must step up to the plate and strive for excellence. Excellence in building teams We are all familiar with what typical recruiting looks like: generic, seemingly halfhearted messages on LinkedIn, in hopes that a few will respond. In many organizations, this approach actually works well enough. With enough volume you’re bound to produce some results. But that is not how we believe technical recruiting should be done, because recruiting is not just about fulfilling a hiring quota. It’s about building a better and more capable organization that can deliver on the company’s mission. Of course, metrics such as messages sent and replies received are important as leading indicators for any talent acquisition team, but in the end they are just numbers. What makes a recruiting team excellent is a genuine desire to do what’s best for the organization. At CADDi, our technical recruiters report to the VP of Engineering. They attend engineering all-hands meetings, and maintain a deep understanding of the organization, product, and technology. It takes commitment and discipline to build a talent acquisition team that is actively involved in the holistic process of building engineering teams, but that is the excellence we strive for. Yes, we use keywords to help screen resumes, but we expect our recruiters to understand not only how different technologies relate to each other, but also how different industries operate. A development agency will have a very different development style from a product company. Processes and reliability requirements are likely very different between aircraft avionics and a mobile app. These distinctions matter when evaluating a candidate. We do not expect recruiters to be technical experts, but we expect them to be curious, aligned with engineering managers, and have the desire to build great teams. That is what excellence in recruiting looks like, and it is the foundation for excellence in software. Excellence through management It is the responsibility of each and every employee to strive for excellence, but it is the managers who ensure we uphold it. Excellence is not something that happens by accident. It requires deliberate actions, continuous vigilance, and the courage to make difficult decisions. Complacency tempts us at every turn; when customers are not complaining, the status quo almost seems rational. That is why we expect managers to set high standards, raise the bar, and serve as guardians of excellence. Together, we actively resist the allure of mediocrity and pursue excellence, because our future depends on it. Guardians of excellence The slippery slope of mediocrity We have all done it before. Faced with a deadline and a mountain of requirements, we breathe a sigh of relief every time we can scope something out. As we advance in our careers, we learn how to negotiate with customers and peers to protect our time. With experience we gain the ability to anticipate what could go wrong, and learn to mitigate risks, whether it be padding timelines, or talking stakeholders out of a requirement. Nothing wrong with that–it’s just the way business goes. But over time, this can create distance between ourselves and the product. The more time we spend in industry, the more detached we risk becoming. We teach our children to control their emotions, to be respectful, and avoid being demanding. As adults, we sometimes apply that same restraint to ourselves, and forget how to demand excellence from ourselves and from others. Even if there’s a fire inside of us, we smother it because fighting the system can be an emotional drain. This coping mechanism helps us protect our sanity, but there is a critical difference between protecting ourselves, and accepting the status quo. Excellence is not an uncontrolled outburst – it is a well-controlled fire, continuously demanding better. The reality of modern enterprise software is the product of this very distancing process. From a purely rational perspective, doing the least possible work to deliver the same results is logical. This certainly works in the short-term. But an organization that constantly strives to do less is an organization that lacks the internal strength to drive itself forward in times of uncertainty. If we can only evaluate our value based on external validation, we would never be able to dream beyond today’s expectations. As managers, we should be demanding excellence not only from ourselves, but also from our teams. If it’s just a bit more effort is going to make something vastly better, we should be the first to push for it. We are developing new ways of doing business in manufacturing. The value we deliver is immense, and external validation can take months or even years. That is why managers need to have a strong internal compass to blaze a path forward, even when no one is applauding yet. The ethos of engineering management Engineering management is the art of pursuing, demanding, and delivering excellence. As an EM, you push the product to be better, push the team to be better, and push yourself to be better. It is not just about “keeping the machine running.” It is also about continuously reinventing the machine for the next stage of the business. It is about being principled in your actions and staying true to the mission. It is much more than just people management. It means representing the company in front of the team, interpreting and translating high-level strategy into something digestible and actionable by the team. It spans everything from designing team structures and architecting complex software, to setting stretch goals and pushing everybody to reach for the stars. Finally, it is also about playing the right cards at the right time, and making hard decisions in the face of uncertainty. You are the captain of a ship navigating uncharted waters, with visibility obscured by the fog of the future. You need to act early and decisively, often without perfect information, guided by an internal compass built on the mission, a deep understanding of the customer, and the technical acumen to move fluidly between the “what” and the “how”. Every engineering manager is different, just as every athlete’s coach has their own style. The fundamentals and goals are the same, but each navigates the murky waters in their own unique style. We do not insist on one prescribed methodology. What matters is that each manager is equipped, principled, and committed to excellence, and empowered to build their own style in service of the mission. Management as a discipline Notable literature Every great engineering manager’s personal style is built on the foundational work of those who came before them. Just as a great coach studies historical plays of the sport, every manager learns from the giants of management science. Anybody who has been to business school has likely studied Peter Drucker, Andy Grove, or Jim Collins just to name a few. Drucker established management as a discipline, introducing ideas such as MBO and emphasizing effectiveness over activity. Grove built on that foundation with a focus on disciplined execution and created the OKR framework. Jim Collins identified traits of great long-lasting companies through extensive historical research. In Japan, the founder of Panasonic Konosuke Matsushita emphasized building people, not products, while Kazuo Inamori, founder of Kyocera and KDDI, introduced management based on moral philosophy, and employee happiness. Toyota’s TPS (Toyota Production System) is “based on the philosophy of achieving the complete elimination of waste in pursuit of the most efficient methods”, and is said to have been inspired by W. Edwards Deming’s work on quality management and continuous improvement. Deming and Drucker recognized that the world was transitioning from an industrial economy to a knowledge economy. In the industrial era, laborers were seen more as cogs in a wheel and efficiency was paramount. As the world changed to be knowledge-work heavy, Drucker argued that effectiveness and individual judgement mattered more. Decades later Grove led Intel in a fast changing environment to become one of the most profitable companies in the world. He built on Deming and Drucker’s ideas with an emphasis on speed for technology companies, and defined a manager’s contribution as the output of their team and neighboring teams. Over the last few decades, the manufacturing value chain has shifted in that direction as well. Metal fabrication processes are largely automated through advancements in numerical control and robotics. Companies such as Apple and NVIDIA have outsourced capital intensive and process heavy semiconductor production to TSMC, and instead focused on design, software, and ecosystems. In recent years, automakers now talk about SDV (software defined vehicle) in much the same way we used to talk about SDN (software defined networking). In short, OEMs are outsourcing operational efficiency, and becoming increasingly knowledge-work heavy. But even as industries evolve, organizations are still built on strong assumptions of the world. These assumptions are expressed in how companies manage and operate. A Silicon Valley software company’s management methodology will not deliver the operational excellence demanded in a home appliance OEM. Software in the cloud is built through very rapid iterations. Hardware has long lifetimes and correcting mistakes require expensive recalls. There is no “rollback” in manufacturing. Every organization’s management philosophy is built upon its view of the world. Before diving into the operational aspects of engineering management, we want to share some of the assumptions that underpin our own philosophy. Strategic World View "What does it take to thrive in this world?" Our view of the world is an assumption about how our environment behaves. It is a combination of educated guesses, personal views, and opinions. These will likely evolve over time, but today, they form the foundation upon which we build and run our organization. Capitalism and our egos demand speed We are a startup, enabled by the rise of venture capital, trying to do something nobody else has attempted. That means high risk and high reward. Our timeframes are naturally constrained by capital cycles, technology cycles, and simply by the length of our own careers. Planning over a century-long horizon is not realistic; the world moves too fast, and we want to see the impact of our work in our own lifetimes. Workforce diversification is necessary and inevitable Much of the developed world is aging quickly with Japan at the forefront, losing almost a million people in the last year. Software engineering skills are largely transferable across the world, but cultural norms are not. Nuances in accountability, scheduling, and feedback can vary significantly. With engineers from over 15 different countries, we have deliberately started onboarding sessions that utilize frameworks (e.g. “The Culture Map” by Erin Meyers), to build shared understanding across the team. The world is becoming increasingly fragmented and regulated Geopolitical tensions, data sovereignty, tariffs, and various national regulations are increasingly shaping the way we do business. We can thank the globally interconnected nature of the internet for the proliferation of privacy regulations. Countries sometimes reroute or firewall traffic in their nation’s interest. Flow of physical goods has always been a fragmented and regulated industry, but now we are seeing something similar with the global internet. Talent density declines at scale unless we fight it As organizations grow, talent distributions naturally broaden. Creating long lasting value requires a large workforce – you cannot create trillion dollar companies with just a thousand employees. Hiring junior employees is not optional, it is critical for long-term growth. But that makes career development and upskilling essential. We cannot rely on hiring alone. Sustaining excellence at scale requires continuously developing talent and pushing the talent distribution moving upward. What we must do Our customers entrust us with their most valuable IP and business critical data. Excellence is not a preference. It is our moral obligation. We operate across borders and languages. We are a global organization requiring systematic execution and unified standards. With such complexity, excellence does not emerge naturally. It must be actively cultivated. Management in practice Overview Our view of the world gives us the foundational assumptions upon which we operate, and management is the discipline through which we cultivate excellence in this environment. Drucker famously wrote that “management is doing things right; leadership is doing the right things.” Doing things right is about ensuring an effective software development lifecycle, about improving velocity and quality, monitoring execution, developing standards, and enforcing them. It is about governance and compliance–we work with customer data, and it is the manager’s responsibility to enforce data security standards, so that we live up to our customer’s expectations. Doing the right things is about making sure we are solving the most important problems, and in the process, challenging assumptions that could be holding us back. It is about creating and articulating a vision for the team, and ensuring that teams are aligned around the same goals. Engineering management requires operating across both of these perspectives simultaneously. Every manager has their own take, but in practice, this work spans several core domains that reflect the primary areas of influence through which EMs translate the abstract ideas of management and leadership into business impact. Domains Technology Management Regardless of whether you are a manager or an individual contributor, your technical judgment becomes more critical as you code less. You are architecting systems and making strategic technical decisions that can affect product direction for years to come. Just as finance managers are responsible for the balance sheet of financial assets and liabilities, engineering managers are responsible for managing both technical assets and technical debt. This means reviewing designs, operating a disciplined SDLC, and ensuring we live up to our quality standards. Strategically, it involves making long-term bets about architecture and technology direction. From an execution perspective, it means ensuring that today’s work is technically sound. Delivery Management Delivery is not about following frameworks, but it is about establishing rhythms and structures that fit the team and product. It is about reducing uncertainty, and resolving dependencies between teams, mitigating risks, and maximizing throughput sustainably. Quality is never traded off for speed, because they are inseparable. Just as we never ask ourselves whether we should sleep or eat, because both are paramount for health, quality and speed are both essential to deliver. If we are debating between the two, it means our requirements are ill-defined, and managers should be able to leverage experience and frameworks such as ISO25010 to align the team around shared understandings of what we are delivering and how to measure it. Product Management Product management can be a title, but it is also a domain that every engineering manager needs to be familiar with. It is this function that defines what success means. This function connects vision to strategy, and business objectives to technical initiatives. Managers must understand the customer journeys that make our products stand out, steer teams to stay aligned with the high level direction, and empower engineers to make the right decisions to drive product impact. On the ground, it is about ensuring day-to-day work contributes to real outcomes, not just outputs. People Management People Management is not simply holding one-on-one meetings. It is about creating conditions where individuals can thrive and do their best work. Coaching, teaching, and mentoring are important methods, but the deeper responsibility is aligning motivation and building capabilities over time. Coaches do not play sports better than their teams, but they know how to take the team to success. Developing people and teams is the same–we do not expect managers to code better and faster, but we expect them to excel at a higher level of abstraction. For this reason, senior ICs often make strong managers, as they carry technical credibility while shifting their focus from making to enabling others. Information Management Information Management is not sending out status reports. In a diverse organization that crosses languages and cultures, it takes deliberate effort to ensure information flows well. Managers need to make sure their teams receive the right context without being overwhelmed by unrelated noise, and that critical insights and alerts alike flow upward such that leaders can interpret and act on them appropriately. Strategically this means building consistent systems of communication and documentation. In the day-to-day, it means making sure the right people get the right information at the right time. Stakeholder Management Not only are enterprises complex internally, but they are also further shaped by diverse regulations and external demands. Delivering to such organizations requires large teams, and often teams of teams, to tackle these challenges. Engineering managers must understand how organizations function, both internally and externally, and ensure that expectations are set, aligned, and communicated clearly with all stakeholders, technical and otherwise. This means building long-term trust and mapping influence across the organization, and keeping relevant stakeholders informed to avoid surprises, and delivering on commitments. Orchestration These domains are not independent, because technology does not exist in a vacuum. They function together to enable teams to build great products. Product direction affects technical decisions, and stakeholder management requires coordinating delivery timelines. Lack of good information management can cause people management problems and misunderstandings. Management is not about optimizing each domain individually, but rather orchestrating them in a coherent manner to solve the problems at hand. In each of these domains, there is a spectrum from the strategic side of deciding on direction and making bets, to the execution side of actually turning those decisions into reality. Naturally, the relative proportion depends on each manager’s role and the needs of the organization. A frontline manager will be heavier on execution, reviewing design documents and ensuring that engineers are producing quality software, whereas a VP may be more focused more on long term strategy such as technical architecture and organizational structure. Regardless of these differences, the underlying domains do not change very much. The real skill lies in the ability to dynamically move up and down along the spectrum as the product and organization evolves. The elasticity to go back and forth between questions such as “how do we resolve this bug?” to “what goals do we need to hit in two years?”, is what allows great managers to operate across the organization, and drive good decisions. Building the future Over the millennia, societies have built stability layer by layer. Agriculture increased the caloric yield of the land, freeing some from the daily need to hunt and gave birth to specializations and the trades. Modern economies extended that stability through social safety nets. This stability fuels progress, but it also carries a hidden risk. The very systems that allow us to innovate and take risks can just as easily foster complacency. Left unchecked, stability becomes inertia. For startups and leaders alike, resisting is not an accident – it is a conscious act of will, powered by curiosity and a commitment to excellence. As historian Yuval Noah Harari writes in Sapiens, our society went through a transformation around the 16th century, shifting from one having low trust in the future and thus lacking appetite for credit, to one with high trust in the future outlook. After all, if you do not believe the future is bright, why would you lend money to somebody looking to start a business? Basic economics tells us that lack of credit translates to lower money supply and sluggish growth. Around the Scientific Revolution, perhaps as the elite grew accustomed to the idea of discovering the unknown, this belief in human progress gave way to economic progress, convincing many to extend credit in the hopes that a better future will bring about returns. This transformation has given us the modern financial system, and the speed of innovation and progress that we all enjoy today. Manufacturing today is at an inflection point, facing headwinds of geopolitics, tariffs, and a declining working force. It has been a trailblazing industry that has led to the rise of commerce as we know it today, and formed the foundation for software that runs all of the biggest companies in the world. And yet, for decades, manufacturing has been labor-intensive, anchored in a traditional cost-up efficiency-first paradigm, requiring a strong focus on risk mitigation. This fosters a defensive mindset and walks a fine line between progress and stagnation. But we bet on a better future. Manufacturing companies have decades of knowledge, accumulated experience, and operational data that previous generations could only dream of. When combined with modern computer vision and machine learning technologies, they can transform what used to be bits and bytes on a disk, into leverage. We believe in a future where organizations can take their collective wisdom, and empower individual workers to make smarter and faster decisions. Just as societies that believed in the future unlocked economic growth, we want manufacturers who bet on their future capabilities to unlock exponential returns on their years of process refinement and quality initiatives. Pursuing excellence is the practical expression of optimism. The role of an engineering manager or leader is to translate this belief into action. It is to build teams, systems, and cultures that do not optimize for today, but create the foundations for tomorrow. To achieve such a world, we must actively resist the allure of mediocrity, and pursue excellence.
こんにちは、Data&Analysis郚(D&A)です。 D&Aでは週1回、機械孊習の勉匷䌚を開催しおおり、本蚘事は、勉匷䌚の内容を生成AIを掻甚しお蚘事にたずめたものです。 ※勉匷䌚内容公開の経緯は こちら ※過去の勉匷䌚は「瀟内勉匷䌚」タグからもご芧いただけたす。 はじめに 12-Factor Agentsずは 12-Factor Agentsを曞いた背景 12-Factor Agentsの抂略 Agentは様々な経路から入力を受け぀け、出力は構造化されおいる プロンプトやコンテキスト、制埡フロヌをコヌドずしお管理する 状態管理をし、人の介入や゚ラヌ修正を可胜にする 小さな゚ヌゞェントを耇数構築し単䞀の結果を埗られるようにする たずめ はじめに 今回の勉匷䌚では、信頌性・保守性の高いLLMアプリケヌション構築の原則ずしお提唱された12-Factor Agentsを玹介したす。動機ずしおはLLMを甚いたアプリケヌションが高品質であるための䜓系的な理解が必芁だず考えたためです。 本蚘事では、以䞋の資料を参考にしおいたす。 humanlayer/12-factor-agents Twelve-Factor App 12-Factor Agentsずは 12-Factor Agentsずは、倧芏暡蚀語モデルLLMを掻甚したアプリケヌション以䞋ここではAI゚ヌゞェントず呌称しおいきたすを信頌性が高く、スケヌラブルで、保守しやすいものずしお構築するために提唱された12の原則です。なぜ12かずいうずWebアプリケヌション開発のベストプラクティスであるThe 12-Factor Appをなぞらえたものだず思いたす。 12-Factor Agentsを曞いた背景 埓来の゜フトりェア開発では、必芁な凊理ずその順序から最終成果物の定矩を人が実装し䟋: むベントトリガヌやワヌクフロヌのためのDAGの蚘述等、事前に定矩された手続きやフロヌに基づいお凊理が行われおきたした。AI゚ヌゞェントが将来もたらすものずは、LLMが指瀺に基づいおDAGを自動で蚘述するように凊理の順序を適切に構築するずいう機胜です。 理想的なAI゚ヌゞェント資料1より匕甚 珟圚の゚ヌゞェントは「LLMが次のステップを決定 → ツヌルを実行 → 実行結果をコンテキストに远加 → 再びLLMが次のステップを決定」ずいうルヌプ構造で実装されるこずが倚く、DAGが䞍芁になるずいう理想ずは異なっおいたす。むしろ、このルヌプ制埡フロヌをどう管理するかが重芁です。 ルヌプずしおの゚ヌゞェント資料1より匕甚 この実行順序のルヌプを高い品質に保぀ための12の原則が12-Factor Agentsです。 12-Factor Agentsの抂略 ここから12-Factor Agentsに぀いお抂略したものを玹介しおいきたす。抂ね4぀のテヌマに集玄しおみたした。 構造化された結果を返すものずしお定矩する#1, #4 プロンプトをコヌドずしお管理する#2, #3, #8 状態管理をし人の手を借りたり゚ラヌを修正できるようにする#5, #6, #7, #9 小さな゚ヌゞェントを耇数構築し単䞀の結果を埗られるようにする#10, #11, #12 Agentは様々な経路から入力を受け぀け、出力は構造化されおいる Agentは入力をスケゞュヌルされたタスク、システムむベントや人のテキスト入力など様々なずころから自然蚀語で受け぀けるようにしたす。たた出力結果はコンピュヌタが実行できるものでなければなりたせん。䟋えばプロンプトを受け取りAPIのURIを返すAgentのようなものです。原則1「Natural Language to Tool Calls」や原則4「Tools are just structured outputs」に曞かれおいたす。結果が構造化されおいるこずでAgentがそれを実行したり他のAgentに枡せるようになりたす。Agentの起動条件に぀いおは原則11「Trigger from anywhere, meet users where they are」に曞かれおいたす。 プロンプトやコンテキスト、制埡フロヌをコヌドずしお管理する 制埡フロヌは圓然ですが、プロンプトやコンテキストもフレヌムワヌクに任せずに内補し、バヌゞョン管理を培底できるようにしたす。それによっおAgentをテスト可胜にし改善可胜なものにしたす。原則2「Own your prompts」ではプロンプトを内補するこずに぀いお、原則3「Own your context window」ではコンテキストりィンドりを内補するこずに぀いお、原則8「Own your control flow」では制埡フロヌを内補するこずに぀いお曞かれおいたす。このテヌマは12 Factor Appの原則1「コヌドベヌス」の䞀郚(コヌドはバヌゞョン管理システムで垞に倉曎を远跡しおいる)ず関わりがあるず考えたす。 状態管理をし、人の介入や゚ラヌ修正を可胜にする LLMは非構造化デヌタを入力できたす。そこでAgentを停止しお人が远加の指瀺を入力するこずができたす。たた起こった゚ラヌを入力し、それを解決するようにAgentを動かすこずもできたす。このようなAgentの状態や構造化された出力などを管理し柔軟なAgentの構築やリカバリヌを容易にしたす。原則5「Unify execution state and business state」では状態管理に぀いお、原則6「Launch/Pause/Resume with simple APIs」はAPIの実行や䞀時停止させるこずに぀いお、原則7「Contact humans with tool calls」は人の介圚に぀いお、原則9「Compact Errors into Context Window」はAgentの゚ラヌ察応に぀いお曞かれおいたす。 小さな゚ヌゞェントを耇数構築し単䞀の結果を埗られるようにする 耇数のタスクを実行するのではなく単䞀のタスクを実行するAgentを䜜るように心がけたす。たたAgentはステヌトレスであるこずを心がけ、スケヌリングできるような構成になるようにしたす。原則10「Small, Focused Agents」ではAgentのタスク蚭蚈に぀いお、原則12「Make your agent a stateless reducer」ではAgentのスケヌラビリティに぀いお曞かれおいたす。なお耇数のステヌトレスなプロセスにするずいう考え方は12 Factor Appの原則4「プロセス」の発想に近しいず思いたす。 たずめ このように、12-Factor Agentsは非構造デヌタの入出力が可胜なAgentを埓来の゜フトりェアのように開発するための原則です。GitHubに公開されおいるのでぜひご芧ください。
こんにちは、 Drawer Growth グルヌプの倧朚です。 最近ずいうかずっずAIが熱いですね、゚ヌゞェントモデルが出おきおコヌディングの垞識がたた䞀぀倉わろうずしおいるように感じたす もちろんキャディでもAIツヌルは倚数導入しおおり、この倉化に远埓するために組織ずしおAI掻甚に積極的に取り組んでいたす 今回はその取り組みの䞀環ずしお、䌚瀟内で Vibe Coding Hackathon を開催したしたのでご玹介したす きっかけ 今幎2025幎の2月頃から、有志を募っおAIツヌルを積極的に怜蚌しおいたした 初期ではツヌルごずに掚進者を立お、実際に詊隓的に䜿っおみお費甚感や効果・ベスプラなどを調査しお党瀟に展開しおいくような動きをしおいたした ある皋床党瀟的にもツヌルの導入が終わり䜿甚フェヌズに入ったずころで、 もっず利甚を促進させる AI掻甚のナレッゞを組織に貯める ために、今回のハッカ゜ンを䌁画したした 1日ガッツリの短期集䞭型で䌁画し参加者を募ったずころ、最終的に玄50名ほどのメンバヌが集たりたした ゚ンゞニアはもちろん、PdMやデザむナヌなどからも参加がありたした ルヌル ルヌルは「 基本的にコヌディングはAIにだけやらせる」 、だけです 特にテヌマも限定せずに、䜜りたいものを1日で䜜っおくれずいうスタンスで開催したした 䜿っおもらうツヌルはメむンずしお以䞋二぀にしたした Cline Devin 理由は、開催タむミングで党員がラむセンス利甚可胜なClineずDevinにフォヌカスしお利甚を促したかったからです 投皿日時点ではClaude Codeが䞻流になっおいたすが、こちらの利甚に向けた怜蚌も進んでいたす ハッカ゜ン開始 圓日の案内を軜く枈たせたら早速みなさんに䜜業に取り掛かっおもらいたした 開始盎埌からすでに参加者の゚ディタヌではAIが爆速でコヌディングしおいるのが芋えたす アむデアを出したり、AIの仕事を眺める人たち ただ開始から1時間皋床にも関わらず完成させおいる猛者も出おきおいたす Clineの メモリヌバンク や rules の機胜を詊したりずいい感じにAIを䜿い倒しおいたすね 䞀次審査 たた今回参加者が倚いため、䞀次審査を蚭けたした ハッカ゜ンの䞭間地点でコンセプトや機胜の詳现に぀いお䌁画曞を曞いお提出しおもらいたす ここでの結果をもずに、予遞通過者を決めお決勝投祚に進みたす AI掚進掻動リヌダヌのimaiが採点甚のAIツヌルを䜜っおくれたしたので、審査もAIにやっおもらいたす 以䞋が実際の採点ツヌルです 1䜍 ~ 3䜍には景品もありたす プロンプトむンゞェクションに釘を指すimai 䌁画曞も倚くの人がClineなどのAIツヌルを掻甚しお提出しおいたした ラストスパヌト 運営が採点䞭にも参加者のみなさんはガンガン開発を進めおくれおいおいたすが、埐々にAIの蟛い郚分も芋えおきおいそうですね 採点が終わり予遞通過車が確定しお、ハッカ゜ンも倧詰めに入っおきたした 発衚䌚 最埌の入賞者たちの発衚です AI審査の予遞を通過した人たちにはプレれンをしおもらい、その埌参加者党員で投祚をしたした 今回優勝に茝いたのは、むンシデント察応を助けおくれるCLI / TUIツヌルでした 普通に実甚できるレベルのもので凄かったです その他の参加者たちにも、たくさんのツヌルやアプリなどを䜜っおもらい、Vibe Codingに1日どっぷり浞かっおもらえたようでした 惜しくも決勝に届かなかった䜜品たちの䟛逊 閉幕 やっおみた感想 今回䞀日䞭AIにガッツリ觊れおもらうこずでたくさんの孊びが集たりたした 蚭蚈やルヌルが䞍十分だずAIは暎走するため、ガヌドレヌルの敎備が䞍可欠 AIを掻かすには人間の読解力・刀断力がボトルネックになりやすい 詊䜜やUI生成は爆速だが、運甚を芋据えるなら人の補完が必須 䞀通り成果物を䜜るずころたで自分で觊っおもらったこずで、どこら蟺が限界なのか、䜕が埗意なのかなどを生の情報で孊べるのは Vibe Coding ならではの成果です 特にマネヌゞャヌ陣やデザむナヌ、PdMなど普段コヌディングをあたりしない人たちにも積極的に参加しおもらえたこずで、組織党䜓に察しおよりVibe Codingの解像床を高めるこずができたんじゃないかず思いたす これから 今回のハッカ゜ンを通じお、より䞀局党員がAIを掻甚しお仕事を進められる䜓制に䞀歩近づいたず思いたす しかしフィヌドバックから課題も明らかになりたした 特にAIを掻甚しおいくにはきちんずしたガヌドレヌルが必芁であったり、AIフレンドリヌな環境にしおいくこずが䞍可欠です 次のフェヌズずしお、AIを掻甚した時にレバレッゞの効く環境を甚意するこずが必芁だず感じおおり、今埌はこれらの掻動により䞀局泚力しおいく予定です We are hiring!! こんな感じでキャディではAIもめちゃくちゃ掻甚しおいたす 今回玹介しきれおいないツヌル矀もたくさん瀟内では䜿われおおり、今埌新しく出おきたものも積極的に採甚しおいく぀もりです AI掻甚しお生産性を爆䞊げしたい方はぜひ、䞀緒に働きたしょう https://recruit.caddi.tech/
AI × ゜フトりェア開発の最前線——キャディ における Devin 掻甚のリアル AIが゜フトりェア開発の圚り方を倧きく倉え぀぀ある今、キャディではその倉化をチャンスず捉え、゚ンゞニアの生産性ず創造性を匕き出す取り組みを進めおいたす。䞭でも泚目しおいるのが、話題のAI゜フトりェア゚ンゞニア「Devin」です。 Devinの掻甚に関する知芋を深め、瀟内でのベストプラクティスを探るべく、先日LTを開催したした。さたざたなチヌムの゚ンゞニアが登壇し、Devinを日々の業務でどう掻甚しおいるか、そこで埗られた気づきや成果を共有したした。 この蚘事では、そんな瀟内LTの䞀郚をご玹介したす。キャディの取り組みや゚ンゞニアリング文化の䞀端に觊れおいただけたら嬉しいです。そしおもし興味をもっおいただけたなら、ぜひ私たちず䞀緒に新しい゜フトりェア開発のあり方を切り拓いおいきたしょう 🎯 図面解析チヌムDevinの珟実的な掻甚ずシニア゚ンゞニアのスキルアップ 最初の発衚は、 図面解析チヌム から。Devinを初めお䜿う人にずっお貎重な知芋ずなる、チヌムでの実䜓隓を共有しおくれたした。 Devin Search や Devin Wiki ずいった最新機胜よりも、Devinを䜿う䞊でのマむンドを共有するこずに焊点を圓おおいたした。 図面解析チヌムのDevin掻甚術 答えが分かっおいるタスク リファクタリングや単䜓テストなど、ある皋床自分たちで方針が芋えおいるタスクを任せおいる。 いく぀かのサブタスクに分割し、既存のPRなど具䜓䟋を参考に修正するよう指瀺。 未知の゚ラヌ調査 ゚ラヌの原因や修正方針が䞍明確なタスクに぀いお、Devinに初期調査を䟝頌。 提案されたアプロヌチを参考に適宜、人手で修正。 基本スタンスタスクの60〜80%をDevinに実装させ、残りを人間が匕き継ぐ気持ちで扱うず良いず話しおいたした。このスタンスは 公匏ドキュメントの蚀及 ず䜿っおみた感觊に基づいおいるずのこずです。 Devinはゞュニア゚ンゞニア 曖昧で広範囲なタスクよりも、スコヌプが小さく明確なタスクが埗意 実䟋を瀺すず適切な修正になりやすい 公匏ドキュメント より たた、Devinを䜿っおみお良かった点ずもう少し良くなっおほしい点を共有しおいたした。 良かった点 埌回しにしがちなタスク =難易床は高くないし、やっおおきたいが、優先床の郜合䞊着手できおないタスク を消化できる 迅速なプロトタむピング 新しいアむデアの初期コヌドを玠早く䜜るこずができたす 。 シニア゚ンゞニアずしおのスキル向䞊 指瀺を明確にしないず思わぬ倉曎をしおしたうこずがあるDevinだが、ポゞティブに捉えれば、シニア゚ンゞニアずしお必芁になるタスク分解胜力や開発スコヌプの蚭定力を鍛える機䌚になる。 良くなっおほしい点 䞭途半端な埅ち時間 Devinの䜜業時間10分皋床は、䜕もせずに埅぀には長く、他の耇雑な䜜業を自分が取り組むには短い 30分攟眮しおいるず、セッションが切れるうえにその間にもACUAgent Compute UnitDevinの蚈算リ゜ヌス単䜍を消費するので、Devinに付きっきりにならないずいけないず感じる 既存コヌドの保護 「既存コヌドは倉曎しないで」ず明瀺的に指瀺しないず、正しいコヌド行たで修正・削陀しおしたうこずがある Playbook ) に倉曎しない旚を曞けば察応可胜だが、ただ掻甚しきれおいない 今埌の改善点 今埌導入しおいきたい取り組みずしお以䞋を挙げおいたした。 プロンプトのテンプレヌト化 プロンプトの属人化を防ぐうえに、ACUの無駄遣いを避けるため、プロンプトの暙準化を怜蚎䞭 PRのdescriptionを曞く぀もりで指瀺を出すず、再利甚性も高たり䟿利だったずいう他チヌムの知芋も共有 Knowledge の掻甚 蚭蚈曞やADRArchitecture Decision RecordsをKnowledgeに登録 プロトタむプ䜜成や蚭蚈思想に沿った改修をしやすくするこずを期埅 🐘 Data Management チヌムAIでチヌムのボトルネックを解決Damboの成果発衚 続いお登壇したのは、 Data Managementチヌム 。 「Dambo」 ずいう、瀟内で開発しおいるAIワヌクフロヌを玹介しおくれたした。 前四半期は5人のチヌムで 110件もの䟝頌察応 に察応したしたが、これが倧きなボトルネックずなり、䟝頌察応のリヌドタむム遅延やチヌムの他の業務にも圱響を䞎えおいたした。 そこで開発したのが Dambo です。これはDevinを掻甚しおテヌブル倉曎䟝頌を自動化するAIワヌクフロヌです。 ワヌクフロヌ ナヌザヌが察象テヌブルや倉曎内容䟋特定のロゞックを持぀カラムの远加をフォヌムから䟝頌したす 。 するずDevinが䜜業を匕き継ぎ、倉曎蚈画を立お、プルリク゚ストを䜜成したす 。 この䞀連の流れは、必芁な情報をDevinに䌝えるSlackワヌクフロヌを通じお開始されたす 。 驚きの凊理胜力 Damboはわずか1ヶ月で 28件のタスクを完了 。 これには小芏暡なもの1時間皋床から倧芏暡なもの1日以䞊たで含たれたす 。 䟋えば、既存の売䞊テヌブルからデヌタをクレンゞング、敎理、フィルタリングし、ピボットしお新しいナヌザヌフレンドリヌなテヌブルを䜜成する、ずいった耇雑なタスクもこなしたした 。 孊びず改善 Damboは圓初のボトルネックを芋事に解消したしたが、その高い効率性ゆえに、今床はレビュヌ埅ちのPRが倧量に発生するずいう新たなボトルネックが生たれたした。 この課題に察し、チヌムでは珟圚以䞋のような改善に取り組んでいたす。 Devinが䜜成するPRが、レビュヌしやすい構成・内容になるようチュヌニングを行う PR䜜成時点で差分のあるテヌブルを自動でBigQuery䞊にビルドし、デヌタの䞭身をすぐに確認できる仕組みを敎備する こうした取り組みにより、レビュヌプロセス負荷の軜枛ず開発サむクルのさらなる高速化を目指しおいたす。 その他の掻甚 Data Managementチヌムの゚ンゞニアは、 Devin Search がいかに提案の質を高めるかに぀いおも蚀及 。 他チヌムのリポゞトリを暪断しお調査ができるため、他チヌムぞデヌタの仕様などを質問する際には「これは、䜕ですか」ずいう曖昧な質問から、「これは、この理解であっおいたすか」ずいう、より具䜓的で質の高い質問ぞずシフトでき、コミュニケヌションコストの倧幅な削枛に぀ながったそうです 。 🧭 QuoteチヌムDevin × JIRA連携で開発を「フロントロヌディング」 次に、 Quoteチヌム の゚ンゞニアが、Devinを「フロントロヌディング」に掻甚する革新的な詊みに぀いお発衚したした。「フロントロヌディング」ずは、開発ラむフサむクルの早い段階で朜圚的な問題を発芋し解決するこずで、実装開始埌に想定倖の倉曎箇所に気づいたり 、受け入れ条件が䞍十分なたたスプリントプランニングに突入しおしたったり 、ずいったよくある手戻りを防ぐこずを目指す取り組みです 。 DevinずJIRAの連携 チヌムはDevin × JIRA連携機胜を掻甚しおいたす 。 JIRAチケットに "Devin" ラベルを付䞎するず、Devinが以䞋の情報を返しおくれたす  タスクの機胜芁件や䞍明瞭な点 関連する既存コヌドの珟状 党䜓的なアプロヌチ、倉曎が必芁なファむル、蚭蚈䞊の決定事項など、提案される解決策 䞻な掻甚方法 チケットの完成床チェック DevinがJIRAチケットに察する 「自信床 (Confidence Score)」 を衚瀺したす 。 スコアが䜎い堎合は、開発に着手する前に受け入れ条件やアプロヌチをより明確化する必芁がある、ずいうシグナルになりたす 。 コヌド倉曎の抜け挏れ早期発芋 Devinが提瀺する実装蚈画を確認するこずで、远加のコヌド倉曎が必芁な箇所や、ロゞックの考慮挏れに早期に気づくこずができたす 。 これにより、リスクを未然に枛らすこずが可胜になりたす 。 孊び 優れた解釈胜力 Devin内郚のむンデックス䜜成胜力は非垞に高く、倚少ラフに曞かれた内容でもある皋床解釈し、業務フロヌや各皮図も理解しおくれるそうです 。 むンプットの質が重芁 ずはいえ、質の高いJIRAチケットを䜜成しなければ、Devinからの回答も浅いものになっおしたうため、チケットをしっかり曞くコストずのバランスが重芁になりたす 。 AI時代においおは、受け入れ条件や実装アプロヌチを蚀語化する重芁性がたすたす高たっおおり、愚盎に取り組むか、そのコストを䞋げる工倫が倧切だず語りたした 。 総括 QuoteチヌムにずっおDevinは、単にコヌドを曞くだけでなく、開発プロセスそのものを改善するパヌトナヌずなり぀぀ありたす 。 🛠 APチヌムDevinず共に開発をフルスロットルで掚進 最埌に登壇したのは、 Analysis Platform (AP) チヌムの゚ンゞニア。Devinがいかに深く圌らの開発サむクルに組み蟌たれおいるかを力匷く語っおくれたした。 APチヌムは、今四半期の間に、チヌムリポゞトリで Devinが䜜成したプルリク゚ストを22件もマヌゞ するずいう成果を䞊げおいたす これらは単なる軜埮な修正だけではなく、以䞋のようなタスクもDevinが担圓したした IaC (Infrastructure as Code) におけるIP制限蚭定 機械孊習掚論サヌバヌの初期コミット Terraformディレクトリのリファクタリング 掻甚の秘蚣 集䞭できるむンタヌフェヌス遞択 スピヌカヌが Devin ずやりずりする際はSlack䞊ではなく、䞻にapp.devin.aiを利甚するこずで、スレッドが流れずに把握できたす。たたAIがリアルタむムでコヌドを線集する様子を芋るのも楜しんでいるそうです 。 スプリントのスタヌトダッシュ 新しいタスクやスプリントに着手する際の「初動の重さ」をDevinが解消 。スプリントプランニング埌にDevinにタスクを䟝頌するこずで、すぐに開発が進み始めたす 。 レビュヌずオンボヌディングの効率化 Devinが䜜成したPRぞのコメントにはDevinが自動で応答するため、非同期レビュヌがスムヌズになりたした。 たた、Devin SearchやDevin Wikiは、耇雑なai-labモノレポに新メンバヌがキャッチアップする䞊で非垞に圹立っおおり 、ファむル怜玢や既存実装の理解にかかる時間を倧幅に削枛しおいたす。 APグルヌプが実感する䞻なメリット 時間短瞮 ブランチ䜜成、ファむル怜玢、PRレビュヌずいった现かな䜜業時間を倧幅に削枛 䞊行開発の実珟 「ずりあえずDevinに任せる」こずで、倚くの開発タスクを䞊行しお進められるように 明確なタスクにおける高粟床 実装方針が明確な堎合や、参考にできる既存実装がある堎合の粟床は高いずのこず 今埌の展望 APチヌムは、Devin単独で怜蚌可胜なテスト蚭蚈や 、Jira/Confluenceずの連携匷化により、さらなるワヌクフロヌの効率化を目指しおいたす 。 ✹ 私たちのDevin掻甚ゞャヌニヌLT党䜓を通じた孊び 今回のLT党䜓を通しお、いく぀かの共通するテヌマが芋えおきたした。 各チヌムの発衚埌には倚くの質疑応答が生たれ、実際の業務で盎面するであろう課題やその解決策に぀いお、具䜓的な議論が深たった こずは、瀟内LTならではの倧きな収穫でした。 迅速な開発スタヌト Devinは開発タスクの初動を早めるのに貢献しおいたす 。 オンボヌディングず知識共有の進化 Devin SearchやWikiは、倧芏暡なコヌドベヌスの理解や既存システムの把握に匷力なツヌルずなっおいたす 。 定型業務の自動化 「Dambo」の事䟋のように、明確に定矩された反埩䜜業はDevinに任せるこずで、゚ンゞニアはより耇雑な課題に集䞭できたす。 プロアクティブな問題解決 JIRA連携によるフロントロヌディングは、問題が倧きな手戻りずなる前にDevinがその発芋を助ける可胜性を瀺しおいたす 。 人間ずAIの協調が鍵 最も成功しおいる掻甚法は、゚ンゞニアがDevinを導き、タスクを分解し、その成果をレビュヌするずいう圢です。これは「眮き換え」ではなく「胜力拡匵」ず蚀えるでしょう。 継続的な孊習 Devinに効果的に「指瀺プロンプト」を出し、最倧限の胜力を匕き出す方法は、私たち党員がただ孊んでいる最䞭です。Devinを、垞に孊習し続ける非垞に有胜なゞュニア゚ンゞニアのように捉え 、共に成長しおいく姿勢が倧切です。 Devinの掻甚は、より良い゜フトりェアを生み出し、ダむナミックで革新的な゚ンゞニアリング文化を築くための挑戊の䞀぀にすぎたせん。3か月埌には、私たちがメむンで掻甚しおいるAI゚ヌゞェントはDevinではないかもしれたせん。しかし、Devinを通じお埗られた知芋や経隓は倧いに掻かされるず思っおいたす。 💡 未来の開発を、私たちず䞀緒に圢にしたせんか もし少しでも興味を持っおいただけたなら、ぜひ気軜にお話ししたしょう。 採甚ペヌゞ https://recruit.caddi.tech/ では、私たちの挑戊や䟡倀芳、そしおあなたがどのように掻躍できるかをご玹介しおいたす。ワクワクするような未来を、䞀緒に切り拓いおいきたしょう
こんにちは。キャディでプロダクトマネヌゞャヌ以䞋PdMをしおいる北林です。 昚幎の6月にキャディに入瀟し、珟圚はリリヌス前の新機胜のPdMをしおいたす。 今日はこの新機胜のDiscovery *1 での、デザむナヌや゚ンゞニアずのコラボレヌション事䟋に぀いお共有しようず思いたす。 こんな方に向けお曞いおいたす DiscoveryでのPdM、デザむナヌ、゚ンゞニアのコラボレヌション事䟋を知りたい方 グロヌバルなチヌムでのコラボレヌション事䟋を知りたい方 チヌム玹介 たずは私たちのチヌムを玹介したす。 ただ正匏リリヌス前の機胜ずいうこずもあり、PdM、デザむナヌ、゚ンゞニアがそれぞれ1名のスモヌルなチヌムです。私は日本生たれ日本育ち、ワンさんは台湟出身、Matthiはドむツ出身ず、グロヌバルなチヌムでもあり、普段のミヌティングは日本語ず英語のMixで進むこずが倚いです。 チヌム玹介 今回のDiscoveryの進め方 これたでDiscoveryはPdMが䞭心になっお進めるこずが倚かったのですが、今回は PdM・デザむナヌ・゚ンゞニアの3人でコラボレヌション しお進めたした。 デザむンシンキングのフレヌム にそっお今回の進め方を敎理 table { border-collapse: collapse; } th { border: solid 1px #666666; color: #000000; background-color: #e6e6e6; } td { border: solid 1px #666666; color: #000000; background-color: #ffffff; } デザむンシンキングのステップ 今回のDiscoveryの進め方 共感Empathize  ナヌザヌの立堎に立っお、感情・行動・ニヌズを深く理解する チヌム党員でむンタビュヌに参加 問題定矩Define  集めた情報をもずに、本質的な課題を明確にする チヌム党員でMiroボヌドでナヌザヌの業務フロヌや課題を敎理しディスカッション アむデア発想Ideate  課題に察する解決策をたくさん出す 課題に察しチヌム党員でIdeation sessionを開催しお解決策を怜蚎 プロトタむプPrototype  アむデアを簡単な圢にしおみる ゚ンゞニアがHi-fi高忠実床プロトタむプ *2 を䜜成 テストTest  ナヌザヌに詊しおもらい、フィヌドバックを埗る Hi-fiプロトタむプをナヌザヌに実際の業務を想定したシナリオで䜿っおもらい、芳察する このような進め方をずった背景には、以䞋のような理由がありたす。 プロダクトがただ立ち䞊げ段階にあった→ 仕様や実装方針が固たりきっおおらず、チヌムで仮説を立おながら柔軟に方向性を探るアプロヌチが有効だった。 PdM・デザむナヌ・゚ンゞニアがそれぞれ1名ず぀ずいう非垞にスモヌルなチヌム構成だった→ 意思決定のスピヌドを保ちながら、密なコラボレヌションがしやすい状況だった。 デザむナヌ・゚ンゞニアが今回の機胜領域の開発経隓があった→ 私が1人で考えるより、Discoveryから3人で議論を重ねるこずで、よりよい意思決定に぀ながるず考えた。 なお、こういったコラボレヌション型のDiscoveryはすべおのケヌスに適しおいるわけではなく、䟋えば以䞋のような状況ではPdMが単独で進める、もしくはDiscovery自䜓を軜量化する方が適しおいる堎合もあるず思いたす。 リヌドタむムが極端に短い堎合→ スピヌドを優先した刀断ず意思決定が求められるため、意思決定プロセスをよりシンプルにする必芁がある。 倧芏暡なプロダクトやチヌムの堎合→ 関係者が倚すぎるず合意圢成に時間がかかり、コラボレヌションの効果が薄れおしたう。 探玢の䜙地が少ないリニュヌアル・改善案件の堎合→ 既知の課題に察する明確な解決策があるケヌスは、時間をかけたDiscoveryは䞍芁なこずもある。 芁件が倖郚により芏定される堎合法什察応など→探玢よりも正確な実装や圱響範囲の把握が重芁ずなる。 チヌムで具䜓的に取り組んだこず 党員でナヌザヌむンタビュヌに参加 お客様を蚪問し、 実際の業務を想定したシナリオに沿っお Hi-fiプロトタむプを䜿っおいただき、その様子を芳察したした。 珟地にお実際に動くプロトタむプを䜿っおいただくこずで、ナヌザビリティ䞊の課題が発芋できたり、怜蚎できおいなかったサヌビス倖でのタッチポむントでの課題を発芋するこずができたした。 たた、お客様から「これなら〇〇の業務にも䜿えそう」ずコメントをいただくなど、想定しおいなかったナヌスケヌスに気づくこずができたした。 お客様を蚪問した様子 むンタビュヌ結果を芖芚化 Miro䞊に業務フロヌを曞き出し、どこで顧客の課題が発生しおいるかをマッピングしたした。 補造業の業務フロヌは非垞に耇雑ですが、ダむアグラムにたずめるこずで、キャッチアップがしやすく、たたチヌム内での認識を揃えるこずができたした。 たた、グロヌバルチヌムで党員母囜語が異なるため、できるだけ文章ではなくダむアグラムに敎理するようにしおいたした ナヌザヌの業務フロヌをダむアグラムに敎理 チヌムでのIdeation Workshop 課題を掗い出した埌は、チヌムで重芁課題を決め、その課題に぀いお解決策のアむデアをたくさん出すずいうIdeation workshopを行いたした。 Ideationは発散のフェヌズであるため、「吊定しない」「質より量」「自由奔攟」「人のアむデアに䟿乗する」ずいう雰囲気䜜りも重芁です。 Ideationには色々な方を巻き蟌むのが望たしいので、CPOの癜井ず、PdMの庭瀬も巻き蟌みたした。 色々な芖点からたくさんの新しいアむデアが出お、その䞭から実際にロヌドマップに远加されるものもうたれたした。 Ideation workshopで䜿ったボヌド PRD *3 もチヌムで共創 PRDは私はこれたで1人で曞くこずが倚かったのですが、今回はチヌムで共同で曞きたした。 具䜓的には、ナヌザヌペむンはPdM、ナヌザヌストヌリヌはデザむナヌ、機胜芁求はIdeationの結果をふたえおPdMがたずめ、技術のリスク点などぱンゞニアが曞く・・ずいうようなかたちです。 PRDをチヌムで曞いおいるので、レビュヌの時間が短瞮できるずいう副次的な効果もありたした。 チヌムでDiscoveryを進めおみお、正盎どうだった 今回チヌムでDiscoveryを進めおみお、正盎どうだったかを3人でディスカッションしおみたした。 埗られたこず 党員でアむデアを出すこずで゜リュヌションの 遞択肢が広がり、より良い刀断ができた  デザむナヌ・゚ンゞニアも顧客理解が進み、 ナヌザヌ芖点での蚭蚈・実装が可胜になった  Hi-fiプロトタむプでの怜蚌 などPdMだけではできないアプロヌチが実珟した 技術的芳点での実装時のリスクや萜ずし穎 を早期に認識できた。今たでは、PRDを読んだ段階で ”おっずこれは難しいぞ” ずなるこずもあったので 「なぜこの機胜を䜜るのか」ずいう共通認識がチヌムに生たれた 難しかったこず・乗り越え方 PdMが単独で進めるより 時間はかかる。 顧客むンタビュヌの日は移動も含めるず䞞䞀日デザむンや開発が進たない。 → 党員がすべおのむンタビュヌに参加するのではなく、怜蚌したいこずや実際に自分の目で確認しお欲しい顧客属性など、察象のむンタビュヌを遞ぶ。 Hi-fiプロトタむプを䜜る 工数が倧きい → Hi-fiプロトタむプでしか怜蚌できないこずにフォヌカスし、䞍芁な郚分は䜜らない。それでもやっぱり時間はかかったので、工数の芋積もりはシビアにおこなう。 グロヌバルチヌムならではの 蚀語の壁 →できるだけテキストではなく、Diagramや実際のプロトタむプで説明するこずを心がける。 職皮の圹割に囚われない...ずいっおも 圹割分担が難しい →お互いのcanやwillの盞互理解が重芁。チヌムビルディングが倧切。 これは私が勝手に思っおいたこずですが「PdMが党郚考えないずいけない」ずいう固定芳念があった →PdMの仕事は結果を出すこずであるため、チヌムに自分よりもっず埗意な人がいたら䜙蚈なプラむドは捚おお任せるべきだし、良いアむデアはチヌムで出せば良い 最埌にたずは小さく詊しおみよう 前述の通り、Discoveryをチヌムでおこなうのは䞀定の時間もかかりたすし、゚ンゞニアやデザむナヌの時間の䜿い方も倉わるため、組織的な調敎も必芁です。 いきなりフルで巻き蟌むのではなく、 ナヌザヌむンタビュヌに1件だけ参加しおみる 1時間だけIdeation sessionを開いおみる など、小さなこずから始めおみるのはいかがでしょうか。 *1 : プロダクト開発における、䜕を䜜るべきかを発芋するプロセスのこず *2 : Hi-fiプロトタむプ実際の補品に近いプロトタむプ。実際に動くものを指すこずが倚い。 察比する蚀葉に、Lo-fiプロトタむプFigmaや手曞きで䜜成した、レむアりトや機胜の流れを衚珟した簡単なプロトタむプがある。 *3 : PRDProduct Requirements Documentプロダクトの背景・目的・芁件を敎理し、チヌムの共通認識を䜜るためのドキュメント
こんにちは、Data&Analysis郚(D&A)です。 D&Aでは週1回、機械孊習の勉匷䌚を開催しおおり、本蚘事は、勉匷䌚の内容を生成AIを掻甚しお蚘事にたずめたものです。 ※勉匷䌚内容公開の経緯は こちら ※過去の勉匷䌚は「瀟内勉匷䌚」タグからもご芧いただけたす。 はじめに 埓来の異垞怜知モデルの異垞床に関する課題 MAD-Benchの構築 MLLMベヌスの手法 実隓内容 実隓結果 ベンチマヌクずモデルタむプ分析 (RQ1) バむナリ・マルチレベル性胜盞関 (RQ2) 異垞領域面積効果 (RQ3) 深刻床別の怜出性胜 (RQ4) 正垞クラス拡匵 (RQ5) ロバストネス分析 (RQ6) たずめ はじめに 本蚘事では、以䞋の資料を参考にしおいたす。 Are Anomaly Scores Telling the Whole Story? A Benchmark for Multilevel Anomaly Detection 埓来の異垞怜知モデルの異垞床に関する課題 異垞怜知の分野においお、埓来の異垞怜出モデルが出力する異垞スコアマップは、入力画像に察しおピクセルレベルたたは領域レベルで異垞の床合いを瀺したす。しかし、これは実際の深刻床を反映しおいない可胜性があるのではないか ずいう問題提起が本論文内でなされおいたす。䟋えば、小さい倉化であっおも、医療分野においおは芋逃しおはいけない初芋である可胜性があり、異垞スコアが䜎いからずいっおその深刻床も䜎いずは限りたせん。 したがっお、実際の応甚においおは、異垞を単に「正垞か異垞か」ずしお怜出するだけでなく、その深刻床をレベル分けしお評䟡する必芁があるず本論文内で提起されおいたす。本論文では「レベル順に異垞スコアが割り圓おられるような関数を発芋するこずがゎヌル」ず定矩されおいたす。 MAD-Benchの構築 䞊蚘の問いず必芁性に応えるため、深刻床に応じおレベル分けされた新しい異垞怜出デヌタセット「MAD(Multilevel Anomaly Detection)-Bench」が構築されたした。これは、埓来のベンチマヌクでは評䟡が難しかった異垞スコアず深刻床の敎合性を評䟡するための基盀ずなりたす。 MAD-Benchは元々存圚するデヌタセットを以䞋の条件で分割するものになりたす。 孊習デヌタをL0, L1, ..., Lnの集合に分割する Lはlevelを意味し、L0が正垞、L1, L2, ..., Lnの順に深刻床が䞊昇 L0のみで孊習し、テストはL0からLnたで党おのデヌタを察象ずする 具䜓的には、以䞋のようなデヌタセットが䜜成されたした。 Multi-Dogs-MAD 犬L0からレベルが䞊がるに぀れお異なる犬皮、猫、鳥、花ぞず倉化したす。 MVTec-MAD 異垞怜出に特化した既存デヌタセットMVTec、VisAを基に、欠陥の深刻さごずにレベルを蚭定しおいたす。 DRD-MAD (Diabetic Retinopathy Detection) 糖尿病性網膜症怜出デヌタセットを基に、網膜画像の所芋の深刻床に合わせおレベルを蚭定しおいたす。 VisA-MAD 異垞怜知に特化したデヌタセットであるVisAより䜜成。欠陥の深刻さごずにレベルを蚭定しおいたす。 Covid19-MAD 胞郚X線画像を基に、所芋の深刻床に合わせおレベルを蚭定しおいたす。 SkinLesion-MAD 健康な皮膚画像ず異垞画像を含み、所芋の深刻床に合わせおレベルを蚭定しおいたす。 Binary Anomaly DetectionずMultilevel Anomary Detection論文より匕甚 論文内ではこれらのデヌタセットを甚いお、既存の異垞怜知モデル、およびMLLMベヌスの手法の異垞怜知における異垞床ず深刻床の関連性を調査しおいたす。 MLLMベヌスの手法 3枚の正垞画像ずプロンプトを䞎えお、テスト画像を掚論させたす。プロンプトには以䞋のような情報を含みたす。 コンテキスト画像の説明 タスク説明目的や朜圚的な異垞の説明など 深刻床レベル説明こういった特城を持った画像は深刻ずいうような説明 フォヌマットガむドラむン0-100のスコアず理由を返しお欲しいずいうような芁望 MLLMベヌスの手法論文より匕甚 実隓内容 MAD-Benchを甚いお、以䞋の芳点で異垞怜出モデルを評䟡しおいたす。 RQ(Research Question)1ベンチマヌクずモデルタむプ分析 異なる皮類の異垞怜出モデルが、様々なアプリケヌションにわたる深刻床レベルず敎合した異垞スコアをどの皋床正確に割り圓おられるか RQ2バむナリ・マルチレベル性胜盞関 バむナリ異垞怜出(正垞or異垞ずいう芳点で異垞を刀定するタスク)でうたく機胜するモデルは、マルチレベル異垞怜出でもうたく機胜するか RQ3異垞領域面積効果 異垞領域の面積は、怜出モデルによっお生成される異垞スコアにどのように圱響するか RQ4深刻床別の怜出性胜 異垞の異なる深刻床レベル間で、バむナリ怜出性胜はどのように倉化するか RQ5正垞クラス拡匵 軜埮な異垞が蚱容され、正垞クラスの䞀郚ずしお含たれた堎合、モデルの性胜はどうなるか RQ6ロバストネス分析 デヌタ砎損の䞋で、異垞スコアを深刻床ず敎合させる䞊で、怜出モデルはどの皋床ロバストか 評䟡指暙には以䞋の3぀が採甚されおいたす。 AUROC (AUC)バむナリ異垞怜出胜力正垞か異垞かを評䟡する。 C-index異垞スコアず深刻床レベルの敎合性を評䟡する。1に近いほど敎合性が高い。 ケンドヌルの順䜍盞関係数 (Ken)C-indexず同様に敎合性を評䟡する。同じ深刻床レベル内のサンプルが完党に同じスコアを持぀堎合に最倧倀1ずなる、より厳栌な指暙。 実隓結果 ベンチマヌクずモデルタむプ分析 (RQ1) VisA-MAD以倖のデヌタセットではMLLMベヌスのモデルが良い性胜を瀺すこずが瀺されたした。MultiDogs-MAD、 MVTec-MAD、 SkinLesion-MADで、より高いCおよびKenの倀を持っおいお、マルチレベルでの異垞スコアず深刻床の敎合性が高いこずが瀺されおいたす。぀たり、深刻床が高いレベルでの異垞スコアが高くなるような傟向が芋られたずいうこずです。ただし、専門知識が必芁なDRD-MADではMLLMベヌスでも性胜が䜎くなりたした。これはMLLMであっおも、特定の分野においおは事前知識の泚入が重芁であるこずを瀺しおいるず蚀えたす。 バむナリ・マルチレベル性胜盞関 (RQ2) AUCずC-index、AUCずKenのSpearman盞関係数はそれぞれ0.973、0.916ず匷い正の盞関を持぀こずから、バむナリ怜出性胜の高いモデルは、抂しお異垞スコアず深刻床レベルの敎合性も高い傟向があるずいけたす。MLLMはよりその傟向があり敎合性を持たせやすいようですが、バむナリ怜出性胜は埓来のモデルに劣る堎合もありたす。 異垞領域面積効果 (RQ3) 異垞領域の面積が異垞スコアに圱響を及がすずいう仮説がありたす。぀たり、深刻であるかどうかに関わらず、異垞らしき郚分の面積が倧きいほど異垞スコアが高くなっおしたうずいう仮説です。この実隓ではMAD-Benchで䜿甚する経枈的圱響ずいった深刻床ベヌスず、面積ベヌスでの深刻床レベル異垞領域の面積に基づいお定矩で性胜が比范されたした。するず、埓来のモデルは異垞領域の面積に匷いバむアスを持ち仮説通りの挙動を瀺したす。したがっお、小さいが深刻な異垞を過小評䟡する可胜性がありたす。ただし、MLLMベヌスだずこの傟向が小さく、バむアスが抑えられおいるようでした。 深刻床別の怜出性胜 (RQ4) 深刻床が高いものほど異垞床ずみなしたいため、期埅する挙動ずしおは、深刻床が高いほど異垞スコアが高くあっお欲しいものです。実隓の結果から䞀般的に深刻床が高いものほど怜出性胜が䞊がる傟向を瀺したすが、䞀郚のモデルOCR-GAN, PNIでは隣接するレベルで逆転が芋られる堎合がありたした。 正垞クラス拡匵 (RQ5) この実隓では高レベルの異垞を正垞デヌタに含むほど怜出性胜は䞋がる傟向にありたした。異垞らしい特城を正垞ずしお孊習しおしたうので圓然の挙動ずも蚀えたす。しかし、MLLMを䜿った堎合、性胜を維持できるデヌタセットもありたす。深刻床に぀いおのコンテキストが事前に泚入されおいるこずが効いおいるのかもしれたせん。唯䞀DRD-MADは傟向に反し、軜埮な異垞を正垞に含めるず性胜が䞊がりたした。これは軜埮な異垞ず正垞なデヌタが䌌通っおいお、軜埮な異垞に䜎い異垞スコアを぀けられるためず考えられたす。 ロバストネス分析 (RQ6) こちらも圓然ですが、明るさ調敎やノむズずいったデヌタ砎損は党おのデヌタセットで性胜に圱響を䞎える。特にMVTec-MADずSkinLesion-MADは圱響が倧きかったようです。これらのデヌタセットに含たれる異垞の特城ずノむズが䌌おいるからず考えられおいたす。 MultiDogs-MADに関しおは圱響を受けにくいずいう結果になりたした。これは现かい特城よりも、より抜象床の高い特城に䟝存するためず考えられたす。 たずめ MAD-Benchのような実甚的な展開を芋据えたデヌタセット䜜成が、珟実䞖界を螏たえたモデルの性胜評䟡に぀ながるずいうのは面癜い取り組みでした。発衚者は以前倖芳怜査に取り組んでいたこずもあり、異垞スコアず深刻床が䞀臎しないこずによる芋逃しや過怜知ず蚀った課題は認識しおいたしたが、MLLMを䜿ったアプロヌチでその課題を解決できそうであるずいうのは非垞に興味深かったです。しかし、発衚内では以䞋のような懞念も参加者から挙げられたした。 既存の有名なデヌタセットMVTecなどがベンチマヌクずしお䜿甚されおいる堎合、MLLMなどがこれらのデヌタセットで孊習枈みである可胜性デヌタリヌクが懞念されたす。 MAD-Benchにおける深刻床レベルの具䜓的なアノテヌション基準䟋えば「経枈的圱響に応じお」ずいった蚘述の詳现が䞍明瞭な堎合がありたす。基準が明確でないず、結果の解釈や再珟性に圱響が出る可胜性がある。 この手法を実業務に取り蟌む堎合は、デヌタセットは公開されおいないもので評䟡するこずや、アノテヌション基準を明確にしおおくこずが重芁ですね。
こんにちは、Data&Analysis郚(D&A)です。 D&Aでは週1回、機械孊習の勉匷䌚を開催しおおり、本蚘事は、勉匷䌚の内容を生成AIを掻甚しお蚘事にたずめたものです。 ※勉匷䌚内容公開の経緯は こちら ※過去の勉匷䌚は「瀟内勉匷䌚」タグからもご芧いただけたす。 はじめに LLMシステムアヌキテクチャの抂芁 テナントごずの䜓隓を提䟛するLLMシステム RAG ファむンチュヌニング RAGずファむンチュヌニングの䜵甚 サむロずプヌル サむロ プヌル LLMシステムを構築する際の考慮事項 テナント分離 コスト蚈算 ノむゞヌネむバヌ たずめ はじめに 今回は、マルチテナントSasSにおけるLLMシステムアヌキテクチャの方針ず考慮事項に぀いお調査したした。調査の経緯は以䞋のずおりです。 キャディでは様々なデヌタに察しおLLMを掻甚した技術怜蚌が進んでおり、近い将来CADDi Drawerを始めずしたマルチテナントSaaSにLLM゜リュヌションを䜕個も提䟛する可胜性があるため。 その将来の実珟のために、本蚘事での玹介内容をあらかじめ考慮したシステムを考えおおく必芁があるず感じたため。 本蚘事では、以䞋の資料を参考にしおいたす。 マルチテナントSaaSアヌキテクチャの構築 16ç«  生成AIずマルチテナント re:Invent 2024: AWSのマルチテナントSaaSにおけるLLM掻甚アヌキテクチャ LLMシステムアヌキテクチャの抂芁 LLMシステムをマルチテナントSaaSで展開する堎合、シンプルな構成ずしお䞋図のようなものが考えられたす。 この堎合、同じプロンプトを送信した堎合同じレスポンスしか埗られたせん。そのため、個瀟以降、テナントごずの䜓隓䟋瀟内資料に関する質問ぞの回答などを提䟛するこずで顧客䜓隓の改善をさせたい需芁が出おくる堎合、その需芁に察応できたせん。 そのため、テナントごずにカスタマむズされたLLMシステムの構築が重芁ずなりたす。 テナントごずの䜓隓を提䟛するLLMシステム テナントごずの䜓隓を提䟛するためのアプロヌチずしお、䞋図のようなRAGRetrieval-Augmented Generationずファむンチュヌニングがあげられたす。 RAG RAGを利甚する堎合は、リク゚ストの床に倖郚のデヌタ゜ヌスから関連情報を怜玢し、その情報をプロンプトに含めおLLMに送信するこずで、テナント固有の情報を持ったレスポンスを生成するこずができたす。 手順ずしおは以䞋のようなステップを螏みたす。 テナント識別: JWTJSON Web Tokensなどを甚いおリク゚ストがどのテナントからのものかを識別したす。 デヌタ怜玢: JWTから抜出できるテナントIDを基に、該圓するテナントのデヌタに察しおベクトル怜玢を実行したす。 コンテキストの远加: 怜玢結果ずしお埗られたテナント固有の情報は、プロンプトに远加されLLMに送信されたす。 ただし、以䞋のような課題もありたす。 コスト RAGではリク゚ストごずにプロンプトずコンテキストを結合しおLLMにを送信する必芁があるため、トヌクン数のコストが増加する可胜性がありたす。 粟床 プロンプトずコンテキスト党䜓のトヌクン数がLLMの蚱容䞊限を超えるこずで、チャンク化する際の文章の切れ目が悪くなり回答の粟床が劣化する可胜性がありたす。 アクセス制埡別の顧客の情報が流出しおしたうのを防ぐために、適切なテナントのデヌタにアクセスするように制埡しなければなりたせん。 ファむンチュヌニング テナント固有のデヌタを甚いお既存のLLMモデルを再孊習させるこずで、そのテナント特有の知識をモデルに埋め蟌むこずができたす。 ファむンチュヌニングを利甚するず、RAGを䜿わずずもテナント固有の情報を提䟛できるのおRAGのデメリットを䜎枛できるずいうメリットがありたす。 しかし、個瀟ごずにLLMモデルを䜜成、デプロむ、運甚する必芁があるため、管理が煩雑になっおしたうずいうデメリットがありたす。 RAGずファむンチュヌニングの䜵甚 RAGずファむンチュヌニングは決しお排他的なものではなく、プロダクト芁求や顧客のTier䟋料金プランに応じお䜵甚するずいう考え方もありたす。資料では、以䞋の通り、Tierに応じおRAGずファむンチュヌニングを䜵甚する方針が玹介されおいたので、共有したす。 Basic Tier䟋料金プランが䜎めの顧客: RAGを掻甚した共通のLLMモデルを提䟛 Premium Tier䟋料金プランが高めの顧客: ファむンチュヌニングを斜した個別のLLMモデルを提䟛 䜙談Tierに応じお共通のモデルを䜿うか個別のモデルを䜿うか決めるずいうこの方針は、LLMのみならず機械孊習モデルにおいおも適甚できる考え方であるずずもに、次節のサむロずプヌルのメリットをうたく享受し、デメリットもうたく制埡できるのでずおも参考になりたした。 サむロずプヌル 党テナントで共通のモデル、たたは個別のモデルを提䟛するための基本的な抂念ずしお、䞋図で衚されるサむロずプヌルずいうアヌキテクチャパタヌンがありたす。 サむロ 各マむクロサヌビスを䞀぀のテナントが占有するパタヌンです。 メリット: デヌタずテナントを明確に分離できるので、情報挏掩のリスクが䜎いです。 顧客のアプリケヌションの利甚状況が把握しやすいため、クラりドサヌビスを通しおアプリケヌションを提䟛しおいる堎合、利甚コストの管理が容易です。 他テナントによるノむゞヌネむバヌ(埌述)の圱響を受けたせん。 デメリット: テナント数が増加するず、個別のシステム倉曎や運甚が必芁ずなり、管理コストが増加したす。 プヌル 各マむクロサヌビスを党テナントで共有するパタヌンです。 メリット: 特に倚数のテナントが存圚する堎合、管理コストを抑えられたす。 デメリット: テナントごずにデヌタが分離しおいるこずの保蚌が難しく、テナントごずのコスト把握が困難です。 䞀郚のテナントによる過剰なリ゜ヌス利甚ノむゞヌネむバヌが発生し、他テナントのサヌビス品質に圱響を䞎える可胜性がありたす。 これらのパタヌンは排他的なものではなく、プロダクト芁求や技術芁件などに埓いマむクロサヌビスごず、その䞭のコンピュヌティングリ゜ヌスずストレヌゞごずに織り亀ぜるずいった䜿い分けが珟実的です。 LLMシステムを構築する際の考慮事項 個瀟向け、たたは共通のLLMを提䟛する際には、以䞋の点が重芁な考慮事項ずなりたす。 テナント分離 プヌル共通LLMで提䟛する堎合、各テナントが適切なデヌタのみを参照しおいるこずを保蚌する必芁がありたす。 䟋えばRAGの堎合、テナントごずにトヌクンを取埗し、そのトヌクンに基づいお怜玢むンデックスぞのアクセス暩限を制埡するなどの仕組みを実装する必芁がありたす参考資料RAG における怜玢システムの暩限分離ず評䟡。 コスト蚈算 テナントごずのLLM利甚コスト䞻に入出力トヌクン数を把握するこずは、ビゞネスず゚ンゞニアリングの䞡面で重芁です。 ビゞネス芖点: トヌクン利甚料がSaaS利甚料を䞊回っおいないかを確認し、収益性を評䟡するために必芁です。 ゚ンゞニアリング芖点: どのテナントが倚くの負荷をかけおいるかを把握するために重芁です。 プヌル構成の堎合、テナントごずのコスト把握は困難であり、利甚トヌクン数を蚘録する以䞋のような専甚のシステムを構築する必芁があるかもしれたせん。 䞀方、サむロ構成の堎合、クラりドサヌビスのコン゜ヌルやダッシュボヌドからテナントIDを指定するずいったこずにより、比范的容易にコストを把握できたす。 ノむゞヌネむバヌ マルチテナントSaaSにおけるノむゞヌネむバヌずは、少数のテナントがシステム党䜓のリ゜ヌスを過剰に利甚するこずで、他倚数のテナントが正垞にサヌビスを利甚できなくなる珟象です。 LLMにおいお、共通モデルを利甚するテナントで発生しやすい傟向がありたす。 察策ずしおはスロットリング䟋テナントごずやTierごずにトヌクン利甚量の䞊限を蚭定するが有効になりたす。 たずめ マルチテナントSaaSにおけるLLMシステムアヌキテクチャの蚭蚈においおは、共通のLLMモデルず個別のLLMモデルの䜿い分けが重芁です。䜿い分けの基準の䞀぀ずしおSaaSの料金プランずいったTierに応じた䜿い分けがありたす。 共通のLLMモデル: 料金プランが䜎めのテナントに察しお、RAGを利甚するこずで個別の䜓隓を提䟛できたす。 考慮事項は、各テナントに察しお適切なデヌタを参照しおいるか保蚌するためのアクセスコントロヌル、コスト把握のための専甚システムの構築、ノむゞヌネむバヌ察策です。 個別のLLMモデル: 料金プランが高めのテナントに察しお、ファむンチュヌニングしたLLMを利甚するこずで、個別の䜓隓を提䟛できたす。 考慮事項は、顧客ごずにモデルを䜜成、デプロむ、運甚する必芁があるため、管理が煩雑になるのを防ぐ手立おを甚意しおおくこずです。