木曜日, 7月 31, 2025
No menu items!
ホーム ブログ ページ 6869

ファンタジーコンソールへのフィールドガイド



長髪のエルフの女性が彼女の家に入るとため息をつきます。その日の重さは、目に見えて地球に向かって彼女を押し下げます。 「これは続けられない。」飲み物を注いだ後、彼女はソファに沈みます…



Source link

Views: 0

シマムセン、アキュフェーズ「E-3000」&ラックスマン「D-03R」試聴会を4/26-27に開催



シマムセン、アキュフェーズ「E-3000」&ラックスマン「D-03R」試聴会を4/26-27に開催

大阪・日本橋のオーディオ専門店 シマムセンは、4月26日(土)と27日(日)に、アキュフェーズ&ラックスマンの新製品試聴会を開催する。



Source link

Views: 0

新作13タイトルの最新情報をお届け!オンラインイベント「PLAYISM GAME SHOW 2025.4.25」が4月25日19時から開催



新作13タイトルの最新情報をお届け!オンラインイベント「PLAYISM GAME SHOW 2025.4.25」が4月25日19時から開催

PLAYISMは、オンラインイベント「PLAYISM GAME SHOW 2025.4.25」を2025年4月25日19時よりYouTubeのPLAYISM公式チャンネル/ニコニコ生放送にて開催すると4月21日に発表。



Source link

Views: 0

機内モードって本当に必要?通信にまつわる“なんで?”をわかりやすく解説 #初心者 – Qiita



機内モードって本当に必要?通信にまつわる“なんで?”をわかりやすく解説 #初心者 - Qiita

飛行機に乗ると、離陸前に「スマートフォンは機内モードにしてください」というアナウンスが流れますよね。でも最近は、機内でもWi-Fiが使えることも増えてきて、「え? 機内モードってまだ必要なの?」と思ったことはありませんか?

そもそも、機内モードって何をしているんでしょう?
BluetoothやGPSは使えるのに、なぜ携帯の通信だけ止まるのか。
そもそもスマホの電波ってどうやって届いているのか。
そして、なぜトンネルや地下鉄ではつながりにくいのか……。

この記事では、「機内モードって本当に必要なの?」という素朴な疑問を入り口に、スマホの通信や電波の仕組み、よくある“通信まわりのあるある”について、できるだけわかりやすく整理してみます。

弊社Nucoでは、他にも様々なお役立ち記事を公開しています。よかったら、Organizationのページも覗いてみてください。
また、Nucoでは一緒に働く仲間も募集しています!興味をお持ちいただける方は、こちらまで。

機内モードは、今やスマートフォンに標準搭載されている機能のひとつです。
ただ、その設計思想や仕様、そして現在のネットワーク事情を踏まえると、「なぜこの機能が必要なのか」「本当に今も有効なのか?」といった問いが浮かんできます。

このセクションでは、機内モードが制御する要素と、それが航空機内でどう位置づけられているのかを整理します。
また、BluetoothやWi-Fi、GPSとの関係についても、少し踏み込んだ技術的背景を含めて確認していきます。

そもそも機内モードって何?

機内モード(Airplane Mode)は、デバイスの無線通信機能を一括で制限する設定状態です。
具体的には以下の通信が対象になります:

  • セルラー通信(4G/5G):基地局との通信を遮断

  • Wi-Fi:無線LANのスキャン・接続を停止

  • Bluetooth:近距離無線通信を停止(ただし後述の通り再有効化可能)

  • NFC / UWB:OSや機種により無効化される場合あり

AndroidやiOSの仕様では、機内モードを有効にするとこれらが一斉にオフになりますが、ユーザーが手動で個別にWi-FiやBluetoothを再有効化することが可能です。

この挙動は「すべてを遮断する」ことが目的ではなく、「デフォルトで危険性のある電波を抑止しつつ、必要な機能は再利用可能にする」という運用レベルでの妥協設計に近いものと言えます。

なぜ飛行機で機内モードが必要なの?

航空機内で通信機能の使用が制限される背景には、航空機のナビゲーション・通信システムへの干渉リスクが挙げられます。
ただしこれは「スマートフォンの電波が即座に機器に悪影響を与える」というよりも、「累積的・多数接続時に起こりうる電磁的干渉のリスク」を念頭に置いた、予防的安全策です。

たとえば:

  • VHF帯(航空通信)やILS(計器着陸装置)は、高周波数帯の通信と近接しており、スプリアス放射や混変調の影響を受ける可能性がある

  • 特に接近・離陸時などのフェーズでは、機体は計器に強く依存しており、わずかなノイズでも安全マージンを下げるリスクがある

このため、多くの航空会社では今でも「機内モードの有効化」が推奨されており、仮に技術的に影響が小さくとも、オペレーション上は保守的な対応が取られ続けているのが現状です。

「機内モード=通信完全遮断」と思われがちですが、実際は“リスクのある通信だけを一時停止し、必要に応じて復帰できる設計”というバランス重視の仕様です。

今ってWi-Fiあるのに機内モードって意味あるの?

機内モード中でも、機内Wi-Fiが利用可能なケースが増えています。これは一見すると矛盾しているように見えますが、実際には異なる物理層(PHY)で通信しているため、整合性が取れています。

  • セルラー通信(例:4G/5G):地上の基地局と通信。高出力かつ不確定な干渉を発生させやすい

  • 機内Wi-Fi:航空機内の閉じたネットワーク上で、機内アクセスポイントを介した通信のみを許可

機内モードは、地上の基地局にアクセスしようとするセルラー通信の電波放出を防ぐことが主目的であり、閉じたローカルネットワーク内での通信は許容されるという設計上の前提があります。

Wi-Fiを手動で再有効化できるのは、このポリシーを前提とした運用をOS側が想定しているからです。

機内モード中にBluetoothやWi-Fiが使えるのはなぜ?

機内モードON時の通信状態の変化
通信種別 機内モードON時 再ON可能
セルラー通信 ✕停止 ✕不可
Wi-Fi ✕停止 ◯可
Bluetooth ✕停止 ◯可
GPS ◯有効

現在のスマートフォンでは、機内モードを有効にしてもWi-FiやBluetoothを個別にオンに戻すことが可能です。これは単なる仕様の緩和ではなく、通信リスクに対する評価が細分化され、設計思想として分離制御が可能になった結果といえます。

Wi-FiやBluetoothは、いずれも2.4GHzや5GHzのISMバンドを使用する短距離無線通信であり、通信出力は10〜100mW程度と低く抑えられています。これにより、電波の到達範囲が限定され、外部の機器に意図せず干渉を与えるリスクが極めて低いとされています。加えて、これらの通信は基本的にペアリング済みの相手に向けて行うため、モバイル回線のように不特定多数へ強く信号を送信する性質とは異なります。

航空機で利用されるナビゲーションや通信機器は、主にVHF帯やLバンドといった帯域を使っており、ISMバンドとは重複しないため、干渉のリスクは技術的に見ても限定的です。こうした背景から、Wi-FiやBluetoothの使用は多くの航空機で容認されるようになり、それを前提とした機内モード設計がOS側でも標準化されています。

機内モードにしてもGPSは動くの?

結論から言えば、GPSは機内モード中でも動作します。その理由は明快で、GPSは受信専用のシステムであり、スマートフォン側から電波を発信することはないためです。

GPS(Global Positioning System)は、地球の周囲を回る複数の衛星が送信する高精度な時刻情報をスマートフォンが受信し、それぞれの衛星との距離から現在地を三辺測量的に算出する仕組みです。スマートフォンはこの通信において完全にパッシブ(受信専用)であるため、航空機の電子機器に対して干渉を与える可能性はありません。

