Articlefirecrawl.dev·2026년 10월 15일·0

How to Fine-Tune Laya on a Mac with Data from Firecrawl Alexandria

Quick Summary

Firecrawl Alexandria의 개발자 검색 데이터로 Mac에서 미세조정한 Laya는 관련성 정확도가 44.0%에서 68.7%로 높아졌고, Jev보다 정확도는 낮지만 로컬 응답은 빨랐다.

How to Fine-Tune Laya on a Mac with Data from Firecrawl Alexandria 관련 대표 이미지

🖼️ 인포그래픽

How to Fine-Tune Laya on a Mac with Data from Firecrawl Alexandria 내용을 설명하는 본문 이미지

🖼️ 4컷 인포그래픽

How to Fine-Tune Laya on a Mac with Data from Firecrawl Alexandria의 핵심 내용을 4단계로 요약한 인포그래픽
How to Fine-Tune Laya on a Mac with Data from Firecrawl Alexandria 핵심 내용을 4단계로 압축한 4컷 인포그래픽

💡 한 줄 요약

Firecrawl Alexandria의 개발자 검색 데이터로 Mac에서 미세조정한 Laya는 관련성 정확도가 44.0%에서 68.7%로 높아졌고, Jev보다 정확도는 낮지만 로컬 응답은 빨랐다.

📌 핵심 요약

  • Laya는 Convai Innovations의 421M 매개변수 오픈소스 결정 모델로 Apache 2.0 라이선스로 공개되어 있으며, 텍스트를 생성하는 대신 정해진 답변별 확률을 반환한다. TypeSafe의 Jev는 같은 유형의 작업을 클라우드 API로 제공한다.
  • Firecrawl Alexandria를 통해 Developer Index에서 개발자 질문 298개당 검색 결과 10개씩 총 2,980쌍을 약 600크레딧에 수집했다. Claude Opus 5.5가 Batches API로 16분 동안 약 4.25달러에 라벨링했으며, 학습에는 238개 질문의 2,380쌍을, 평가에는 별도 60개 질문의 600쌍을 사용했다.
  • 48GB 메모리의 M5 MacBook Pro에서 Python으로 4에포크 미세조정을 수행하는 데 98.5분이 걸렸고, 최대 메모리 사용량은 21.4GB, 학습 API 비용은 0달러였다. laya 0.4.0의 Mac GPU 학습에는 CPU 텐서와 MPS 연산 관련 충돌이 있으며, 원문은 세 줄 패치로 해결된다고 설명한다.
  • 미세조정 후 Laya의 관련성 정확도는 68.7%, 해결책 포함 여부 정확도는 76.2%였고, Jev는 각각 74.3%, 77.2%였다. 이 작업의 중앙 응답 지연은 Laya가 로컬에서 53ms, Jev가 네트워크를 포함해 263ms였다.
  • 정확도는 사람이 검증하지 않은 Claude 라벨과의 일치율이며, 모든 수치는 단일 실험에서 나왔다. 기본 Laya는 '관련은 있지만 답하지 않는' 결과를 구분하는 데 특히 약했고, 미세조정 후에도 확률 보정으로 과도한 확신이 해소되지 않아 신뢰도 점수를 의사결정 기준으로 쓰기 전 검증이 필요하다.

🧩 주요 포인트

  1. 기본 Laya의 취약점이 '관련은 있지만 답하지 않는' 결과에 집중됨 → 검색 필터의 개선 목표는 주제 일치보다 실제 답변 제공 여부를 구분하는 데 있다.
  2. Laya는 Jev보다 관련성 정확도가 낮지만 53ms의 로컬 응답과 공개 가중치를 제공함 → 선택에는 정확도, 응답 지연, 로컬 실행과 직접 미세조정의 필요성을 함께 반영해야 한다.
  3. 쌍의 평가가 수동 검증되지 않은 Claude 라벨에 의존하고 확률 보정 후에도 과신이 남음 → 보고된 정확도 향상과 신뢰도 점수의 실용적 타당성은 구분해서 판단해야 한다.

