보이지 않는 오류 포착: 케냐 HIV 프로그램을 위한 중복 탐지 에이전트 개발
Elasticsearch Agent Builder 해커톤
.png)
케냐의 많은 지역 보건소에서 모니터링 및 평가(M&E) 담당자들은 엑셀 피벗 테이블을 돌리고, 환자 이름을 일일이 확인하고, 검체 ID를 대조하는 데 하루 종일 시간을 보내도 여전히 중복 검체의 약 44%밖에 잡아내지 못합니다. 나머지 56%는 시스템에 그대로 남아 미국 대통령 에이즈 구제 긴급 계획(PEPFAR) 대시보드를 부풀리고, 시약을 낭비하며, 임상의들이 치료 결정을 내릴 때 의존하는 데이터에 대한 신뢰를 떨어뜨립니다.
저는 직장에서 직접 보기 때문에 이 사실을 잘 알고 있습니다. 저는 나이로비에 있는 헬스테크 회사에서 솔루션 아키텍트로 일하고 있습니다. 저희는 케냐의 47개 모든 카운티에 걸쳐 의료 정보 시스템을 배포하고 유지 관리합니다. 환자 기록 중복 문제는 누구도 발표 자료에 넣지는 않지만, 누구나 몸으로 느끼는 문제입니다.
Elasticsearch Agent Builder Hackathon이 발표되었을 때, 저는 문제를 찾아다닐 필요가 없었습니다. 이 문제는 몇 달 동안 제 책상 위에 놓여 있었습니다.
중복이 발생하는 방식(그리고 중복을 잡기 어려운 이유)
케냐의 HIV 검사 인프라는 HIV에 노출된 영아를 위한 조기 영아 진단(EID)과 항레트로바이러스 요법을 받는 성인을 위한 바이러스 부하(VL) 모니터링이라는 두 가지 중요한 실험실 검사를 실행합니다. 검사는 KenyaEMR에서 주문되고, 실험실에서 처리되며, 케냐의 건강 정보 교환을 통해 결과가 다시 전달됩니다.
어머니가 영아를 A 시설로 데려온 다음, 약간 다른 이름으로 B 시설에서 다시 검사를 받으며, ART를 받는 성인이 카운티 경계를 넘어 다시 등록되고, 누군가가 의도적으로 인구 통계 정보를 일관되지 않게 사용하여 여러 사이트에서 서비스에 접근하는 등 중복 시나리오는 화려하지도 않고 비용도 많이 듭니다.
각 시나리오는 고스트 레코드를 생성합니다. 이를 500개 이상의 시설에 적용하면 실제 비용은 상당합니다. 중복 검사, 낭비되는 시약, 과장된 보고 등으로 인해 연간 약 $195,000의 손실이 발생합니다. 수동 탐지에는 건당 약 2시간이 소요됩니다. 이 속도라면 백로그는 계속 늘어날 수밖에 없습니다.
저는 1,000개의 기록을 몇 초 만에 스캔하고 의료 종사자가 이해하고 조치할 수 있는 언어로 그 이유를 설명할 수 있는 것을 원했습니다.
시스템: 각각 특정 작업을 담당하는 3개의 에이전트
저는 Elastic Agent Builder와 Claude Sonnet 3.7 추론 모델을 사용하여 Elasticsearch 8.11(서버리스) 기반의 다중 에이전트 시스템을 구축했습니다. 모든 것을 처리하려는 하나의 거대한 에이전트 대신, 저는 작업을 탐지 에이전트, 위험 평가 에이전트, 그리고 조치 추천 에이전트, 이렇게 세 개의 에이전트로 나누었습니다. 각각은 범위가 좁고, 특정 입력값을 가지며, 정해진 출력 형식을 갖습니다.
탐지 에이전트
탐지 에이전트는 환자 인덱스에 대해 ES|QL 쿼리를 실행하여 시설 간 패턴 매칭(같은 환자가 여러 시설에 나타남), 인구통계학적 분석(예: 이름 변형, 성별 식별 불일치, ID 부분 일치), 일시적 이상 징후 탐색(원거리 시설에서 당일 검사)의 세 가지 관점을 통해 중복 항목을 찾습니다. 이는 검색 레이어로, 후보자를 가려내지만 판단을 내리지는 않습니다.
위험 평가자
위험 평가기는 해당 후보들을 대상으로 가중치 신호를 사용하여 0부터 100까지 점수를 매깁니다.
- 시설 간 방문: 최대 40점
- 인구통계학적 불일치: 최대 30점
- 지리적 불가능성: 최대 20점
- 타이밍 이상: 최대 10점
케이스는 네 가지 등급 중 하나에 속합니다: CRITICAL, HIGH, MEDIUM, LOW. 잠시 후 이진 분류를 사용하지 않은 이유를 설명하겠습니다.
조치 추천기
조치 추천기는 점수를 케냐 의료 환경에 맞춘 구체적인 다음 단계로 변환합니다. 바로 중요한 경우 즉각적인 M&E 담당자 검토, 중간 수준의 경우 다음 시설 방문 플래그 지정, 시스템적 패턴을 보이는 시설에 대한 직원 교육 권장 사항입니다. 이 에이전트는 위험 점수만으로는 의료 종사자에게 유용하지 않기 때문에 존재합니다. 그들은 무엇을 해야 하는지 알아야 합니다.
이진 분류 대신 다요인 점수를 사용한 이유
빌드 초기에는 중복 또는 비중복이라는 더 간단한 접근 방식을 시도했습니다. 하지만 실제 데이터와의 접촉에서 살아남지 못했습니다.
문제는 정당한 후속 검사가 중복으로 보인다는 점입니다. ART를 받는 환자는 몇 달에 한 번씩 같은 시설에 방문해야 합니다. 영아는 반복적으로 검사를 받아야 합니다. 이분법적인 분류는 너무 많은 합법적인 방문을 표시하여 의료진이 모든 표시를 무시하게 되거나, 같은 날에 약간 다른 이름으로 두 개의 다른 시설에서 검사하는 미묘한 경우를 놓치게 됩니다.
단계적 접근 방식을 통해 의료 종사자들이 우선순위를 정할 수 있습니다. 위험 점수 87점의 CRITICAL 사례(당일 검사, 서로 다른 시설 이용, 성별 식별 정보 불일치)는 즉시 주의를 받습니다. 반면 위험 점수 22점의 LOW 사례(동일 시설 이용 및 예상된 추적 검사 간격)는 기록 처리됩니다. 최종 판단은 M&E 담당자가 내리지만, 이제는 직감이 아니라 근거 기반의 정보를 바탕으로 의사결정을 하게 됩니다.
가중치를 조정하는 데에는 실제 데이터를 사용하여 여러 번의 반복 작업이 필요했습니다. 저는 아직 그것들이 최적의 선택인지 완전히 확신하지 못하겠습니다. 하지만 구조는 올바르며, 더 많은 필드 데이터를 수집함에 따라 가중치를 조정할 수 있습니다.
이를 가능하게 한 Elasticsearch 작업
저는 시스템의 다른 어떤 부분보다 인덱스 설계에 더 많은 시간을 앞선 단계에서 투자했고, 그것이 제가 한 최고의 투자였습니다.
인덱스 매핑에는 인덱스 시간에 계산된 파생 필드 cross_facility_flag, total_tests, 및 facility_count(환자당)가 포함되어 있습니다. 주요 인구통계 필드는 keyword(정확한 일치) 및 text(분석됨, 퍼지 검색) 하위 필드를 모두 가지고 있으므로, 탐지 에이전트는 추적 중인 신호에 따라 엄격한 일치와 퍼지 일치 간에 전환할 수 있습니다. 샘플 ID의 경우 엄격한 일치를 사용하고, 환자 이름의 경우 퍼지 일치를 사용합니다. 예를 들어 "Wanjiku"와 "Wanjiku Mary"는 같은 사람일 수 있습니다.
또한 후보 사전 필터링을 위해 Elasticsearch 집계 기능을 적극 활용했습니다. 이 시스템은 쌍별 비교를 실행하기 전에 시설, 테스트 유형 및 날짜 범위별로 기록을 분류합니다. 이것이 바로 대규모 데이터 세트에서도 탐지를 효율적으로 수행할 수 있게 해주는 요인입니다. 후보 공간을 먼저 좁힐 수 있다면 모든 기록을 다른 모든 기록과 비교할 필요는 없습니다.
ES|QL은 저에게 새로웠습니다. 해커톤을 통해 이 기술을 배웠는데, 대규모 실시간 분석에 매우 인상적이었습니다. 저에게 가장 효과적이었던 아키텍처는 패턴 탐지와 집계를 위한 ES|QL과 애플리케이션 로직을 처리하는 Python을 조합하는 것이었습니다. 제가 그것에 익숙하지 않았다는 점을 고려하면, 이러한 분리 덕분에 전체 시스템을 더 쉽게 이해할 수 있었습니다.
에이전트들이 실제로 발견한 것
저는 케냐의 59개 의료 시설에서 1,010건의 실제 익명화된 환자 기록에 대해 시스템을 테스트했습니다. 스캔은 10초 이내에 완료되었습니다.
당일 다중 시설 검사 사례 5건과 시설 간 성 식별자가 의도적으로 일치하지 않는 환자 4명을 포함해 131명의 중복 환자가 확인되었습니다.
저를 놀라게 한 것은 당일 사례입니다. 수동으로 검토하면 인내심을 발휘하면 결국 중복된 이름을 찾아낼 수 있습니다. 하지만 지리적으로 멀리 떨어져 있고 인구통계학적으로 약간 다른 두 시설에서 같은 날 검사를 받은 환자를 발견하는 것은 특별히 찾기 전까지는 데이터에 보이지 않게 존재하는 패턴입니다. M&E 담당자는 이러한 사례가 수작업으로 발견되었다면 몇 주가 걸렸을 것이라고 말했습니다.
기대하지 않았던 교훈: 설명 가능성이 바로 제품입니다
초기 프로토타입은 위험 점수와 권장 사항을 반환했습니다. M&E 담당자들에게 보여줬지만 그들은 그 결과를 신뢰하지 않았습니다.
이는 기술적 실패가 아니었고, 점수는 정확했습니다. 그러나 표시된 환자를 확인하는 의료 종사자는 왜 해당 환자가 표시되었는지, 즉 그 이유를 이해한 뒤에야 이에 대응할 수 있습니다. 이름 불일치 때문인지, 지리적으로 불가능한 위치 때문인지, 시점 때문인지, 이러한 맥락이 없으면 시스템은 블랙박스가 되고, 블랙박스는 환자 치료가 달린 임상 환경에서 무시되기 쉽습니다.
구체적이고 증거를 인용한 설명을 생성하는 작업 추천기를 구축함으로써 프로토타입이 사람들이 실제로 사용할 수 있는 것으로 변모했습니다. 제가 나이로비에서 시연한 M&E 담당자는 "이것 덕분에 지난달에 3일을 절약할 수 있었을 것입니다."라고 말했습니다.
이 교훈은 의료 서비스에만 국한된 것이 아닙니다. AI 시스템의 추천 결과에 사람이 행동해야 한다면, 그 설명 자체가 추천 결과만큼이나 중요한 제품의 일부입니다.
에이전트 지침을 제대로 이해하기
각 에이전트는 Elastic Agent Builder에서 구축되었으며, 각각의 도메인 전문 지식, 추론 단계 및 출력 형식을 정의하는 사용자 지정 지침이 포함되어 있습니다. 저는 이러한 지침의 품질이 얼마나 중요한지 과소평가했습니다.
초기 버전은 지침이 모호하여 일관성 없는 결과를 생성했습니다. 탐지 에이전트는 때로는 그 이유를 설명하기도 하고, 때로는 설명하지 않기도 했습니다. 위험 평가기는 때때로 점수 요인을 건너뛰었습니다. 신뢰할 수 있는 증거 기반 출력을 얻으려면 필요한 증거 필드에 대해 구체적으로 명시하고, 에이전트가 따라야 할 추론 체인을 명확하게 설명해야 했습니다. 맞춤 지침을 코드처럼 취급하세요. 정확하게, 예외적인 경우를 테스트하고, 반복하세요.
다음 단계
이것은 아카이빙되는 해커톤 데모가 아닙니다. 이 계획은 향후 2~3개월 동안 나이로비 카운티의 5개 시설에서 시범 운영되며, M&E 담당자를 교육하고 실제 성과 데이터를 수집하여 위험 가중치를 개선할 예정입니다.
그 후, 로드맵에는 생체 정보 매칭 통합과 스와힐리어 음성 유사 이름 매칭이 포함됩니다. 이는 현재 접근 방식의 실질적인 한계점입니다("Wanjiku"와 "Wanjiku"는 쉽지만, "Njeri"와 "Njery"는 음성 인식이 필요하며 표준 유사 매칭 방식으로는 제대로 처리되지 않습니다). 궁극적으로는 환자 등록 시 의료정보시스템(HMIS)에서 실시간으로 시스템을 운영하여 중복 등록을 등록 전에 걸러내는 것을 목표로 합니다.
장기적으로는 케냐의 보건 정보 교환 시스템에 연결하여 이를 47개 모든 카운티로 확대하고 싶습니다. Elasticsearch의 수평 확장과 모듈식 에이전트 설계는 핵심 시스템을 재구축할 필요가 없음을 의미합니다; 단지 확장만 필요합니다. 전국적인 차원에서 예상되는 영향: 연간 19만 5천 달러 절감 및 중복 검사 70% 감소. 더 중요한 것은, 의사들이 치료 결정을 내릴 때 그들이 보고 있는 기록을 신뢰할 수 있다는 것입니다.
핵심 사항
데이터 품질이 조용하고 비용이 많이 들며 사람의 노동력이 필요한 문제인 도메인에서 작업하는 경우, Elastic 에이전트 빌더를 사용하면 패턴 탐색을 위한 ES|QL, 계층 분석을 위한 멀티 에이전트 오케스트레이션, 도메인별 추론을 위한 사용자 정의 지침과 같은 도구를 사용하여 문제를 쿼리하는 대신 문제를 설명하는 무언가를 구축할 수 있습니다. 예상보다 빨리 완성되었습니다.
이 빌드에서 가장 만족스러웠던 부분은 배치가 아니었다. 매일 이 일을 하는 사람이 약 10초 만에 도구가 자신의 문제를 이해했다는 것을 알아차리는 모습을 보는 것이었습니다.
이 게시물에서 설명된 모든 기능이나 성능의 출시와 일정은 Elastic의 단독 재량에 따라 결정됩니다. 현재 제공되지 않는 기능이나 성능은 예정된 시간에 출시되지 않을 수도 있으며 아예 제공되지 않을 수도 있습니다.
이 블로그 게시물에서는 타사 생성형 AI 도구를 사용하거나 언급했을 수 있으며 이러한 도구는 각각의 소유자가 소유하고 운영합니다. Elastic은 이러한 타사 도구에 대해 어떠한 통제권도 없으며 해당 도구의 콘텐츠, 운영, 사용뿐 아니라 사용으로 인해 발생할 수 있는 손실이나 손해에 대해 어떠한 책임도 지지 않습니다. 개인 정보, 민감한 정보 또는 기밀 정보를 AI 도구와 함께 사용할 때는 주의하시기 바랍니다. 제출된 모든 데이터는 AI 학습이나 기타 목적으로 사용될 수 있습니다. 제공한 정보가 안전하게 보호되거나 비밀로 유지된다는 보장은 없습니다. 생성형 AI 도구를 사용하기 전에 해당 도구의 개인정보 보호 관행과 이용 약관을 숙지하시기 바랍니다.
Elastic, Elasticsearch 및 관련 마크는 미국 및 기타 국가에서 Elasticsearch B.V.의 상표, 로고 또는 등록 상표입니다. 그 외의 모든 회사 및 제품 이름은 해당 소유자의 상표, 로고 또는 등록 상표입니다.