DAG

DAG

DAG(deep acyclic graph)은 평가를 위한 결정적 의사결정 트리를 만들게 해주는 커스텀 메트릭이에요. 복잡한 기준을 작은 결정들로 쪼갠 뒤, 각 결과를 내가 정의한 점수에 매핑해서 G-Eval보다 더 세밀하게 채점을 제어할 수 있어요. 이 글에서는 DAG의 노드 타입과 그래프 구성 규칙을 살펴볼게요.

출처: 문서

본문

개요

DAG(deep acyclic graph)은 평가를 위한 결정적 의사결정 트리를 만들게 해주는 커스텀 메트릭이에요. 각 노드에서 LLM 심판이 하나의 집중된 질문에 답하고, 내가 모든 결과가 무엇을 점수로 받을지 결정해요.

복잡한 기준을 일련의 작은 결정으로 쪼갠 뒤, 그 결정들의 결과를 내가 직접 정의한 점수에 매핑함으로써 G-Eval보다 채점을 더 잘 제어할 수 있어요.

왜 DAG인가요?

G-Eval은 LLM 심판에게 하나의 종합적 판단을 요청하고 점수 생성을 맡겨요. DAG는 그 판단을 단계로 쪼개고 심판에게서 점수 결정권을 가져와요.

  • 결정적 점수 매핑 — 모든 단말(terminal) 결과에 점수를 내가 할당하므로, 같은 결정 경로는 항상 같은 점수를 만들어요.
  • 조건부 규칙과 게이트 — "필수 조건이 실패하면 즉시 실패로 처리하고, 그렇지 않으면 품질 평가를 계속" 같은 기준을 표현할 수 있어요.
  • 집중된 결정 — 각 노드는 한 가지만 판단하므로, 한 번에 모든 걸 저울질하도록 요청하는 것보다 더 신뢰할 수 있어요.

rubric을 규칙으로 쓸 수 있을 때는 DAG를 쓰고, 주관적 품질에 대한 하나의 종합적 판단으로 충분할 때는 G-Eval을 써요.

DAG 노드 타입

노드는 그래프의 한 단계예요. 타입은 세 가지이며, 차이는 노드가 무엇을 만들어 내는지에 있어요. task node는 증거(evidence)를 만들고, 두 판단 노드(judgement node)는 결정을 만들어요.

Task Node (작업 노드)

task node는 테스트 케이스 파라미터나 그 위 task node의 출력을 아래 노드들을 위한 구조화된 증거로 변환해요. LLM에게 결정을 요청하는 대신 어떤 작업을 수행하게 하므로, 절대 점수를 매기지 않고 경로를 끝내지도 않아요.

테스트 케이스에 직접 존재하지 않는 게 결정에 필요할 때 사용해요. 요약이 모든 섹션을 다루는지 판단하는 건 한 단계로 하기 어렵지만, 먼저 섹션 목록을 추출하고 그 목록을 판단하는 건 두 개의 쉬운 단계로 나뉘죠.

instructions (string, required)

노드가 자기에게 주어진 파라미터로 무엇을 해야 하는지. 예: Extract every heading from the actual output.

output_label (string, required)

이 노드의 출력이 아래 노드들에 어떤 이름으로 제시되는지. 예: Extracted headings.

evaluation_params (list)

노드가 읽을 수 있는 테스트 케이스 파라미터. 예: input, actual output, retrieval context.

label (string)

노드의 이름. 점수가 어떻게 나왔는지 검사할 때 표시돼요.

Binary Judgement Node (이진 판단 노드)

binary judgement node는 하나의 예/아니오 질문에 답하고 True 분기 또는 False 분기를 따라가요. 정확히 두 가지 결과를 가지며, 그 이상도 이하도 아니에요.

게이트(gate)를 만들고 싶을 때 손이 가는 노드예요. 누락된 필수 필드, 거절(refusal), 깨진 출력 포맷 등은 품질 질문을 따지기 전에 그 자체로 점수를 결정해야 하는 것들이죠.

criteria (string, required)

심판이 답해야 하는 예/아니오 질문. 예: Are all required headings present?.

evaluation_params (list)

부모 노드에서 내려온 증거에 더해, 노드가 읽을 수 있는 테스트 케이스 파라미터.

