Perplexity APIを叩いて睡眠のアドバイスをしてもらいました

# はじめに
こんにちは！
2024年4月に新卒で入社した、**むら**です。
大学院ではウェアラブルデバイスから機械学習で睡眠に関する変数の予測モデルを研究で作っていました。研究室では様々なウェアラブルデバイスに触れていたことから、今でも寝るときには3つのデバイスをつけて寝ています:sheep:

突然ですが、皆さんはしっかりと睡眠が取れているでしょうか？成人の睡眠時間は7時間から9時間が推奨されています。また、ある研究によると6時間未満と9時間以上の睡眠を取る人は、6時間～8時間睡眠の人に比べて心血管疾患のリスクが高くなると報告されています。しかし、適切な睡眠時間には個人差があります（例えば、短時間睡眠で十分に休息が取れるショートスリーパーなど）。

そうなると、**自分が**よりよい睡眠を取るためにはどうしたらいいのかアドバイスが欲しくなりませんか？睡眠データを渡したらそれに応じたアドバイスを返してくれたらとても便利ではないでしょうか？

ということで、今回はウェアラブルデバイスのFitbitから得られた睡眠データを生成AIに渡して睡眠の改善点やアドバイスをもらうシステムを作ってみたいと思います！

# 準備

使用するFitbitとPerplexity（生成AI）、実行環境の準備が必要です。
Fitbitについては本記事のメインの内容ではないため大幅に割愛しています。

## Fitbit API

Fitbitからのデータを必要とするので、まずはFitbitデバイスを持っている必要があります。
今回は、Fitbit Inspire HRを使っています。