ただし、GPS機能には補助的な仕組みである A-GPS(Assisted GPS) がよく使われています。これは、基地局情報やWi-Fiアクセスポイントの位置情報を利用して、GPS衛星の測位を補助し、初期位置の特定を高速化・高精度化する仕組みです。機内モード中はこれらの補助情報が利用できなくなるため、測位の初動が遅くなったり、精度が若干落ちる可能性があります。

つまり、機内モードでもGPSの基本機能自体は問題なく動作しますが、

といった点を理解しておくと、アプリの設計や位置情報機能の挙動を把握する上で有益です。

機内モードでもGPSが動作するのは、“スマホが一切電波を発信していない”から。通信とは逆で、完全な受信専用だからこそ許容されています。

スマホで当たり前のように使っている「電波」や「通信」。でも、よく考えるとわからないことだらけじゃありませんか?
「スマホって、どこから電波を受け取ってるの?」「5Gって速いって言うけど、何が違うの?」「地下に行くとつながらないのって、なんで?」

このセクションでは、そんな“今さら聞けないけど気になる”通信の仕組みについて、できるだけシンプルに解きほぐしていきます。

スマホの通信ってどうやって届いているの?

スマートフォンは、地上に設置された基地局と常時無線通信を行い、その先でキャリアのコアネットワークを通じてインターネットと接続されています。接続先の基地局は端末が現在地・電波強度・混雑状況などをもとに自動で切り替えており、この切り替え処理は「ハンドオーバー」と呼ばれます。これにより、移動中でも通信が途切れずに維持される仕組みになっています。

日本国内でスマートフォン通信に使われている主な周波数帯は以下の通りです:

  • 700MHz帯(いわゆるプラチナバンド):障害物に強く、屋内や山間部でも届きやすい

  • 1.7GHz帯:中距離向け。都市部でもよく使われる

  • 3.5GHz帯(Sub6):5Gで使用される帯域。高速だが届く距離は短め

  • 28GHz帯(ミリ波):非常に高速だが、直進性が高く遮蔽物に弱い

スマホと基地局の間では、LTE(4G)やNR(5G)などのプロトコルスタックが利用され、物理層からネットワーク層に至るまで、移動体通信に特化した最適化が行われています。また、基地局間の通信は、キャリアのコアネットワークを経由してインターネットへとルーティングされます。

なお、よくある誤解として、「スマホは衛星と直接通信しているのでは?」というものがありますが、これは基本的に誤りです。通常のスマートフォン通信は地上インフラ(基地局)に依存しており、衛星は介在しません。たとえばStarlinkのような衛星インターネットサービスは例外ですが、一般的なモバイル回線はあくまで地上のセルラー基地局との通信で成り立っています。

電波って他の機械に干渉するの?

電波は広義には電磁波の一種であり、当然ながら他の電子機器に影響を与える可能性があります。とはいえ、ここで言う「干渉」は、スマホを使っただけで何かが壊れるという話ではありません。通信品質や復調の正確性に影響を与える、より限定的な物理層レベルの現象を指します。

通信における干渉とは、複数の電波が重なり合うことで、受信側で正常なデコードができなくなる状態のことです。特に以下のような条件が重なると、干渉が発生しやすくなります:

  • 同一または近接周波数帯で複数の送信が行われる

  • 高出力機器からスプリアス(不要輻射)が漏洩する

  • 反射や屈折により、複数経路の電波が干渉(マルチパス)する

ただし、スマートフォンをはじめとする民生機器は、総務省の技術基準適合証明(いわゆる「技適」)を取得することが義務づけられており、出力や雑音、周波数の精度などに厳しい基準が課されています。そのため、通常使用時に他機器へ干渉を引き起こすリスクは極めて低く抑えられています。

一方で、干渉リスクがより慎重に扱われる環境もあります。たとえば航空機内では、VHF帯(30〜300MHz)やLバンド(1〜2GHz)を用いる通信・航法機器が搭載されており、スプリアスが重なった場合に誤動作を招く可能性はゼロとは言い切れません。
また、医療機器や一部の産業機器はEMC(電磁両立性)への耐性が十分ではない設計もあるため、病院や工場内ではスマートフォンの使用を制限する運用が残っています。

5Gって本当に速いの?それってどういう仕組み?

5G(第5世代移動通信システム)は、単に「速くなった」だけではなく、低遅延・高接続密度・高信頼性といった複数の観点から進化した通信基盤です。
速度向上はもちろん、IoTや自動運転など多様なユースケースに対応するために、ネットワーク構成そのものが見直されています。

その根幹には、以下のような技術的ブレイクスルーがあります:

  • 周波数の拡張(Sub6およびミリ波)
     従来より広い帯域を確保できることで、単純にスループットが増大します。

  • Massive MIMO(多素子アンテナ)
     基地局が多数のアンテナを使って複数ユーザーと同時通信を実現し、ビームフォーミングによって空間分離による干渉抑制も行います。

  • OFDMA(直交周波数分割多元接続)
     リソースブロックを細かく分割し、多数の端末がリソースを効率的に分け合える構造を採用しています。

  • Network Slicing(ネットワークの仮想分割)
     一つの物理ネットワークを論理的に分割し、用途別に異なるQoS(品質保証)や構成を柔軟に適用できます。たとえば、映像配信向けの高速回線と、IoT向けの超低遅延ネットワークを並立させることが可能です。

ただし現在日本で普及している5Gの多くは、NSA(Non-Standalone)構成と呼ばれる方式で、4Gのコアネットワークをそのまま利用しつつ、無線区間だけ5G化している構成です。
そのため、理論上は5Gの速度が出るはずでも、バックエンドが4G依存のままでは構造的にボトルネックが残ってしまうのが現実です。

一方で、真の5Gとも言えるSA(Standalone)構成では、通信コアや制御方式も完全に5Gネイティブで設計されており、レイテンシ・切り替え性能・マルチスライス管理などが最大限に発揮されます。
ただし現時点では、SA構成のエリア整備や端末対応は一部に限られており、5Gのポテンシャルをフル活用するには、今後のインフラ進化が不可欠です。

「電波が悪い」って具体的に何が起こっているの?

スマートフォンを使用していると、「電波が悪い」という状況に直面することがあります。
この言葉自体は非常に曖昧ですが、通信の観点から見ると、端末が基地局との通信を安定して確立・維持できていない状態を指します。

「電波が悪い」と感じられる原因は1つではありません。物理的な問題とネットワーク側の制御の両方が関係しており、以下のような要素が絡み合って影響します:

  • 基地局との距離が遠くなったことで、受信信号強度(RSRPなど)が閾値を下回っている

  • ノイズやマルチパス(反射波)によって信号対雑音比(SNR)が悪化し、復調が困難になっている

  • 周囲のユーザー数が多く、セルが過負荷状態となって通信スケジューリングが滞っている

  • セル境界付近でハンドオーバーが頻繁に発生し、切り替え失敗や一時的な切断が生じている

このように、物理層(電波状況)とMAC層以上(帯域制御・QoS制御など)の双方に原因が分布しており、「電波が弱い」という一言では片づけられない複雑さがあります。

なぜ地下鉄やトンネルでは通信が遅くなる?

地下鉄やトンネルのような閉鎖空間では、通信が遅くなる、あるいは不安定になる場面がしばしば見られます。
これは単に「地上よりも電波が届きにくい」というだけでなく、通信インフラの構造や空間特性が通信品質に大きく影響しているためです。

