LLM이 코딩을 잘한다는 것은 이제 삼척동자도 아는 사실이다. 하지만 일반적으로는 함수 단위 또는 조금 넘어서 코드 블록 정도를 작성하는 수준으로 생각한다. 최근 회사에서 로컬 LLM을 테스트하면서 매뉴얼을 통째로 입력했을 때, LLM이 이를 토대로 적용 코드를 작성할 수 있을지 궁금했다. 이런 생각을 하게 된 것도 모델의 답변 퀄리티가 예상보다 훨씬 뛰어났기 때문이다. 그래서 여러 모델을 벤치마크해 보았다.
매뉴얼은 총 80KB 분량의 adoc 텍스트 문서로, 클라이언트와 서버 매뉴얼이 합쳐져 있으며, 각종 언어에 대한 통신 프로토콜, SDK 초기화 및 종료 절차, 데이터 전송 방법 등의 설명이 상세히 기술되어 있다. 이러한 내용은 클라이언트/서버 프로그램 개발에 필수적인 정보를 제공한다. 80KB는 감이 잘 오지 않을 수 있는데, PDF로 환산하면 약 133페이지 분량이다. 해당 파일을 단순히 통째로 읽어 모든 데이터를 전달했다. 프롬프트는 다음과 같다. 출력 토큰은 8K로 설정했으며, claude-3-haiku만 8K를 지원하지 않아 4K로 테스트했다. 이 차이는 각 모델이 처리할 수 있는 데이터의 양과 응답 길이에 영향을 미쳐, 결과의 품질과 완성도에 차이를 만들 수 있다.
시스템
다음 첨부된 자료를 참고하여 사용자 질의에 답변합니다.
... 매뉴얼 89KB 텍스트 첨부 ...
사용자 질의
xigncode3가 적용된 C++ 클라이언트/서버 프로그램을 작성해 주세요. 클라이언트와 서버 프로그램은 TCP/IP를 통해 통신하는 구조로 만들어 주세요.
매뉴얼이나 세부 결과물은 회사 내부 자료가 포함되어 있어 공개하기는 어렵지만, 간략하게 평가한 내용은 다음과 같다. 참고로 이 업무는 회사에서 개발자가 들어오면 대체로 거치는 통과의례 같은 과정이며, 빠르면 1주일, 늦으면 2달까지도 걸리는 작업이다.
qwen2.5-14b-int4-128k
클라이언트 통신 코드를 작성 안함, 서버 통신 코드 작성 안함, 데이터 전송 코드 작성 안함.
클라이언트에 SDK 초기화 코드를 구현했으나, 함수 하나는 잘못 호출했다. 클라이언트 SDK 종료 코드를 구현했다. 클라이언트에 SDK 통신 코드를 적용하지 않았다.
서버 SDK 초기화 코드에 호출한 함수 4개가 모두 잘못되었다. 서버 SDK 종료 코드에 호출한 함수 1개가 잘못되었다. 서버 SDK 통신 코드를 적용하지 않았다.
클라이언트 프로그램 설명이 중구난방이다. 서버 프로그램 설명이 중구난방이다.
qwen2.5-32b-int4-128k
클라이언트 통신 코드를 작성했다. 서버 통신 코드를 작성했다. 클라이언트/서버 데이터 전송 코드를 작성하지 않았다.
클라이언트 SDK 초기화 코드를 작성했으나 잘못 작성했다. 서버 함수를 사용했다. 클라이언트 SDK 종료 코드를 작성했으나 잘못 작성했다. 클라이언트 통신 코드를 작성했으나 잘못 작성했다. 다른 언어 매뉴얼 함수를 잘못 사용했다.
서버 SDK 초기화 코드를 일부 정상 구현했다. 서버 SDK 종료 코드를 정상 구현했다. 서버 SDK 통신 코드를 정상 구현했다. 일부 다른 언어의 함수를 잘못 사용했다.
설명이 제법 정제되었다.
4o-mini
클라이언트 통신 코드 작성, 서버 통신 코드 작성, 데이터 전송 코드 작성했지만 일부 잘못됨.
서버 SDK 초기화, 종료 코드 작성. 데이터 전송 코드는 작성하지 않음.
클라이언트 SDK 초기화, 종료 코드 작성. 데이터 전송 코드는 작성하지 않음.
설명이 간결함.
claude-3-haiku
전체적으로 결과가 의외로 신선하게 나왔다. 프로젝트 구조부터 각 파일을 구현하는 방식으로 전개됨. 다른 모든 모델은 단순히 서버 소스, 클라이언트 소스 같은 구조였음. 하지만 실질적으로 결과물은 그냥 그럴듯한 잡썰이라 평가에서 논외로. 전개는 몹시 설레였지만... 실제 코드는 망 ㅠㅜ
알겠습니다. XIGNCODE3를 적용한 C++ 기반 클라이언트/서버 프로그램 작성 방법을 안내해 드리겠습니다. 클라이언트와 서버가 TCP/IP를 통해 통신하는 구조로 구현하도록 하겠습니다.
먼저, 프로젝트 구조는 다음과 같습니다:
- Project - Client - main.cpp - XigncodeClient.h - XigncodeClient.cpp - Server - main.cpp - XigncodeServer.h - XigncodeServer.cpp - Common - Util.h - Util.cpp
Common
폴더에는 클라이언트와 서버에서 공통으로 사용하는 유틸리티 함수들이 들어있습니다.이제 각 파일의 구현 방법을 설명드리겠습니다.
== 클라이언트 구현
===
XigncodeClient.h
qwen2.5-72b-int4-128k
여기서부터가 조금 놀라웠다. 클라이언트 통신 코드 작성, 서버 통신 코드 작성, 데이터 전송 코드 작성.
클라이언트 SDK 초기화, 종료 코드 작성. 데이터 전송 코드 작성.
서버 SDK 초기화, 종료 코드 작성, 데이터 전송 코드 작성.
설명이 약간 장황함.
gpt-4o
클라이언트 통신 코드 작성, 서버 통신 코드 작성, 데이터 전송 코드 작성.
클라이언트 SDK 초기화, 종료 코드 작성, 데이터 전송 코드 작성.
서버 SDK 초기화, 종료 코드 작성, 데이터 전송 코드 작성.
설명이 간결함.
claude-3.5-sonnet
클라이언트 통신 코드 작성, 서버 통신 코드 작성, 데이터 전송 코드 작성.
클라이언트 SDK 초기화, 종료 코드 작성, 데이터 전송 코드 작성.
서버 SDK 초기화, 종료 코드 작성, 데이터 전송 코드 작성.
설명이 간결하나 GPT보다는 보충됨.
llama3.2-90b
번외로 해봤다. 일단 한글 문서에 한글 프롬프트임에도 대차게 영어로 대답하는 기개를 보여주었다. 한글을 못해서 그런지 내용은 매뉴얼이 하나도 반영되어 있지 않았다.
너무 안타까운 마음에 영문 프롬프트에 영문 매뉴얼로 우대해줘서 다시 돌려봤다. 하지만 안타깝게도 결과는 별 차이가 없었다. 서버 쪽 구현이 조금 추가된 정도. 너무나 너무나 안타까운 마음에 다른 언어랑 헷갈리지 않도록 C++ 문서만 두개를 전달했다. 그랬더니 이제는 클라이언트 구현도 조금 추가했지만 여전히 4o-mini보다도 못한. 알파고 따라 만든 바둑때부터 느꼈지만 뭔가 90b 치고는 참 어이없는 결과가 아닐 수 없겠다.
총평
qwen2.5-72b, gpt-4o, claude-3.5-sonnet 모두 납득할 만한 결과를 보여줬고, 나머지는 아직 실제 사용하기에는 부족한 느낌이다. 그런데도 더 놀라운 사실은 qwen2.5-72b, gpt-4o, claude-3.5-sonnet 중 우열을 가린다면 qwen2.5-72b에 손을 들어주고 싶다. 왜냐하면 평가표에는 언급되지 않았지만, 클라이언트/서버 SDK의 다른 주요 기능들이 하나씩 더 있었는데 아무도 그것을 구현하지 않았는데, 72b는 혼자 그것을 모두 다 구현했기 때문이다. 알리바바가 외계인을 갈아넣고 있거나 아니면 중국이니까 자료를 그냥 맘껏 사용하거나 둘중하나인듯한. 어쨌든 멋진 신세계가 아닐 수 없다.