💨

AI Agent Okinawaハッカソンイベントに参加してgeminicliを使ってみた

に公開

1. はじめに

こんにちは。(心の内では)健康を目指して日々精進しているshimojです。

最近は業務でもChatGPTやGitHub Copilotなど、AIの活用が広がっています。
ただ、自分発で何かを作る機会が少なく「一歩目を踏み出したい」と思っていたところ、ちょうど良いイベントがありました。

https://ai-agent-okinawa.connpass.com/event/362505/

今回はその参加レポートです。
ちなみにイベント当日は甲子園決勝の日でした。
沖縄尚学が夏の甲子園初優勝にむけて当日の午前は車や人が街から消えたとXにて話に出ててとても沖縄らしさを感じる日でした。

https://news.yahoo.co.jp/articles/98dbd71032b5e8b9b666770c7e2e2548d6325bd7

2. やったこと

ハッカソンの時間は限られてますので、まずは「とにかく動くもの」を目標にしました。
そこで、Dockerコンテナ上で gemini CLI を使い簡単なエージェントを作ることに挑戦しました。
実施内容は以下3点です。

  • 2.1 やりたいことを考える
  • 2.2 セットアップする
  • 2.3 エージェントを作ってみる

2.1. やりたいことを考える

最初に決めたテーマは 「やりたいことを教えてくれるエージェント」 にしました。
そもそも、AI活用にあたりに「何をやるのか?」を考えるのが大事で、テーマを悩みそうになったのでそれ自体をテーマとしました笑。

2.2. セットアップ

方針が決まったら環境構築です。
無料でサクッと動かしたかったのでgemini CLIを選び、ローカル環境への影響を避けるためにDocker上で実行します。

  1. Dockerコンテナを立ち上げる
  2. gemini CLI をセットアップ
  3. 簡単に対話して動作確認

手順はこちらの記事を参考にします。
https://zenn.dev/yulog/scraps/80b200ff6fec08

無事、応答が返ってくるところまで確認できました。

2.3. エージェント作成

次にgemini CLIに相談をなげてみます。

相談内容
╭──────────────────────────────────────────────────────────────────────────────╮
│  > やりたいことを教えてくれる教えてくれるエージェントを作ろうと考えてます。  │
╰──────────────────────────────────────────────────────────────────────────────╯

✦ 「やりたいことを見つけてくれるエージェント」、面白いアイデアですね!素晴らしいと思います。

  そのエージェントは、どのようにして「やりたいこと」を提案するのでしょう?
  例えば、ユーザーにいくつか質問をして、その答えから興味や関心を分析するのでしょうか?
  それとも、ユーザーの普段の行動から学習するのでしょうか?

  どのような形(Webアプリ、スマホアプリ、CLIツールなど)で実現したいか、具体的なイメージはありますか?

  ぜひ、そのアイデアの実現をお手伝いさせてください。

  手始めに、この新しいエージェントのためのプロジェクトディレクトリを作成し、基本的な設計を考えるところから始めては
  いかがでしょうか。

╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│  > 対話形式で考えるようなイメージです。今回docekrコンテナないにたててますがアプリみたいにコード作ってもらっても │
│    いいですか?                                                                                                 │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

✦ 承知いたしました。対話形式のアプリケーション、素晴らしいですね。早速コードを作成しましょう。

  まずは、シンプルで分かりやすいPythonを使ったコマンドラインアプリケーションとして作成するのはいかがでしょうか。

  このアプリは、以下のような対話を行います。

   1. アプリがユーザーに気分やエネルギーレベルについて簡単な質問をします。(例:「今の気分は?」「体を動かしたい
      気分?」)
   2. ユーザーの回答に基づいて、おすすめのアクティビティを一つ提案します。(例:「それなら、近所を散歩して新しい
      カフェを探すのはどうでしょう?」)

  このような形で進めてもよろしいでしょうか?

pythonを使ったコマンドラインアプリケーションの提案がきました。
どんな内容か気になるので作ってもらいます。

提案コードの生成

╭──────────────────────────────╮
│  > いいですね。お願いします  │
╰──────────────────────────────╯