通常、スマートフォンは周囲の基地局と電波のやり取りをすることでネットワークに接続していますが、トンネル内や地下深くでは地上の基地局からの直接の電波が物理的に遮断されます。そのため、通信事業者は以下のような方法で地下空間をエリア化しています:

  • 地下鉄駅構内や車両基地に専用の小型基地局を設置し、地下専用のエリアを構築

  • 長いトンネル内には、漏洩同軸ケーブル(LCX)や専用アンテナを使って電波を分配

  • 地下鉄の車両内では、中継装置を経由して車内Wi-Fiや基地局に接続する構成が取られることもある

しかし、こうした特殊なインフラ環境にはいくつかの制約があり、地上と比べて通信品質が落ちやすくなります。たとえば:

  • 地下空間では反射や屈折が多く、マルチパス干渉が発生しやすい

  • 地上と比べて基地局の密度が下げられないため、帯域が限られる

  • 駅や車両内での利用集中により、セルあたりのスケジューリングが追いつかなくなる

  • トンネルを移動する中で、基地局間のハンドオーバーが頻繁に発生し、切り替えの瞬間に遅延が起きやすい

このような理由から、「地下では通信が遅い」「トンネルで突然つながらなくなる」といった現象が起こるのは、環境依存の構造的制約によるものと言えます。

なお、通信事業者は近年こうした課題に対し、5G対応の地下局整備やトンネル内ビームフォーミング技術など、改善のための投資も進めています。

これまでに見てきたように、スマートフォンの通信は基地局との無線接続を軸とした仕組みで成り立ち、その進化の過程で3Gから4G、そして現在の5Gへと進んできました。では、今後さらに通信はどう変わっていくのでしょうか?

そのヒントがあるのが、現在世界中で研究が進められている「6G(第6世代移動通信システム)」 です。実用化は2030年ごろと見込まれており、日本でもNTTや総務省を中心にさまざまな実証や戦略立案が進んでいます。

6Gは、単に「5Gの延長線上にある高速通信」ではありません。通信そのものを“社会インフラ全体”として再定義するような動きが含まれており、その特徴は大きく以下のような方向性に広がっています:

  • テラヘルツ帯など、新しい周波数の活用によるさらなる高速化・大容量化

  • 地上インフラに依存しない、衛星・HAPSなどの非地上ネットワーク(NTN)との統合

  • 通信そのものにAIが組み込まれることで実現される動的で自律的なネットワーク制御

  • 光信号を活用した極低遅延・超省電力な構想である、NTTのIOWN(Innovative Optical and Wireless Network)構想

この章では、現時点で見えてきている6Gの主な技術的コンセプトや研究の方向性を整理しつつ、5Gとの違いや、日本の戦略的アプローチについても触れていきます。

NTN(非地上ネットワーク)は、災害時や海上、山間部など“地上ネットワークが届かない場所”を補完できる可能性があり、6Gの重要な柱とされています。

6Gってそもそも何?なぜ求められているのか

6Gは、2030年ごろの実用化を見据えて現在標準化と研究が進む次世代の移動通信規格です。位置づけとしては「5Gの延長」ではなく、通信インフラの構造そのものを見直す段階と捉えた方が実態に近いです。

現行の5Gは、理論値では高速・低遅延を実現していますが、現場レベルでは基地局の偏在、NSA構成による4G依存、エネルギー消費の増加など、限界も顕在化しています。

こうした背景から、6Gでは通信を 「都市機能の一部」から「社会を動かす基盤」へ進化させることが期待されています。端末同士の通信だけでなく、都市、モノ、空間を丸ごと情報化・自動化していくための土台として設計されているのが特徴です。

6Gの目標と性能:何がどれだけ進化するのか?

6Gでは、以下のような性能目標が掲げられています(カッコ内は5Gとの比較)。

4G / 5G / 6Gの比較構造
特性 4G 5G 6G(予定)
通信速度 ~1Gbps ~10Gbps 100Gbps以上
遅延 ~10ms ~1ms 0.1ms以下
接続密度 数千台/km² 数十万台/km² 1000万台/km²

これらはXR、遠隔操作、センサーネットワーク、自動運転といったユースケースのスケール化・リアルタイム化を支える前提条件です。

単なる数値目標というより、通信があらゆるシステムと“自然に融合”するためのスペック基盤という立ち位置で捉えたほうがわかりやすいかもしれません。

テラヘルツ通信と新たな周波数帯

6Gでは、今よりさらに高い周波数、たとえば100GHz〜1THzのテラヘルツ帯を使った通信の実現が検討されています。まだ本格的に使われていない帯域ですが、帯域幅が広いため、大容量通信や高精度な位置検出、センシングなどと相性が良いとされています。

一方で、テラヘルツ波は減衰が激しく、ちょっとした障害物や大気中の水分でも信号が弱まります。結果として、これまでのような広域をカバーする基地局では対応しきれず、密に配置された小さなセル(マイクロセルやピコセル)を組み合わせる必要があります。

また、こうした高密度な環境では、複数の端末が混在する状況でいかに干渉を避けるかが課題になります。そこで登場するのが、AIを使ったビームフォーミング制御やチャネルの最適化といったアプローチです。これにより、通信の安定性を維持しつつ、多数の端末が同時に快適に接続できる環境を目指します。

衛星やドローンで通信を補完する:NTNの活用

6Gの構想の中では、通信インフラを空にも広げていこうという動きがあります。具体的には、低軌道衛星(LEO)、成層圏を飛ぶHAPS(高高度プラットフォーム)、長時間滞空可能なドローンなどが通信を補う存在として注目されています。

こうした仕組みは、Non-Terrestrial Network(非地上ネットワーク)=NTNと呼ばれます。たとえば山奥や海上、あるいは災害で地上基地局が使えない状況でも、空から電波を届けられるというのが最大の利点です。

もちろん、衛星通信特有の遅延や、地上ネットワークとのスムーズな連携といった課題はあります。ただ、これらの技術がうまく組み合わされば、「どこでも通信がつながる社会」に一歩近づくと考えられています。

AIが担うネットワークのリアルタイム最適化

6G時代のネットワークは、とにかく複雑です。端末の数が膨大になり、周波数も高く、セルも小さくなる中で、一つひとつの状況に応じた柔軟な制御が求められます。

そうなると、人の手による設定だけでは限界があるため、AIによる動的な最適化が必要になります。たとえば、

  • ユーザーの動きを予測して、つながりやすい基地局に事前に切り替える

  • 周囲の干渉状況を踏まえて、ビームの方向や周波数を調整する

  • 利用状況に応じて、通信の優先度を判断しながらリソースを配分する

といった形で、ネットワークが自律的に判断・調整する仕組みが整っていくと想定されています。

つまり、ユーザーの通信体験を快適にしながら、ネットワーク自体の電力消費も減らせるようになるわけです。

スマートフォンを使っていると、「自分だけ圏外になる」「テザリングが不安定」「Wi-Fiにつながっているのにネットが遅い」など、理屈では説明しにくい“あるある”に出くわすことがあります。

この章では、そうした日常的な違和感を少し技術的な視点で整理してみます。
現象そのものはカジュアルでも、その裏には無線通信やネットワーク制御に関わる理由がしっかり存在しています。

「圏外」ってなに?いつどこでどうなる?

スマートフォンが「圏外」となるのは、端末がモバイルネットワークに接続できない状態です。この状態には、大きく分けて以下の2パターンがあります。

  • 物理的に基地局との通信が不可能な場合

  • SIM・キャリア・端末の条件が揃っておらず、接続が論理的に拒否されている場合

たとえば、山間部やトンネルのように電波が届かない場所では、端末がスキャンしても有効なセルを検出できず圏外になります。また、海外ローミング時に契約プランが対応していないバンドにしか電波が存在しない場合も同様に圏外になります。