また、APIも叩きたいのでApplication登録が必要です。FitbitのDeveloperサイトから登録を行い、トークンなどを発行します。詳しい方法は、こちらの[サイト](https://sakanaaas.hateblo.jp/entry/2017/03/19/215758)を参考に進めてください。

## Perplexity API

APIを叩くために必要なAPIキーを取得する必要があります。[ドキュメント](https://docs.perplexity.ai/docs/getting-started)があるのでそれを見ながらキーを発行します。
ちなみに、Perplexity Pro（月額\\$20）を契約していると毎月\\$5のAPIクレジットを付与してくれます。この特典もあって、個人的にオトクなサービスだと思っています。

### なぜPerplexityを使ったのか

今回はPerplexity APIを使ってみようと思います。
一番の理由は、ChatGPTやGeminiをAPIから叩いている記事などはよく見るのですが、Perplexityを使っているものをあまり見つけられなかったからです。
Perplexityは、リアルタイムな検索に特化した生成AIとして知られています。例えば、今日の日付や天気を聞けば現実の時間情報や天気などを返してくれます。また、プロンプトを分解して何をどのようなソースから情報を得たのかわかりやすく出力してくれます。あと、Claude OpusやChatGPT4も使えるスグレモノです。
ChatGPTとの比較などは今回はしていないので、どの生成AIが最も優れているのかはわかりませんが今回はPerplexityを使ってみようと思います。

![Perplexityに天気情報を聞いている場面のスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145207/4f853052-2f8a-dbe9-7094-d5a44687f887.png)

## Google Colaboratory

Pythonをサクッと動かすために今回はGoogle Colaboratory環境を用意しました。
無料ですぐに使えるのでちょっとしたテストによく使っています。

[Colaboratory](https://colab.research.google.com/)のサイトに接続して、「ノートブックを新規作成」を押せばすぐに環境が用意されます。

この段階で必要なライブラリのインストールも済ませておきます。
今回は、OpenAI（Perplexity APIを叩くために必要）とFitbitのライブラリを使用しますが、これらはColaboratory環境下にないので自分で`pip`する必要があります。

```sh
!pip install OpenAI
!pip install fitbit
```

[Python Fitbit](https://python-fitbit.readthedocs.io/en/latest/)

# 実際にAPIを叩いてみる

準備ができたら実際に叩いてみましょう。

## Fitbitから睡眠データを取得する

まずは、Fitbitから睡眠データを取得してみます。APIの認証情報を用意している部分は省略しました。
[Get Sleep Log by Date Range (Fitbit API)](https://dev.fitbit.com/build/reference/web-api/sleep/get-sleep-log-by-date-range/)

```py
import datetime
import time

sleep_list = []
today = datetime.date(2024, 7, 15)
for i in range(1, 8):
  target = today - datetime.timedelta(days=i)
  sleep = fitbit_client.get_sleep(target)
  if sleep["sleep"] != []: # Fitbit未装着で睡眠データがない場合は除外する
    daily_sleep = {
      "date": sleep["sleep"][0]["dateOfSleep"],
      "deep": sleep["summary"]["stages"]["deep"],
      "light": sleep["summary"]["stages"]["light"],
      "rem": sleep["summary"]["stages"]["rem"],
      "wake": sleep["summary"]["stages"]["wake"],
      "totalMinutesAsleep": sleep["summary"]["totalMinutesAsleep"],
      "totalTimeInBed": sleep["summary"]["totalTimeInBed"]
    }
    sleep_list.append(daily_sleep)
    time.sleep(3) # APIの連続実行を防ぐ
```

今回は、浅い・深い・REM睡眠の時間と覚醒時間、睡眠時間、総睡眠時間（覚醒＋睡眠）をAPIから取得してきました。
これを実行すると、以下のような出力を得ることができます。

```py
[
  {
    'date': '2024-07-14',
    'deep': 43, 
    'light': 310,
    'rem': 80,
    'wake': 75,
    'totalMinutesAsleep': 477,
    'totalTimeInBed': 508
  },
]
```

## Perplexity APIにデータを渡す

では、早速得られた睡眠データをそのままPerplexityに渡してみます。

```py
content = "以下のウェアラブルデバイスから得られた睡眠データをもとに、翌日の睡眠を改善するアドバイスをお願いします。\nアドバイスは最大5つまでで、シンプルに箇条書きでお願いします。具体的な行動を示してもらえると助かります。\n```\n" + str(sleep_list) + "\n```"

messages = [
    {
        "role": "system",
        "content": (
            "あなたは、睡眠に特化したアドバイスをする専門家です。"
        ),
    },
    {
        "role": "user",
        "content": (
            content
        ),
    },
]
```

プロンプトとして、翌日の睡眠を改善する5つの具体的な行動アドバイスを求めるものにしました。システムのロールとしては睡眠アドバイザー的なものを振る舞うように設定しました。

これをAPIに渡します。

```py
response = openai_client.chat.completions.create(
    model="llama-3-sonar-large-32k-online",
    messages=messages,
)
print(response.choices[0].message.content)
```

以下が実際のレスポンスです。

```text
以下は、提供されたウェアラブルデバイスのデータに基づいて、翌日の睡眠を改善するための5つのアドバイスです。

1. **就寝時間を早める**:
   - 過去のデータから、就寝時間が遅い場合、深い睡眠時間が減少していることがわかります。早めに就寝することで、深い睡眠時間を増やすことができます。

2. **寝室の環境を整える**:
   - 寝室の環境が睡眠に影響を与えます。暗く、静かで、涼しい環境を作り、電子機器を避けることで、より良い睡眠を実現できます。

3. **ストレス管理**:
   - ストレスが睡眠に悪影響を与えることがわかっています。ストレス管理のための呼吸法やリラックステクニックを実践し、就寝前に心を落ち着かせることが重要です。

4. **運動のバランス**:
   - 運動は睡眠に影響を与える要因の1つです。適切な運動のバランスを取ることで、睡眠の質を向上させることができます。

5. **睡眠の質を監視**:
   - ウェアラブルデバイスを使用して、睡眠の質を継続的に監視し、改善のためのアドバイスを受けることで、より良い睡眠を実現できます。
```

早めに就寝することや、寝室環境、運動などのアドバイスをしてくれました。特に、「就寝時間を早める」の中では軽く分析もしてくれているようです。

# さいごに

過去の睡眠データを渡すことで、ある程度分析をしたうえでアドバイスを返してくれることがわかりました。ただ、かなり一般的なアドバイスであまりパーソナライズされたものではありませんでした。
プロンプトの書き方にもよるのかもしれません。また、今回は睡眠データのみを渡しましたが歩数などの身体活動、寝室の温湿度など多様なデータを渡すことでよりデータに基づいたアドバイスをしてくれるのかもしれません。
また、今回のコードを毎日自動実行させてメールなどにアドバイスを送るように実装しておけば、継続的な睡眠改善に役立てられると思います。

Perplexityはブラウザから実行すると、情報のソースを合わせて教えてくれますがAPIではまだそれが一般公開されておらずレスポンスには含まれていません。そのため、返ってきたアドバイスの根拠が乏しいことも少し気になります。
まだまだ改善点はありますが、健康的な生活に生成AIも活用できそうだとわかりました。また時間のあるときにこれらの改善を施して実際に睡眠が改善されたのか比較もしてみたいと思います:sheep: