はじめに
こんにちは、株式会社ラフールで開発を担当している李です。
今回は、社内のハッカソンイベントでAIアシスタントを活用しながら、セルフヘルスケアAIエージェント(Health Agent)を0→1で開発した取り組みをご紹介します。
本プロジェクトでは、健康診断書の画像をアップロードするだけで、AIが自動解析・データベース保存・トレンド分析まで行うシステムをたった1日で構築しました。
使用技術:
- Mastra - AIエージェントフレームワーク
- Claude Sonnet 4.5 - マルチモーダルLLM(AWS Bedrock経由)
- PostgreSQL - 健康データの永続化
- Next.js + Chart.js - トレンド可視化ダッシュボード
1. システムアーキテクチャ
┌─────────────────────────────────────────────────────────────┐
│ Health Agent
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Claude Sonnet 4.5 (マルチモーダルLLM) │ │
│ │ 画像認識 + 自然言語理解 + 推論能力 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────┴────────────┐ │
│ ▼ ▼ │
│ ┌─────────────────────┐ ┌─────────────────────────┐ │
│ │ save-health-check │ │ generate-health-trend │ │
│ │ (保存ツール) │ │ (分析ツール) │ │
│ └─────────────────────┘ └─────────────────────────┘ │
│ │ │ │
│ └────────────┬────────────┘ │
│ ▼ │
│ ┌─────────────────────────┐ │
│ │ PostgreSQL │ │
│ │ (健康データ永続化) │ │
│ └─────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
2. 実装
2.1 エージェント定義
Mastraフレームワークを使用してHealth Agentを定義します。
import { Agent } from '@mastra/core/agent';
import { Memory } from '@mastra/memory';
import { LibSQLStore } from '@mastra/libsql';
import { healthCheckTool } from '../tools/health-check-tool';
import { healthTrendChartTool } from '../tools/health-trend-chart-tool';
import { createAmazonBedrock } from '@ai-sdk/amazon-bedrock';
export const healthAgent = new Agent({
name: 'Health Agent',
instructions: `あなたは健康診断結果を包括的に解析する専門アシスタントです...`,
model: createAmazonBedrock({...})('us.anthropic.claude-sonnet-4-5-20250929-v1:0'),
tools: { healthCheckTool, healthTrendChartTool },
memory: new Memory({ storage: new LibSQLStore({ url: 'file:../mastra.db' }) }),
});
ポイント:
-
instructionsでエージェントの役割を簡潔に定義 -
toolsで保存・分析ツールを登録 -
memoryで会話履歴を永続化
instructionsの書き方
| 項目 | 説明 | 例 |
|---|---|---|
| 役割定義 | エージェントの専門性 | 健康診断結果を解析する専門アシスタント |
| 主な機能 | できることのリスト | 画像解析、DB保存、トレンド分析 |
| ツール | どのツールをいつ使うか | 画像が来たらsave-health-checkを呼ぶ |
| 対応データ | 扱える項目・形式 | 34項目の検査項目に対応 |
| 出力形式 | 回答のフォーマット | Markdownテーブルで表示 |
2.2 ツール定義
| ツール名 | 機能 | 主な特徴 |
|---|---|---|
| save-health-check | 健康診断結果をDBに保存 | Zodスキーマ検証、トランザクション管理、重複データ上書き |
| generate-health-trend | 時系列トレンド分析 | 統計計算、改善/悪化判定(HDL・eGFR↑=改善、LDL・中性脂肪↓=改善)、Markdownテーブル出力 |
3. データベース設計
3.1 スキーマ構造
-- 検査記録マスター
CREATE TABLE health_checkups (
id SERIAL PRIMARY KEY,
checkup_id VARCHAR(255) UNIQUE NOT NULL,
checkup_date DATE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 検査項目詳細(4カラムパターン)
CREATE TABLE health_items (
checkup_id VARCHAR(255) REFERENCES health_checkups(checkup_id) ON DELETE CASCADE,
-- 各項目に対して4カラム(例: LDLコレステロール)
ldl_cholesterol DECIMAL(10, 2), -- 数値
ldl_cholesterol_unit VARCHAR(50), -- 単位
ldl_cholesterol_reference VARCHAR(100), -- 基準値
ldl_cholesterol_status VARCHAR(20), -- 判定(正常/要注意/異常)
-- 他34項目も同様のパターン...
);
3.2 検査項目マッピング
医療現場での用語揺れに対応するため、同義語をマッピングしています。
| 入力例 | DBカラム名 |
|---|---|
| GOT, AST, GOT/AST | got_ast |
| GPT, ALT, GPT/ALT | gpt_alt |
| LDLコレステロール, LDL | ldl_cholesterol |
| 中性脂肪, TG | triglycerides |
4. 活用
4.1 健康診断画像のアップロード
- 健康診断結果の画像をアップロード
- Claude Sonnet 4.5が画像を「見て」理解
- 検査項目、数値、基準値、判定を自動抽出
- 構造化データとしてデータベースに保存
- 過去のトレンドを確認し、改善提案を受ける
4.2 トレンド分析の例
5. フロントエンド(ダッシュボード)
Next.js + Chart.jsで構築したトレンド可視化ダッシュボードです。
主な機能:
- カテゴリ別検査項目選択: 血液一般/肝機能/腎機能/脂質/糖代謝など9カテゴリ
- 基準値範囲の可視化: 緑色の帯で正常範囲を表示
- 上限・下限ライン: 破線で基準値の境界を明示
- インタラクティブなチャート: ホバーで詳細値を表示
まとめ
本記事では、Mastraフレームワークを使ってAIエージェントを構築し、健康診断書の自動解析システムを実装しました。
主な特徴:
- 画像解析: 健康診断書を撮影するだけでデータ化
- AI対話: 自然な会話でデータ分析・質問応答
- トレンド分析: 長期的な健康状態の変化を可視化
- 永続保存: PostgreSQLによる信頼性の高いデータ管理
- ダッシュボード: 基準値範囲付きのトレンドグラフを可視化
株式会社ラフールでは、AIを活用した「ラフールマネジメント」サービスを提供しております。
お客様のデータを基に、AIが客観的な分析を行い、改善に向けたアドバイスを提供しております。
ご興味がございましたら、お気軽にご連絡ください。
https://corp.lafool.co.jp/service/#management



