에이전트 하니스(harness)에 대한 구체적인 설명
Concrete explanation of what a harness is
핵심 요약
LLM을 제어하고 도구를 실행하는 루프 구조인 '하니스'의 개념을 간단한 의사코드와 함께 명확히 정의함.
- 하니스 정의 — LLM을 감싸서 예측 가능성과 정확성을 높이는 제어 코드임
- 기본 루프 구조 — 프롬프트 입력, LLM 응답 확인, 도구 호출 및 결과 반영 과정을 반복함
- 산업 표준 계층 — 실행, 도구, 컨텍스트, 라이프사이클, 관측 가능성, 검증, 거버넌스의 7단계로 구성됨
- 생산 환경의 과제 — 단순히 루프를 도는 것을 넘어 작업 완료 여부 확인과 오류 복구가 핵심임
많은 사람이 하니스가 무엇이고 어떤 역할을 하는지 혼란스러워하는 것을 보았고, 추상적이고 모호한 용어로 설명하려는 사람들은 더 많이 보았습니다. 저는 이것을 가장 단순한 구성 요소로 나누어 설명해 보려 합니다.
먼저, LLM은 프롬프트와 도구 정의 세트를 입력으로 받아 텍스트나 도구 호출을 출력하는 프로그램입니다.
도구 정의는 read_file, write_file, run_command 같은 것입니다. 보통 파일 이름과 같은 인자를 받습니다.
에이전트 하니스는 루프를 실행하는 프로그램입니다. LLM에 프롬프트를 보내는 것으로 시작하여 응답을 읽습니다. LLM의 응답이 도구 호출이라면, 그 도구 호출을 실행하고 도구 호출의 결과를 다시 LLM에 프롬프트로 보냅니다. LLM의 응답이 단순히 텍스트라면 루프는 종료됩니다.
가장 기본적인 에이전트 하니스의 의사코드는 다음과 같습니다:
tool_definitions = get_tool_definitions()
prompt = "build claude no mistakes make it good"
context = [tool_definitions, prompt]
while (true) {
response = callLLM(context)
context.append(response)
if (response.is_tool_call()) {
context.append(run_tool(response.tool_call))
} else {
break
}
}
이게 전부입니다. 이것이 Claude Code, OpenCode, Codex 등의 핵심입니다.
물론 실제로는 컨텍스트 관리, 도구 관리, 시스템 프롬프트 관리, 도구 호출 실행 및 검증, 오류 복구, 하위 에이전트 오케스트레이션 등 제가 이해하지 못하는 훨씬 복잡한 작업들이 포함되어 있습니다.
