日曜日, 5月 25, 2025
No menu items!
ホーム ブログ ページ 3082

【大喜利】『プレイヤーがちょっとだけ嫌な気持ちになるRPGとは?』回答募集中!



【大喜利】『プレイヤーがちょっとだけ嫌な気持ちになるRPGとは?』回答募集中!

【大喜利】『プレイヤーがちょっとだけ嫌な気持ちになるRPGとは?』回答募集中!



Source link

Views: 0

「ポケモン×極楽湯 ・RAKU SPA」ロケット団とコラボ!イベントグッズやフード発売&ロケット団の湯が楽しめる – 女性向けアニメ情報サイトにじめん


2025年4月24日(木)〜5月20日(火)の期間に、『ポケットモンスターと』と極楽湯 ・RAKU SPAグループのコラボが開催決定!

 

“ロケット団”をテーマにしたスペシャルイベント「ポケモン 銭湯!ロケット団」が開催されます。

「ポケモン 銭湯!ロケット団」詳細

本コラボでは、ロケット団をイメージした8種類の特別な湯船が登場し、「ポケモン 銭湯!ロケット団 プラスセット」を購入するとマフラータオルがもらえます。

 

店舗では限定イベントグッズの販売やスペシャルメニューも提供され、ノベルティがもらえるほか、ポケモンカードゲーム体験会も実施。

 

館内はポケモンのパネルやのぼり、タペストリーで装飾され、SNSでフォロー&ハッシュタグ投稿をするとオリジナルポストカードがプレゼントされます。

 

ロケット団の世界観を銭湯で楽しめる特別なイベントにご注目ください!

 

 

銭湯!ロケット団の湯

「ポケモン 銭湯!ロケット団」銭湯!ロケット団の湯「ポケモン 銭湯!ロケット団」銭湯!ロケット団の湯

 

イベントテーマ“ロケット団”をイメージした8種のポケモン銭湯!ロケット団の湯が登場。

浴室には特別にデザインしたタペストリーが装飾されます。

 

 

スケジュール

ポケモン銭湯!ロケット団の湯
ロケット団のミュウツーの湯

期間:4月24日(木)~4月27日(日)

 

ロケット団のニャースの湯

期間:4月28日(月)~4月30日(水)

 

ロケット団のソーナンスの湯

期間:5月1日(木)~5月3日(土)

 

ロケット団のミミッキュの湯

期間:5月4日(日)・5月6日(火)~5月8日(木)

※5月5日(月・祝)は菖蒲湯の実施のため、「銭湯!ロケット団の湯」の実施はございません。

 

ロケット団のアーボック&マタドガスの湯

期間:5月9日(金)~5月11日(日)

 

ロケット団のヘルガーの湯

期間:5月12日(月)~5月14日(水)

 

ロケット団のヤミカラスの湯

期間:5月15日(木)~5月17日(土)

 

ロケット団のニドキングの湯

期間:5月18日(日)~5月20日(火)

 

 

ポケモン銭湯!ロケット団 プラスセット

「ポケモン 銭湯!ロケット団」プラスセット「ポケモン 銭湯!ロケット団」プラスセット

 

店舗ご入館時に、入館料金+ポケモン 銭湯!ロケット団 プラスセットをご購入いただいた方に、オリジナルマフラータオルがお渡しされます。

 

・入館料金+ポケモン 銭湯!ロケット団プラスセット:1,100円(税込)

※RAKU CAFÉはメニューで1,100円(税込)以上のご注文

 

 

グッズ販売

ポケモン 銭湯!ロケット団 イベントビジュアルを使用したオリジナルグッズが登場。

また、4月24日(木)からオンラインショップでも販売されます。

 

 

クリアバッグ:2,640円(税込)

「ポケモン 銭湯!ロケット団」クリアバッグ「ポケモン 銭湯!ロケット団」クリアバッグ 「ポケモン 銭湯!ロケット団」クリアバッグ「ポケモン 銭湯!ロケット団」クリアバッグ

 

 

スペシャルメニュー販売

ロケット団をイメージしたオリジナルメニューが店舗で販売されます。

ご注文いただいた方には、各メニューに対応したノベルティをプレゼント!

 

 

「ポケモン 銭湯!ロケット団」「ポケモン 銭湯!ロケット団」

 

コラボドリンク(全3種)

アーボック&マタドガスのダークパープルなレモンスカッシュ:880円(税込)

ミュウツーのクールな杏仁カルピス:880円(税込)

ヤミカラスのブラックチョコミルク:880円(税込)

※コラボドリンク・スペシャルメニューをご注文いただいた方に【コースター(全9種)】をランダムで1点プレゼント。

 

コラボフード・デザート(全4種)

ニドキングの豪快骨付きチキンカレー:2,640円(税込)

ソーナンス&ニャースのソースカツとこばんハンバーグの欲張り丼:2,530円(税込)

ヘルガーの冷やし胡麻担々麺:2,420円(税込)

ミミッキュのばけのかわ風クレープ:2,200円(税込)

※コラボフード・デザートをご注文いただいた方に【ロッカーキー風キーホルダー(全5種)】をランダムで1点プレゼント。

 

 

「ポケモン 銭湯!ロケット団」「ポケモン 銭湯!ロケット団」

 

スペシャルメニュー(全1種)

銭湯で「戦闘!ロケット団」クールなパフェ:1,980円(税込)

パフェが入っている「ロケット団 クリアカップ」をお持ち帰りいただけます。
※スペシャルメニューはロッカーキー風キーホルダーの配布対象外となります。

 

 

特典

「ポケモン 銭湯!ロケット団」コースター(全9種)/ロッカーキー風キーホルダー(全5種)「ポケモン 銭湯!ロケット団」コースター(全9種)/ロッカーキー風キーホルダー(全5種)

 

 

ポケモンカードゲーム体験会

「ポケモン 銭湯!ロケット団」ポケモンカードゲーム体験会「ポケモン 銭湯!ロケット団」ポケモンカードゲーム体験会

 