🧠 상세 정리

1. 실험의 목표와 핵심 결과

이 글은 코딩 에이전트가 검색 결과를 활용하기 전에 개발자의 질문에 실제로 답하는 자료인지 판별하도록 Laya를 미세조정하는 실험을 소개한다. 기본 Laya의 관련성 정확도는 44.0%였지만 미세조정 후 68.7%로 높아졌으며, 같은 평가에서 Jev는 74.3%를 기록했다. 해결책 포함 여부를 판단하는 정확도는 미세조정한 Laya가 76.2%, Jev가 77.2%였고, 중앙 응답 지연은 각각 로컬 53ms와 네트워크를 포함한 263ms였다. 따라서 이 실험에서는 작은 로컬 모델의 작업별 학습이 정확도를 크게 개선하면서 빠른 응답을 제공했지만, 두 정확도 지표 모두 Jev의 결과에는 미치지 못했다. 다만 수치는 모두 한 번의 실험에서 나온 것이며, 여기서 말하는 정확도는 인간의 판단이 아니라 Claude가 부여한 라벨과 일치한 비율이다.

2. Laya와 Jev의 구조 및 제공 방식

Convai Innovations의 Laya는 421M 매개변수를 가진 오픈소스 결정 모델로, 문장을 생성하는 대신 입력된 텍스트와 고정된 선택지를 바탕으로 각 답변의 확률을 반환한다. 영어 체크포인트는 ModernBERT-large를 기반으로 하며 다운로드 크기는 약 840MB이고, Apache 2.0 라이선스로 GitHub와 Hugging Face에 공개되어 노트북에서 실행하거나 직접 미세조정할 수 있다. TypeSafe의 Jev도 같은 유형의 결정을 수행하지만 가중치는 공개되지 않았고 API로만 제공되며, 모델 크기도 알려져 있지 않다. 원문이 언급한 약 270억 매개변수는 Jev 자체의 크기가 아니라 Jev Decision Index에 있는 강력한 공개 Jev 유사 모델들의 규모다. Laya는 Jev 이후 공개되었지만, 제작자 Nandakishor M은 유사한 확률 기반 결정 모델에 관한 논문을 2025년 3월, 원문 설명상 Jev보다 약 18개월 앞서 발표했다.

3. 공통 요청 형식과 Python·TypeScript 실행

Laya와 Jev는 상태를 담은 state 문자열과 질문 정의를 담은 questions 객체를 사용하는 공통 요청 형태를 지원하므로, 원문 예제에서는 같은 검색 결과와 관련성 질문을 두 모델에 전달한다. 관련성 질문의 선택지는 무관함, 관련 주제이지만 답하지 않음, 직접 답함의 세 단계이며, 두 호출 모두 각 단계의 확률을 담은 answers 객체를 반환한다. Jev 호출은 TypeSafe의 API로 전송되고 Laya는 로컬에서 실행되지만, TypeScript용 laya-ts는 npm에 올라와 있지 않아 Laya 저장소에서 직접 빌드해야 한다. 또한 TypeScript 실행에는 ONNX 형식 모델이 필요하므로, 학습 결과가 저장되는 ckpt/laya-devidx의 모델을 저장소 스크립트로 내보내 예제의 models/finetuned 경로에서 불러오는 과정이 필요하다. README에는 laya-serve가 8000번 포트에서 같은 POST /v1/systemone 엔드포인트를 제공한다고 적혀 있으나, 이 서버는 이번 실험에서 테스트하지 않았다.

4. 평가 데이터와 정확도의 해석

