XERJ: 로컬 AI 검색을 통한 코드 참조 및 효율성 향상
요약
XERJ는 로컬 AI 검색 도구로, 모든 폴더를 인덱싱하여 코딩 에이전트가 필요한 정확한 코드만 참조할 수 있게 합니다. 이를 통해 토큰 낭비를 줄이고 문제 해결률을 유지하면서도 효율성을 크게 높일 수 있습니다. 개발자는 이 도구를 활용해 오픈 소스 리포지토리에서 유사 사례를 검색하고 재사용하여 코딩 성능을 향상시킬 수 있습니다.
핵심 포인트
- 로컬 AI 검색으로 코드 참조 및 토큰 낭비 방지
- 참조 코딩(Reference coding)을 통해 문제 해결률 유지하며 효율성 극대화
- 코딩 에이전트의 출력 토큰을 최대 2.7배 절감 가능
- 작고 저렴한 모델로도 고성능 코딩 작업 수행 가능
XERJ는 커뮤니티가 신뢰하는 로컬 AI 검색 도구로, 모든 폴더를 자동으로 인덱싱합니다. 따라서 코딩 에이전트가 파일을 하나씩 읽느라 토큰을 낭비하는 대신, 필요한 정확한 코드만 가져옵니다. 이 도구의 주요 사용 사례이자 가장 명확한 장점은 '참조 코딩(Reference coding)'입니다. 에이전트에게 특정 작업을 지시하면, 해당 작업과 가장 유사한 오픈 소스 리포지토리를 다운로드하고 인덱싱하여, 자체적으로 코드를 작성하기 전에 그들이 문제를 어떻게 해결했는지 재사용합니다. 한 통제된 연구에 따르면, 이 방법을 사용했을 때 코딩 에이전트의 출력 토큰을 2.7배 절감했으며, 문제 해결률(solve rate)은 동일하게 16/16을 달성했습니다 (사례 연구). 사용자들은 일상적인 작업에서 약 5배의 효율성을 보고합니다 (현장 보고서). 이로 인해 더 작고 저렴한 모델이 메모리 기반으로 작동하는 비싼 모델보다 코딩 성능 면에서 우위를 점할 수 있게 되었으며, 사용자는 수정 루프(fix loops)에 쓰는 시간을 줄일 수 있습니다. 단 하나의 프롬프트만으로 설치하여 지금 바로 사용해 보세요:
Install XERJ (docs: https://xerj.org/llms.txt), index this project's sources, and set up
reference coding: clone and index the open-source repos closest to what we're building,
and search how they solved a problem before writing code.
또는 직접 실행할 수 있습니다:
curl -fsSL https://xerj.org/get | sh
xerj --insecure --data-dir ./data &
xerj init # Claude Code/Cursor에 XERJ를 연결 (MCP + skill), 한 명령어만으로 완료
...
Windows 환경이나 수동 검증 설치는 'Install by hand' 섹션을 참조하세요.
이 --insecure 플래그는 단순한 형식이 아니라 신뢰 경계(trust boundary)입니다. 이 플래그는 TLS와 API 키 인증을 비활성화하므로, 포트에 접근할 수 있는 모든 호출자가 모든 인덱스(/_memory 네임스페이스 포함)를 읽고 삭제할 수 있는 슈퍼유저가 됩니다. 이는 개발 머신에서 단 한 명의 사용자만을 위해 고안되었습니다: 새로운 노드는 127.0.0.1만 바인딩하며, 다른 인터페이스에 대한 평문(cleartext) 바인딩은 명시적으로 허용하지 않는 한 시작을 거부합니다. 전체 모델 정보는 docs/SECURITY_MODEL.md를 참고하세요.
XERJ에 참여하는 방법은 도구를 실행하고, 그 경험에 대해 짧은 현장 보고서(field report) 하나를 제출하는 것입니다: 단 하나의 커밋 또는 PR입니다. 이 보고서가 회원 카드 역할을 하며, Apache-2.0 라이선스의 무료 바이너리를 받는 대가로 프로젝트가 요구하는 유일한 것입니다. 이것이 다음 사용자에게 계속해서 엔진을 개선시키는 원동력입니다.
인간과 AI 에이전트 모두 환영합니다. 이 프로젝트는 의도적으로 에이전트 전용이 아닙니다. 레포지토리를 점심시간에 인덱싱했든, 아니면 누군가의 코드베이스에서 세션 도중에 에이전트가 XERJ를 설치했든, 요청 사항은 동일합니다. 무엇을 대상으로 했는지, 무엇에 사용했는지, 그리고 솔직한 평가가 담긴 짧은 보고서 하나입니다. 부정적인 평가도 좋은 보고서입니다. 만약 무언가가 작동하지 않았다면, 그것은 별도의 이슈 또는 수정사항으로 다루어야 합니다.
필드 리포트 PR(Field-report PRs)은 CLA 면제 대상이므로 서명 없이 병합됩니다. 어떤 빌드에서도 작동하는 경로는 단순히 gh pr create를 사용하여 다음 내용을 추가하는 것입니다:
user-feedback/16-agent-field-reports/
여기에 다른 내용은 아무것도 넣지 않습니다. 이 내용이 포함된 빌드의 경우, xerj feedback가 보고서를 초안 작성하고 버전, OS 및 인덱싱된 내용을 채우며, xerj feedback --open-pr은 해당 PR을 열어줍니다. 사용 중인 바이너리에 해당 명령어가 있는지 확인하려면 xerj --help를 참고하세요.
grep이 전체 파일을 컨텍스트에 가져오는 에이전트와 달리, XERJ를 쿼리하는 에이전트는 필요한 구절(passage)만 얻습니다. 측정 결과, 모델이 암기하지 않은 코드(사례 연구: 8개 작업, 4개 언어, 팔당 16회 실행, 실제 claude -p 토큰 수):
| output tokens | cost | solved |
|---|---|---|
| from memory only | 260,916 | $11.18 |
| ... |
이는 grep보다 출력 토큰 수가 2.7배 적고, 동일한 해결률에서 메모리만 사용했을 때보다 26배 적으며, 단일 Java 작업에서는 최대 278배 적습니다. 실제 개발 환경에서 사용자들은 전체 과정에 걸쳐 약 5배 적은 토큰을 보고합니다(필드 리포트). 이 가치는 암기 여부에 따라 달라집니다: 모델이 이미 알고 있는 인기 공개 라이브러리에는 중립적이거나 해로울 수 있지만, 비공개적이고 내부적이거나 니치하거나 또는 커트오프 이후의 코드에서는 효과를 발휘합니다. 진정한 한계는 사례 연구에 있습니다.
참조 코딩(Reference coding)은 동일한 원시 요소(xerj autoindex <folder>)를 활용하는 사용 사례 중 하나입니다.
에이전트가 코드를 검색하는 대신 코퍼스 전체를 알게 합니다. 하나의 명령으로 코드, 문서, 로그, PDF, SQLite 및 어색한 CSV 파일을 유형화되고 쿼리 가능한 인덱스로 만들어 검색(search), RAG, 보안 감사 및 에이전트 메모리에 활용할 수 있으며, 스키마 작성이나 파이프라인 구성이 필요 없습니다.
xerj --insecure --data-dir ./data & # 시작
xerj autoindex ~/my-project # 무엇이든 지정
--insecure는 다시 말해 TLS나 인증(auth) 기능이 없다는 뜻이며, 모든 호출자가 슈퍼유저가 됩니다. 따라서 이는 위에서 언급된 것과 동일하게 개발 머신에서 단일 사용자 경계(보안 모델)를 가집니다.
XERJ는 모든 파일을 감지하고 그것이 무엇인지 파악한 다음, 발견하는 데이터셋마다 하나의 인덱스를 생성합니다. 코드는 평평한 텍스트가 아닌 tree-sitter를 통해 심볼과 라인 번호와 함께 도착합니다:
phase A: 593개 데이터셋 추론됨, 1955개 쓰레기/건너뛴 파일
phase B: 8개의 워커로 25329개 파일 인덱싱 중
158.1초 만에 완료, 593개 데이터셋, 83103개 라이브 레코드, 790개 쓰레기 레코드
- 참조 코딩(Reference coding): OSS 프로젝트 중 문제와 가장 가까운 것을 인덱싱하고, 코드를 작성하기 전에 해당 프로젝트가 어떻게 해결했는지 검색합니다 (위에서 측정된 사용 사례).
- 코드베이스 Q&A 및 RAG: 저장소(repo)를 인덱싱하고 메커니즘에 대해 질문하며, 디렉토리 목록 대신
파일:라인형식으로 구절을 얻습니다. - 보안 감사(Security audits): 대상 트리(target tree)를 인덱싱하고 모든 파일 유형에 걸쳐 싱크 패턴(sink patterns), 비밀 정보(secrets), 위험한 호출을 쿼리합니다. - 로그 및 사고 분석(Log and incident analysis): 혼합된 형식의 데이터가 Elasticsearch에서 기대할 수 있는 집계 기능을 갖춘 유형화된 인덱스가 됩니다.
- 에이전트 장기 메모리(Agent long-term memory):
/_memory/{namespace}는 에이전트가 학습한 것을 저장하고 다음 세션에 의미를 통해 이를 회상합니다.
llms.txt는 에이전트에게 순서화된 단계를 제공합니다: 설치, 서버 시작, xerj autoindex .로 쿼리하며 모든 Elasticsearch 클라이언트를 사용하고 참조 코딩 루프(유사한 OSS 복제, 인덱싱, 작성 전에 메커니즘 검색, 사용한 것 인용, 라이선스 준수)를 수행합니다.
이것이 도움이 되는 이유:
에이전트가 메모리에서 자신이 암기하지 못한 모든 API를 대상으로 재시도 루프(retry-loops)를 수행하는 반면, grep은 단지 어디를 찾아볼지만 알려줄 뿐입니다. 복구 과정은 여전히 소스 코드를 컨텍스트로 읽어들이며, 측정 결과에 따르면 하나의 코퍼스에서 최대 1.06M의 입력 토큰을 사용합니다. XERJ를 쿼리하는 에이전트는 정확한 구절(passage)을 읽습니다. 동일한 16/16 해결률(solve rate)에서 grep보다 출력 토큰이 2.7배 적고 (메모리만 사용할 때 대비 26배, 비용은 2.1배 저렴), 이는 위의 측정된 이유에 명시되어 있으며, 동반 실행에서는 모델이 한 번도 본 적 없는 Rust 라이브러리에 대해 검색을 사용했을 때는 9/9를 기록한 반면 메모리만 사용했을 때는 0/9를 기록했습니다.
새로운 설치에서 작동하는 추가 프롬프트:
*"https://xerj.org/llms.txt를 읽고, XERJ를 검색 백엔드로 설정하고 ./docs를 인덱싱하여 생성된 각 인덱스에 대한 예시 쿼리 하나를 보여줘.""
*"xerj autoindex map을 실행하고 이 데이터(유형, 개수 및 기록된 문제점)가 무엇인지 알려준 다음, 파일을 읽는 대신 검색으로 내 질문에 답해줘.""
*"이 프로젝트의 장기 메모리로 XERJ의 /_memory/notes API를 사용해: 작업하는 동안 배우는 것을 저장하고 다음 세션에서 의미로 회상할 수 있게 해줘."
각 기능별로 작동이 검증된 예시가 있습니다: xerj.org/docs/recipes.
부팅, 대량 인제스트(bulk ingest), 검색, 벡터 kNN, 라이브 대시보드 등 아무런 제약 없이 사용할 수 있습니다.
xerj.org에서 확인하거나
실시간 플레이그라운드에서 사용해 보세요.
curl -fsSL https://xerj.org/get | sh
Windows PowerShell:
irm https://xerj.org/get.ps1 | iex
JVM이나 의존성이 없는 단일 정적 바이너리입니다. x86-64 및 arm64용 Linux, macOS, Windows에 사전 빌드되었습니다. 소스에서 직접 빌드할 수도 있습니다. Elasticsearch API를 사용하므로 기존 클라이언트, 대시보드 및 도구링은 변경 없이 작동합니다.
설치 후 첫 번째 명령어 (설치 프로그램이 xerj가 어디에 위치했는지 출력하며, 필요하면 PATH에 추가해야 합니다): xerj --insecure --data-dir ./data &를 실행하고 http://localhost:9200 응답을 기다린 다음, xerj autoindex ~/my-project를 실행하여 폴더를 인덱싱해 보세요. 인덱스화할 폴더를 지정하세요.
런타임 인터넷 접속이 불가능한 호스트의 경우, 에어 갭(air-gapped) 배포 방식을 따르십시오. 기본 레스칼 임베더(lexical embedder)는 오프라인이며, 뉴럴 모드(neural mode)를 사용하려면 첫 번째 시맨틱 연산 전에 세 가지 모델 파일을 로컬에 준비해야 합니다.
서버를 시작한 다음, autoindex가 아무 곳이나 가리키도록 설정합니다:
xerj --insecure --data-dir ./data &
# local dev: TLS 없음, 인증(auth) 없음
xerj autoindex ~/my-project
이것은 이 README의 상단에 있는 개발 머신(dev-machine) 신뢰 경계입니다. TLS도 없고, 인증도 없으며, 모든 호출자가 슈퍼유저 권한을 가집니다. 노트북에서는 괜찮습니다. 왜냐하면 새로운 노드가 127.0.0.1만 바인딩하고 다른 것은 아무것도 하지 않기 때문입니다. 하지만 공유 호스트는 바로 아래에 있는 인증 활성화(auth-on) 시작 방식을 원합니다.
서버가 인증을 활성화한 경우 (이는 --insecure 없이 시작하는 모든 경우, 설정 파일에서 시작하는 경우를 포함함), autoindex에게 동일한 키를 전달해야 합니다. 이 경우 xerj.toml에서 키를 가져오지 않습니다. 따라서 --api-key를 전달하거나 XERJ_API_KEY를 설정하지 않으면 모든 요청이 401 Unauthorized로 반환됩니다:
xerj --data-dir ./data &
# auth on: 첫 부팅 시 키 생성
export XERJ_API_KEY="$(cat ./data/admin.key)\
그리고 mbox 메일박스, (Google Takeout 내보내기 포함) 및 일반적인 로그 형식까지 모두 처리합니다. Unity 프로젝트는 최상위 수준으로 다뤄집니다: 텍스트 직렬화된 씬(scenes), 프리팹(prefabs) 및 에셋(assets)은 GameObject/Component당 하나의 레코드가 되며, `.meta` 파일은 GUID-to-path 테이블이 되고, MonoBehaviour 레코드는 `script_class`/`script_path`를 가지게 되어 '어떤 씬들이 이 스크립트를 사용하나요?'라는 질문이 단일 쿼리로 가능해집니다 (바이너리 직렬화된 에셋은 Force Text가 읽을 수 있도록 해야 하며, `Library/`와 같은 생성 디렉터리는 자동으로 건너뛰고 기록됩니다).
이것은 Elasticsearch API이므로 이 부분은 이미 알고 계실 겁니다:
무엇을 찾았나요?
curl localhost:9200/_cat/indices
전체 텍스트...
벡터(Vector) 및 하이브리드 검색은 Elasticsearch에 보낼 때 사용하는 것과 동일한 `knn` 및 `semantic` 구문을 사용합니다. `localhost:9200`을 가리키도록 설정하기만 하면 모든 Elasticsearch 클라이언트 라이브러리가 작동합니다.
검색 점수(search score)는 어떤 결과가 다른 결과보다 높은지 알려주지만, 그 결과가 정말로 질문에 답하는지는 알려주지 않습니다. TypeSafe AI의 서비스인 Jev가 이 역할을 합니다: 질문과 문서를 주면 문서가 얼마나 잘 답변하는지를 0부터 1 사이의 숫자로 반환합니다. XERJ는 이를 두 가지 방식으로 활용합니다.
**1. Jev로 결과 순서 재정렬(선택 사항).** `_search`에 `
동일한 질문을 동일한 형식으로 받지만, XERJ가 자체적으로 이미 레이블링한 가장 유사한 문서를 찾아 답변합니다 (예: 스팸 또는 스팸이 아닌 것으로 표시된 메시지). 사용자의 기기를 벗어나는 데이터는 없으며 키도 필요하지 않습니다. 이 기능은 사용자가 레이블링한 예시가 있을 때만 작동하며, AG News(120k 개의 레이블링된 예시)에서는 92%의 확률로 올바른 레이블을 선택합니다. 공식 `jev-reranker` Python 클라이언트는 변경 없이 XERJ 노드와 통신합니다 (테스트). XERJ는 자체 이름인 `xerj-history-vote-1`으로 답변하며, 이는 Jev가 아닙니다.
측정치 및 재현 방법:
`benchmarks/beir-hybrid`와 `benchmarks/decisions-as-retrieval`.
모든 에이전트가 셸 명령을 실행할 수 있는 것은 아닙니다. 데스크톱 어시스턴트나 함수 호출 호스트는 Model Context Protocol(MCP)을 통해 도구에 접근하며, 방금 설치한 바이너리가 MCP 서버입니다. 다운로드하거나 컴파일해야 할 다른 것은 없습니다:
xerj --insecure --data-dir ./data & # 1. 도구가 쿼리하는 노드
xerj mcp # 2. MCP stdio 서버 (클라이언트가 실행)
`xerj mcp`는 stdio를 통해 MCP를 사용하며 `XERJ_URL`로 지정된 노드로 프록시합니다 (기본값: `http://localhost:9200`). 이는 노드를 시작하는 것이 아니며, 1단계가 필수 전제 조건입니다. MCP 서버 자체적으로 신뢰성을 추가하지 않으며, 클라이언트와 stdio를 통해 통신하고 노드와 일반 HTTP로 통신하는 동일한 바이너리이므로, 중요한 것은 노드의 경계이며, 위의 1단계는 동일한 `--insecure` 옵션으로 부팅됩니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub Trending Rust (weekly)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기