ポケモンカードゲーム「バトルアカデミー」、「スタートデッキ Generations」の体験会を店舗にて開催!

 

 

「ポケモン 銭湯!ロケット団」ミニポスター「ポケモン 銭湯!ロケット団」ミニポスター

 

参加者には「ミニポスター(全1種)」がプレゼントされます。

 

①はじめてバトル

「バトルアカデミー」に同梱されているガイドに沿ったティーチングと、実際の対戦を45分程度行う初心者向けのコーナーです。極楽湯スタッフがティーチングいたします。

 

②おためしバトル

「バトルアカデミー」、「スタートデッキ Generations」のデッキを貸出して、自由に対戦いただける経験者向けのコーナーです。

 

※①②いずれも貸出デッキのみでのご参加となります。

※「スタートデッキ Generations」の貸出デッキ内容は各店で内容が異なります。

 

開催日程

4月26日(土)~4月29日(火)、

5月10日(土)、5月11日(日)、5月17日(土)、5月18日(日)

 

★はじめてバトル開催時間(1日3回)

10:15~11:15/14:00~15:00/15:30~16:30

 

★おためしバトル開催時間

10:15~11:30/14:00~16:30

 

また、店舗では「スタートデッキ Generations」「バトルアカデミー」に加えて、4月18日(金)発売の拡張パック「ロケット団の栄光」を順次販売します。

※一部店舗では入荷遅延、品切れの可能性もございます。

※詳細及び参加方法などはイベントHPでご確認ください。

 

 

イベント装飾

「ポケモン 銭湯!ロケット団」イベント装飾「ポケモン 銭湯!ロケット団」イベント装飾

 

イベントビジュアルを使用したパネルやのぼり、ポケモンカード紹介ポスターなどが店舗に登場します。

 

 

キーワードラリー

「ポケモン 銭湯!ロケット団」キーワードラリー「ポケモン 銭湯!ロケット団」キーワードラリー

 

極楽湯・RAKU SPA館内でキーワードラリーが実施されます。

解答用紙にキーワードを記入、正解いただいた方に「オリジナルシール」をプレゼント!

 

 

参加方法

・入館受付後、フロントで解答用紙をもらう

・店内に掲示してある「ポケモンカード紹介ポスター」をもとに解答用紙記載へキーワードを記入

・全てのキーワードを記載の上、フロントにお持ちいただいた方に【オリジナルシール】を1枚プレゼント

 

 

Xキャンペーン

「ポケモン 銭湯!ロケット団」Xキャンペーン「ポケモン 銭湯!ロケット団」Xキャンペーン

 

極楽湯/RAKU SPAの公式Xをフォローし、ハッシュタグ「#銭湯ロケット団」をつけてスペシャルイベントにまつわる内容を投稿し、店舗の受付にご提示いただいた方に、先着で「ポストカード(全1種)」をプレゼント!

 

 

開催概要

グッズオンラインショップ

イベントグッズは4月24日(木)12時より極楽湯グループ公式オンラインショップ「GK Store」でも販売されます。

販売期間:2025年4月24日(木)~5月27日(火)

 

 

ポケモン 銭湯!ロケット団

開催期間:2025年4月24日(木)~5月20日(火)

開催店舗:極楽湯・RAKU SPA 38店舗

 

そのほかの詳細は「ポケモン 銭湯!ロケット団」特集ページをご確認ください。

 



Source link

Views: 0

Google ADK (Agent Development Kit)使い方:AIエージェント開発の第一歩 #Python



Google ADK (Agent Development Kit)使い方:AIエージェント開発の第一歩 #Python

はじめに

AIエージェントとADK

AI(人工知能)が私たちの周りでますます活躍するようになりました。その中でも「AIエージェント」は、特定の目的を持って自律的に考え、行動するプログラムです。まるで、賢いデジタルアシスタントが、私たちのために情報を集めたり、タスクをこなしたりしてくれるようなものです。

Agent Development Kit (ADK) は、Googleが提供する、このようなAIエージェントを構築するためのオープンソースの道具箱(フレームワーク)です。ADKを使えば、アイデアを形にし、インテリジェントなエージェントを比較的簡単に開発・実行できます。

ADKを選ぶ理由

ADKには、特にAI開発初心者やGoogleの技術に関心がある方にとって、いくつかの利点があります。

  1. Geminiモデルとの連携: Googleの最新AIモデルであるGeminiをスムーズに活用できるように設計されています。
  2. Google Cloudとの親和性: Google Cloudの他のサービスと連携させやすく、Googleの環境で開発を進めたい場合に便利です。
  3. 段階的な学習: 基本的なエージェントから始めて、徐々に複雑なマルチエージェントシステムやワークフローの構築へとステップアップできます。
  4. 拡張性: 自分で作った関数(ツール)をエージェントに組み込んだり、外部のAPIと連携させたりと、機能を柔軟に拡張できます。
  5. 実行環境: 作成したエージェントは、自分のPCだけでなく、Google Cloud Runのようなクラウド環境で動かすことも可能です。

このガイドで目指すこと

このガイドは、ADKを初めて使う方を対象としています。Pythonの基本的な知識(変数、関数など)があれば十分です。特別なAIの専門知識は必要ありません。

読み終える頃には、あなたは以下のことができるようになっているはずです。

  • ADKのインストールと基本的な設定を行う。
  • ADKの主要な要素(エージェント、モデル、ツール、セッション、メモリ)を理解する。
  • 簡単な応答を生成するLLMエージェントを作成・実行する。
  • 自作の機能を「ツール」としてエージェントに追加する。
  • エージェントが会話の流れを記憶する「メモリ」機能を使う。
  • 複数のステップを順番に実行する「シーケンシャルエージェント」の基本を知る。