실험에서는 Claude가 JavaScript·TypeScript, Python, Rust, Go와 인프라 분야의 개발자 질문 298개를 작성하고, 각 질문으로 Firecrawl Developer Index를 검색해 결과 10개씩 총 2,980개를 확보했다. Claude Opus 5.5가 모든 질문·결과 쌍을 평가했으며, 238개 질문에 속한 2,380개 결과를 학습에 사용하고 나머지 60개 질문의 600개 결과를 평가용으로 남겼다. 평가용 질문은 학습 과정에서 보지 않은 질문이므로, 같은 질문에 속한 결과를 학습과 평가에 섞는 대신 질문 단위로 분리한 구성이다. 모델은 각 결과에 대해 세 단계의 관련성과 작동하는 해결책의 포함 여부인 has_fix를 판단했으며, 정확도는 Claude의 판정과 일치하는 비율로 계산했다. 그러나 Claude의 라벨을 사람이 직접 확인하지 않았으므로, 이 결과를 인간이 검증한 검색 품질이나 다른 개발자 질문 전반의 성능으로 그대로 해석할 수는 없다.

5. Alexandria와 Developer Index의 데이터 역할

Firecrawl Alexandria는 에이전트와 스크립트가 Firecrawl을 통해 데이터 도구를 발견하고 호출할 수 있는 카탈로그이며, 원문은 1억 1,300만 개가 넘는 색인된 소스를 활용한다고 설명한다. 그중 Developer Index는 코딩 질문을 위해 구축된 Firecrawl 자체 색인으로, GitHub 이슈, 병합된 풀 리퀘스트, README와 문서 페이지를 포함한다. 검색 결과에는 URL, 제목, 일치하는 구절이 제공되어 질문과 결과를 함께 모델에 입력하거나 학습 사례로 구성할 수 있다. Alexandria는 Firecrawl CLI, MCP 서버, 공식 ChatGPT·Claude 플러그인과 언어별 SDK에서 이용할 수 있으며, 이번 실험은 CLI를 통해 검색 데이터를 수집했다. Developer Index는 일일 무키 한도 안에서 API 키 없이도 작동하지만 수천 회 검색은 그 한도를 넘게 되고, 무료 계정에는 1,000크레딧이 제공되며 결과 10개당 2크레딧이 부과된다고 안내한다.

6. 기본 Laya가 실패하는 지점과 미세조정의 목적

미세조정은 이미 학습된 모델에 특정 작업의 라벨이 붙은 사례를 추가로 학습시켜, 기존의 영어·코드 이해 능력을 바탕으로 해당 작업의 판정 기준을 익히게 하는 과정이다. 이번 관련성 평가에서 무작위 추측은 31.0%, 기본 Laya는 44.0%, Jev는 74.3%였으며, 기본 Laya의 주요 약점은 주제가 일치하는 결과와 실제로 답하는 결과를 구분하지 못하는 데 있었다. 평가용 결과 중 '관련은 있지만 답하지 않음'은 295개였고 기본 Laya의 정답률은 20%에 그친 반면, Jev는 60%로 세 배 높았다. 예를 들어 같은 오류를 보고하지만 해결책이 달리지 않은 GitHub 이슈는 검색어와 잘 맞아도 개발자에게 새 정보를 주지 않아, 이를 통과시키는 필터는 추가 스크레이핑을 낭비하고 에이전트의 문맥에 잡음을 더할 수 있다. '직접 답함' 295개에서 기본 Laya와 Jev의 정답률은 각각 68%와 90%였으며, '무관함'은 10개뿐이어서 해당 범주의 비율은 대부분 잡음이라고 원문은 경고한다.

7. 학습 환경과 시간·비용·운영 제약

Laya의 전체 미세조정에는 Python의 laya 패키지, 라벨이 붙은 JSONL 데이터와 GPU가 필요하며, Apple Silicon Mac의 mps, NVIDIA GPU의 cuda 또는 Kaggle의 무료 T4 환경을 사용할 수 있다. CPU만 사용할 때는 --freeze-encoder로 최종 계층만 학습할 수 있지만 개선 폭이 훨씬 작고, TypeScript 패키지는 학습된 모델을 실행할 뿐 학습 자체는 지원하지 않는다. 이번에는 48GB 메모리의 M5 MacBook Pro에서 각 사례를 네 번 학습하는 기본 4에포크를 실행해 98.5분이 걸렸고, 최대 메모리 사용량은 21.4GB였으며 학습 API 비용은 0달러였다. 전체 과정의 별도 비용과 시간으로는 데이터 수집 약 30분·600크레딧, Claude Opus 5.5의 Batches API 라벨링 16분·약 4.25달러, 평가 시 Jev 사용료 약 1.4센트가 제시된다. 원문은 laya 0.4.0에서 'Passed CPU tensor to MPS op' 충돌이 발생하지만 세 줄 패치로 해결된다고 설명하며, GPU가 계속 최대 부하로 작동해 61W 충전기로도 시험 중 배터리가 10% 아래로 떨어졌다고 덧붙인다.

