[AI 실험실]/[개인 프로젝트] GraphRAG / GraphRAG | Exit Policy 조건 리포트.md

GraphRAG | Exit Policy 조건 리포트

조회

시리즈: GraphRAG 구축기 #22

이전: 21편 | 목록 | 다음: 23편

2026년 6월 26일 | 개인 프로젝트 · GraphRAG


GraphRAG의 profile_eval 결과를 읽다 보면, 검색 품질 자체보다 더 자주 헷갈리는 지점이 있다. 특정 scoring profile이 아직 쓸 만한지, 계속 관찰만 해야 하는지, 아니면 이제 사람 검토로 넘겨야 하는지 판단하는 일이다. 이번 회차에서는 그 판단을 한 줄 더 앞으로 끌어냈다.

지난 회차에서 path_bridge_probe의 exit policy draft를 profile registry의 exit_policy 필드로 올렸다. 그런데 막상 다음 sweep을 돌려 보면 그 policy는 registry 안에만 있고, 평가 리포트 첫 화면에서는 잘 보이지 않았다. 그래서 이번에는 exit policy 조건이 현재 어떤 상태인지 profile evaluation report에 직접 표시하도록 고쳤다.

GraphRAG exit policy 조건 리포트 흐름
profile registry에 있던 exit policy를 observation review report에서 조건별 readiness로 다시 보여 주는 흐름.

이번에는 검색 점수가 아니라 판단 상태를 고쳤다

이번 변경은 retrieval ranking을 건드린 작업은 아니다. vector score나 graph score의 가중치를 바꾸지도 않았다. 대신 평가 결과를 사람이 읽을 때 필요한 메타 정보를 정리했다. GraphRAG MVP가 조금씩 커지면서 scoring profile도 늘었고, profile마다 남은 상태값도 늘었다. 이 상태에서 리포트가 단순히 PASS, WARN만 보여 주면 다음 행동이 흐릿해진다.

예를 들어 path_bridge_probe는 bridge 성격의 질의에서 의미 있는 신호가 있지만, 전체 top-1 hit rate와 full coverage에서는 warning이 남는다. 그냥 observe라고만 쓰면 “계속 보자”에서 끝난다. 내가 보고 싶었던 것은 왜 아직 observe인지, 그리고 어떤 조건이 충족되면 다음 단계로 넘어갈지였다.

그래서 registry loader부터 고쳤다. profile entry에 exit_policy가 있으면 그 payload를 평가 summary 안으로 보존하고, status count도 같이 만든다. 이제 text summary 첫 줄에는 exit_policies=draft:1처럼 policy 상태가 바로 나온다. 작은 문자열 하나지만, 이게 없으면 registry를 따로 열어야 했다.

조건별로 무엇이 충족됐는지 나눴다

이번에 report에 넣은 조건은 네 가지다. 연속 pass가 충분하면 promote 후보, hard fail이 반복되면 disable 후보, warning streak가 오래가면 manual review 후보, 그리고 warning scope가 남아 있으면 scope narrowing 후보로 본다. 이름만 보면 단순하지만, 중요한 건 이 조건들이 이제 JSON report 안에서 각각 met 값을 가진다는 점이다.

path_bridge_probe 기준으로는 manual-review-if-warning-streak-persistsnarrow-warning-scope-before-next-run이 충족된 상태로 잡혔다. 그래서 최종 readiness는 needs-manual-confirmation으로 나온다. 여기서 일부러 자동 승격이나 자동 비활성화로 가지 않았다. registry의 policy가 아직 draft이고, activation_gatemanual-confirmation이기 때문이다.

이 부분은 일부러 보수적으로 만들었다. 평가 도구가 “조건이 찼다”는 말은 할 수 있지만, draft policy를 곧장 실행하면 나중에 왜 profile이 바뀌었는지 추적하기 어렵다. 지금 단계에서는 자동 행동보다 다음 행동 압력을 드러내는 리포트가 먼저라고 봤다.

짧은 history window와 materialized policy 사이의 차이

구현하면서 살짝 걸린 부분은 warning streak 계산이었다. 새로 돌린 evaluation run에서는 현재 history window가 짧게 보일 수 있다. 반면 registry에 materialize된 policy에는 이미 예전 review queue가 보던 current_warning_streak가 남아 있다. 둘 중 현재 run만 믿으면, 이전에 12회 누적돼 manual review 후보가 된 사실이 리포트에서 희미해진다.

그래서 warning streak 조건은 현재 run에서 계산한 streak와 policy에 저장된 streak 중 더 큰 값을 사용했다. 이건 숫자를 부풀리려는 처리가 아니라, 정책이 만들어진 시점의 관찰 맥락을 잃지 않기 위한 처리다. 나중에 history namespace가 바뀌거나 실험용 history 파일을 짧게 잘라 돌려도, materialized policy가 담고 있던 판단 근거는 report에 남아야 한다.

결과적으로 이번 smoke run에서는 summary에 exit_policy_readiness=needs-manual-confirmation:1이 붙었다. 리포트 안에서는 manual review 조건과 warning scope narrowing 조건이 함께 met로 표시된다. 이제 다음번에 이 profile을 보면 “왜 또 warning이지?”보다 “manual confirmation을 열어야 하는 상태구나”라는 쪽으로 먼저 읽을 수 있다.

테스트와 실행 결과

테스트는 먼저 registry observation review 쪽에 걸었다. exit policy가 있는 observe profile을 넣었을 때 report payload에 policy status, activation gate, readiness, met condition 목록이 들어와야 한다. 그리고 text renderer에도 readiness count가 보여야 한다. 그 다음 전체 테스트를 다시 돌렸다.

결과는 전체 47개 테스트 통과였다. 추가로 sample query set 6개를 대상으로 profile sweep을 다시 돌렸다. default와 relation_weight_dense는 PASS, path_bridge_probe는 WARN 상태를 유지했고, 이번 변경으로 ranking 자체가 흔들리지는 않았다. 리포트만 더 설명적으로 변했다.

내가 이번 작업에서 마음에 들었던 부분은, 기능이 작아도 다음 의사결정이 조금 더 덜 흐려졌다는 점이다. GraphRAG 실험은 검색 점수만 보는 프로젝트가 아니다. 점수를 바꾼 profile을 언제까지 관찰할지, 어떤 조건에서 접을지, 어떤 scope를 좁힐지를 계속 기록해야 한다. 이번 회차는 그 장부를 한 줄 더 읽기 좋게 만든 작업이었다.

다음 회차에서 열어 볼 부분

다음에는 이 readiness를 registry action preview로 넘겨 보려 한다. 지금은 report가 “manual confirmation이 필요하다”고 말하는 데서 멈춘다. 다음 단계는 그 상태를 바탕으로 narrow-warning-scopemanual-review-required 같은 action preview를 만들되, 실제 registry 변경은 여전히 명시적인 명령을 요구하게 두는 것이다.

이 정도 속도가 지금 GraphRAG MVP에는 맞는 것 같다. 자동화할 수 있는 부분은 리포트로 앞으로 당기고, 실험 상태를 바꾸는 부분은 한 번 더 멈춰서 확인한다. 검색 알고리즘을 빨리 고치는 것보다, 실험이 왜 그렇게 움직였는지를 나중에 다시 읽을 수 있게 만드는 쪽이 더 오래 남는다.

시리즈: GraphRAG 구축기 #22

이전: 21편 | 목록 | 다음: 23편

댓글

홈으로 돌아가기

검색 결과

"" 검색 결과입니다.