리눅스 커널 API가 변경되면 수백 개의 드라이버가 몇 달에 걸쳐 수동으로 변환되며, 이전의 변환 사례들은 이후 변환을 위한 검토된 예시로 사용됩니다. 우리는 노트북에서 실행되는 소형 오픈 언어 모델이 이러한 예시들을 Coccinelle 의미론적 패치(semantic patches)로 변환할 수 있는지 질문합니다. 이 패치는 커널 유지 관리자들이 트리를 전체적으로 변경하는 데 이미 사용하는 규칙입니다.
우리는 이 작업에 맞게 유도 코드 생성(guided code generation)을 적용합니다: 학습 예제들은 스크립트를 통해 변경 변형의 트리로 분해되며, 모델은 예제들에 이를 적용한 피드백 하에 변형당 하나의 작은 규칙을 작성합니다. 결정론적 구성 요소(deterministic components)는 SmPL 구문을 수정하고 드라이버별 이름을 일반화하며, 규칙들은 탐욕적으로(greedily) 조합되고, 컴파일 비평가(compile critic)는 출력이 빌드되지 않는 규칙을 수리하거나 거부합니다.
우리는 세 모델(Qwen2.5-Coder 7B, Llama 3.1 8B, Gemma 3 4B)의 학습 차단 시점 이후에 새로운 API가 등장한 7개의 마이그레이션에 대한 사전 등록된 테스트 세트를 사용하여 평가했으며, 122개의 보류 드라이버 변환을 포함했습니다. 변환은 규칙의 출력이 인간의 수정 사항과 일치하고 컴파일될 때만 해결된 것으로 간주됩니다.
이 프레임워크를 사용했을 때, Qwen2.5-Coder는 세 개의 시드(seed)에 걸쳐 평균 35.3개의 변환을 해결했으며 (범위 32-41), 직접 프롬프트할 경우 1.0개였습니다. Spinfer는 41개를 해결했고, 최신 LLM 에이전트는 66개를 해결했습니다.
로컬 모델은 Spinfer보다 적은 수의 변환을 해결했지만, 테스트 세트에서 가장 정확한 규칙을 보여주었습니다 (변경하는 파일 중 0.74개가 해결됨, Spinfer는 0.55개, 최신 에이전트는 0.70개). 또한 컴파일 비평가는 인간의 수정 사항과 일치하지만 빌드되지 않는 모든 출력을 제거합니다. 두 범용 모델은 가이드가 제공되더라도 여전히 성능이 약했습니다 (최대 12개 해결).
모든 코드, 프롬프트, 모델 응답 및 결과는 공개되었습니다.