본문으로 건너뛰기
뒤로가기

[Jev] Jev 실험

Table of contents

Open Table of contents

들어가며

Jev라고 하는 독특한 AI가 나왔다고 하여, wait list 등록을 요청하고 사용 권한을 받아 Jev를 사용해 보고 간단한 테스트를 해 본 경험을 공유합니다.

1. Jev는 무엇인가

공식 문서는 Jev를 소프트웨어가 바로 사용할 수 있는 구조화된 판단을 반환하는 System One 모델로 소개합니다. 자연어를 이해하지만, 설명문이나 코드를 생성하는 대신 정의된 답의 범위에서 판단을 반환합니다. 공식 개념 설명

그래서 일반적인 LLM에 비해 입출력에 소모되는 토큰 비용도 저렴하고(출력은 거의 없다고 보면 될 것 같습니다.) 문자열 토큰을 생성하지 않고 확률을 판단하기 때문에 속도도 정말 빨랐습니다.

Jev는 자연어 입력을 지원하지만, 질문 종류와 가능한 답의 범위를 지정해 요청합니다. Jev가 반환할 수 있는 질문의 종류는 크게 세 가지입니다.

질문 종류역할
Choice주어진 선택지 중 하나를 선택
Score정의한 평가 단계에 따른 점수를 반환
Noul예/아니오 질문에 대한 확률을 반환

사용하는 쪽에서는 state에 판단 자료를 넣고, questions에 질문과 평가 기준을 전달합니다. 판단 이후의 실행은 애플리케이션 코드가 담당합니다. 공식 API 문서

어떻게 보면 일반 LLM에 출력 형식을 제한해둔 것처럼 보일 수도 있는데, 제가 관심을 둔 부분은 결정이 필요한 순간에 Jev가 LLM을 사용하는 것에 비해 얼마나 유용한지 확인해 보는 것이었습니다.

2. 코드 탐색 최적화

저는 첫 실험으로 LLM 에이전트에게 커다란 코드 베이스에서 자연어로 특정 기능이 어디에서 구현되는지 확인하려고 하는 요청을 전달했을 때, 수많은 파일 중에서 필요한 파일을 추려내는 결정을 하기 위해 Jev를 사용할 수 있게 구성을 해 보았습니다.

탐색 대상은 Godot 엔진의 자체 C++ 코드 3,722개 파일이며, 전체 라인은 약 162만 줄 정도 됩니다. Godot 엔진에서 사용하는 외부 라이브러리 코드는 제외했습니다.

tree-sitter 인덱싱 + BM25 검색 + Jev 판단

실험 환경은 다음과 같이 구성했습니다.

그래서 전반적인 실험의 실행 흐름은 다음과 같습니다.

[전처리]
Godot 소스 코드 준비
-> tree-sitter로 선언, 정의 추출
-> 검색용 레코드 목록 저장

[요청 처리]
사용자가 LLM 에이전트에게 질문 전달
-> 에이전트는 BM25로 레코드 점수 계산
-> 상위 50개 심볼 후보 선정
-> (Jev 사용 시) Jev가 상위 50개 항목을 평가
-> 에이전트가 확인할 파일 목록 최종 선정

gpt-6-astra / low를 메인 에이전트로 사용했고, 질문 8개를 조건별로 3회씩 실행해 총 72회를 측정했습니다. 각 실행의 결과로 반환하는 파일 목록이 요구하는 파일 목록과 일치하는지에 따라 평가를 했습니다.

조건평균 시간평균 추정 비용필수 파일 Recall@5
Astra 단독18.92초$0.16581100%
Astra + BM2512.25초$0.18761100%
Astra + BM25 + Jev15.93초$0.21426100%

테스트 결과 모든 조건에서 필수 파일을 상위 5개 목록 안에 반환한 것을 확인할 수 있었습니다.

BM25를 이용해 레코드 목록에서 후보를 찾으면 평균 탐색 시간이 줄었지만 Jev를 추가한 방식에서는 에이전트 단독보다는 빨랐지만, 비용은 가장 높았고, BM25에 비해 느리기까지 했습니다.

이 결과를 보고 생각을 다시 해 봤습니다.

그래서 인덱스를 제외하고 rg 결과를 Jev가 추린 뒤 에이전트가 최종 파일을 선정하는 방식으로 비교를 진행해 봤습니다. 다음은 앞서 실험한 것과 같은 질문 8개를 각 조건별로 1회씩 실행한 결과입니다.

조건평균 시간평균 추정 비용 / 런필수 파일 Recall@10
Astra 단독21.91초$0.25082100%
Jev 래퍼 1회 + Astra27.91초$0.27101100%
Jev 재호출 허용 + Astra24.92초미확정 — 확인된 비용 기준 $0.24922100%

인덱스가 빠진 만큼 전체적인 시간은 늘어났고, 이에 따라 비용도 상승했습니다. Jev를 사용한 경우도 에이전트를 단독으로 사용한 경우에 비해 특별한 이점을 찾을 수 없었습니다.

탐색 테스트에서는 Jev가 기존 에이전트의 작업을 충분히 대체하지 못했다고 볼 수 있겠습니다.

3. 게임 상태에 따른 행동 선택

