LLM 유도 진화 탐색 엔진
FunSearch·AlphaEvolve 방식을 로컬에서 재구현해 조합론 미해결 문제에 적용한 개인 연구 프로젝트
순수수학에 관심이 있어 시작했습니다. 로컬 LLM(Ollama, Qwen2.5-Coder)을 변이 연산자로, 코드 실행 기반 자동 채점기를 적합도 함수로 쓰는 진화 루프를 처음부터 설계·구현했습니다. LLM이 후보 함수를 생성하고, 채점기가 실행·점수화하고, 우수 함수를 프롬프트에 되먹여 사람이 못 짠 해를 자동으로 찾습니다.
Long story short
핵심 설계는 채점기(Scorer)를 추상 인터페이스로 분리해 엔진과 문제를 완전히 디커플링한 것입니다. 엔진 코드에는 특정 문제 지식이 전혀 없고, problems/ 폴더에 클래스 파일 하나만 추가하면 레지스트리가 자동 등록합니다. 엔진·UI·CLI를 수정하지 않고 새 조합론 문제로 확장되는 플러그인 아키텍처입니다.
LLM이 만든 코드는 신뢰할 수 없으므로 서브프로세스 + 타임아웃으로 샌드박스에 격리했습니다. 무한루프·크래시·예외가 나도 엔진은 죽지 않고 {valid: False}로 처리합니다. 세대별 상태는 JSON 체크포인트로 저장돼 Ctrl-C 후 재실행해도 집단·이력·최고해가 이어집니다.
cap set 벤치마크로 엔진을 검증한 뒤(진화적 개선 확인, n=5 → 40개, n=6 → 81개) 조합 설계(Florentine Rectangle) 미해결 인스턴스로 확장했습니다. 다양성 붕괴(국소최적 수렴)는 temperature 조정과 다양성 주입으로 완화했고, 엔진 로직은 LLM 없이 도는 유닛/통합 테스트로 검증합니다.
한 일
도구
진화 루프 — LLM은 변이 연산자, 채점기는 적합도
DeepMind FunSearch / AlphaEvolve 계열 방법론을 로컬 환경에서 재구현했습니다.
- 로컬 LLM이 후보 함수 생성 → 채점기가 실행·점수화 → 우수 함수를 프롬프트에 되먹임
- Scorer = ABC + registry. 엔진에는 문제 지식 0, problems/에 파일 하나 추가로 확장
- 다양성 붕괴 대응 — temperature 조정 · 다양성 주입
- 세대별 JSON 체크포인트로 중단·재개
실시간 대시보드
백엔드는 엔진을 구동만 하는 얇은 레이어. 1초 폴링으로 탐색 과정을 봅니다.
- 누적 최고 / 세대별 후보 / 유효율 3개 라인, 신기록 갱신 순간 강조
- 이번 세대 LLM 시도 목록 — 무효·새 함수·점수를 한 줄씩
- 현재 최고 함수 코드와 최근 50줄 로그
- 신뢰할 수 없는 코드는 서브프로세스 + 타임아웃 — 크래시가 나도 엔진은 산다
소셜에서 만나요
이호성 — AI Product Builder
