
Forth가 신경망(Neural Networks)을 고통스럽게 만든 이유
요약
희귀 프로그래밍 언어인 Forth를 AI가 학습할 수 있도록 데이터셋을 구축하고 RAG를 활용하는 과정을 다룹니다. 모델의 성능 한계와 데이터셋 구축 과정에서 발생하는 높은 비용 및 난이도 문제를 설명합니다.
핵심 포인트
- Forth와 같은 소외된 언어는 기존 AI 모델의 학습 데이터가 부족함
- 효과적인 학습을 위해 매뉴얼, 서적, 문제 풀이 데이터셋 구축이 필수적임
- 고난도 문제 해결을 위해 가장 성능이 높은 모델을 사용하는 것이 중요함
- 본격적인 학습 전 RAG를 활용하여 외부 지식을 보완하는 방식이 유효함
... 그리고 나의 Cursor 비용
이번 주의 실패 (Fail of the week)
AI를 사용하여 단 하룻밤 만에 Forth용 패키지 매니저 (package manager for Forth)와 몇 가지 현대적인 유틸리티들을 작성할 수 있었던 것에 영감을 받아, 나는 한 가지 생각을 하게 되었습니다. 물론 결과물은 좋았습니다. 하지만 비용이 너무 많이 들었습니다. 만약 신경망 (Neural Network)을 직접 학습시켜서 로컬에서 실행하면 어떻게 될까요? 돈도 아끼고 경험도 쌓을 수 있을 것입니다!
대부분의 현대적인 프로그래밍 언어들에 대해 신경망 (Neural Networks)은 충분히 준비되어 있습니다. 수 킬로톤의 예시 데이터를 통해 학습되었기 때문입니다. 하지만 Forth는 왠지 모르게 소외되어 있었습니다. 나는 학습된 언어 목록을 찾기 위해 코더 네트워크 (coder networks)를 검색해 보았지만, 지원되는 목록에 Forth가 포함된 네트워크를 찾을 수 없었습니다. Cursor에서 모델을 사용하는 옵션에 대해 말하자면, 가장 접근하기 쉬운 에이전트(Agent)인 Auto는 Forth 프로그래밍을 전혀 수행하지 못했습니다. 여기서 나는 다시 한번
답은 간단합니다. AI에게 Forth 작성법을 가르치면... 성공(Profit)할까요? 천만에요!
frules — 이것은 "ChatGPT를 위한 또 다른 프롬프트(prompt)"가 아닙니다.
저는 AI가 단순히 Forth가 무엇인지 모르기 때문에, 그저 모든 정보를 제공하기만 하면 된다는 가설을 세웠습니다. 물론 근거 없는 생각은 아니었으며, AI와의 긴 채팅 대화 끝에 나온 결론이었습니다. 그 결과, 우리는 지식 데이터셋(dataset)을 구축해야 하며, 그렇게 하면 모델이 프로그래밍을 할 수 있을 것이라는 결론에 도달했습니다!
제가 아는 범위 내에서, 저는 AI에게 GForth 매뉴얼 전체와 사용 예제를 다운로드하도록 요청했습니다. 그리고 Forth 프로그래밍에 관한 핵심 요점(theses)을 작성하게 했습니다. 또한 데이터셋에 Brodie의 저서를 소스로 추가하면서 이를 MD 형식으로 변환했습니다 (만세! 이제 온라인으로 읽을 수 있습니다). 그 후, AI가 이미 형성하고 있던 많은 일반적인 요점들이 거의 완전히 다시 작성되었습니다. 여기에 더해, 우리는 Codewars에서 이루어지는 방식처럼 전형적인 프로그래밍 문제 블록을 만들려고 시도했습니다. 가장 어려웠던 점은 문제에 대한 정답(solutions)이 없었다는 것이며, 저는 AI가 98개의 모든 문제를 테스트를 통과할 수 있는 방식으로 해결하도록 만드는 데 엄청난 시간과 비용을 쏟아부었습니다. 어떤 부분은 정말 고통스러웠습니다. 마지막에는 난이도 10점 만점에 7점 수준의 문제가 10개 정도 남았기 때문입니다. 그리고 각 문제를 해결하는 데 최소 한 시간씩 걸렸습니다.
이전의 AI와의 대화들을 통해, 이 단계는 가장 똑똑한 모델들로 해결해야 한다는 점이 분명해졌습니다. 올바른 과제를 설정하고, 올바르게 해결하여 작동하는 예시를 얻어야 합니다. 성능이 낮은 네트워크 (Weak network)는 과제를 해결하지 못할 뿐만 아니라, 테스트조차 제대로 작성하지 못합니다. 과제를 해결하고 정답을 얻는 과정은
자
전제 조건. 모델을 데이터와 GPU를 사용하여 "본격적으로" 학습시키기 전에, 저는 업무 과정에서 RAG (Retrieval-Augmented Generation)를 모델의 데이터 소스로 활용하는 방식을 발견했습니다. 즉, 범용 모델을 가져온 뒤 외부 소스로 벡터 데이터베이스 (Vector DB)에 대한 접근 권한을 연결하는 방식입니다. 우리는 그곳에 우리 생산 공정이 어떻게 조직되어 있는지에 대한 데이터 모델을 구축했고, 질문을 던져 답변을 얻을 수 있었습니다. 벡터 DB를 구축하는 것은 그 자체로 하나의 예술 영역과 같았습니다. 저는 AI가 데이터를 벡터로 "올바르게" 배치하기 위해 스스로 스크립트를 작성하는 과정을 옆에서 지켜보았습니다. 그 후 제가 질문을 던지면 AI는 제가 원하는 대로 답하지 않았고, 그러면 프로그래밍하는 AI가 인덱스 (Index)를 수정했습니다. 당시에는 이 모든 과정이 "내부적으로 (under the hood)\
자, 제 노트북에는 8GB 용량의 4070이 탑재되어 있어 기본적으로 학습은 꽤 빠르게, 말 그대로 몇 분 만에 진행되었습니다. 모델 자체가 작기 때문입니다. 그래서 결과적으로 무엇을 얻었을까요? Forth 코드를 내뱉는 대신, 무언가 무한히 반복되는 헛소리만을 출력하는 네트워크를 얻었습니다. 그 후 우리는 네트워크를 더 오래 학습시켰습니다. 반복 횟수를 추가했고, 저는 숫자들을 자세히 들여다보기 시작했습니다. 그리고 무언가 이해하기 시작했다는 느낌이 들었습니다. 에포크 (Epochs), 오류율 (Error rate). 이 비율이 줄어들기 시작했습니다. 하지만 최종 모델은 여전히 Forth 대신 Python 코드와 Forth 단어들이 뒤섞인 결과물을 내놓았습니다.
그다음 우리는 AI와 함께 얻은 결과에 대해, 그리고 이를 어떻게 개선할지에 대해 논의했습니다. 저는 네트워크가 좀 더 유용한 것을 출력하기를 원했습니다. 더 많은 데이터를 제공하고 싶었습니다. 하지만 이때 저는 사실 정상적인 결과를 얻어서는 안 되었다는 사실을 상기하게 되었습니다. 왜냐하면 목표는 도구 파이프라인 (Instrumental pipeline)을 익히는 것이었기 때문입니다! 이런. 하지만 모델이 무언가를 배웠다는 것을 확인하는 데는 성공했습니다. 이 시점에서는 Track A를 종료하고, 첫 번째 시도의 실패를 받아들인 채 (작은 모델로부터 의미 있는 것을 얻으려 시도하지 말고) 다음 단계로 넘어가야 했습니다. 하지만... 제 AI는 제 스크립트에 오류가 있다고 말해주었습니다. 데이터가 잘려 있었고, 모델이 학습해야 할 대상이 아닌 다른 것으로 학습되고 있었던 것입니다. 좋습니다, 수정합시다! 이제 제대로 된 데이터로 모델을 학습시켰습니다. 그리고 기적처럼, 모델은... Forth 프로그래밍을 배우지는 못했지만 진전이 있었습니다! 모델은 이미 결과를 구문론적으로 올바른 Forth 정의인 : forth-word commands ; 형태로 구성하기 시작했고, 저는 내심 기뻤습니다.
Track A 단계는 종료하기로 결정했으며
많은 질문이 쌓였고, 이 질문들에 대한 답 없이는 도저히 앞으로 나아갈 수 없었습니다. 격렬한 심적 충동이 일기 시작했습니다. 나만의 강력한 컴퓨터와 그래픽 카드(어떤 것을 사야 할까?)를 살 것인가, 아니면 대학에 가서 4x A100 클러스터가 있는 곳에 갈 것인가, 그것도 아니면 클라우드를 대여할 것인가. 하지만 무엇을 위해서일까요?
문제를 해결하는 과정에서 AI는 ML (머신러닝) 분야의 매우 많은 용어를 내뱉습니다. 저는 그것들을 수집하여 논의를 시작했습니다. 그 외에도, 실험과 측정을 수행한 후에는 결과를 올바르게 해석하고 결론을 도출할 줄 알아야 하는데, 저는 결론을 내리는 법을 몰랐습니다. 그래서 우리가 무엇을 했는지, 여기서 어떤 결론을 얻을 수 있는지, 그리고 다음에 무엇을 해야 하는지를 이해하기 위한 장기적인 소통 단계가 시작되었습니다. 그렇게 그녀(AI)와 계속 대화를 나누었고, 저에게는 새로운 질문과 새로운 용어들이 생겨났습니다. 저는 그것들에 대해 추가적인 질문을 던졌습니다. 이는 자신이 모르는 것을 알아내기에 좋은 메커니즘입니다 (우리는 우리가 모르는 것을 알 수 없기 때문입니다). 점차 대화가 풀려나갔습니다.
어떤 질문들은 여러 번 되풀이하며 다시 돌아가 묻기도 했습니다. 아마도 저는 단순히 제 자신의 어떤 오해들을 믿고 싶지 않았던 것 같습니다.
작은 모델은 처음부터 학습 파이프라인 (pipeline) 디버깅과 도구 숙달만을 위해 사용할 계획이었습니다. 하지만 첫 결과들을 보고 나니, 저는 모든 것을 잊어버리고 Forth 코드로 정확한 결과를 얻기 위해 네트워크의 성능을 개선하고 싶어졌습니다. 그래서 저는 이 문제에 대한 해결책을 찾기 위해 끈질기게 노력했습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기
