AI 헬스 에이전트 구축: LangGraph와 실시간 CGM 데이터를 활용한 식단 자동화

발행: (2026년 2월 16일 오전 10:15 GMT+9)
9 분 소요
원문: Dev.to

Source: Dev.to

AI 에이전트를 활용한 대사 건강 관리

대사 건강을 관리하는 것이 풀타임 직업처럼 느껴져서는 안 됩니다. AI Health Agents와 **Continuous Glucose Monitoring (CGM)**가 보편화되면서, 이제는 반응적인 추적에서 능동적인 개입으로 전환할 수 있게 되었습니다. 예를 들어, 실시간으로 Dexcom 데이터를 모니터링하고 혈당 조절이 부진할 때 자동으로 주간 장보기 목록을 재작성해 주는 에이전트를 상상해 보세요.

이 튜토리얼에서는 LangGraph, OpenAI Function Calling, 그리고 Supabase를 활용해 Agentic Dietitian을 구축하는 방법을 살펴봅니다. LLM orchestration과 상태 기반 워크플로우를 이용해 생물학적 신호와 실행 가능한 식이 변화 사이의 간극을 메우는 방법을 다룹니다. 이 가이드를 마치면 생리 데이터를 개인 맞춤형 영양으로 전환하는 폐쇄‑루프 시스템을 구현하는 방법을 이해하게 될 것입니다.

아키텍처: 폐쇄 루프 건강 피드백 시스템

단순한 챗봇과 달리, 에이전시 시스템은 상태를 유지하고 변화하는 데이터에 기반해 결정을 내려야 합니다. 우리는 LangGraph를 사용하여 모니터링, 분석, 행동의 사이클을 관리합니다.

graph TD
    A[Dexcom API: Real‑time Glucose] --> B{Health Monitor Node}
    B -- Glucose Spike Detected --> C[Dietary Analyst Node]
    B -- Glucose Stable --> D[Log Activity]
    C --> E[OpenAI Function Calling: Modify Grocery List]
    E --> F[Supabase: Persist Changes]
    F --> G[Notification to User]
    G --> A

사전 요구 사항

따라 하려면 다음 기술 스택이 필요합니다:

  • LangGraph – 상태 기반 에이전트 워크플로우를 구축하기 위해.
  • OpenAI SDK – 추론 엔진(GPT‑4o)을 위해.
  • Supabase – 사용자 프로필 및 장보기 목록을 저장하기 위해.
  • Dexcom Developer API – CGM 데이터에 접근하기 위해(데모에서는 이를 모의합니다).

Step 1: 에이전트 상태 정의

LangGraph에서 State는 서로 다른 노드를 통과하면서 진화하는 공유 스키마입니다. 우리의 에이전트는 현재 혈당 수치, 사용자의 건강 목표, 그리고 장바구니 목록에 대한 보류 중인 변경 사항을 추적해야 합니다.

from typing import TypedDict, List
from langgraph.graph import StateGraph, END

class AgentState(TypedDict):
    glucose_level: float
    trend: str                 # e.g., "rising", "falling", "stable"
    current_grocery_list: List[str]
    health_summary: str
    action_taken: bool

Step 2: 실시간 데이터 통합 (Dexcom)

우리는 최신 혈당 측정값을 가져오는 도구를 정의합니다. 실제 환경에서는 Dexcom API에 연결하기 위해 OAuth2를 사용합니다.

def fetch_glucose_data(user_id: str):
    # Mocking Dexcom API response
    # In reality: requests.get(DEXCOM_URL, headers=auth_headers)
    return {
        "value": 185.5,          # mg/dL (a bit high!)
        "trend": "rising_fast"
    }

단계 3: AI 추론 및 함수 호출

에이전트가 혈당 급증을 감지하면 단순히 “채팅”만 하면 안 되고 “행동”을 해야 합니다. 우리는 OpenAI의 함수 호출 기능을 사용하여 LLM이 Supabase 데이터베이스와 연동하도록 하여 고혈당 지수를 가진 음식들을 제거하고 더 나은 대안을 제시하도록 합니다.

import openai
from typing import List

