AI가 의료 질문을 거절했는데, 알고 보니 그게 정답이었다 — 만성콩팥병 RAG 만든 하루
📚 「AI 헬스케어 파이널 프로젝트」 연재 7편입니다. (6편: 웹서비스가 결국 뭔지 알게 됐다)

📝 한줄 요약
만성콩팥병(CKD) 예측·관리 서비스에 RAG(자료를 찾아 근거로 답하는 방식) 챗봇을 붙이는 첫날이었습니다. AI가 의료 질문에 “확인된 근거가 없습니다”라며 거절했는데, 원인을 두 가지로 나눠 끝까지 파봤습니다. 그 끝에서 AI의 거절이 사실 의료적으로 가장 정확한 답이었다는 반전을 만났습니다.
바쁘시면 이것만 읽어도 돼요:
- 4시간짜리 RAG 강의를 학습카드 5장(약 900줄)으로 응축하고, PoC(개념 증명용 시제품)를 성공 기준 6개 모두 통과시키는 데까지 한 세션에 끝냈습니다.
- 반전: AI가 의료 질문을 거절한 건 답답한 게 아니라 의료적으로 가장 안전한 정답이었습니다. “단계 명시가 없으면 모든 환자에 적용된다고 해석하라”고 추측을 유도한 시스템 프롬프트가 오히려 위험했습니다.
- 실증: 청크(자료를 잘라 저장하는 조각) 크기를 3배까지 키워도 답변 품질엔 결정적 차이가 없었습니다. 정작 갈린 건 청킹 “구조”(섹션 제목을 조각에 같이 남기느냐) 였습니다.
- 의료·법률·금융처럼 틀리면 큰일 나는 도메인에서는 “AI가 모른다고 답하는 게 안전” 이 원칙입니다. 시스템 프롬프트로 추측을 유도하지 마세요.
- AI가 거절하면 의심할 순서는 ① 시스템 프롬프트 ② 청크 구조입니다. 한국어/영어 차이는 핵심이 아니었습니다.
🎯 이런 분들께 도움돼요
- 의료·법률·금융처럼 답이 틀리면 회사가 흔들리는 분야에서 AI 챗봇 도입을 저울질하는 분
- 사내 가이드라인이나 규정 자료를 AI와 묶어보려는 기획자·PM
- 강의는 들었는데 실제 RAG 시제품을 어떻게 짜고 검증해야 할지 막힌 분
😫 문제 상황 (Before)
오즈코딩스쿨 AI 헬스케어 부트캠프에서 만성콩팥병(CKD) 예측·관리 서비스 파이널 프로젝트를 하고 있습니다. 모델이 위험도만 예측하는 게 아니라, 사용자 질문에 KDIGO·대한신장학회 같은 믿을 만한 자료를 보고 답하는 챗봇까지 만들어야 합니다.
문제는 일반 ChatGPT를 그냥 쓰면 안 된다는 점이었습니다.
- AI는 그럴싸하게 답하지만 출처가 없고 가끔 틀린 정보를 섞습니다. 의료에서는 치명적입니다.
- “당뇨가 의심됩니다” 같은 진단·처방 표현은 법적으로 의사의 영역입니다.
- 한국 신장학회 같은 국내 가이드라인은 ChatGPT가 아예 모릅니다.
부트캠프에서 4시간짜리 RAG 특강을 들었지만, 강의가 끝나자 머릿속이 붕 떴습니다. 뭘 어디서부터 손대야 할지, 팀원에게 뭘 공유해야 할지 정리가 안 됐어요. 다음으로 가려면 먼저 머릿속을 정리하고, 손에 잡히는 시제품을 만들어야 했습니다.
🛠️ 사용한 도구
- AI 코딩 도구: Claude Code (Claude Opus 4.7, 1M 컨텍스트)
- RAG 스택: LangChain v1 + Qdrant(자료를 좌표로 저장·검색하는 벡터 데이터베이스) + OpenAI(gpt-4o-mini + text-embedding-3-small)
- 문서 변환: pypdf, pymupdf4llm (PDF를 마크다운으로 바꿔 제목 구조를 살림)
- 검증 자료: KDIGO 2024 CKD Guideline PDF (199페이지)
- 특이사항: 코드를 만들기보다 “AI에게 막혔다고 말하고 같이 디버깅하는” 협업이 하루의 핵심이었습니다.
🔧 작업 과정
1️⃣ 4시간 강의를 5분 복기용 학습카드로 응축하기
먼저 강의를 어떻게 압축할지 고민했습니다. AI가 음성을 받아 적은 트랜스크립트(1,685줄)와 교안 PDF·실습 노트북이 다 있었지만, 그걸 처음부터 다시 보는 건 비효율이었어요. Claude Code에게 부탁했습니다.
Phase 0 학습카드부터 작성해줘
/Users/junhee_johnny/workspaces/whisper/rag/rag_transcript 폴더에 RAG 강의에 대한 음성파일로부터 추출한 텍스트가 있고
/Users/junhee_johnny/SynologyDrive/.../특강/260504 RAG 폴더에 그 강의의 학습자료가 있어
이걸 참고해서 작성해줘
Claude는 트랜스크립트 3개를 다 읽고, 강사가 강조한 핵심 명제 “RAG 차별점의 70%는 인덱싱이다” 를 중심으로 학습카드 5장을 만들었습니다.
01_openai_api.md— 임베딩(글을 숫자 좌표로 바꾸는 일)은 회귀, 채팅은 분류라는 본질02_qdrant_essentials.md— 벡터 데이터베이스의 핵심 개념 3개03_langchain_patterns.md— 검색 도구·에이전트 패턴04_langfuse_tracing.md— 관찰성과 개인정보 가리기05_medical_guard.md— 응급·자해·약물·금지표현 4단계 안전 가드
총 900줄, 한 장당 5분이면 복기되는 응축본이 나왔습니다. 제 메시지는 짧았는데도 Claude가 강사의 강조점과 인용, 맥락을 살려서 써줬어요.
💡 강의 자료를 요약하지 말고 “응축”을 시키세요. 트랜스크립트·교안·실습을 한꺼번에 지목하면 AI가 강사의 강조점까지 보존합니다. 단순 요약과는 결이 다릅니다.
2️⃣ 팀원이 RAG를 모른다면? 비유로 풀어쓴 정리본
학습카드만으로는 백엔드·프론트·인프라를 맡은 팀원이 RAG의 본질을 잡기 어려웠습니다.
그리고 강의내용을 팀원들에게도 공유하고 싶어 강의내용을 요약보다는 전반적인 내용을 정리해줘
RAG에 대해서 모르는 사람도 보고서 이해하기 쉽게
Claude는 18장짜리 597줄 정리본을 만들었는데, 가장 인상적이었던 건 비유로 풀어쓴 부분이었어요.
- LLM = “다음에 올 단어를 맞히는 자동완성의 거대한 버전”
- RAG = “오픈북 시험” (책 보고 답하기. 출처가 분명하고, 모르면 “교과서에 없습니다”라고 답할 수 있음)
- 임베딩 = “책의 모든 단락에 1,536개의 좌표를 매기는 작업”
- 벡터 데이터베이스 = “좌표로 검색하는 도서관”
특히 12장에는 팀원별 접점을 따로 정리해서, 백엔드 담당이 자기 영역만 빠르게 훑게 했습니다. RAG를 몰라도 자기가 뭘 해야 할지 보이는 구조였어요.
💡 전문 자료를 공유할 땐 “그 분야를 모르는 사람”을 독자로 박아 두세요. 비유 한 줄이 설명 열 줄을 이깁니다. 팀이 같은 그림을 보고 시작할 수 있습니다.
3️⃣ 강의 노트북 134개에서 우리에게 필요한 21개만 골라 로드맵으로
다음 질문을 던졌습니다.
rag구축을 중심으로 다음단계는?
전에 짜둔 로드맵이 있긴 했는데 너무 추상적이었습니다. 그때 마침 다른 저장소에서 RAG 관련 노트북 134개짜리 한국어 교재를 발견했어요. 다시 부탁했습니다.
/Users/junhee_johnny/workspaces/langchain-langgraph-deepagents-notebooks 에 RAG에 관련된 자료가 있어 여기 자료를 참고하여 우리 프로젝트의 RAG구축에 대한 로드맵 계획부터 세워보자
Claude는 노트북 134개 중 우리 프로젝트에 가장 가까운 21개를 골라 Phase 0~7에 하나씩 짝지었습니다. 그리고 그 노트북들이 쓰는 실전 패턴 6개(검색 도구가 출처를 유지하면서 토큰을 아끼는 법, 무한 반복을 막는 장치, 평가셋 자동화 등)를 흡수해 로드맵에 녹였어요.
총 824줄짜리 로드맵 v2가 나왔습니다. 이제 다음 단계에 들어갈 때 0에서 다시 시작하지 않아도 되는 단단한 지도가 생겼어요.
💡 남이 만든 좋은 예제를 “우리 것”으로 번역시키세요. 노트북 134개를 다 볼 필요 없이, AI가 우리 상황에 가까운 21개만 골라 패턴을 추려줍니다. 자료 더미가 곧장 실행 계획이 됩니다.
4️⃣ PoC 코드 골격 — 단일 파일에서 시작
Phase 1 PoC 코드 골격 작성
Claude는 8단계 흐름이 한눈에 보이는 단일 파일을 만들어줬어요. PDF 읽기 → 조각으로 자르기 → 좌표로 바꾸기 → 데이터베이스에 저장 → 사용자 질문 → 검색 → AI 답변과 출처.
처음엔 메모리에만 저장하는 방식이라 실행할 때마다 5~8분씩 다시 인덱싱(자료를 검색 가능하게 정리하는 작업)했습니다. 비용도 시간도 부담이라 말했어요.
옵션 2로 캐싱 추가해줘
Claude가 바로 결과를 로컬 파일에 저장하는 방식으로 바꾸고, 대화형 모드 옵션도 붙였습니다. 첫 실행 5~8분 → 두 번째부터 1초. 같은 시제품으로 질문을 마음껏 던질 수 있게 됐어요.
💡 시제품은 처음부터 캐시 모드로 시작하세요. 매번 5~8분을 다시 기다리면 실험 의욕이 꺾입니다. 한 번 정리해 두면 두 번째부터 1초라, 그만큼 더 시도하게 됩니다.
5️⃣ macOS 미리보기가 실패해서, AI가 코드로 우회했다
KDIGO 2024 가이드라인은 199페이지짜리 큰 문서였습니다. 식단·운동·약물·합병증을 다 다루는 3장(90~130쪽)만 뽑으려고 macOS 미리보기에서 페이지를 고르고 “PDF로 저장”을 눌렀는데, 199페이지가 그대로 복사됐어요. 선택한 페이지 옵션이 먹지 않은 것이었습니다.
Claude에게 알리니 1분 만에 진단했어요. “미리보기는 페이지 옵션을 ‘사이드바에서 선택한 페이지’로 직접 바꿔야 한다”는 거였죠. 그러고는 더 안정적인 방법으로 직접 처리했습니다. pypdf로 페이지를 잘라내 정확히 41페이지(90~130쪽)만 뽑고, 결과까지 검증했어요.
- 41페이지 / 206,463자 ✓
- 시작: “Chapter 3: Delaying CKD progression…” ✓
- 끝: 항응고제 용량 표 (3장 마지막 부분) ✓
버튼 클릭이 실패해도 AI가 코드로 돌아갈 줄 안다는 게 인상적이었습니다.
💡 GUI 버튼이 말을 안 들으면 AI에게 “코드로 해줘”라고 하세요. 클릭 한 번이 막힌 일도, AI가 다른 길로 돌아가 1분이면 끝냅니다. 결과 검증까지 함께 시키면 더 든든합니다.
6️⃣ AI 사용 규칙 정착 — 개발용 모델 vs 배포용 모델
부트캠프에서 받은 API 사용 규칙이 있었습니다.
- 개발 기간: gpt-4o-mini / text-embedding-3-small
- 배포 기간: gpt-4o / text-embedding-3-large
Claude에게 이미지로 보여주고 “기억해”라고 했더니, 메모리에 영구 저장하고 영향받는 4곳을 한 번에 갱신했어요.
- 시제품 환경설정 (모델 정책 주석)
- 학습카드 01 (개발/배포 비용 16배 비교표)
- 의사결정 메모리 (환경별 분리)
- 로드맵에 Phase 7(운영 전환) 신설
특히 중요한 발견이 있었습니다. 임베딩 모델을 small에서 large로 바꾸면 좌표 개수가 1,536개에서 3,072개로 늘어, 저장소를 새로 만들어야 한다는 점이었어요. Phase 7 절차에 무중단 전환 6단계와 되돌리기 조건 4개까지 정리됐습니다.
💡 “이거 기억해”는 사람보다 AI에게 더 잘 통합니다. 규칙을 한 번 저장시키면, AI가 그 규칙에 걸리는 곳을 알아서 찾아 한꺼번에 고쳐줍니다. 규칙과 코드가 어긋날 일이 줄어듭니다.
7️⃣ 드디어 첫 실행 — 그리고 거절
긴 준비 끝에 시제품을 돌렸습니다. 첫 질문은 이거였어요.
G2 단계 CKD 환자의 단백질 섭취 권장량은?
검색은 완벽했습니다. KDIGO의 단백질 섭취 챕터를 정확히 가져왔고, 조각 안에 “1.0~1.2 g/kg body weight/d” 라는 명백한 권장량이 들어 있었어요.
그런데 AI 답변이 이랬습니다.
“확인된 근거가 없습니다. KDIGO G2 단계에 대한 구체적인 단백질 섭취 권장량은 문서에 명시되어 있지 않습니다. 병원 상담을 권장합니다.”
뭔가 이상했어요. 조각에 답이 있는데 왜 거절하지?
💡 검색이 맞았는데 답이 거절이면, 검색과 답변은 다른 단계라는 뜻입니다. “자료를 찾았다”와 “그 자료로 답한다”는 별개입니다. 어느 쪽이 막혔는지부터 나눠서 봐야 합니다.
8️⃣ 한국어 탓일까? — 영어로 다시 물었다
영어 원문과 한글 질문의 차이는 없는건가?
Claude가 여러 언어를 같은 좌표 공간에 놓는 임베딩의 원리를 설명해줬고, 같은 질문을 영어로 다시 돌렸어요.
- 한국어 질문: 가장 잘 맞은 조각 점수 0.600
- 영어 질문: 가장 잘 맞은 조각 점수 0.737 (Δ +0.137)
확실히 영어가 자국어 매칭에서 앞섰어요. 그런데 영어로 물어도 AI는 똑같이 거절했습니다. 언어 문제가 아니라 다른 원인이 있다는 결정적 단서였죠.
💡 원인을 좁힐 땐 변수 하나만 바꿔서 비교하세요. 언어만 바꿔 돌려보니 “언어는 점수를 올리지만 거절은 그대로”라는 사실이 깔끔하게 드러났습니다. 막연한 추측보다 한 번의 비교 실험이 빠릅니다.
9️⃣ 시스템 프롬프트 의심 — 한 줄 추가하니 거절이 답변으로
Claude와 시스템 프롬프트를 뜯어봤습니다. “범위 안에서만 답하라”는 규칙이 너무 빡빡해서, AI가 명백한 답까지 거절하고 있다는 결론에 닿았어요. 한 줄을 더했습니다.
“KDIGO 권고가 별도 단계 명시 없이 제시된 경우, 모든 CKD 환자(G1~G5)에 적용된다고 해석하세요.”
같은 질문을 다시 돌렸습니다. 결과는 이랬어요.
“G2 단계 환자에 대한 구체적인 단백질 섭취 권장량은 명시되어 있지 않지만, 일반적으로 CKD 환자에게는 0.8 g/kg 체중/일의 단백질 섭취를 유지하는 것이 권장됩니다. 따라서 G2 단계 환자도 이 권장량을 따르는 것이 좋습니다.”
“되긴 됐다.” 거절이 절충 답변으로 바뀌었습니다. 이때까지 저는 문제를 풀었다고 생각했어요.
💡 “되긴 됐다”가 가장 위험한 신호입니다. 막혔던 게 풀리면 거기서 멈추고 싶어집니다. 하지만 풀린 방식이 맞는지는 아직 확인 전입니다. 다음 칸에서 이게 뒤집힙니다.
🔟 청킹 실험 — 한 단계 더 들어가보기
여기서 진짜 의미 있는 실험을 했어요. 강사가 “RAG 차별점의 70%는 인덱싱” 이라고 했는데, 정말 그런지 직접 확인하고 싶었습니다. Claude와 의논해 두 가지를 동시에 돌렸어요.
실험 1: PDF를 마크다운으로 바꿔 섹션 제목(Recommendation 3.3.1.1: ...)을 조각에 같이 남기면 어떻게 될까?
실험 2: 조각 크기를 3배까지(500자 vs 1,500자) 바꾸면 답변 품질이 달라질까?
Claude가 별도 폴더에 두 실험 스크립트를 짰고, 30분 만에 결과가 나왔습니다.
💡 강사의 명제도 직접 데이터로 확인해 보세요. “인덱싱이 70%“라는 말을 믿는 것과, 내 자료로 실증해 본 것은 무게가 다릅니다. AI가 비교 실험을 대신 짜주니 확인 비용이 작습니다.
1️⃣1️⃣ 반전 — AI 거절이 사실은 정답이었다
실험 1 결과는 충격적이었어요. 조각에 제목 정보가 남으니 AI가 이렇게 답했습니다.
“KDIGO 권고는 CKD G3-G5 환자에 대한 단백질 섭취량을 제시하고 있으며, G2 단계에 대한 구체적인 권장량은 포함되어 있지 않습니다.”
이게 정답이었습니다. 그 권고는 실제로 G3-G5 단계가 대상이고, G2는 별도 권고가 없는 게 KDIGO의 의도였어요. 조각이 맥락을 잃었던 게 아니라, 권고 자체가 G2를 안 다뤘던 것이었습니다.
그러자 Claude가 스스로 정리해줬어요.
- 첫 거절 (“확인된 근거가 없습니다”): 너무 보수적이라 생각했는데, 사실은 의료적으로 가장 안전한 답이었습니다.
- 시스템 프롬프트 보강 후 (“G2도 고려할 수 있습니다”): 더 친절하다고 생각했지만, 의료적으로 위험한 추측이었습니다.
- 제목 보존 도입 후 (“G3-G5 대상, G2는 명시 없음”): 제목이 AI에게 정확한 적용 범위를 알려줘서, 추측 없이 사실 그대로 답했습니다.
이건 RAG의 본질을 흔드는 발견이었어요. 의료에서는 AI가 “모른다”고 답하는 게 안전이라는 것. 시스템 프롬프트로 “단계 명시 없으면 모든 환자에 적용”이라고 밀어붙이면, 그게 위험한 추측을 부른다는 것이었습니다.
💡 AI가 거절했다고 곧장 “프롬프트가 빡빡하다”고 결론짓지 마세요. 의료·법률·금융에서는 거절이 정답일 때가 있습니다. 추측을 유도해 답을 짜내는 순간, 가장 위험한 답이 나옵니다.
1️⃣2️⃣ 조각 크기 비교 — 강사 명제의 실증
한편 실험 2(조각 크기 비교)는 흥미로운 결과였어요.
| 조각 크기 | 조각 수 | 가장 잘 맞은 점수 | 답변 특징 |
|---|---|---|---|
| 500 | 518개 | 0.628 | ”건강한 성인과 동일하게 0.8g/kg” — 흐릿한 비교 (위험) |
| 1000 (기준) | 271개 | 0.600 | ”G2 명시 없음, 일반 CKD 권고 따르는 게 좋음” (추측) |
| 1500 | 183개 | 0.592 | ”KDIGO 2022 Diabetes” 출처 오인용 (틀린 출처) |
크기를 3배까지 바꿔도 답변 품질엔 결정적 차이가 없었어요. 오히려 작은 조각은 비교를 흐릿하게 만들고, 큰 조각은 다른 가이드라인까지 끌고 와 출처를 잘못 갖다 붙였습니다.
반면 제목 보존은 결정적이었어요. 정리하면 이렇습니다.
청킹의 핵심은 “글자 수”가 아니라 “구조 인식”이다.
강사가 말한 “RAG 차별점의 70%는 인덱싱” 이 제 데이터로 실증된 순간이었습니다.
💡 튜닝할 손잡이가 여러 개면, 어느 게 진짜 효과인지부터 가르세요. 조각 크기 같은 눈에 띄는 손잡이가 정작 효과가 작고, 잘 안 보이는 구조 보존이 결정적일 수 있습니다. 헛심 쓸 곳과 힘줄 곳이 갈립니다.
✅ 결과 (After)
Before vs After
| 항목 | Before | After |
|---|---|---|
| 강의 자료 이해도 | 4시간 분량이 머릿속에 흩어짐 | 5분 복기용 학습카드 5장 + 팀공유본 1장(1,500줄) |
| 다음 단계 진입 | ”뭐부터 해야 할지 모르겠음” | Phase 0~7 로드맵(824줄) + 노트북 21개 매핑 + 패턴 6개 |
| 시제품 동작 | 0% | 성공 기준 6/6 통과 (자해 가드 부분 통과) |
| 청킹 전략 | ”조각 크기 얼마로?” 추측 | 마크다운 변환 + 제목 보존 + 크기 1000 실증으로 확정 |
| 의료 안전 원칙 | ”AI 거절 = 답답한 문제" | "AI 거절 = 의료적으로 정답” 반전 정착 |
| 메모리 | 38개 | 41개 (오늘 3개 신규) + Phase 2 진입 체크리스트 |
결과물
- 학습카드 6장 + 팀공유본 (약 1,770줄)
- RAG 구축 로드맵 v2.3 (약 900줄)
- Phase 1 시제품 코드 + 실험 스크립트 3개
- 메모리 갱신: 신규 3개(세션 종합·시제품 회고·모델 정책) + 갱신 4개
총 소요 시간: 약 4시간 (메모리 확인부터 회고 작성까지)
💬 이 과정에서 배운 AI 활용 팁
효과적이었던 것
- 강의 자료를 한꺼번에 통째로 넘기기 — 트랜스크립트·교안·노트북을 다 지목하니, Claude가 강사의 강조점과 맥락을 살려 학습카드를 짰습니다. 단순 요약이 아니라 도메인에 맞춘 응축이었어요.
- 결정마다 메모리에 기록하기 — “왜 이 조각 크기로 정했나?” 같은 질문에 바로 답할 근거가 남습니다. 다음 세션에서 0부터 다시 시작하지 않아도 됩니다.
- 실험을 자동 비교로 만들기 — 조각 크기 3가지를 한 스크립트에서 표로 뽑게 했더니 결정 근거가 한눈에 보였습니다. 하나씩 돌려 머릿속으로 비교하는 것보다 훨씬 빨랐어요.
- AI에게 “막혔다”고 말하기 — AI가 의료 질문을 거절했을 때, Claude와 “왜 그럴까?”를 같이 팠습니다. 언어 비교 → 시스템 프롬프트 → 청킹 구조까지 함께 디버깅했어요.
- 시제품은 캐시 모드로 시작 — 매 실행 5~8분이 두 번째부터 1초가 됩니다.
이렇게 하면 안 돼요
- “단계 명시 없으면 모든 환자에 적용” 같은 추측 규칙을 강요하지 마세요 — 의료·법률·금융에서 이런 시스템 프롬프트는 AI가 “확실하지 않은 답”을 짜내게 만듭니다. AI가 “모른다”고 답하는 게 안전입니다.
- AI가 거절했다고 곧장 “프롬프트가 빡빡하다”고 결론짓지 마세요 — 거절이 정답일 수 있습니다. 거절 → 영어 재시도 → 시스템 프롬프트 점검 → 청킹 구조 변경, 이 순서로 의심하세요.
- 조각 크기에 시간 쓰지 마세요 — 500이든 1,500이든 결정적 차이가 없습니다. 그 시간에 PDF를 마크다운으로 바꿔 섹션 제목이 조각에 같이 남게 하세요. 30분이면 효과가 큽니다.
- macOS 미리보기의 “PDF로 저장”이 페이지 선택을 무시할 수 있어요 — 처음부터 코드로 페이지를 잘라내는 게 안전합니다. AI에게 시키면 1분입니다.
🌍 다른 업무에 적용한다면?
법률: 판례·법령 RAG도 같은 원리입니다. 법령이 “전 국민 대상”인지 “특정 업종 대상”인지가 조각 제목에 남아야, AI가 함부로 일반화하지 않습니다.
금융: 약관·규정 RAG. “당좌 1억 미만 대상” 같은 적용 범위가 조각 안에 박혀 있어야 합니다. 시스템 프롬프트로 “범위를 추론하라”고 하면 위험합니다.
사내 정책 챗봇: 인사 규정·복지·휴가를 RAG로 만들 때, “이런 경우도 적용된다”고 AI가 추측하면 곤란합니다. 명시되지 않은 경우는 인사팀 문의로 넘기는 게 안전합니다.
연구 자료 챗봇: 논문 RAG도 비슷합니다. “이 결과는 특정 집단 대상”인데 AI가 “전체에 적용된다”고 일반화하면 사실이 왜곡됩니다.
🚀 앞으로의 계획
오늘은 시제품이 동작한다는 걸 증명한 날이었습니다. 그런데 동작한다고 충분한 건 아니었어요. 거절이 정답이었던 반전이 보여준 것처럼, “되긴 됐다”와 “제대로 됐다” 사이엔 한참 거리가 있었습니다.
다음 편(8편)에서는 이 RAG를 더 똑똑한 방식으로 갈아엎습니다. 청킹 전략을 다시 손보고, 한국 신장학회 가이드라인(국문)을 자료에 더해 한국어 검색 정확도를 끌어올릴 계획입니다. 그 과정에서 “청킹이 정말 필요한가”라는 청킹 무용론까지 한번 따져봤어요. 제목은 「동작한다 ≠ 충분하다 — RAG를 더 똑똑하게 갈아엎고 ‘청킹 무용론’까지 따져본 날」입니다.
그 외 이어질 단계는 이렇습니다.
- 인프라: Qdrant와 관찰성 도구(Langfuse)를 도커 컨테이너에 추가
- 추론 에이전트: 오늘 발견한 “추측 유도 금지” 원칙 그대로 구현. 1393 자살예방·119 응급 같은 한국 특화 안전 가드 추가
- 운영 전환: 개발용 모델(gpt-4o-mini)에서 배포용 모델(gpt-4o)로 무중단 전환
📋 재사용 가능한 프롬프트
프롬프트 1: 강의·세미나 자료를 학습카드로 응축
다음 자료를 우리 프로젝트 도메인에 맞춰 5분 복기용 학습카드로 만들어줘. 강사가 강조한 명제·인용은 보존하고, 추측·요약은 피해. 각 카드는 한 페이지 분량, 우리 결정 사항([[프로젝트 결정 메모리]])과 매핑되도록 구성.
- [전사본 위치]: [트랜스크립트 폴더]
- [교안 위치]: [PDF 폴더]
- [도메인]: [의료 / 법률 / 금융 / …]
- [응축 단위]: 한 카드당 5분 복기 가능 분량
프롬프트 2: AI가 의료 질문을 거절할 때 4단계 디버깅
시제품이 [질문]에 “확인된 근거 없음”으로 거절하는 원인을 다음 4단계로 의심해서 추적해줘.
- 언어 확인: 같은 질문을 영어로 다시 던져 검색 점수 비교
- 시스템 프롬프트 점검: “범위 안에서만” 같은 엄격한 규칙이 답변을 막는지 확인
- 청킹 구조 검증: PDF를 마크다운으로 바꾼 뒤 섹션 제목이 조각에 같이 남는지 확인
- 재해석: 위 3단계 후에도 거절이면, AI 거절이 의료적으로 정답일 가능성 검토. 권고가 실제로 [질문 대상]을 안 다루는지 원문 확인
각 단계마다 결과를 같이 보여주고, 최종 결론을 의료적 안전 관점에서 정리해줘.
프롬프트 3: 청킹 전략 자동 비교 실험
[PDF 파일]을 조각 크기 500/1000/1500 세 가지로 자동 인덱싱하고, [의료 질문] 한 가지로 비교 표를 출력하는 실험 스크립트를 만들어줘.
- 출력 컬럼: 조각 크기, 겹침, 조각 수, 가장 잘 맞은 점수, 토큰 수, 답변 특징
- 추가 검증: 각 크기에서 답변에 “출처 오인용”, “흐릿한 비교” 같은 위험 신호가 있는지 체크
- 한 프로세스에서 여러 번 인덱싱하므로 저장소 잠금 충돌을 방지해줘
프롬프트 4: 결정마다 메모리에 기록
방금 결정한 [결정 내용]을 메모리에 영구 저장해줘. 다음 항목 포함.
- 결정: 무엇으로 정했는가
- Why: 왜 (실증·근거·실측 데이터)
- 적용 방법: 다음 작업 때 어떻게 적용할 것인가
- 영향받는 산출물: 갱신할 코드·문서 목록
- 관련 메모리 링크: [[기존 메모리 이름]]
다음 세션에 바로 컨텍스트로 잡히도록 메모리 인덱스에도 한 줄 추가해줘.
📌 「AI 헬스케어 파이널 프로젝트」 연재 7편입니다. 다음 막에서 또 이어집니다.