fos-blog/study
01 / 홈02 / 카테고리03 / 시리즈
01 / 홈02 / 카테고리03 / 시리즈

카테고리

  • AI 페이지로 이동
    • RAG 페이지로 이동
    • agent 페이지로 이동
    • claude-code 페이지로 이동
    • harness 페이지로 이동
    • llm 페이지로 이동
    • ops 페이지로 이동
    • practice 페이지로 이동
  • algorithm 페이지로 이동
    • Alias Method: 가중치 랜덤 선택을 전처리 O(n), 추출 O(1)로 바꾸기
    • Welford's Online Algorithm: 값을 저장하지 않고 평균과 분산 계산하기
  • architecture 페이지로 이동
    • distributed-systems 페이지로 이동
    • domain 페이지로 이동
    • evolution 페이지로 이동
    • patterns 페이지로 이동
  • database 페이지로 이동
    • milvus 페이지로 이동
    • mysql 페이지로 이동
    • opensearch 페이지로 이동
    • postgresql 페이지로 이동
    • qdrant 페이지로 이동
    • redis 페이지로 이동
    • vespa 페이지로 이동
    • DB Connection Pool Saturation과 Thread Pool 격리
    • 커넥션 풀 크기는 얼마나 조정해야 할까?
    • MyBatis 기본기 — XML Mapper, resultMap, 동적 SQL, 운영 패턴 정리
    • MyBatis와 JPA/Hibernate 트레이드오프 — 레거시 백엔드를 다루는 시니어 관점
    • 한국어 형태소 분석기 Nori vs Lindera — OpenSearch에서 Milvus로 갈 때 어휘 검색은 유지되나
    • 정규화와 역정규화: 무결성과 조회 비용 사이의 선택
    • 벡터 DB 5종, 아키텍처는 어떻게 다른가
    • 벡터 DB 5종을 실제로 벤치마크했다 — 같은 recall에서 QPS는 얼마나 갈리나
    • 벡터 DB 어떻게 고를까 — OpenSearch · Milvus · Qdrant · Vespa · pgvector 비교
    • 벡터 DB를 실제로 도입한 사례 — 빅테크 프로덕션
  • devops 페이지로 이동
    • docker 페이지로 이동
    • k8s 페이지로 이동
    • Envoy Proxy
    • Graceful Shutdown
    • 종료 신호는 어디서 멈추는가
  • http 페이지로 이동
    • HTTP Connection Pool
    • HTTPS와 TLS: 핸드셰이크, 인증서, 종료 지점
  • java 페이지로 이동
    • concurrency 페이지로 이동
    • jdbc 페이지로 이동
    • spring 페이지로 이동
    • spring-batch 페이지로 이동
    • testing 페이지로 이동
    • Alpine 이미지의 Java 에서 링크 바꿔치기(TOCTOU)를 막지 못하는 이유
    • Java 동시성 락 정리 — 커머스 메뉴/프로모션 정책 캐시 갱신 관점
    • JVM 튜닝 실전: 메모리 구조부터 Virtual Threads, GC 튜닝, 프로파일링까지
    • 로그에 traceId 남기기 — MDC 부터 OpenTelemetry 까지
    • Java StampedLock — 읽기 폭주에도 쓰기가 밀리지 않는 락
    • Virtual Thread와 Project Loom
  • javascript 페이지로 이동
    • typescript 페이지로 이동
    • AbortController
    • Async Iterator와 제너레이터
    • CommonJS와 ECMAScript Modules
    • 제너레이터(Generator)
    • Http Client
    • Node 백엔드 운영 패턴 — Streams 백프레셔, pipe/pipeline, 멱등성 vs 분산 락
    • Node.js
    • `setImmediate()`
  • kafka 페이지로 이동
    • Kafka 클러스터 아키텍처: Broker, KRaft Controller와 복제
    • Kafka 기본 개념: Topic, Partition, Offset과 Segment
    • Kafka 실전 설계: 파티션 전략, 컨슈머 그룹, 전달 보장, 재시도, 순서 보장 트레이드오프
    • Kafka 파티션·리밸런스·컨슈머 지연 운영
    • Kafka를 로그로 이해하기: 복제, 재처리, 상태와 데이터 통합
    • Spring Kafka 컨슈머 오프셋 커밋과 트랜잭션 정렬: AckMode, manual ack, 멱등 처리
  • linux 페이지로 이동
    • fsync — 리눅스 파일 동기화 시스템 콜
    • SSH forced command 로 배포 키가 실행할 수 있는 명령 제한하기
  • mlops 페이지로 이동
    • llm-serving 페이지로 이동
    • model-router 페이지로 이동
    • Python CUDA 버전 생태계 — nvidia-smi, nvcc, pip, conda가 다 다른 버전을 말하는 이유
    • GPU 컨테이너의 CUDA 버전 호환성 — nvidia-smi부터 이미지 다이어트까지
    • Kubernetes GPU 노드에서 /run tmpfs가 꽉 차서 Pod가 안 뜰 때
    • GPU·CUDA·MPS 기초 — 자바 백엔드 개발자가 처음 만나는 그림
    • Multi-process GPU 워크로드 — 자바 ThreadPool 사용자가 만나는 모델 차이
    • ML 서비스 성능 분석 워크플로 — 자바 백엔드 트러블슈팅과 다른 점
    • 한 GPU 를 여러 프로세스가 나눠 쓰기 — Time-Slicing 과 MPS
  • network 페이지로 이동
    • Connection reset by peer는 누가 보낸 걸까 — 리버스 프록시 홉마다 TCP 연결은 따로 논다
    • L2(스위치)와 L3(라우터)의 역할 차이
    • L4와 VIP(Virtual IP Address)
    • IP Subnet
  • observability 페이지로 이동
    • Observability 입문: 시니어 백엔드가 장애를 탐지하고 대응하는 방식
    • K8s 위 Spring Boot 앱의 메트릭 수집
  • python 페이지로 이동
    • Python async/await — CompletableFuture·Reactor 와 다른 점, 그리고 blocking I/O 함정
    • Python 의존성 관리 — Java Maven/Gradle 사용자가 만나는 첫 충격
    • FastAPI 기초 — Spring Boot 사용자가 빠르게 익히는 법
    • Java 개발자를 위한 Python 심화 — OOP·데코레이터·컨텍스트 매니저
    • PyTorch 기초 — 텐서, 디바이스, 그리고 모델 로딩이 무거운 이유
    • Java 개발자를 위한 Python 문법 핵심
    • ThreadLocal 에서 contextvars 로 — Python 의 요청 컨텍스트 전파
    • OCR 동작 원리 — Layout · Text · Post-process 3단계
    • Python 서버의 RSS가 줄지 않는 이유: CPython, gc.collect(), malloc_trim
  • rabbitmq 페이지로 이동
    • RabbitMQ Basics — 실전 백엔드 관점에서 정리하는 메시지 브로커 기본기
    • RabbitMQ vs Kafka — 백엔드 메시징 선택 기준과 실전 운영 관점
  • resume 페이지로 이동
    • 경험 및 경력기술서
    • 김병태 경력기술서
    • 김병태 포트폴리오
  • task 페이지로 이동
    • ai-service-team 페이지로 이동
    • nsc-slot 페이지로 이동
    • personal-projects 페이지로 이동
    • sb-dev-team 페이지로 이동
    • the-future-company 페이지로 이동
  • thinking 페이지로 이동
    • 자기주도 학습: 질문에서 시작해 글로 검증하기
    • 좋은 일을 넘어 중요한 일을 하는 법