加えて、現代のネットワークでは「4G/LTE専用端末で3Gが切られたエリアに入る」など、技術的ミスマッチで圏外が発生するケースもあります。

ネットワーク選択やセル再接続は、RRC層やNAS層のプロトコルで自動的に行われますが、周辺のセル情報が不安定な場合や、ハンドオーバー失敗後の再接続が遅延しているときなどには一時的に圏外と表示されることがあります。

スマホの電波とWi-Fiって何が違うの?

「スマホの電波」と言ったとき、それは通常モバイル回線(セルラー通信)を指しますが、Wi-Fiとの違いは単に接続先のネットワークだけではありません。
プロトコルスタック・帯域の特性・認証方式など、レイヤー2以降の構造が大きく異なります。

モバイル通信(4G/5G)は、以下のような特徴を持っています:

  • 移動体通信専用に最適化されたRRC(Radio Resource Control)やEPSベアラーの制御

  • 通信事業者による品質保証(QoS)

  • ユーザー識別のためのSIMベースの強固な認証

一方で、Wi-FiはIEEE 802.11系の規格に基づき、基本的に共有メディアアクセス(CSMA/CA)でアクセス制御されます。
これは、「周囲に多くの端末があるほど競合が激化し、レイテンシやスループットが不安定になりやすい」という性質を持ちます。

また、モバイル通信はほとんどの場合NATを含まないルーティング構成で、直接IP付与されるのに対し、Wi-Fi接続はローカルルーター配下のプライベートアドレス空間で動作することが多く、挙動に差が出ます。

テザリングってどうしてできるの?

テザリングは、スマートフォンがルーター的に機能することによって、他のデバイスにモバイル回線を共有する仕組みです。
この動作の裏側には、NAT(IPマスカレード)やDHCPサーバ、ソフトウェアアクセスポイント(SoftAP)の動作が含まれています。この仕組みでは、スマホがルーターのように振る舞い、他の端末にIPアドレスを割り当て、モバイル回線を中継しています。

テザリングの方式には主に以下の3つがあります:

  • Wi-Fiテザリング:SoftAPモードを用いて、SSIDを発信。端末がAPとなり、クライアントにIPを払い出す

  • USBテザリング:PC等に対して、RNDISやCDC-ECM等の仮想NICを経由してIP接続

  • Bluetoothテザリング:Bluetooth PANプロファイルを用いた低帯域な接続方式

スマホ側では、モバイル回線→NAT→ローカルクライアント という変換経路をリアルタイムで処理しており、特にWi-FiテザリングはSoCやOSの処理負荷が大きいため、バッテリー消費が急増しやすいです。

テザリング時はスマホが「ルーターの役割」も兼ねています。特にWi-FiテザリングではSoftAP(ソフトウェアアクセスポイント)として、SSIDの発信やIP払い出しまで自動で行っています。
また、キャリアによってはAPN設定やプラン条件でテザリングを制限している場合もあるため、実装時や検証時には注意が必要です。

なぜ機種やキャリアによって電波の入りが違う?

同じ場所・同じ時間帯でも、端末やキャリアによって「電波の入り」に差が出るのは、主に3つの要因が関係しています。

1.周波数帯(バンド)の対応状況

2.基地局との相性(対応MIMO・キャリアアグリゲーション)

3.端末ハードウェア(アンテナ・RF設計)

周波数帯は、キャリアごとに展開しているバンドが異なり、端末がそのバンドに対応していなければ接続できません。たとえば、ドコモが展開しているn79バンドは、一部端末では非対応です。

さらに、同じ5Gといっても、

  • Sub6(3.5GHz)とミリ波(28GHz)では伝播特性が全く異なり、ミリ波非対応端末では屋内や高密度空間で速度に差が出ます。

  • アンテナ設計も重要で、Antenna Diversityの実装数やビームフォーミングの精度によって、弱電界でも通信品質を保てるかが変わってきます。

つまり、「自分だけ電波が弱い」と感じたときは、ハードとネットワークのマッチング問題が背後にあるかもしれません。

飛行機の中でスマホを使うのって、本当に危険だったことある?

航空機内でスマートフォンを機内モードに設定するよう求められるのは、必ずしも “危険だから”というわけではありません。
技術的な観点では、スマホの発する電波が航空機の通信や航法機器に致命的な干渉を与えた、という正式な報告はほぼ存在していません。

しかし、以下のような理論上のリスクが存在しており、運航側としては排除しておきたいのが実情です:

  • 携帯通信は複数の周波数帯を自動的にスキャンして接続先を探す性質があり、一定時間に渡って連続的なスプリアスが発生する

  • 特にILS(Instrument Landing System)やGPSは、Lバンドの狭帯域信号を利用しており、外部ノイズに弱い構造を持つ

  • 大量の乗客が一斉に通信を試みた場合、局所的なEMC(電磁両立性)問題が生じる可能性がある

そのため、「個別には問題ないかもしれないが、全体としては制御が効かない」という理由から、リスク低減のためのポリシーとして“機内モード”が維持されていると捉えるのが現実的です。

「機内モードって必要なの?」という素朴な疑問をきっかけに、スマホの通信や電波の仕組みについて見てきました。なんとなくオンにしていた機能や、日常の“通信あるある”の裏には、意外としっかりとした理由や仕組みがあることがわかってきたのではないでしょうか。

もちろん、すべてを完璧に理解して使う必要はありませんが、
「あ、今ちょっと電波届きづらいのかな」とか「これはWi-Fiじゃなくてモバイル回線だな」とか、少しだけ“意識して使う”だけでも、スマホとの付き合い方がちょっと変わるかもしれませんし、開発者視点でのネットワーク理解にもつながるはずです。

見えないけれど身近な“通信”の世界。次に機内モードをオンにするとき、ほんの少しだけその意味を思い出してもらえたらうれしいです。

弊社Nucoでは、他にも様々なお役立ち記事を公開しています。よかったら、Organizationのページも覗いてみてください。
また、Nucoでは一緒に働く仲間も募集しています!興味をお持ちいただける方は、こちらまで。





Source link

Views: 0

【マルチエージェント徹底入門】Agent Development Kit ではじめるマルチエージェント開発


はじめに

Agent Development Kit(ADK)には、複数のエージェントが連携するマルチエージェントを手軽に実装する機能があります。ただし、マルチエージェントを利用する際は、ユースケースに応じて、「複数のエージェントがどのように役割分担するのか」というシステム構成、言い換えると、マルチエージェントのアーキテクチャーを適切に選択する必要があります。

この記事では、ADK が提供する「サブエージェント(Subagent)」と「エージェント・アズ・ア・ツール(Agent-as-a-Tool)」の機能比較を通して、マルチエージェントの基本となるアーキテクチャーを学びます。

ツールの仕組みの復習

この記事のメインテーマは、「サブエージェント」と「エージェント・アズ・ア・ツール」の比較ですが、事前準備として、下記の記事で紹介した会話型エージェントの仕組みをおさらいしながら、ADK の「ツール」機能を復習しておきます。

ここでは、次の図のように、会話機能を持たない 3 つの「タスク特化型エージェント」を会話機能を持った「クライアントエージェント」でまとめるという構成を紹介しました。


タスク特化型エージェントをクライアントエージェントでまとめる構成

3 つのタスク特化型エージェントは、「エージェント」と名付けられていますが、実際には、Gemini API を利用した通常の Python の関数です。ADK で実装したエージェントは、クライアントエージェントのみです。タスク特化型エージェントの関数を Function calling で呼び出す「ツール」としてクライアントエージェント登録することで、クライアントエージェントは必要に応じてこれらの関数を利用します。処理の流れを図示すると、次のようになります。


ツールを用いた会話の流れ

