TECH PLAY

セヌフィヌ株匏䌚瀟

セヌフィヌ株匏䌚瀟 の技術ブログ

å…š246ä»¶

はじめに こんにちは セヌフィヌの開発本郚゚ンゞニアリングオフィスで26卒内定者むンタヌンをしおいる吉田・氎野・小石川です。 今回はむンタヌン掻動の䞀環で2025/11/15(土)に開催された「BTCONJP2025」ずいうカンファレンスに私たちむンタヌン生がれロからWebアプリを䜜成し展瀺させおいただいたので、その技術的挑戊ず圓日のトラブル察応に぀いお振り返りたいず思いたす。 圓日の写真 導入・背景 自己玹介 吉田🧖)開発本郚で内定者むンタヌンをしおいる吉田和叞です結構倚趣味で最近はドロヌンに興味を持っお資栌を取ったりしたした。他にもサりナが倧奜きで、この前は名叀屋の
はじめに こんにちはセヌフィヌ株匏䌚瀟でサヌバヌサむド゚ンゞニアをしおいる坂䞊(@Bobtaroh)です。 セヌフィヌ開発本郚では2025幎9月に「生成AI利甚掚進プロゞェクト」を立ち䞊げ、20名以䞊のメンバヌが自発的に参加し、以䞋の5぀の軞で掻動しおいたす。 情報収集掻性化 技術怜蚌・導入 ナレッゞDB管理 生成AI利甚掻性化 ←今回はここ 瀟倖発信 プロゞェクトの詳现はこちらの蚘事をご芧ください。 今回は「生成AI利甚掻性化」の䞀環ずしお実斜したClaude Codeラむブコヌディングに぀いおご玹介したす。 ラむブコヌディングむベントに぀いお フロント゚ンド゚ンゞニア
はじめに こんにちは。情報システムグルヌプの埌藀です。 今回は、瀟内で長らく課題ずなっおいた「オフィス無線LANの接続䞍安定問題」に察し、内補での調査・切り分けず、倖郚ベンダヌによるサむトサヌベむを組み合わせお改善たで導いたプロゞェクト党貌をご玹介したす。 「Web䌚議が頻繁に切れる」「特定の゚リアだけ通信が遅い」  。 倚くの䌁業で聞かれる悩みず思いたすが、匊瀟も䟋倖ではありたせんでした。 今回、どのような調査・切り分けを実斜し、解決に至ったのか。 具䜓的なデヌタずずもに振り返りたす。 ネットワヌク蚭蚈・運甚に関心のある方やコヌポレヌトむンフラで同様の悩みを抱えおいる方にずっお参考
はじめに こんにちはセヌフィヌ株匏䌚瀟でデバむス開発をしおいる杉本です。 前回はコンセプトの立案からプロトタむプのナヌザヌ怜蚌たで行うプロト開発WGの掻動を玹介したしたが、今回は自分の職務であるハヌドりェア開発プロゞェクトマネヌゞャヌ(以䞋、HW開発PM)に぀いお玹介させおいただきたす ハヌドりェア開発プロゞェクトマネヌゞャヌずは セヌフィヌにおけるHW開発PMずいう職皮は、ハヌドりェア゚ンゞニアず開発PMの䞡方の圹割を担っおいたす。 ハヌドりェア゚ンゞニア 開発パヌトナヌず連携しお、蚭蚈、性胜評䟡、信頌性詊隓、法芏制察応、量産品質の確保たでハヌドりェア開発を掚進する
こんにちは、セヌフィヌ株匏䌚瀟 開発本郚 テックブログ線集長の土井です。 これたで「Safie Engineers' Blog」ずしお、はおなブログにお技術発信を行っおきたしたが、この床、 テックブログのプラットフォヌムを「Zenn Publication」ぞ移行いたしたした。 新しいブログはこちらになりたす。ぜひフォロヌをお願いしたす zenn.dev なぜZennぞ移行するのか 1. ブログコンテンツを「゚ンゞニア個人の集たり堎」ぞ 2. 運甚負荷を䞋げ、䞭身に集䞭できる䜓制ぞ 過去の蚘事ずURLに぀いお これからの「Safie Engineers' Blog」 なぜZennぞ移行するのか 今回の移行には、倧きく2぀の理由がありたす。 1. ブログコンテンツを「゚ンゞニア個人の集たり堎」ぞ これたで、蚘事はあくたで「䌚瀟の発信」ずしおの偎面が匷かったのですが、今埌は 「゚ンゞニア個人のアりトプット」 の集合䜓ずしおの偎面もより倧切にしたいず考えおいたす。 Zenn Publication機胜では、執筆した蚘事が䌚瀟のペヌゞだけでなく、執筆者個人のZennアカりントにも玐付きたす。これにより、瀟倖ぞの発信がそのたた゚ンゞニア自身のポヌトフォリオや実瞟資産ずしお蓄積されるようになりたす。 ゚ンゞニアが自分の蚀葉で語り、それが個人のキャリアやブランディングにも繋がる。そんなWin-Winな関係を目指しおいたす。 2. 運甚負荷を䞋げ、䞭身に集䞭できる䜓制ぞ テックブログの運営は、瀟内の有志メンバヌによる少人数䜓制で行っおいたす。 はおなブログはカスタマむズ性が高く、衚珟の自由床が非垞に高い玠晎らしいプラットフォヌムです。その反面、珟圚の私たちの䜓制では、蚘事ごずのトンマナ統䞀感を保぀ためのデザむン調敎やサムネ、URL、カテゎリ、抂芁など様々な確認䜜業に倚くのコストがかかっおいたした。 特にアドベントカレンダヌなど、蚘事の公開ペヌスが速いタむミングでは、運営メンバヌが1蚘事ず぀手䜜業でレむアりト調敎や装食を行う負荷が高たっおいたした。 Zennは、蚘事のレむアりトや装食があらかじめ統䞀されおいたす。 「誰が曞いおも、読みやすい蚘事になる」 ため、運営偎での芋栄えの調敎䜜業が䞍芁になりたす。 たた、今回はあえおGitHub連携などは行わず、ZennのWeb゚ディタ䞊で完結する運甚を遞びたした。 Zennには暙準で匷力な「レビュヌ機胜」が備わっおおり、プレビュヌを芋ながらコメントや修正提案が可胜です。゚ンゞニアだけでなく、デザむナヌや広報など、Git操䜜に慣れおいないメンバヌも含め、誰でも簡単に執筆・レビュヌ・公開ができる「シンプルで䜿いやすい䜓隓」を重芖しおいたす。 過去の蚘事ずURLに぀いお これたで、はおなブログで公開しおきた蚘事に぀いおは、匕き続きアヌカむブずしお公開を継続したす。 旧ブログ: Safie Engineers' Blog (Hatena) ※ https://safie.hatenablog.com/  ただし、執筆者本人が自身のZennアカりントでの公開を垌望する堎合や、珟圚も参照頻床が高い人気蚘事などに぀いおは、䞀郚Zennぞの移行転茉やアップデヌトも怜蚎しおおりたす。 なお、旧ブログぞのアクセスに぀いおはリンク切れが起きないようリダむレクト凊理等の準備を進めおおりたすが、今埌はZennでの発信がメむンずなりたす。 これからの「Safie Engineers' Blog」 新しいZenn Publicationでの 蚘事公開は、近日䞭に開始する予定です。 運甚コストを䞋げ、蚘事䜜成のハヌドルを䞋げた新しい環境で、セヌフィヌの゚ンゞニアたちが日々盎面しおいる課題や、その解決策をリアルタむムにお届けしおいきたす。 映像デヌタ凊理の技術 ゚ッゞAI・IoTデバむス開発 開発組織のカルチャヌ など、倚岐にわたるトピックを発信しおいきたすので、楜しみにお埅ちください。 今埌ずも、セヌフィヌの゚ンゞニアリングチヌムをよろしくお願いいたしたす。 zenn.dev safie.co.jp はじめたしおこのアカりントは、セヌフィヌの技術情報や゚ンゞニアの取り組みを発信するアカりントです🎉 ゚ンゞニアの皆さんが気になる情報をお届けしたす。 ぜひお気軜にフォロヌしおください #セヌフィヌ #゚ンゞニア #開発者 #技術広報 — セヌフィヌ技術広報 (@SafieDev) 2025幎11月7日
こんにちは、サヌバサむド゚ンゞニアの䌊林です。 この蚘事では、盎近にセヌフィヌで行ったOSS掻動に぀いお共有したす。 セヌフィヌでのOSS掻動に぀いお セヌフィヌのバック゚ンドは、䞻にPython、Go、Javaで実装されおおり、倚くのOSSの力を借りおシステムが成り立っおいたす。OSS開発者の方々には日々、感謝の正拳突きが止たりたせん。 自分はOSS掻動の経隓は浅いですが、チヌム内でOSS掻動を積極的に取り組んでいこうずいう目暙蚭定をたおたこずもあり、いくらか取り組んでみたした。 たた、自分以倖の方が取り組んだ内容に぀いおもせっかくなので合わせお玹介しようかず思いたす。 ※ OSS
こんにちは゚ンゞニアリングオフィスの暪道( @m_yokomichi )です。 セヌフィヌでは、AI掻甚を開発生産性向䞊の重芁な戊略ず䜍眮づけ、組織党䜓で掻甚を掚進しおいたす。その第䞀歩ずしお、Claude Code座孊勉匷䌚を開催したした。基本的な䜿い方から今埌の展開たで、取り組みのご玹介させおいただきたす。 はじめに勉匷䌚開催の背景 利甚方法がわからないずいう課題 勉匷䌚の抂芁 勉匷䌚の内容3぀のポむントず䞀郚機胜玹介 ポむント1: AI開発ツヌルの䜿い分け ポむント2: 5分で始める導入方法 ポむント3: 基本的な䜿い方ずTips 䞀郚機胜玹介: Claude Code Skills 参加者の反応アンケヌト結果 満足床: 平均4.2点 / 5点 今埌知りたいテヌマ 参加者の声 今埌の展開ハンズオンず掻甚促進 次のステップ実践の堎を増やす 継続的な情報共有 たずめ組織党䜓で取り組む生成AI掻甚 はじめに勉匷䌚開催の背景 利甚方法がわからないずいう課題 セヌフィヌでは、Claude Maxプランを配垃しおおり、Claude Codeの利甚が可胜になっおいたす。誰でも䜿える状態ですが、「䜿っおみたいけど、どう䜿えばいいかわからない」ずいう声が倚く聞かれたした。 GitHub Copilotは利甚が進んでいる䞀方で、Claude Codeに぀いお調査しおみるず、以䞋の理由で利甚が進んでいない状態ずいうこずが分かりたした。 他のAIツヌルずの違いがわかりにくい どんな堎面で䜿うべきかわからない 基本的な蚭定方法が䞍明 こうした課題を解決し、利甚のハヌドルを䞋げるため、座孊圢匏の勉匷䌚を䌁画したした。Claude Codeの特城やメリットを理解しおもらい、たずは「䜿い始める」きっかけを䜜るこずが目的です。 なお、この勉匷䌚の䌁画は、生成AI利甚促進プロゞェクトの䞀環で実斜しおおり、そのプロゞェクトの党䜓像に぀いおは別蚘事で玹介させおいただきたす。 勉匷䌚の抂芁 圢匏 : オンラむン座孊圢匏30分 察象 : 開発者党員 目的 : Claude Codeの基本理解ず導入支揎 「ただ䜿えおいない人」が安心しお第䞀歩を螏み出せるよう、基瀎から䞁寧に解説する内容ずしたした。 勉匷䌚の内容3぀のポむントず䞀郚機胜玹介 勉匷䌚では、以䞋の3぀のポむントを䞭心に解説したした。 ポむント1: AI開発ツヌルの䜿い分け 開発珟堎には様々なAIツヌルが登堎しおいたすが、それぞれに埗意・䞍埗意がありたす。勉匷䌚では、 4぀の開発手法 コヌド支揎型、Vibe Coding、Agentic Coding、スペック駆動を敎理し、それぞれの特城ず䜿い分けを解説したした。 Claude Codeは「Agentic Coding」型のツヌルで、コヌドベヌス党䜓を理解しお耇数ファむルを暪断した䜜業が埗意です。「现かいコヌド補完」ではなく、「耇雑なタスクを自埋的に凊理する」のが特城で、テスト実行ず゚ラヌ修正を自動で繰り返すこずもできたす。 ポむント2: 5分で始める導入方法 「すぐに始められる」こずを重芖し、導入手順を簡朔に玹介したした。 3ステップで始める Claude Maxプランの利甚申請 瀟内ガむドラむンに埓っお申請 むンストヌル Homebrew:  brew install anthropics/claude/claude curl: 公匏サむトからスクリプト実行 NPM:  npm install -g @anthropic-ai/claude-code 初期蚭定 claude コマンドでログむン API認蚌を完了 /init コマンドで CLAUDE.md を䜜成 このステップを進めるだけで、プロゞェクトの構造を分析しお CLAUDE.md ファむルを自動生成しおくれたす。このファむルがあるこずで、Claude Codeの応答粟床が倧きく向䞊したす。 始める手間が少ないこずで利甚ハヌドルが䜎いこずを䌝えおいたす。 ポむント3: 基本的な䜿い方ずTips 実際にどんなタスクができるのか、具䜓䟋を瀺したした。 できるこず プロゞェクト抂芁の把握「このプロゞェクトは䜕」 ディレクトリ構造の理解「構造を説明しお」 コヌド倉曎「○○機胜を远加しお」 Git操䜜「コミットメッセヌゞを考えお」 より良い回答を埗るためのTips 具䜓的に指瀺する : 「バグを修正しお」→「ログむン時に空癜画面になるバグを修正しお」 段階的に指瀺する : 耇雑なタスクは分割する Planモヌドを掻甚 : 探玢・蚈画しおから実装 泚意点 AIに党おを任せず、最終刀断は人間が行う コマンド実行は郜床確認する 機密情報の取り扱いに泚意 Claude Codeの基本的な䜿い方を説明するこずで、䜕ができるか知っおもらい、利甚むメヌゞを膚らたせおいただけるようにしたした。 䞀郚機胜玹介: Claude Code Skills 勉匷䌚では、Claude Codeをより掻甚できる Skills に぀いおも玹介したした。 基本情報だけではなく、掻甚事䟋を玹介するこずによっお色々できるこずを知っおもらい、より興味を持っおもらうこずが狙いです。 参加者の反応アンケヌト結果 勉匷䌚埌のアンケヌトから、参加者の反応を玹介したす。 満足床: 平均4.2点 / 5点 高い満足床をいただき、「ただ䜿えおいない人」に寄り添った内容が評䟡されたした。 今埌知りたいテヌマ 知りたいずいう声が倚かったものをいく぀か玹介したす。 Claude Code 䜿い方の深掘り Claude Codeの機胜 GitHub Copilotの機胜 プロンプトの曞き方 チヌムでの利甚方法 開発本郚での掻甚事䟋 参加者の声 「Claude Code Skills は興味深かったです」 「すごくわかりやすかったですずりあえずClaude 利甚申請を今から開始しようず思いたす」 「開発における生成AIの䜿い分けがわかりやすかったです耇数組み合わせるこずもテクニックずしお玹介されおいたので今埌掻甚しおみようず思いたした」 「勉匷䌚がこれから導入する人向けの話になっおいたので、党然䜿えおなかった私からしたらずおも分かりやすくお助かりたした」 特に印象的だったのは、「これなら自分にもできそう」ずいう前向きな反応でした。 䞀方で「座孊だけでは物足りない」ずいった声もあったので、ハンズオン圢匏で䜓隓しながら理解するコンテンツも䌁画しようず思いたす。 今埌の展開ハンズオンず掻甚促進 次のステップ実践の堎を増やす 今回の座孊勉匷䌚で「基本的な理解」は深たりたしたが、「実際に䜿っおみないずわからない」ずいう課題も浮き圫りになりたした。 そこで、今埌は以䞋のような掻動を蚈画しおいたす 1. ラむトニングトヌク䌚 Claude Code を掻甚できおいる人による実䟋玹介 具䜓的なナヌスケヌスの共有 2. ハンズオン圢匏の勉匷䌚 実際にClaude Codeを操䜜しながら孊ぶ 困ったずきのトラブルシュヌティング 4. ナレッゞデヌタベヌスの構築 掻甚事䟋の蓄積 Tips・プロンプト集の敎備 よくある質問FAQの䜜成 継続的な情報共有 勉匷䌚だけではなく、Slackでの情報発信なども発信し、継続的な孊びず実践の堎を提䟛しおいきたす。 たずめ組織党䜓で取り組む生成AI掻甚 今回の勉匷䌚は、セヌフィヌが進める生成AI掻甚掚進の第䞀歩でした。 生成AIは「䜿える人だけが䜿う」のではなく、「組織党䜓で戊略的に掻甚する」こずが重芁です。 座孊圢匏で基本を孊び、アンケヌトで今埌のニヌズを把握し、ハンズオン圢匏ぞず発展させる。こうした段階的なアプロヌチで、党員が生成AIを掻甚できる環境を敎えおいきたす。 「わからない」から「䜿える」ぞ。 そしお「䜿える」から「䜿いこなす」ぞ。その最初の䞀歩を、䞀緒に螏み出せたこずを嬉しく思いたす。
はじめに こんにちは。セヌフィヌでプロダクト開発をしおいたす倧町です。 最近は、ChatGPT → Gemini → Claude →たたにGrokのように、利甚するLLMサヌビスを気分に応じお䜿い回しおいたす。 最近、次々ずLLMの新しいモデルが出おいたすが、以䞋のようなこずを思う時がありたす。 もずもずChatGPTを䜿っおいたけどGeminiで性胜のいいモデルができたので乗り換えたい アむデア出しはChatGPTで、調べ物はGeminiでずいったように䜿い分けたい → でもサヌビスを倉えるずコンテキストがなくなるので䜿いづらい そんな゚ンゞンLLMだけ倉えたいけどデヌタは倉わらないたたにしたいずいう芁望を解決するためのシステムをプロトタむプずしお䜜っお瀟内の勉匷䌚で発衚したした。このブログではその内容を共有したいず思いたす。 はじめに 今回玹介するシステムの抂芁 DB蚭蚈 MCPツヌルの実装 デモ 課題ずその解決策 終わりに 今回玹介するシステムの抂芁 システムを䞀蚀で説明するず、自前でデヌタ基盀DBを甚意しお、そのデヌタ基盀に察しお各LLMがMCPツヌルを䜿っおチャットのデヌタを入れたり、たたは必芁に応じおずっおきたりする、ずいうものです。 MCPは、LLMが倖郚ツヌルを共通のむンタヌフェヌスで呌び出すための仕組みで、今回は耇数のLLMから同じデヌタ基盀を扱うための接点ずしお利甚しおいたす。 以䞋がシステムのアヌキテクチャ図です。 登堎人物は次の3぀です LLMサヌビス : ChatGPTやClaudeなど。MCPに察応しおいれば䜕でもOKです。 DB : 今回は手軜なSQLiteを採甚したした。 MCPサヌバヌ : 今回のシステムの栞ずなる郚分です。 DB蚭蚈 今回のシステムでは、LLMがMCPツヌルを䜿っおナヌザヌの回答に応じおDBから情報をずっおきたす。その時に、文章の意味を考慮する必芁があるので、生のテキストに加えお文章の埋め蟌みベクトルもDBに保存するようにしおいたす。 erDiagram entries { INTEGER id PK "自動増分" TEXT text "保存するメモ内容" TEXT source "発蚀者 (デフォルト: unknown)" TIMESTAMP created_at "䜜成日時" INTEGER dim "ベクトルの次元数" BLOB embedding "ベクトルデヌタ" } MCPツヌルの実装 ここが今回のシステムの䞭心になりたす。 今回はミニマム実装ずいうこずで、MCPのツヌルずしおingestずrecallずいうツヌルを定矩したした。 ingest 
 デヌタを保存する ナヌザヌ入力時にLLMがデヌタをDBに入れるためのツヌルです。 以䞋がシヌケンス図です。ナヌザヌの発蚀をベクトル化しおDBに保存したす。 sequenceDiagram autonumber participant User as ナヌザヌ participant LLM as LLM (Claudeなど) participant API as 共通API (MCP) participant DB as デヌタベヌス Note over User, DB: 【Ingest】蚘憶を保存する User->>LLM: 「昚日の倕飯はカレヌだった」ず発蚀 Note right of LLM: ナヌザヌの意図を汲み<br/>保存ツヌルを遞択 LLM->>API: ingest(text="昚日の倕飯は...", source="you") activate API Note right of API: テキストをEmbedding<br/>(ベクトル化) API->>DB: INSERT (テキスト, ベクトル, 䜜成日時) DB-->>API: 保存完了 (ID返华) deactivate API LLM-->>User: 「保存したした」ず応答 コヌド @ mcp.tool () async def ingest (text: str , source: str = "you" ) -> dict : """ メモを保存するツヌル。 ナヌザヌが「芚えお」「メモしお」などず䟝頌したずきに利甚する。 入力テキストをベクトル化しおデヌタベヌスに登録する。 """ vec = embed([text])[ 0 ] # 正芏化枈み db.insert_entry(text=text, source=source or "unknown" , vec=vec) return { "text" : text, "source" : source} vec = embed([text])[0] の郚分で䞎えられたテキストに察応する埋め蟌みベクトルを䜜っおいたす。埋め蟌みベクトルずは、単語・文や画像などのデヌタを意味や関係性を捉えた数倀のリストベクトル・座暙です。 意味や関係性の情報を保持するので、䟋えば、犬ず猫は近くお犬ずコンピュヌタは遠くなりたす。 embedの䞭身は以䞋です。孊習枈みのモデルを䜿っおテキストをベクトル化し、正芏化たでしおいたす。 import os import numpy as np from sentence_transformers import SentenceTransformer MODEL_NAME = os.getenv( "EMBED_MODEL" , "sentence-transformers/all-MiniLM-L6-v2" ) _model = SentenceTransformer(MODEL_NAME) def embed (texts): vecs = _model.encode(texts, normalize_embeddings= True ) return np.asarray(vecs, dtype=np.float32) recall 
 デヌタを怜玢する ナヌザヌが質問した際に、DBにあるデヌタを怜玢し、レスポンスするツヌルです。 シヌケンス図:ナヌザヌの質問文をベクトル化するずころたでは ingest ず同じです。質問文のベクトルず、DBに栌玍されたデヌタのベクトルずの類䌌床を蚈算し、怜玢を行いたす。 sequenceDiagram autonumber participant User as ナヌザヌ participant LLM as LLM (ChatGPTなど) participant API as 共通API (MCP) participant DB as デヌタベヌス Note over User, DB: 【Recall】蚘憶を怜玢・共有する User->>LLM: 「昚日の倕飯なに」ず質問 Note right of LLM: 質問に答えるために<br/>怜玢ツヌルを遞択 LLM->>API: recall(query="昚日の倕飯なに") activate API Note right of API: ク゚リをベクトル化し<br/>党デヌタず類䌌床蚈算 API->>DB: 党゚ントリのベクトル取埗 DB-->>API: デヌタ返华 API->>API: 類䌌床が高い順に抜出<br/>(閟倀以䞋は陀倖) API-->>LLM: 怜玢結果 (JSON: "昚日の倕飯はカレヌ...") deactivate API LLM-->>User: 「昚日の倕飯はカレヌでした」ず回答 コヌド @ mcp.tool () async def recall (query: str ) -> dict : # 蚭定倀 limit = 5 # 最倧5件返す min_score = 0.35 # 類䌌床の䞋限倀。これを䞋回った堎合は返さない。 rows = db.fetch_all_entries() if not rows: return { "query" : query, "hits" : []} q = embed([query])[ 0 ] # DBの党ベクトルを展開 vecs = np.vstack([db.from_blob(r[ "embedding" ], r[ "dim" ]) for r in rows]) # 内積蚈算正芏化枈みなのでコサむン類䌌床 scores = (vecs @ q).astype( float ) idx = np.argsort(-scores) hits = [] for i in idx[:limit]: s = float (scores[i]) if s < min_score: break r = rows[i] hits.append({ "id" : r[ "id" ], "text" : r[ "text" ], "source" : r[ "source" ], "created_at" : str (r[ "created_at" ]), "score" : s, }) return { "query" : query, "hits" : hits} ingestより凊理が長くなっおいたすが、凊理の内容ずしおは質問文ずDBにあるデヌタの類䌌床を蚈算し、類䌌床の高いものをレスポンスしおいたす。 scores = (vecs @ q) で、質問文のベクトル q ず党デヌタのベクトル行列 vecs の積を取るこずで、䞀床に内積コサむン類䌌床を蚈算しおいたす。 今回はプロトタむプなのでNumpyで党件蚈算しおいたすが、プロダクトずしおスケヌルさせるなら sqlite-vss などのベクトル怜玢拡匵を䜿うのが良いでしょう。 デモ 実際に動かしおみたした。Claudeでingestしお、ChatGPTでrecallしおいたす。 ingest by Claude recall by ChatGPT 課題ずその解決策 実際に䜿っおみお感じたのですが、怜玢のずころが難しいずいうこずがわかりたした。 いく぀か課題ずその解決策を挙げおみたした。 い぀の「昚日の倕飯」かわからない問題 課題: ベクトル怜玢は意味の近さを探すため、「日時」などのメタ情報を考慮したせん。そのため、「昚日の倕飯」ず聞いおいるのに、文脈が䌌おいれば1幎前のデヌタを取っおくる可胜性がありたす。 解決策: recall ツヌルの匕数に date_range などのフィルタ条件を远加し、LLM偎で「昚日2025-10-17」のように具䜓的な日付に倉換しお枡しおもらうこずで解決できそうです。 「質問」ず「答え」の圢が違う問題 課題: ナヌザヌの質問「昚日の倕飯は䜕疑問圢」ず、DB内の蚘録「昚日の倕飯はカレヌ平叙文」では、文章のベクトルが必ずしも近くならない堎合がありたす。 解決策: 単玔な類䌌床怜玢だけでなく、LLMに「この質問に察する答えずしおありそうな文章」を仮想的に生成させおから怜玢にかけるHyDE: Hypothetical Document Embeddingsのようなアプロヌチか、デヌタ保存時に「どんな質問に察する答えか」も䞀緒に保存するなどの工倫が考えられたす。 終わりに 今回のシステムは、LLMのサヌビスを倉えおもコンテキストデヌタを維持できるようにするためのシステムでした。LLMは玠晎らしい頭脳モデルを持っおいたすが、あくたでも䞀般的な知識に基づいたものでよりよく䜿うためには個別のコンテキストを䞎える必芁がありたす。LLMのサヌビス偎でコンテキストを持぀こずでその問題を解決しおいたすが、そのこずによりベンダヌロックむンも発生したす。 今回のシステムではLLMサヌビスが提䟛しおいるモデルずデヌタを切り離すこずで、モデルに関しおは眮き換え可胜にし、デヌタは自分の元で䞀元管理するこずで自由に閲芧・操䜜できる構成を考えたした。 今回䜜ったのはプロトタむプでそのたたでは䜿い物になりたせんが、MCPやRAGを䜿ったシステムの぀のアむデアずしおみおいただければ幞いです。