8. 검색 데이터 수집 절차와 제공된 본문의 범위

데이터 수집은 개발자 질문마다 Firecrawl CLI의 firecrawl-developer-index/search를 한 번 호출하고 k를 10으로 지정해 검색 결과 열 개를 받는 방식으로 진행된다. 원문은 Date.now() 때문에 발생하는 Next.js hydration 오류의 수정을 묻는 예를 제시하며, 각 결과에는 issue:owner/repo#123 같은 식별자, URL, 제목과 마크다운 형식의 일치 구절이 포함된다고 설명한다. 제시된 Python 함수는 검색 옵션을 JSON으로 직렬화해 subprocess로 CLI를 실행하고, 표준 출력에서 JSON을 읽은 뒤 data와 alexandria 아래의 results 배열을 반환한다. 전체 수집 스크립트는 여기에 재시도를 더하고 검색 결과마다 질문, 순위, URL, 제목과 구절을 results.jsonl의 한 행으로 저장해 총 2,980쌍을 구성한다. 제공된 본문은 TypeScript에서도 같은 CLI를 사용할 수 있다는 설명 도중 끝나므로, 목차에 나열된 상세 라벨링 방식, 학습 명령, 에포크별 개선치와 확률 보정 절차는 확인할 수 없으며 앞부분에 제시된 결과 수준까지만 파악할 수 있다.

🧾 핵심 주장 / 시사점

  • 검색 필터의 가치는 같은 오류나 라이브러리를 언급하는 자료를 찾는 데서 끝나지 않는다. 이번 기본 Laya의 오류 분포는 실제 답변이 없는 결과를 걸러내는 능력이 별도의 학습 과제임을 보여준다.
  • 미세조정한 Laya와 Jev의 차이는 관련성 정확도에서 5.6%포인트, 해결책 포함 여부 정확도에서 1.0%포인트였다. 같은 실험에서도 판단 항목에 따라 성능 격차가 달라 모델 선택을 하나의 정확도 수치로만 설명하기 어렵다.
  • 분류 정확도의 개선과 출력 확률의 신뢰성은 별개다. 원문에서는 미세조정으로 판정 성능이 높아졌지만 확률 보정 후에도 과신이 남았으므로, 높은 확률을 곧바로 확실한 정답으로 취급할 근거는 부족하다.

✅ 액션 아이템

  • Laya와 Jev의 선택 시 관련성 정확도 68.7%·74.3%와 응답 지연 53ms·263ms를 함께 비교.
  • 보고된 정확도를 활용하기 전, 평가용 600쌍의 Claude 라벨을 사람이 검증하지 않았다는 한계를 반영.
  • 미세조정한 Laya의 신뢰도 점수를 의사결정 기준으로 사용하기 전, 확률 보정 후에도 남은 과도한 확신을 검증.

❓ 열린 질문

  • 평가용 600쌍의 Claude 라벨을 사람이 검증하면 Laya와 Jev의 관련성 정확도 및 성능 격차는 어떻게 달라질까?
  • 관련성 정확도 68.7%와 로컬 응답 53ms를 제공하는 Laya가 Jev보다 적합한 검색 필터의 정확도·응답 지연 요구는 무엇일까?
  • 확률 보정 후에도 과도한 확신이 남은 Laya의 신뢰도 점수를 의사결정 기준으로 쓰려면 어떤 검증 결과가 필요할까?

관련 문서

공통 태그와 주제 흐름을 기준으로 같이 보면 좋은 문서를 이어서 제안합니다.