FOS-BLOG · FOOTERall systems normal·v0.1 · 2026.04.27·seoul, kr
Ffos-blog/study

개발 학습 기록을 정리하는 블로그입니다. 공부하면서 기록하고, 기록하면서 다시 배웁니다.

visitors
01site
  • Home↗
  • Posts↗
  • Categories↗
  • Glossary↗
  • About↗
02policy
  • 소개/about
  • 개인정보처리방침/privacy
  • 연락처/contact
03categories
  • AI↗
  • Algorithm↗
  • DB↗
  • DevOps↗
  • Java/Spring↗
  • JS/TS↗
  • React↗
  • Next.js↗
  • System↗
04connect
  • GitHub@jon890↗
  • Source repositoryjon890/fos-study↗
  • RSS feed/rss.xml↗
  • Newsletter매주 1 회 · 한 편의 글→
© 2026 FOS Study. All posts MIT-licensed.
built with·Next.js·Tailwind v4·Geist·Pretendard·oklch
fos-blog/task/AI 돌봄 분석 설계: 온톨로지·센서 요약·…
task

AI 돌봄 분석 설계: 온톨로지·센서 요약·개인 메모리를 연결하기

진행 기간: 2026.09–현재 상태: 현재 담당 · 진행 중 AI 돌봄 분석은 센서 관측과 돌봄 맥락을 바탕으로 대상자의 상태와 돌봄 필요도를 분석하고, 담당자가 검토할 근거와 조치 가이드를 만드는 서비스다. 센서가 보낸 값을 보여 주는 데서 그치지 않고, 개인의 평소 상태와 비교해 무엇을 더 확인해야 할지 연결하는 것이 목표다. 나는 돌봄 조치 자료를...