def modify_grocery_list(items_to_remove: List[str], items_to_add: List[str]) -> str:
    """
    Updates the user's grocery list in Supabase to improve glycemic response.
    """
    # Logic to update Supabase table goes here
    print(f"Removing: {items_to_remove}, Adding: {items_to_add}")
    return "Grocery list updated successfully."

# Define the tool for the LLM
tools = [{
    "name": "modify_grocery_list",
    "description": "Adjust the grocery list based on blood sugar trends",
    "parameters": {
        "type": "object",
        "properties": {
            "items_to_remove": {
                "type": "array",
                "items": {"type": "string"},
                "description": "Foods to remove from the list"
            },
            "items_to_add": {
                "type": "array",
                "items": {"type": "string"},
                "description": "Foods to add to the list"
            }
        },
        "required": ["items_to_remove", "items_to_add"]
    }
}]

단계 4: LangGraph 구성

이제 모든 것을 연결해 보겠습니다. 그래프는 포도당 추세에 따라 식단 조정을 트리거할지 여부를 결정합니다.

workflow = StateGraph(AgentState)

def monitor_glucose_node(state: AgentState):
    data = fetch_glucose_data("user_123")
    return {"glucose_level": data["value"], "trend": data["trend"]}

def dietitian_node(state: AgentState):
    if state["glucose_level"] > 180:
        # Call LLM to decide what to swap in the grocery list
        # Example: "Since the user is spiking, swap white bread for quinoa."
        return {
            "health_summary": "High glucose detected. Adjusting list.",
            "action_taken": True
        }
    return {"action_taken": False}

workflow.add_node("monitor", monitor_glucose_node)
workflow.add_node("dietitian", dietitian_node)

workflow.set_entry_point("monitor")
workflow.add_edge("monitor", "dietitian")
workflow.add_edge("dietitian", END)

app = workflow.compile()

“공식” 방법: 에이전트 레벨업

프로토타입을 만드는 것은 쉽지만, HIPAA‑준수이며 프로덕션에 바로 사용할 수 있는 헬스 에이전트를 만드는 것은 전혀 다른 일입니다. 센서 오류, 데이터 누락, 사용자 선호도와 같은 엣지 케이스를 처리해야 합니다.

프로덕션에 바로 적용 가능한 예제와 자율 에이전트 구축을 위한 고급 패턴을 더 보고 싶다면 **WellAlly Tech Blog**의 기술 심층 분석을 확인하세요. 여기서는 RAG 최적화부터 기본 튜토리얼을 훨씬 뛰어넘는 복잡한 에이전시 워크플로우까지 모두 다룹니다. 🥑

결론: 선제적 건강의 미래

워크플로 관리에 LangGraph를, 인텔리전스에 OpenAI를 결합함으로써 우리는 단순한 “추적기”에서 “파일럿”으로 전환했습니다. 이 에이전트는 혈당이 높다고 알려주는 것에 그치지 않고, 다음 주에 더 나은 옵션으로 주방을 채워두도록 주도적으로 행동합니다.

다음은?

  • 멀티모달 입력 – GPT‑4o를 사용해 식사 사진을 분석하고 특정 음식과 혈당 급증을 연관시킵니다.
  • 장기 메모리 – Supabase에 수개월 간의 데이터를 저장하여 에이전트가 오트밀 (특히)이 당신에게 혈당을 급상승시킨다는 것을 학습하게 합니다, 비록 대부분 사람에게는 “건강에 좋다”고 해도.
  • 사용자 선호도 처리 – 식이 제한, 문화적 음식, 예산 제약을 의사결정 루프에 통합합니다.

이러한 확장을 통해 여러분의 Agentic Dietitian이 진정한 개인 맞춤형 건강 동반자로 진화할 수 있습니다. 즐거운 개발 되세요!

AI 헬스 커뮤니티

AI 헬스 분야에서 개발하고 계신가요? 아래에 댓글을 남기거나 에이전시 워크플로우가 환자 결과에 어떻게 변화를 주는지에 대한 생각을 공유해주세요! 🚀💻

AI, 에이전트, 그리고 현대 웹 개발에 관한 “Learning in Public” 튜토리얼을 더 보려면 저를 팔로우하세요.

0 조회
Back to Blog

관련 글

더 보기 »