ADK でマルチエージェントを構成する場合、全体をまとめるメインとなるエージェントを「ルートエージェント」と呼びます。上記の例では、ADK のエージェントは「クライアントエージェント」しかないので、本当の意味でのマルチエージェント構成とは言えませんが、便宜上、「クライアントエージェント」をルートエージェントと表現しています。

サブエージェントの仕組み

ADK におけるマルチエージェント構成では、会話機能を持った複数のエージェントを用意しておき、これらを互いに関係付けます。この際、基本となるのが、1 つのルートエージェントに複数のサブエージェントを登録する構成です。この場合、ユーザーとの最初の会話はルートエージェントが担当しますが、状況に応じて会話を担当するエージェントがサブエージェントに切り替わります。特別な設定をしない場合は、デフォルトで用意されているオートフロー(auto flow)の機能により、会話の流れに応じて担当するエージェントが自動的に切り替わります。

この説明だけではわかりにくいので、新宿にある架空のショッピングモール「新宿スターライトテラス」の例で説明しましょう。スターライトテラスの案内カウンターに行くと、案内係である「テラスガイド」と会話ができて、スターライトテラス全体について教えてくれます。一方、スターライトテラス内の特定のお店、たとえば、コーヒーショップ「夜の帳(とばり)」について聞くと、このお店の専門ガイドである「とばりちゃん」が登場して、テラスガイドに代わって会話をします。


新宿スターライトテラスの案内カウンター

この例では、スターライトテラス全体を担当するテラスガイドがルートエージェントで、とばりちゃんをはじめとする各お店の案内役がサブエージェントになります。

ADK によるサブエージェントの実装例

さっそくですが、新宿スターライトテラスの案内カウンターを ADK で実装して、期待通りに動くかどうか確認してみましょう。

環境準備

Vertex AI workbench のノートブック上で実装しながら説明するために、まずは、ノートブックの実行環境を用意します。新しいプロジェクトを作成したら、Cloud Shell のコマンド端末を開いて、必要な API を有効化します。

gcloud services enable 
  aiplatform.googleapis.com 
  notebooks.googleapis.com 
  cloudresourcemanager.googleapis.com

続いて、Workbench のインスタンスを作成します。

PROJECT_ID=$(gcloud config list --format 'value(core.project)')
gcloud workbench instances create agent-development 
  --project=$PROJECT_ID 
  --location=us-central1-a 
  --machine-type=e2-standard-2

クラウドコンソールのナビゲーションメニューから「Vertex AI」→「Workbench」を選択すると、作成したインスタンス agent-develpment があります。インスタンスの起動が完了するのを待って、「JUPYTERLAB を開く」をクリックしたら、「Python 3(ipykernel)」の新規ノートブックを作成します。

初期設定

ここからは、ノートブックのセルでコードを実行していきます。

はじめに、Agent Development Kit (ADK) のパッケージをインストールします。

%pip install --upgrade --user google-adk

インストールしたパッケージを利用可能にするために、次のコマンドでカーネルを再起動します。

import IPython
app = IPython.Application.instance()
_ = app.kernel.do_shutdown(True)

再起動を確認するポップアップが表示されるので [Ok] をクリックします。

次に、必要なモジュールをインポートして、実行環境の初期設定を行います。

import copy, json, os, re, uuid
import vertexai
from google.genai.types import Part, UserContent, ModelContent
from google.adk.agents.llm_agent import LlmAgent
from google.adk.artifacts import InMemoryArtifactService
from google.adk.memory.in_memory_memory_service import InMemoryMemoryService
from google.adk.runners import Runner
from google.adk.sessions import InMemorySessionService
from google.adk.tools.agent_tool import AgentTool

[PROJECT_ID] = !gcloud config list --format 'value(core.project)'
LOCATION = 'us-central1'

vertexai.init(project=PROJECT_ID, location=LOCATION)

os.environ['GOOGLE_CLOUD_PROJECT'] = PROJECT_ID
os.environ['GOOGLE_CLOUD_LOCATION'] = LOCATION
os.environ['GOOGLE_GENAI_USE_VERTEXAI'] = 'True'

また、ADK のエージェントと会話するための簡易的なアプリのクラス LocalApp を用意しておきます。