게임은 인공지능이 처한 상황을 게임 내부에서 관리할 수 있고, 게임 내부에서 수행할 수 있는 행동에도 비교적 명확한 제약이 있습니다.

그래서 게임은 Jev의 판단 자체를 다른 에이전트의 해석 없이 행동으로 이어가고, 상태를 게임에서 관리할 수 있기 때문에 적합한 환경으로 판단했습니다. (공식 소개 페이지에서도 둠을 플레이하는 예제를 보여주었습니다.)

제가 설정한 게임은 사냥으로 골드를 모으고, 강화하거나 아이템을 구매하는 단순한 선택지를 가진 게임입니다.

Jev에게 요청을 전달할 때는 Choice 방식으로 현재 처한 상황과 다음에 어떤 행동을 할지 물어보고, Jev가 선택한 행동을 게임에서 플레이할 수 있게 만들었습니다. Jev는 단순하게 게임이 보내준 상태 정보를 기반으로 목표인 20강 장비를 만들기 위한 ‘선택’만 합니다.

게임 상태와 행동별 효과 → Jev의 선택 → 게임 실행 → 갱신된 상태

3.1 결과와 입출력

어떤 정보를 전달했는가

다음은 입력 구조를 줄여 재구성한 예시입니다. 게임이 계산한 사냥 보상과 소요 시간을 선택지에 넣고, Jev가 다음 행동 하나를 고르게 합니다.

{
  "model": "jev-1.13.0",
  "state": {
    "objective": "장비 20강 달성",
    "location": "outskirts",
    "gold": 0,
    "equipped_level": 0
  },
  "questions": {
    "action": {
      "type": "choice",
      "instructions": "제공된 행동 효과를 비교해 목표를 위한 다음 행동을 선택하라.",
      "criteria": {
        "farm": {
          "description": "적 한 마리를 처치한다.",
          "gold_gain": 6,
          "game_seconds_added": 0.6
        },
        "return": {
          "description": "마을로 돌아간다. 골드를 얻지는 않는다.",
          "gold_gain": 0,
          "game_seconds_added": 0
        }
      }
    }
  }
}

아래는 응답 중 answers 부분입니다.

{
  "answers": {
    "action": {
      "type": "choice",
      "choice": "farm",
      "confidence": 0.94,
      "probabilities": {
        "farm": 0.97,
        "return": 0.03
      }
    }
  }
}

게임은 choice가 현재 허용된 행동인지 검증한 뒤 실행합니다. probabilities는 행동 선택의 분포이고, confidence는 그 분포를 요약한 값입니다. 사냥 성공률이나 판단의 정답률은 아닙니다.

계산은 코드에서, 선택은 Jev에서

처음 Jev에 요청을 보낼 때에는 현재 가지고 있는 아이템 강화 상태, 골드, 강화 비용 등과 같은 상태를 Jev에게 전달하고, 그 값을 기반으로 적절한 선택지를 제공하게 요청을 보냈습니다.

이 경우 마을 <-> 사냥터 사이를 계속 반복해 움직이기만 하는 루프에 빠졌는데, 공식 가이드를 확인해 요청 형식을 다음과 같이 변경했습니다.

그래서 아이템 강화 비용이나 확률, 사냥 시 얻게 되는 보상과 남은 아이템 구매 비용 등 게임 내부에서 계산을 통해 간단하게 구할 수 있는 요소들은 게임에서 계산을 하고, 그 결과와 함께 선택지를 만들어 Jev에게 전달하는 방식으로 요청을 했습니다.

공식 구성 가이드

동일한 v2 설정에서 안전형 규칙 봇과 Jev의 게임 시간 비교. 각 5회 완주했으며 평균은 각각 452.6초와 533.2초입니다.

테스트 결과는 나름 인상적이었습니다. 우선 어떤 행동을 해야 하는지 규칙을 지정하지 않아도, 입력으로 제공한 상태를 바탕으로 최종 목표인 20강 완주에 필요한 선택을 했다는 점입니다.

안전형 규칙 봇은 Jev보다 평균 게임 시간이 짧았습니다. Jev를 이용한 실험에서는 상태와 행동을 제공하는 방식으로 완주에 필요한 선택을 비교적 저렴한 비용으로 테스트했습니다.

더 복잡한 게임 규칙을 가진다면, 규칙 봇보다 Jev 기반 게임 테스팅이 좀 더 유연할 수 있겠다는 생각도 해 보았습니다.

정리하며

두 실험에서 얻은 가설은 다음 판단에 필요한 맥락을 현재 상태로 얼마나 충분히 표현할 수 있는가가 중요하다 는 것입니다. 게임은 상태를 계속 보존하지만, Jev 호출에는 필요한 스냅샷을 매번 제공했습니다. 탐색에서는 무엇을 확인하고 배제했는지까지 별도로 구성해야 했습니다.

참고 자료


이 게시물은 직접 수행한 실험 기록을 바탕으로 LLM의 도움을 받아 작성한 초안입니다.


공유하기:

이전 글
[HEL] Harness: model의 결과를 믿을 수 있게 만드는 구조
다음 글
[C++] Execution 레이어: Work Lane으로 스케줄링 공통화