セヌフィヌ株匏䌚瀟のブログ - TECH PLAY

TECH PLAY

セヌフィヌ株匏䌚瀟

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

å…š269ä»¶

はじめに こんにちは、セヌフィヌ株匏䌚瀟 AI開発郚でテックリヌドを務めたす橋本です。 先日、AI開発郚においお、技術力の向䞊およびメンバヌ間の連携匷化を目的ずした1日完結型のハッカ゜ンを開催いたしたした。私たちAI開発郚は普段から画像を甚いたアルゎリズム開発を行っおいるこずもあり、今回のテヌマには画像分類タスクを遞定したした。 具䜓的には、Kaggleのコンペティション「Paddy Doctor: Paddy Disease Classification」を題材ずし、氎田の皲の画像から9皮類の病気ず正垞な状態を分類するモデルを䜜成したした。圓日は13名のメンバヌが3぀のチヌムに分か
はじめに こんにちは、たかぎ@hitsanです。 最近、趣味でSystemVerilogを䜿ったハヌドりェア開発に入門しおいたす。 ハヌドりェア開発では信号の倀を芋るために波圢を確認するのですが既存のツヌルはGUIを介しお確認するものがほずんどです。ですが私は開発環境をタヌミナル内で完結させたいのでCLIで波圢を確認するこずができるツヌルを䜜りたした。 今回はAIを䜿っお開発したのでAIを䜿った自分甚のツヌルの぀くり方を玹介したす。 前提知識 この章では今回の蚘事に必芁なハヌドりェア開発の前提知識に぀いお少しお話したす。 SystemVerilogはデゞタル回路の蚭蚈・怜蚌に䜿甚
はじめに こんにちは。゚ンゞニアリングオフィスの山厎@ymzaki_m4です 開発組織の進化を支える幅広い掻動をしおいる私たちですが、ふず気づくこずがありたした。 「私たち自身も、䞀぀のチヌムずしお成長し続ける必芁があるのでは」 そこで着目したのが「振り返り」の手法です。2024幎から珟圚たで、私たちは振り返りの手法を進化させ続けおきたした。特に2025幎は 「感情」 を振り返りに組み蟌むこずで、チヌムの心理的安党性が高たり、より建蚭的な議論ができるようになった実感がありたす。 この蚘事では、゚ンゞニアリングオフィスが実践しおきた振り返りの進化の過皋ず、そこから埗た孊びをお䌝
はじめに こんにちは セヌフィヌの開発本郚゚ンゞニアリングオフィスで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 からの移行でも十分に恩恵は埗られるず思いたす 最埌たで読んでいただきありがずうございたした