Jev로 에이전트 하네스의 판단 분리하기
정해진 선택지의 반복 판단을 Jev로 분리하고 생성형 LLM·정책 계층과 연결하는 하네스 구조를 살펴봅니다.
무료 공개 · 최근 수정
반복 판단을 하네스에서 분리하기
AI 에이전트(AI Agent)는 상태를 읽고 다음 행동을 정한 뒤 도구의 결과를 다시 관찰하는 과정을 반복합니다. 이 과정에서 요청 분류, 모델 선택, 도구 호출 위험 판정처럼 답의 범위가 정해진 질문도 자주 등장합니다. 작은 판단마다 생성형 대규모 언어 모델(Large Language Model; LLM)을 호출하면 응답 생성 시간과 비용이 전체 실행에 누적됩니다.
에이전트 하네스(Agent Harness)는 모델, 도구, 상태, 실행 정책을 연결하고 통제하는 바깥 실행 구조입니다. LangChain의 Jev 소개 글은 개방형 생성은 LLM에 맡기고, 정해진 선택지 안의 반복 판단은 Jev에 맡기는 구성을 제안합니다.
분리할 대상은 사용자 질문 전체가 아니라 하네스 안의 결정 지점입니다. 개발자가 모델 선택이나 도구 호출 위험 검사처럼 판단할 위치와 출력 형식을 미리 정하고, 그 지점에서 Jev를 호출합니다. 생성형 LLM이 답이나 도구 호출을 제안하는 역할은 그대로 유지합니다. 공식 통합 문서는 모델 라우팅과 도구 실행 전 검사를 서로 다른 미들웨어 훅에 배치합니다.
다음 그림은 이 역할 관계를 단순화한 구성 예시입니다. 모든 단계에서 Jev를 호출해야 한다는 뜻은 아닙니다.
그림: Jev는 정해 둔 판단을 보조하고, 하네스 정책은 다음 작업의 경로와 실행 여부를 정합니다.
실선은 현재 상태와 판단 결과가 다음 작업으로 이어지는 관계를, 점선은 실행 결과가 상태로 돌아오는 흐름을 나타냅니다. 오른쪽 상자는 LLM 생성과 도구 호출을 한 번에 실행한다는 뜻이 아니라, 이번 단계에서 선택한 작업 하나를 나타냅니다. 예를 들어 LLM이 도구 호출을 제안하면 그 제안을 상태에 반영하고, 다음 결정 지점에서 위험과 권한을 검사한 뒤 도구를 실행합니다. 사람이 확인해야 하거나 차단된 작업은 실행으로 넘기지 않습니다.
그림을 읽을 때는 모델의 판단, 하네스의 정책, 실제 실행을 구분해야 합니다.
| 구성 요소 | 맡는 일 | 맡지 않는 일 |
|---|---|---|
| Jev | 미리 정의한 형식의 답과 확률 반환 | 문장 생성, 실행 승인 |
| 생성형 LLM | 열린 추론, 작성, 코드·도구 호출 제안 생성 | 최종 권한 판정, 도구의 실제 실행 |
| 하네스 정책 | 임계값·권한 검사, 경로 선택, 사람 확인·차단·실패 경로 적용 | 모델 출력을 무조건 승인 |
| 실행 계층 | 정책이 허용한 LLM·도구 호출, 결과의 상태 반영 | 권한 검사를 우회한 실행 |
하네스는 Jev의 확률과 신뢰도를 정책에 대입하고, 조건을 충족한 작업만 다음 단계로 넘깁니다. 신뢰도가 낮거나 영향이 큰 작업은 사람의 확인 또는 안전한 기본 경로로 보냅니다. Jev와 생성형 LLM의 출력 자체가 실행 권한을 대신하지는 않습니다.
Jev의 입력과 출력 이해하기
Jev는 TypeSafe AI가 System One 모델이라고 부르는 분류 모델입니다. 텍스트를 이어 쓰는 대신 상태와 질문을 입력받아 미리 정한 형식의 답과 확률을 반환합니다. 이 구조화된 판단은 일반 코드의 조건문과 라우터가 바로 사용할 수 있습니다. TypeSafe AI의 Jev 발표는 이를 구조화되지 않은 상태를 형식화된 확률 판단으로 바꾸는 모델로 설명합니다.
[참고] 시스템 1과 시스템 2
심리학자 대니얼 카너먼은 『생각에 관한 생각』(원제: Thinking, Fast and Slow)에서 빠르고 자동적이며 직관적인 사고를 시스템 1, 느리고 의식적이며 노력이 필요한 사고를 시스템 2라는 두 행위자의 비유로 설명합니다. TypeSafe AI는 이 구분에서 영감을 받아 빠른 구조화 판단 모델을 “System One Model”이라고 이름 붙였습니다. 이는 명칭과 역할을 설명하기 위한 비유이며, Jev가 인간의 인지 체계를 그대로 구현했다는 뜻은 아닙니다.
질문은 세 유형으로 나뉩니다.
| 유형 | 묻는 내용 | 반환값 | 적합한 분기 |
|---|---|---|---|
Noul | 참인가 | 참일 확률 | if로 나뉘는 두 경로 |
Choice | 어느 선택지인가 | 선택값, 선택지별 확률, 신뢰도 | 이름이 정해진 여러 경로 |
Score | 어느 수준인가 | 연속 점수, 단계별 분포, 신뢰도 | 임계값으로 나누는 수준 |
Noul의 0.5는 중간 수준이라는 뜻이 아니라 참과 거짓의 가능성이 비슷하다는 뜻입니다. 단계가 있는 상태는 Score로 표현해야 합니다. 같은 상태에 여러 질문을 담으면 각 질문을 한 요청에서 평가할 수 있습니다. 반환값은 일반 코드의 조건문, 라우터, 정책 검사에서 직접 사용할 수 있습니다.
LangChain에서 분류 호출하기
공식 LangChain 통합은 TypeSafeClassifier를 Runnable로 제공합니다. 다음 예제는 장애 메시지를 상태로 전달하고 긴급 여부와 담당 영역을 함께 묻습니다. 실행에는 Python 3.10 이상, langchain-typesafe 패키지, TypeSafe API 키와 네트워크 연결이 필요합니다.
pip install langchain-typesafe
export TYPESAFE_API_KEY="발급받은_API_키"API 키를 소스 코드나 저장소에 넣지 않습니다. 환경 변수를 준비한 뒤 다음 코드를 실행합니다.
이 문서 작성일 현재 PyPI에 공개된 langchain-typesafe는 0.0.1a3 사전 릴리스입니다. 재현 가능한 환경이 필요하면 버전을 고정하고, 업데이트 전에 변경 이력을 확인합니다.
from langchain_typesafe import Choice, Noul, TypeSafeClassifier
classifier = TypeSafeClassifier()
result = classifier.invoke(
{
"state": "배포 뒤 결제 요청이 실패하고 고객 문의가 급증했습니다.",
"questions": {
"urgent": Noul(
instructions="즉시 대응이 필요한 장애인가?",
),
"owner": Choice(
instructions="어느 영역에서 먼저 확인해야 하는가?",
criteria={
"application": "애플리케이션 코드와 배포 문제",
"billing": "결제 설정과 청구 문제",
},
),
},
}
)
print(result.nouls["urgent"].noul)
print(result.choices["owner"].choice)
print(result.choices["owner"].confidence)출력값은 입력과 서비스 모델 버전에 따라 달라지므로 특정 숫자를 정답으로 가정하지 않습니다. urgent에는 참일 확률이, owner에는 선택한 영역과 신뢰도가 들어갑니다. LangChain TypeSafe 통합 문서는 현재 state와 questions를 모두 invoke()에 전달하도록 안내합니다.
분류 결과를 하네스에서 사용하려면 낮은 신뢰도와 실패 경로를 먼저 정합니다. 다음 함수의 0.8은 구조를 보여 주는 예시일 뿐이며, 운영 임계값은 자체 평가 데이터와 오분류 비용으로 정해야 합니다.
def choose_next_step(result) -> str:
owner = result.choices["owner"]
if owner.confidence < 0.8:
return "human_review"
return f"route:{owner.choice}"
print(choose_next_step(result))신뢰도가 기준보다 낮으면 human_review로 보내고, 기준을 통과하면 route:application 또는 route:billing처럼 정해진 경로를 반환합니다. 실제 하네스에서는 외부 호출 실패와 시간 초과도 같은 기본 경로로 모아야 합니다.
이 예제는 API 자격 증명이 필요한 외부 호출이므로 이 문서 작성 환경에서는 실행하지 않았습니다. 코드의 Python 문법과 현재 공식 API 형태를 확인했으며, 실제 도입 전에는 사용하는 계정과 모델 버전으로 응답 구조를 다시 검증해야 합니다.
하네스에 연결하는 순서
Jev가 잘 맞는 지점은 가능한 답과 후속 코드 경로를 미리 정의할 수 있는 곳입니다. 다음 순서로 연결하면 모델 호출과 실행 정책의 책임이 섞이지 않습니다.
- 결정 지점을 고릅니다. 모델 라우팅, 도구 실행 전 위험 검사, 작업 분배처럼 후속 경로가 정해진 위치가 대상입니다.
Noul,Choice,Score가운데 코드 분기와 맞는 출력 형식을 정합니다.- 하네스의 수명 주기 훅에서 상태와 질문을 Jev에 전달합니다.
- 정책 계층에서 확률·신뢰도·권한을 함께 검사하고 자동 실행, 사람 확인, 차단 또는 기본 경로를 선택합니다.
- 입력, 모델 버전, 판단과 실제 결과를 기록해 임계값과 질문 기준을 다시 평가합니다.
LangChain의 ModelRouterMiddleware와 AutoModeMiddleware는 이런 배치 방식을 보여 주는 실험적 미들웨어입니다. 이 기능을 사용하려면 pip install "langchain-typesafe[experimental]"로 실험적 추가 패키지를 설치해야 합니다. 공식 문서는 실험적 API가 예고 없이 바뀔 수 있으며, AutoModeMiddleware가 사람에게 승인을 요청하는 기능은 아니라고 설명합니다. 사람의 승인이 필요하면 별도의 사람 개입(human-in-the-loop) 흐름을 결합해야 합니다.
하네스에서는 확률을 바로 실행 명령으로 바꾸기보다 정책·라우팅 계층을 명시합니다. 예를 들어 낮은 위험 확률에서는 자동 실행하고, 중간 구간에서는 사람에게 확인을 요청하며, 높은 구간에서는 호출을 차단할 수 있습니다. 임계값은 실제 평가 데이터와 실패 비용을 바탕으로 정해야 합니다.
적용 범위와 한계 구분하기
Jev는 보고서 작성, 코드 생성, 열린 질문의 추론처럼 문자열을 만들어야 하는 작업을 대체하지 않습니다. 가능한 답을 미리 정의하기 어려운 문제는 생성형 LLM이 더 적합합니다. 반대로 결과가 if 문이나 정해진 분기로 이어지는 반복 판단은 Jev와 같은 분류 모델을 검토할 수 있습니다.
TypeSafe AI와 LangChain 글에 나온 속도·비용 개선치는 공급사와 통합 제공자가 발표한 수치입니다. 실제 효과는 입력 길이, 질문 수, 네트워크 위치, 비교 모델과 평가 기준에 따라 달라집니다. 도입 전에는 자체 데이터로 정확도, 보정 상태, 지연 시간, 비용과 오분류 영향을 함께 측정해야 합니다.
상태나 도구 인자에 비밀 정보가 있다면 외부 서비스로 전송해도 되는지 먼저 확인합니다. 분류 호출이 실패하거나 신뢰도가 낮을 때 사용할 기본 경로도 정해야 합니다. 안전에 영향을 주는 결정은 단일 모델의 확률만으로 자동화하지 않고 명시적인 권한 검사와 사람의 판단을 함께 둡니다.
참고 문서
설명이 어렵거나 잘못된 부분을 발견하셨나요?
문서 수정 의견 보내기