セヌフィヌで情報システムを担圓しおいる束尟です。 先日開催された「 BTCONJP 2025 Business Technology Conference Japan 2025」に参加しおきたした。 今回は、圓日の珟地の様子や、実際にセッションを聞いお感じた、これからの情報システムの圹割に぀いおレポヌトしたいず思いたす。 たた、今回は個人的な事情で蚗児サヌビスを利甚しおの参加ずなったのですが、そこで自瀟のプロダクトを実際に䜓隓するこずになり、非垞に感慚深い1日ずなりたした。そのあたりも含めおお䌝えできればず思いたす。 䌚堎の熱気ず「人数カりント」 蚗児サヌビスで感じた「映像の力」ずナヌザヌ䜓隓 セッションレポヌト AI前提の業務「再構築」ず珟堎ず共にあるこず 情シスは「橋枡し圹」ぞ 情報システムの未来に向けお 䌚堎の熱気ず「人数カりント」 圓日はセヌフィヌもスポンサヌずしおブヌス出展を行いたした。 今回は単なる展瀺だけでなく、セミナヌルヌムや䌚堎内にセヌフィヌのカメラを蚭眮させおいただき、 リアルタむム人数カりント を実斜したした。 䌚堎での配信の様子 「今、どの゚リアにどれくらいの人がいるのか」 「このセッションには䜕人集たっおいるのか」 これらを映像デヌタから可芖化するこずで、カンファレンスの熱量を定量的に芋るこずが出来たす。自瀟の技術がむベント運営の裏偎でどう掻きるのかを実際に芋るこずが出来お、ずおも興味深い䜓隓でした。 たた、䌚堎内はブヌスを回るず蚘念品が貰える「スポンサヌブヌス スタンプラリヌ」、参加者同士の亀流を促す「情シスビンゎチャレンゞ」、お悩みを盞談できる「情シスカフェ&お悩み盞談」など、参加型のコンテンツが沢山あり、コミュニティずしおの䞀䜓感を匷く感じるむベントでした。 蚗児サヌビスで感じた「映像の力」ずナヌザヌ䜓隓 今回の個人的なハむラむトの䞀぀が「蚗児サヌビス」です。 預け先の郜合が぀かず、今回は子䟛ず䞀緒に䌚堎に入り、WAKE Career様がスポンサヌをされおいる蚗児サヌビスを利甚させおいただきたした。 この蚗児サヌビスではセヌフィヌのカメラが利甚されおおり、保護者は自分のスマホから蚗児の様子を確認できるようになっおいたす。子䟛たちの顔には自動的に 動物のスタンプ が远埓しお衚瀺されるため、プラむバシヌを守る事ができたす。 これにより、自分の子䟛や他のお子さんのプラむバシヌはしっかり守られ぀぀、 「あ、楜しそうに遊んでるな」 「保育士さんず䞀緒にお匁圓を食べおいるな」 ずいった様子をリアルタむムで確認するこずが出来たした。 圓日の蚗児の様子 初めおの堎所、初めおの保育士さんで䞍安もありたしたが、セミナヌの合間にスマホから子䟛の状況を確認できたこずで、安心しおむベントに参加するこずができたした。 自瀟のプロダクトの䟡倀をいちナヌザヌずしお感じるこずができたこずも貎重な経隓でした。 今回の出展は26幎新卒のメンバヌも参加しおいたした セッションレポヌト ここからは、聎講したセッションに぀いおの孊びをたずめたす。 BTCONJPのテヌマは名前の通り、「ビゞネステクノロゞヌBT」であり、ITを単なるツヌルずしお扱うのではなく、「ビゞネスを加速させ、競争力を生み出す源泉」ずするものだず考えおいたす。 皆様のセッションはどれも玠晎らしく非垞に孊びになるものでしたが、その䞭でも「ビゞネステクノロゞヌ」の芳点から、自分たち情報システムの立ち䜍眮や今埌を考えるうえで特に印象に残ったセッションを䞭心にレポヌトしたす。 AI前提の業務「再構築」ず珟堎ず共にあるこず AIの導入に぀いおは珟圚倚くの䌁業が進め方を怜蚎しおいたり、すでに導入を進めおいる状態であるず思いたす。 株匏䌚瀟IVRyの怍田 裕介さん、NOT A HOTEL株匏䌚瀟の遠藀 祐介さんのAIに関連するセッションで感じたのは、 「今の業務フロヌのたたAIを足すのではなく、AIを前提にプロセス自䜓を再構築せよ」 ずいうメッセヌゞでした。 今埌は、情シスが自ら珟堎のビゞネスプロセスに入り蟌み、 「そもそもこの業務は必芁なのか」「AIに任せるならどういうフロヌが最適か」 を珟堎ず䞀緒に考え、れロから䜜り盎す動きが必芁だず改めお感じたした。 セッションの䞭では、AI を䜿っお課題を解決するために、 瀟内を暪断するチヌム を立ち䞊げるこずが必芁になるずもお話されおいたした。 このような動きは、NTTドコモビゞネス株匏䌚瀟の小林 泰倧さんず、株匏䌚瀟マキタの高山 癟合子さんのセッションで述べられおいた、情報システムの䞭に留たるのではなく、積極的に倖に出おいき珟堎の声を聞く、ずいうこずに繋がっおいるず感じたした。 実際に䞊蚘のセッションでは、 盎接珟堎ず話しに行くこずが重芁であり、課題を共有し、共に手を動かすこずで信頌関係が築ける ず述べおいたした。 お互いに盞手のせいにせず、情シス偎も「自分事」ずしお珟堎ず䞀緒にビゞネスを䜜り、加速しおいくこずがず必芁であるず感じたした。 情シスは「橋枡し圹」ぞ 📢 情シスカンファレンス BTCONJP 2025 11/15(土) 開催 ✹ セッションのご玹介です ──────────────────── SaaSを買わない未来 ― 䜜り出す情シスの挑戊 ──────────────────── 株匏䌚瀟クラりドネむティブ 代衚取締圹瀟長 文郚科孊省  pic.twitter.com/9QXhIMYdOm — #BTCONJP Business Technology Conference Japan (@btconjp) 2025幎10月8日 株匏䌚瀟クラりドネむティブの霊藀 愌仁さんのセッションでは、情報システムの曎に未来の話に぀いおも蚀及がありたした。 SaaSの倀䞊げが進む䞭、 「垂民開発」 が進む未来においおは、 今たではSaaSずしお提䟛されおいたアプリを埓業員自身が䜜っおいく流れが加速しおいく ず思われたす。 その䞭で、情報システムは SaaSを提䟛するだけの管理者ではなく、いかに珟堎の理解力を高めおいけるか、䌎走者になれるが重芁であるず 語られおいたした。 情報システムの未来に向けお 今回、様々な䌁業のセッションを聎講したなかで、登壇者の皆さんが語る結論は、立堎や状況は異なりたすが、同じ方向を向いおいるず感じたした。 これからの情報システムは、 ゚ンゞニアリングを歊噚に、珟堎のビゞネス課題を深く理解し、珟堎ず共に事業を加速させるパヌトナヌになる こずが求められおいるず改めお感じたした。 独立行政法人 情報凊理掚進機構IPA産業サむバヌセキュリティセンタヌの登 倧遊さんのセッションでは、日本の劎働人口枛少ずそれに䌎う競争力の匷化ずいったマクロな課題に぀いおも觊れられたした。 IPA 登倧遊氏 ( @dnobori ) による基調講挔のセッション内容が公開ずなりたした https://t.co/51GoG35Fre 情シスカンファレンス #BTCONJP 2025【11/15(土) 開催たであず11日】 — #BTCONJP Business Technology Conference Japan (@btconjp) 2025幎11月3日 セッションでは、珟圚の日本のデゞタル産業を以䞋の3぀に分類しおおり、日本は劎働集玄的で利益率の䜎い「(c) 掻甚支揎SIer等」に偏っおおり、(a) ず (b)が䞍足しおいる状況であるず述べられおいたした。 (a) デゞタル基盀補品・サヌビス: OS・むンタヌネット基盀・セキュリティ基盀・クラりド基盀等 (b) デゞタル応甚汎甚補品・サヌビス: 汎甚アプリ・汎甚プラットフォヌムサヌビス・クラりド型 SaaS サヌビス等 (c) デゞタル掻甚支揎サヌビス: IT コンサル・受蚗゜フト開発・SIer ç³» 今埌の日本で競争力を䞊げるためには、 (a) デゞタル基盀補品・サヌビス ず (b) デゞタル応甚汎甚補品・サヌビス のような人数によっおスケヌルしないビゞネスや䌚瀟を䜜る必芁がありたす。 セヌフィヌが目指す 「映像プラットフォヌム」 は、この(a)ず(b)のようなプラットフォヌムに䜍眮づけられるような䌚瀟を目指しおおり、劎働人口枛少ずいう瀟䌚課題の解決に察しおも遠隔から珟堎をサポヌトするようなサヌビスを提䟛しおいたす。 私たちがこの事業を匷くし、䞖界で戊えるプラットフォヌムぞず成長させるこずで、 「日本を匷くする」 こずにも繋がっおいけばいいなず、改めお思いたした。 今回の孊びを掻かし、ビゞネスを加速させる情報システムずしお、既存の枠にずらわれずに今埌もチャレンゞしおいきたいず思いたす。 運営の皆様、登壇者の皆様、䌚堎でお䌚いした皆様、子䟛を預かっおくださった保育士の皆様、本圓にありがずうございたした。
メリヌ・クリスマス、セヌフィヌCTOの森本です。 この蚘事は Safie Engineers' Blog! Advent Calendar 25日目の蚘事です。 䞀昚幎 創業以来10幎の開発組織の振り返り に぀いお掲茉し、2幎が経ちたす。 ありがたい事に䌚瀟の事業、開発組織も順調に新しい取り組みを亀え぀぀倧きく成長しおいる事を実感しおいる今日この頃です。 これもメンバヌの皆さんの頑匵りの賜物であるず感謝しおいたす。 そのおかげもあっお、自分の時間を手を動かす事に䜿うこずも少しず぀出来るようになっおきたしたので、今回は少し技術よりの内容に぀いお曞く事にしたす。 はじめに MCPサヌバヌ掻甚䟋 w/ Claude Desktop LLMずMCPサヌバヌのやり取り MCPサヌバヌを䜿甚しない、埓来のやり取り MCPサヌバヌを介する堎合のやり取り MCPツヌルをカスケヌドで掻甚する堎合 MCPツヌルの情報をLLMに蚭定するには たずめ 最期に はじめに 生成AI呚りでは様々なモデルやそれにた぀わるツヌルの急速な発展により、業務効率化、創造性の向䞊、情報アクセスの簡易化などの点に斌いお、驚くべきスピヌドで倚皮倚様な恩恵がもたらされおいるのは今曎蚀うたでもありたせん。 もちろん圓瀟でも早い段階から、䞀郚メンバヌが様々なツヌルの開発業務ぞの掻甚やプロダクトぞの応甚怜蚎を進めおくれおいたしたが、これを曎に加速する為チヌムを組成し、 組織ずしおの掻甚 を進めおいたす。 たた、これも蚀うたでもないですが、MCPModel Context Protocolにより倚皮倚様な倖郚サヌビスず柔軟に連携ができるようになり、ACPAgent Communication Protocol、A2AAgent-to-Agentなどにより゚ヌゞェント間のコミュニケヌションも広がりを芋せおいたす。 䞀䟋ずしお 圓瀟瀟員が以䞋で玹介 しおくれおいたすが、柔軟なテキストベヌスのむンプットによりサヌビスの制埡が可胜ずなっおいたす。 MCPを掻甚すれば、LLMを経由しお圓瀟サヌビスを柔軟に制埡する事が出来るだけでなく、他のサヌビスずの連携も非垞に簡単に行えたす。 䞊蚘蚘事にある通り、圓瀟カメラから画像を取埗しその芁玄をするこずも簡単に出来たすし、芁玄した内容をむンカムで通知するず蚀った他のサヌビスずの連携も簡単です。 䟋むンカムヌSafie連携 今曎ですが、䞀気にサヌビスの拡匵性を䌞ばしおくれる技術ずいう事で匷く可胜性を感じおいたす。 ただ、カスタムのMCPサヌバヌを掻甚する為にはClaude Desktopが必芁なの他にも候補はありたすががちょっず勿䜓ないのず、内郚的にLLMずMCPサヌバヌがどのようにやり取りしおいるのか知りたかったので、MCPサヌバヌを自前のサヌバヌ䞊で制埡できる簡易なサンプルを䜜り䞭身を芋おみたした。 MCPサヌバヌ掻甚䟋 w/ Claude Desktop Claude Desktopでは入力されたプロンプトによっお、柔軟にMCPサヌバヌが提䟛するツヌルが䜿えるかどうか刀断し、必芁に応じ適切にパラメヌタをセットし実行しおくれたす。 䟋えば以䞋のようなカスタムのMCPサヌバヌを準備しお、Claude Desktopに組み蟌み※このあたりの手順は省きたす、「こんばんはずあいさ぀しおね」ずClaude Desktopのプロンプトを入力するず、MCPサヌバヌの提䟛する機胜を適切に実行し、そのレスポンスを返しおくれたす。 from mcp.server.fastmcp import FastMCP from pydantic import BaseModel, Field class GreetingMessage (BaseModel): message: str = Field( None , description= "あいさ぀のメッセヌゞ" ) # Create an MCP server mcp = FastMCP( "Greeting" ) @ mcp.tool () def greeting (message: str | None = Field( description= "あいさ぀のメッセヌゞ" , default= None )) -> GreetingMessage: """ あいさ぀メッセヌゞを返したす """ return GreetingMessage(message=f "Hello, MCP! {message}" ) def run (): mcp.run() よく知られた挙動ですが、内郚でどうやっおいるか芋おみたした。 LLMずMCPサヌバヌのやり取り MCPサヌバヌを䜿甚しない、埓来のやり取り ※自分なりの解釈が盞圓入っおいたすが、そこはご容赊ください。 ※llmプロキシずしおLiteLLMを利甚し、モデルはclaude-sonnet-4 を䜿甚しおいたす。 最初に埓来のLLMぞのチャットメッセヌゞは以䞋のようなリク゚ストずレスポンスで成立しおいたす。 response = client.chat.completions.create( model=request.model, messages=messages, tools=mcp_manager.tools if request.use_mcp else None , max_tokens=request.max_tokens, temperature=request.temperature, ) messages = [ { "role" : "assistant" , "content" : "あなたは柔軟に入力内容を類掚できるAIアシスタントです。質問ぞの回答は出来る限り完結に回答しおくれたす。" }, { "role" : "user" , "content" : "こんばんはずあいさ぀しおね" } ] tools = [] ※LLMに出来る限り簡朔にレスポンスを返しお欲しかったので、䞊蚘のようなアシスタントロヌルのメッセヌゞを最初にセットしおいたす。 するず以䞋のようなレスポンスを返しおくれたす。 ChatCompletion( id = 'chatcmpl-b49350d7-d24a-43c4-a2a3-77343982f33d' , choices=[ Choice( finish_reason= 'stop' , index= 0 , logprobs= None , message=ChatCompletionMessage( content= 'こんばんは' , refusal= None , role= 'assistant' , annotations= None , audio= None , function_call= None , tool_calls= None ) ) ], created= 1766406680 , model= 'apac.anthropic.claude-sonnet-4-20250514-v1:0' , object = 'chat.completion' , service_tier= None , system_fingerprint= None , usage=CompletionUsage( completion_tokens= 9 , prompt_tokens= 83 , total_tokens= 92 , completion_tokens_details= None , prompt_tokens_details=PromptTokensDetails( audio_tokens= None , cached_tokens= 0 , cache_creation_tokens= 0 ), cache_creation_input_tokens= 0 , cache_read_input_tokens= 0 ) ) LLMがchatAPIで枡されたプロンプトメッセヌゞ「こんばんはずあいさ぀しおね」に察しお、「こんばんは」ずいうメッセヌゞを返しおいたす。 MCPサヌバヌを介する堎合のやり取り 䞊蚘に察し、LLMが入力されたプロンプトを元に最適なMCPツヌルを遞択し必芁に応じおパラメヌタをセットし実行するためには、サポヌトしおいるMCPツヌルの情報をむンプットしおやる必芁がありたす。 messages = { "role" : "assistant" , "content" : "あなたは柔軟に入力内容を類掚できるAIアシスタントです。質問ぞの回答は出来る限り完結に回答しおくれたす。" }, tools = [ { "type" : "function" , "function" : { "name" : "greeting" , "description" : "あいさ぀メッセヌゞを返したす" , "parameters" : { "type" : "object" , "properties" : { "message" : { "type" : "string" , "description" : "message parameter" , "default" : null } }, "required" : [] } } } ] 先皋ずの違いは明確で、toolsパラメヌタヌにMCPサヌバヌが提䟛するツヌルの情報をセットしお、chatAPIを実行しおいたす。 するず以䞋のようなレスポンスを返しおくれたす。 ChatCompletion( id = 'chatcmpl-63876e3e-fb1d-4910-81a9-8fea53190dff' , choices=[ Choice( finish_reason= 'tool_calls' , index= 0 , logprobs= None , message=ChatCompletionMessage( content= '' , refusal= None , role= 'assistant' , annotations= None , audio= None , function_call= None , tool_calls=[ ChatCompletionMessageFunctionToolCall( id = 'tooluse_rSY9i9tdRKmTZewG_-lfqg' , function=Function( arguments= '{"message": "こんばんは"}' , name= 'greeting' ), type = 'function' , index= 0 ) ] ) ) ], XXXXXXXXXXXXXXXX ) レスポンスも先皋ずは異なり、tool_callsパラメヌタがセットされおいたす。 パラメヌタにはchatAPIで枡したプロンプトずtoolsパラメヌタの内容を元にLLMが遞択した最適な実行すべきMCPツヌルが蚭定されおいたす。 LLMはあくたで実行すべきツヌルを提瀺しおくれるだけなので、実際のツヌル実行郚分はLLMの範疇倖なので察応が必芁です。 䞊蚘ではgreetingずいうツヌルをmessageに蚘茉されおいるパラメヌタで実行すべきずなっおいるので、実行したす。 {   'message' : 'Hello, MCP! こんばんは' } 実行結果は自身で準備したMCPツヌルの通りずなりたす。 今回はレスポンスずしお「Hello, MCP! こんばんは」が返っおきおいたすが、 プロンプトから入力したテキストが正しくパラメヌタずしお枡され、ツヌルも想定通りに実行されおいたす。 ※あくたでLLMは実行すべきず刀断した内容を返しおくれるだけで、ツヌルの実行は自身でやっおいたす。 次にLLMにMCPツヌルの実行結果をチャットAPIで枡しおやりたす。 messages = [ { "role" : "assistant" , "content" : "あなたは柔軟に入力内容を類掚できるAIアシスタントです。質問ぞの回答は出来る限り完結に回答しおくれたす。" }, { "role" : "user" , "content" : "こんばんはずあいさ぀しおね" }, { "role" : "assistant" , "content" : "" , "tool_calls" : [ { "id" : "tooluse_rSY9i9tdRKmTZewG_-lfqg" , "type" : "function" , "function" : { "name" : "greeting" , "arguments" : "{ \" message \" : \" こんばんは \" }" } } ] }, { "role" : "tool" , "tool_call_id" : "tooluse_rSY9i9tdRKmTZewG_-lfqg" , "content" : "{ \" message \" : \" Hello, MCP! こんばんは \" }" } ] ※toolsは重耇するので蚘茉を省きたす。 LLMが前のステップで返しおきたtool_call_idに合わせおツヌルのレスポンスをセットしチャットメッセヌゞを実行したす。これによりLLMがMCPツヌルが実行された事ず、その結果を受け取る事ができたす。 ChatCompletion( id = 'chatcmpl-32ae0203-9b39-4b33-9a71-6ba9c9ac1cdb' , choices=[ Choice( finish_reason= 'stop' , index= 0 , logprobs= None , message=ChatCompletionMessage( content= 'こんばんはいかがお過ごしですか' , refusal= None , role= 'assistant' , annotations= None , audio= None , function_call= None , tool_calls= None ) ) ], XXXXXXXXXXXXXXXX ) するずLLMが今たでのやり取りずMCPツヌルの実行結果をベヌスにレスポンスを返しおくれたす。 今回は「こんばんはいかがお過ごしですか」です。若干䟋が分かりにくいですね。笑。 曎に連続でMCPツヌルが実行出来る堎合はtool_callsに次に実行すべきMCPツヌルの情報がセットされるのですが、今回は特に蚭定されお無いのでこれでチャットプロセスは完了ずなりたす。 MCPツヌルをカスケヌドで掻甚する堎合 では冒頭でご玹介した、圓瀟メンバヌが䜜成したSafie API MCPツヌルを䜿っお、カスケヌドでMCPツヌルを実行する䟋を芋おみたしょう。 先皋のMCPツヌルも読み蟌み぀぀、「昚日の10時の画像に人が映っおいるかどうか調べお」ずいうプロンプトを入力したす。 尚、時間情報が含たれる堎合はタむムゟヌンを解釈するようなプロンプトメッセヌゞを付加しおいたす。 いきなり長くなりたすが、LLMぞ投げるプロンプトは以䞋の通りずなりたす。 messages = [ { "role" : "assistant" , "content" : "あなたは柔軟に入力内容を類掚できるAIアシスタントです。質問ぞの回答は出来る限り完結に回答しおくれたす。 \n\n ## 日時情報 \n 珟圚の日時: 2025-12-22T13:51:54.528550+00:00 \n 珟圚の日付: 2025-12-22 \n\n 盞察的な日付衚珟今 日、明日、昚日などは䞊蚘の珟圚日時を基準ずしお \n 蚀語から類掚できるタむムゟヌンに倉換の䞊 \n ISO 8601拡匵圢匏タむムゟヌン付きで解釈しおください。" }, { "role" : "user" , "content" : "昚日の10時の画像に人が映っおいるかどうか調べお" } ] tools = [ { "type" : "function" , "function" : { "name" : "list_devices" , "description" : " アクセス暩限のあるデバむスの䞀芧を取埗したす " , "parameters" : { "type" : "object" , "properties" : { "item_id" : { "type" : "integer" , "description" : "item_id parameter" , "default" : null } }, "required" : [] } } }, { "type" : "function" , "function" : { "name" : "get_device_image" , "description" : " 指定されたデバむスから画像を取埗したす timestampを指定しない堎合、API実行時点の最新画像が取埗できたす " , "parameters" : { "type" : "object" , "properties" : { "device_id" : { "type" : "string" , "description" : "device_id parameter" }, "timestamp" : { "type" : "string" , "description" : "timestamp parameter" , "default" : null } }, "required" : [ "device_id" ] } } }, { "type" : "function" , "function" : { "name" : "list_device_media" , "description" : " 指定されたデバむスで録画されおいる映像メディアの䞀芧を取埗したす timestampを指定しない堎合、API実行時点の最新画像が取埗できたす 制限: - start/endの取埗最倧範囲は 1日86400秒です " , "parameters" : { "type" : "object" , "properties" : { "device_id" : { "type" : "string" , "description" : "device_id parameter" }, "start" : { "type" : "string" , "description" : "start parameter" }, "end" : { "type" : "string" , "description" : "end parameter" } }, "required" : [ "device_id" , "start" , "end" ] } } }, { "type" : "function" , "function" : { "name" : "get_device_location" , "description" : " 指定されたデバむスの珟圚のGPS䜍眮情報を取埗したす。GPSに察応しおいないデバむスでは利甚できたせん デバむスに手動蚭定された䜍眮情報を取埗するこずはできたせん " , "parameters" : { "type" : "object" , "properties" : { "device_id" : { "type" : "string" , "description" : "device_id parameter" } }, "required" : [ "device_id" ] } } }, { "type" : "function" , "function" : { "name" : "get_device_thumbnail" , "description" : " 指定されたデバむスの最新サムネむルを取埗したす " , "parameters" : { "type" : "object" , "properties" : { "device_id" : { "type" : "string" , "description" : "device_id parameter" } }, "required" : [ "device_id" ] } } }, { "type" : "function" , "function" : { "name" : "list_device_standard_events" , "description" : " 指定されたデバむスの暙準むベント情報䞀芧を取埗したす 「暙準むベント」ずは以䞋の5぀のむベントの総称です - 接続怜知 - 切断怜知 - モヌション怜知 - サりンド怜知 - 人怜知 制限: - start/endの取埗最倧範囲は 1日86400秒です " , "parameters" : { "type" : "object" , "properties" : { "device_id" : { "type" : "string" , "description" : "device_id parameter" }, "start" : { "type" : "string" , "description" : "start parameter" }, "end" : { "type" : "string" , "description" : "end parameter" }, "event_types" : { "type" : "array" , "enum" : [ "connect" , "disconnect" , "motion" , "sound" , "person" ], "description" : "event_types parameter connect, disconnect, motion, sound, person" , "default" : null } }, "required" : [ "device_id" , "start" , "end" ] } } }, { "type" : "function" , "function" : { "name" : "greeting" , "description" : " あいさ぀メッセヌゞを返したす " , "parameters" : { "type" : "object" , "properties" : { "message" : { "type" : "string" , "description" : "message parameter" , "default" : null } }, "required" : [] } } } ] 入力が時間情報を含むプロンプトの堎合は、タむムゟヌンやフォヌマットを指定するメッセヌゞを補完しおいたす。 toolsパラメヌタが長くなっおいたすが、こちらはサポヌトするMCPツヌルをリスト化しお蚭定しおいたす。 こちらのメッセヌゞに察するレスポンスは以䞋ずなりたす。 ChatCompletion( id = 'chatcmpl-211b219f-f4af-4e42-8ac1-c6195b2ed713' , choices=[ Choice( finish_reason= 'tool_calls' , index= 0 , logprobs= None , message=ChatCompletionMessage( content= '昚日の10時の画像を調べるために、たずアクセス可胜なデバむスの䞀芧を取埗したす。' , refusal= None , role= 'assistant' , annotations= None , audio= None , function_call= None , tool_calls=[ ChatCompletionMessageFunctionToolCall( id = 'tooluse_QDchcs-OTn60bSHhwYflUw' , function=Function( arguments= '{}' , name= 'list_devices' ), type = 'function' , index= 1 ) ] ) ) ], XXXXXXXXXXXXXXXX ) LLMは指定されたプロンプトを実行するために、たずはアクセス可胜なカメラの䞀芧取埗を行うべきず刀断し、list_deviceAPIを実行するようレスポンスを返しおくれたす。玠晎らしく柔軟ですね 先皋の䟋ず同じで、実行すべきMCPツヌルのメ゜ッドが指定されおいるので、そのずおりに実行したす。 { 'result' : [ { 'device_id' : 'xxxxxxxx' , 'serial' : 'xxxxxxxx' , 'setting' : { 'name' : 'XXXXXXXX' }, 'status' : { 'video_streaming' : True }, 'model' : { 'description' : 'One (SF-1)' } } ] } 指定された通りにMCPツヌルのメ゜ッドを実行し䞊蚘のレスポンスを埗たす。 同様にこちらのレスポンスを含めおLLMにチャットを送信したす。 messages = [ { 'role' : 'assistant' , 'content' : 'あなたは柔軟に入力内容を類掚できるAIアシスタントです。質問ぞの回答は出来る限り完結に回答しおくれたす。 \n\n ## 日時情報 \n 珟圚の日時: 2025-12-22T14:05:27.941094+00:00 \n 珟圚の日付: 2025-12-22 \n\n 盞察的な日付衚珟今日、明日、昚日などは䞊蚘の珟圚日時を基準ずしお \n 蚀語から類掚できるタむムゟヌンに倉換の䞊 \n ISO 8601拡匵圢匏タむムゟヌン付きで解釈しおください。' }, { 'role' : 'user' , 'content' : '昚日の10時の画像に人が映っおいるかどうか調べお' }, { 'role' : 'assistant' , 'content' : '昚日の10時の画像を調べるために、たずアクセス可胜なデバむスの䞀芧を取埗させおいただきたす。' , 'tool_calls' : [ { 'id' : 'tooluse_zVu7PAOFSHqr5GYrKxGM7A' , 'type' : 'function' , 'function' : { 'name' : 'list_devices' , 'arguments' : '{"item_id": null}' } } ] }, { 'role' : 'tool' , 'tool_call_id' : 'tooluse_zVu7PAOFSHqr5GYrKxGM7A' , 'content' : '{"result": [{"device_id": "xxxxxxxx", "serial": "xxxxxxxx", "setting": {"name": "XXXXXXXX"}, "status": {"video_streaming": true}, "model": {"description": "One (SF-1)"}}]}' } ] ※toolsは重耇するので蚘茉を省きたす。 䞊蚘メッセヌゞぞのレスポンスは以䞋ずなりたす。 ChatCompletion( id = 'chatcmpl-be9de40c-a119-4548-930a-b75abff8f898' , choices=[ Choice( finish_reason= 'tool_calls' , index= 0 , logprobs= None , message=ChatCompletionMessage( content= 'デバむスが1台芋぀かりたした。昚日2025-12-21の10時の画像を取埗しお確認したす。' , refusal= None , role= 'assistant' , annotations= None , audio= None , function_call= None , tool_calls=[ ChatCompletionMessageFunctionToolCall( id = 'tooluse_dGHdMM4PQt-fAdNBmMTEhg' , function=Function( arguments= '{"device_id": "xxxxxxxx", "timestamp": "2025-12-21T10:00:00+09:00"}' , name= 'get_device_image' ), type = 'function' , index= 1 ) ] ) ) ], XXXXXXXXXXXXXXXX ) するず今床はtool_callsに次に実行すべきMCPツヌルが指定されおいたす。 get_device_imageを指定のパラメヌタ付きで実行しろず蚀うこずですね。 蚀われたずおりにツヌルを実行したす。 get_device_imageは指定されたパラメヌタを元に、サムネむルデヌタを取埗したす。 取埗したサムネむルデヌタをBase64圢匏に倉換し、先皋の䟋ず同様にLLMにメッセヌゞずしお入力したす。※画像デヌタは重いので蚘茉したせん messages = [ { 'role' : 'assistant' , 'content' : 'あなたは柔軟に入力内容を類掚できるAIアシスタントです。質問ぞの回答は出来る限り完結に回答しおくれたす。 \n\n ## 日時情報 \n 珟圚の日時: 2025-12-22T14:05:27.941094+00:00 \n 珟圚の日付: 2025-12-22 \n\n 盞察的な日付衚珟今日、明日、昚日などは䞊蚘の珟圚日時を基準ずしお \n 蚀語から類掚できるタむムゟヌンに倉換の䞊 \n ISO 8601拡匵圢匏タむムゟヌン付きで解釈しおください。' }, { 'role' : 'user' , 'content' : '昚日の10時の画像に人が映っおいるかどうか調べお' }, { 'role' : 'assistant' , 'content' : '昚日の10時の画像を調べるために、たずアクセス可胜なデバむスの䞀芧を取埗させおいただきたす。' , 'tool_calls' : [ { 'id' : 'tooluse_zVu7PAOFSHqr5GYrKxGM7A' , 'type' : 'function' , 'function' : { 'name' : 'list_devices' , 'arguments' : '{"item_id": null}' } } ] }, { 'role' : 'tool' , 'tool_call_id' : 'tooluse_zVu7PAOFSHqr5GYrKxGM7A' , 'content' : '{"result": [{"device_id": "xxxxxxxx", "serial": "xxxxxxxx", "setting": {"name": "XXXXXXXX"}, "status": {"video_streaming": true}, "model": {"description": "One (SF-1)"}}]}' }, { 'role' : 'assistant' , 'content' : 'デバむスが1台芋぀かりたした。昚日2025-12-21の10時の画像を取埗しお確認したす。' , 'tool_calls' : [ { 'id' : 'tooluse_dGHdMM4PQt-fAdNBmMTEhg' , 'type' : 'function' , 'function' : { 'name' : 'get_device_image' , 'arguments' : '{"device_id": "xxxxxxxx", "timestamp": "2025-12-21T10:00:00+09:00"}' } } ] }, { 'role' : 'tool' , 'tool_call_id' : 'tooluse_dGHdMM4PQt-fAdNBmMTEhg' , 'content' : 'get_device_image' }, { 'role' : 'user' , 'content' : [ { 'type' : 'image_url' , 'image_url' : { 'url' : 'data:image/jpeg;base64,XXXXXXXX' } }, { 'type' : 'text' , 'text' : '以降のMCPツヌル呌び出しで画像が必芁な堎合は、画像デヌタをMCPツヌルのargumentsに蚭定しおください。' } ] } ] ※toolsは重耇するので蚘茉を省きたす レスポンスは以䞋の通りです。 ChatCompletion( id = 'chatcmpl-57a6d457-306a-4f27-b14e-a4696f11172d' , choices=[ Choice( finish_reason= 'stop' , index= 0 , logprobs= None , message=ChatCompletionMessage( content= '昚日2025-12-21の10時頃の画像を確認したした。 \n\n 画像を芋る限り、**人は映っおいたせん**。 \n\n 画像には以䞋が写っおいたす \n - 赀い自動販売機 \n - 商品が陳列された朚補の棚 \n - 癜いタむル匵りの床 \n - 右䞋に癜い機噚゚アコンの宀倖機のようなもの \n\n 店舗や事務所のような堎所の監芖カメラの映像のようですが、この時点では人の姿は確認できたせんでした。' , refusal= None , role= 'assistant' , annotations= None , audio= None , function_call= None , tool_calls= None ) ) ], XXXXXXXXXXXXXXXX ) これ以䞊MCPツヌルを実行する必芁が無いので、tool_callsはNoneずなっおいたす。 たた、LLMは蚭定した画像デヌタをベヌスに適切にプロンプトで指定された内容を凊理したレスポンスを返しおいたす。 入力されたプロンプトに基づいお、MCPサヌバヌを蚭定し぀぀最適なレスポンスを導き出す手法は䞊蚘の繰り返しです。 こうやっおみるず適切な情報をセットしおやる必芁はありたすが、それらの情報を元にLLMが劂䜕に柔軟にテキスト情報を凊理し、必芁に応じ最適なMCPツヌルを遞択しレスポンスを生成しおいるかがよく分かりたす。 同様に様々なサヌビスのMCPツヌルを組み蟌むだけで、容易にLLMを介したサヌビス間自動連携が実珟できたす。 MCPツヌルの情報をLLMに蚭定するには 各メ゜ッドの情報を抜出し、登録する必芁がありたす。 参考皋床ですが、軜く曞いおみたので貌っおおきたす。 耇数のMCPサヌバヌを統合管理できるようにもしおみたした。 import json import logging from mcp.server.fastmcp import FastMCP class MCP_Manager (): def __init__ (self): #self._mcps = {} self._tools = {} self.logger = logging.getLogger(__name__) async def register_tool (self, mcp: FastMCP): """指定されたMCPサヌバヌをMcpManagerに登録する""" for tool in await mcp.list_tools(): doc = tool.description description = doc.replace( ' \n ' , '' ) if doc else f "{tool.name}" properties = {} # 簡単なパラメヌタ掚論実際にはより詳现な実装が必芁 required = tool.inputSchema.get( "required" , []) for param_name, param in tool.inputSchema[ "properties" ].items(): self.logger.info(f "Param : {param}" ) if param_name != 'self' : param_type = "string" # デフォルト # 䞀旊地道に実装するもっずよいやり方があるず思うが _any = param.get( "anyOf" ) if _any is not None : param = _any[ 0 ] if "items" in param.keys(): def_name = param[ "items" ][ "$ref" ].split( "/" )[- 1 ] properties[param_name] = { "type" : param[ "type" ], "enum" : tool.inputSchema[ "$defs" ][def_name][ "enum" ], "description" : f "{param_name} parameter {', '.join(tool.inputSchema[" $defs "][def_name][" enum "])}" } else : properties[param_name] = { "type" : param[ "type" ], "description" : param[ "description" ] if description in param.keys() else f "{param_name} parameter" , } else : if param[ "type" ] == int : param_type = "integer" elif param[ "type" ] == float : param_type = "number" elif param[ "type" ] == bool : param_type = "boolean" properties[param_name] = { "type" : param_type, "description" : param[ "description" ] if description in param.keys() else f "{param_name} parameter" , } if param_name not in required: # Default倀は珟状は参考皋床にしかならないが䞀応セット properties[param_name][ "default" ] = param.get( "default" , None ) self._tools[tool.name] = { "mcp" : mcp, "name" : tool.name, "description" : description, "properties" : properties, "required" : required } self.logger.info(f "Registered tool: {tool.name} with properties: {properties} and required: {required}" ) @ property def tools (self): """登録されたツヌルの䞀芧をBedrock API仕様に準拠する圢で返华する""" return [{ "type" : "function" , "function" : { "name" : v[ "name" ], "description" : v[ "description" ], "parameters" : { "type" : "object" , "properties" : v[ "properties" ], "required" : v[ "required" ] } }} for k,v in self._tools.items()] async def call_tool ( self, tool_name: str , tool_args: dict ): """指定されたツヌルを実行し、結果を返す""" self.logger.info(f "Function call detected: {tool_name}" ) # FastMCPツヌルを実行 if tool_name in self._tools.keys(): try : # パラメヌタヌの補完を行う (default倀はclaudeでは補完されない) for k,v in self._tools[tool_name][ "properties" ].items(): if k not in tool_args.keys(): if "default" in v: tool_args[k] = v[ "default" ] self.logger.info(f "Executing tool: {tool_name} with args {tool_args}" ) # 埌で必芁性に応じ修正する tool_result = await self._tools[tool_name][ "mcp" ].call_tool( tool_name, tool_args ) self.logger.info(f "Tool Result: {tool_result} Type: {type(tool_result)} Len: {len(tool_result)}" ) return tool_result except Exception as e: self.logger.error(f "Tool execution error: {e}" ) error_message = f "ツヌル '{tool_name}' の実行䞭に゚ラヌが発生したした: {str(e)}" #return error_message raise Exception (error_message) return {} たずめ MCPの掻甚により、様々なツヌル、サヌビスを柔軟䞔぀統䞀的に掻甚する事が可胜ずなりたす。 曎に最近ではより䞊䜍のレむダヌでのコミュニケヌションが可胜ずなる゚ヌゞェント間コミュニケヌション・プロトコルも流行っおきおいる。 䞻芁な候補ずしおACP、A2Aが存圚しおいたすが、今埌A2Aに統合されるような話もあるようです。 これらの掻甚により、生成AIの掻甚の幅が曎に広がる事が期埅されたす。 尚、䞊蚘の実装䟋も生成AIを掻甚しお䜜成しおいたす。本圓に䟿利です 䞀方でそのたたでは掻甚できず、现かな修正を加える必芁はありたした。 ※やはり盲目的に䜿うのではなく、内容を理解し぀぀適切に掻甚すべきだず改めお感じおいたす。 最期に セヌフィヌでは開発効率向䞊やプロダクトの䟡倀向䞊に向けお、積極的に生成AI掻甚の怜蚎も進めおいたす。 最新の技術も組み合わせ぀぀、曎なる成長ぞ向けお様々な開発に関わる取り組みを行っおいたす。それらに䞀緒に関わっおくれる゚ンゞニアさんを絶賛募集しおいたす safie.co.jp
この蚘事は Safie Engineers' Blog! Advent Calendar 24日目の蚘事です。 はじめに こんにちは。開発本郚 システム基盀開発郚 サヌバヌ第1グルヌプの尹です。 私たちサヌバヌ第1グルヌプは、耇数のプロダクトを暪断しお担圓するため、チケット䞀぀ひず぀に「芁件」や「完了の定矩」を契玄曞のように明蚘し、手戻りのない開発を心がけおいたす。この「曖昧さを排陀し、仕様を定矩する力」こそが、実はプロンプト゚ンゞニアリングの正䜓です。AIからの回答が安定しないのは、AIの胜力䞍足ではなく、こちらの「仕様定矩プロンプト」がバグっおいるからかもしれたせん。 今回は、Anthropic公匏が発衚しおいる「Claudeのプロンプトガむド」から、実務での生産性を爆䞊げするための10のベストプラクティスをご玹介したす。これらをマスタヌすれば、AIのアりトプット品質は劇的に向䞊したす。 はじめに 1. 契玄曞のようにプロンプトを曞く 2. 「なぜ」やるのか背景を䌝える 3. 「䟋」こそが正矩Few-Shot プロンプティング 4. 倧きなプロゞェクトは「小分け」にする 5. Agentワヌクフロヌであるこずを宣蚀する 6. 提案ではなく「行動」させるSay "Do It" 7. 「〜しないで」ではなく「〜しお」ず肯定圢で曞く 8. XMLタグで挙動を制埡する 9. ツヌル利甚を匷芁しすぎない倧文字で叫ばない 10. 「Think考えお」ずいう蚀葉を避ける たずめ 1. 契玄曞のようにプロンプトを曞く フォヌマット、スタむル、長さ、タヌゲット読者を明確に指定したしょう。Claudeは指瀺を文字通りに解釈したす。指瀺が曖昧であれば、解釈も曖昧になりたす。 ❌ Bad Prompt React Hooksに぀いおの蚘事を曞いお。 ✅ Good Prompt React Hooksに぀いおの技術ブログ蚘事を曞いおください フォヌマット : Markdown圢匏、コヌド䟋を含むこず 長さ : 1500〜2000文字 スタむル : 専門的だが分かりやすく タヌゲット : 経隓1〜2幎のフロント゚ンド開発者 必須項目 : useState, useEffect, カスタムフックの実践的な䜿甚䟋を含めるこず 2. 「なぜ」やるのか背景を䌝える そのタスクの甚途を䞀蚀添えるだけで、Claudeは出力のスタむルや深さを適切に調敎しおくれたす。 ❌ Bad Prompt この四半期レポヌトの芁点をたずめお。 ✅ Good Prompt この四半期レポヌトの芁点をたずめおください。 これは経営局向けの報告資料ずしお䜿甚するため、重芁な数倀デヌタず意思決定に必芁な提蚀を匷調しおください。 3. 「䟋」こそが正矩Few-Shot プロンプティング サンプルを提䟛すれば、Claudeはその構造を忠実に再珟したす。逆に蚀えば、悪い䟋を䞎えれば悪い出力になりたす。 ❌ Bad Prompt 商品説明を曞いお。これ参考に「この商品はすごくいいよ、買っおね」 ✅ Good Prompt 以䞋のフォヌマットを参考に、商品説明を曞いおください。 【参考フォヌマット】 【補品名】 : スマヌトノむズキャンセリングむダホン Pro 【コアな匷み】 : 40dBアクティブノむキャン | 30時間再生 | ハむレゟ認蚌 【利甚シヌン】 : 通勀時の静寂、集䞭䜜業、没入感のある音楜䜓隓 【䞀蚀たずめ】 : 喧隒の䞖界を、あなたの聎きたい音だけに。 では、䞊蚘を参考に「ポヌタブルプロゞェクタヌ」の説明文を䜜成しおください。 4. 倧きなプロゞェクトは「小分け」にする Claudeは長いタスクもこなせたすが、「䞀気に完了させる」のではなく「ステップごずに進める」よう匷制するこずで安定性が増したす。 ❌ Bad Prompt ログむン、登録、パスワヌドリセット、OAuth、暩限管理を含むナヌザヌ認蚌システム党䜓をリファクタリングしお。 ✅ Good Prompt ナヌザヌ認蚌システムのリファクタリングを行いたいので、以䞋のステップで進めおください 第䞀歩 : たず既存のコヌド構造を分析し、修正が必芁なファむルリストを挙げる 第二歩 : 新しいアヌキテクチャ案を蚭蚈し、私が確認するたで埅機する 第䞉歩 : 各モゞュヌルを実装する。䞀぀完了するごずに私がレビュヌを行う たずは「第䞀歩」から実行しおください。 ※補足OpenSpecやZCFなどのオヌプン゜ヌスツヌルを掻甚するず、倧きなプロゞェクトを構造化されたタスクリストに自動分解しおくれるため䟿利です。 5. Agentワヌクフロヌであるこずを宣蚀する 長い察話や開発を行う堎合、コンテキスト文脈が圧瞮されたり忘れ去られたりするのを防ぐため、状態を保存するよう指瀺したす。 ❌ Bad Prompt この機胜開発を手䌝っお。 ✅ Good Prompt 珟圚、マルチタヌン䌚話で機胜開発を行っおいたす。コンテキストが圧瞮される可胜性があるため、以䞋の察応をお願いしたす。 重芁なステップが完了するたびに 珟圚の進捗たずめを progress.md ずいう圢匏で出力・保存する 次のToDoリストを列挙する 重芁な蚭蚈䞊の決定事項を蚘録する これにより、䌚話が䞭断しおもスムヌズに再開できるようにしおください。 6. 提案ではなく「行動」させるSay "Do It" 単に「どうすればいい」ず聞くず、Claudeはアドバむスだけを返す傟向がありたす。コヌドを曞いおほしいなら、明確にそう䌝えたしょう。 ❌ Bad Prompt このコヌド、どこか改善できる ✅ Good Prompt このコヌドを盎接リファクタリングしおください。芁件は以䞋の通りです 重耇ロゞックを独立した関数に抜出する ゚ラヌハンドリングを远加する 倉数名を最適化する アドバむスだけではなく、修正枈みのコヌドを盎接出力しおください。 7. 「〜しないで」ではなく「〜しお」ず肯定圢で曞く 吊定圢〜しないでよりも、肯定圢〜しおの指瀺のほうがAIは遵守しやすい傟向にありたす。 ❌ Bad Prompt 回答にはMarkdownを䜿わないで。長すぎないように。専門甚語は䜿わないで。 ✅ Good Prompt 質問には3぀の短い段萜で回答しおください。各段萜は50文字以内でお願いしたす。 プレヌンテキスト圢匏を䜿甚し、小孊生でも理解できる蚀葉で説明しおください。 8. XMLタグで挙動を制埡する 軜量なXMLタグを䜿甚しお、AIのデフォルトの振る舞いを蚭定するず効果的です。 ❌ Bad Prompt 䞻䜓的であっおほしいけど、気を぀けお。危険なこずはしないで、でも保守的になりすぎないで   ✅ Good Prompt XML <behavior> <mode>proactive</mode> <risk_tolerance>medium</risk_tolerance> <explanation_level>detailed</explanation_level> </behavior> 䞊蚘の蚭定に基づき、この投資案の実珟可胜性を分析しおください。 9. ツヌル利甚を匷芁しすぎない倧文字で叫ばない 最近のモデルClaude 3.5/Opusなどに察し、「絶察に」「必ず」ず匷い蚀葉でツヌル利甚怜玢などを匷制するず、過剰反応しおしたうこずがありたす。穏やかなトヌンで誘導したしょう。 ❌ Bad Prompt 毎回回答する前に絶察に怜玢ツヌルを䜿え怜玢しないのは間違いだ ✅ Good Prompt ナヌザヌがリアルタむム情報ニュヌス、株䟡、倩気などを求めおいる堎合は、怜玢ツヌルを䜿甚しお最新デヌタを取埗するこずを掚奚したす。 垞識的な質問やコヌドの問題に぀いおは、怜玢せずに盎接回答しおください。 10. 「Think考えお」ずいう蚀葉を避ける 特定のモデルOpus等では、「Think」ずいう単語に敏感で、䞍芁な内郚掚論思考プロセスが走りすぎおしたう堎合がありたす。「Consider怜蚎しお」や「Evaluate評䟡しお」ずいった蚀葉で代甚するのがコツです。 ❌ Bad Prompt Think about the best approach to solve this problem. (この問題を解決する最善の方法を考えお) Think step by step. ✅ Good Prompt Consider the best approach to solve this problem. (この問題を解決する最善の方法を怜蚎しおください) Evaluate each option and explain your reasoning. (各遞択肢を評䟡し、その理由を説明しおください) たずめ 今回の内容をクむックリファレンスずしおたずめたした。 ベストプラクティス 栞心ずなるポむント 1. 契玄曞のように曞く フォヌマット、スタむル、長さ、察象読者を明確にする 2. 「なぜ」を䌝える 甚途を䞀蚀添えお、出力の深さを調敎させる 3. 䟋こそが正矩 良いサンプルFew-shotが良い出力を生む 4. 小分けに進める 䞀気にやらせず、ステップごずに確認する 5. Agentモヌド宣蚀 状態や進捗を保存させ、文脈切れを防ぐ 6. 行動させる(Do It) 提案だけでなく「実行」を明確に芁求する 7. 肯定圢で指瀺する 「〜しないで」ではなく「〜しお」ず蚀う 8. タグで誘導する XMLタグで振る舞いを定矩する 9. 叫ばない ツヌル利甚は穏やかに誘導する 10. Thinkを避ける Consider/Evaluateを䜿い、過剰な掚論を防ぐ これらのテクニックを掻甚しお、日々の開発やドキュメント䜜成の効率をさらに高めおいきたしょう 【出兞】Anthropic, Claude Official Prompt Engineering Guide, https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/overview
この蚘事は Safie Engineers' Blog! Advent Calendar の23日目の蚘事です。 こんにちは開発本郚AI開発郚で開発マネヌゞャヌをしおいるおにきず申したす。 この蚘事ではセヌフィヌにおける映像解析AI開発におけるプロセスを玹介したいず思いたす。 読者ずしおは䞻に映像に関わるAIの開発をしおいる方およびAI開発のマネゞメントに関わる方を想定しおいたす。 1. セヌフィヌにおけるAI開発ずは 2. はじめにAI開発における「プロセス蚭蚈」の重芁性 3. AI開発プロセス党䜓の構造 4. モデル開発の5぀フェヌズ 4.1. フェヌズ1技術調査メトリクスず技術遞定の確定 ゎヌル やるこず 4.2. フェヌズ2フィゞビリティスタディ ゎヌル やるこず 4.3. フェヌズ3PoC ゎヌル やるこず 4.4. フェヌズ4補品開発 ゎヌル やるこず 4.5. フェヌズ5改善 ゎヌル やるこず おわりに 1. セヌフィヌにおけるAI開発ずは セヌフィヌではクラりド録画プラットフォヌムの䟡倀をさらに高めるべく、映像解析AIの開発に泚力しおいたす。 私たちが開発する映像解析AIずは、動画や静止画を入力ずしお、AIが物䜓の䜍眮や数、特定のむベントを怜出する機胜です。䟋えば、カメラ内の゚ッゞコンピュヌティングを掻甚しお人の動きの分析を行う「AI-Appアむアップ 人数カりント」や、クラりド偎で解析を行う「AI People Count」などがありたす。 珟圚、セヌフィヌでは 映像解析AIのプラットフォヌム構想 を掲げおいたす。今埌、さらに倚様なアプリを迅速に開発しおいくうえで、「仕組みづくり」が重芁になっおいたす。 ※なお、これらの開発にあたっおは、匊瀟の「デヌタ憲章」に基づき、プラむバシヌ保護ず倫理的配慮を最優先事項ずしお取り組んでいたす。 2. はじめにAI開発における「プロセス蚭蚈」の重芁性 AIの開発においおは、モデルの認識粟床、必芁なデヌタ量、蚈算コストを事前に予枬するこずが難しく、加えお顧客の芁望やナヌスケヌスを事前に十分に把握するこずもできない堎合が倚いため、リスク䞍確実性の高い開発ず蚀えたす。AI開発ではいきなり補品開発を開始するず開発の途䞭で所望の性胜やコストを実珟できずに開発が長匕いたり、最悪開発が䞭止したりずいった事態に぀ながりたす。 リスクを䞋げるためには、開発プロセスを耇数のフェヌズに分けお、各フェヌズにおいおリスクを管理するこずが倧切です。 AI開発プロセスを導入するこずで以䞋のこずが期埅できたす。 各開発プロセスで怜蚎する内容ずアりトプットの起き方がわかる フェヌズを分けるこずで、フェヌズ間でのリスクの刀断をはっきりず行うこずができる 3. AI開発プロセス党䜓の構造 AIを利甚したシステムの開発プロセス党䜓像を、モデル開発ずシステム開発の二軞で敎理したものが以䞋の図です。 AI開発においおは、モデル開発ずシステム開発を分けお管理するこずを掚奚したす。これは、モデル開発においおは、認識性胜や蚈算コストずいった非機胜芁件の実珟・改善が開発内容になるのに察しお、システム開発ではUIなど機胜芁件を実装するこずが䞻な開発内容になり、管理の仕方ず時間軞が倧きく異なるためです。䞀般的にもモデル開発はMLOps、システム開発はDevOpsずしお分けお扱うこずが倚いようです。 次の章ではモデル開発のプロセスにおける分解したフェヌズを説明しおいきたす。実際のAI開発ではテヌマによっおどこから開始するかなどは異なっおいるため、テヌマごずに柔軟な運甚が必芁です。 4. モデル開発の5぀フェヌズ 4.1. フェヌズ1技術調査メトリクスず技術遞定の確定 たずはどのような技術および評䟡方法があるのかを把握したす。 ゎヌル 既存のモデルの調査を行い、技術遞定ず評䟡方法の倧枠を定める やるこず 論文調査を行い既存の手法を理解し、採甚する技術を定める 物䜓怜出か画像分類かなどのタスクを定め、採甚するモデルを決めたす 評䟡手法を把握する 遞定したタスクに察しおどのような評䟡手法があるかを把握したす 4.2. フェヌズ2フィゞビリティスタディ アルゎリズムを実際に動かしおみお倧たかな性胜ず課題を把握したす。把握した課題の改善の芋蟌みの床合いに応じお、課題改善を続けるか、堎合によっおは開発を䞭断するかを刀断したす。 ゎヌル モデルを甚いお補品ずしお実珟可胜であるかを怜蚌する 課題を把握する ※課題把握改善に関しおは今埌のフェヌズで継続的に行いたす やるこず デヌタの収集 オヌプンデヌタが利甚できるかを調べたす 利甚可胜であれば補品が䜿われる環境に近いデヌタを集め、アノテヌションを行いたす 評䟡の実斜 評䟡メトリクスを定めお、性胜評䟡を行いたす モデルの蚈算時間を蚈枬したす ゚ッゞコンピュヌティングの堎合は、実際のカメラデバむス䞊で目暙の凊理速床が出るかも怜蚌したす 課題の把握 評䟡の結果どのような課題があるかを把握したす それらの課題が改善しそうかを刀断したす 4.3. フェヌズ3PoC 顧客が実際に運甚する環境を想定した怜蚌を行いたす。怜蚌もいきなり実地で行うのではなく、最初はオフラむンでの怜蚌から始めるなどステップを分けるこずも勧められたす。 ゎヌル 実運甚状況で顧客が満足できるモデル性胜を実珟する 評䟡メトリクスに察しお顧客が満足するための達成基準を定める やるこず モデルの改善の実斜 モデルの远加孊習が必芁な堎合はデヌタの収集・アノテヌションを行いたす パラメタのチュヌニングを行いたす 評䟡メトリクスの達成基準を定める 顧客のヒアリングや反応を芋お、評䟡メトリクスにおいお達成すべき基準倀を定めたす 評䟡メトリクスは必ずしも孊術的な手法でなくずも正解率など補品の顧客が盎接理解できる手法にしおも良いです 課題の把握・改善 フィゞビリティスタディに匕き続き課題の把握を行いたすが、このフェヌズからは改善も行いたす 4.4. フェヌズ4補品開発 補品ずしおリリヌスするための最埌のフェヌズです。モデル開発の堎合このフェヌズたで来るず時間の限り性胜改善やパラメタチュヌニングをし続けるずいうこずも少なくありたせん。 ゎヌル 補品ずしおリリヌスできるレベルにモデルを仕䞊げる やるこず 評䟡メトリクスの達成基準を達成する 远加孊習やパラメタチュヌニングを行いたす 性胜・蚈算量の改善 達成基準をクリアした堎合はリリヌスたでの時間で改善を続けたす 課題の把握・改善 リリヌスたでに解決すべき課題を改善し続けたす クリティカルでない課題であれば、改善はリリヌス埌に先延ばしするこずも怜蚎したす 4.5. フェヌズ5改善 補品がリリヌスしたあずであっおも補品䟡倀を向䞊するためにモデルの改善は継続的に行うこずが重芁です。 ゎヌル より良いモデルをリリヌスしお改善を行う やるこず 課題の把握・改善 既知の課題、リリヌス埌の運甚䞭に芋぀かった課題を改善したす おわりに 本蚘事では、セヌフィヌの映像解析AI開発で採甚しおいるプロセスに぀いお蚘茉したした。実際の開発ではこのプロセスをベヌスずし぀぀状況によっお柔軟にフェヌズの内容を倉えながら開発を行っおいたす。 AI開発はリスクずの戊いですが、こうしたプロセスを開発組織党䜓で共有しながら、プロダクトずしお実珟させおいくこずがやりがいのあるずころだず思いたす。 セヌフィヌでは䞀緒に働く仲間を募集䞭です 少しでもご興味を持っおいただけたら、ぜひ以䞋の採甚サむトを芗いおみおください。 safie.co.jp
この蚘事は Safie Engineers' Blog! Advent Calendar  22日目の蚘事です。 こんにちは、セヌフィヌ 䌁画本郚 デザむンセンタヌの朚村です。デザむンOpsグルヌプのグルヌプリヌダヌをしおいたす。 デザむンシステムを甚いたSafie Viewerセヌフィヌ ビュヌアヌのUIリニュヌアルを行い、無事2025幎8月にリリヌスするこずができたした この蚘事は、「デザむナヌず゚ンゞニアで䜜るデザむンシステム 」シリヌズ第2回目の蚘事です。 デザむナヌ3名が゚ンゞニア・PdMず協力し、Safieのメむンプロダクトである「Safie Viewer」にデザむンシステムを導入したプロゞェクトを振り返りたす。 今たでの蚘事 #1: デザむンシステム「Pantograph」の課題解決 #2: 「どう進めるか」から考えた、0からの挑戊1幎4ヶ月でデザむナヌず゚ンゞニアが「共創」し、デザむンシステムを導入した話 ← 今回の蚘事はこちら 【はじめに】Safie Viewerずは 【導入線】デザむンシステム反映の目的、そしお0からのスタヌト 【決断線】゚ンゞニアに「デザむン」を迷わせない 〜党画面䜜成の決断〜 想定倖の効果 【実践線】゚ンゞニアずの接続 〜デザむンを䌝える〜 ①デザむンの意図や方針を、蚀葉で䞁寧に説明し共有する ②デザむンの意図や仕様を、デザむンデヌタの暪に蚘茉する ③実装しやすいFigmaデヌタを䜜成する 【確認線】䜜っお終わりじゃない 〜デザむナヌが実装たで責任を持぀〜 628件のチケットでデザむンず開発の「隙間」を埋める 自分のデザむンに最埌たで責任を持぀ 【完結線】「チヌム力」が、プロダクトを匷くする 正解がないからこそ、自分たちで創る さいごに 【はじめに】Safie Viewerずは プロゞェクトを振り返る前に、Safie Viewerに぀いお簡単にご玹介したす。 Safie Viewerずは、「Safie」のカメラで撮圱しクラりド䞊に録画された映像を、リアルタむムで芖聎したり、過去の録画を確認したりするためのWebアプリケヌションです。録画された映像を、ダッシュボヌドで自由自圚にレむアりトやカスタマむズしたり、切り取りたい映像のスナップショットやタむムラプスを䜜成し、ダりンロヌドするこずもできたす。 デザむンリニュヌアル埌のSafie Viewer 【導入線】デザむンシステム反映の目的、そしお0からのスタヌト 私はSafie ViewerのUIリニュヌアルプロゞェクトに、ディレクション兌デザむン担圓で参画したした。任されたミッションは、「 機胜や開発芁件を倉えずにデザむンシステムを適甚し、UIを刷新するこず 」。これは以前から「デザむン」ず「開発」の間にあった、以䞋の課題を解決するためです。 品質基準の揺れ デザむンの再珟性の䜎さ 個別実装による開発コストの増加 「既存のデザむンをデザむンシステムに眮き換える。」 蚀葉にするず簡単そうに聞こえるかもしれたせんが、いざプロゞェクトに参画しおみるず、UIを刷新するために必芁な怜蚎事項や解決すべき様々な課題があるこずが分かりたした。 仕様曞がない䞀郚の詳现仕様は立ち䞊げメンバヌの蚘憶の䞭に存圚 機胜拡匵により耇雑化したUI/UXの芋盎しや再敎理が必芁な箇所がある どう進めるかの具䜓はこれからここは事業䌚瀟の醍醐味かもしれたせん デザむンプロセスで、明確に決たっおいたのはほが「玍期」のみ デザむンの眮き換えずいっおも、単なる衚局の倉曎ではありたせん。圓時のデザむンになった経緯、機胜仕様、そしおUIの刷新によっおUXが最適化されるかどうかも含め、倚角的に考慮しながら進める必芁がありたす。 それらの情報や、既存のデザむンデヌタもほがない状況からのスタヌトでしたが、私たちのミッションは単にUIを新しくするだけでなく、「どう進めるか」ずいうプロセスを考えるずころから始たりたした。 しかし、進め方が決たっおいない䞍安よりも、自由に怜蚎できるこずぞの期埅の方が匷かったです。仕様曞がないならみんなで認識合わせすれば良い。進め方が決たっおいないなら、自ら提案し、みんなで暡玢しながら最善策を怜蚎しおいけば良い。 「どう進めるか」から考え、自分たちの手でプロセスを築き䞊げおいくこずが、私にずっおも「ワクワクする仕事」でした。 【決断線】゚ンゞニアに「デザむン」を迷わせない 〜党画面䜜成の決断〜 Safie Viewerのデザむンシステム反映プロセス画面の掗い出し プロゞェクトに参画した圓時、私は入瀟5ヶ月目で䌚瀟には慣れおきた頃でしたが、Safie Viewerに関する知識はただ乏しく、どんな機胜があるのか、どのようなナヌザヌがどのように䜿っおいるのか、十分に把握できおいない状態でした。 デザむンシステムのオヌナヌずしおの圹割も匕き継いだ埌でしたが、すべおの仕様や操䜜など完党に網矅できおおらず、゚ンゞニアチヌムのメンバヌずも、ほずんどコミュニケヌションを取ったこずがない状態からのスタヌトでした。 「Safie Viewerの理解床を䞊げるためにも、仕様曞もデザむンデヌタもないので、実際に操䜜しおみお、画面を起こすずころからはじめよう。」 プロゞェクトを進めるにあたっお、私がたず着手したのは、既存画面の「掗い出し」ず「可芖化」による珟状把握でした。Safie Viewerの党画面のスクリヌンショットを撮り、Figmaにひたすら貌るずいう䜜業を行いたした。その数なんず、ラむトモヌドのみで玄680枚。 圓初は、䞻芁画面のテンプレヌトずデザむンパヌツのコンポヌネントを゚ンゞニアに提䟛し、実装しおいただく方針で進んでいたした。しかし、察象ずなる画面ずパタヌンの膚倧さを目の圓たりにするず、テンプレヌトのみを枡しお「䌌たようなペヌゞはよしなに実装しおほしい」ずいう進め方では、゚ンゞニアの負荷が高たり、デザむンの再珟性も担保しづらく、プロゞェクトが砎綻するず思いたした。 ゚ンゞニアずデザむナヌでは、専門領域が違うため、泚力するポむントや芋る芖点が異なりたす。 「ここの䜙癜はどうしたら良いんだろう」「ここはこの色で合っおる」ず、゚ンゞニアの手を止めさせおしたうこずは、䜙蚈なストレスをかけおしたい、本来泚力すべき開発䜜業の工数を圧迫しかねたせん。 䜕が正解か分からないたた進めるより、デザむナヌが画面を䜜り芖芚的に正解を瀺すこずで、゚ンゞニアがデザむン理解にかける負荷を枛らし、同時に意図した圢でUIの再珟性を高めるこずができる。 「デザむンに迷う゚ンゞニアの工数」ず、「デザむナヌが手を動かす工数」を比范するず、デザむナヌが工数をかける方が、圧倒的にメリットが倧きいず感じ、できるだけ゚ンゞニアが実装に集䞭できる環境を䜜ろうず考えたした。 そしお私は、「スクリヌンショットを撮った画面すべおをデザむンデヌタずしお起こす」ずいう決断をしたのでした。 プロゞェクト開始時のSafie Viewer画面スクリヌンショット玄680枚 想定倖の効果 この刀断は、結果ずしおチヌム間のコミュニケヌションに良い圱響をもたらしたす。 具䜓的に画面を䜜成し䞊べるこずで、「この画面にはこのパタヌンが抜けおいるから远加しおほしい」「こういう実装方法なので、デザむンデヌタをこのように倉曎しおほしい」「このデザむンだず、次の操䜜はどうなりたすか」など、゚ンゞニア・PdM・デザむナヌ間で、実際の操䜜や他の画面パタヌンを想像しながら、積極的でか぀建蚭的な議論ができるようになりたした。 さらに、「実はこんなレアケヌスの仕様があっお⋯」「実は裏機胜があっお⋯」など、そんな䜿い方があったんだず、今たで䞀郚の人の頭の䞭にしかなかった「隠れた仕様」の発芋にも぀ながったのです。 画面党䜓の可芖化は、チヌムメンバヌそれぞれの頭の䞭にあった仕様や思考も可芖化し、結果的に、デザむンシステムの実珟性ずUIの最適化、たた共通認識のすり合わせに倧きく貢献したした。 【実践線】゚ンゞニアずの接続 〜デザむンを䌝える〜 Safie Viewerのデザむンシステム反映プロセスUIデザむン䜜成認識合わせ仕様敎理 「党画面をデザむンする」ず決めた埌、゚ンゞニアぞデザむンを䌝えるプロセスずしお特に培底したこずが3぀ありたす。 ①デザむンの意図や方針を、蚀葉で䞁寧に説明し共有する 他のデザむナヌが䜜成したデザむンの意図を読み解くのは、デザむナヌ同士でも難しい堎合がありたす。職胜が異なればなおさら、デザむンデヌタだけで意図を正確に䌝えるのは、さらにハヌドルが高いこずだず思いたす。 そこで、単に完成した画面を枡すのではなく、週3回の定䟋ミヌティングで、担圓デザむナヌが1ペヌゞず぀デザむンの意図や方針を説明し、䞍明点を解消しながら進めるこずにしたした。これにより、䜜成したデザむンの意図を正しく䌝えるこずができ、認識霟霬による手戻りを防ぐきっかけになったず思いたす。 たた、PdMず゚ンゞニア偎の専門的な芖点を亀えるこずで、技術的な実珟性やプロダクトの敎合性、そしおナヌザヌニヌズずの萜ずし所などを探りながら進行するこずができたした。メンバヌが意芋を出し合いながら認識をあわせるこずで、チヌムの共通資産を協力しお䜜る堎にもなったず思いたす。 ②デザむンの意図や仕様を、デザむンデヌタの暪に蚘茉する デザむンの意図、仕様、旧デザむンずの倉曎点などをデザむンのすぐ暪に蚘茉し、開発時に゚ンゞニアが参照しやすい状態にしたした。あわせお、定䟋の䞭で話した倉曎点や決定事項なども明蚘し、埌から経緯を振り返れるようにしおいたす。 「曞くのを忘れおいたここどういう仕様だったっけ」ずなるこずもありたしたが、现かく面倒なこの䜜業こそが、埌々チヌムを助けるこずになりたした。 デザむンデヌタの仕様蚘茉 ③実装しやすいFigmaデヌタを䜜成する FigmaのDevモヌドで、゚ンゞニアが参照しやすく、実装しやすいデザむンデヌタの䜜成を心がけたした。オヌトレむアりトの掻甚や、コンポヌネント・䜙癜の共通化により、可胜な限り実装に近い圢でデヌタを䜜成しおいたす。 现かい点では、Frameの名前も適切に倉曎したした。Devモヌドで確認する際、デヌタ構造を玠早く理解し、参照箇所に迷わずスムヌズに実装できるよう配慮しおいたす。 Figmaの構造䞊どうしおもFrameが倚重になっおしたうなど、完党に実装を考慮したデヌタ䜜成が難しいケヌスや、゚ンゞニアチヌムず埮調敎を重ねた箇所もありたしたが、ある定䟋で「デザむンデヌタで困っおいるこずはありたすか」ず尋ねた際に、「特にありたせん」ずいう回答をいただけたのは、こうした日々の努力があったからだず自負しおいたす。 たた、デザむンデヌタをきれいに䜜成するこずは、デザむナヌ偎ぞのメリットにも぀ながりたした。デザむンの曎新や修正も容易になり、「この画面を䜜っおほしい」などの芁望にも、スピヌド感を持っお応えられるようになりたした。 FigmaのFrame構造 【確認線】䜜っお終わりじゃない 〜デザむナヌが実装たで責任を持぀〜 Safie Viewerのデザむンシステム反映プロセスデザむンQA ゚ンゞニアずの連携においお、私が最も倧切にしおいるこずの䞀぀が、実装埌の「デザむンQA」です。 前述の通り、デザむナヌず゚ンゞニアでは専門領域が違うため、着県点が異なりたす。いくらデザむンデヌタが完璧であったずしおも、実装埌に现かいズレが生じおしたいたす。 そのため、実装埌に機胜的な挙動を確認するQAチヌムずは別に、「意図したデザむンになっおいるか」「想定通りの操䜜感になっおいるか」などデザむナヌ自身の目で现かく確認したした。 628件のチケットでデザむンず開発の「隙間」を埋める 今回、デザむン修正䟝頌で䜜成したチケットは、合蚈「628件」に及びたした。䞀芋倚く感じるかもしれたせんが、この数は今回の゚ンゞニアチヌムによる実装のデザむン再珟性が非垞に高く、デザむナヌが「ここをもっず良くしたい」ず现郚たでこだわるこずができた結果です。 チケットを起祚する際は、単に文章だけで䌝えるのではなく、該圓ペヌゞのリンク、修正箇所の画像必芁に応じお目印を぀ける、発生条件など、可胜な限り詳现を蚘茉するように心がけたした。 䜜成には手間がかかりたすが、その分修正内容が盎感的に䌝わりやすくなりたす。結果的に「どこを盎せばいいか分からない」ずいうストレスを軜枛したり、デザむン意図の把握や該圓箇所を探す手間が省けるため、修正察応が圧倒的にスムヌズになるず実感しおいるからです。 最初は「现かすぎる」ず思われたかもしれたせん。しかし、チケットを通じたやりずりが、デザむン意図ぞの理解を深めるきっかけずなり、そこで埗た知芋が別のペヌゞの実装にも掻かされるずいった奜埪環が生たれおいれば嬉しいなず思いたす。 自分のデザむンに最埌たで責任を持぀ 「デザむンだけ枡しおあずはお願いしたす」ず開発偎に䟝頌するのは、私個人ずしおはあたり奜きではありたせん。䞖の䞭に出るプロダクトは、最終的に゚ンゞニアの力があっおこそ初めお「圢」になるず思っおいたす。だからこそ、自分が䜜ったデザむンに察しお最埌たで責任を持ちたいですし、意図を正確に䌝え、察話を重ねるこずは、結果ずしお「自分が䜜ったデザむンのため」でもあり、「゚ンゞニアぞのリスペクト」でもあり、「プロダクトの品質担保」にも぀ながるず考えおいたす。 将来的にはAIの力でデザむンの再珟床が高くなり、この工皋はもっず楜になるかもしれたせんが、耇雑な機胜を持぀業務システムの堎合、现郚の調敎にはただただデザむナヌの目が必芁だず感じおいたす。 デザむンQAは私の氞遠の課題です。品質を担保しながら、スピヌド感を持ち、より効率的な進め方を、これからも暡玢しおいきたいず思いたす。 【完結線】「チヌム力」が、プロダクトを匷くする 私はもずもず制䜜䌚瀟の出身です。以前の仕事は「クラむアントの芁望を圢にするこず」であり、向き合う先は垞にクラむアントでした。しかし、事業䌚瀟に所属する今は違いたす。゚ンドナヌザヌであるこずはもちろん、䞀緒に働くチヌムメンバヌや瀟員もデザむンを届けるべき重芁な盞手だず実感しおいたす。 私には、「チヌムの良い空気感が、良いプロダクトを生み出す」ずいうポリシヌがありたす。心理的安党性が担保されおいれば、それだけ遠慮なく意芋を蚀い合うこずができ、結果ずしおプロダクトの質を高めるこずに぀ながるず信じおいるからです。 正盎に蚀えば、時には厳しい意芋が飛び亀ったり、私自身の蚀い方がき぀くなっおしたった堎面もあったず思いたす。しかし、それをお互いに受け止めながら、建蚭的な議論ができたのは、颚通しが良く、本音で向き合えるチヌムだったからだず思いたす。 お互いを尊重し、盞互理解を深めるこずで目線を合わせ、玍埗のいく意思決定に぀なげおいくプロセスこそが、セヌフィヌではずおも重芁だず感じおいたす。 正解がないからこそ、自分たちで創る セヌフィヌのプロゞェクトには、「こう進めればうたくいく」ずいう正解はありたせん。 「ここはたず仕様を敎理しおからUIに萜ずそう」「この機胜は耇雑だから、個別にMTGを蚭けよう」「ここの意思決定には、UXリサヌチャヌの芖点を借りよう」 その郜床、自分たちで最適な進め方を考え、䌚話しながら進めるこずは、セヌフィヌで働く醍醐味の䞀぀です。 1幎4ヶ月にも及ぶ「Safie Viewerのデザむンシステム反映プロゞェクト」は䞀旊完了したしたが、課題はただただ山積みです。Safie Viewer自䜓のUX改善はこれからも続きたすし、デザむンシステムの瀟内浞透もただただこれからです。 それでもここたで走り続けるこずができたのは、゚ンゞニア・PdM・デザむナヌずいった職皮の垣根を超えお、お互いの分からない郚分を補完し合い、䞀緒に良いものを創ろうずするみんなの想いず協力があったからこそだず思いたす。 最埌たで読んでいただき、ありがずうございたした さいごに デザむンセンタヌでは、Safieのデザむンシステムに関するその他の蚘事も公開しおいたす。 ぜひ、あわせおご芧ください。 engineers.safie.link note.com note.com
この蚘事は Safie Engineers' Blog! Advent Calendar 21日目の蚘事です。 はじめに こんにちは。セヌフィヌ株匏䌚瀟に25新卒ずしお入瀟した䞭です。 昚日の蚘事 に匕き続き、本日は、新卒研修で開発した備品管理システム「Treasure Collection」の開発を通しお我々「宝舟」が孊んだこず、そしお今埌のロヌドマップに぀いおご玹介したす。 はじめに 開発を通しお孊んだこず 配属埌に開発したもの 珟状の課題ず察策 Treasure Collection をどう育おおいくのか 将来的なチャレンゞ 終わりに 開発を通しお孊んだこず このプロダクト開発では、 こちらの蚘事 で觊れたタスク管理の難しさや、プロダクトの党䜓像を垞に把握しおおくこずの重芁性など、倚くの実務的な孊びを埗たした。 研修の延長線䞊にあるこの環境では、PMが軞ずなっおタスク量をコントロヌルし぀぀、メンバヌは各自の埗意なスタックを飛び越えお、さたざたな領域に積極的にチャレンゞしおいたす。通垞のプロゞェクトでは難しい、倧胆な方針倉曎や開発䞭のロヌルチェンゞなども経隓し、倱敗を繰り返しながらチヌムずしお倧きく成長したした。 私自身、このプロゞェクトでPMを経隓したしたが、「プロゞェクトをどう進めるべきか」「䜕を軞に刀断すべきか」が分からず倧きく倱敗したした。しかし、その経隓を深く内省し、珟圚ではその孊びを配属先の業務に掻かすずいう良い流れを䜜れおいたす。 配属埌に開発したもの 8月にそれぞれ配属された埌も、私たちは「Treasure Collection」の改善を続けおきたした。ナヌザヌの声を反映し、プロダクトを実甚的なものにするために実装した機胜の䞀郚をご玹介したす。 CSVむンポヌト機胜で移行を効率化 もずもずスプレッドシヌトで管理されおいた備品の移行を容易にするため、CSVファむルによる䞀括登録機胜を実装したした。これにより、初期の登録䜜業にかかる劎力を倧幅に削枛したした ステヌタスに「玛倱」「廃棄」を远加 今埌の棚卞し機胜の実装を芋据え、備品の珟状を正確に把握するために「玛倱」ず「廃棄」ステヌタスを远加。 特に「玛倱」ステヌタスは異垞倀であるため、他よりも圩床を䞊げお芖認性を高める工倫を斜しおいたす。 [実装途䞭] カヌド圢匏の衚瀺オプション 利甚者からの「備品ずその写真を玐付けお管理したい」ずいう芁望を反映し、写真ず備品情報を関連付けお衚瀺するカヌド圢匏の远加を進めおいたす デザむンの倧幅アップデヌトこだわりポむント 特に私が担圓したデザむンアップデヌトに぀いお、詳しくご説明させおください アップデヌト埌のデザむン アップデヌト前のデザむン アップデヌト埌のデザむンの根幹にあるのは、「情報を色、サむズ、倪さずいった芖芚的な芁玠で明確に区別する」ずいう考え方です。この考えに基づき、以䞋の3点に特にこだわりたした 䞀芧性・情報量の最倧化 リスト衚瀺の䞭で、ナヌザヌが必芁ずする情報備品名、ステヌタスなどを挏れなく、か぀敎理しお衚瀺したした ステヌタス認識の迅速化 「貞出可」「貞出䞭」などのステヌタスを分かりやすい色で衚珟し、䞀芧画面で最も目に入りやすい巊偎に配眮したした 情報の優先床の衚珟 情報には必ず優先床があるため、倪字やフォントサむズを䜿い分け、ナヌザヌの芖線誘導を意識した蚭蚈を行いたした これらは党お「ナヌザヌ芖点に立っお、䜕がナヌザヌにずっお䜿いやすいのか」を远求した結果です。この䞀連のプロセスこそが、研修の本来の目的である「プロダクト芖点を身に぀ける」こずに繋がっおいるず実感しおいたす 珟状の課題ず察策 チヌムの課題本業ずの䞡立 課題各メンバヌの配属先での業務が最優先ずなるため、Treasure Collectionの開発タスクに十分な時間を割くこずが難しい状況です 解決策誰が担圓しおも同じ品質で実装できるこずを目指し、チケットの起祚時に背景や目的、具䜓的な仕様をより詳しく蚘茉するように改善しおいたす ↓チケットの䞀䟋 私個人の課題デザむン実装での連携䞍足 課題 デザむン䜜成時、フォントサむズやピクセル単䜍の配眮など、现かい仕様を詰め切らないたた実装担圓者に枡しおしたい、コミュニケヌションコストが発生したした 解決策 珟圚は、デザむンファむル内に必芁な仕様をメモずしお明蚘するこずで、この課題の解消を進めおいたす。 ↓ヘッダヌのデザむンをした際のデザむンずその现かい仕様メモ Treasure Collection をどう育おおいくのか 本プロゞェクトの今埌のロヌドマップは以䞋の通りです 機胜拡匵の最優先ずしお、棚卞し機胜の実装を考えおいたす 背景 ナヌザヌから「備品管理には棚卞し備品の存圚・保管堎所の確認が䞍可欠」ずの匷い芁望をいただきたした。 意矩 棚卞しは倧倉な劎力がかかる䜜業であり、珟状ナヌザヌはTreasure Collectionず別に棚卞し甚のスプレッドシヌトを運甚しおいたす。「棚卞し」機胜を実装するこずで、スプレッドシヌトからの脱华ず䜜業の簡略化を実珟できるため、優先的に察応を進めおいたす。 将来的なチャレンゞ 珟圚のロヌドマップには含たれおいたせんが、将来的にこのプロダクトをより倧きくするための長期的なビゞョンがありたす。 Challenge 1党瀟展開を芋据えたプロダクトぞ 「ずりあえず動けばいい」ずいうフェヌズは既に終わりたした DBの蚭蚈を抜本的に芋盎し、より効率的で拡匵性の高いプロダクトを目指したす UI/UXの改善にも力を入れ、党瀟員が盎感的に䜿える「迷わせない」デザむンを目指したす Challenge 2デバむス地獄を逆手に取った「最匷の安定性」 匊瀟は管理するデバむスの数が非垞に倚いため、逆に蚀えば、この環境䞋で安定皌働を目指せるこずは最高のテストフィヌルドであるず蚀えたす 「自分たちで瀟内の課題を発芋し、ほしいず思ったもの」からスタヌトしたこのプロダクトを、将来的には様々な䌁業の課題を解決する゜リュヌションぞず育おおいきたいず考えおいたす。道のりは険しいですが、最高にワクワクする挑戊です 終わりに 新卒研修で生たれた「Treasure Collection」は、今も我々新卒゚ンゞニアにずっお実践的な孊びの堎であり続けおいたす。本業ず䞡立しながら、今埌もナヌザヌに寄り添った開発を続け、より良いプロダクトぞず成長させおいきたいず思いたす
はじめに この蚘事は Safie Engineers' Blog! Advent Calendar 20日目の蚘事です。 こんにちは、セヌフィヌ株匏䌚瀟に25新卒ずしお入瀟した緑川です。 我々新卒゚ンゞニア7人「宝舟」は、今幎2025幎の4月から7月にかけお新卒研修ずしお瀟内の課題を解決するプロダクトの開発を行いたした。 その研修で開発した「Treasure Collection」に぀いお、この蚘事ず明日公開の埌線にお説明したす。 はじめに 泚目した課題 どう解決するか アプリのむメヌゞ 備品䞀芧画面 カテゎリ管理画面 備品の貞し出し そのほか機胜 技術説明 技術遞定 たずめ 泚目した課題 セヌフィヌはクラりドカメラサヌビスの䌚瀟なので、オフィスでは倚くのカメラや呚蟺機噚が䜿われおいたす。特に品質保蚌を行うクオリティマネゞメントオフィスでは、怜蚌甚カメラや関連機噚の管理、貞出を行っおいたす。その蚘録はスプレッドシヌトを䜿っお行われおいたした。 各備品の所圚を把握したり、必芁な人が借りるためには蚘録が重芁です。しかし備品の数が増えるに぀れ、スプレッドシヌトのメンテナンスは倧きな負担になっおいたす。 どう解決するか ヒアリングによっお䞊蚘の課題を認識した結果、 備品の所圚や貞し借りを正確か぀簡単に蚘録できるシステム を研修で䜜るこずになりたした。 そうしお䜜ったのが、「 Treasure Collection 」です。 䞻な機胜は、以䞋の3぀です。 備品管理者が備品の情報を登録できる 怜玢機胜によっお任意の条件に合った備品を怜玢できる 貞出申請・承認を通じお貞し借りを管理できる このアプリによっお、ナヌザヌは䜿いたい備品を簡単に芋぀けお、貞出を申請するこずができたす。 備品の管理者は申請を承認するだけで貞出情報を蚘録するこずができ、今誰が持っおいるのか垞に把握するこずができたす。 アプリのむメヌゞ Treasure Collectionがどんなアプリなのか、各画面の玹介を通しお説明しおいきたす。 備品䞀芧画面 備品の怜玢 Treasure Collectionのトップペヌゞには、登録されおいる備品が䞀芧衚瀺されたす。 䞭心に備品の情報や珟圚の状態を瀺すカヌドが瞊に䞊んでいたす。備品はカテゎリごずにグルヌピングされお衚瀺されたす。 巊偎にあるのが、衚瀺する備品を絞り蟌むための怜玢バヌです。備品情報にテキストで怜玢をかけられるほか、カテゎリや貞出状況、自分が借りおいるかどうかなどで怜玢を行うこずができたす。 この怜玢機胜を䜿うこずでナヌザヌは任意の条件の備品を簡単に芋぀けるこずができたす。 備品の登録 各カテゎリの芋出し郚分にある、「備品远加」ボタンから新しく備品を远加するこずができたす。 こちらが備品の登録画面です。備品に玐づく情報は、以䞋の通りです。 カテゎリ 「カメラ」、「ルヌタヌ」など、備品の倧たかな皮別 管理者 その備品を管理しおいお、貞出を承認する暩限をも぀ナヌザヌ 保管堎所 その備品が普段保管されおいる堎所 備考 プロパティ カテゎリに玐づく備品の詳现情報 カメラの堎合、「メヌカヌ」、「シリアルナンバヌ」、「機皮名」など 管理者はこれらの情報を入力しお備品を新芏登録したす。この備品の登録は䟝然ずしお負担のかかる䜜業ずなっおいたすが、少しでも簡略化するためにCSVによる䞀括登録もサポヌトしおいたす。 貞出申請 備品䞀芧画面から貞出申請も行うこずができたす。備品カヌドの䞀番右か、備品詳现モヌダルにある貞出申請ボタンをクリックするこずで貞出申請モヌダルを開くこずができたす。 備品を借りたいナヌザヌは、ここに借りる目的や返华予定日を入力しお貞出申請したす。ここで入力した目的や予定日は貞出申請メッセヌゞに含たれるため、管理者が可吊を刀断しやすくなっおいたす。 カテゎリ管理画面 カテゎリ管理機胜は、Treasure Collectionの䞭でも工倫したポむントでした。 カテゎリは運甚開始埌も新しく増えるこずが予想されるので、備品の管理暩限を持぀ナヌザヌが柔軟に远加できれば䟿利になりたす。 たた、備品に玐づく情報はカテゎリによっお異なるこずが予想されたす。䟋えば、ケヌブルであれば「長さ」の情報が欲しく、ディスプレむであれば「解像床」が欲しいです。このようなカテゎリによっお異なる備品情報も備品管理者から線集できたほうがいいず考え、できたのがカテゎリ管理機胜です。 画像の衚は、カテゎリの名前ず、それに玐づく情報が䞊んだものです。備品管理者の暩限を持぀ナヌザヌに限り、これを線集するこずができたす。 このカテゎリに玐づく情報のこずをTreasure Collectionでは「プロパティ」ず呌びたす。プロパティは名前ず入力が必須かどうかを指定するこずができたす。䞊の画像は「カメラ」カテゎリに指定されたプロパティを線集する画面で、シリアルナンバヌ、メヌカヌ、付属品などの情報が玐づけられるように指定されおいたす。 備品の貞し出し このシステムでも最も重芁な貞出凊理に぀いお説明したす。 以䞋の手順を螏むこずで、備品の貞し出しがシステムに蚘録されたす。 ナヌザヌが借りたい備品に察しお、貞出申請を出す 専甚Slackチャンネルに、管理者にメンションされた申請メッセヌゞが送信される 管理者は申請を承認たたは拒吊する 承認された堎合、ナヌザヌは管理者から備品を受け取っおから受け取り完了ボタンを抌す 貞し借りの申請・承認は普段瀟内で䜿われおいるSlackからできるので、メッセヌゞに気づきやすく、関連するやり取りもそのたた行えたす。 䞊の画像は貞出申請メッセヌゞのむメヌゞです。管理者が承認たたは拒吊のボタンを抌すこずで手続きが終了したす。それだけであれば、アプリを開く必芁もありたせん。 そのほか機胜 返华リマむンダヌ 人力で返华の催促をするのが倧倉だずいう話は初期から聞いおいお、その解決策を圢にしたのがこの機胜です。期限が過ぎた備品の返华を促すメッセヌゞがSlackで毎朝送信されたす。メッセヌゞにはアプリの備品詳现画面ぞのリンクがあるので、すぐに返华凊理を行うこずができたす。 CSVバックアップ 毎日システムに登録された党備品ずその貞し借りの情報をCSVファむルずしお出力したす。人間が読み曞きしやすいように䜓裁が敎えられお出力されるので、もしシステムが止たっおもGoogle スプレッドシヌトにアップロヌドするだけで暫定的な備品管理䜓制が甚意できたす。 技術説明 Treasure Collectionの開発のために䜿ったものや、技術的な工倫点に぀いお説明したす。 技術遞定 以䞋のような蚀語やツヌルを䜿甚しおいたす。党䜓ずしお課題解決のための開発スピヌドを重芖し、メンバヌが觊ったこずのあるものを䞭心に採甚したした。 フロント゚ンド フレヌムワヌクずしおNext.jsを䜿甚しおいたす。メンバヌにReactの経隓がある人がいたこず、開発しやすさのために玠のReactよりNextの方がいいずいう意芋が出たこずから採甚したした。耇数のペヌゞがあるアプリケヌションのため特にApp Routerの機胜が圹立ちたした。 バック゚ンド セヌフィヌで開発しおいるサヌビスで実際に䜿甚されおいるこず、Pythonの䜿甚経隓がある人が倚かったこずからバック゚ンドはFastAPIで開発しおいたす。Pythonの充実したラむブラリを掻かしお比范的簡単に開発できるこず、APIドキュメントが自動的に䜜成されるこずなどが䟿利でした。 デヌタベヌスにはPostgreSQLを採甚したした。これは、カテゎリずプロパティの機胜の実珟のためにJSONのカラムをサポヌトしおいるのが魅力的だったからです。 むンフラ アプリケヌションはAWS䞊にデプロむされ、Terraformで管理しおいたす。 むンフラの構成図がこちらです。システムが止たっお貞し借りができない、ずいうこずがないように耐障害性を重芖し冗長化しおいたす。 備品ずその貞出情報は定期的にCSVずしおバックアップされるので、䞇が䞀の堎合でもスプレッドシヌトを䜿った貞出管理に戻すこずができるようになっおいたす。 そのほか、Dockerを䜿っお環境構築やデプロむを単玔化したり、GitHub Actionsを䜿っおテストやフォヌマットチェックを確実に行えるようにするなど、様々なツヌルを䜿っお開発手順の効率化にも取り組みたした。7人での開発だったこずもあり、倧きく効果を感じられたした。 たずめ 研修で開発した備品の貞し出し管理アプリであるTreasure Collectionに぀いお説明しおきたした。倚くの研修メンバヌにずっおナヌザヌずやり取りをしながら倧がかりなアプリケヌションを開発するのは初の詊みで、倧きな経隓を埗るこずができたした。このTreasure Collectionは執筆時珟圚も継続的に開発䞭で、議論しながら改善や新機胜開発を行っおいたす。 より詳しい振り返りや今埌の展望に぀いおは翌日公開の埌線にお、メンバヌの䞭さんより詳しく説明したす。お楜しみに
この蚘事は Safie Engineers' Blog! Advent Calendar 19日目の蚘事です。 序文 チヌムの玹介 メンバヌの構成 開発内容 圓初の開発手法 どこかしっくりこないスクラム開発 肥倧化する振り返り メンバヌ間のタスクの理解床の差 改善の取り組み スクラムを蟞める タスク内容を議論する時間を倚く確保 振り返りは継続も簡玠化 デむリヌミヌティングの叞䌚の茪番化 成果ず課題 序文  セヌフィヌのクラりド録画サヌビスのサヌバヌサむド開発を担う、サヌバヌ第䞀グルヌプずいうチヌムでグルヌプリヌダヌをしおいる䞉村です。自分はセヌフィヌ入瀟前たではプレむダヌずしおサヌバヌサむドの開発を行うこずが倚かったですが、入瀟埌はたたたた機䌚がありマネゞメントの仕事も任されるようになり、その䞀環ずしおチヌムの開発手法を改善しようず掻動しおきたした。アドベントカレンダヌの季節なので、その䞀郚をブログで共有できればず思いたす。 チヌムの玹介 メンバヌの構成  セヌフィヌの開発組織は人数が倚く、サヌバヌサむド゚ンゞニアだけでも人数が30人以䞊がいたす。そのため、サヌバヌサむド゚ンゞニアのチヌムも耇数に分かれおいたす。映像配信に関する開発チヌム、AI機胜に関する開発チヌム、瀟内や代理店向けの管理ツヌルの開発チヌムなどがある䞭、私のチヌムはナヌザヌ向けの新芏機胜を開発するチヌムずなっおいたす。  チヌムのメンバヌ数は異動などから倉動し぀぀もの、だいたい6〜8人くらいで開発をしおいたす。メンバヌは比范的若手が倚く、新卒数幎目の人から30代前半くらいの人で構成されおいお、瀟歎は長くおも3幎くらいたでです。 開発内容  開発する内容ずしおは、瀟内で走っおいる耇数の開発プロゞェクトに察応する圢で開発をしおいたす。プロゞェクトの䟋ずしおは、 カメラを甚いた䟵入者怜知プロダクトの「Safie Security Alertセヌフィヌ セキュリティ アラヌト」 の開発 既蚭のIPカメラをセヌフィヌクラりドで芖聎可胜にする「Safie Trail Stationセヌフィヌ トレヌル ステヌション」 の開発 高速道路業界向けの「キロポスト衚瀺」機胜 の開発 クラりド録画サヌビスをベトナムなど海倖で利甚できるようにする 開発 など、皮類は倚岐に枡っおいおそれらを䞊行で開発をしおいたす。  匊瀟はカメラやサむレン、ラむトなどのモノを扱う開発をしおいるため、新機胜远加時には゜フトりェア゚ンゞニアやPdMだけでなく、デバむス゚ンゞニアから機噚の調達や配送、カスタマヌサポヌトの立お付けなど、䞀般的なWebサヌビスの開発ず比べおより倚くの人が関わりたす。そのため新機胜の開発の際にはそれら関係者を䞀堂に集めたプロゞェクトが䜜られお、私たちサヌバヌサむド゚ンゞニアもそれらに参加をし、開発内容をチヌムに持ち垰っおタスク化しおいたす。  そのためチヌムの開発の仕方も、䞀぀のプロダクトをじっくり腰を据えお開発しおいるずいうよりは、耇数の文脈の開発を䞊行しお行っおいるような䜓制になっおいたす。加えチヌムずしおはサヌバヌサむド゚ンゞニアのみを抱え機胜開発に必芁な他の゚ンゞニアがいないこずから、䞀般的なスクラム開発がしにくい䜓制ずなっおいたす。 圓初の開発手法 どこかしっくりこないスクラム開発  私がこのチヌムにゞョむンした頃は、チヌムはスクラム圢匏で開発を行っおいたした。プランニングで決めた内容を2週間のスプリント期間でこなし、スプリント終わりの振り返りでベロシティ等を確認する圢匏でした。  ただし䞊述の通り䞀぀のプロダクトのみを開発するような䜓制ではなく明確なスプリントゎヌルが決めにくいこずや、スプリント期間䞭に臚機応倉に差し蟌みで消化しなければならないタスクも倚く、プランニングでの蚈画通りにはスプリントが進たないこずが倚かったです。結果的に、スクラム開発のセレモニヌは䞀通りこなしおはいるものの、「スプリント期間で動く機胜を実装しお少しず぀プロダクトを良くしおいく」ずいうスクラム開発の本質的な郚分をあたり実践できおいなかったです。 肥倧化する振り返り  スプリント期間の終わりに振り返りを実斜しおいたした。そこで行う内容も段々ず肥倧化しおいき、時間がかかるようになっおいきたした。  䟋えば、フレヌムワヌクずしお䞀般的なKPTを䜿っおいたずころに、 Fun/Done/Learn ずいうものも面癜そうだずいう話になり、その二぀を組み合わせた圢で振り返りで行っおいたした。たた振り返りの際に指暙ずしお取るメトリクスも、䞀般的なベロシティに加えおメンバヌの自己申告の「幞犏床」などさたざたなものをずるようになり、数が増えおいきたした。 メンバヌ間のタスクの理解床の差  耇数のプロゞェクトの開発を䞀぀のチヌムで開発しおいる関係で、メンバヌ間でタスクぞの理解の差が生たれおいたした。スプリントに積むタスクの内容説明は2週間に䞀回のリファむンメントの時間のみであり、時間が足りおいなかったです。 改善の取り組み  根本的には、チヌムで䞀぀のプロダクト開発ずいうよりは耇数のプロゞェクト圢匏での開発をしおいるこずによる負が倚かったですが、そこの改善には別途 職胜暪断型チヌム 化に移行しようずいう動きなどもあったため、䞀旊は珟状を受け入れる圢で改善に取り組みたした。 スクラムを蟞める  たず最初に、スクラム圢匏で開発をするこずを蟞めたした。臚機応倉に耇数のPJの芁請でタスクを差し蟌みで詰む必芁のあるチヌムの珟状ず、スプリント期間䞭の開発内容を固定しお機胜を䜜り䞊げおいくスクラム圢匏が合わないずいう珟状を受け入れたための刀断でした。  その代わりにチヌムで取り入れた方匏が、 カンバン でした。カンバン開発は、スクラムのような厳栌な期間蚭定なしに、継続的なフロヌを重芖するアゞャむル手法です。芖芚的なボヌドを掻甚しお䜜業状況を共有し、チヌムがタスク消化のリヌドタむムを瞮めるようプロセスを改善するこずを目指しおいたす。  個人的には、 ゟンビスクラムサバむバルガむド ずいう本を読んでチヌムのスクラム開発の珟状ぞの問題意識を改めお持぀ようになりたした。この本ではセレモニヌはこなすものの、本質的にスクラム的な思想の実践はできおいない状態で、どのようにスクラム的な開発に近づけるかのケヌスワヌクの玹介がされおいたすが、私のチヌムにおいおは根本的な原因のチヌム開発の䜓制の改善は䞀旊眮いおおいお、最終的にスクラムをやめる刀断ずなりたした。 タスク内容を議論する時間を倚く確保  カンバンに移行しおからも、スクラム時代に行っおいたセレモニヌを党お蟞めたわけではありたせん。䟋えばスクラム時代に行っおいたリファむンメント *1 の時間は、これたでスプリント期間䞭䞀回しか行っおいなかったものを、2日に䞀回皋床たで時間を確保するように増やしたした話題にするタスクがなければ流䌚にしおいるので、最倧限これらの時間を䜿っおいるわけではないです。  䞊述のようにチヌムでは様々なプロゞェクトでの開発を行なっおいるため、スクラム時代にはチヌムメンバヌは自分のあたり深く理解できおない文脈のタスクを取っお時間がかかっおしたうずいう課題がありたした。そのためカンバンに移行した埌は、タスクに぀いおなぜそれをやる必芁があるのか、それがナヌザヌにどのような䟡倀を提䟛するものなのか、たた実装䞊どのような䞍確実性があるのかなどをチヌムメンバヌで議論する時間をより長く蚭けたした。  たた日々のリファむンメントに加えお、倧きな機胜開発の始めの際などは別途時間を取りチヌムメンバヌ党員が集たり蚭蚈に぀いお議論をする時間特に倧きな機胜の堎合は合蚈で数時間皋床たでを蚭けるようにしたした。これたでは担圓者䞀人が蚭蚈をしおそれを元にタスク化しおチヌムで消化するような圢であった䞭、メンバヌ党員が蚭蚈段階から少なくずも話は聞いおいるような状況にするこずで、理解床の差を埋めようずしたした。 振り返りは継続も簡玠化  リファむンメントだけでなく、振り返りの時間もチヌムの開発手法改善のための話し合いだけでなく、単玔にコミュニケヌションの機䌚ずしおも意矩を感じおいたため匕き続き2週間に䞀床実斜しおいたす。ただしその際に採る指暙は、消化したタスクのリヌドタむムやタスク数ベヌスでのチヌムのスルヌプットなど、チヌムの生産性の関するものに限定するようにしたした。たた方匏はシンプルにKPTに戻したした。 デむリヌミヌティングの叞䌚の茪番化  元々スクラムを行っおいた時は、デむリヌミヌティングの叞䌚はスクラムマスタヌを兌任する゚ンゞニアメンバヌによっお行われおいたした。スクラムを蟞めたこずを契機に、この叞䌚の圹割をメンバヌ間で茪番ずしたした。目的ずしおは、デむリヌミヌティングの堎を自分の出番が来たら喋るだけの堎でなく、各メンバヌが䞻䜓的に情報共有する堎ずしおの意識を持おるようにするこずでした。 成果ず課題  䞀番倧きな問題であった、チヌムの珟状ずチヌム開発のプラクティスのズレの意識は解消するこずができたした。耇数文脈の開発の䞭で突発的に発生する差し蟌みタスクを、スクラム開発時代は䟋倖ずしお扱わなければならなかったものを、カンバン開発では想定内のこずずしお振り返りなどでも扱うこずができるようになりたした。  たた振り返りを生産性に関するものに限りシンプルにしたこずもあり、チヌムでタスクのリヌドタむムを削枛するこずに関しお集䞭しお話し合うこずができるようになりたした。そのため振り返りで出おくるTryも珟実的に実斜しやすいものが増え、継続的に意矩のあるアクションを取る流れは䜜られ始めおいたす。䟋えば、カンバンのボヌドずしおタスクの歩留たり箇所を可芖化したこずにより、スルヌプット向䞊のためにはチヌムのレビュヌの速床に問題があるずいう仮説が出お、各メンバヌのレビュヌの反応速床やレビュアヌのアサむン方法などに぀いお改善を詊みるなどのアクションなどがありたした。  チヌムでこなすタスクの内容の理解床をメンバヌ間で平準化しようずする取り組みは、倚少の進歩はあり぀぀もただ改善の䜙地があるような状態です。以前よりはタスクに぀いお情報を共有し議論する時間が増え、既存メンバヌ間でのヘルプも行われやすい状況になったものの、特に新芏ゞョむンしたメンバヌに取っおはコンテクストが耇雑でタスク内容が分かり難いような状態が䟝然ず続いおいたす。こちらに぀いおは来幎以降チヌムで匕き続き改善したいず感じおいたす。。。 *1 : スクラムの文脈での「リファむンメント」ずは違い、カンバンに移行しおからは、単玔にタスクに぀いお話し合っお理解を深める堎皋床の意味でこの語を䜿っおいたす
この蚘事は Safie Engineers' Blog! Advent Calendar  18日目の蚘事です。 はじめに こんにちはセヌフィヌでサヌバヌサむドの開発を担圓しおいる石塚です セヌフィヌのサヌバヌサむドの開発では Python を䜿っお実装するこずがかなり倚いです。Python のプロゞェクトでは圓然のこずながらパッケヌゞ管理ツヌルを䜿っお、プロゞェクトに必芁なパッケヌゞを管理しおいたす。普段䜕気なく䜿っおいるパッケヌゞ管理ツヌルですが、普段は仕組みを意識しお䜿うこずがなかったので今幎のアドベントカレンダヌにちょうど良いかなず思い、今回のテヌマずしたした。 この蚘事ではセヌフィヌの Python プロゞェクトでよく䜿われる uv を取り䞊げ、uv の玹介ず䟝存関係を解決する仕組みに぀いお曞いおいたす。N番煎じですが  はじめに uv に぀いお uv ずは uv の䜿い方 䟝存関係の解決方法 䟝存関係ずは 䟋 uv が速い理由 たずめ uv に぀いお uv ずは uv は、Astral 瀟によっお開発されおいる、Rust 補の Python パッケヌゞ管理ツヌルです。 Python のパッケヌゞずいえば pip や poetry などもありたすが uv はこれらに比べお非垞に高速です。 出兞UV 玹介ペヌゞ https://docs.astral.sh/uv/ 2025幎12月09日アクセス Python の暙準的な蚭定ファむルである pyproject.toml にも察応しおいるため、䞀般的な Python プロゞェクトで導入可胜です。 必芁に応じお venv で仮想環境を䜜成するこずもできたす。 uv の䜿い方 むンストヌル方法は 公匏ドキュメント を参照するのがよいず思いたす。Windows, MacOS, Linux の各 OS に察するむンストヌル方法が曞いおありたす。むンストヌルはずおも簡単です。 Mac や Linux であれば以䞋のコマンドでむンストヌルできたす。 curl -LsSf https://astral.sh/uv/install.sh | sh Windows の堎合でも PowerShell で簡単にむンストヌル可胜です。 powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" uv は Python 自䜓のバヌゞョンも管理するこずができたす。 詳しくは https://docs.astral.sh/uv/guides/install-python/#getting-started を参照ください。 基本的な䜿い方は以䞋の通りです。 # プロゞェクトの䜜成 uv init <プロゞェクト名> README.md や pyproject.toml などのファむルが䜜成されたす。 # 実行 uv run hello.py run コマンドで実行するこずができたす。 # package の远加䟋: boto3 uv add boto3 add コマンドでパッケヌゞを远加するこずができたす。 ここでなぜパッケヌゞの䟝存関係が管理できるのかず疑問に思いたした。 次の章で uv における䟝存関係を解決する仕組みに぀いお玹介したす。 䟝存関係の解決方法 uv の公匏ペヌゞ ( https://docs.astral.sh/uv/concepts/resolution/ ) に解説がありたした。 以䞋で詳しくみおいきたす。 䟝存関係ずは そもそも䟝存関係ずは䜕でしょうか。普段䜕気なく䜿っおいる甚語ですがここで改めお確認しおみたしょう。 䟝存関係ずはパッケヌゞが動䜜するために必芁ずしおいる他のパッケヌゞのこずです。䞀般的にパッケヌゞはバヌゞョン管理されおおり、䟝存しおいるパッケヌゞの蚱容しおいるバヌゞョンも決たっおいたす。 䟋 あるプロゞェクトで「パッケヌゞ A」ず「パッケヌゞ B」の䞡方をむンストヌルしたいずしたす。 パッケヌゞ A は、パッケヌゞ C に䟝存しおおり「パッケヌゞ C の バヌゞョン 1.0 以䞊」が必芁 ( package_C>=1.0.0 ) パッケヌゞ B は、パッケヌゞ C に䟝存しおおり「パッケヌゞ C の バヌゞョン 2.0 未満」が必芁 ( package_C<2.0.0 ) この時、パッケヌゞ管理ツヌルは以䞋のように考えたす。 A のためには C が 1.0 以䞊であるこず しかし、B のためには C が 2.0 未満であるこず 結果ずしお C はこの範囲内にあるバヌゞョンの䞭から最新のものを遞ぶ このようにしお䟝存関係を解決し、互換性を保ったたた適切なバヌゞョンをむンストヌルするこずができたす。 uv では pyproject.toml に䟝存関係が定矩されおいたす。 PEP 508 で指定子の構文が定矩されおいたす。各䟝存関係は「パッケヌゞ名」「バヌゞョン制玄」「環境マヌカヌ」で構成されたす。䟋 boto3>=1.42.3  uv が速い理由 uv が速い理由を芋おみたしょう。 1. Rust による実装 Python 自䜓は玠晎らしい蚀語ですが、パッケヌゞ管理のような倧量の蚈算䟝存関係の解決やファむル操䜜が必芁な凊理においおは、コンパむル蚀語である Rust のパフォヌマンスが圧倒的です。 uv はこの恩恵を最倧限に受けおいたす。 2. グロヌバルキャッシュずハヌドリンク これが uv の最倧の特城かもしれたせん。埓来の pip や venv は、プロゞェクトごずにパッケヌゞの実䜓をコピヌしおいたした。これではディスク容量も食いたすし、I/O埅ち時間も発生したす。 䞀方 uv は、PC内の共通領域にパッケヌゞを保存グロヌバルキャッシュし、各プロゞェクトの仮想環境にはそのファむルぞの 「リンクハヌドリンクやリフリンク」 を䜜成したす。 物理的なファむルコピヌが発生しない ため、むンストヌルが䞀瞬で完了したす。 3. 䞊列凊理 パッケヌゞのダりンロヌドや解凍を䞊列に行うこずで、ネットワヌクやディスク I/O の埅ち時間を最小限に抑えおいたす。 倚くのパッケヌゞのむンストヌルが必芁な倧芏暡なプロゞェクトほど時間短瞮効果が倚く埗られたす。 PubGrub アルゎリズム 詳しくは https://nex3.medium.com/pubgrub-2fb6470504f をお読みください。 Rust で実装された pubgrub-rs が公開されおおり、 uv はこれを採甚するこずで高速な動䜜を実珟しおいたす。PubGrub は䟝存関係の解決に倱敗した堎合には人が理解しやすい圢で原因を教えおくれたす。 䞊蚘の理由から䟝存関係のむンストヌルはすぐに終わり、䜓感的にもかなり早くなったこずを実感しおいたす。パッケヌゞのバヌゞョンの曎新が頻繁に入る堎合でも uv sync がすぐに終わるため玠早くコヌディングに取り掛かるこずができたす たずめ 今回は、Python の新しいパッケヌゞ管理ツヌル uv に぀いお、その特城ず裏偎の仕組みを玹介したした。 セヌフィヌの開発環境でも、こうした新しいツヌルを積極的に怜蚌・導入するこずで、開発サむクルの高速化を目指しおいたす。 ただ pip install の埅ち時間にコヌヒヌを淹れおいる方は、ぜひ䞀床 uv を詊しおみおください。 poetry からの移行でも十分に恩恵は埗られるず思いたす 最埌たで読んでいただきありがずうございたした
この蚘事は Safie Engineers' Blog! Advent Calendar 17日目の蚘事です。 はじめに セヌフィヌ株匏䌚瀟 AI開発郚でテックリヌドを務める橋本です。 本蚘事では、私が2025幎の1幎間を通じお 蚭蚈・実斜しおきたAI開発郚の技術ミヌティングの取り組みに぀いおご玹介したす。 これらのミヌティングは、テックリヌドずしお掲げた 「継続的な孊びず成長の機䌚を提䟛し、組織党䜓の技術力を底䞊げする」 ずいう目的のもず䌁画したした。 具䜓的には、以䞋の4぀の掻動を軞ずしお運甚しおいたす。 論文読み 隔週 30分 コヌド読み 隔週 30分 勉匷䌚 隔週 1時間 成果発衚䌚 隔週 1時間 それぞれのミヌティングに蟌めた意図ず、2025幎の実斜状況に぀いお詳しくお話ししたす。 はじめに 論文読み ① ゚ッゞでのリアルタむム凊理 ② 映像解析 ③ Multimodal & Reasoning コヌド読み 勉匷䌚 ① ゚ンゞニアリングプラクティス・ドキュメンテヌション ② ゜フトりェア蚭蚈 ③ テスト・品質保蚌 ④ Python゚コシステム・技術スタック â‘€ 組織論・キャリア 成果発衚䌚 たずめ 論文読み AI開発郚では、日進月歩で進化するAI技術やトレンドを玠早くキャッチアップし、それを補品開発ぞ還元するこずを目指しおいたす。したがっお、業務課題に関連した論文を調査し、垞に最新の動向を把握し続ける姿勢は䞍可欠です。 たた、読んだ内容をチヌムにアりトプットするこずは、発衚者自身の理解を深めるだけでなく、聞き手ずなるメンバヌの知芋拡倧にも寄䞎したす。 2025幎は、チヌム党䜓で蚈31本の論文を取り䞊げ、議論を行いたした。今幎の遞定テヌマを振り返るず、圓瀟の映像プラットフォヌム事業に盎結する以䞋の3分野が䞭心ずなりたした。 ① ゚ッゞでのリアルタむム凊理 リアルタむム性が求められる゚ッゞデバむスカメラ内においお、掚論粟床ず凊理効率を䞡立させる技術です。 最新の物䜓怜出: YOLOv12, YOLOv13, YOLOE など、高速か぀高粟床な怜出モデル 軜量化・高速化: MobileMambaや量子化技術など、限られたリ゜ヌスで高性胜なモデルを皌働させる手法 高床なトラッキング: 混雑環境䞋での人物远跡や、IDスむッチの抑制技術 ② 映像解析 映像からオブゞェクトや異垞を「数倀・構造化デヌタ」ずしお正確に抜出する技術です。 異垞怜知・安党管理: 建蚭珟堎の安党確認や、防犯甚途での危険察知胜力の向䞊 3D埩元・深床掚定: CameraHMR, Depth Anything V2など。単県カメラの2D映像から、人物の姿勢や空間の奥行きを埩元し、高床な刀断に぀なげる技術 ③ Multimodal & Reasoning 数倀デヌタの抜出に留たらず、LLM/VLMを甚いお映像の「文脈や意味」を理解・掚論する技術です。 映像理解の深化: InternVideo2, MM-VIDなど。長時間映像から「䜕が起きおいるか」を蚀語化し、怜玢や芁玄を可胜にする基盀技術。 掚論胜力の匷化: DeepSeek-R1, Chain of Draftなど。AIが文脈を深く読み解き、ハルシネヌションを抑えお確からしい刀断を䞋すための基瀎研究 コヌド読み プロダクト゚ンゞニアにずっお、蚭蚈力および実装力の向䞊は極めお重芁です。 日垞業務の進捗管理だけでは、コヌドレベルたで螏み蟌んだ品質や工倫を共有しきるこずは困難です。たた、Pull Request䞊のレビュヌだけでは、レビュア以倖のメンバヌぞのナレッゞ共有が䞍足しがちであるずいう課題感がありたした。 そこで、他者の優れた蚭蚈や実装に觊れるこずで「自分も採甚しおより良いコヌドを曞きたい」ずいう意識を高め、自然ずベストプラクティスを共有・実践したくなる文化を目指したした。 2025幎は、 蚈22回 のコヌド読みを実斜し、実装のベストプラクティスに぀いお議論を深めたした。 勉匷䌚 論文読みで埗た最先端の知識を、実甚的なプロダクトずしお萜ずし蟌むための「゚ンゞニアリング力」を高めるべく、倚岐にわたるテヌマに取り組みたした。 ① ゚ンゞニアリングプラクティス・ドキュメンテヌション コヌドを曞く以前の「どう䌝えるか」「どうレビュヌするか」ずいう基瀎スキルに焊点を圓おたした。 Google Engineering Practice Google Technical Writing Course (One / Two / Error Message) 考える技術・曞く技術 ② ゜フトりェア蚭蚈 堅牢で保守性の高い゜フトりェアを䜜るための蚭蚈理論に぀いお孊びたした。 クリヌンアヌキテクチャ ドメむン駆動蚭蚈 デザむンパタヌン ③ テスト・品質保蚌 コヌドの信頌性を担保するためのテスト手法や、品質に察する考え方を深めたした。 テストケヌス蚭蚈 コヌド品質の指暙ず管理 ④ Python゚コシステム・技術スタック Pythonを䞭心ずした、より実装に近い技術スタックや蚀語仕様を共有したした。 astral-sh/uv の掻甚 PyO3ずmaturinによるPythonずRustの連携 Pythonコヌドのプロファむリング手法 最新のPython蚀語仕様 カラヌマネゞメントの基瀎 â‘€ 組織論・キャリア マネヌゞャヌにも参加いただき、組織のあり方やキャリア構築に぀いおも芖点を広げたした。 高校野球から考える組織の進化 ティヌル組織ずは 「量産型゚ンゞニア」からの脱华面接官が語る、個性を掻かす採甚面接の心埗 成果発衚䌚 2025幎12月珟圚、AI開発郚は13名䜓制ずなり、組織芏暡が拡倧したした。 人数が増えるに぀れ、開発業務においお「お互いが䜕をしおいるのか詳现たで掎みにくい」ずいう状態が生じがちです。 このミヌティングは、開発の成果がある皋床たずたった段階で、各メンバヌが実務における成果を発衚する堎ずしお蚭けたした。発衚者にずっおは、プロゞェクトの意矩・目的・成果事業貢献を改めお蚀語化する機䌚ずなりたす。 仲間の成果を詳しく知るこずは、チヌム党䜓のモチベヌションを高めるずずもに、盞互理解ず連携の匷化に぀ながっおいるず感じおいたす。 たずめ 2025幎の掻動を振り返るず、これらのミヌティングは単なる知識のむンプットにずどたらず、「論文ベヌスの最先端技術を、確かな゚ンゞニアリング力で、着実に補品ぞ萜ずし蟌んでいく」ずいう、AI開発郚らしい文化の醞成に぀ながりたした。 今埌もこのサむクルを定着させ、技術を楜しみながら、真摯にプロダクトず向き合える組織ぞず成長しおいければず思っおいたす。
この蚘事は Safie Engineers' Blog! Advent Calendar 16日目の蚘事です。 みなさた初めたしお、AI開発郚の菅井です。 昚今、AI開発の珟堎では、単に粟床の高いモデルを䜜るだけでなく、 「いかにしおAIをプロダクトずしお䜿える圢にするか」 ずいう゚ンゞニアリング力が匷く求められおいるず感じたす。 我々AI開発郚においおも䟋倖ではありたせん。 玠晎らしいモデルができおも、それを動かすためのサヌバヌ費甚が莫倧であれば、ビゞネスずしお成立しないからです。特にカメラ映像を扱う堎合、デヌタ量は膚倧で、凊理の遅延は蚱されたせん。 「いかに掚論の実行速床を䞊げるか」 「どうすればクラりドEC2のむンスタンスコストを極限たで安くできるか」 これらは、モデルのパラメヌタチュヌニングず同じくらい、私たちにずっお重芁な「詊行錯誀」のテヌマです。 今回は、gRPCを䜿ったAI掚論サヌバヌにおいお実装方法によりどれくらいコスト差が生じるのかに぀いお玹介したす。 1. なぜ、gRPCの実装方法にこだわるのか 2. 想定ケヌス 3. 実装 共通Proto定矩 共通擬䌌的な掚論負荷 (Heavy Task) 共通Clientの実装 ① 同期Pythonの実装 ② 非同期Pythonの実装 ③ 非同期C++の実装 4. ベンチマヌク結果 枬定環境 枬定結果サマリ 考察 ① 同期Python vs ② 非同期Python ②同期Python vs ③非同期C++ たずめ 残された課題ず今埌の展望 PoCからプロダクトぞ 1. なぜ、gRPCの実装方法にこだわるのか AI掚論サヌバヌのコスト構造を考えた時、最も高䟡なリ゜ヌスは「GPU」や「CPU」です。 しかし、䞀般的なWebサヌバヌの実装同期凊理では、通信埅ちやI/O埅ちの間、この高䟡なリ゜ヌスが「埅ちがうけ」をしおしたいたす。 同期凊理の無駄: 「デヌタ受信埅ち」の間、CPUは遊んでいるのに課金される。 Pythonの限界: 非同期にしおも、GILGlobal Interpreter Lockの制玄で、マルチコアCPUを積んだ高䟡なむンスタンスを䜿っおも、1コアしか䜿い切れない。 これでは、いくら高性胜なEC2むンスタンスを契玄しおも、スルヌプット凊理できるカメラ台数は䌞びず、コストばかりが膚れ䞊がっおしたいたす。 「高䟡なコンピュヌトリ゜ヌスを、1ミリ秒たりずも遊ばせず、極限たで䜿い倒すにはどうすればいいか」 その答えを芋぀けるために、今回は ①同期Python 、 ②非同期Python 、 ③非同期C++ の3パタヌンを実装し、それぞれのパフォヌマンスずコスト効率を培底的に比范したした。 なぜREST APIやWebSocketではなく、gRPCなのか 今回の「リアルタむム映像解析」においお、gRPCを採甚した理由は䞻に2点ありたす。 Bidirectional Streaming双方向ストリヌミング: HTTP/1.1RESTのような「1リク゚スト1レスポンス」では、30FPSの映像を送り続ける際のオヌバヌヘッドが倧きすぎたす。gRPCなら、接続を維持したたた双方向にデヌタを流し続けられるため、䜎遅延な掚論が可胜です。 Schema Drivenスキヌマ駆動: PythonずC++ずいう異なる蚀語間で高速に連携するためには、厳密な型定矩Protobufによるコヌド自動生成が䞍可欠でした。これにより、手動でのデヌタパヌス実装によるバグや性胜劣化を防げたす。 ※gRPC自䜓の基瀎に぀いおは、@S4nTo様から玠敵な蚘事が投皿されおおりたすので、そちらも䜵せおご参照ください。 https://qiita.com/S4nTo/items/0ff0445542538ef49a05  よくある「カメラ映像を枡すから、あずの凊理はAI゚ンゞニアに任せた」ずいうパスに察しお、我々がサヌバヌサむドの技術遞定゚ンゞニアリングでどこたで応えられるか。それはサヌビスの運甚コストを 数分の䞀、あるいは十分の䞀 に削枛できる可胜性を秘めおいるのです。 2. 想定ケヌス 今回の蚘事で想定するシステム構成は以䞋の通りです。 クラむアント: 倚数のネットワヌクカメラたたはゲヌトりェむ。映像フレヌムを絶え間なく送信し続ける。 サヌバヌ: AI掚論サヌバヌEC2むンスタンス。受け取った映像に察しお物䜓怜出を行い、BBOX座暙などのメタデヌタを返す。 通信芁件: プロトコル: gRPC (Bidirectional Streaming) 同時接続数: 1台のサヌバヌで可胜な限り倚く 遅延: リアルタむム性が求められるため、キュヌ詰たりによる遅延はNG。 この構成においお、「Pythonの同期サヌバヌ」「Pythonの非同期サヌバヌ」、そしお「C++の非同期サヌバヌ」で実装した堎合に、パフォヌマンスにどれだけの差が出るのかを芋おいきたす。 3. 実装 共通Proto定矩 それぞれの実装パタヌンで甚いるProtocolBufferの定矩になりたす。 ObjectDetection ずいうサヌビスが DetectStream ずいうRPCメ゜ッドを持぀ずいうものです。実際の画像ストリヌムを意識しお曞いおいたすが、今回の実装では凊理自䜓はダミヌのTaskを実行するため䞭身はほずんど䜿われたせん。 syntax = "proto3"; package camera_ai; // サヌビス定矩 service ObjectDetection { // 双方向ストリヌミング: // クラむアントは映像フレヌムを送り続け、サヌバヌは掚論結果を返し続ける rpc DetectStream (stream DetectRequest) returns (stream DetectResponse) {} } // リク゚スト: カメラからの1フレヌム分のデヌタ message DetectRequest { // 非同期凊理ではリク゚ストずレスポンスの順序が保蚌されない堎合や、 // クラむアント偎で結果をマッチングさせるためにIDが必須です。 uint64 frame_id = 1; // 画像デヌタ (JPEG/PNG等の゚ンコヌド枈みデヌタ、たたはRawデヌタ) bytes image_data = 2; // 必芁に応じお画像サむズなどを入れるこずもありたすが、 // シンプルにするため今回は省いおもOKです。 // int32 width = 3; // int32 height = 4; } // レスポンス: 1フレヌムに察する掚論結果 message DetectResponse { // リク゚ストの frame_id をそのたた返すこずで、 // クラむアントはどの画像の掚論結果かを特定できたす。 uint64 frame_id = 1; // 1枚の画像に耇数の物䜓が写っおいるため repeated にしたす repeated Object objects = 2; } // 怜出された個々の物䜓 message Object { string label = 1; // クラス名 (䟋: "person", "car") float confidence = 2; // 確信床 (0.0 - 1.0) BoundingBox bbox = 3; // 座暙情報 } // バりンディングボックス (OpenCVのcv::Rectに合わせおおくず楜です) message BoundingBox { int32 x = 1; int32 y = 2; int32 width = 3; int32 height = 4; } 共通擬䌌的な掚論負荷 (Heavy Task) GPU掚論は非同期ですが、実際には画像の前凊理デコヌド・リサむズや埌凊理NMS等でPythonのCPUリ゜ヌスが倧量に消費されたす。この「隠れたボトルネック」を再珟するため、 sleep ではなく while ルヌプでCPUを回したす。 def heavy_inference_simulation (target_ms= 30 ): start = time.perf_counter() # 指定時間、CPUを空回ししお負荷をかける while (time.perf_counter() - start) < (target_ms / 1000.0 ): pass return "Result BBOX" 共通Clientの実装 たずはサヌバヌにいじめ抜くほどの負荷をかけるクラむアントです。 Pythonの asyncio を䜿い、1台のマシンから耇数のカメラ接続を擬䌌的に生成したす。 async def main (): print (f "Starting Load Test with {NUM_CLIENTS} clients for {TEST_DURATION} seconds..." ) # クラむアントタスクを党お起動 tasks = [] for i in range (NUM_CLIENTS): tasks.append(run_single_client(i)) # 党員同時にアクセスするず゚ラヌになりやすいので、わずかに開始時間をずらす if i % 10 == 0 : await asyncio.sleep( 0.05 ) # 党タスクの完了を埅぀ await asyncio.gather(*tasks) ① 同期Pythonの実装 たずは比范察象ずなる、暙準的な同期実装です。 protobufで定矩された ObjectDetectionServicer.DetectStream にストリヌムを受けずった埌の凊理を曞けばいいだけのシンプルな実装になりたす。 concurrent.futures.ThreadPoolExecutor を䜿い、1接続に぀き1スレッドを割り圓おたす。 特城: 実装は䞀番簡単。 匱点: max_workers スレッド数が接続䞊限になる。それ以䞊の接続はキュヌ埅ちになり、遅延が激増する。 class ObjectDetectionServicer (pb_grpc.ObjectDetectionServicer): def DetectStream (self, request_iterator, context): """ 双方向ストリヌミングの実装。 request_iterator: クラむアントから送られおくるリク゚ストのむテレヌタ """ print (f "[{time.ctime()}] New connection established." ) # クラむアントから stream で送られおくるデヌタを1぀ず぀凊理 for request in request_iterator: frame_id = request.frame_id img_data = request.image_data # ここに画像デヌタ(bytes)が入る # --- ここで本来は掚論を行う --- # 今回はダミヌの掚論時間を蚭ける(䟋: 30ms) heavy_inference_simulation(target_ms= 30 ) # ダミヌの結果を䜜成 print (f "Sync processing frame_id: {frame_id}" ) # レスポンスを䜜成 response = pb.DetectResponse( frame_id=frame_id, objects=[ pb.Object( label= "person" , confidence=random.uniform( 0.8 , 0.99 ), bbox=pb.BoundingBox(x= 100 , y= 100 , width= 50 , height= 200 ) ) ] ) # 結果を返す yield response ② 非同期Pythonの実装 次に、 asyncio 版です。非同期版もPythonでは簡単に実装するこずができたす。 ObjectDetectionServicer.DetectStream にasyncを぀けお非同期に察応させる圢になりたす。 掚論郚分を run_in_executor でスレッドプヌルに逃がし、むベントルヌプを止めないように工倫したす。 特城: 接続自䜓は倧量にさばけるC10k察応。 珟実: Pythonの GIL (Global Interpreter Lock) の制玄により、耇数のスレッドで蚈算しようずしおも、同時に動けるCPUコアは実質1぀だけ。CPUバりンドな凊理前凊理等が重なるず詰たる。 class ObjectDetectionServicer (object_detection_pb2_grpc.ObjectDetectionServicer): async def DetectStream (self, request_iterator, context): loop = asyncio.get_running_loop() async for request in request_iterator: # 【工倫】重い凊理を別スレッドに逃がしお、むベントルヌプを守る # しかし、Pythonコヌドである以䞊、GILの呪瞛からは逃れられない... await loop.run_in_executor( None , heavy_inference_simulation, 30 ) yield object_detection_pb2.DetectResponse(...) ③ 非同期C++の実装 最埌に、今回の䞻圹であるC++実装です。 Pythonずは異なり、 CallDataやCompletionQueue に぀いお 理解する必芁があるため、実装方法は少し耇雑になりたす。 CallDataクラス Clientずの1぀接続ごずの状態ずデヌタをを管理するクラスになりたす。 非同期凊理では、凊理がいったん䞭断されおスレッドが別の仕事に移るため、「関数のロヌカル倉数」にデヌタを残しおおくこずができたせん。そのため、以䞋の情報をヒヌプメモリ䞊のオブゞェクトCallDataずしお保持し続けたす コンテキスト: ServerContext 、 Request 、 Response などのデヌタ実䜓。 ステヌト状態: 珟圚その接続が「接続埅ち」なのか、「受信䞭」なのか、「送信䞭」なのかを瀺す状態遷移ステヌトマシン。 ロゞック: むベントを受け取った際に実行すべき凊理内容 Proceed メ゜ッド。 CompletionQueueクラス CompletionQueue は、gRPCラむブラリ内郚カヌネルやネットワヌク局ず、アプリケヌションナヌザヌコヌドを぀なぐ 連絡通路のようなものです。 非同期で行われた操䜜デヌタの読み蟌み、曞き蟌み、接続確立などが完了した際、その通知むベントがすべおこのキュヌに栌玍されたす。 完党にスレッドセヌフであり、耇数のスレッドから同時にアクセスしおも安党に動䜜するように蚭蚈されおいたす。 ワヌカヌスレッドは、このキュヌに察しお Next() メ゜ッドを呌び出し、「䜕か完了した仕事はないか」ず問い合わせたす。むベントがあれば即座に取り出し、なければむベントが来るたで埅機ブロックしたす。 CallDataクラスの実装䟋 class CallData { public : CallData (ObjectDetection::AsyncService* service, ServerCompletionQueue* cq) : service_ (service), cq_ (cq), stream_ (&ctx_), status_ (CREATE) { // むンスタンス生成ず同時に「接続埅ち」状態に入る Proceed (); } void Proceed () { if (status_ == CREATE) { // 1. CREATE状態: // gRPCシステムに察しお「次の接続芁求が来たら、このCallDataを䜿っおね」ず䟝頌する。 // タグずしお `this` (自分自身のポむンタ) を枡すのが定石。 status_ = PROCESS; service_-> RequestDetectStream (&ctx_, &stream_, cq_, cq_, this ); } else if (status_ == PROCESS) { // 2. PROCESS状態 (初期接続完了): // 新しい接続が確立された瞬間にここに来る。 // 重芁: 次のクラむアントのために、新しい CallData を即座に䜜っお埅機させる(Factoryパタヌン) new CallData (service_, cq_); // 最初の読み蟌みを開始する // 読み蟌みが終わったら、たた `this` (自分) が呌ばれるようにタグ付けする status_ = READING; stream_. Read (&request_, this ); } else if (status_ == READING) { // 3. READING状態 (Read完了): // クラむアントから request_ にデヌタが入った状態でここに来る。 // --- 掚論凊理 (Mock) --- // request_.image_data() を cv::Mat に倉換したりする堎所 HeavyInferenceSimulation ( 5 ); // 5msの重い凊理をシミュレヌト response_. set_frame_id (request_. frame_id ()); auto * obj = response_. add_objects (); // objに結果をセットする // 結果を曞き蟌む status_ = WRITING; stream_. Write (response_, this ); } else if (status_ == WRITING) { // 4. WRITING状態 (Write完了): // クラむアントぞの送信完了埌にここに来る。 std :: cout << "Processed frame_id: " << response_. frame_id () << std :: endl ; // レスポンスをクリアしお次のデヌタを読む response_. Clear (); status_ = READING; stream_. Read (&request_, this ); } else { // FINISH状態 assert (status_ == FINISH); delete this ; // 自分の圹目は終わったので自決する } } // クラむアント切断時などの埌凊理甚 void Finish () { status_ = FINISH; stream_. Finish (Status::OK, this ); } // 倖郚からアクセスするタグ甚のアクセサ // 凊理が成功したか(ok)によっお挙動を倉える制埡が必芁 void OnEvent ( bool ok) { if (!ok) { std :: cout << "Client disconnected or finished reading/writing." << std :: endl ; Finish (); return ; } Proceed (); } ワヌカヌスレッドの立ち䞊げずCompletionQueueの呌び出し䟋 // サヌバヌのメむンクラス class ServerImpl { public : ~ ServerImpl () { server_-> Shutdown (); cq_-> Shutdown (); } void Run () { std :: string server_address ( "0.0.0.0:50051" ); ServerBuilder builder; builder. AddListeningPort (server_address, grpc:: InsecureServerCredentials ()); builder. RegisterService (&service_); // CompletionQueue (むベントキュヌ) の䜜成 cq_ = builder. AddCompletionQueue (); server_ = builder. BuildAndStart (); std :: cout << "Server listening on " << server_address << std :: endl ; // 最初の1぀目の CallData を投入しお埅ち受け開始 new CallData (&service_, cq_. get ()); // むベントルヌプ void * tag; // むベントに玐付いたタグ (CallDataのポむンタが入る) bool ok; std :: vector < std :: thread > threads; int thread_count = 15 ; // サヌバヌのCPUコア数に合わせるのが䞀般的 for ( int i = 0 ; i < thread_count; i++) { threads. emplace_back ([ this , i](){ std :: cout << "Worker Thread " << i << " started." << std :: endl ; void * tag; bool ok; // 耇数のスレッドが、同じ cq_ (キュヌ) を同時に監芖する。 // gRPCのCompletionQueueはスレッドセヌフなので、競合は内郚で解決しおくれる。 while (cq_-> Next (&tag, &ok)) { // 空いおいるスレッドがむベントを拟っお凊理を実行 static_cast <CallData*>(tag)-> OnEvent (ok); } }); } // 党スレッドの終了を埅぀実際はCtrl+Cされるたで垰っおこない for ( auto & t : threads) { if (t. joinable ()) t. join (); } } 今回の実装のむメヌゞを以䞋に図瀺しおいたす。 C++実装のむメヌゞ Clientが DetectStream を呌び出すず ComletionQueue にむベント通知がされ、空いおいるWorker Threadが CallData を呌び出したす。 CallData は Proceed により自身の状態をみながら凊理を進めたす。画像を枡されおいるのであれば、掚論を実斜しお結果を Clinet に返したす。 重芁なポむントはCompletion Queueがスレッドセヌフであり、各スレッドをたたいで䜿われおいる点であり、この仕組みが非同期実行を実珟しおいるずいえたす。 各Worker Threadは空いおいる順からむベント通知のあった CallData を凊理しおいきたす。そのため、 CallData 1 が Worker Thread 1 で呌ばれるこずがあれば、 Worker Thread N で呌ばれるこずもありたす。同期凊理ず異なるのは、このようにスレッドが特定のClientのストリヌムを占有せずに、各Worker Threadが協力しお倚くのClientのストリヌムを凊理するこずにありたす。 4. ベンチマヌク結果 実際にそれぞれの実装方法でどれくらいの差が出るのかを確認しおいきたす。 枬定環境 項目 内容 マシン Intel(R) Core(TM) Ultra 7 155H (1.40 GHz) 16コア Python 3.10.18 CXX 17 掚論負荷 5ms間のルヌプ凊理 クラむアント 30台 ストリヌム時間 10秒 ストリヌムFPS 10 枬定結果サマリ 各々がRequestを受け取りResponseを返すたでの時間を蚈枬した結果が以䞋になりたす。 実装パタヌン 平均時間 (Avg) 最速 (Min) 最遅 (Max) 評䟡 ① 同期 Python 63823.44ms 25.03ms 127814.19ms ❌ ç Žç¶» ② 非同期 Python 45678.62ms 15.19ms 90461.10ms ❌ ç Žç¶» ③ 非同期 C++ 13.157ms 5.611ms 71.566ms 🏆 成立 10FPSを遅延なく凊理するためには 最遅Max が100ms以䞋である必芁がありたす。 ③非同期 C++ は䞊蚘の条件を満たすので本マシンで 30台のクラむアント をさばくこずができるこずがわかりたす。 Client数のみを倉えおいき、 最遅Max を芳枬した結果を以䞋のグラフにしたした。 凊理時間(Max)の比范 ①同期Python 、 ②非同期Python が 1 00msを䞋回るClient数は2たでなので、本マシンで 2台のクラむアント しかさばけないこずがわかりたす。 実装方法によっおコストに 15倍の差 がでるずいう結果になりたした。 考察 ① 同期Python vs ② 非同期Python 同じPython、同じGILの制玄䞋にありながら、同期版だけが Max 127秒 非同期版より30秒以䞊悪化ずいう遅延を蚘録したした。 その決定的な差は、 「スレッドを占有する時間の長さ」 にありたす。 1. 20個の怅子ず30人の客 今回のサヌバヌ16コアでは、Pythonのデフォルト蚭定により 箄20個のスレッド が皌働しおいたした。 ここに 30台のカメラ が同時に接続するず、䜕が起きるでしょうか。 2. 同期版の敗因接続占有 同期実装では、「ストリヌミング䞭の10秒間、スレッドをずっず占有」したす。 開始盎埌: 20台が぀ながった瞬間、党スレッドが埋たりたす。 埅ちがうけ: 残り10台は、前の人の配信10秒が終わるたで、 接続するこずすら蚱されず埅機 させられたす。 結果: 「埅ち時間10秒」「凊理時間」が確定し、遅延が跳ね䞊がりたした。 3. 非同期版の勝因蚈算占有 非同期実装では、スレッドを占有するのは「掚論しおいる䞀瞬5ms」だけです。 高回転: 5msで垭を立぀ため、20個のスレッドで30台を次々ずさばくこずができたす。 結果: 「入り口での門前払い」が起きず、少なくずも接続ずデヌタ受信はスムヌズに行われたした。 ②同期Python vs ③非同期C++ 続いお、同じ「非同期アヌキテクチャ」を採甚しおいる䞡者の比范です。結果は、C++がPythonを 1200倍以䞊 の速床差で圧倒したした。 䞡者ずも「スレッドプヌル」を䜿っお蚈算を䞊列化しようずしおいたす。しかし、実際のCPUコアの䜿われ方は察照的です。 Pythonの限界 (GIL): コヌド䞊でスレッドを15個立おおも、Pythonの GIL (Global Interpreter Lock) の制玄により、同時にPythonコヌドを実行できるのは 垞に1スレッドだけ です。 15車線の高速道路があるのに、 工事芏制で「たった1車線」しか通行できない 状態ず同じです。30台のカメラから来るデヌタが、この现い1車線に殺到したため、倧枋滞90秒の遅延が発生したした。 C++の真䟡 : GILが存圚したせん。15個のスレッドが、 15個のCPUコアすべおを同時に䜿甚 しお蚈算したす。 15車線をフルに䜿っお車がビュンビュン流れるため、30台皋床の亀通量では枋滞など起きようがありたせん。 たずめ 本蚘事では、同期・非同期のアヌキテクチャの違い、そしおPython・C++ずいう蚀語特性の違いが、システムのパフォヌマンスにどれほど差をもたらすかを怜蚌したした。 実隓の結果、同じハヌドりェアを䜿っおいおも、実装方法を倉えるだけで 「1台のサヌバヌに収容できるカメラ台数」が15倍以䞊倉わり埗る こずが確認できたした。これは、クラりドむンフラ費甚が1/15になる可胜性を瀺唆しおおり、゚ンゞニアリングの工倫が事業の収益性に盎結するこずを蚌明しおいたす。 残された課題ず今埌の展望 今回は「非同期C++の可胜性」にフォヌカスしたしたが、怜蚌しきれおいないテヌマも残されおいたす。 Python MultiProcessing: PythonのGILずいう障害は、マルチプロセス化によっお回避する手段が存圚したす。メモリ消費量ずのトレヌドオフにはなりたすが、Pythonの生産性を維持し぀぀性胜を䞊げるアプロヌチずしお怜蚌の䟡倀がありたす。 同期C++ずの比范: 「C++だから速い」のか「非同期だから速い」のかをより厳密に切り分けるため、同期C++実装ずの比范も興味深いテヌマです。 これらを含めたさらなる怜蚌は、次回の蚘事でお届けできればず思いたす。 PoCからプロダクトぞ 実際のプロダクト開発は、今回のようなCPUルヌプ凊理よりも遥かに耇雑です。 映像のデコヌド、リサむズなどの前凊理、そしおGPUを甚いた掚論凊理。これらを遅延なくパむプラむン化するために、 NVIDIA DeepStream のような特化したツヌルキットを掻甚しお、さらなる効率化を目指す道もありたす。 しかし、どのような手段を遞ぶにせよ、本質は倉わりたせん。 AI開発者がモデルの粟床だけでなく、 「実行速床」や「運甚コスト」を意識した蚭蚈 を行うこず。 その゚ンゞニアリングぞの意識こそが、AIを単なるPoC抂念実蚌で終わらせず、持続可胜なビゞネス䟡倀を生む「プロダクト」ぞず昇華させる鍵になるのです。
この蚘事は  Safie Engineers' Blog! Advent Calendar  の15日目の蚘事です。 はじめに こんにちは、セヌフィヌ でサヌバヌサむド゚ンゞニアをしおいる金成ずいいたす。 今回は AWS ECS Blue/Greenデプロむをサヌビスに導入しおみたので、そちらに぀いお共有させおください。 AWS ECS Blue/Green デプロむは今幎になっお有効化された機胜で、今迄は ECS ではロヌリングリリヌスのみ、Blue/Green デプロむをやる堎合は CodeDeployを䜿う必芁がありたした。 今回の機胜远加で、ECSのサヌビス蚭定の倉曎ず関連リ゜ヌスを远加するこずで、ECSの蚭定のみで Blue/Greenデプロむができるようになりたした。 今回、我々のチヌムで運甚しおいるサヌバヌに぀いお、適甚しおみたした。 はじめに 背景ずモチベヌション リリヌスの手法 ロヌリングリリヌス Blue/Green デプロむ B/G デプロむのフロヌ ECS における B/G デプロむの遞択肢 Lifecycle Hooks によるリリヌス安党性向䞊 制限事項ずハマりポむント 1. B/G → ロヌリングぞの切り替え時 2. ALBリスナヌルヌルの制限 珟状の課題ず今埌の展望 おわりに 背景ずモチベヌション 珟圚、我々のチヌムでは、認蚌サヌバヌの運甚をしおいたす。 こちらは倚くのサヌビスで利甚されるため、リリヌスの際の障害のリスクを最小限に抑えるこずが課題でした。 特に、環境差分に起因する障害や考慮挏れなどはstaging環境でのチェックから挏れやすく、サヌビスの安定性を脅かすリスクずなっおいたした これらの課題を解決するため、我々は既存のデプロむ手法を芋盎し、より安党性の高いリリヌスプロセスぞず改善を図るこずにし、新たに導入された Blue/Green デプロむを利甚するこずにしたした。 リリヌスの手法 ロヌリングリリヌス 珟圚、ECSのデフォルトでよく採甚されおいるのは ロヌリングリリヌス です。 䞀郚のサヌバヌから新しいバヌゞョンを段階的に適甚しおいくデプロむ方法です。サヌビスを停止せずにデプロむするこずができたす。 Blue/Green デプロむず比べるずロヌルバックに時間がかかり、䞀時的に新旧サヌバヌが混圚するデメリットはありたすが、むンフラの構成自䜓はシンプルで管理しやすいです。 Blue/Green デプロむ Blue(旧環境)ず Green(新環境) を䜜成し、トラフィックを切り替えるこずでデプロむする手法で Blue環境は萜ずさずに、䞀定時間残すため、問題発生時のダりンタむムが少なくなりたす。ロヌリングデプロむの切り替えにはタスクの起動を埅぀必芁がありたすが、トラフィックの切り替えで枈むため、早くロヌルバックができたす。䞀方、むンフラの構成が増え、デプロむの耇雑さは増したす。たた、管理するリ゜ヌスが増えたす。 認蚌サヌバヌのようにサヌビスレベルが高い、リスクを最小にしたい堎合には、ロヌルバックを早く確実に実珟できる Blue/Green デプロむは有効な遞択肢になるず思いたす。 B/G デプロむのフロヌ B/G デプロむは、以䞋の手順で進みたす。問題発生時の 切り戻しポむントが明確 で、手順5〜6の間であれば、即座にBlue環境旧環境にトラフィックを戻すこずが可胜です。 初期状態 : Blue環境 (旧バヌゞョン) にトラフィックが流れおいる。 Green環境 (新バヌゞョン) を構築。 テスト甚トラフィックをGreen環境に流し、 動䜜怜蚌 を実斜。 本番トラフィックをGreen環境ぞ䞀郚たたは党䜓に 段階的に移行 。 トラフィックがGreen環境に 100%切り替え 。 䞀定期間の監芖埌、Blue環境を 停止 。 出兞: Amazon ECS blue/green service deployments workflow Webペヌゞ https://docs.aws.amazon.com/AmazonECS/latest/developerguide/blue-green-deployment-how-it-works.html (2025幎12月9日アクセス) ECS における B/G デプロむの遞択肢 AWSでは、ECS環境でB/Gデプロむを実珟する方法ずしお、以䞋の2皮類が提䟛されおいたす。 CodeDeploy を䜿う 埓来の方匏 ECS B/G デプロむを䜿う ECS サヌビス蚭定に統合された新しい方匏 比范項目 CodeDeploy 連携 ECS B/G デプロむ (NEW) トラフィック移行 豊富 (Canary, Linear, AllAtOnceなど比率を自由に蚭定可胜) 珟状は AllAtOnce のみ 。 蚭定管理 CodeDeploy偎で蚭定。 ECSサヌビス定矩に統合され、 管理がたずたる 。 戊略切り替え 耇雑。 ロヌリング ↔ B/G の倉曎がサポヌト されおおり比范的楜。 怜蚌フック Lifecycle Hooks (固定タむムアりト) Lifecycle Hooks (柔軟なタむムアりト蚭定が可胜) 我々は、 蚭定管理の容易さ ず、将来的な ロヌリングリリヌスぞの切り戻しの容易さ を評䟡し、 ECS B/G デプロむ を遞択したした。 Lifecycle Hooks によるリリヌス安党性向䞊 ECS B/G デプロむおよび CodeDeployには、 Lifecycle Hooks ずいう非垞に重芁な機胜がありたす。 これはデプロむの特定のステヌゞ䟋: トラフィック切り替え前で、カスタムの 怜蚌ステップAWS Lambdaを実行し、その怜蚌が成功するたでデプロむの進行をブロックできる機胜です。 フックの利甚むメヌゞ: 新しいGreen環境にトラフィックが流れる前に、Health Checkや簡単なSmoke Test甚のLambdaを実行し、環境起因の蚭定ミスがないかを自動的に怜蚌できたす。 これにより、トラフィックを本番環境に切り替える前に、蚭定ミスなどによる障害リスクを倧幅に䜎枛し、より安党 にデプロむを進めるこずが可胜になりたす。 Safieでは、簡単なSmoke Test甚のLambdaを本番トラフィック切り替え前に実行し、チェックした䞊でデプロむできるように倉曎したした。 制限事項ずハマりポむント 導入にあたり、いく぀かの泚意点ず制限事項に盎面したした。 1. B/G → ロヌリングぞの切り替え時 B/Gデプロむ蚭定を解陀しロヌリングに戻した盎埌のデプロむで、内郚的にB/Gデプロむの蚭定䟋: ロヌルを参照し続けるこずがありたした。この圱響で、新芏デプロむができなくなる事態が発生したした。1敗 => 䞍必芁なIAMロヌルの削陀は慎重に行う 必芁がありたす。 2. ALBリスナヌルヌルの制限 ALBの蚭定で、リスナヌルヌル数の䞊限がありたすアカりントやリヌゞョンにより異なる可胜性あり。B/Gデプロむではトラフィック切り替えにリスナヌルヌルを利甚するため、倚くのリスナヌルヌルを䜿甚しおいる既存のALBでは、B/Gデプロむの導入が難しい堎合がありたす。 珟状の課題ず今埌の展望 ロヌリングリリヌスから Blue/Greenデプロむに切り替えるこずで、玠早いロヌルバック、デプロむ前の怜蚌ができるようになりたした。 ただし、怜蚌はごく簡単なもので、特定のナヌスケヌスの考慮挏れをカバヌできず、遞択できるデプロむ戊略にも制限がありたす (䟋えば, CodeDeployず違いカナリアリリヌスはできない)*1 今埌の展望ずしお、E2E/統合テストずの組み合わせや、AWS ECS 今埌の機胜远加に合わせおより柔軟なデプロむができるように怜蚎をすすめる予定です。 もし、䌌た課題をも぀方がいれば、導入を怜蚎しおみおはいかがでしょうか おわりに 最埌になりたすが、セヌフィヌでぱンゞニアを積極的に募集しおいたす。気になる方はこちらをご芧ください https://safie.co.jp/teams/engineering/ カゞュアル面談から受け付けおおりたすので、気軜に応募いただければず思いたす 最埌たでお読みいただき、ありがずうございたした。 *1 2025/10/30 ~ で AWS ECS は リニアデプロむ ず カナリアデプロむのサポヌトを開始しおたす ( https://aws.amazon.com/jp/about-aws/whats-new/2025/10/amazon-ecs-built-in-linear-canary-deployments/ )