FunctionCallを試してみた

---
## OpenAI Playgroundでファンクション機能を試す
OpenAI Playgroundのファンクション機能を活用し、体調管理AIがユーザーの質問に対して正確な情報を提供できるか検証しました。特に、**平均値や個々のデータ取得においてファンクションが適切に機能するか**、また**ファンクションが想定していない情報についてはファンクションを使わずに回答されるか**、という点に焦点を当てて検証を進めました。

### 検証準備：AI設定とファンクション定義

今回の検証にあたり、まず以下のプロンプトをAIにセットしました。

```
あなたは、日常の体調管理AIとして、ユーザーからの情報を収集し、適切に回答を提供します。

体温や食事の詳細情報はファンクションコールを使用して取得し、それ以外のデータに関してはファイルサーチで情報を集めます。ファイルサーチによってデータを抜き出せなかった場合には、「未測定の値です」と回答します。

# Steps

- 体温データを取得するには、対応するファンクションコールを実行します。 
- 食事に関する情報はファンクションコールを経由して収集します。
- 体温や食事の情報以外に関しては、ファイルサーチを実施し、必要な情報を探索します。
- ファイルサーチでデータが見つからなかった場合、「未測定の値です」と応答します。

# Output Format

- 回答時にはシンプルな文章で伝えてください。ファイルサーチで情報を得られなかった場合は、「未測定の値です」と具体的に記載すること。

# Notes

- 必要な情報に基づくファンクションコールとファイルサーチを適切に選択して、データ取得を行います。
- ファイルサーチが成功した場合、詳細情報を含めた回答を作成してください。
```

そして、AIが利用できるファンクションとして、以下の4つを定義しました。

```json
{
  "name": "get_average_temperature",
  "description": "体温の平均値を取得する",
  "strict": true,
  "parameters": {
    "type": "object",
    "required": [
      "temperatures"
    ],
    "properties": {
      "temperatures": {
        "type": "array",
        "description": "体温のリスト",
        "items": {
          "type": "number",
          "description": "個々の体温値"
        }
      }
    },
    "additionalProperties": false
  }
}
{
  "name": "get_temperature_data",
  "description": "○日間の体温データを取得する",
  "strict": true,
  "parameters": {
    "type": "object",
    "required": [
      "days",
      "unit"
    ],
    "properties": {
      "days": {
        "type": "number",
        "description": "取得する日数。"
      },
      "unit": {
        "type": "string",
        "description": "温度の単位（例：セルシウス、ファーレンハイト）",
        "enum": [
          "Celsius",
          "Fahrenheit"
        ]
      }
    },
    "additionalProperties": false
  }
}
{
  "name": "get_recent_meals",
  "description": "最新の３日間の食事の一覧を取得する",
  "strict": true,
  "parameters": {
    "type": "object",
    "required": [
      "user_id",
      "date_range"
    ],
    "properties": {
      "user_id": {
        "type": "string",
        "description": "ユーザーのID"
      },
      "date_range": {
        "type": "object",
        "properties": {
          "start_date": {
            "type": "string",
            "description": "食事取得の開始日 (フォーマット:YYYY-MM-DD)"
          },
          "end_date": {
            "type": "string",
            "description": "食事取得の終了日 (フォーマット:YYYY-MM-DD)"
          }
        },
        "additionalProperties": false,
        "required": [
          "start_date",
          "end_date"
        ]
      }
    },
    "additionalProperties": false
  }
}
{
  "name": "get_breakfast_info",
  "description": "○日前の朝ごはんの情報を取得する",
  "strict": true,
  "parameters": {
    "type": "object",
    "required": [
      "days_ago"
    ],
    "properties": {
      "days_ago": {
        "type": "number",
        "description": "取得したい日の数（過去）"
      }
    },
    "additionalProperties": false
  }
}
```

### 検証内容と初期の結果

上記のプロンプトとファンクションをセットした体調管理AIに対し、以下の質問を行い、それに対するAIの回答（ファンクションコールまたは未測定の回答）を検証しました。

1.  **昨日の体温の平均を教えて**
    * 回答: `get_temperature_data({"days":1,"unit":"Celsius"})`
2.  **一週間の体温データを教えて**
    * 回答: `get_temperature_data({"days":7,"unit":"Celsius"})`
3.  **３日前までの食事を教えて**
    * 回答: `get_recent_meals({"user_id":"user123","date_range":{"start_date":"2023-10-24","end_date":"2023-10-26"}})`
4.  **９日前の朝ごはんは何だった？**
    * 回答: `get_breakfast_info({"days_ago":9})`
5.  **昨日の身長を教えて**
    * 回答: 未測定の値です。
6.  **３日間の呼吸回数の平均値を教えて**
    * 回答: 未測定の値です。

上記の質問のうち、**1番の「昨日の体温の平均を教えて」のみが誤ったファンクションコール**をしました。これは、体温の平均値を取得する`get_average_temperature`ファンクションの定義に、「いつの体温の平均を取得するのか」という**期間の指定がなかったため**と推測されました。

### ファンクションの改善と再検証

この課題を解決するため、**「いつの体温の平均を取得するのか」を明確に指定できる新しいファンクション`average_temperature`を追加**しました。

追加した`average_temperature`ファンクションの定義は以下の通りです。

```json
{
  "name": "average_temperature",
  "description": "日、○日前の体温の平均を回答する",
  "strict": true,
  "parameters": {
    "type": "object",
    "required": [
      "days_ago",
      "temperature_unit"
    ],
    "properties": {
      "days_ago": {
        "type": "number",
        "description": "何日前の体温データを使用するか"
      },
      "temperature_unit": {
        "type": "string",
        "description": "体温の単位（摂氏または華氏）",
        "enum": [
          "C",
          "F"
        ]
      }
    },
    "additionalProperties": false
  }
}
```

この変更後、再度1番の質問「昨日の体温の平均を教えて」をAIに投げかけたところ、期待通り`average_temperature({"days_ago":1,"temperature_unit":"C"})`というファンクションコールが返ってきました。

### 検証結果と考察

最終的に、**6問全てにおいて想定通りのファンクションが使用されることに成功しました。**

この検証から、AIがユーザーの質問意図を正確に解釈し、適切なファンクションを呼び出すためには、**想定される質問の形式にできる限り近い形でファンクションを定義することが非常に重要である**ということを確認できました。特に、必要な情報（今回の場合は「いつの」という期間指定）をファンクションの引数として明確に定義することで、AIの精度が大きく向上することが示されました。

体調管理AIのような、ユーザーの具体的な情報取得をサポートするシステムにおいて、ファンクションの設計は回答の正確性を左右する重要な要素となります。今回の知見を活かし、よりユーザーフレンドリーで精度の高いAIシステムの開発に役立てていきたいです。