準備するもの

  1. Python: バージョン3.9以上が必要です。python --version (または python3 --version) で確認し、なければ python.org からインストールしてください。
  2. pip: Pythonのパッケージ管理ツール。通常Pythonと一緒にインストールされます。
  3. Google APIキー: エージェントの頭脳となるGeminiモデルを利用するために必要です。Google AI Studio などで取得できます。取得したキーは安全な方法で管理してください(環境変数での設定が推奨されます)。

準備ができたら、さっそく環境を整えましょう。

開発環境のセットアップ

快適な開発のために、まずは作業スペースを準備します。

ステップ1: プロジェクトフォルダと仮想環境

  1. ターミナル(コマンドプロンプト)を開きます。
  2. 作業用のフォルダを作成し、その中に移動します。
    mkdir adk_beginner_project
    cd adk_beginner_project
    
  3. Python仮想環境を作成します。これにより、プロジェクトごとに使うライブラリを分離できます。
  4. 仮想環境を有効化します。
    • macOS/Linux: source env/bin/activate
    • Windows: .\env\Scripts\activate
      プロンプトの先頭に (env) と表示されれば成功です。

ステップ2: ADKのインストール

仮想環境が有効な状態で、pipを使ってADKをインストールします。

ステップ3: APIキーの設定

Geminiモデルを使うために、取得したAPIキーを環境変数 GOOGLE_API_KEY に設定します。

  • macOS/Linux:
    export GOOGLE_API_KEY='あなたのAPIキー'
    
  • Windows (コマンドプロンプト):
    set GOOGLE_API_KEY=あなたのAPIキー
    
  • Windows (PowerShell):
    $env:GOOGLE_API_KEY = "あなたのAPIキー"
    

注意: APIキーは機密情報です。コード内に直接書き込まず、環境変数などを使って安全に扱ってください。

これで開発の準備が整いました。

はじめてのエージェント:シンプルな応答生成

最も基本的なエージェントは、大規模言語モデル(LLM)の能力をそのまま利用するものです。ADKの LlmAgent を使って、簡単な応答を生成させてみましょう。

ステップ1: Pythonファイルの作成

プロジェクトフォルダ内に simple_responder.py というファイルを作成します。

ステップ2: コードの記述

simple_responder.py に以下のコードを記述します。

# simple_responder.py

import os
import asyncio
from adk.agents import LlmAgent
from adk.sessions import Session

# APIキーが設定されているか確認 (デバッグ用)
# print(f"APIキー設定済み: {os.getenv('GOOGLE_API_KEY') is not None}")

async def main():
    """シンプルな LlmAgent を使って応答を生成する"""

    print("エージェントを準備中...")
    # LlmAgentインスタンスを作成。名前を付けておく。
    # GOOGLE_API_KEYが設定されていれば、デフォルトでGeminiモデルを使用。
    agent = LlmAgent(name="SimpleResponder")

    # 対話のコンテキストを管理するセッションを作成
    session = Session()

    # エージェントに与える指示(プロンプト)
    # 以前とは違う、少しクリエイティブなタスクを依頼
    prompt = "「夏の終わり」をテーマにした短い詩を一句作ってください。"
    print(f"\nエージェントへの指示: '{prompt}'")

    # agent.invoke を使ってエージェントを実行
    # await で非同期処理の完了を待つ
    response_data = await agent.invoke(prompt, session=session)

    # 応答データからテキスト出力を取得して表示
    print("\nエージェントからの応答:")
    # response_data は辞書形式。'output'キーに応答テキストが入っていることが多い。
    print(response_data.get('output', '応答がありませんでした。'))

    # 参考:セッションに記録されたイベント(処理の流れ)を表示
    print("\n--- 処理の記録 ---")
    for event in session.get_events():
        print(event)
    print("------------------")

if __name__ == "__main__":
    # 非同期関数 main を実行
    asyncio.run(main())

ステップ3: コードのポイント

  • async def main() / await agent.invoke() / asyncio.run(main()): ADKは非同期処理を多用するため、async/await 構文と asyncio ライブラリが使われます。
  • LlmAgent(name="..."): LLM(ここではGemini)の能力を直接利用するエージェントを作成します。
  • Session(): エージェントとの一回のやり取り(対話)を管理するオブジェクトです。入力、出力、途中の処理ステップなどが記録されます。
  • prompt = "...": エージェントに何をしてもらいたいかを伝える指示文です。今回は詩の作成を依頼しました。
  • response_data = await agent.invoke(prompt, session=session): エージェントを起動し、指示を与えます。session を渡すことで、処理の記録が可能になります。
  • response_data.get('output', ...): invoke の結果(辞書)から、キー 'output' に対応する値(LLMが生成したテキスト)を取り出します。.get() を使うとキーが存在しなくてもエラーになりません。
  • session.get_events(): セッションに記録された処理のステップ(イベント)を取得します。デバッグに役立ちます。

ステップ4: 実行

ターミナルでスクリプトを実行します(仮想環境が有効であること、APIキーが設定されていることを確認してください)。

python simple_responder.py

ステップ5: 結果の確認

実行すると、エージェントが「夏の終わり」に関する詩(一句)を生成し、表示するはずです。応答内容は実行するたびに変わる可能性があります。また、処理の記録として AgentStart, LlmStart, LlmEnd, AgentEnd といったイベントが表示されます。

エージェントを準備中...

エージェントへの指示: '「夏の終わり」をテーマにした短い詩を一句作ってください。'

エージェントからの応答:
ひぐらしの声遠くなり 風涼し

--- 処理の記録 ---
AgentStart(agent_name="SimpleResponder", input={'input': '「夏の終わり」をテーマにした短い詩を一句作ってください。'})
LlmStart(...)
LlmEnd(...)
AgentEnd(agent_name="SimpleResponder", output={'output': 'ひぐらしの声遠くなり 風涼し'})
------------------

これで、ADKを使ってLLMに簡単なタスクを実行させる最初のステップが完了しました。

ADKの構成要素を理解する

より高度なエージェントを作るために、ADKの主要な構成要素をもう少し詳しく見てみましょう。

1. エージェント (Agent)

  • 役割: 指示を受け取り、考え、必要ならツールを使い、最終的な結果を出す、ADKアプリケーションの中心的な実行者です。
  • 主な種類:

    • LlmAgent: 大規模言語モデル(LLM)の推論能力を主に利用します。対話、文章生成、ツール使用の判断などを行います。
    • ワークフローエージェント (SequentialAgent, ParallelAgent, etc.): 複数のエージェントやツールを、決められた順序や条件で実行します。処理の流れを制御します。
    • カスタムエージェント: 独自のロジックを持つエージェントを作成することも可能です。

2. モデル (Model)

  • 役割: LlmAgent の「頭脳」にあたる部分で、通常はGeminiのようなLLMを指します。指示を理解し、応答を生成し、ツールを使うべきか判断します。
  • 選択: LlmAgent 作成時に、使用するモデル(例:gemini-1.5-pro)を指定できます。指定しない場合は、ADKが適切なデフォルトモデル(APIキーに基づき)を選びます。

3. ツール (Tool)

  • 役割: エージェントがLLMだけではできないこと(外部情報の取得、計算、特定APIの実行など)を行うための機能です。
  • 作成方法: Pythonの関数に説明(docstring)と型ヒントを付けることで、簡単にツールとして定義できます。ADKがLLMにそのツールの使い方を伝えます。
  • 動作: LLMは、与えられた指示を達成するために利用可能なツールを使うべきか判断します。使うと判断した場合、ADKがツール(Python関数)を実行し、その結果をLLMに戻して最終的な応答を生成させます。

4. セッション (Session)

  • 役割: エージェントとの一回の対話(invoke呼び出し)全体を管理する箱のようなものです。入力、最終出力、途中で発生したイベント(LLM呼び出し、ツール実行など)を保持します。デバッグや処理追跡に不可欠です。
  • 状態 (State): セッション内の一時的な情報を保持するための仕組みも提供されます。

5. メモリ (Memory)

  • 役割: 複数の対話(invoke呼び出し)にわたって情報を記憶するための仕組みです。これにより、エージェントは過去のやり取りを踏まえた応答(「前の質問で言った都市のことだね」など)が可能になります。
  • 使い方: Memory オブジェクトを作成し、それを Session に関連付けます。対話の履歴は Store と呼ばれる場所に保存されます(単純なメモリ内ストアや、永続化可能なストアなどがあります)。

これらの要素を組み合わせることで、様々な能力を持つエージェントを構築できます。

エージェントに「ツール」を使わせる

LLMだけでは現実世界の情報を取得したり、特定の計算を正確に行ったりするのは苦手です。そこで「ツール」の出番です。簡単な「天気予報ツール(シミュレーション)」をエージェントに追加してみましょう。

ステップ1: ツールとなるPython関数の作成

まず、ツールとして使いたい機能を持つPython関数を定義します。今回は、指定された都市の天気を返す(ふりをする)関数を作ります。

weather_agent.py というファイルを作成し、以下のコードを追加します。

# weather_agent.py (開始点)

import os
import asyncio
from adk.agents import LlmAgent
from adk.sessions import Session
from adk.tools import define_function_tool # ツール定義用ヘルパー

# --- 天気予報ツール関数 ---
def get_current_weather(city: str) -> str:
    """
    指定された都市の現在の天気を取得します(シミュレーション)。

    Args:
        city: 天気を知りたい都市名 (例: "東京", "大阪").

    Returns:
        その都市の天気情報を含む文字列。不明な都市の場合はその旨を返します。
    """
    print(f"--- ツール実行: get_current_weather(city='{city}') ---")
    city = city.lower() # 都市名を小文字に統一
    if "東京" in city:
        return "東京の現在の天気は晴れ、気温は28度です。"
    elif "大阪" in city:
        return "大阪の現在の天気は曇り、気温は26度です。"
    elif "札幌" in city:
        return "札幌の現在の天気は雨、気温は18度です。"
    else:
        return f"すみません、「{city}」の天気情報は現在取得できません。"

# --- エージェント設定と実行部分 (後で追加) ---
async def main():
    pass # ここにエージェント処理を書く

if __name__ == "__main__":
    asyncio.run(main())

get_current_weather 関数は、都市名を受け取り、事前に定義された天気情報を返します。docstringと型ヒント(city: str, -> str)が重要です。

ステップ2: 関数をADKツールとして定義

define_function_tool を使って、この関数をADKが認識できるツールに変換します。

weather_agent.pymain 関数を以下のように更新します。

# weather_agent.py (続き)

import os
import asyncio
from adk.agents import LlmAgent
from adk.sessions import Session
from adk.tools import define_function_tool
from adk.models import Model # 必要に応じてモデル指定用

# --- get_current_weather 関数 (上記で定義) ---
def get_current_weather(city: str) -> str:
    # ... (関数実装は上と同じ) ...
    print(f"--- ツール実行: get_current_weather(city='{city}') ---")
    city = city.lower()
    if "東京" in city: return "東京の現在の天気は晴れ、気温は28度です。"
    elif "大阪" in city: return "大阪の現在の天気は曇り、気温は26度です。"
    elif "札幌" in city: return "札幌の現在の天気は雨、気温は18度です。"
    else: return f"すみません、「{city}」の天気情報は現在取得できません。"

async def main():
    """天気予報ツールを持つエージェントを作成し、実行する"""

    print("天気予報ツールを定義中...")
    # Python関数をADKツールに変換
    weather_tool = define_function_tool(get_current_weather)
    print(f"定義されたツール: {weather_tool.name}") # 'get_current_weather'

    print("\nツールを持つエージェントを準備中...")
    # LlmAgent作成時に、toolsリストに作成したツールを渡す
    agent = LlmAgent(
        name="WeatherReporterAgent",
        tools=[weather_tool]
        # 必要であれば model=Model(...) でモデルを指定
    )

    session = Session()
    prompt = "現在の大阪の天気を教えてください。"
    print(f"\nエージェントへの指示: '{prompt}'")

    response_data = await agent.invoke(prompt, session=session)

    print("\nエージェントからの最終応答:")
    print(response_data.get('output', '応答がありませんでした。'))

    print("\n--- 処理の記録 ---")
    # イベントの中に ToolStart, ToolEnd が含まれることを確認
    for event in session.get_events():
        print(event)
    print("------------------")

if __name__ == "__main__":
    asyncio.run(main())

ステップ3: ツール統合のポイント

  • define_function_tool(get_current_weather): Python関数 get_current_weather をADKツールオブジェクトに変換します。関数の名前、docstring(説明)、引数(型ヒント含む)が自動的に解析され、LLMがツールを理解・利用するために使われます。
  • LlmAgent(..., tools=[weather_tool]): エージェントを作成する際に tools 引数にツールのリストを渡すことで、エージェントがそのツールを利用できるようになります。
  • プロンプト: 「大阪の天気を教えて」のように、ツール(get_current_weather)が必要になるような指示を与えます。

ステップ4: ツール付きエージェントの実行

ステップ5: 結果の確認(ツール使用)

実行結果を見ると、エージェントが get_current_weather ツールを呼び出し、その結果を使って応答を生成していることがわかります。

天気予報ツールを定義中...
定義されたツール: get_current_weather

ツールを持つエージェントを準備中...

エージェントへの指示: '現在の大阪の天気を教えてください。'
--- ツール実行: get_current_weather(city='大阪') ---

エージェントからの最終応答:
はい、大阪の現在の天気は曇りで、気温は26度です。

--- 処理の記録 ---
AgentStart(agent_name="WeatherReporterAgent", input={'input': '現在の大阪の天気を教えてください。'})
LlmStart(...)
ToolStart(tool_name="get_current_weather", tool_input={'city': '大阪'})
ToolEnd(tool_name="get_current_weather", tool_output="大阪の現在の天気は曇り、気温は26度です。")
LlmStart(...)
LlmEnd(...)
AgentEnd(agent_name="WeatherReporterAgent", output={'output': 'はい、大阪の現在の天気は曇りで、気温は26度です。'})
------------------

イベントログに ToolStartToolEnd が記録されており、エージェントがプロンプトに応じてツールを正しく呼び出したことが確認できます。LLMはツールの説明(docstring)を見て、天気に関する質問には get_current_weather ツールが適していると判断し、必要な引数(city='大阪')を抽出してツール実行を指示したわけです。

会話の流れを記憶させる(メモリ)

一問一答だけでなく、前の会話の内容を踏まえたやり取りができると、エージェントはより自然で賢く見えます。ADKの「メモリ」機能を使って、会話履歴を記憶させてみましょう。天気予報エージェントを拡張します。

ステップ1: メモリ関連クラスのインポート

ConversationMemory と、メモリの保存場所となる SimpleStore をインポートします。

weather_agent.py の先頭に以下を追加します(または memory_weather_agent.py を作成)。

# memory_weather_agent.py (または weather_agent.py を更新)
# ... 他のインポート ...
from adk.memory import ConversationMemory
from adk.store import SimpleStore # シンプルなインメモリ(RAM上)ストア

ステップ2: メモリの準備

会話履歴を保存するための SimpleStore と、それを管理する ConversationMemory を作成します。

main 関数を以下のように変更します。

# ... (get_current_weather 関数 と define_function_tool は同じ) ...

async def main():
    """会話メモリを持つ天気予報エージェントを実行する"""

    weather_tool = define_function_tool(get_current_weather)
    print(f"定義されたツール: {weather_tool.name}")

    # --- メモリ設定 ---
    print("\n会話メモリを準備中...")
    # 1. 履歴の保存場所(ストア)を作成
    memory_store = SimpleStore()
    # 2. ストアを使ってメモリ管理オブジェクトを作成
    conversation_memory = ConversationMemory(
        store=memory_store,
        session_id="weather_chat_01", # 会話ごとのID
        input_key="input", # ユーザー入力のキー名
        output_key="output" # エージェント応答のキー名
    )
    # --------------------

    print("\nツールとメモリを持つエージェントを準備中...")
    agent = LlmAgent(
        name="MemoryWeatherAgent",
        tools=[weather_tool]
    )

    # --- 連続した対話 ---
    # セッションを作成し、memory引数に準備したメモリ オブジェクトを渡す
    session = Session(memory=conversation_memory)

    prompts = [
        "今日の札幌の天気は?",
        "ありがとう。じゃあ、その都市の明日の天気はわかりますか?" # 「その都市」が札幌を指すことを期待
    ]

    for turn, prompt_text in enumerate(prompts):
        print(f"\n--- 対話ターン {turn + 1} ---")
        print(f"ユーザー: '{prompt_text}'")

        # 毎回同じセッション(メモリ付き)を使ってエージェントを呼び出す
        response_data = await agent.invoke(prompt_text, session=session)

        print("\nエージェント:")
        print(response_data.get('output', '応答がありませんでした。'))

    print("\n--- 最終ターン後のメモリ内容 ---")
    # メモリに保存された全履歴を確認
    history = await conversation_memory.load()
    print(history)
    print("-----------------------------")

if __name__ == "__main__":
    asyncio.run(main())

ステップ3: メモリ統合のポイント

  • SimpleStore() / ConversationMemory(...): 会話履歴をRAM上に保持する設定です。session_id は複数の会話を区別する場合に使います。input_keyoutput_key は、メモリがユーザー入力とエージェント応答を正しく識別・保存するために必要です。
  • session = Session(memory=conversation_memory): セッション作成時に memory 引数を指定するのが重要です。これにより、セッションが対話履歴を管理できるようになります。
  • ループ処理: 同じ session オブジェクトを使い回して agent.invoke を複数回呼び出します。ADKは内部で、LLMを呼び出す前に conversation_memory から過去の履歴を読み込み、プロンプトに含めます。応答後には、最新のやり取りをメモリに保存します。
  • 2番目のプロンプト: 「その都市」という代名詞が含まれています。メモリが機能していれば、LLMはこれが前のターンで言及された「札幌」を指すと理解できるはずです。(ただし、今回の get_current_weather ツールは明日の天気を返せないので、その旨の応答になるでしょう)。

