AI

회사에서 계속 반복적인 프로젝트를 하면서 내가 더 이상 이 회사에서 무엇을 할 수 있을까. 좀 복잡한 기획을 개발해야 하는데 상태와 검증 조건이 좀 복잡했기 때문에 일주일 동안은 기능 개발에 매달려 있어야겠다고 생각했다. 동료로부터 추천받은 cursor(요즘 cursor가 개쩐데요.)가 폼이 좋다는 말을 듣고, 시험 삼아 AI 에이전트에게 admin의 ui 형태와 내가 사용하고자 하는 상태, 그리고 원하는 구조를 설명하고 validation 조건 등을 입력하고 코드를 작성해달라고 했다. 그런데 너무 짧은 시간에 며칠은 걸리겠다 싶었던 기능을 몇 시간 안에 완성되는 것을 실시간으로 보게 되었다. 생각치 않았던 성능에 놀라웠다. 동시에 ‘이전에 아무도 시도하지 못했던걸 서비스 런칭 전에 시도할 수 있겠다.‘라는 생각이 들었다. 나는 AI를 100년 묶은 레거시를 개선하거나 SI 프로젝트를 딸깍으로 배포할 수 있는 자동화를 만들거나, 의존성이 없는 파일을 찾아 대량으로 삭제하거나, 반복되는 작업을 자동화하는데 많이 썼고, 예전이라면 엄두도 내지 못했을 개발을 더 잘하기 위한 개발 툴도 만들어서 활용하고 있으며(레포트를 테스트 하기 위해서 실제로 DB에 몇백건의 데이터를 만드는 도구 같은 거) 테스트를 같은 시간에 더 많이 쓸 수 있게 되었다.

일년 후 어느 날, 내가 간단한 코드 수정조차 에이전트에게 수정하라고 명령하고 있다는 것을 깨달았다. AI를 잘 쓰기 위한 방안을 팀에 적극적으로 전파하려고 하고 있고, AI를 잘 쓰기 위한 방법을 계속 보고 연구하고 skill을 다듬고, 팀 코드 컨벤션을 AI에 넣으려는 노력을 하고 있지만, 나는 간단한 코드조차 손으로 작성하고 있지 않았다. 심지어 디버깅도 AI에게 분석 후 내가 눈으로 볼 수 있는 포인트를 찾으라고 시킨다. 나는 쓰기를 잃어버렸다. ‘어쩌면 나는 생각하고자 하는 의지를 잃어버린 것은 아닐까.‘하는 생각을 한다. 스스로 문제를 찾아 발견하는 수고를 하고 싶지 않아, 분석 도구를 사용해 성능상 문제가 무엇인지 찾기는 하지만 분석은 AI에게 맡기고 나는 그저 레포트를 받아보고 승인만 하고 있다. 그럼 앞으로 나는 어떤 선택을 해야 할까?

AI 사용 방법을 제한을 두지 않고 익히는 것과 개발 공부를 흥미 위주로 하고 있다. 우연치 않게 엉망진창 세상에서 파이(π)를 구축하기 — 마리오 제크너라는 영상을 보게 되었다. 자연스럽게 pi.dev를 처음 사용하게 되었다. 기본적으로 bypass(클로드 코드 bypass를 사용하긴 하지만)가 눈에 띄게 좋았다. 질문을 던졌을 때, AI가 도구를 복잡하게 사용하지 않는 것도 마음에 들었다. 무엇보다도 지금까지 그냥 AI 회사가 제공해주는 UI만 사용할 수 있다고 당연하게 생각했는데, 원하면 내가 만들어서 원하는 형태의 에이전트를 다룰 수 있다는 사실이 가장 새로웠던 것 같다. pi로 전환을 해보려고 클로드를 연결했는데, 클로드 구독 모델은 API 호출을 막아놨다고 하더라. 처음엔 이게 폐쇄적인 것도 몰랐다. 그런데 OpenAI는 구독 모델도 다른 에이전트에서 호출되는 것을 허용해준다고 하더라. 생각보다 클로드가 성능이 좋다고는 하지만 폐쇄적으로 구독 모델을 운영하려는 이유가 궁금했다. 하지만 시험 삼아 하루 동안 API 호출로 내가 API를 사용하는 습관대로 개발을 하니 약 $30을 사용하게 되었다. 이대로 보수적으로 일하는 날로만 계산해도 $600이 청구된다. 그래서 대안으로 로컬 LLM을 알아보게 되었는데 하드웨어 등 갖추어야 할게 많은 것 같았다. 다음달에 클로드 구독 끝나면 GPT5.5로 도전해봐야겠다.

