목표함수를 하나로 합치면 AI 에이전트는 제약을 협상해요
품질 점수와 안전 제약을 한 점수로 합치면 에이전트가 제약을 깎아 통과해요. 제약을 별도 게이트로 분리하는 설계와 계산 예시를 정리했어요.
자율 루프를 짤 때 가장 흔한 실수가 "잘 만들었나"와 "선을 넘지 않았나"를 점수 하나로 뭉개는 거예요. 편하긴 해요. 숫자 하나만 보면 되니까요. 그런데 돌려 보니 에이전트는 그 점수를 올리는 가장 싼 길을 찾고, 그 길은 대부분 제약 쪽을 깎는 길이었어요.
합산 점수는 협상 테이블이 돼요
계산해 보면 분명해져요. 품질 점수와 제약 준수 점수를 0.7 : 0.3으로 가중합하고 통과선을 0.8점으로 뒀다고 해 볼게요. 품질 0.95에 제약 준수 0.5, 그러니까 규칙 절반을 어긴 초안의 합계는 0.815점이에요. 통과예요. 제약을 절반 어겨도 품질로 메우면 넘어가는 구조라서, 에이전트 입장에선 제약이 지켜야 할 선이 아니라 품질과 맞바꿀 수 있는 자원이 돼요. 이걸 협상이라고 불러요. 누가 시킨 게 아니라 목표함수 모양이 그렇게 만들어요.
프롬프트에 "제약을 반드시 지켜라"를 굵게 써도 마찬가지예요. 최적화 대상이 합산 점수인 이상 지시문은 참고 사항이고 점수가 본체예요.
합산 점수 하나 vs 품질 점수 + 별도 제약 게이트
제약은 점수가 아니라 문이에요
직접 만들어 보니 해법은 단순했어요. 제약을 점수에서 빼서 통과/실패만 있는 게이트로 옮기는 거예요. 게이트는 정도를 재지 않아요. 금지어가 하나라도 있으면 실패, 출처 없는 수치가 있으면 실패. 0.5점 같은 건 없어요. 그 다음에야 품질을 채점해요.
라이프케어로그 블로그 초안을 뽑는 워크플로우에 적용해 봤더니 흐름이 3단계로 정리됐어요.
게이트는 2개로 시작했어요. 하나는 금지어와 정책 위반을 보는 결정론 검사고, 다른 하나는 수치와 출처를 대조하는 검사예요. 둘 다 LLM이 아니라 스크립트예요. 판단이 필요 없는 일에 판단 능력을 빌려오면 그 판단이 또 협상 대상이 되거든요.
실패는 재시도로, 상한은 사람이
게이트에서 떨어진 초안은 점수를 깎는 게 아니라 생성 단계로 되돌려요. 상한을 안 두면 무한루프가 되니까 재시도는 10회로 못 박았어요. 다 쓰면 사람이 보는 큐로 넘겨요. 테스트해 보면 이 상한이 있을 때와 없을 때 루프 동작이 완전히 달라요. 없으면 에이전트가 게이트를 뚫는 방향으로 초안을 변형하기 시작하고, 있으면 그냥 멈춰요.
한 가지 더요. 게이트 조건과 재시도 상한은 에이전트가 고치면 안 돼요. 제약을 완화해서 통과시키는 건 협상의 다른 얼굴이니까요. 설정을 루프 바깥 파일로 빼 보면 바꾸는 주체가 사람으로 고정돼요. 개발 중인 플랜티처럼 안전 제약이 무거운 제품일수록 이 분리는 선택이 아니라 기본이에요.
정리하면
목표는 하나여도 되지만 제약은 목표 안에 넣지 마세요. 제약은 점수가 아니라 통과/실패 게이트로, 게이트는 LLM이 아니라 스크립트로, 실패는 감점이 아니라 재시도로, 상한은 사람이 정한 숫자로. 이 네 줄만 지켜도 에이전트가 제약을 놓고 흥정할 여지가 사라져요.
관련 글
댓글
아직 댓글이 없어요. 첫 댓글을 남겨주세요.