ステップ4: メモリ付きエージェントの実行

python memory_weather_agent.py # または更新したファイル名

ステップ5: 結果の確認(会話コンテキスト)

  • ターン1: 札幌の天気予報(シミュレーション結果)が返されます。ツールが実行されます。
  • ターン2: ユーザーは「その都市」と言いますが、エージェントは(メモリのおかげで)それが札幌だと理解し、「札幌の明日の天気はわかりません」という趣旨の応答をするはずです。ここでも天気ツールが(おそらく)呼ばれますが、ツール自体が対応できないため、LLMがその結果をもとに応答を生成します。
  • 最終メモリ内容: 実行後、memory.load() で取得した履歴が表示され、2つのターンのやり取りが記録されていることが確認できます。
... (ターン1の出力) ...

--- 対話ターン 2 ---
ユーザー: 'ありがとう。じゃあ、その都市の明日の天気はわかりますか?'
--- ツール実行: get_current_weather(city='札幌') ---

エージェント:
申し訳ありませんが、現在の天気しかお伝えできません。get_current_weatherツールでは、札幌の明日の天気予報を取得することはできません。

--- 最終ターン後のメモリ内容 ---
{'history': "Human: 今日の札幌の天気は?\nAI: 札幌の現在の天気は雨、気温は18度です。\nHuman: ありがとう。じゃあ、その都市の明日の天気はわかりますか?\nAI: 申し訳ありませんが、現在の天気しかお伝えできません。get_current_weatherツールでは、札幌の明日の天気予報を取得することはできません。"}
-----------------------------

これで、エージェントが会話の流れを記憶し、文脈に応じた応答をするようになりました。

処理の流れを制御する(シーケンシャルエージェント)

エージェントに自由な判断をさせるだけでなく、特定のステップを順番に実行させたい場合があります。SequentialAgent は、複数のエージェントやツールを定義された順序で実行するためのワークフローエージェントです。

例として、「トピックを与えると、それに関する簡単な質問を生成し、その質問に自分で答える」という2段階のワークフローを作ってみましょう。

ステップ1: SequentialAgent のインポート

# sequential_qa_agent.py
# ... 他のインポート ...
from adk.agents import SequentialAgent

ステップ2: ワークフローの各ステップを定義

今回は2つの LlmAgent を使います。一つは質問生成用、もう一つは回答生成用です。

# sequential_qa_agent.py (完全な例)

import os
import asyncio
from adk.agents import LlmAgent, SequentialAgent
from adk.sessions import Session
from adk.models import Model

async def main():
    """質問生成と回答生成を順番に行う SequentialAgent を実行する"""

    print("ワークフローのステップを定義中...")

    # --- ステップ1: 質問生成エージェント ---
    question_generator = LlmAgent(
        name="QuestionGenerator",
        system_prompt=(
            "与えられたトピックに関する簡単な質問を一つだけ生成してください。"
            "出力は質問文のみとします。"
        )
        # このエージェントにツールは不要
    )

    # --- ステップ2: 回答生成エージェント ---
    answer_generator = LlmAgent(
        name="AnswerGenerator",
        system_prompt=(
            "与えられた質問に対して、簡潔に答えてください。"
            "出力は回答文のみとします。"
        )
        # このエージェントにもツールは不要
    )

    # --- Sequential Agent の定義 ---
    print("\nSequential Agent を作成中...")
    # children リストに、実行したいエージェントやツールを順番に入れる
    # ステップ1 (question_generator) の出力が、ステップ2 (answer_generator) の入力となる
    qa_workflow = SequentialAgent(
        name="SimpleQAWorkflow",
        children=[
            question_generator, # 最初に実行
            answer_generator    # 次に実行
        ]
    )

    # --- ワークフローの実行 ---
    session = Session()
    initial_topic = "日本の宇宙開発"
    print(f"\nワークフローを開始します。最初のトピック: '{initial_topic}'")

    # invoke に最初の入力を渡す
    response_data = await qa_workflow.invoke(initial_topic, session=session)

    print("\nワークフローの最終応答 (回答生成エージェントの出力):")
    print(response_data.get('output', '応答がありませんでした。'))

    print("\n--- ワークフロー全体の処理記録 ---")
    for event in session.get_events():
        print(event)
    print("---------------------------------")

if __name__ == "__main__":
    asyncio.run(main())

ステップ3: シーケンスのポイント

  • question_generator: 最初のLLMエージェント。トピック(例:「日本の宇宙開発」)を受け取り、それに関する質問(例:「日本の主なロケットは何ですか?」)を生成するように指示されています(system_prompt)。
  • answer_generator: 2番目のLLMエージェント。前のステップで生成された質問を受け取り、それに簡潔に答えるように指示されています。
  • SequentialAgent(children=[...]): ワークフローを定義します。children リスト内の要素が順番に実行されます。
  • データフロー: SequentialAgent は、前のステップ(question_generator)の出力(生成された質問文)を、自動的に次のステップ(answer_generator)の入力として渡します。
  • 最終出力: ワークフロー全体の最終的な出力は、リストの最後の要素(answer_generator)の出力になります。

ステップ4: シーケンスエージェントの実行

python sequential_qa_agent.py

ステップ5: 結果の確認(シーケンスフロー)

イベントログを見ると、SimpleQAWorkflow が開始され、まず QuestionGenerator が実行されて質問を生成し、次にその出力が AnswerGenerator に渡されて回答が生成され、それが最終的な出力となっている流れが確認できます。

ワークフローのステップを定義中...

Sequential Agent を作成中...

