MATH · 2026-08-20
로컬 LLM으로 cap set을 찾아보기
FunSearch 방식을 집에서 재현하면 어디까지 되나. LLM은 변이 연산자, 채점기는 적합도.
순수수학에 관심이 있어서 시작한 개인 프로젝트. DeepMind의 FunSearch / AlphaEvolve가 하는 일을 로컬 환경에서 흉내 내 봤다.
아이디어
- 로컬 LLM(Ollama, Qwen2.5-Coder)이 후보 함수를 생성한다
- 채점기가 그 코드를 실행해서 점수를 매긴다
- 점수가 높은 함수를 다시 프롬프트에 넣어 다음 세대를 만든다
LLM은 변이 연산자, 채점기는 적합도 함수. 그러니까 진화 알고리즘인데 돌연변이를 언어모델이 만든다.
채점기를 문제와 분리하기
가장 신경 쓴 설계는 채점기(Scorer)를 추상 인터페이스로 빼낸 것. 엔진에는 특정 문제에 대한 지식이 전혀 없고, problems/에 클래스 파일 하나만 추가하면 레지스트리가 자동 등록한다. cap set에서 검증하고 나서 Florentine Rectangle 같은 조합 설계의 미해결 인스턴스로 그대로 옮길 수 있었던 이유다.
결과
cap set 문제에서 n=5 → 40개, n=6 → 81개 집합을 자동으로 발견했다. 씨앗 함수 대비 유의미한 개선.
배운 것
- LLM이 만든 코드는 믿으면 안 된다. 서브프로세스 + 타임아웃으로 격리하지 않으면 무한루프 하나가 엔진을 죽인다.
- 다양성이 무너지면(국소최적 수렴) temperature를 올리거나 일부러 이상한 씨앗을 섞어야 한다.
- 세대별 체크포인트를 남겨두면 Ctrl-C가 무섭지 않다.