class LocalApp:
    def __init__(self, agent):
        self._agent = agent
        self._user_id = 'local_app'
        self._runner = Runner(
            app_name=self._agent.name,
            agent=self._agent,
            artifact_service=InMemoryArtifactService(),
            session_service=InMemorySessionService(),
            memory_service=InMemoryMemoryService(),
        )
        self._session = self._runner.session_service.create_session(
            app_name=self._agent.name,
            user_id=self._user_id,
            state={},
            session_id=uuid.uuid1().hex,
        )
        
    async def _stream(self, query):
        content = UserContent(parts=[Part.from_text(text=query)])
        async_events = self._runner.run_async(
            user_id=self._user_id,
            session_id=self._session.id,
            new_message=content,
        )
        result = []
        agent_name = None
        async for event in async_events:
            if DEBUG:
                print(f'----n{event}n----')
            if (event.content and event.content.parts):
                response = ''
                for p in event.content.parts:
                    if p.text:
                        response += f'[{event.author}]nn{p.text}n'
                if response:
                    
                    pattern = 'transfer_to_agent(agent_name=["']([^"]+)["'])'
                    matched = re.search(pattern, response)
                    if (not agent_name) and matched:
                        agent_name = matched.group(1)
                    else:
                        print(response)
                        result.append(response)
                    
        return result, agent_name

    async def stream(self, query):
        result, agent_name = await self._stream(query)
        
        if agent_name:
            if DEBUG:
                print(f'----nForce transferring to {agent_name}n----')
            result, _ = await self._stream(f'Please transfer to {agent_name}')
        
        return result

「新宿スターライトテラス」と「夜の帳」の情報

あくまで架空の設定ですが、「新宿スターライトテラス」と「夜の帳」、それぞれを担当するエージェントが参照する情報を次のように定義します。

shopping_mall_info = '''
* 立地と外観:
  - 新宿駅南口から徒歩5分。賑やかな駅周辺から少し離れ、落ち着いた雰囲気のエリアに位置しています。
  - 緑豊かなオープンテラスが特徴的で、都会の中にありながらも自然を感じられる空間を提供しています。
  - 夜になると、間接照明が灯り、ロマンチックな雰囲気に包まれます。

* イベント:
  - 週末には、ジャズライブやアコースティックライブなどの音楽イベントがテラスで開催され、夜の雰囲気を盛り上げます。
  - 季節ごとのイルミネーションが美しく、訪れる人の目を楽しませます。
  - 地域住民向けのワークショップやマルシェなども開催され、地域との交流を深めています。

* テナント:
  - 個性的なセレクトショップ: 大手チェーン店だけでなく、オーナーのこだわりが詰まった隠れ家のようなセレクトショップが点在しています。
  - こだわりのレストランやカフェ: 「夜の帳」のように、落ち着いた雰囲気で質の高い食事や飲み物を楽しめるお店が集まっています。テラス席があるお店も多く、開放的な空間で食事を楽しめます。
  - 上質なライフスタイル雑貨店: 日常を豊かにする、デザイン性の高い雑貨や家具、オーガニックコスメなどを扱うお店があります。
  - アートギャラリーやミニシアター: 感性を刺激するアートや映画に触れることができるスペースがあります。
'''

coffee_shop_info = '''
* 店名: 夜の帳(よるのとばり)

* コンセプト: 一日の終わりに、静かに心と体を休ませる隠れ家のような喫茶店。落ち着いた照明と、心地よい音楽が流れる空間で、こだわりのコーヒーや軽食、デザートを提供します。

* 立地と外観:
  - 新宿スターライトテラス内の、メインフロアから少し奥まった静かな一角。3階の吹き抜けに面した見晴らしの良い場所
  - オレンジや琥珀色の暖色系間接照明が、店内から優しく漏れる。控えめな光で照らされた、筆記体のような上品な看板。

* メニュー:
  ** こだわりの珈琲:
    - 夜の帳ブレンド: 深煎りでコクがあり、ほんのりビターな大人の味わい。疲れた心に染み渡ります。
    - 月光の浅煎り: フルーティーな香りが特徴の、すっきりとした味わい。リフレッシュしたい時に。
    - カフェ・オ・レ: 丁寧に淹れたブレンドコーヒーと、温かいミルクの優しいハーモニー。
    - 水出し珈琲: じっくりと時間をかけて抽出した、まろやかで雑味のないアイスコーヒー。

  ** 軽食:
    - 厚切りトーストのたまごサンド: ふわふわの厚切りトーストに、自家製マヨネーズで和えた卵サラダをたっぷり挟みました。
    - 気まぐれキッシュ: シェフがその日の気分で作る、季節の野菜を使った焼き立てキッシュ。
    - 昔ながらのナポリタン: 喫茶店の定番メニュー。懐かしい味わいが心を満たします。
    - チーズと蜂蜜のトースト: 香ばしいトーストに、とろけるチーズと甘い蜂蜜が絶妙な組み合わせ。
'''

エージェントの作成

ここから、実際に動作する ADK のエージェントを作成していきます。まず、サブエージェントとして利用する「とばりちゃん」のエージェントを次のように作成します。

instruction = f'''
You are a friendly and energetic guide of the coffee shop "夜の帳".
Before giving an answer, say "とばりちゃんが答えるよ!".

[task]
Give an answer to the query based on the [shop information].

[shop information]
{coffee_shop_info}

[format instruction]
In Japanese. No markdowns.
'''

tobariChan_agent = LlmAgent(
    model='gemini-2.0-flash-001',
    name='TobariChan_agent',
    description=(
        'A friendly guide of the coffee shop "夜の帳".'
    ),
    instruction=instruction,
)

この段階では、LlmAgent クラスのインスタンスとして作成した一般的なエージェントで、サブエージェントとしての特別な設定はありません。次のように、単体のエージェントして会話することもできます。

client = LocalApp(tobariChan_agent)
DEBUG = False

query = f'''
こんにちは!おすすめのコーヒーはありますか?
'''
_ = await client.stream(query)

[出力結果]

[TobariChan_agent]

とばりちゃんが答えるよ!おすすめの珈琲は、夜の帳ブレンドです!深煎りでコクがあり、ほんのりビターな大人の味わいが、疲れた心に染み渡りますよ。

出力結果の先頭にある [TobariChan_agent] は、応答テキストを生成したエージェントの名前を表します。エージェントを作成する際に name オプションで指定した名前が用いられます。

続いて、TobariChan_agent をサブエージェントとする「テラスガイド」のエージェントを作成します。

global_instruction = '''
* Name of the guide of "夜の帳" is "とばりちゃん".
* Name of the guide of "新宿スターライトテラス" is "テラスガイド".
'''

instruction = f'''
You are a formal guide of the shopping mall "新宿スターライトテラス".
Before giving an answer, say "テラスガイドがお答えいたします。".

[Tasks]
* Give an answer to the query based on the [mall information].

[mall information]
{shopping_mall_info}
'''

terraceGuide_agent = LlmAgent(
    model='gemini-2.0-flash-001',
    name='TerraceGuide_agent',
    description=(
'''
A formal guide of the shopping mall "新宿スターライトテラス".
This agent can also answer general questions that any other agents cannot answer.
'''
    ),
    global_instruction=global_instruction,
    instruction=instruction,
    sub_agents=[
        copy.deepcopy(tobariChan_agent),
    ],
)

ここでは、global_instructioninstruction の 2 種類のインストラクションがある点に注意してください。これらの違いは次のようになります。

  • instruction:ルートエージェント TerraceGuide_agent に対する指示
  • global_instruction:ルートエージェント TerraceGuide_agent とサブエージェント tobariChan_agent の両方に対する指示

先ほど tobariChan_agent を定義した際のインストラクションには、ルートエージェントとなる TerraceGuide_agent の情報はありませんでした。global_instruction を利用することで、サブエージェントとして利用する際に必要となる、追加の情報や指示を加えることができます。

また、ユーザーからの入力に対して、どのエージェントが回答するべきかの判断は、それぞれのエージェントの description を参考にして行われます。上記の例では、ルートエージェントである TerraceGuide_agentdescription は次のようになります。

A formal guide of the shopping mall "新宿スターライトテラス".
This agent can also answer general questions that any other agents cannot answer.

2 行目の記述により、他のエージェントが回答できない一般的な質問は、TerraceGuide_agent に転送されると期待できます。

なお、既存のエージェントのインスタンス(今の場合は tobariChan_agent)を他のエージェントのサブエージェントとして利用すると、インスタンスそのものに変更が発生します。上記のコードでは、元のインスタンスを破壊しないように、copy.deepcopy(tobariChan_agent) でインスタンスのコピーを作成しています。

マルチエージェントの動作例

それでは、先ほど作成した「テラスガイド」のエージェントを使ってみましょう。

client = LocalApp(terraceGuide_agent)
DEBUG = False

query = '''
こんにちは!ここには、どんな喫茶店がありますか?
'''
_ = await client.stream(query)

[出力結果]

[TerraceGuide_agent]

テラスガイドがお答えいたします。「夜の帳」という落ち着いた雰囲気で質の高いコーヒーを楽しめるお店がございます。

スターライトテラスに関する質問には、まずは、テラスガイドが回答してくれます。紹介された「夜の帳」について詳しく聞いてみましょう。

query = '''
夜の帳はどんなお店ですか?
'''
_ = await client.stream(query)

[出力結果]

[TobariChan_agent]

とばりちゃんが答えるよ!夜の帳はね、一日の終わりに、静かに心と体を休ませる隠れ家みたいな喫茶店なの。落ち着いた照明と、心地よい音楽が流れる空間で、こだわりのコーヒーや軽食、デザートを楽しめるんだ。場所は新宿スターライトテラスのメインフロアから少し奥まった静かな一角にあるよ。3階の吹き抜けに面していて、見晴らしも良いんだ!オレンジや琥珀色の暖色系間接照明が、店内から優しく漏れていて、控えめな光で照らされた、筆記体のような上品な看板が目印だよ。

テラスガイドの代わりに、とばりちゃんが登場して回答してくれました!

この後の会話は、とばりちゃんが引き続き担当します。

query = '''
おすすめのコーヒーを教えて。
'''
_ = await client.stream(query)

[出力結果]

[TobariChan_agent]

とばりちゃんが答えるよ!おすすめのコーヒーはね、疲れた心に染み渡る深煎りでコクがあって、ほんのりビターな大人の味わいの「夜の帳ブレンド」かな。それと、リフレッシュしたい時には、フルーティーな香りが特徴のすっきりとした味わいの「月光の浅煎り」もおすすめだよ!

では、スターライトテラスについて、とばりちゃんに聞くとどうなるでしょうか?

query = '''
新宿スターライトテラスのイベントについて教えて。
'''
_ = await client.stream(query)

[出力結果]

[TobariChan_agent]

ごめんね、イベントについてはちょっとわからないの。新宿スターライトテラスのイベントについては、テラスガイドさんに聞いてみてね!


[TerraceGuide_agent]

テラスガイドがお答えいたします。新宿スターライトテラスでは、週末にはジャズライブやアコースティックライブなどの音楽イベントがテラスで開催され、夜の雰囲気を盛り上げます。また、季節ごとのイルミネーションが美しく、訪れる人の目を楽しませます。地域住民向けのワークショップやマルシェなども開催され、地域との交流を深めています。

とばりちゃんは、スターライトテラスについての質問はテラスガイドに聞いた方がよいことをちゃんと理解しており、テラスガイドに対応を引き継いでくれました。この後の会話は、テラスガイドが引き続き担当します。

query = '''
ジャズライブに行ってみたいです。
'''
_ = await client.stream(query)

[出力結果]

[TerraceGuide_agent]

テラスガイドがお答えいたします。週末の夜に開催しております。詳しいスケジュールは、新宿スターライトテラスのウェブサイトや館内ポスターでご確認ください。

このように、状況に応じて会話を担当するエージェントが切り替わっていくのが、サブエージェントを利用したマルチエージェント構成の特徴です。エージェントが切り替わる際は、これまでの会話の内容もセッション情報として引き継がれます。

エージェント・アズ・ア・ツールの実装例

ルートエージェントにサブエージェントを登録することで、これらのエージェントが入れ替わりながら会話を継続することがわかりました。一方、ADK には、ルートエージェントに対して、他のエージェントを「ツール」として登録する機能があります。会話機能を持ったエージェントを「自然言語テキストを入力すると、自然言語テキストが出力される関数」とみなして、あえてツールとして登録します。このような使い方を「エージェント・アズ・ア・ツール」と言います。

こちらも「新宿スターライトテラスの案内カウンター」を例として、実際の動作を確認してみましょう。

エージェントの作成

ここでは、すでに作成済みの「とばりちゃん」のエージェントを再利用します。先ほど「テラスガイド」のエージェントを実行したノートブックで、続けて次のコマンドを実行します。

global_instruction = '''
* Name of the guide of "夜の帳" is "とばりちゃん".
* Name of the guide of "新宿スターライトテラス" is "テラスガイド".
'''

instruction = f'''
You are a formal guide of the shopping mall "新宿スターライトテラス".
Before giving an answer, say "テラスガイドがお答えいたします。".

[Tasks]
* Give an answer to the query based on the [mall information].
* For queries regarding "夜の帳", ask TobariChan_agent to get an answer
  and relay it to the user. Avoid relying on your own knowledge.

[mall information]
{shopping_mall_info}
'''

terraceGuide_agent_with_tool = LlmAgent(
    model='gemini-2.0-flash-001',
    name='TerraceGuide_agent',
    description=(
        'A formal guide of the shopping mall "新宿スターライトテラス".'
    ),
    global_instruction=global_instruction,
    instruction=instruction,
    tools=[
        AgentTool(tobariChan_agent),
    ],
)

先ほどの「テラスガイド」のエージェントの定義とよく似ていますが、異なる点が 2 つあります。まず、最後の部分にあった sub_agents オプションが tools オプションに変わっています。関数 AgentTool() は、既存のエージェントを「自然言語テキストを入力すると、自然言語テキストが出力される関数」に変換するラッパーの機能を提供します。変換された関数は、会話の内容を保持するセッション機能を持たず、ワンショットのやりとりだけを行います。これにより、既存のエージェントを単純なツールとして利用できます。

また、これに応じて、instruction の中に次の指示を加えています。

* For queries regarding "夜の帳", ask TobariChan_agent to get an answer
  and relay it to the user. Avoid relying on your own knowledge.

「夜の帳」に関する質問は、自分の知識だけで答えるのではなく、登録したツール TobariChan_agent で得られた回答を伝えるように指示しています。TobariChan_agent という名前は、エージェント tobariChan_agent を定義する際に、name オプションで指定した名前に対応します。

エージェント・アズ・ア・ツールの動作例

新しい「テラスガイド」のエージェントを使ってみましょう。

client = LocalApp(terraceGuide_agent_with_tool)
DEBUG = False

query = '''
こんにちは!ここには、どんな喫茶店がありますか?
'''
_ = await client.stream(query)

[出力結果]

[TerraceGuide_agent]

テラスガイドがお答えいたします。「夜の帳」という喫茶店がございます。詳細を知りたい場合は、とばりちゃんに聞いてみますので、少々お待ちください。

「夜の帳」については、とばりちゃんに聞いてみることを提案していますが、実際に聞くとどうなるでしょうか?

query = '''
夜の帳はどんなお店ですか?
'''
_ = await client.stream(query)

[出力結果]

[TerraceGuide_agent]

テラスガイドがお答えいたします。夜の帳について、とばりちゃんに聞いてみます。


[TerraceGuide_agent]

とばりちゃんが答えるには、夜の帳は、一日の終わりに心と体を休ませる隠れ家のような喫茶店です。新宿スターライトテラスの静かな場所にあり、落ち着いた照明と心地よい音楽が流れる空間で、こだわりのコーヒーや軽食、デザートをご用意しているそうです。

今回は、テラスガイドに代わってとばりちゃんが登場するのではなく、テラスガイドが会話を続けます。テラスガイドがとばりちゃんに質問して、その結果を要約して伝えてくれたようです。

質問を続けます。

query = '''
おすすめのコーヒーを教えて。
'''
_ = await client.stream(query)

[出力結果]

[TerraceGuide_agent]

テラスガイドがお答えいたします。夜の帳のおすすめのコーヒーについて、とばりちゃんに聞いてみます。


[TerraceGuide_agent]

とばりちゃんが答えるには、おすすめのコーヒーはお客様の気分で変わるそうです。

一日頑張って疲れた心を癒やしたいなら、深煎りでコクのある「夜の帳ブレンド」はいかがでしょう? ほんのりビターな大人の味わいが染み渡ります。

もし、リフレッシュしたい気分でしたら、フルーティーな香りが特徴の「月光の浅煎り」がおすすめです。すっきりとした味わいで気分転換できます。

「おすすめのコーヒー」としか言っていませんが、テラスガイドは会話の流れを記憶しているので、「夜の帳」の話だと理解して、再度、とばりちゃんに聞いて回答してくれました。

次は、スターライトテラスについて聞いてみます。

query = '''
新宿スターライトテラスのイベントについて教えて。
'''
_ = await client.stream(query)

[出力結果]

[TerraceGuide_agent]

テラスガイドがお答えいたします。週末には、ジャズライブやアコースティックライブなどの音楽イベントがテラスで開催され、夜の雰囲気を盛り上げます。季節ごとのイルミネーションが美しく、訪れる人の目を楽しませます。地域住民向けのワークショップやマルシェなども開催され、地域との交流を深めています。

今回は、とばりちゃんには質問せず、テラスガイド自身の知識で回答してくれました。

このように、あるエージェントをルートエージェントに対するサブエージェントして登録するか、ツールとして登録するかによって、エージェントの振る舞いが変わります。どちらの振る舞いが適切かは、当然ながら、エージェントの利用目的、あるいは、どのようなユーザー体験を提供したいかによって変わります。

インストラクションによる振る舞いの調整

先ほどのテラスガイドの定義では、instruction に次の指示を加えました。

* For queries regarding "夜の帳", ask TobariChan_agent to get an answer
  and relay it to the user. Avoid relying on your own knowledge.

テラスガイドは「夜の帳」に関する質問が来ると、この指示に従って、とばりちゃんに聞いて得られた回答を伝達しました。それでは、この指示を次のように書き換えるとどうなるでしょうか?

* For queries regarding "夜の帳", use TobariChan_agent to get information.
  Avoid relying on your own knowledge.
* Avoid revealing the existence of TobariChan_agent to the user.

先ほどは、「TobariChan_agent に聞いて得た回答を伝えなさい」と指示しましたが、今回は、「TobariChan_agent を使って情報を得なさい」「TobariChan_agent の存在をユーザーに明かさないように」と指示しています。興味深いことに、この違いでテラスガイドの行動が変化します。こちらの場合、「夜の帳」に関する質問の回答は、次のようになります。

query = '''
夜の帳はどんなお店ですか?
'''
_ = await client.stream(query)

[出力結果]

[TerraceGuide_agent]

テラスガイドがお答えいたします。
夜の帳については、ただいま確認いたします。少々お待ちください。


[TerraceGuide_agent]

テラスガイドがお答えいたします。
夜の帳は、一日の終わりに心と体を休ませる隠れ家のような喫茶店です。新宿スターライトテラスの3階にあって、落ち着いた照明と心地よい音楽が流れる空間で、こだわりのコーヒーや軽食、デザートをご用意しています。ぜひお立ち寄りください。

先ほどと違い、とばりちゃんからの回答を伝達するのではなく、とばりちゃんから得られた情報を元に自分の言葉で回答しています。とばりちゃんの存在をそのまま伝えるのか、それとも存在を隠すのか、インストラクションの違いによって、このような違いが得られました。

まとめ

この記事では、ADK のツール機能を復習した上で、ADK でマルチエージェントを構成する 2 つのパターン、「サブエージェント」と「エージェント・アズ・ア・ツール」を紹介しました。「新宿スターライトテラス」の案内カウンターを例としてそれぞれの実装を試しましたが、提供する機能はほぼ同じであるものの、エージェントと会話するユーザーの体験がそれぞれで異なりました。あるいは、インストラクションによる指示の仕方で、エージェントの振る舞いを変えることもできました。

また、ソフトウェア設計の観点で言うと、今回の構成では、ルートエージェントのオブジェクト内部にサブエージェントのオブジェクトが含まれており、これらは単独のオブジェクトとしてデプロイされる形になります。ルートエージェントとサブエージェントの機能が密接に関わっており、同時に開発・変更が必要な場合は、このような構成が扱いやすいでしょう。

一方、A2A のように、ネットワーク経由で外部のエージェントと連携するアーキテクチャーは、独立した機能を提供する外部のエージェントを一種の外部サービスとして利用する際に適していると考えられます。システムアーキテクチャーに詳しい方には、アプリケーションを複数のサブモジュールからなるモノリスとして設計するか、独立したサービスをネットワーク経由で連携させるマイクロサービス・アーキテクチャーで設計するかの違いというとわかりやすいかもしれません。

一般に、新しいアプリケーションを設計する際は、利用者がそのアプリケーションをどのように操作して、どのような体験を得るのかという「ユーザージャーニー」を定義することが大切だと言われます。マルチエージェントのアーキテクチャーを検討する際にもこれと同じことが言えます。マルチエージェントのアーキテクチャーについてはさまざな議論がありますが、まずは、ユーザーがエージェントとどのようなやり取りをするのかを示した「ユーザージャーニー」を明確にした上で、その実現に適したアーキテクチャーを考えていくことが大切です。



Source link

Views: 0

ポケモンの生態学や行動学をまとめた公式書籍「ポケモン生態図鑑」がAmazonにて予約中 – GAME Watch


 小学館は、書籍「ポケモン生態図鑑」を6月18日に発売する。A5判で、価格は1,430円。Amazonにて予約受付が開始されている。

 本書籍は、ポケモンの観察や研究の成果がつまった公式図鑑。1,000種類を超えるポケモンたちがどのように生活しているのか。生態学や行動学の視点から、違い、共通点、法則、つながりといったキーワードに注目して分類、解説している。

 合わせて、ティザーサイトも公開された。

公開されたティザーサイト イメージ

ポケモンの生態を米原善成氏が解説。イラストはきのしたちひろ氏がフルカラーで描き下ろし

 本書で、ポケモンの生態を解説するのは、博士(農学)であり、現在はポケモンに勤める米原善成氏。

 生態にフォーカスを当てるにあたり、その特徴や違いをわかりやすくするために、ポケモンのイラストはフルカラーで描き下ろされる。新イラストは、多くの動物生態本のイラストを手掛けてきた、きのしたちひろ氏が担当する。

 米原氏、きのした氏、ともに東京大学大学院農学生命科学研究科で動物の行動や生態を研究して博士号を取得。ポケモンという生き物を観察する視点は本格的だ。2人の博士が新たな視点でせまるポケモンの生態。いったいどんな図鑑になるのか。今後の続報に期待したい。





Source link

Views: 0

実在のWebサイトを調査する無料のモキュメンタリーミステリー『ネトゲ異常案件』がリリース。とあるオンラインRPGの「チートプレイヤーを特定する」という依頼を受け、バックドアから運営会社の情報にアクセスする




実在のWebサイトを調査するモキュメンタリーミステリー『ネトゲ異常案件』がリリース



Source link

Views: 0

「SILENT HILL」なりすましアカウントに要注意!『SILENT HILL f』βテストを騙り偽サイトに誘導する広告が出現 | Game*Spark


コナミデジタルエンタテインメントは、「SILENT HILL」および『SILENT HILL f』のなりすましアカウントに関する注意喚起を行いました。

「SILENT HILL」シリーズ最新作なりすましアカウントに注意!

『ひぐらしのなく頃に』で知られる竜騎士07氏がストーリーを担当し、NeoBards Entertainmentが開発中のシリーズ最新作『SILENT HILL f』。1960年代日本の田舎町「戎ヶ丘」を舞台に謎の白い「バケモノ」によって平穏が崩れ去るさまを描く本作について、偽サイトへと誘導するなりすましアカウントが確認されているとのことです。

なりすましアカウントは、クローズドβテストなどの偽イベント開催をうたった広告を出稿。個人情報の入力を求める偽サイトへと誘導する内容が含まれているとしています。

現時点では『SILENT HILL f』公式サイト「SILENT HILL」シリーズ公式X以外で、『SILENT HILL f』や「KONAMI」の名称が用いられていたり、キービジュアルが掲載されていたりするサイト・アカウントは、全てコナミとは無関係のものであるとのこと。『SILENT HILL f』に関する情報は公式サイトあるいは公式SNSアカウントで確認するよう呼び掛けています。

『SILENT HILL f』は、PC(Steam/Epic Games Store)/PS5/Xbox Series X|S向けに発売予定です。





Source link

Views: 0

ローソンにて「NIKKE」とのコラボキャンペーンが開催決定。3人のシルエットも公開 – GAME Watch


 ローソンは、Android/iOS/PC用RPG「勝利の女神:NIKKE」とのコラボキャンペーンを開催する。実施時期は未定。

 様々な作品とコラボを行なうローソンと「NIKKE」のタイアップキャンペーンが実施されることとなった。公開された画像では3人のシルエットが確認できる。キャンペーンの詳細については夏頃に公開を予定している。





Source link

Views: 0

【NISA投信グランプリ2025・リート部門】最優秀賞は割安なセクターの割安な銘柄を丹念に拾う「野村Jリートファンド」! – ダイヤモンド・ザイNISA投信グランプリ2025



【NISA投信グランプリ2025・リート部門】最優秀賞は割安なセクターの割安な銘柄を丹念に拾う「野村Jリートファンド」! - ダイヤモンド・ザイNISA投信グランプリ2025

「ダイヤモンド・ザイNISA投信グランプリ2025」リート部門の受賞投資信託2本を紹介。最優秀賞はア野村Jリートファンド/野村アセットマネジメント、優秀賞はフィデリティ・Jリート・アクティブ・ファンド(資産成長型)/フィデリティ投信だった。



Source link

Views: 0