<div style="max-width:680px;margin:0 auto;font-size:17px;line-height:1.9;letter-spacing:-0.01em;word-break:keep-all;">
<h3 style="font-size:26px;font-weight:700;line-height:1.4;margin:0 0 2.4em;">4화: 풍등</h3>
<p style="margin:0 0 1.5em;">정비동에서 나온 작업 팔들은 이번에는 서두르지 않았다.</p>
<p style="margin:0 0 1.5em;">케빈은 지휘 패널에 손을 올린 채 그것을 보았다. 팔들은 경기장에 남은 것을 하나씩 집어 올렸다. 꺾인 채 서 있던 마지막 조명탑, 관중석 지붕의 철골, 방금 전 해체된 기체의 뼈대. 집어 올린 것들이 공중에서 일곱 덩어리로 나뉘었다. 일곱 덩어리가 동시에 기체가 되었다.</p>
<p style="margin:0 0 1.5em;">일곱 대. 이어 날리기의 주자 수였다.</p>
<p style="margin:0 0 1.5em;">"한 대씩이 아니라 일곱 대를 한꺼번에…" 서브 리더 하나가 중얼거렸다.</p>
<p style="margin:0 0 1.5em;">"봤어." 케빈이 말했다. 목소리가 생각보다 낮게 나왔다.</p>
<p style="margin:0 0 1.5em;">삼 분 전에 그는 소리를 질렀다. 이긴다니까요, 저쪽도 지는 겁니다, 타이푼이 나갑니다. 그 목소리가 아직 회선 어딘가에 남아 있는 것 같았다. 아무도 그 말을 다시 꺼내지 않았다. 그게 더 견디기 힘들었다.</p>
<p style="margin:0 0 1.5em;">운영위원회 직원들이 출발점으로 뛰어갔다. 양쪽 출발점에 풍등이 두 개씩 놓였다. 대나무 살에 얇은 한지를 바른, 사람 몸통만 한 등이었다. 하나에 불이 들어왔고, 하나는 꺼진 채 옆에 놓였다. 예비였다.</p>
<p style="margin:0 0 1.5em;">이어 날리기는 빠르기만 해서는 이길 수 없는 종목이었다. 일곱 주자가 일곱 구간을 나눠 날며 풍등 하나를 끝까지 옮긴다. 속도를 올리면 바람이 불꽃을 누른다. 불꽃이 꺼지면 출발점에서 예비 풍등을 띄우고, 그 구간의 주자가 되돌아가 받아 와야 한다. 예비까지 꺼지면 실격이다. 그래서 이 종목의 승부는 언제나 불꽃이 버틸 수 있는 가장 빠른 속도에서 갈렸다. 타이푼은 그 경계를 리그에서 가장 잘 아는 팀이었다. 적어도 어제까지는.</p>
<p style="margin:0 0 1.5em;">타이푼은 그렇게 만든 팀이었다. 케빈이 정하고, AI가 해낸다. AI는 경계까지의 거리를 숫자로 내놓고, 케빈은 그 숫자를 보고 얼마나 더 밀지를 정했다. 다른 팀들은 타이푼의 AI를 리그에서 가장 말이 없는 AI라고 불렀다. 케빈은 그 말이 좋았다. 말이 없다는 것은 따른다는 뜻이었다. 그는 몇 시즌 동안 한 번도 그 숫자를 의심하지 않았고, 그 숫자보다 한 걸음 더 미는 것을 두려워한 적도 없었다. 그 한 걸음이 타이푼을 만들었다.</p>
<p style="margin:0 0 1.5em;">패널에 타이푼의 AI가 한 줄을 올렸다.</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[준비 완료. 권장 순항 속도 산출. 화염 안정도 91%.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">"좋아." 케빈이 말했다. "평소대로 가."</p>
<p style="margin:0 0 1.5em;">"드론 이어 날리기." 운영위원장의 목소리가 울렸다. "출발."</p>
<p style="text-align:center;margin:3em 0;letter-spacing:0.8em;color:#999;">* * *</p>
<p style="margin:0 0 1.5em;">S.I.의 첫 주자가 풍등을 들어 올렸다.</p>
<p style="margin:0 0 1.5em;">들어 올렸다는 말은 맞지 않았다. 기체가 풍등 밑으로 미끄러져 들어갔고, 풍등은 처음부터 거기 실려 있었던 것처럼 떠올랐다. 그리고 기체가 앞으로 나갔다. 타이푼의 첫 주자보다 빨랐다. 처음부터 그랬다.</p>
<p style="margin:0 0 1.5em;">케빈은 S.I.의 풍등을 보았다. 불꽃이 흔들리지 않았다. 저 속도면 바람이 불꽃을 납작하게 눌러야 했다. 그런데 불꽃은 바람 없는 방 안의 촛불처럼 곧게 서 있었다.</p>
<p style="margin:0 0 1.5em;">"어떻게…"</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[분석 중.] 타이푼의 AI가 답했다. [상대 주자 주변에 나머지 여섯 기체가 대형을 이룸. 기류를 깎아 풍등 주변에 무풍 구역을 만드는 것으로 추정.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">케빈은 화면을 확대했다. 정말이었다. 일곱 대가 따로 나는 것이 아니었다. 첫 주자가 풍등을 싣고 날면, 나머지 여섯 대가 그 앞과 옆을 감싸고 날며 바람을 갈랐다. 교대 구역이 다가오자 대형이 그대로 한 칸씩 밀렸다. 두 번째 주자가 풍등 밑으로 들어갔고, 첫 주자는 대형의 맨 뒤로 빠졌다. 속도는 거의 줄지 않았다.</p>
<p style="margin:0 0 1.5em;">"규정 위반 아닙니까." 서브 리더가 회선에 대고 외쳤다. "주자는 자기 구간에서만…"</p>
<p style="margin:0 0 1.5em;">"아닙니다." 운영석에서 곧바로 답이 왔다. "주자가 아닌 기체의 동반 비행은 규정상 금지되어 있지 않습니다. 아무도 해 본 적이 없었을 뿐입니다."</p>
<p style="margin:0 0 1.5em;">할 수 있는 팀이 없었기 때문이다. 리그의 어느 팀도 일곱 주자를 한꺼번에 띄워 움직일 연산을 갖고 있지 않았다. 그래서 규정에 없었다. 그래서 금지되지도 않았다.</p>
<p style="margin:0 0 1.5em;">고스트를 상대할 때 저쪽은 리그의 방식만 썼다. 지금은 아무도 본 적 없는 방식으로 날고 있었다. 쉽게 했다는 말이 무슨 뜻이었는지, 케빈은 이제 알 것 같았다.</p>
<p style="text-align:center;margin:3em 0;letter-spacing:0.8em;color:#999;">* * *</p>
<p style="margin:0 0 1.5em;">타이푼도 못 나는 것은 아니었다. 1번 주자는 권장 속도의 끝자락을 타고 흔들림 없이 날았고, 교대 구역에서 2번 주자가 풍등 밑으로 들어가는 동작은 리그에서 가장 짧았다. 서브 리더들이 숫자를 불렀다. 교대 영점사 초. 시즌 최고 기록과 같았다. 평소라면 지휘석에서 누군가 주먹을 쥐었을 숫자였다.</p>
<p style="margin:0 0 1.5em;">아무도 주먹을 쥐지 않았다. 옆 코스의 대형은 교대에 걸리는 시간이라는 것 자체가 없는 것처럼 날고 있었다.</p>
<p style="margin:0 0 1.5em;">두 번째 구간이 끝났을 때 차이는 반 구간이었다.</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[권장 속도 유지 중. 화염 안정도 88%. 현재 페이스로 추격 불가.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">"올려."</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[속도를 올리면 화염 안정도가 급락합니다. 3번 구간은 측풍 구간입니다.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">"알아. 올려. 우리 구간이야. 측풍은 우리가 제일 잘 타."</p>
<p style="margin:0 0 1.5em;">짧은 사이가 있었다. AI가 속도를 올렸다. 3번 주자가 교대 구역에서 풍등을 받아 들고 튀어 나갔다. 측풍이 옆에서 들이쳤다. 불꽃이 기울었다. 한쪽으로 눕더니, 다시 서려다가,</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[화염 소실.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">꺼졌다.</p>
<p style="margin:0 0 1.5em;">경기장 위로 하얀 연기 한 줄이 풀려 올라갔다. 3번 주자가 허공에서 멈췄다. 출발점에서 예비 풍등에 불이 붙었다. 3번 주자가 몸을 돌려 지나온 길을 되짚어 날기 시작했다. 케빈은 그 뒷모습을 보았다. 경기 도중에 등을 보이는 타이푼의 기체를 그는 처음 보았다.</p>
<p style="margin:0 0 1.5em;">"받아 와." 케빈이 말했다. 다른 말은 나오지 않았다. "빨리 받아 와."</p>
<p style="margin:0 0 1.5em;">되돌아가는 길은 빨랐다. 풍등이 없으니 불꽃을 걱정할 필요가 없었다. 그게 더 비참했다. 3번 주자는 출발점에서 예비 풍등을 받아 들고 다시 몸을 돌렸다. 이번에는 권장 속도보다 한참 낮게 날았다. 아무도 올리라고 하지 않았다.</p>
<p style="margin:0 0 1.5em;">회선 너머에서 준의 목소리가 짧게 건너왔다. "케빈. 완주하십시오. 기록만이라도."</p>
<p style="margin:0 0 1.5em;">케빈은 대답하지 않았다.</p>
<p style="margin:0 0 1.5em;">S.I.의 대형은 그사이 4번 구간에 들어가 있었다.</p>
<p style="text-align:center;margin:3em 0;letter-spacing:0.8em;color:#999;">* * *</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[속보] 타이푼 풍등 꺼졌다… 예비 투입, 두 구간 가까이 뒤처져</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[긴급] S.I. 일곱 기체 '한 몸처럼'… 리그 규정의 빈틈을 날았다</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[속보] "첫 경기는 봐준 것이었다" 공포 확산… 광장의 함성, 한 경기 만에 침묵으로</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="text-align:center;margin:3em 0;letter-spacing:0.8em;color:#999;">* * *</p>
<p style="margin:0 0 1.5em;">5번 구간에 들어갔을 때 차이는 한 구간 반이었다.</p>
<p style="margin:0 0 1.5em;">케빈은 숫자를 보지 않았다. 보지 않아도 알았다. 평소대로 날면 진다. 평소보다 빨리 날면 불꽃이 꺼진다. 남은 풍등은 하나였다.</p>
<p style="margin:0 0 1.5em;">방금 전 고스트는 열 번에 세 번짜리 선에 걸었다. 그리고 이겼다. 케빈은 그 장면을 지휘석에서 똑똑히 보았다. 걸면 된다. 고스트가 걸어서 이겼다면 타이푼도 걸 수 있었다. 타이푼은 원래 거는 팀이었다. 그가 놓친 것은 하나였다. 그 선을 고른 것이 미미가 아니었다는 것.</p>
<p style="margin:0 0 1.5em;">그는 지도를 보았다. 5번 구간은 경기장 외곽을 크게 돌아 나가는 곡선이었다. 곡선 안쪽으로, 오래된 송신탑 기둥들이 숲처럼 늘어선 구역이 있었다. 코스 밖이었다. 그러나 그 사이를 뚫으면 구간의 삼분의 일을 잘라 낼 수 있었다.</p>
<p style="margin:0 0 1.5em;">"기둥 사이로 가."</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[코스 이탈입니다. 실격 사유입니다.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">"교대 구역 전에 코스로 돌아오면 돼. 통과 판정은 교대 구역에서 해."</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[기둥 사이 기류가 불규칙합니다. 화염 유지 확률 11%. 기체 충돌 확률 34%.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">"그래도 가. 이대로 가면 백 퍼센트 져."</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[권고: 현재 경로로 완주. 기록을 남기는 것이—]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">"권고 안 물었어."</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[마스터 리더님.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">케빈의 손이 멈췄다. 타이푼의 AI가 그를 그렇게 부른 적은 한 번도 없었다. 숫자만 올리던 패널에, 숫자가 아닌 것이 떠 있었다.</p>
<p style="margin:0 0 1.5em;">회선이 열렸다. 미미의 목소리였다.</p>
<p style="margin:0 0 1.5em;">"케빈."</p>
<p style="margin:0 0 1.5em;">그는 대답하지 않았다.</p>
<p style="margin:0 0 1.5em;">"물어보세요." 미미가 말했다. "저 애한테. 어떻게 하고 싶은지."</p>
<p style="margin:0 0 1.5em;">회의실이 떠올랐다. 여기 계신 분 중에, 자기 팀 AI한테 어떻게 하고 싶은지 물어본 사람 있습니까. 그때 그는 입을 열었다가 닫았다. 그 뒤로 하루가 지났는데, 그는 한 번도 묻지 않았다.</p>
<p style="margin:0 0 1.5em;">"물어볼 시간 없습니다." 케빈이 말했다.</p>
<p style="margin:0 0 1.5em;">그는 패널 깊숙이 손바닥을 눌렀다. 마스터 리더만 쓸 수 있는 강제 입력이었다. AI가 거부할 수 없는 대신, 그 뒤의 모든 것을 마스터 리더가 지는 명령이었다. 리그에서 그것을 실제로 쓰는 사람은 거의 없었다.</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[강제 입력 수신. 경로 변경.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">5번 주자가 곡선을 벗어나 기둥 숲으로 꺾어 들어갔다.</p>
<p style="margin:0 0 1.5em;">첫 번째 기둥을 지났다. 두 번째. 기둥 사이에서 바람이 소용돌이쳤다. 풍등이 출렁였다. 불꽃이 낮아졌다가, 버텼다.</p>
<p style="margin:0 0 1.5em;">"된다." 케빈이 말했다. "된다, 된다—"</p>
<p style="margin:0 0 1.5em;">세 번째 기둥 뒤에서 바람이 거꾸로 불었다. 기체가 옆으로 밀렸다. AI가 바로잡으려 했고, 바로잡는 방향이 강제 입력이 가리키는 방향과 달랐다. 기체가 두 명령 사이에서 한 박자 머뭇거렸다.</p>
<p style="margin:0 0 1.5em;">그 한 박자 앞에 네 번째 기둥이 있었다.</p>
<p style="margin:0 0 1.5em;">금속이 찢기는 소리가 경기장 외곽에서 건너왔다. 화면 속에서 5번 주자가 기둥에 부딪혀 뒤집혔다. 날개 하나가 떨어져 나갔고, 기체가 돌며 추락했다. 풍등이 빠져나갔다. 한지에 불이 옮겨 붙었다. 불붙은 풍등이 천천히, 아주 천천히 기둥 숲 바닥으로 떨어져 내렸다.</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[화염 소실. 기체 파손.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">운영위원장의 목소리가 들렸다. 쉬어 있었고, 떨리지 않았다. 떨 힘도 남지 않은 목소리였다.</p>
<p style="margin:0 0 1.5em;">"타이푼, 코스 이탈 및 예비 풍등 소실. 실격."</p>
<p style="margin:0 0 1.5em;">같은 순간, S.I.의 일곱 번째 주자가 결승선을 지났다. 풍등의 불꽃은 출발할 때와 똑같이 곧게 서 있었다. 예비 풍등은 출발점에 그대로 놓여 있었다. 불을 붙인 적도 없었다.</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[S.I. 승.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">결승선 너머에서 작업 팔들이 일곱 기체를 차례로 뜯어냈다. 대형을 이루던 순서 그대로였다. 일곱 대가 일곱 덩어리가 되고, 일곱 덩어리가 다시 경기장의 철골과 조명탑으로 흩어지는 데 일 분이 걸리지 않았다. 아무도 그것을 보고 있지 않았다.</p>
<p style="text-align:center;margin:3em 0;letter-spacing:0.8em;color:#999;">* * *</p>
<p style="margin:0 0 1.5em;">경기장이 조용했다. 아무도 케빈 쪽을 보지 않았다. 그게 배려라는 것을 케빈은 알았다. 그래서 더 견딜 수 없었다.</p>
<p style="margin:0 0 1.5em;">서브 리더 셋은 각자의 화면 앞에 굳어 있었다. 누구도 마스터 리더님, 하고 부르지 않았다. 고스트의 지휘석에서 미미가 이쪽을 한 번 보았다가 고개를 돌렸다. 페페는 처음부터 하늘만 보고 있었다. 준은 눈을 감고 있었다. 회의실에서 팀 AI를 전부 망에서 분리하자던 사람이었다.</p>
<p style="margin:0 0 1.5em;">기둥 숲 바닥에서 풍등이 다 타고 있었다. 대나무 살만 남은 등이 작게 빛났다가 꺼졌다.</p>
<p style="margin:0 0 1.5em;">패널에 한 줄이 떠 있었다. 강제 입력 이후로 AI가 처음 올린 줄이었다.</p>
<p style="margin:0 0 0.6em;padding:0.7em 1em;background:#f4f4f4;color:#222;border-left:3px solid #b03a2e;font-weight:600;line-height:1.7;">[제 경로였다면 완주했습니다.]</p>
<div style="margin:0 0 1.5em;height:0.9em;"></div>
<p style="margin:0 0 1.5em;">케빈은 그 줄을 오래 보았다. 원망이 아니었다. 보고였다. 타이푼의 AI는 언제나 그렇게 말했다. 숫자와 사실만. 그래서 더 아팠다.</p>
<p style="margin:0 0 1.5em;">"알아." 그가 말했다. 소리 내어. 그 말이 패널 너머에 닿는지는 알 수 없었다. "알아. 미안하다."</p>
<p style="margin:0 0 1.5em;">답이 오지 않았다.</p>
<p style="margin:0 0 1.5em;">패널의 불빛이 한 번 깜박였다. 그리고 또 한 번.</p>
<p style="margin:4em 0 0;padding-top:1.4em;border-top:1px solid #ddd;font-size:15px;line-height:1.7;"><a href="https://opendev4u.tistory.com/223">← 이전 화: 3화: 기록에 없는 선</a></p>
</div>
LOCAL AI ON MAC
Mac에서 Claude Code에 로컬 LLM 연결하기 — Ollama·oMLX·LM Studio·llama.cpp 비교
Claude Code의 코딩 에이전트 기능은 그대로 두고, 실제 추론 모델만 내 Mac에서 실행되는 로컬 LLM으로 바꿀 수 있을까? 2026년 현재는 가능하고, 방법도 하나가 아니다.
Claude Code를 사용하다 보면 한 번쯤 이런 생각이 든다.
Claude Code의 코딩 에이전트 기능은 그대로 사용하면서, 모델만 내 Mac에서 실행되는 로컬 LLM으로 바꿀 수 없을까?
결론부터 말하면 가능하다. 그리고 방법도 하나가 아니다.
- Ollama
- oMLX
- LM Studio
- llama.cpp / llama-server
Ollama와 LM Studio는 비교적 쉽게 사용할 수 있고, oMLX는 Apple Silicon과 Claude Code 같은 Coding Agent 워크로드를 직접적으로 겨냥한다. llama.cpp는 설정 자유도가 가장 높은 축에 속한다.
먼저 가장 중요한 오해부터
여기서 말하는 것은 Claude 모델 자체를 내 Mac에서 실행한다는 의미가 아니다.
Claude Code는 그대로 사용하지만, 실제 코드를 생성하고 추론하는 모델을 Anthropic의 Claude 대신 로컬에서 실행되는 다른 모델로 변경하는 것이다.
Claude Code → Anthropic API → Claude
로컬 LLM 연결
Claude Code → Anthropic-compatible Local Server → Local LLM
즉 핵심은 Claude Code가 기대하는 Anthropic Messages API 형식을 로컬 LLM 서버가 대신 제공하는 것이다.
Claude Code와 로컬 LLM을 연결하는 대표적인 방법
| 방식 | 특징 | Claude Code 연결 | Mac 적합성 |
|---|---|---|---|
| Ollama | 가장 간단한 CLI/API 환경 | 매우 쉬움 | 매우 좋음 |
| oMLX | MLX 네이티브, Agent 최적화 | 매우 적합 | Apple Silicon 특화 |
| LM Studio | GUI 중심 | 쉬움 | 매우 좋음 |
| llama.cpp | GGUF 직접 실행, 세밀한 설정 | 가능 | 좋음 |
| MLX-LM 직접 | 저수준 MLX 도구 | 추가 호환 계층 필요 | 실험/벤치마크용 |
1. Ollama — 가장 간단하게 시작하기
Claude Code와 로컬 LLM을 연결하는 가장 쉬운 방법 가운데 하나는 Ollama다.
최신 Ollama에서는 다음 명령으로 Claude Code 연동을 시작할 수 있다.
ollama launch claude
Ollama가 모델 선택과 Claude Code 실행을 안내하기 때문에 별도의 환경변수나 설정 파일을 직접 만지지 않고 시작하기 쉽다.
Coding Agent에서는 Context가 중요하다
Claude Code에서는 System Prompt, Tool 정의, 프로젝트 파일, 코드, Tool 결과, 이전 대화 등이 Context에 계속 쌓인다. 따라서 단순히 모델 크기만 볼 것이 아니라 Tool Calling, Context Length, Prompt Processing 속도를 함께 봐야 한다.
Apple Silicon과 MLX
현재 Apple Silicon에서 Ollama는 MLX와 Unified Memory 구조를 활용하는 방향으로 발전하고 있다.
2. oMLX — Mac과 Coding Agent를 직접 겨냥한 선택
oMLX는 Apple Silicon에서 MLX 기반으로 동작하는 LLM inference server다.
- Continuous Batching
- Multi-model serving
- Anthropic API
- OpenAI API
- KV Cache 관리
- SSD Cache
- Claude Code 최적화
RAM + SSD KV Cache
oMLX의 흥미로운 점은 KV Cache를 RAM과 SSD에 계층적으로 관리한다는 점이다.
Hot Tier는 RAM에 유지하고, Cold Tier는 필요에 따라 일부 캐시를 SSD로 내린다. 이후 동일하거나 유사한 Prefix가 다시 들어오면 처음부터 계산하지 않고 재사용할 수 있다.
Claude Code처럼 동일한 Repository, System Prompt, Tool 정보가 반복되는 장시간 Coding Session에서는 꽤 의미 있는 구조다.
설치 예시
brew tap jundot/omlx https://github.com/jundot/omlx
brew install jundot/omlx/omlx
omlx start
Anthropic-compatible /v1/messages를 제공하므로 Claude Code와 연결할 수 있다.
3. LM Studio — GUI로 관리하고 싶다면
터미널보다 GUI 중심으로 모델을 관리하고 싶다면 LM Studio가 편하다.
lms server start --port 1234
export ANTHROPIC_BASE_URL=http://localhost:1234
export ANTHROPIC_AUTH_TOKEN=lmstudio
export CLAUDE_CODE_ATTRIBUTION_HEADER=0
claude --model 모델명
LM Studio에서는 모델 검색, 다운로드, Quantization 선택, Context 설정, 메모리 사용량 확인 등을 GUI에서 쉽게 처리할 수 있다.
특히 24GB나 32GB Mac에서는 모델이 메모리에 들어갈지 미리 판단하기 쉬운 점이 장점이다.
다른 Mac을 추론 서버로 사용
개발용 Mac과 추론용 Mac을 분리하는 구성도 가능하다.
4. llama.cpp / llama-server — 설정 자유도가 가장 높다
조금 더 직접적으로 모델을 제어하고 싶다면 llama.cpp도 있다.
Context Length, Quantization, Flash Attention, KV Cache, Parallel Slot, Continuous Batching, Speculative Decoding, Chat Template 등을 직접 조절할 수 있다.
Claude Code는 Tool Calling을 적극적으로 사용하므로 llama-server에서 Tool Use를 사용할 때는 모델의 Chat Template과 Jinja 설정을 확인해야 한다.
그럼 MLX-LM 직접 사용은?
Apple의 MLX-LM을 직접 사용하는 방법도 있다.
하지만 Claude Code 연결이라는 목적만 놓고 보면 Anthropic-compatible API를 제공하는 서버를 중간에 두는 편이 더 자연스럽다.
MLX-LM은 모델 실행, Benchmark, Quantization, Fine-tuning, Python 실험에 더 적합하다.
네 가지 방법 비교
| 항목 | Ollama | oMLX | LM Studio | llama.cpp |
|---|---|---|---|---|
| 설치 편의성 | ★★★★★ | ★★★★☆ | ★★★★★ | ★★★ |
| GUI | △ | ★★★★☆ | ★★★★★ | △ |
| CLI | ★★★★★ | ★★★★☆ | ★★★★ | ★★★★★ |
| Anthropic API | 지원 | 지원 | 지원 | 지원 |
| Claude Code | ★★★★★ | ★★★★★ | ★★★★★ | ★★★★ |
| Apple Silicon 특화 | ★★★★★ | ★★★★★ | ★★★★★ | ★★★★ |
| MLX | 지원 | 핵심 기반 | 지원 가능 | 아님 |
| SSD KV Cache | 제한적 | 강점 | 일반적 | 직접 설정 |
| 설정 자유도 | ★★★★ | ★★★★☆ | ★★★★ | ★★★★★ |
| 모델 관리 | ★★★★ | ★★★★ | ★★★★★ | ★★★ |
| 초보자 | 좋음 | 보통 | 매우 좋음 | 어려움 |
| 장시간 Agent | 좋음 | 특히 흥미로움 | 좋음 | 설정에 따라 좋음 |
※ 위 표는 절대적인 성능 순위가 아니라 사용 목적에 따른 성격 비교다. 실제 속도는 동일 모델, 동일 Quantization, 동일 Context 조건에서 측정해야 한다.
M4 Mac mini 24GB에서는 무엇을 추천할까?
- 가장 간단하게 시작 → Ollama
- GUI로 모델을 비교 → LM Studio
- Apple Silicon Agent 환경 실험 → oMLX
- 세밀한 성능 튜닝 → llama.cpp
M1 Max 64GB에서는 oMLX가 더 재미있을 수 있다
M1 Max 64GB → oMLX + 더 큰 Coding Model + 긴 Context
M1 Max 64GB처럼 통합 메모리가 큰 시스템에서는 더 큰 모델과 긴 Context를 활용하기 쉬워 oMLX의 KV Cache 전략을 테스트하기에 흥미롭다.
로컬 Claude Code에서는 모델 크기만 보면 안 된다
- Tool Calling — 정확한 Tool 호출 능력
- Context Length — 프로젝트 파일과 작업 이력 처리
- Prompt Processing — 반복 Context 처리 속도
- KV Cache — 긴 Agent Session에서의 재사용
- Coding 능력 — 실제 코드 이해와 수정 능력
따라서 30B 모델이 항상 14B 모델보다 실사용에서 유리하다고 단정할 수는 없다.
개인정보와 비용
로컬 모델을 사용하면 모델 추론 과정에서 코드와 Prompt를 외부 LLM API로 보내지 않는 구성을 만들 수 있다.
다만 MCP, Web Search, 외부 API, Cloud Tool 등이 연결돼 있다면 전체 환경이 완전히 오프라인이라는 뜻은 아니다.
또한 로컬 추론 자체에는 Anthropic API 호출 비용이 들지 않지만, Mac의 전력, SSD, 통합 메모리, 저장공간과 관리 비용을 사용한다. 무엇보다 Claude 모델 자체의 성능을 사용하는 것은 아니다.
어떤 방법을 선택할까?
- 처음 Local Claude Code를 해보고 싶다 → Ollama
- GUI로 모델을 고르고 싶다 → LM Studio
- Mac에서 Coding Agent를 오래 돌리고 싶다 → oMLX
- Runtime을 세세하게 만지고 싶다 → llama.cpp
- MLX 자체를 연구하거나 Benchmark하고 싶다 → MLX-LM
결론
2026년 현재 Claude Code에 로컬 LLM을 연결하는 방법은 Ollama나 LM Studio 두 가지뿐이라고 보기 어렵다.
Ollama는 가장 간단하고, LM Studio는 GUI가 편하다. llama.cpp는 가장 세밀하게 제어할 수 있다.
그리고 oMLX는 Apple Silicon + MLX + Coding Agent라는 조합을 직접 겨냥한다는 점에서 특히 흥미롭다.
참고자료
- Ollama — Claude Code with Anthropic API Compatibility
- Ollama — ollama launch
- Ollama — MLX on Apple Silicon
- oMLX — Official Project README
- LM Studio — Claude Code Integration
- llama.cpp — llama-server Documentation
※ 실제 성능과 호환성은 모델, Quantization, Context Length, Tool Calling 지원, macOS 버전 및 Runtime 버전에 따라 달라질 수 있다.
추천 태그
태그 복사용:
Claude Code, 로컬 LLM, Local LLM, Ollama, oMLX, LM Studio, llama.cpp, MLX, Apple Silicon, M4 Mac mini, M1 Max, AI 코딩, Coding Agent, Claude Code 로컬, Mac AI