2026.10.25·9 min read·2 views

진행 기간: 2026.09–현재

상태: 현재 담당 · 진행 중

AI 돌봄 분석은 센서 관측과 돌봄 맥락을 바탕으로 대상자의 상태와 돌봄 필요도를 분석하고, 담당자가 검토할 근거와 조치 가이드를 만드는 서비스다. 센서가 보낸 값을 보여 주는 데서 그치지 않고, 개인의 평소 상태와 비교해 무엇을 더 확인해야 할지 연결하는 것이 목표다.

나는 돌봄 조치 자료를 상황과 조치의 관계로 구조화하고, 실제 센서 관측과 개인 맥락을 결합하는 시스템의 개발·개선을 맡고 있다. 지금 집중하는 일은 온톨로지와 지식그래프, 센서 요약, 개인 메모리를 어떤 경계로 나누고 분석에 연결할지 정하는 것이다. 그 위에서 에이전트가 근거를 탐색하고 결과를 작성하도록 하며, 실행 성공과 결과의 정확성을 따로 확인하고 있다.

처음 방향: 돌봄 지식과 실제 관측을 연결한다

출발점은 돌봄 조치 데이터를 분석해 어떤 상황에 어떤 조치가 연결되는지 구조화하는 것이었다. 문서를 검색해 관련 문장을 찾는 데서 그치지 않고, 상황·증상·조치의 개념과 관계를 온톨로지로 정의하고 실제 지식을 그래프로 쌓는 방향이다.

하지만 돌봄 지식만으로는 지금 이 사람에게 무슨 일이 있는지 알 수 없다. 센서가 관측한 값, 문진과 메모 같은 배경, 이전 분석과 아직 해결되지 않은 상황을 함께 봐야 한다. 같은 수치라도 개인의 평소 범위와 최근 변화에 따라 해석할 맥락이 달라지기 때문이다.

그래서 현재 설계의 중심은 입력을 많이 넣는 것보다 지식·관측·개인 맥락을 구분하면서 필요한 근거를 함께 읽게 하는 것이다. 분석 결과는 사람이 검토할 판단과 조치의 근거이며, 임상 효과나 완전 자동 의사결정을 검증한 시스템으로 설명하지 않는다.

분석에 들어오는 데이터의 역할

입력분석에서의 역할현재 구분하는 경계
돌봄 조치·상황 자료개념과 관계를 정하고 상황에 연결된 조치를 탐색할 근거온톨로지 정의, 문서에서 추출한 관계와 그래프 반영을 구분
관찰·상담·돌봄 기록센서만으로 알 수 없는 배경과 대화 맥락 보완배경 조회와 대화 요약 전달 경로가 있으며, 별도 관측 기록 수집·구조화·저장 경로는 예정 설계
센서 관측분석 구간의 상태, 평소와의 차이와 관측 공백 제공기존 원시 입력을 기기·항목별로 읽어 요약하며, 모든 장비의 수집 자체를 이 분석 시스템이 맡는 것은 아님
개인 메모리이전 판단과 미해결 상황, 개인 기준선과 변화 이력 제공지속 저장한 상태와 이번 분석에서 읽은 사본을 구분

구조는 지식을 준비하는 경로와 개인의 현재 상태를 분석하는 경로로 나뉜다. 분석은 센서 요약과 개인 맥락을 먼저 받고, 필요한 지식은 도구로 조회한다. 전체 흐름은 다음과 같다. 실선은 현재 구현된 처리 경로이고, 점선은 아직 구현하지 않은 별도 기록 수집 경로다.