✦ かしこまりました。では、開発を始めます。

  まず、プロジェクト用のディレクトリを作成します。
 ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔ Shell cd test && mkdir suggestion_agent (Create a directory for the suggestion agent project.)              │
 │                                                                                                                │
 │    Command: cd test && mkdir suggestion_agent                                                                  │
 │    Directory: (root)                                                                                           │
 │    Stdout: (empty)                                                                                             │
 │    Stderr: (empty)                                                                                             │
 │    Error: (none)                                                                                               │
 │    Exit Code: 0                                                                                                │
 │    Signal: (none)                                                                                              │
 │    Background PIDs: (none)                                                                                     │
 │    Process Group PGID: 152                                                                                     │
 ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ 次に、このディレクトリ内にエージェントのロジックを記述するPythonファイルを作成します。
 ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔ WriteFile Writing to test/suggestion_agent/agent.py                                                         │
 │                                                                                                                │
 │     1 import time                                                                                              │
 │     2                                                                                                          │
 │     3 def get_suggestion(answers):                                                                             │
 │     4     """                                                                                                  │
 │     5     ユーザーの回答に基づいて提案を生成します。                                                           │
 │     6     """                                                                                                  │
 │     7     mood = answers.get("mood")                                                                           │
 │     8     energy = answers.get("energy")                                                                       │
 │     9     is_outside = answers.get("outside")                                                                  │
 │    10                                                                                                          │
 │    11     if mood == "happy" and energy == "high" and is_outside == "yes":                                     │
 │    12         return "素晴らしい!天気が良ければ、公園でピクニックやフリスビーはいかがですか?"                │
 │    13     elif mood == "happy" and energy == "high" and is_outside == "no":                                    │
 │    14         return                                                                                           │
 │       "最高の気分ですね!家でダンスパーティーや、新しいレシピに挑戦するのはどうでしょう?"                     │
 │    15     elif mood == "happy" and energy == "low":                                                            │
 │    16         return                                                                                           │
 │       "穏やかで良い気分ですね。お気に入りの音楽を聴きながら、読書や映画鑑賞がおすすめです。"                   │
 │    17     elif mood == "tired" and energy == "low":                                                            │
 │    18         return                                                                                           │
 │       "お疲れ様です。ゆっくりお風呂に浸かったり、アロマを焚いたりしてリラックスするのはいかがですか            │
 │       ?"                                                                                                      │
 │    19     elif mood == "tired" and is_outside == "yes":                                                        │
 │    20         return                                                                                           │
 │       "少し気分転換が必要かもしれませんね。静かなカフェで温かい飲み物を飲むのはどうでしょう?"                 │
 │    21     elif mood == "bored":                                                                                │
 │    22         return                                                                                           │
 │       "何か新しいことを始めるチャンスです!オンラインで新しいスキルを学んだり、行ったことのない場所            │
 │       へ散歩に行ったりするのはいかがですか?"                                                                  │
 │    23     else:                                                                                                │
 │    24         return "今のあなたには、近所を少し散歩して、新鮮な空気を吸うのが良いかもしれません。"            │
 │    25                                                                                                          │
 │    26 def main():                                                                                              │
 │    27     """                                                                                                  │
 │    28     メインの対話ループ                                                                                   │
 │    29     """                                                                                                  │
 │    30     answers = {}                                                                                         │
 │    31     print(                                                                                               │
 │       "こんにちは!私はあなたの「やりたいこと」を見つけるお手伝いをするエージェントです。")                    │
 │    32     time.sleep(1)                                                                                        │
 │    33                                                                                                          │
 │    34     # --- 質問1: 気分 ---                                                                                │35     while True:                                                                                          │
 │    36         answer = input("今の気分はどんな感じですか? (happy / tired / bored): ").lower()                 │
 │    37         if answer in ["happy", "tired", "bored"]:                                                        │
 │    38             answers["mood"] = answer                                                                     │
 │    39             break                                                                                        │
 │    40         else:                                                                                            │
 │    41             print("ごめんなさい、よく分かりません。happy, tired,                                         │
 │       boredの中から選んでください。")                                                                          │
 │    42                                                                                                          │
 │    43     # --- 質問2: エネルギー ---                                                                          │44     while True:                                                                                          │
 │    45         answer = input("エネルギーレベルは? (high / low): ").lower()                                    │
 │    46         if answer in ["high", "low"]:                                                                    │
 │    47             answers["energy"] = answer                                                                   │
 │    48             break                                                                                        │
 │    49         else:                                                                                            │
 │    50             print("ごめんなさい、よく分かりません。high, lowの中から選んでください。")                   │
 │    51                                                                                                          │
 │    52     # --- 質問3: 外出 ---                                                                                │53     while True:                                                                                          │
 │    54         answer = input("外に出たい気分ですか? (yes / no): ").lower()                                    │
 │    55         if answer in ["yes", "no"]:                                                                      │
 │    56             answers["outside"] = answer                                                                  │
 │    57             break                                                                                        │
 │    58         else:                                                                                            │
 │    59             print("ごめんなさい、よく分かりません。yes, noの中から選んでください。")                     │
 │    60                                                                                                          │
 │    61     print("\n考えています...")                                                                           │
 │    62     time.sleep(2)                                                                                        │
 │    63                                                                                                          │
 │    64     suggestion = get_suggestion(answers)                                                                 │
 │    65     print("\n--- ご提案 ---")                                                                            │
 │    66     print(suggestion)                                                                                    │
 │    67     print("----------------")                                                                            │
 │    68                                                                                                          │
 │    69 if __name__ == "__main__":                                                                               │
 │    70     main()                                                                                               │
 ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ 基本的なコードが完成しました。

  このままではまだ実行できないので、作成したファイルに実行権限を付与します。
 ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔ Shell chmod +x /work/test/suggestion_agent/agent.py (Make the agent script executable.)                     │
 │                                                                                                                │
 │    Command: chmod +x /work/test/suggestion_agent/agent.py                                                      │
 │    Directory: (root)                                                                                           │
 │    Stdout: (empty)                                                                                             │
 │    Stderr: (empty)                                                                                             │
 │    Error: (none)                                                                                               │
 │    Exit Code: 0                                                                                                │
 │    Signal: (none)                                                                                              │
 │    Background PIDs: (none)                                                                                     │
 │    Process Group PGID: 155                                                                                     │
 ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ 準備が整いました。

  以下のコマンドで、作成したエージェントと対話を開始できます。

   1 /work/test/suggestion_agent/agent.py

  どうぞ、試してみてください。

提案コードは条件分岐を駆使しており、プログラミングの学習を始めた時の懐かしい気持ちになりました。
ただ、ファイル作成まで完了するのは便利だと感じました。(ファイル削除や書き換えなどができるのは問題でもありますが。。)

とりあえず、AIの生成コードを利用しているので、AIが考えた!程にして動かしてみます。
(「考えています」の部分でtime.sleep(2)をして考えているを演出しているのは賢いと思います)

$ python3 agent.py
こんにちは!私はあなたの「やりたいこと」を見つけるお手伝いをするエージェントです。
今の気分はどんな感じですか? (happy / tired / bored): happy
エネルギーレベルは? (high / low): low
外に出たい気分ですか? (yes / no): no

考えています...

--- ご提案 ---
穏やかで良い気分ですね。お気に入りの音楽を聴きながら、読書や映画鑑賞がおすすめです。
----------------

3. 感想

今回のイベントは、AI Agentを始める「最初の一歩」としてとても良い機会でした。
本来であればプロンプトを元にAIから返答を生成する形式にしたかったのですが、「AIにコードを書かせて動かす」だけでも十分に面白かったです。
会場では、gemini cliをColab上で動かしている人や、MCPサーバを立てている人もいて、ハッカソンらしいな〜と感じました。

また、沖尚が決勝進出を決めた際に、ハッカソン&パブリックビューイング と皆んなで応援しようぜ!とイベントを変更してるのが沖縄らしくてとても良いなと感じました笑。

GitHubで編集を提案

Discussion