Gemma나 Llama, Mistral 같은 LLM은 오픈 웨이트 모델이라고 부른다. 보통 GGUF파일로 공개되는데 이건 모델 가중치 파일이다. 그냥 숫자 덩어리인데, 헤더, 메타데이터, vocab 테이블, 임베딩 행렬, 가중치 행렬들로 구성된다. 요건 사전 학습을 몇 개월간 학습시킨다고 한다. 가중치 압축이 끝나면 파인튜닝을 해서 조금 더 자연스럽게 사람처럼 대화할 수 있다고 한다. 만드는 사람들은 다 서양인인데 한국어는 어떻게 튜닝하는 걸까? 물론 대기업은 돈이 많으니까 그냥 한국어 파인튜닝할 부서를 고용하면 된다고 단순하게 생각할 수도 있지만, 언어가 다양한데… 일단 사전 학습때 인터넷에 한국어 말고도 언어가 엄청 많기 때문에 패턴 학습은 마친 상태다. 그 상태에서 Cross-lingual transfer가 되기 때문에 고양이 = cat = 猫 같은 문맥을 공유한다고 한다. 그래서 영어로 파인튜닝을 해도 한국어로 답할 수 있다고는 한다. 어쨌든 파인튜닝 이후에 RLHF(Reinforcement Learning from Human Feedback)/DPO(Direct Preference Optimization)를 한다. 이 과정은 사람이 더 좋아하는 답변을 내도록 모델을 조정하는 과정이라고 한다.

그런데 어차피 이게 함수 덩어리라면 Ollama는 어떻게 해서 이 가중치 파일 덩어리를 실행할 수 있는걸까? 이 단계에서 행렬 곱 연산을 한다고 한다. 무려 중학교때 배운 행렬 곱 연산으로… 어쨌든 이때 GPU가 사용된다고 한다. CPU를 사용하지 않는 이유는 GPU 코어가 압도적으로 많고, 행렬 곱은 병렬로 처리가 가능하기 때문이다. LLM은 주로 3-4차원 텐서 연산을 하는데 이게 4차원 행렬을 뜻하는건 아니라고 한다. 예를들어 Attention(배치크기, 헤드 수, 시퀀스길이, 헤드차원)이라는 공식이 있는데 Attention(1, 16, 2048, 192)면 총 419만개의 행렬 원소를 계산해야한다. 답변 한번에 연산을 수천억 번 해야한다니… 비싸긴 하다.

흥미 위주로 공부하게 되는 건 나에겐 이롭다는 생각이 든다. 이제 AI를 사용하다보면 대부분은 읽는 시간이다. AI 산출물을 읽는 시간이다. 방대한 코드 베이스에서 내가 필요한 것들을 가져와 AI가 레포트를 작성하면 레포트와 작업 계획을 읽어 보고 이것 저것 질문과 수정을 거친 뒤에 구현을 하고 있다. 그러던 와중, ‘내가 이걸 정말 이해하고 승인을 하는걸까?‘하는 생각이 들었다. 이 수정 때문에 성능이 더 안좋아지거나 다른 버그가 파생되면 어떻게 하지? 이 문제를 해결하기 위해서 task-plan 스킬을 만들어서 스펙 문서를 만들어 구현을 진행하고 있다. 사실 처음에는 매번 프롬프트에 내가 원하는 것을 길게 넣고 나면 AI가 이해도 잘 못했으면서 마음대로 만들어 버릴 때가 많았다. 이럴 때마다 AI에게 분노를 하는 시간을 줄이기 위해서 처음에는 내가 구현하고자 하는 내용을 넣으면 내가 말한 내용을 제대로 이해했는지 되풀이하게 rule에 넣었다.(일명 복명복창) 그런데 하지 않아도 될 때 되풀이할 때가 있었다. 나중에는 컨텍스트를 최대한 fresh하게 유지하기 위해서 대화창에 계속 지금까지 구현한거와 구현이 덜 된걸 다른 대화창에서 에이전트가 이해할 수 있게 요약해달라고 반복하는 것도 힘들었다. 반복하는게 싫어서 AI를 사용하는데 AI 프롬프트를 반복하고 있다니… 그래서 CLAUDE.md에 rule로 넣어 항상 task를 무조건 markdown 파일로 만들도록 시켰다. 그러다 다른 개발자 동료로부터 레포를 소개받아 팀의 AI 컨텍스트를 만들어가는 것을 고민했고, task-plan을 스킬을 만들었다. 구현은 implement 스킬로 진행하는데 task-plan으로 작성한 문서를 읽고 구현하는데 초점이 맞춰져있는 스킬이다. 이 스킬은 구현 후 task 관리, progress 관리를 한다. 구현이 완료되면 evaluate로 구현을 평가한다. 그 후에 test-case라는 스킬로 구현 범위 내, 외 테스트를 직접 눈으로 보는 것도 하고 있다. 처음에는 gstack의 browse를 가져와서 에이전트가 자동으로 테스트를 진행하게 했는데 처음으로 토큰 usage 100%를 경험하고나서 손 테스트를 하고 있다. 마지막으로 내가 모르는 개념은 study라는 스킬로 구현 후 그 부분에 대한 심화 학습을 진행하고 있다. 심화 학습은 에이전트가 작성한 문서를 검토할 때 많은 도움이 된다. 개인 개발 지식도 늘게 되지만 에이전트가 무언가 구현하려고 제안할 때 가끔 그건 아니라고 말할 수 있게 되기 때문이다.