온톨로지는 지식의 정의이고 관측은 시점의 사실이다

온톨로지는 어떤 개념과 관계를 사용할지 정하는 정의다. 지식그래프는 그 정의를 바탕으로 문서에서 추출한 상황과 조치의 관계를 담는다. 센서가 특정 시점에 측정한 값과 개인에게 이어지고 있는 상황은 이 둘과 수명이 다르다. 이들을 같은 데이터로 다루면 새 관측이 들어올 때마다 지식 정의까지 바뀌거나, 개인의 일시적 상태를 일반 지식으로 읽을 수 있다.

현재 구현은 문서의 관계 추출과 그래프 반영을 별도 단계로 둔다. 추출할 때 사용한 지시문과 온톨로지 정의를 사본으로 남기고, 추출 결과가 생겼다고 자동으로 그래프에 반영하지 않는다. 결과를 확인한 뒤 반영하거나 취소할 수 있다. 온톨로지 자체의 편집도 별도 경로라, 문서에서 새 표현이 나왔다는 이유만으로 스키마가 바뀌지는 않는다.

또 하나의 어려움은 그래프에 연결이 있다는 사실만으로 담당자가 할 일을 구체적으로 설명할 수 없다는 점이다. 너무 넓은 조치 개념을 연결하면 상황이 달라도 비슷한 권고만 나오기 쉽다. 그래프 설계에서는 개념과 관계의 수보다, 분석 결과에서 필요한 행동과 적용 조건을 구분할 수 있는지를 함께 봐야 한다. 이는 추출 프롬프트만 고쳐 해결할 문제가 아니라 지식의 표현 단위를 검토할 문제다.

개인의 이전 분석과 진행 중인 상황은 분석 쪽의 메모리로 관리한다. 별도 관측 기록을 수집해 구조화하는 경로는 아직 예정 설계이므로, 관찰·상담·조치 기록이 모두 이 흐름으로 적재된 상태로 보아서는 안 된다. 현재는 배경 조회와 이벤트에 실린 대화 요약을 분석에 연결하는 경로를 구분해서 보고 있다.

센서 압축은 평균을 남기는 작업으로 끝나지 않는다

다양한 센서를 한 분석 입력으로 만들 때 가장 먼저 부딪히는 문제는 측정 간격과 값의 의미가 다르다는 점이다. 계속 값을 보내는 기기와 가끔 측정하는 기기의 표본 수를 같은 기준으로 해석할 수 없고, 코드값과 숫자값도 같은 평균으로 묶을 수 없다. 원시값을 프롬프트에 모두 넣으면 입력량과 조회 비용이 커지고, 모델이 시간 구간과 단위를 직접 맞춰야 한다.

어려운 부분은 압축 비용을 줄이면서 시간 정보를 얼마나 남길지 정하는 것이다. 짧은 하락과 이후 회복이 하루 평균에서는 상쇄될 수 있고, 같은 변화가 여러 밤에 반복되는지도 일별 대표값만으로는 알기 어렵다. 반대로 모든 원시값을 늘리면 분석 비용과 재현에 필요한 입력량도 함께 커진다.

현재는 분석 구간의 원시 집계와 미리 저장한 일별·장기 요약을 결합한다. 장기 범위를 매번 원시 데이터에서 다시 읽지 않되, 저장 집계의 기준일과 준비 상태를 함께 전달한다. 집계가 늦었다면 오래된 요약을 최신 상태처럼 읽지 않게 하기 위해서다. 요약 길이도 분석 주기와 맞추고, 요청을 만들 때의 구간 끝과 길이를 보존한다.

압축 뒤에도 다음 정보는 구분해서 남긴다.

보존할 정보평균만으로 놓치는 것
유효 표본 수, 마지막 관측 시각과 최대 관측 공백최근 관측이 없는지, 드문 측정인지
최솟값·최댓값과 그 시각짧게 나타난 큰 변화가 평균에 가려지는지
개인의 평소 범위 밖 표본 수와 연속 관측 구간일시적인 값인지 여러 표본에 이어지는 변화인지
시간대별 비교와 장기 추이낮과 밤의 변화가 상쇄되거나 며칠의 방향을 놓치는지
유효 측정과 별도로 센 미감지 표시값실제 측정값과 기기의 미감지 응답을 혼동하는지

