💻

Google CloudとGeminiで作るパーソナルコンシュルジュ

2024/10/04に公開

はじめに

みなさん睡眠は管理できていますか?
もちろんAppleWatchやAndroid、睡眠管理用時計など様々なガジェットがありますが、正直どれも自分の用途には合いませんでした。そんな日常の課題感の中で毎年一つアプリケーションなりを作る活動でこの課題をなんとかしてみようということで簡単なアプリケーションを作ってみました。

携帯型の睡眠計測が合わないのはなぜか

・時計は付けて寝るのは無理
・携帯はベッド付近においているとそもそも睡眠の邪魔、途中でバッテリー切れなど

パーソナル用途でヘルスケアはWithingsということで、探してみるとありました。
https://www.withings.com/jp/ja/sleep
昔はNokiaの製品だったようです

WithingsはAPIがしっかり整備されているので遊ぶのにもってこいです

デバイスの見た目はキャンプの際に使う薄いインフレータブルマットのようで付属のUSB電源アダプター経由での電源を入れて初期設定が始まるといきなり膨らみます
あとはこれをベッドの下に置いておくだけ(置きっぱなし)

デバイス仕様

項目 内容
外部素材 プレミアムファブリック
寸法と重量 長さ:637mm(25")
幅:190mm
厚さ:5mm(0.2インチ)
重量:350グラム(1.13オンス)
センサー 空気圧センサー:呼吸数、バリストカーディオグラフィーによる心拍数、マットレス上の身体の動きを測定します。
サウンドセンサー:いびきや呼吸の障害に特有の音声信号を識別します。
データストレージと同期 Withings アカウントを使用して、無料で無制限のオンラインデータストレージを提供します。
同期の間にデータをローカルに保存します。
電源 電源 5V 1A
USB電源アダプターが含まれています

通常WithingsのデバイスはiOSもしくはAndroidのアプリ経由で管理し利用します。
とても便利です。基本的にはそこで完結するのですが
こちらのサイトでAPIが公開されています。
https://developer.withings.com/

かなりリッチなAPIリファレンスがあるため安心ですね。なんとなく作れそうな気がしてきます。

全体構想


サーバー側はFastAPIを利用したコンテナアプリケーションでもちろんGoogle Cloud上で動かします
クライアント側はGeminiのやり取りをするので簡単にLINE Bot APIを採用

アーキテクチャ概要図


開発環境はCloud Workstationsといいたいところなのですが、ここでは使い慣れたVM環境からdockerコンテナ作成しArtifact Registry経由でCloud Runをデプロイします。CI/CD化はまた別途記事予定。

oAuth2について

WithingsAPIではSleepやBodyAnalyzeなどのヘルスケアデータを扱うこともあり、oAuth2認証が必要となります。oAuth2実装を参考に実装してみました。

oAuthといえばこの記事です。
https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be


WithingsでのoAuthについてフロー図

実装の参考は、下記ページを参考にさせていただきました
https://zenn.dev/kou_kawa/articles/10-oauth20-fastapi
https://qiita.com/hoto17296/items/2d2cb76d323099e9f8ab
https://qiita.com/showchan33/items/bed1483a72c258cd5675

LINEBot APIについて


LINEについては以前参加したこちらのハンズオンを参考にアカウント作成等進めます
https://www.unerry.co.jp/blog/line-bot-google-cloud-handson-vol-1/

FastAPIについて


Pythonのかなり軽快なWebフレームワークです。

FastAPIの特徴は

  • Swagger UIが自動生成される
  • 方安全
  • 高速

参考にした入門書はこちら
https://zenn.dev/sh0nk/books/537bb028709ab9

Cloud Runについて

みんな大好きCloud Run
https://cloud.google.com/run/docs/overview/what-is-cloud-run

Withing SleepへアクセスするコンテナアプリケーションをDockerにてコンテナ化
してArtifact Registryに登録
https://cloud.google.com/artifact-registry/docs

$docker tag line-bot-app-01:latest us-central1-docker.pkg.dev/xxxx/repo/line-bot-app-01:latest

$docker push us-central1-docker.pkg.dev/xxxx/repo/line-bot-app-01:latest

コンテナイメージをArtifact Registoryにpushして

$ gcloud run deploy line-bot-app-01 \
  --image us-central1-docker.pkg.dev/xxxx/repo/line-bot-app-01:latest \
  --set-env-vars "CHANNEL_ACCESS_TOKEN=$CHANNEL_ACCESS_TOKEN"  \
  --set-env-vars "CHANNEL_SECRET=$CHANNEL_SECRET"  \
  --platform managed   \
  --region asia-northeast1 \
  --allow-unauthenticated  \
  --max-instances=1

gcloudコマンドでcloud runにデプロイ

概要を押さえるならこちらもオススメです
https://blog.g-gen.co.jp/entry/cloud-run-explained

Google生成AI Geminiについて

ここではVertex AI SDKを使ってPython上でGeminiを利用します

pipでVertex AI SDKをインストール

pip install --upgrade google-cloud-aiplatform

ライブラリのインポート、Vertex AIの初期化

import vertexai

PROJECT_ID = "[project-id]"  # @param {type:"string"}
REGION = "region"  # @param {type:"string"}

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

from vertexai.generative_models import (
    GenerationConfig,
    GenerativeModel,
)

生成AIモデルGemini 1.5 Proを読み込みます。

model = GenerativeModel("gemini-1.5-pro-001")

モデルの構成パラメータの設定、呼び出し

generation_config = GenerationConfig(
    temperature=1.0,
    top_k=20,
    top_p=0.9,
    candidate_count=1,
    max_output_tokens=8192,
)

response = model.generate_content(
    "睡眠のアドバイスを提示ください",
    generation_config=generation_config,
)

print(response.text)

プロンプトの指示と出力フォーマット

prompt = """与えられた睡眠情報から親身になってアドバイスしてください

JSON:
"""

response = model.generate_content(prompt)
print(response.text)

プロンプトギャラリー
https://console.cloud.google.com/vertex-ai/studio/prompt-gallery

LINEアプリ

初期作成段階では睡眠関連のキーワードを入力すると、WithingAPIにてSleepの睡眠情報を取得し、結果をGeminiに整形させるものでした。

Geminiに渡すプロンプト次第ですが結果から睡眠に関するアドバイスももらえるようにしています。
ハルシネーションを発生させてないよう、数字計算させないように工夫する必要があります。
このあたりはLangChainなどでエージェント機能でツールを使うなど工夫が必要そうです。

Vertex AI Agent Builderへ

Google Cloud Next '24 in Las Vegasの初日キーノートで発表された、Vertex AI Agent Builderがまさしく欲しかったサービスです。

https://blog.g-gen.co.jp/entry/trial-for-vertex-ai-agent-builder

こちらを使って更に便利にしていく予定です。こちらは続編をご期待ください。

まとめ

Google CloudとGeminiを使って簡単なアプリケーションを作ってみました。
また、LINE Bot API,FastAPI,oAuth2を実装で触ってみることができました。
LINE Bot APIはとても簡単にLINEのBotを作ることができるため、生活動線の中に様々なアプリケーションを組み込むことができるため便利ですね。
FastAPIはとても軽快でSwagger UIがありAPIのテストも簡単、構造も理解しやすいフレームワークだと思いました。
LINEからお手軽にGeminiと会話できるのは思った以上に便利です。
無理なく睡眠を測定できる目標は達成できました。
眠りが安定していると体の調子もよいので、Cloud Runという低コストなサービスを使って生活のお供にしていきたいと思います。

Discussion