ワークフローを開始します。最初のトピック: '日本の宇宙開発'

ワークフローの最終応答 (回答生成エージェントの出力):
日本の主力ロケットにはH-IIAやH3ロケットがあります。

--- ワークフロー全体の処理記録 ---
AgentStart(agent_name="SimpleQAWorkflow", input={'input': '日本の宇宙開発'})
AgentStart(agent_name="QuestionGenerator", input={'input': '日本の宇宙開発'})
LlmStart(...)
LlmEnd(..., response="日本の主力ロケットにはどのようなものがありますか?")
AgentEnd(agent_name="QuestionGenerator", output={'output': '日本の主力ロケットにはどのようなものがありますか?'})
AgentStart(agent_name="AnswerGenerator", input={'input': '日本の主力ロケットにはどのようなものがありますか?'})
LlmStart(...)
LlmEnd(..., response="日本の主力ロケットにはH-IIAやH3ロケットがあります。")
AgentEnd(agent_name="AnswerGenerator", output={'output': '日本の主力ロケットにはH-IIAやH3ロケットがあります。'})
AgentEnd(agent_name="SimpleQAWorkflow", output={'output': '日本の主力ロケットにはH-IIAやH3ロケットがあります。'})
---------------------------------

このように SequentialAgent を使うことで、複数の処理ステップを順番に実行する、より制御されたワークフローを構築できます。

さらなる探求へ

これでADKの基本的な使い方を学びました。シンプルな応答生成から、ツール連携、会話記憶、そして簡単なワークフロー制御まで、AIエージェント開発の第一歩を踏み出せたはずです。

ADKには、さらに多くの可能性があります。

  • 並列処理 (ParallelAgent): 複数のタスクを同時に実行して効率化する。
  • ループ処理 (LoopAgent): 条件に応じて処理を繰り返す。
  • 多様なツール: 外部API連携(OpenAPIツール)、サードパーティライブラリ(LangChainなど)のツール活用。
  • エージェント連携: エージェントが他のエージェントをツールとして呼び出す、より複雑なシステムの構築。
  • 永続メモリ: 会話履歴をファイルやデータベースに保存する。
  • デプロイ: 作成したエージェントをクラウドで動かす。
  • 評価: エージェントの性能を測定・改善する。
  • 責任あるAI: 安全で信頼性の高いエージェントを設計するための考慮事項。

これらの詳細については、ぜひ公式ドキュメントやサンプルコードを参照してください。

おわりに

Google Agent Development Kit (ADK) は、アイデアをインテリジェントなAIエージェントとして形にするための強力なツールキットです。Geminiモデルとの連携を活かし、ツールやメモリ、ワークフロー制御を組み合わせることで、様々なタスクを実行できるエージェントを開発できます。

このガイドを通じて、ADKの基本を掴むことができたなら幸いです。AIエージェント開発の世界は広大で、常に進化しています。ぜひ、ここで学んだことを基礎として、さらに探求し、あなただけのエージェントを作り上げてください。






Source link

Views: 0

『モンハン』等身大「ラージャン」が大阪・関西万博に出現!4月26日・27日に万博内で開催する「カプコンストア」のPOPUPショップにて遭遇できる




4月26日・27日に万博内で開催する「カプコンストア」のPOPUPショップにて遭遇できる。ストアでは『モンハンワイルズ』やグッズなどを発売



Source link

Views: 0

同接190万人超!「LCK Cup」が2025年1~3月の同時視聴者数トップに―「VCT Masters Bangkok」も3位【LoL / VALORANT】 | Game*Spark



Esports Chartsは2025年第一四半期(1~3月)におけるeスポーツ大会の視聴データを公開。「LCK Cup 2025」が最も同時に視聴された大会であることが明らかになったほか、「VCT 2025 Masters Bangkok」も3位にランクインしました。

◆トップ10のうち、『LoL』『VALORANT』が4つランクイン

1月から3月において開催されたeスポーツ大会の中でも最も同時に視聴された大会となったのは、1月から2月にかけて韓国で行われた『リーグ・オブ・レジェンド』の大会、「LCK Cup 2025」。この大会ではPlayoffsのラウンド1での「T1」と「Hanwha Life Esports」の試合が最大同時接続者数190万7634人を記録し、2位の大会に5万人以上の差をつけ1位となりました。なおこのデータは中国プラットフォームを含まないため、実際には更に多くの視聴者数を集めていたとみられます。

そして3位には、2月から3月にかけてタイで行われた「VCT 2025 Masters Bangkok」がランクイン。本大会は今年初のVCT国際大会となり、決勝の「T1」と「G2 Esports」の対戦が約132万人で一番の注目を集めました。

その他、『リーグ・オブ・レジェンド』の新しい国際大会「First Stand 2025」が6位に、『リーグ・オブ・レジェンド』のEMEAリーグ「LEC Winter 2025」が8位にランクインしています。


LCK Springは今月より開幕し、「VCT 2025 Masters Toronto」も6月に控えていますが、第二四半期ではどの大会が注目を集めることになるのでしょうか。





Source link

Views: 0

38消費者スタートアップの創設者はトランプの関税をめぐるロビー:驚きに直面している$ 200kの請求書



38消費者スタートアップの創設者はトランプの関税をめぐるロビー:驚きに直面している$ 200kの請求書

によると、トランプ大統領の関税の増加の下で中小企業は押しつぶされる可能性があります オープンレター 38人の女性消費者製品の創設者。

トランプの間 彼の関税を一時停止した さまざまな国の90日間の増加 – 今のところ10%のレートを設定しました – 中国は 145%に引き上げられたこれには、以前の20%の徴収が含まれます。

木曜日に公開された手紙の中で、これらの創設者は、少なくとも中小企業が手頃な価格のサプライチェーンの代替品を見つけることができるまで、トランプと議会に関税の増加を後退させるよう促しました。それ以外は、彼らは中小企業の免除を望んでいます。

