CDN - TECH PLAY - TECH PLAY

TECH PLAY

CDN

むベント

該圓するコンテンツが芋぀かりたせんでした

マガゞン

該圓するコンテンツが芋぀かりたせんでした

技術ブログ

はじめに こんにちは、NTT西日本の䞭川です。 本蚘事では、IndexedDB保存ず Transformers.js蚈算を組み合わせ、ブラりザ内でメモの意味怜玢たでのLocal-First AI入門を、ミニサンプルを甚いお玹介したす。 本蚘事は2026幎6月時点の情報に基づきたす。 生成AIが身近になった䞀方で、「APIにすべお任せればよいのでは」ず感じる方も倚いず思いたす。 私も最初はそう思っおいたした。ただ、議事メモをクラりドに貌るたびに「この本文、送っおよいのかな」ず迷う堎面があり、そのたびに刀断するのは負担に感じたので、ブラりザ内で完結する怜玢を詊しおみたずころ、それなりに䜿い所があるように感じたため、サンプルを亀えおご玹介したす。 察象読者 LocalStorageやIndexedDBの基本的な䜿い方は理解しおいる方 AIをアプリケヌションに組み蟌みたいが、サヌバヌ費甚やプラむバシヌ面に課題を感じおいる方 Local-First AI の有甚性が抜象的で、自瀟プロダクトのどこで効くかむメヌゞしづらい方 「AIにコヌドを曞かせる」段階から、「AIをブラりザ環境ぞ最適化する」段階ぞステップアップしたい方 目次 はじめに 察象読者 目次 1. 背景・目的なぜ今「Local-First AI」なのか 1.1 Local-First AI ずは䜕か 1.2 むメヌゞしやすい Before / After瀟内メモ怜玢の䟋 BeforeクラりドAPI䞭心 AfterLocal-First 寄り 1.3 本蚘事の知識が掻きるナヌスケヌス 1.4 珟実的な構成ロヌカルずクラりドの圹割分担 1.5 ベクトル怜玢を甚いたアプリケヌションが盎面しやすい3぀の課題 1.6 Local-First AIが向かないケヌス 2. 技術的アプロヌチIndexedDB長期蚘憶× Transformers.js掚論× Worker滑らかさ 2.1 ブラりザを「AIの脳」にするTransformers.jsず掚論バック゚ンドWASM/WebGPU 2.2 IndexedDBを「AIの長期蚘憶」ずしお䜿う 3. 蚭蚈䞊の前提 3.1 この蚘事で「守るこず/守れないこず」 3.2 埋め蟌み化が遅い・動かないずきの察凊 4. 【実装】ブラりザだけで動く「ロヌカルAIメモ怜玢」サンプル 4.1 䜕を䜜るか完成むメヌゞ 4.2 ファむル構成 4.3 詊し方 4.3.1 デモデヌタず怜玢ク゚リ䟋 4.3.2 怜玢結果のスコアずコサむン類䌌床 刀定の流れ怜玢1回あたり コサむン類䌌床意味の近さずは スコアの芋方 4.4 index.htmlUI・Worker起動 4.5 embedding.worker.jsCDN + IndexedDB + 怜玢 4.6 動かない時のチェックポむント 4.7 ぀たずきポむント 5. たずめAIにコヌドを任せ、蚭蚈を握るこずが倧事 執筆者 参考資料・出兞 商暙 1. 背景・目的なぜ今「Local-First AI」なのか 1.1 Local-First AI ずは䜕か Local-First AI は、「すべおのAIをブラりザだけで完結させる」こずず同矩ではありたせん。クラりドのサヌバヌなどに頌るのではなく、自身のパ゜コンやスマヌトフォンなど手元の端末ロヌカル環境䞊でAIの凊理や孊習を完結させる考え方の事を指したす。本蚘事で扱うのは、こんな蚭蚈です。 デヌタメモ・ログ・䞋曞きはブラりザ内IndexedDBに眮く 取埗埋め蟌み・類䌌怜玢・分類などは端末偎で回す 文章生成長文の芁玄・高床な回答は必芁なずきだけクラりドAPIぞ寄せる ぀たりハむブリッドな構成です。「通垞のLLMの圧倒的な賢さ」よりも、送りたくないデヌタを送らない埅ちを枛らすAPI代を抑える、ずいった芁件にマッチする考え方になりたす。 1.2 むメヌゞしやすい Before / After瀟内メモ怜玢の䟋 瀟内Webツヌルを想定した、䜓隓の違いです。 BeforeクラりドAPI䞭心 議事メモ100件の䞭から怜玢したい 入力のたびに自前のバック゚ンドAPI経由で、Embeddingモデルテキストや画像などの非構造化デヌタを数倀の配列ベクトルに倉換する技術のこずぞ本文を送信し、埋め蟌み化 懞念: 情報持ち出しポリシヌ、ログ保存、API課金、回線が匱いず埅ちが発生しおしたう AfterLocal-First 寄り メモ本文は IndexedDB に保存ブラりザ内 「先週の障害察応」などのク゚リは端末内で埋め蟌み化 → 類䌌メモを䞊䜍衚瀺 本文を倖郚ぞ送らない蚭蚈にしやすい初回のモデル取埗通信は別途発生 モデル取埗埌の怜玢は、埋め蟌み蚈算を端末偎で実行し、サヌバヌぞ本文を送らずに応答できる この蚘事のサンプルは After のうち「意味が近いメモを探す」郚分だけです。芁玄やチャット生成たでは扱わないので留意しおください。 1.3 本蚘事の知識が掻きるナヌスケヌス 次のようなナヌスケヌスでは本蚘事の考え方が掻躍できるかなず思いたす。 ご自身のプロダクトず照らし合わせお怜蚎しおみおください。 シヌン 困りごず Local-First でやりやすいこず 瀟内・個人のメモ・議事録の怜玢 クラりドLLMに貌るず情報管理が䞍安 本文を送らず意味怜玢本蚘事のデモ 回線が䞍安定な珟堎・店舗・むベント 回線が䞍安定でAPI埅ちが臎呜的 モデル取埗埌はオフラむン寄りで怜玢・分類 入力䞭の補助UI サヌバヌ埀埩で入力の反応が鈍くなる Worker + ロヌカル掚論で䜓感速床を改善 䌁画・怜蚌フェヌズ サヌバヌ構築前に䜓隓を詊したい ロヌカルファむルで仮説怜蚌 1.4 珟実的な構成ロヌカルずクラりドの圹割分担 党郚ロヌカルに寄せる必芁はありたせん。圹割を分けるず蚭蚈しやすいです。 ブラりザ: 保存・怜玢・分類など「自分のデヌタにだけ効く凊理」 クラりド: 品質最優先の生成、党瀟ナレッゞ暪断など「デヌタを送っおもよい凊理」 1.5 ベクトル怜玢を甚いたアプリケヌションが盎面しやすい3぀の課題 こうしたナヌスケヌスが効く背景ずしお、次の3぀がよく出おきたす。 APIコスト: すべおのリク゚ストをサヌバヌぞ送るず、ナヌザヌ増・利甚回数に䌎いコストが膚らみやすい。 プラむバシヌ: 議事メモ・顧客察応メモなど、倖郚サヌバヌぞ送りたくないデヌタがある。 応答性レむテンシヌ: ネットワヌク経由の掚論は、通垞、埅機時間が発生する。 IndexedDB保存ず Transformers.js などを䜿った端末内掚論蚈算を組み合わせるず、これらを同時に緩和しやすい堎面がありたす端末性胜・ブラりザ察応などの制玄はありたす。 1.6 Local-First AIが向かないケヌス 䞇胜ではないので、向かないケヌスも曞いおおきたす。 高品質な長文生成が䞻目的 党端末で同じ品質を厳密に保蚌したい 瀟内文曞を数癟䞇件単䜍で暪断怜玢したい専甚ベクトルDBが必芁 モデル配垃・曎新を厳栌に統制したい環境 こうした芁件が䞻なら、サヌバヌ偎のRAG怜玢拡匵生成やクラりドAPIを䞻圹にし、ロヌカルは補助ずする構成が珟実的です。 今回のデモがやっおいるのは、これだけです。 自分のメモだけを、キヌワヌド䞀臎ではなく「意味が近い順」で探せる。メモ本文を自前APIぞ送らずに枈む。 RAG怜玢拡匵生成でいうず、本デモは RRetrieval怜玢だけです。LLM ぞの枡し方や回答生成Gは扱いたせん。 2. 技術的アプロヌチIndexedDB長期蚘憶× Transformers.js掚論× Worker滑らかさ 先ほどの図で瀺した「ブラりザ内」を、具䜓的な技術芁玠に分解したす。 2.1 ブラりザを「AIの脳」にするTransformers.jsず掚論バック゚ンドWASM/WebGPU 珟代のブラりザはWebAssemblyやWebGPU APIを通じお、高速な挔算を掻甚できる環境が増えおきたした。ここにJavaScript向け掚論ラむブラリ䟋Transformers.jsを組み合わせるず、Python環境や自前サヌバヌに䟝存せず、ブラりザ䞊で掚論を実行できる構成を取りやすくなりたす。 サンプルは、Transformers.js を CDNjsDelivrから読み蟌むだけで動かしたす。ビルドツヌルは䜿いたせん。 Transformers.js は環境に応じお WebAssemblyWASMや WebGPU などぞフォヌルバックしたす。本蚘事のサンプルコヌドは、デフォルトの WASM バック゚ンドで掚論したす。 2.2 IndexedDBを「AIの長期蚘憶」ずしお䜿う RAG怜玢拡匵生成は「必芁な知識を怜玢しおから生成に枡す」考え方です。ここでは、ブラりザ内に保存したメモ矀を埋め蟌みベクトル化しおIndexedDBに保存し、ク゚リに近いものを取り出す、ずいうできるだけ軜めな構成にしおいたす。 たた、ブラりザでAI凊理を動かす際のボトルネックになりやすいのが、メむンスレッドの占有です。UI描画・入力・スクロヌルが詰たるず、ナヌザヌ䜓隓に悪圱響が出たす。メむンスレッドず Worker で圹割を分けたす。 メむンスレッド: UIの描画、ナヌザヌ入力、結果衚瀺 Web Worker: モデルロヌド、埋め蟌み蚈算、類䌌床蚈算、IndexedDBぞの曞き蟌み 3. 蚭蚈䞊の前提 3.1 この蚘事で「守るこず/守れないこず」 「ロヌカルに保存する安党」ではありたせん。ここは誀解が起きやすいので、前提を蚭けたす。 守りやすいこず蚭蚈でコントロヌルしやすい ナヌザヌが入力したメモ本文を、自前APIぞ送らない蚭蚈にできる APIコストを抑えやすい端末内掚論に寄せるほど 守れないこず別察策が必芁 端末のマルりェア感染、悪性ブラりザ拡匵、端末盗難などはロヌカル保存だけでは防げない XSSクロスサむトスクリプティングで同䞀オリゞン䞊のデヌタを読たれるリスクは臎呜的CSPContent Security Policy・サニタむズなどが前提 初回だけ倖郚通信が発生する Transformers.js はモデル重みを CDN / Hugging Face から取埗したすメモ本文そのものを送るわけではないが、通信自䜓は発生したす 瀟内プロキシやファむアりォヌルで倖郚 CDN が制限されおいる環境では、初回のモデル取埗が倱敗するこずがありたす別途ネットワヌク蚭定の確認が必芁 3.2 埋め蟌み化が遅い・動かないずきの察凊 端末やブラりザによっお、埋め蟌みの速さはかなり倉わりたす。本蚘事のサンプルは、Transformers.js の既定どおり WASMCPU䞊で動く方匏で動く前提です。WebGPU が䜿える環境では速くなるこずもありたすが、必須ではありたせん。 困ったずきは、この順で詊すずよいです。 たず動かす — WASM で登録・怜玢たで通す今回のデモはここたで 䜙力があれば速くする — 端末が察応しおいれば WebGPU を䜿うTransformers.js が自動で遞ぶ それでも厳しい — 意味怜玢をやめるのではなく、負荷を䞋げるキヌワヌド怜玢に切り替える、登録件数や topK を枛らす など 4. 【実装】ブラりザだけで動く「ロヌカルAIメモ怜玢」サンプル 4.1 䜕を䜜るか完成むメヌゞ 1章の After を、HTML ずJavaScriptの2ファむルで動かす段階です。メモ登録 → 埋め蟌み保存 → ク゚リで意味怜玢、ずいう流れだけに絞っおいたす。チャット回答や瀟倖API連携は範囲倖です。 4.2 ファむル構成 次の2ファむルを同じフォルダに眮きたす。 index.html 
 UIメむンスレッド embedding.worker.js 
 埋め蟌み化・IndexedDB・怜玢Worker 4.3 詊し方 この章の index.html ず embedding.worker.js のコヌドを、それぞれ同名ファむルずしお同じフォルダに保存する Visual Studio Code の Live Server などで、そのフォルダを http://localhost:... 経由で開く file:// で盎接開くず Worker が動かないこずが倚いです Google Chrome たたは Microsoft Edge で index.html を衚瀺する 「デモデヌタを䞀括登録」でサンプルを入れる初回はモデル取埗で数十秒かかるこずがありたす。「登録」から1件ず぀足しお詊しおもかたいたせん 䞋の怜蚌衚ず結果を比べたいずきだけ、件数が6件でなければ「すべお削陀」→「デモデヌタを䞀括登録」で揃える 怜蚌衚のク゚リで怜玢しおみるメモが6件未満でも怜玢は動きたす。衚瀺件数は、登録件数ず5件の少ない方たで 動䜜確認の目安: 怜蚌衚を䜿う堎合、各ク゚リで「期埅される䞊䜍デモデヌタ」が1䜍、環境によっおは2䜍以内なら意図どおりです。利甚モデルは Xenova/all-MiniLM-L6-v2 で、英語向けが䞻です。日本語のデモでも動きたすが、順䜍は端末やク゚リで前埌するこずがありたす。結果の数倀䟋: 0.165 の読み方は、続く「怜玢結果のスコアずコサむン類䌌床」を芋おください。Transformers.js は @xenova/transformers@2.17.2 CDNで固定しおいたす。 4.3.1 デモデヌタず怜玢ク゚リ䟋 「デモデヌタを䞀括登録」するず6件入りたす。6件しか扱えないわけではなく、䞋の怜蚌衚がこの6件を想定しおいるだけです。 䞀括登録されるデモデヌタ [障害察応] 2026-03-15 認蚌基盀タむムアりトの件。原因はDBのコネクションプヌル枯枇。再発防止策ずしおリトラむ䞊限を3回に倉曎し、アラヌト閟倀を調敎した。 [手順] 瀟倖からのVPN接続に぀いお。瀟倖ネットワヌクからはポヌタル経由でのみアクセス可胜。パスワヌドはITサポヌトにチケットを発行しお取埗するこず。 [顧客A瀟] 契玄䞊の特蚘事項ログに個人情報氏名・メアドを䞀切残さないこず。問い合わせ察応は専任のサポヌト窓口を経由するこず。 [議事録] 4/1 開発定䟋。次期リリヌスの目玉はRAG機胜の匷化。むンフラ費甚を抑えるため、䞀郚の怜玢凊理をフロント゚ンドブラりザ偎にオフロヌドする方針で合意。 [技術メモ] 埋め蟌み掚論は Transformers.jsWASMが既定。端末が察応しおいれば WebGPU バック゚ンドで GPU 掚論に切り替え可胜。 [オンボヌディング] 新入瀟員向けPCセットアップ手順。初期パスワヌドは入瀟初日に配垃される資料を参照。たずはセキュリティ研修動画の芖聎を完了させるこず。 怜玢ク゚リず期埅される䞊䜍デモデヌタ 怜玢ク゚リ 期埅される䞊䜍デモデヌタ 先週の認蚌゚ラヌの再発防止 メモ1 瀟倖から瀟内システムに入る メモ2 個人情報の取り扱いルヌル メモ3 コスト削枛の蚭蚈 メモ4 GPU 掚論 メモ5 新人の初期蚭定 メモ6 登壇 該圓メモなし語句䞀臎なし・盞察順䜍のみ 4.3.2 怜玢結果のスコアずコサむン類䌌床 怜玢結果は、だいたい次の圢で出たす。 0.165 (意味 0.165) [語句䞀臎 +0.12] - [id=5] [技術メモ] 埋め蟌み掚論は Transformers.jsWASMが既定。  0.411 (意味 0.411) [語句䞀臎なし] - [id=14] [手順] 瀟倖からのVPN接続に぀いお。  先頭の 0.165 は最終スコアで、括匧内の 意味 0.165 はコサむン類䌌床意味の近さだけを抜き出した倀です。 [語句䞀臎 +0.12] はク゚リ文字列が本文に含たれるずきの加点、 [語句䞀臎なし] は加点が付いおいないこずを瀺したす。サンプルでは searchScore でスコアを䜜り、降順に䞊べおいたす。 刀定の流れ怜玢1回あたり 「怜玢」ボタンを抌しおから結果が䞊ぶたでの流れですWeb Worker 内で完結し、メモ本文は倖郚 API ぞ送りたせん。 topKトップケむは、スコア順の䞊䜍K件だけ返す、ずいう意味です。K は返す件数で、倉数名ずしお topK ず曞くこずが倚いです。本サンプルでは worker.postMessage({ type: 'search', payload: { query, topK: 5 } }) のずおり 5件です。 メモ1件あたりのスコア蚈算 searchScore は、意味の近さベクトルず語句䞀臎文字列を組み合わせおいたす。 登録時は逆方向です。メモ本文を埋め蟌み化しお text ず vector を IndexedDB に保存したす怜玢のたびに再蚈算したせん。 コサむン類䌌床意味の近さずは Transformers.js のような埋め蟌みモデルは、メモ本文も怜玢語もベクトル数倀の䞊びに倉換したす。䌌た意味の文は、䌌たベクトルになりたす。意味で探すずきは、ベクトル同士の近さで䞊べるのが䞀般的です。 その近さを枬る指暙がコサむン類䌌床です。画面の (意味 0.xxx) がこれで、おおむね 0〜1 の範囲です1に近いほど意味が近い。怜玢の方法自䜓は他にもあり、語が本文に含たれるかだけを芋るキヌワヌド怜玢Google怜玢に近いもよく䜿われたす。本デモは意味怜玢を䞻にし、語句䞀臎は [語句䞀臎] の小幅な加点ずしお足しおいたす。そのため「障害」「タむムアりト」ずいった語が本文に無くおも、内容が近ければ䞊䜍に来たす。 最終スコアは、コサむン類䌌床に、怜玢語が本文にそのたた含たれるずきの小幅な加点 [語句䞀臎] を足したものです。 スコアの芋方 スコアを読むずきは、次の3぀を芋れば十分です。 順䜍0.05 でも 0.4 でも、数倀より䞊びが自然かを芋る [語句䞀臎] 付いおいれば、怜玢語が本文に含たれおいる。無ければコサむン類䌌床だけで䞊んでいる 件数最倧5件たで出るが、登録が3件なら3件たで。近い順に䞊んでいるだけのこずがある 怜蚌衚どおり6件入れた状態で 登壇 を怜玢するず、 0.411 などの数倀が出お「芋぀かったのかな」ず迷いたした。どのメモにもその語はなく、すべお [語句䞀臎なし] でした。数字が付いおいおも、登録されおいるメモのうち盞察的に近かっただけ、ずいう意味です。画面䞋の泚意文ず (意味 0.xxx) もあわせお芋おください。 4.4 index.html UI・Worker起動 メむンスレッドは UI ず Worker ぞのメッセヌゞ送受信だけを担圓したす。 <!doctype html> < html lang = "ja" > < head > < meta charset = "UTF-8" /> < meta name = "viewport" content = "width=device-width, initial-scale=1.0" /> < title > Local-First AI Memo Search </ title > < style > body { font-family : system-ui , sans-serif ; max-width : 720px ; margin : 2rem auto ; padding : 0 1rem ; line-height : 1.6 ; } textarea , input { width : 100% ; box-sizing : border-box ; } button { margin-top : 0.5rem ; } #status { min-height : 1.5rem ; color : #333 ; margin-top : 1rem ; } ol , ul { padding-left : 1.25rem ; } #memos li { margin-bottom : 0.5rem ; font-size : 0.95rem ; } #memos .meta { color : #666 ; font-size : 0.85rem ; } .note { font-size : 0.9rem ; color : #555 ; background : #f6f6f6 ; padding : 0.75rem 1rem ; border-radius : 6px ; } </ style > </ head > < body > < h1 > Local-First AI Memo Search </ h1 > < section > < h2 > メモ登録 </ h2 > < textarea id = "memo" rows = "4" placeholder = "メモを入力" ></ textarea > < button id = "add" type = "button" > 登録 </ button > < button id = "loadDemo" type = "button" style = "margin-left: 1rem;" > デモデヌタを䞀括登録 </ button > < button id = "clearAll" type = "button" style = "margin-left: 1rem;" > すべお削陀 </ button > </ section > < section > < h2 id = "memosHeading" > 登録枈みメモ読み蟌み䞭  </ h2 > < ul id = "memos" ></ ul > </ section > < section > < h2 > 怜玢 </ h2 > < input id = "q" type = "search" placeholder = "䟋: WebGPU 掚論 / 瀟倖から瀟内システム / 登壇無関係ク゚リの䟋" /> < button id = "go" type = "button" > 怜玢 </ button > < p class = "note" style = "margin-top: 0.5rem;" > 結果は < code > 最終スコア (意味スコア) [語句䞀臎] </ code > の順です。語句䞀臎が無いずきは、 登録メモの䞭でベクトルが盞察的に近い順に䞊んでいるだけで、必ずしも関連メモがあるわけではありたせん。 </ p > < ol id = "results" ></ ol > </ section > < div id = "status" aria-live = "polite" ></ div > < script type = "module" > const memoEl = document . getElementById ( 'memo' ) ; const addBtn = document . getElementById ( 'add' ) ; const loadDemoBtn = document . getElementById ( 'loadDemo' ) ; const clearAllBtn = document . getElementById ( 'clearAll' ) ; const memosHeading = document . getElementById ( 'memosHeading' ) ; const memosEl = document . getElementById ( 'memos' ) ; const qEl = document . getElementById ( 'q' ) ; const goBtn = document . getElementById ( 'go' ) ; const resultsEl = document . getElementById ( 'results' ) ; const statusEl = document . getElementById ( 'status' ) ; const worker = new Worker ( './embedding.worker.js' , { type : 'module' }) ; function refreshMemos () { worker . postMessage ({ type : 'listMemos' }) ; } function renderMemos ( memos ) { memosHeading . textContent = `登録枈みメモ ${ memos . length } 件` ; memosEl . innerHTML = '' ; if ( memos . length === 0 ) { const li = document . createElement ( 'li' ) ; li . textContent = 'ただメモは登録されおいたせん。「デモデヌタを䞀括登録」で詊せたす。' ; memosEl . appendChild ( li ) ; return; } for ( const m of memos ) { const li = document . createElement ( 'li' ) ; const meta = document . createElement ( 'div' ) ; meta . className = 'meta' ; meta . textContent = `id= ${ m . id } ` ; li . appendChild ( meta ) ; li . appendChild ( document . createTextNode ( m . text )) ; memosEl . appendChild ( li ) ; } } worker . onmessage = ( ev ) => { const { type , payload } = ev . data ; if ( type === 'listMemosResult' ) { renderMemos ( payload . memos ) ; return; } if ( type === 'addMemoResult' ) { statusEl . textContent = `登録したしたid= ${ payload . id } ` ; refreshMemos () ; return; } if ( type === 'loadDemoResult' ) { statusEl . textContent = `デモデヌタ ${ payload . count } 件を䞀括登録したした既存デヌタは眮き換え枈み。` ; refreshMemos () ; return; } if ( type === 'clearAllResult' ) { statusEl . textContent = 'すべおのメモを削陀したした。' ; refreshMemos () ; return; } if ( type === 'searchResult' ) { resultsEl . innerHTML = '' ; if ( payload . items . length === 0 ) { const li = document . createElement ( 'li' ) ; li . textContent = '該圓するメモがありたせん' ; resultsEl . appendChild ( li ) ; statusEl . textContent = '' ; } else { const anyKeyword = payload . items . some (( it ) => it . keywordMatch ) ; for ( const it of payload . items ) { const li = document . createElement ( 'li' ) ; const kwTag = it . keywordMatch ? ` [語句䞀臎 + ${( it . keywordBoost ?? 0 . 12 ) . toFixed ( 2 )} ]` : ' [語句䞀臎なし]' ; li . textContent = ` ${ it . score . toFixed ( 3 )} (意味 ${ it . semantic . toFixed ( 3 )} ) ${ kwTag } - [id= ${ it . id } ] ${ it . text } ` ; resultsEl . appendChild ( li ) ; } if ( ! anyKeyword ) { statusEl . textContent = 'いずれも語句䞀臎なしです。衚瀺は topK=5 件の「盞察順䜍」であり、ク゚リに近いメモが無い堎合でもスコア付きで䞊びたす。本番ではスコア閟倀やメタデヌタ絞り蟌みを怜蚎しおください。' ; } else { statusEl . textContent = '' ; } } return; } if ( type === 'error' ) { statusEl . textContent = `゚ラヌ: ${ payload . message } ` ; } } ; addBtn . addEventListener ( 'click' , () => { const text = memoEl . value . trim () ; if ( ! text ) return; statusEl . textContent = '登録䞭...初回はモデル取埗のため数十秒かかる堎合がありたす' ; worker . postMessage ({ type : 'addMemo' , payload : { text } }) ; memoEl . value = '' ; }) ; loadDemoBtn . addEventListener ( 'click' , () => { statusEl . textContent = 'デモデヌタを登録䞭...初回はモデル取埗のため数十秒かかる堎合がありたす' ; worker . postMessage ({ type : 'loadDemoData' }) ; }) ; clearAllBtn . addEventListener ( 'click' , () => { if ( ! confirm ( '登録枈みメモをすべお削陀したす。よろしいですか' )) return; worker . postMessage ({ type : 'clearAllMemos' }) ; }) ; goBtn . addEventListener ( 'click' , () => { const query = qEl . value . trim () ; if ( ! query ) return; resultsEl . innerHTML = '' ; statusEl . textContent = '怜玢䞭...' ; worker . postMessage ({ type : 'search' , payload : { query , topK : 5 } }) ; }) ; refreshMemos () ; </ script > </ body > </ html > 4.5 embedding.worker.js CDN + IndexedDB + 怜玢 Worker 偎で Transformers.jsCDNを読み蟌み、IndexedDB生APIぞ保存・怜玢したす。 import { pipeline } from 'https://cdn.jsdelivr.net/npm/@xenova/transformers@2.17.2' ; const DB_NAME = 'AI_Memory' ; const DB_VERSION = 1 ; const STORE_NAME = 'memos' ; const MODEL_ID = 'Xenova/all-MiniLM-L6-v2' ; let embedder ; // --- IndexedDB生API --- function openDb () { return new Promise (( resolve , reject ) => { const req = indexedDB . open ( DB_NAME , DB_VERSION ) ; req . onupgradeneeded = ( event ) => { const db = event . target . result ; if ( ! db . objectStoreNames . contains ( STORE_NAME )) { const store = db . createObjectStore ( STORE_NAME , { keyPath : 'id' , autoIncrement : true , }) ; store . createIndex ( 'timestamp' , 'timestamp' ) ; } } ; req . onsuccess = () => resolve ( req . result ) ; req . onerror = () => reject ( req . error ) ; }) ; } function dbAdd ( record ) { return openDb () . then ( ( db ) => new Promise (( resolve , reject ) => { const tx = db . transaction ( STORE_NAME , 'readwrite' ) ; const req = tx . objectStore ( STORE_NAME ) . add ( record ) ; req . onsuccess = () => resolve ( req . result ) ; req . onerror = () => reject ( req . error ) ; tx . oncomplete = () => db . close () ; }) , ) ; } function dbGetAll () { return openDb () . then ( ( db ) => new Promise (( resolve , reject ) => { const tx = db . transaction ( STORE_NAME , 'readonly' ) ; const req = tx . objectStore ( STORE_NAME ) . getAll () ; req . onsuccess = () => resolve ( req . result ) ; req . onerror = () => reject ( req . error ) ; tx . oncomplete = () => db . close () ; }) , ) ; } function dbClearAll () { return openDb () . then ( ( db ) => new Promise (( resolve , reject ) => { const tx = db . transaction ( STORE_NAME , 'readwrite' ) ; const req = tx . objectStore ( STORE_NAME ) . clear () ; req . onsuccess = () => resolve () ; req . onerror = () => reject ( req . error ) ; tx . oncomplete = () => db . close () ; }) , ) ; } async function listMemosForUi () { const all = await dbGetAll () ; return all . map (( m ) => ({ id : m . id , text : m . text , timestamp : m . timestamp })) . sort (( a , b ) => b . timestamp - a . timestamp ) ; } // --- ベクトルナヌティリティ --- function float32ToBuffer ( f32 ) { return f32 . buffer . slice ( f32 . byteOffset , f32 . byteOffset + f32 . byteLength ) ; } function bufferToFloat32 ( buf ) { return new Float32Array ( buf ) ; } function cosineSimilarity ( a , b ) { if ( a . length ! == b . length ) throw new Error ( 'ベクトル長が䞀臎したせん' ) ; let dot = 0 , na = 0 , nb = 0 ; for ( let i = 0 ; i < a . length ; i ++ ) { dot += a [ i ] * b [ i ] ; na += a [ i ] * a [ i ] ; nb += b [ i ] * b [ i ] ; } const denom = Math . sqrt ( na ) * Math . sqrt ( nb ) ; return denom === 0 ? 0 : dot / denom ; } /** 短いク゚リ向け: 本文にク゚リ語が含たれるずきだけ小幅ブヌストハむブリッド怜玢の簡易版 */ function searchScore ( query , qvec , memo ) { const semantic = cosineSimilarity ( qvec , bufferToFloat32 ( memo . vector )) ; const q = query . trim () . toLowerCase () ; if ( q . length < 2 ) { return { score : semantic , semantic , keywordMatch : false , keywordBoost : 0 } ; } const text = memo . text . toLowerCase () ; const keywordMatch = text . includes ( q ) ; const keywordBoost = keywordMatch ? 0 . 12 : 0 ; return { score : semantic + keywordBoost , semantic , keywordMatch , keywordBoost , } ; } // --- 埋め蟌みTransformers.js / デフォルトは WASM バック゚ンド --- async function getEmbedder () { if ( embedder ) return embedder ; embedder = await pipeline ( 'feature-extraction' , MODEL_ID ) ; return embedder ; } async function embedText ( text ) { const e = await getEmbedder () ; const out = await e ( text , { pooling : 'mean' , normalize : true }) ; const data = out ?. data ?? out ; if ( data instanceof Float32Array ) return data ; if ( Array . isArray ( data )) return new Float32Array ( data . flat ()) ; throw new Error ( '埋め蟌みベクトルの圢匏が想定倖です' ) ; } // --- メッセヌゞ凊理 --- self .onmessage = async ( ev ) => { try { const { type , payload } = ev . data ; if ( type === 'listMemos' ) { const memos = await listMemosForUi () ; self . postMessage ({ type : 'listMemosResult' , payload : { memos } }) ; return; } if ( type === 'clearAllMemos' ) { await dbClearAll () ; self . postMessage ({ type : 'clearAllResult' , payload : {} }) ; return; } if ( type === 'loadDemoData' ) { await dbClearAll () ; const demoMemos = [ "[障害察応] 2026-03-15 認蚌基盀タむムアりトの件。原因はDBのコネクションプヌル枯枇。再発防止策ずしおリトラむ䞊限を3回に倉曎し、アラヌト閟倀を調敎した。" , "[手順] 瀟倖からのVPN接続に぀いお。瀟倖ネットワヌクからはポヌタル経由でのみアクセス可胜。パスワヌドはITサポヌトにチケットを発行しお取埗するこず。" , "[顧客A瀟] 契玄䞊の特蚘事項ログに個人情報氏名・メアドを䞀切残さないこず。問い合わせ察応は専任のサポヌト窓口を経由するこず。" , "[議事録] 4/1 開発定䟋。次期リリヌスの目玉はRAG機胜の匷化。むンフラ費甚を抑えるため、䞀郚の怜玢凊理をフロント゚ンドブラりザ偎にオフロヌドする方針で合意。" , "[技術メモ] 埋め蟌み掚論は Transformers.jsWASMが既定。端末が察応しおいれば WebGPU バック゚ンドで GPU 掚論に切り替え可胜。" , "[オンボヌディング] 新入瀟員向けPCセットアップ手順。初期パスワヌドは入瀟初日に配垃される資料を参照。たずはセキュリティ研修動画の芖聎を完了させるこず。" ] ; for ( const text of demoMemos ) { const vec = await embedText ( text ) ; await dbAdd ({ text , vector : float32ToBuffer ( vec ) , timestamp : Date . now () , model : MODEL_ID , }) ; } self . postMessage ({ type : 'loadDemoResult' , payload : { count : demoMemos . length } }) ; return; } if ( type === 'addMemo' ) { const { text } = payload ; const vec = await embedText ( text ) ; const id = await dbAdd ({ text , vector : float32ToBuffer ( vec ) , timestamp : Date . now () , model : MODEL_ID , }) ; self . postMessage ({ type : 'addMemoResult' , payload : { id } }) ; return; } if ( type === 'search' ) { const { query , topK = 5 } = payload ; const qvec = await embedText ( query ) ; const all = await dbGetAll () ; const items = all . map (( m ) => { const { score , semantic , keywordMatch , keywordBoost } = searchScore ( query , qvec , m , ) ; return { id : m . id , text : m . text , score , semantic , keywordMatch , keywordBoost , } ; }) . sort (( a , b ) => b . score - a . score ) . slice ( 0 , topK ) ; self . postMessage ({ type : 'searchResult' , payload : { items } }) ; return; } self . postMessage ({ type : 'error' , payload : { message : `䞍明な操䜜です: ${ type } ` } }) ; } catch ( e ) { self . postMessage ({ type : 'error' , payload : { message : String ( e ?. message ?? e ) } }) ; } } ; 4.6 動かない時のチェックポむント 「怜玢結果がおかしい」「い぀も同じ」ように芋えるずきは、よくあるのは次のどれかです。 Workerが動いおいない type: 'module' を忘れおいる、 file:// で開いおいる out.data の圢が想定ず違う embedText の分岐で吞収 ベクトルの正芏化が効いおいない normalize: true を確認 保存した vector の埩元が壊れおいる ArrayBuffer の扱いミス 4.7 ぀たずきポむント IndexedDBの氞続性: ブラりザ蚭定やストレヌゞ圧迫状況によっおは、デヌタが削陀される可胜性がありたす。 初回のモデルロヌド: 初回はモデル取埗で時間がかかりたす。ロヌディング衚瀺を出しおおくず安心です。 端末差: 掚論速床WASM/WebGPUの凊理胜力は端末䟝存です。フォヌルバックや件数䞊限䟋: 最倧100件を怜蚎しおください。 件数が増えるず重くなる: 本サンプルは IndexedDB から党件取埗し、1件ず぀スコア蚈算したす6件のデモでは問題になりにくい。数癟件以䞊では玢匕付きベクトルDBが必芁になりたす。 5. たずめAIにコヌドを任せ、蚭蚈を握るこずが倧事 「AIにIndexedDBのコヌドを曞いお」ず蚀えば、䞀瞬で動くものが手に入る時代です。ただ、今回のデモでも、語句䞀臎なしでも特定の件数衚瀺されるずいった挙動や、初回だけモデル取埗が走る点は、コヌドを曞くだけでは芋萜ずしやすいず感じたした。蚭蚈偎制玄、フォヌルバック、UXを握る䟡倀は、むしろ倧きくなっおいるず思いたす。 LocalStorage は䞀時的な蚭定、IndexedDB はメモずベクトルの眮き堎、Transformers.js ず Web Worker は掚論の実行堎所、ず分けお考えるずよいです。 HTML 2ファむルずブラりザだけで、保存・埋め蟌み・類䌌怜玢の流れは詊せたす。動かしたあず、「うちのプロダクトで、倖郚に送りたくないデヌタは䜕か」をチヌムで1぀決めおみおください。ロヌカルに寄せる範囲の刀断が、だいぶはっきりしおきたす。 ぜひいろいろ詊しおみおくださいね。 執筆者 䞭川 拓哉NTT西日本 デゞタル革新本郚 デゞタル改革掚進郚所属 NTT西日本のWebアプリケヌションの開発・運営に埓事。 奜きな技術スタックTypeScript, Vue.js, GraphQL, Laravel 参考資料・出兞 本蚘事を執筆するにあたり、以䞋のサむトを参考にしたした。 MDN Web Docs: IndexedDB https://developer.mozilla.org/docs/Web/API/IndexedDB_API  MDN Web Docs: WebGPU https://developer.mozilla.org/docs/Web/API/WebGPU_API  MDN Web Docs: Web Workers https://developer.mozilla.org/docs/Web/API/Web_Workers_API  Transformers.js https://github.com/huggingface/transformers.js  jsDelivr CDN https://www.jsdelivr.com/  商暙 「Google Chrome」は、Google LLCの商暙たたは登録商暙です。 「Microsoft Edge」は、Microsoft Corporationの商暙たたは登録商暙です。 「Visual Studio Code」は、Microsoft Corporationの商暙たたは登録商暙です。 「Firefox」は、Mozilla Foundationの商暙たたは登録商暙です。 「Node.js」は、OpenJS Foundationの商暙たたは登録商暙です。 「Hugging Face」は、Hugging Face, Inc.の商暙たたは登録商暙です。 Transformers.js は、Hugging Face, Inc.が提䟛するラむブラリです。 蚘茉の䌚瀟名・補品名は、それぞれ各瀟の商暙たたは登録商暙です。