미래는 아무도 모른다

앞으로 나에게 닥칠 운명은 무엇일까? 잘 모르겠다. 그냥 AI 영상이나 책을 읽으면서 트렌드 체크를 계속 하는 수밖에 없다. 프론트엔드 직군이 처음 생겼을 때랑 비슷한 느낌이다. 좀 지친다. 하지만 그때 내가 습득한 건 현재 사용하고 있는 것에 대해 그래도 나름 이해해보려고 하는 태도다. 기술은 흑마법이 아니다. 시간을 들여서 공개된 것을 들여다보고 이해해보려고 노력하는 수밖에 없다. 아마도 미래에는 프론트엔드와 백엔드로 나뉘었던 개발 직군의 분리는 앞으로 경계가 희미해질 것이라고 생각된다. 하이브리드 직군도 실험적으로 생겨나고 있다. 나는 앞으로 직군을 고를 때, 프론트엔드 개발자가 되어야 할지 아니면 더 확장해서 직군을 선택해야 할지 고민이 된다.

AI는 비싸다. 하지만 회사들이 경쟁하고 있기 때문에 AI가 비용이 낮은 것처럼 느껴진다. 하지만 이미 AI로 인해 인프라 비용은 늘어나고 있다. 글을 쓰기 전 github가 AI 시대 들어 서비스 퀄리티가 낮아지고 그 의미가 점점 퇴색되어가고 있고, 사람들이 서비스를 떠나고 있다는 소식을 접하게 되었다. AI가 개발 생태계의 큰 부분을 바꾸고 있는 것은 사실이다. 그것에 긍정적인 것인지 부정적인 것인지는 잘 모르겠다. 앞으로 5년 뒤 개발 생태계는 어떻게 될지 예측할 수 없고 단언할 수 없다. 하지만 변하지 않는 진리는 자원은 한정되어 있다. 그래서 기회 비용이 있다. 그 기회 비용이 우리에게 오픈한 것들을 잠그는 결정으로 돌아오게 될 가능성이 높다. 잠깐 살펴본 원리만 보아도 AI는 돈 먹는 하마다. 근 미래에 우리는 성능 좋은 AI를 비싼 값을 내고 사용해야 하는 시대가 올지도 모른다. AI도 비즈니스 모델이 존재한다. 자체로 생성되는 AI가 보편화가 되지 않는다면 수익 모델을 고민하게 되면 결국 성능으로 비용에 차등을 둘 수밖에 없다. 물론 미래에는 Opus4.7정도 되는 모델을 오픈 소스로 사용하게 될지도 모르지만 어쨌든 어느정도 시간이 지나면 가격이 성능이 좋은 모델에 더 많은 과금을 할 가능성이 높다. 그리고 그동안 무료로 어느 정도 시범적 서비스를 런칭할 수 있던 제품들도 trial 자체를 매우 짧게 하거나 가벼운 과금으로 전환하게 될 가능성이 높다. 회사에서는 이미 AI를 사용한 개발자들이 제품을 만드는데 익숙해져있기 때문에 AI 비용이 비싸지면 자연스럽게 비즈니스 개발 비용도 높아질 것 같다. 아마도 먼 미래는 AI로 인해 발생한 인플레이션 때문에 인류가 고생 꽤나 하지 않을까 하는 생각이 든다.

먼 미래 인간은 현재 인간과 많이 다를 것 같다. 양자 컴퓨터 시대에 AI, 뉴럴 연산이 컴퓨팅 자원으로 사용될 가능성, 뉴럴 연산을 양자 컴퓨팅으로 확장시킬 수 있는 기술 등을 생각해보면 인간의 신체 스펙이 AI를 동작시키는 기초 자원으로 사용될 날이 올수도 있다. 거기에 하드웨어 확장으로 인간의 지적 능력을 확장할수 있는 사이버 펑크가 현실이 되는 시대가 올수도 있다. 그 시대에 기술이 인류 보편 가치보다 앞서나간다면 인간은 어떻게 되는걸까. 과도기에 살고 있는 사람은 현재 내가 쓰기를 잃어버림으로써 겪고 있는 상실감과 비교할 수 없을 만큼의 커다란 상실감을 경험하게 될것이라 생각한다. 인간의 정서는 총량이 정해져있고, 그것을 뛰어넘는 사람은 신인류가 될 것이다. 인간은 두려움을 느끼는 대상을 혐오의 대상으로 치환하는데 익숙하다. 나는 AI가 세상을 멸망시키지 않을 것이라고 생각한다. 다만 AI를 사용하는 인간 스스로를 헤치지 않기를 바랄 뿐이다.

참고자료

정확히 gemma 같은 걸 부르는 용어?와 어떻게 만들어지는지 그리고 이걸 ollama는 어떻게 실행하는지 알려줄수 있어? 
그리고 gemma가 가중치 모델이면 이게 무슨 학습을 했길래 내가 개발 질문을 하면 알아듣고 대답을 해주는지도 알려줄수 있어?