표본이 없다는 사실을 정상값이나 영으로 바꾸지 않는 것도 같은 이유다. 미감지 표시값은 해당 기기·항목의 규칙에 따라 유효 통계에서 제외하고 건수는 따로 남긴다. 다만 수신 공백이나 미감지 비율만으로 외출, 기기 이탈이나 건강 상태를 확정하지는 않는다. 다른 관측과 개인 맥락을 함께 확인해야 한다.

평소 범위 밖 표본의 연속 구간도 실제로 계속 그 상태였다는 증명은 아니다. 관측 간격이 긴 기기에서는 두 표본 사이를 알 수 없으므로, 표본 수·시각·공백과 함께 읽는 방향으로 검증해야 한다.

개인 메모리는 대화 이력보다 수명과 갱신이 중요하다

개인 맥락은 배경 정보, 이번 구간의 관측, 분석이 남긴 사건과 판단으로 나눈다. 그중 지속 저장하는 분석 메모리는 이전 판단, 아직 해결되지 않은 상황과 최근 해결 이력, 개인 기준선과 기준선 변경 이력이다. 센서 요약에 있는 통계적 평소 범위와 분석이 유지·갱신하는 기준선은 서로 다른 입력으로 둔다. 통계가 계산한 범위와 모델이 맥락을 보고 유지하려는 기준을 같은 값으로 오해하지 않게 하려는 것이다.

기준선 메모리는 기능 설정에 따라 읽기·반영 여부가 달라진다. 현재 구현은 대상자와 메모리 범위를 나누고, 분석 구간 끝보다 뒤의 정보를 읽지 않도록 조회 시점을 제한한다. 이번 분석에 사용한 배경과 메모리는 사본으로 남긴다. 나중에 기준선이 바뀌어도 당시 무엇을 보고 판단했는지 다시 볼 수 있어야 하기 때문이다. 다만 읽는 시점을 제한하는 것만으로 모든 과거 상태를 완전히 복원한다고 보장할 수는 없다. 변경·해결된 상황의 과거 재현 범위도 별도로 확인해야 한다.

갱신 역시 모델의 답을 그대로 덮어쓰는 방식으로 두지 않았다. 기준선 제안의 인용과 사실을 검사하고, 더 늦은 분석이 이미 정한 값이나 분석 도중 바뀐 버전을 오래된 결과가 덮어쓰지 않도록 한다. 분석 결과 저장 뒤 기준선은 별도로 반영하며, 기준선 반영이 실패하면 경고를 남긴다. 잘못된 기준선을 삭제해 다음 분석에서 새로 만들게 하는 경로도 있다.

이 방식은 상태를 나누어 관리하고 입력 사본과 갱신 이력을 보존하는 비용을 요구한다. 메모리를 프롬프트에 덧붙이는 기능으로만 보면 작아 보이지만, 실제로는 같은 결과를 다시 설명할 수 있어야 하는 저장·조회 설계다.

지금의 고민은 메모리를 오래 유지할수록 이전 판단의 오류도 다음 분석으로 이어질 수 있다는 점이다. 기기 변경, 긴 관측 공백이나 생활 변화가 있을 때 어떤 근거로 기준선을 유지·갱신·무효화할지 반복 검증할 필요가 있다. 이 모든 상황에 대한 자동 무효화 정책을 완성한 상태는 아니다.

모델의 추론과 코드 검증의 책임을 나눈다

상황과 조치를 연결하고 개인 맥락을 해석하는 일은 에이전트가 맡는다. 코드는 입력 구간, 출력 형식, 근거 인용과 상태 전이처럼 명시적으로 확인할 수 있는 계약을 검사한다. 모델은 기존 상황이 계속되는지, 나아졌는지 같은 관찰을 답하고, 코드는 현재 상태와 허용된 전이를 대조해 다음 상태를 정한다. 이렇게 나눠도 판단의 의미적 정확성까지 코드가 증명하는 것은 아니다.