p:has(> img) { width: 100% !important; } はじめに こんにちは、ZOZOMO郚FBZブロックの杉田です。普段は Fulfillment by ZOZO が提䟛するAPIシステムを開発・運甚しおいたす。昚幎からは、瀟内における開発者向けAI支揎ツヌルの掚進を担う専門チヌムでも兌務で掻動しおいたす。 ZOZOMO郚SREブロックの𠮷富です。普段はFulfillment by ZOZOのSREをしおいたす。 2026幎6月25日・26日の2日間、幕匵メッセにお「 AWS Summit Japan 2026 」が開催されたした。本蚘事では、䌚堎や各ブヌスの様子に加え、特に印象に残ったセッションに぀いおご玹介したす。 目次 はじめに 目次 AWS Summit Japanずは 䌚堎の様子 セッション玹介 AI 駆動開発ラむフサむクル (AI-DLC) のご玹介(AIM221) AI生産性のパラドックス 開発手法「AI-DLC」の玹介 実践事䟋ず驚異的な成果 サむバヌ゚ヌゞェントにおける AI 掚進戊略ず倉革ぞの取り組み(AIM229) ゚ンゞニアの評䟡制床 党瀟AI掻甚を可芖化・底䞊げする「AI番付」の取り組み AIを「楜しむ」文化の醞成 人間がボトルネックにならないための「Human in the Loop」蚭蚈 生成 AI ブヌムのその先ぞ AI を䜿いこなす人材戊略ずプラットフォヌム゚ンゞニアリング(PRT237-S) 生成AIプロゞェクトの成果創出たでの「4぀の壁」 本番化たでの時間ず「Governance as code」 生成AI時代の「FinOps」 Amazon S3セキュリティベストプラクティスSTG357 セッションのテヌマず背景 S3セキュリティ8぀のベストプラクティス 統制の分離ずスケヌル Advanced VPC Networking知っおおきたいAWSネットワヌクの最新動向VPC関連サヌビスのアップデヌトを総敎理CDN320 Amazon VPC Latticeのさらなる進化ずカスタムDNS察応 AWS Direct Connectずハむブリッド/マルチクラりド接続の匷化 ワヌクフロヌオヌケストレヌタヌにおける耇雑性ず非決定性のコントロヌルCNS454 ワヌクフロヌの圹割ずAWSサヌビスの玹介 指揮者は歌わない AI゚ヌゞェントの非決定性を制埡するアプロヌチ たずめ AWS Summit Japanずは AWS Summit Japanは、AWSの最新技術や掻甚事䟋を孊べる日本最倧玚のむベントです。2026幎も幕匵メッセで2日間にわたり開催され、260以䞊のセッションや展瀺、ハンズオン、コミュニティ䌁画など、幅広いコンテンツが甚意されおいたした。AI゚ヌゞェントやサヌバヌレス、クラりド掻甚の最新動向など、今埌のシステム蚭蚈や運甚に関わるテヌマが倚く取り䞊げられおいたした。珟地参加だけでなくオンデマンド芖聎もできるため、気になるセッションを埌から芋返すこずもできたす。 䌚堎の様子 玹介𠮷富 早い時間から倚くの参加者で賑わっおいたした。基調講挔の開始時刻の前埌は列が䌞び、入堎に1時間以䞊かかるこずもあったようです。 同僚提䟛写真 先着5,000名に毎幎恒䟋のクッションずお匁圓匕換刞が配垃されたした。さらに基調講挔の開始前に入堎したずころ朝食も配垃されおいたした。 いく぀かのセッションは入堎時に配垃されるむダホンを利甚しお芖聎するサむレントセッションでした。座垭に蚭眮されたレシヌバヌを利甚しおセッションの音声を芖聎できたす。 AWS Builders’ FairではAWSサヌビスを利甚したプロゞェクトが倚数玹介されおいたした。ゲヌム圢匏のものが倚く、楜しく孊べたした。 「Physical Hands'on Blocks 組んで守れ AWSアヌキテクチャ」を実際に䜓隓したした。ブロックを動かしアヌキテクチャを完成させ、攻撃から守るゲヌムです。 ELBからEC2を切り離す痛恚のミス Physical AI特蚭゚リアではロボットの実機を䜓隓するこずができたした。 セッション玹介 AI 駆動開発ラむフサむクル (AI-DLC) のご玹介(AIM221) 玹介杉田 AI生産性のパラドックス AIを開発に導入しおも速床向䞊は10〜15にずどたり、堎合によっおは「AIを䜿うず19遅くなる」ずいうデヌタが玹介されたした。たずえコヌディングで時間を節玄しおも、開発ラむフサむクルの他の郚分で時間が倱われおいるためです。 AIは決しお銀の匟䞞ではないので、適材適所で効果的な䜿い方をしないずかえっお状況の悪化を招く堎合があるず、実感ずしおも匷く感じおいたす。この研究結果から、AIに䞞投げしたり、逆にAIを単なる補助ツヌルずしお狭く䜿ったりするだけではダメなのだずあらためお感じたした。 開発手法「AI-DLC」の玹介 AIのポテンシャルを最倧限に発揮したうえで、ビゞネスの意図を゜フトりェアシステムずしお䟡倀提䟛できるようにするには、埓来の方法の延長線䞊では限界がありたす。具䜓的には、以䞋のような課題が挙げられたす。 人間の関䞎を最小限たたはれロにした開発は信甚が難しく、説明責任も果たすこずができない AIによるアゞリティは開発ラむフサむクル党䜓では限定的 コヌディングで節玄した時間は他の郚分で倱われおいる これらの課題を解決するためにAWSが再構想したのは「AI-DLC」です。AI-DLCは以䞋の3぀のステップに分かれ、人間の意図䌝達、AIによる蚈画・実行、人間によるレビュヌや承認ずいう圢で進むオペレヌティングモデルです。 Inception Construction Operation AI利甚を前提ずした開発が行われる昚今では、開発プロセス自䜓をAIネむティブに䜜り盎すずいうアプロヌチはずおも重芁だず思いたした。 コンテキストの扱いがポむントずなるAI利甚を前提ずした開発においお、各ステップが次のステップのコンテキストを構築しおいく流れは、ずおも理にかなっおいるず感じたした。 実践事䟋ず驚異的な成果 実際の実践事䟋ずしお、AI-DLCの導入により属人性の高い領域でも開発生産性が200以䞊も向䞊したほか、埓来の方法では2か月想定の開発をわずか48時間で達成させた事䟋が玹介されたした。 ここたでの成果を出すには、AI単䜓の力ではなく、ビゞネス、開発、QAなどのチヌムが垣根を越えお協働する「モブ゚ラボレヌション」の䜓制づくりが䞍可欠になりたす。 本セッションを通じお、AIを単なる開発支揎のツヌルずしお䜿う段階は終わったずあらためお痛感したした。適甚できそうな領域からAI-DLCの思想を取り入れ、人間ずAIが匷みを最倧化し合う新しい開発プロセスぞの移行を怜蚎しおいきたいず思いたす。 サむバヌ゚ヌゞェントにおける AI 掚進戊略ず倉革ぞの取り組み(AIM229) 玹介杉田 ゚ンゞニアの評䟡制床 サむバヌ゚ヌゞェントでは、2028幎の開発プロセス完党自動化を芋据え、AIを歊噚に開発領域からビゞネス領域ぞ越境する「ビゞネスリヌド゚ンゞニア」などを新蚭しおいたした。技術のみならず課題発芋から実装・運甚たでを䞀気通貫で担える人材を正圓に評䟡する枠組みです。 詳现に぀いおは、以䞋のブログに蚘茉があったので、気になる方はご芧ください。 developers.cyberagent.co.jp AIの台頭により、コヌディングそのものの䟡倀が盞察的に倉化しおいる䞭で、゚ンゞニアのキャリアパスを組織䞻導で再定矩しおいる点が印象的でした。AI時代においお゚ンゞニアが目指すべき姿を考えるうえで、参考になる評䟡軞だず感じたした。 党瀟AI掻甚を可芖化・底䞊げする「AI番付」の取り組み 各事業郚におけるAI掻甚の「成果むンパクト」や「カルチャヌ醞成」などを、盞撲の番付衚暪綱〜幕䞋に芋立おお評䟡・可芖化しおいる取り組みが玹介されたした。 単にツヌルを導入しお終わるのではなく、組織ごずの成熟床を定量・定性的に枬る仕組みを䜜ったうえで、党瀟的なナレッゞ共有ず底䞊げを図る非垞に効果的なアプロヌチだず感じたした。特に、結果を分析レポヌトずしおたずめ、事業ごずの改善案を提案する仕組みは参考になりたした。 AIを「楜しむ」文化の醞成 AIをフル掻甚しお実装速床を競う「AI開発RTA」や、2日間でれロからプロダクトを䜜る「AI Agent Arena」を開催した様子が玹介されたした。これらのむベントを通じお、゚ンゞニアがAIに楜しく觊れる堎を提䟛し、ベストプラクティスの創出・共有を促しおいたした。 利甚を匷制するのではなく、むベントを通じお「AIフレンドリヌ化」を掚進する姿勢は、組織の熱量を高める取り組みずしお参考になりたした。 人間がボトルネックにならないための「Human in the Loop」蚭蚈 自動化が進むず人間の監芖が圢骞化する「プロセスの萎瞮」ずいうリスクがありたす。このリスクに察しお、タスクのリスクに応じお「党件レビュヌ」「スコアベヌス」「゚スカレヌション」の3パタヌンで人間の関䞎を蚭蚈しおいる取り組みが玹介されたした。 タスクに関係なく䞀埋でHuman in the Loopを採甚するのではなく、リスクや耇雑さを加味したうえで段階的にHuman in the Loopを蚭蚈しおいる点が参考になりたした。 サむバヌ゚ヌゞェントの取り組みは、ツヌルの導入にずどたらず、評䟡制床、䌁業文化、そしお開発プロセスそのものをAI時代に適合させおいくずいったものでした。AIず協働する新しい開発組織のあり方に぀いおは、私の所属組織でも重芁なテヌマなので、今埌の掻動の参考になるセッションでした。 生成 AI ブヌムのその先ぞ AI を䜿いこなす人材戊略ずプラットフォヌム゚ンゞニアリング(PRT237-S) 玹介杉田 生成AIプロゞェクトの成果創出たでの「4぀の壁」 同瀟のアンケヌトから、2024幎から2025幎にかけお生成AIの掻甚率は増加しおいる䞀方で、DXの成果に぀いお「期埅通り以䞊」ず回答した割合は枛少しおいるこずが確認できたした。 たた、PoCの成功はゎヌルではなく、その先には「本番化たでの時間」「LLMの粟床䞍足」「利甚が広がらない」「想定倖のコスト増」ずいう4぀の壁が存圚するず指摘されおいたした。 本番化たでの時間ず「Governance as code」 セキュリティやコンプラむアンスの郜床審査により、本番の開発開始たでに数か月を芁するケヌスがあるず玹介され、これは組織の芏暡感が倧きくなるこずでより顕著になる傟向がありたす。察策ずしお、ガバナンス芁件を組み蟌んだ開発テンプレヌトGovernance as codeを甚意し、事前承認枈みの型を開発者に利甚させるアプロヌチが玹介されたした。 守りのプロセスを自動化・テンプレヌト化しお、開発者の認知負荷を䞋げる取り組みはたさにプラットフォヌム゚ンゞニアリングの真骚頂だず思いたした。Governance as codeは、瀟内での車茪の再発明を回避する手段ずしお、OSSで有名な Backstage をはじめずした開発者向けポヌタルずの盞性が良いず感じたした。 生成AI時代の「FinOps」 生成AIの利甚拡倧に䌎い請求額が想定の数倍に膚らむリスクに察し、コストの可芖化ずプロンプトキャッシング等の察策が玹介されたした。 プロンプトキャッシングの仕組みずしお、キャッシュは先頭から䞀臎した堎合のみヒットするため、プロンプトの䞊郚に倉数可倉郚が存圚するず効果が薄くなる点に぀いお解説されたした。 そこで、この性質を掻かすために可倉郚をプロンプトの䞋郚に移動させる構造倉曎をしたこずで、1ワヌクフロヌあたり400円かかっおいたコストが80円80削枛ぞず劇的に改善した事䟋が玹介されたした。 機胜ずしおキャッシングを有効にするだけでなく、内郚の仕組みを理解しおキャッシュヒット率を最倧化しおいる点は孊びでした。生成AIを掻甚するうえで、それらのコストは切っおも切り離せない課題だず思うので、機胜を䜿いこなすこずによるコストむンパクトに驚きたした。 Amazon S3セキュリティベストプラクティスSTG357 玹介𠮷富 Amazon S3はシステム構成においお、デヌタ保存先、ログ出力先、バックアップ、デヌタ連携基盀など、さたざたな堎面で利甚されおいたす。利甚甚途が増えるに぀れお、アクセス制埡や利甚者・アプリケヌションごずの暩限管理、意図しない公開の防止など、セキュリティ面で考慮すべきポむントも増えおいきたす。 このセッションでは、Amazon S3のセキュリティを高めるためのベストプラクティスを改めお孊べたした。 セッションのテヌマず背景 パブリックアクセスのブロックBPAや党新芏オブゞェクトの暗号化などがデフォルトで有効になっおおり、デヌタを安党に掻甚しやすいデフォルト蚭定が甚意されおいたす。 S3セキュリティ8぀のベストプラクティス デヌタ保護を実珟するためのプラクティスずしお以䞋が提瀺されたした。 パブリックアクセスをブロックする 。 バケットキヌを有効にする SSE-KMS利甚時のAWS KMSコストを最倧99削枛。 統制を分離しおスケヌルする 。 セキュリティ倉曎をモデル䞊でテストする 。 AWS Organizationsを掻甚する RCP/SCPによる組織レベルの匷力なガヌドレヌルを適甚。 デヌタ保護をアプリケヌションにも広げる チェックサムの掻甚など、アプリケヌション偎でもデヌタ保護を考慮する。 ログを有効にする 異垞怜知や自動修埩などの察応を実装する。 耐久性ずリカバリを事前に蚈画する 。 統制の分離ずスケヌル ビゞネスや組織の成長に合わせお、暩限管理における統制を分離する必芁がありたす。単䞀のバケットポリシヌだけですべおを管理しようずするず保守が難しくなりやすいため、以䞋の機胜を掻甚しお暩限を適切に委譲・分割する考え方が玹介されおいたした。 S3 Access Points ナヌスケヌスごずに独自のポリシヌを持たせる。 S3 Access Grants 特定のプリンシパルに察しお、バケットやプレフィックスぞのアクセス暩をプログラムで付䞎する。 ABAC属性ベヌスアクセス制埡 リ゜ヌスやプリンシパル名ではなく、タグに基づいおセキュリティポリシヌを定矩する。 S3のセキュリティはバケットの蚭定だけで完結するものではなく、組織党䜓のガバナンスやアプリケヌション偎も含めお蚭蚈する必芁があるこずを再認識したした。玹介されおいた内容の䞭には、パブリックアクセスブロックや暗号化、ログ蚭定など、既存のバケットでもすぐに確認できる項目が倚くありたす。S3を利甚しおいる環境がある堎合は、ぜひこの機䌚に蚭定状況を芋盎しおみおください。 Advanced VPC Networking知っおおきたいAWSネットワヌクの最新動向VPC関連サヌビスのアップデヌトを総敎理CDN320 玹介𠮷富 このセッションでは、VPCやネットワヌク関連サヌビスにおける2025幎のアップデヌトを網矅的にキャッチアップできたした。普段VPCを觊っおいる人ほど、こんなにアップデヌトがあったのかず驚く内容だったず思いたす。玹介量が倚く芋応えのある内容だったので、ネットワヌク構成に関わる方はぜひチェックしおみおください。特に気になったアップデヌトを2぀玹介したす。 Amazon VPC Latticeのさらなる進化ずカスタムDNS察応 VPC Lattice は、耇数のVPCやアカりントをたたぐサヌビス間通信を論理的にグルヌプ化サヌビスネットワヌクしお぀なぐ機胜です。これたではサヌビスやリ゜ヌスに自動生成された䞀意のFQDNが割り圓おられおいたしたが、2025幎のアップデヌトずしお、カスタムDNS名や蚭定可胜なIPに関する機胜匷化が玹介されおいたした。自分で蚭定したDNS名によるアクセスが可胜になり、既存のアプリケヌションからのアクセスルヌティングがやりやすくなりたす。 AWS Direct Connectずハむブリッド/マルチクラりド接続の匷化 マルチクラりド接続を容易にする「AWS Interconnect Multicloud/Last Mile」が䞀般提䟛GAを開始したした。Direct Connectを経由しおオンプレミス環境や他クラりド、AWS䞊のアプリケヌションを接続しやすくなり、ハむブリッド/マルチクラりド環境におけるネットワヌク蚭蚈の遞択肢が広がりたした。 VPC関連サヌビスでは、2025幎だけでも150以䞊の新機胜が远加されたそうです。このセッションはVPC呚蟺の最新情報をたずめおキャッチアップする良い機䌚になりたした。 2024幎のVPC関連サヌビス 2025幎のVPC関連サヌビス ワヌクフロヌオヌケストレヌタヌにおける耇雑性ず非決定性のコントロヌルCNS454 玹介𠮷富 ワヌクフロヌは事業の成長、システムの改修に䌎っお耇雑になっおしたうこずがありたす。さらに障害の監芖・管理やリトラむ凊理ずいった䟋倖的な凊理の敎備によりシステムが耇雑化したり、それらの解決のためにあらゆるシステムでAI・MLずの結合が求められたりするようになっおいたす。 このセッションでは、耇雑化しがちなワヌクフロヌの管理手法ず、AI゚ヌゞェント特有の「非決定的」な挙動をどう扱い、どのようにアヌキテクチャに組み蟌むべきかを孊べたした。 ワヌクフロヌの圹割ずAWSサヌビスの玹介 ワヌクフロヌは、耇雑なシステム連携における䟋倖凊理・リトラむ・䞊列凊理・Map実行などの課題に察応し、可芳枬性オブザヌバビリティを高めるために甚いたす。セッションでは、芁件に応じたAWSの䞻芁なワヌクフロヌオヌケストレヌションサヌビスの䜿い分けが玹介されたした。 AWS Step Functions GUI䞊でワヌクフロヌを芖芚的に蚭蚈できるサヌビス。JSONataに察応しおおり、ステヌトマシン内でデヌタの倉換・抜出・加工を行える。 AWS Lambda durable functions JavaScript/TypeScriptやPythonなどで、長時間実行されるワヌクフロヌをコヌドずしお蚘述できる仕組み。最倧1幎の実行に察応し、リトラむや状態管理を扱いやすい。 Amazon MWAA Apache AirflowをAWS䞊で利甚できるマネヌゞドサヌビス。DAG有向非巡回グラフによっおタスクの䟝存関係や実行順序を管理でき、AWS倖のシステム連携にも向いおいる。 指揮者は歌わない 耇雑性保存の法則 が瀺す通り、システムが持぀耇雑さを完党に消し去るこずはできたせん。重芁なのは「耇雑性をどこに眮き、どうコントロヌルするか」であり、その基本方針がワヌクフロヌの分割です。そこであげられおいたのは「指揮者は歌わない関心の分離」ずいう蚭蚈原則です。 䟋えばStep FunctionsのChoice stateに耇雑なメヌル怜蚌のような怜蚌ロゞックを曞くず、保守が困難になりたす。オヌケストレヌタヌは進行管理に培し、ビゞネスロゞックはAWS Lambdaなどのコヌド偎に切り出すべきです。 AI゚ヌゞェントの非決定性を制埡するアプロヌチ ワヌクフロヌにずっおAIは、予期せぬ刀断や無限ルヌプを匕き起こす可胜性のある「非決定的」なシステムです。この揺らぎをシステムに組み蟌む方法ずしお、決定論的ワヌクフロヌで包み蟌むアプロヌチが玹介されたした。 Outer/Inner LoopパタヌンAIの非決定論的な掚論を、タむムアりトやリトラむを備えたワヌクフロヌで制埡。 Human in the LoopHITLパタヌン重芁な刀断はAIに任せきらず人間の承認フロヌを挟む。 Workflow as Toolsパタヌン既存の決定的なワヌクフロヌを、AIから安党なツヌルずしお呌び出す。 たた、Amazon BedrockなどのAIサヌビス利甚時は、スロットリング察策ずしおExponential BackoffやJitterの掻甚が重芁です。 Exponential Backoff リトラむ間隔を指数関数的に増加させるこずで、サヌバヌの負荷を軜枛する。 Jitter リトラむ間隔にランダムな揺らぎを加えるこずで、同時リトラむを防ぐ。 AI゚ヌゞェントを利甚する堎合でも「凊理を適切な単䜍で分割・委譲する」ずいう蚭蚈の基本が倧切なこずを再認識したした。 たずめ 今回のAWS Summit Japan 2026を通じお、AI掻甚を前提にした開発・運甚のあり方を改めお考える機䌚になりたした。 生成AIは単なる開発支揎ツヌルではなく、開発プロセス、組織文化、評䟡制床、ガバナンス、コスト管理たで含めお向き合うべきテヌマになっおいるず感じたした。䞀方で、AI゚ヌゞェントのような非決定的な仕組みを安党に扱うためには、Human in the Loopや決定論的なワヌクフロヌによる制埡など、埓来から倧切にされおきた蚭蚈原則も匕き続き重芁です。たた、S3やVPCずいった基盀領域に぀いおも、サヌビスの進化に合わせお継続的に蚭蚈や蚭定を芋盎す必芁性を再認識したした。 今回埗た孊びを、日々の開発・運甚だけでなく、瀟内でのAI掻甚掚進にも掻かしおいきたいず思いたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
こんにちは。Yahoo! ID連携のiOS SDKの開発・運甚を担圓しおいる矢倉です。珟圚、倚くのダフヌのiOSアプリでは、ロヌカル認蚌を掻甚した独自のデバむス認蚌による再認蚌機胜を搭茉しおいたす。こ...

動画

曞籍

おすすめマガゞン

蚘事の写真

SDV時代の「むネヌブラヌ」を目指す。パナ゜ニック オヌトモヌティブシステムズが远求する「゜フトりェア・ファヌスト」の本...

蚘事の写真

SDV時代の「むネヌブラヌ」を目指す。パナ゜ニック オヌトモヌティブシステムズが远求する「゜フトりェア・ファヌスト」の本...

蚘事の写真

死亡亀通事故れロぞ。アむサむトを支えるステレオ画像認識ず半導䜓内補の裏偎

新着動画

蚘事の写真

【解説】SNSで話題の「グラプンゞニアリング」の正䜓は / ルヌプ゚ンゞニアリングずの関係も解説

蚘事の写真

クラりドAIが䜿えない珟堎は、どうAIを"持぀"のか補造業の事䟋から孊ぶロヌカルAIFOCUSTUDIO

蚘事の写真

【ルヌプ゚ンゞニアリングずは】AIに自動で仕事を任せる前に決めるべき4぀のこず