この手紙は、高級な箱入りワインを消費者に直接販売するスタートアップであるJuliet Wineの創設者であるAllison Luveraによって書かれました。 LuveraはTechCrunchに、海外から主要なパッケージングコンポーネントを購入しており、米国の代替品がないため、毎年驚くべき200,000ドルの請求書に直面していると伝えています。

この手紙は、米国の即時オプションがないために海外から補充可能なポーチを調達する必要があるホームクリーニングブランドなど、他のいくつかのそのような問題を文書化しています。関税は、そのビットのパッケージングのコストを80%増加させると脅しています。

38人のグループは、彼らの企業が年間8億ドルを生み出し、数千を雇用し、国内および国際的なメーカーの両方から供給供給を雇用していると言います。彼らは、関税が中小企業にもっと深く着陸することを指摘しています。

「大企業とは異なり、中小企業は、サプライチェーン契約を再交渉するためのレバレッジ、急なコストの増加を吸収するマージン、またはグローバルサプライチェーンを迅速に再構成するために必要な資本を欠いています」とルベラは書いています。

このグループは、他の中小企業の所有者、および経済的影響に関心のある他の人が、議会のロビー活動を支援することを望んでいます。彼らは中小企業の評価を求めているので、政府はその影響を知っています。理想的には、彼らは中小企業がそのような関税の増加を免除されることを望んでいます。それに失敗すると、彼らは、トランプの貿易政策によって引き起こされたサプライチェーンの痛みを私たちに支援するために、「助成金、税制上の優遇措置、または技術支援」を求めてロビー活動を行っています。

署名者の中には、女性の創設者集団のデザイナーレベッカミンコフとアリソンワイアットがいます。その他には、デューン・サンケアのエミリー・ドイルとメイ・クウォック、ラエルのヤンギー・パイクが含まれます。



Source link

Views: 0

「ジョジョの奇妙な冒険」の世界を体験できる「JOJO WORLD 3」レポート。ジョセフとシーザーの波紋修行など,“新手”のアトラクション&ミニゲームを楽しめる



 2025年4月4日から,東京・池袋のバンダイナムコCrossStore東京にて,アニメ「ジョジョの奇妙な冒険」シリーズの期間限定テーマパーク「JOJOWORLD3」が開催されている。本稿では同イベントで体験できるアトラクション&ミニゲームなど,会場の模様をお届けする。



Source link

Views: 0

富士通、セブン‐イレブンの店舗従業員向け教育プラットフォームを共同開発 – クラウド Watch


 富士通株式会社は11日、株式会社セブン‐イレブン・ジャパン(以下、セブン‐イレブン)と、同社の店舗従業員に向けた新たな教育プラットフォームを共同開発したと発表した。3月25日から一部の直営店舗での利用が開始されている。

 このプラットフォームは、富士通のオファリング「Fujitsu Digital Touchpoint」の教育プラットフォームを活用して構築されており、コンビニエンスストア業務を理解・遂行するための学習環境の提供や、習得スキルのリアルタイム把握を可能にするもの。これにより、店舗従業員の早期戦力化や定着率の向上、フランチャイズオーナー・店長の教育負荷軽減を実現するという。

 なお、このプラットフォームは、セブン-イレブンが店舗のデジタルトランスフォーメーション(DX)の加速に向けて開発・展開を進めている、次世代店舗システムの一環として提供され、店舗従業員は、今後店舗に複数台の設置が予定されているモバイル端末やタブレット端末からアクセスして、自身の業務習得状況をリアルタイムに確認できるようになる。

 店舗従業員は、それぞれの習得状況に応じた学習コースの受講を通じて、店舗運営の方法などを学べる一方、オーナー・店長も、店舗従業員の学習の進捗や習得状況をリアルタイムで確認できるため、より具体的なアドバイスなどが可能になり、学習意欲の向上を支援できるとした。

 また、使いやすいユーザーインターフェイスから、マニュアルなどの必要な情報を簡単に検索して閲覧でき、来店客への対応の迅速化をサポートするとしている。

 新たな教育プラットフォームは今後、セブン‐イレブンが展開する約2万2000店舗で勤務している、約40万人以上の店舗従業員に向けた活用を見込んでいるとのことだ。





Source link

Views: 0

レトロでスケルトンなCDプレーヤー「PIXEL TUNES」。Bluetooth対応 – AV Watch


PIXEL TUNES1983(クリアレッド)

シンシアは、雑貨ブランド・RELAXの新製品として、内部機構が透けて見えるレトロフューチャーなスケルトンボディのCDプレーヤー「PIXEL TUNES」を5月1日に発売する。価格は12,980円。懐かしい色合いの1983(クリアレッド)と、シックな色合いのウォームグレーの2色展開。

シックな色合いのウォームグレー

透明感のあるボディは、光の反射によって様々な表情を見せ、部屋のアクセントになるという。

壁掛けも可能なコンパクト設計で、スピーカーも内蔵。再生しているCDの音を、Bluetoothスピーカーやヘッドフォンなどにワイヤレスで飛ばす事もできる。「レトロなデザインが魅力のRELAXマルチレトロラジオをスピーカーとして接続すれば、まるでタイムスリップしたような気分」が味わえるという。

イヤフォンジャックやバッテリーも搭載する。最大60秒の音飛び防止機能(ESP)も搭載。

Rシンシア公式楽天市場店、ZOZOTOWN、Amazon、Yahoo!ショッピング、BIRTHDAY BAR公式サイト PAL CLOSET店などのオンラインショップにて、予約を受け付けている。





Source link

Views: 0

松屋の「マフェ」があまりにも美味しかったので自分でも作ってみた → しばらく松屋に通う羽目になった



みなさんはもう松屋の『マフェ』を食べただろうか。セネガルで親しまれている家庭料理を、松屋が「ごろチキ仕様」にアレンジした期間限定商品。 『マフェ』の特徴であるピーナッツの香りと、松屋らしくガッツリ効いたニンニクがクセにな […]



Source link

Views: 0