업무 경계를 나누면 담당 영역을 독립적으로 개발할 수 있지만, 서로의 코드가 아니라 API 계약으로 맞물린다. 따라서 한쪽의 요약 필드나 상태 의미가 바뀌면 호출하는 쪽의 해석과 검증도 함께 맞춰야 한다. 현재 구조는 지식·센서·분석·실행 시점을 나누되, 같은 업무 안의 처리를 무조건 더 작은 서비스로 쪼개지는 않는 방향이다.

분석 시점과 중복·지연·복구는 실행을 요청하는 쪽의 책임으로 분리했다. 정기·이벤트 요청을 대기열에 남기고 대상자별 동시 실행을 제한하며, 중복 처리와 합치기·재시도를 구분한다. 분석 실행 중에는 탐색과 작성을 나누고 같은 시간 예산을 공유한다. 탐색 실패나 시간 소진 뒤에는 작성을 시작하지 않고, 작성 요청을 제출하지 못해도 앞선 탐색 식별 정보를 보존한다.

응답 형식 오류나 최소 위험도 제약 미달에는 제한된 재요청 경로를 둔다. 남은 시간이 부족하면 생략 사유를 남기고, 보정이 필요하면 그 사실도 표시한다. 이 보정은 출력 제약을 적용한 사실이며 의학적 정확성을 확인한 결과가 아니다.

별도 그래프 평가에서는 기대 조치의 누락, 그래프에 없는 조치와 도구 사용 여부를 나누어 본다. 현재 passed는 실행 완료·그래프 도구 사용·그래프에 없는 조치가 없다는 조건을 확인한다. 모든 기대 조치를 빠짐없이 답했는지와 조건 내용이 정확한지는 이 값만으로 알 수 없다. 실행 성공, 출력 계약 준수, 근거 탐색과 업무 정확도를 각각 확인해야 한다.

현재 담당 범위와 다음 검증

이 업무에서 내가 맡는 부분은 입력과 개인 맥락을 분석에 연결하는 설계, 분석 실행·실패 추적과 평가 경로의 개발·개선이다. 동료와 함께 구현하고 검토하며, 에이전트 실행에는 오픈소스 런타임을 활용하고 개발 과정에는 AI 도구를 사용한다. 장비 전체의 수집이나 돌봄 정책, 제품 전체를 혼자 만든 것으로 설명하지 않는다.

현재 코드에는 관계 추출과 그래프 반영의 분리, 센서 요약, 개인 메모리 조회·갱신, 실행 안정성과 평가 경로가 있다. 별도 관측 기록의 수집·구조화·저장은 예정 설계이며, 배경 정보의 외부 연동도 실제 제공 범위와 검증 환경의 대체 입력을 구분해야 한다. 이 글의 구현 설명은 이 경계를 기준으로 한다.

다음에는 센서 압축이 놓치는 짧은 변화와 결측 사례, 기준선 변경 전후의 과거 분석 재현성, 잘못된 메모리가 다음 판단에 미치는 영향을 사례로 나눠 확인하려고 한다. 기대 조치를 빠뜨린 답변과 잘못 인용한 근거, 시간 초과도 같은 입력으로 반복 비교할 대상이다. 실제 모델을 호출한 비교 평가와 운영 개선율은 이 글에서 새로 측정하지 않았고, 임상 효과·사고 예방·고객 성과도 검증한 성과로 제시하지 않는다.

on this page
  • 01처음 방향: 돌봄 지식과 실제 관측을 연결한다
  • 02분석에 들어오는 데이터의 역할
  • 03온톨로지는 지식의 정의이고 관측은 시점의 사실이다
  • 04센서 압축은 평균을 남기는 작업으로 끝나지 않는다
  • 05개인 메모리는 대화 이력보다 수명과 갱신이 중요하다
  • 06모델의 추론과 코드 검증의 책임을 나눈다
  • 07현재 담당 범위와 다음 검증
tags
#tasks#insights

이런 글도

  • task

    개인 AI 비서의 문맥 구성과 도구 승인 경계

    2026.10.25
  • task

    에이전트가 탐색하고 실패를 판단할 수 있는 CLI

    2026.10.25
  • task

    HTTP 200 응답 안의 OCR 오류를 운영 지표로 만들기

    2026.09.03
  • task

    운영 지표와 주간 오류 분류 루프

    2026.09.02

댓글 (0)