label (string)

노드의 이름. 점수가 어떻게 나왔는지 검사할 때 표시돼요.

Non-Binary Judgement Node (비이진 판단 노드)

non-binary judgement node는 주어진 것을 내가 정의한 여러 이름 있는 결과 중 하나로 분류하고, 그 결과에 맞는 분기를 따라가요. 심판은 내 결과 중 하나로만 답할 수 있으므로 분기는 항상 완전하게(exhaustive) 채워져요.

통과/실패가 아니라 등급(grade)을 매기는 판단에 사용해요. binary 노드가 "맞다/아니다"를 강제한다면, non-binary 노드는 Correct order, Partially out of order, Incorrect order를 나누고 각각 다르게 점수 매길 수 있게 해줘요.

criteria (string, required)

심판이 답해야 하는 분류 질문. 예: Classify the ordering of the headings.

evaluation_params (list)

부모 노드에서 내려온 증거에 더해, 노드가 읽을 수 있는 테스트 케이스 파라미터.

label (string)

노드의 이름. 점수가 어떻게 나왔는지 검사할 때 표시돼요.

경로는 어떻게 끝나나요?

DAG에는 단일 종료 노드가 없어요. 판단 노드의 모든 분기는 verdict를 갖고, verdict가 그 지점에서 경로가 멈출지 이어갈지 결정해요.

verdict (boolean | string, required)

이 분기가 속한 결과. binary 판단에서는 True 또는 False, non-binary 판단에서는 이름 있는 결과 중 하나예요.

score (number)

0부터 10까지의 정수로, 경로를 끝내고 메트릭의 점수가 돼요.

then (node | metric)

점수 대신 계속 진행할 노드. 다른 task node, 다른 판단 노드, 또는 G-Eval 같은 완전히 다른 메트릭일 수 있어요.

모든 분기는 score 또는 then 중 정확히 하나를 설정해요. 다른 메트릭으로 이어지는 분기도 경로를 끝내는데, 그 메트릭의 점수가 최종 점수로 채택되기 때문이에요. 다른 노드로 이어지는 분기만 그래프를 계속 진행시키며, 이것이 모든 경로가 점수에서 끝나는 걸 보장해요.

점수를 매기는 대신 메트릭으로 이어가게 하면, 결정적 게이트 뒤에 주관적 판단을 둘 수 있어요. 그래서 응답이 중요한 검사를 통과한 뒤에만 품질 기준으로 채점되도록 할 수 있죠.

그래프 구성하기

노드가 어떻게 맞물리는지를 관장하는 규칙은 세 가지예요.

  • Root node에서 평가가 시작돼요.
  • 노드는 여러 부모를 가질 수 있어요. 두 경로가 같은 증거나 같은 결정을 필요로 한다면, 중복으로 만들지 말고 둘 다 같은 노드를 가리켜요. 그러면 작업이 한 번만 수행돼요.
  • 그래프는 전체적으로 검증돼요. 사이클, 두 분기 중 하나가 빠진 binary 판단, 반복된 결과 이름이 있는 non-binary 판단, score와 then을 둘 다 설정하거나 둘 다 설정하지 않은 분기 등은 모두 거부되므로, 메트릭을 실행하기 전에 모든 결과를 연결해 두어야 해요.

DAG 메트릭 만들기

DAG 메트릭은 작성하는 게 아니라 시각적으로 만들어요. Metrics → Library → Create Metric → DAG로 이동하면 DAG 메트릭 빌더가 열리는데, 여기서 노드를 추가하고 각 노드의 criteria와 파라미터를 설정하고 결과를 연결해요.

그래프는 위에서 아래로 구성해요. 증거를 준비하는 task node를 먼저 추가하고, 그다음 증거를 소비하는 판단 노드를 추가한 뒤, 저장하기 전에 모든 분기에 점수 또는 이어질 노드를 부여하세요.

저장하면 DAG 메트릭은 Confident AI의 다른 메트릭처럼 동작해요. metric collection에 추가해 평가에 사용하면 돼요.

single-turn DAG 메트릭은 single-turn E2E와 component-level 테스트 둘 다에 쓸 수 있고, multi-turn DAG 메트릭은 multi-turn E2E 테스트에 쓸 수 있어요.

더 알아보기