Univoco, 코딩 에이전트 장애 보강
- •Univoco는 운영 환경에서 검색, 검색 증강, 편집 실패가 나타난 뒤 사내 문서 기반 코딩 에이전트를 보강했다
- •Loop 제어는 반복 조회를 막았고, 한 턴에서 12단계와 170k 입력 토큰이 쓰인 사례도 있었다
- •`lookup_docs`는 생성 없이 밀리초 단위로 실행되지만, `rag_lookup`는 10~30초가 걸리고 내용을 지어낼 수 있다
Univoco 엔지니어 조 버클(Joe Buckle)은 July 31에 사유 문서 레이아웃 엔진용 코드를 작성하는 검색 증강 코딩 에이전트를 팀이 어떻게 보강했는지 공개했다. 이 엔진은 공개 문서가 사실상 없어 공개 인터넷 지식이 도움이 되지 않았고, 에이전트는 비공개 문서 색인과 검색 도구에 의존했다. 이에 따라 검색, 도구 라우팅, 편집 검증이 무너지면 실패가 바로 드러났다.
첫 실패는 문자 그대로의 검색에서 나왔다. 에이전트는 파일 내용에서 `json`을 찾았지만, 해당 용어가 파일명에만 들어 있던 기존 `sampleData.json` 파일을 놓쳤고 이미 있는 파일을 만들겠다고 제안했다. Univoco는 프로젝트 검색에서 파일명도 검색 대상에 포함되도록 바꿨다. 두 번째 검색 실패는 기능을 제거하는 과정에서 나타났다. 관련 객체가 근처 여러 줄에 선언되고 설정돼 있었는데도 에이전트는 일치하는 한 줄만 삭제했다. 이에 `find_in_files`는 grep 방식의 주변 문맥과 자동 변수 footprint를 반환하도록 바뀌었으며, `var box = new Block()` 같은 선언 줄과 같은 변수에 연결된 속성 줄도 포함하게 됐다.
Univoco는 도구를 범용 기본 계층과 고객별 클라이언트 계층으로 나눴다. `list_files`, `read_file`, `find_in_files`, `write_file`, `edit_file`, `apply_edit`, `delete_lines` 같은 기본 도구는 고객 간에 공유된다. 한편 `lookup_docs`, `resolve_topic`, `find_construct`, `check_symbols`, `dry_run` 같은 클라이언트 도구는 고객의 문서와 객체 모델에 의존한다. 클라이언트 도구는 같은 이름의 기본 도구를 가릴 수 있으며, 클라이언트 `find_in_files`는 문자 검색이 실패하면 “block”이나 “the box” 같은 개념어를 엔진의 실제 심볼로 확장한다.
팀은 신뢰성 특성이 달라 두 지식 도구를 분리했다. `lookup_docs`는 임베딩이나 생성 없이 전체 텍스트 문서 검색을 수행하고, 특정 용어를 문자 그대로 포함한 청크를 반환하며, 밀리초 단위로 실행되고 API를 지어낼 수 없다. 반면 `rag_lookup`는 의미 기반 검색과 모델이 작성한 답변을 사용하며, 10~30초가 걸리고 내용을 지어낼 수 있다. 에이전트에는 알려진 심볼 이름 확인은 `lookup_docs`로 사실 검증하고, 더 넓은 “어떻게 만들까” 유형의 질문은 `rag_lookup`를 쓸 수 있다고 지시했다.
가장 큰 Loop 실패는 에이전트가 한 턴에서 같은 지식 조회를 동일 인자로 12번 실행했을 때 발생했다. 결과가 이미 질문했다는 사실을 알려준 뒤에도 반복은 이어졌다. 또 다른 테이블 관련 턴은 12단계와 170k 입력 토큰을 사용했으며, 지식 조회 5번 중 3번은 이미 문맥에 있던 같은 API 이름 3개를 다시 확인했다. Univoco는 5가지 Loop 제어를 추가했다. `_MAX_IDENTICAL_CALLS = 4` 이후 동일 호출 차단, `_MAX_LOOKUPS_PER_TURN = 12`와 `_MAX_LIVE_LOOKUPS = 2`를 포함한 턴별 조회 제한, 결정적 턴 간 쿼리 매칭, 동시 중복에 대한 leader/follower 병합, 프롬프트 조각이 제공된 심볼을 이미 선언한 경우의 예외가 포함됐다.
턴 간 중복 감지기는 임베딩을 쓰지 않는다. 텍스트를 소문자로 바꾸고, 불용어를 제거하며, 이중 자음 축약을 포함한 가벼운 어간 처리를 적용한 뒤 토큰을 정렬한다. 이후 정확한 키 또는 `difflib` 근접 일치를 확인한다. 유사도 기준은 `0.8`이다. 도메인 단어 하나만 다른 실제 쌍은 0.833을 기록했고, `create table`과 `create box`는 약 0.73을 기록했다. 버클은 측정된 간격 덕분에 기준을 신뢰할 수 있었다고 썼다.
예산 시스템도 모델이 11개 심볼을 올바르게 검증하던 중 차단한 뒤 바뀌었다. Univoco는 모든 호출에 비용을 매기는 방식에서 도구별 과금 방식으로 옮겼고, 이에 따라 캐시된 결과와 저비용 도구는 무료가 됐다. 설정에는 `_MAX_LOOKUPS_PER_TURN`이 표현이 달라도 실시간 조회를 제한하지만, 캐시 응답과 저비용 도구는 `projects.budget_tools`를 통해 무료이며 기본값은 `rag_lookup`라고 적혀 있다. 밀리초 단위 `lookup_docs` 사실 확인은 심볼별 성실 검증이지 배급해야 할 비용이 아니라고 원문은 밝혔다.
쿼리 확장은 하나의 사용자 표현 때문에 생긴 재현율 실패를 다뤘다. 조회가 실행되기 전 강제 `search_queries` 도구는 사용자의 질문을 how-to 작업을 위한 2~3개 각도로 다시 만든다. 여기에는 집중된 how-to 쿼리, 핵심 명사나 개념을 쓰는 넓은 키워드 쿼리, 허용될 경우 구체적 예시 쿼리가 포함된다. 단순한 사실 조회만 1개 쿼리를 만들어야 한다. 프롬프트는 질문을 그대로 반복하지 말라고 명시했다. 단어만 섞으면 같은 ‘다시 표현했지만 다시 생각하지 않은’ 문제가 재현되기 때문이다.