창작 글쓰기를 위한 KoboldCpp vs Ollama vs llama.cpp 비교 (2026)
요약
창작 글쓰기와 역할극(Roleplay) 목적에 따른 KoboldCpp, Ollama, llama.cpp의 차이점을 비교합니다. KoboldCpp는 샘플러 제어와 스토리 모드에 특화되어 창작에 최적화되어 있으며, Ollama는 개발자용 API에, llama.cpp는 파워 유저의 커스텀 파이프라인에 적합합니다.
핵심 포인트
- 창작용으로는 샘플러 제어가 강력한 KoboldCpp가 가장 우수함
- Ollama는 채팅 중심 앱 개발 및 깔끔한 API 활용에 적합
- llama.cpp는 스크립트 기반의 정밀한 토큰 제어를 원하는 유저용
- 창작 시에는 반복 방지 샘플러와 프롬프트 자유도가 핵심 요소임
이 기사는 원래 aifoss.dev에 게시되었습니다.
요약 (TL;DR): 소설 및 역할극 (Roleplay) 분야에서는 KoboldCpp가 압도적으로 승리합니다. KoboldCpp의 샘플러 스택 (Sampler stack), 스토리 모드 (Story mode), 그리고 네이티브 SillyTavern API는 이 도구가 창의적인 텍스트를 위해 목적에 맞게 제작된 유일한 도구임을 증명합니다. Ollama는 채팅 중심 앱을 위한 깔끔한 API가 필요한 개발자들에게 더 적합합니다. llama.cpp 직접 실행 방식은 가공되지 않은 토큰 제어 (Raw token control)를 원하고 자신만의 파이프라인 (Pipeline)을 스크립트로 작성하는 데 능숙한 파워 유저를 위한 것입니다.
| KoboldCpp v1.114.1 | Ollama v0.24.0 | llama.cpp (b9145) | |
|---|---|---|---|
| 최적 용도 | 역할극 (Roleplay), 소설, 장문 스토리 | 개발자용 챗봇, API 소비자 | 커스텀 스크립트, 연구, 최대의 유연성 |
| ... |
솔직한 의견: 소설을 쓰거나 역할극을 한다면 KoboldCpp를 사용하세요. 개발자 프로젝트를 구축 중이라면 Ollama를 사용하세요. 출력을 스크립트를 통해 파이프라인으로 연결하고 싶고 무엇을 하는지 정확히 알고 있다면 llama.cpp raw 버전만 사용하세요.
일반적인 "LLM 러너" 리뷰가 창작자들을 놓치는 이유
로컬 LLM 러너 (LLM runner)에 대한 모든 비교는 이들을 서로 교체 가능한 채팅 백엔드 (Chat backend)로 취급합니다. 코드 생성이나 질의응답 (Q&A) 용도로는 대체로 그렇습니다. 하지만 소설 쓰기와 역할극 (Roleplay)의 경우, 그 차이는 매우 뚜렷하고 실질적입니다.
창의적인 작가와 게임 개발자들은 범용 LLM 러너들이 부차적인 것으로 취급하는 세 가지 요소가 필요합니다:
-
샘플러 제어 (Sampler control). 생성된 산문의 품질은 샘플링 파라미터(sampling parameters), 특히 반복 처리(repetition handling)에 매우 민감합니다. 반복 처리는 장문 생성(long-form generation)에서 발생하는 가장 큰 실패 요인입니다. 모델이 계속해서 동일한 구절이나 문장 구조를 반복하면 서사의 몰입감이 깨집니다. 바로 이 문제를 해결하기 위해 DRY (Dynamic Repetition Yesterday), mirostat, 그리고 XTC 샘플러가 존재하지만, 모든 러너(runner)가 이 기능들을 노출하는 것은 아닙니다.
-
프롬프트 포맷팅의 자유도 (Prompt formatting freedom). 채팅에 최적화된 프론트엔드(frontend)는 모든 입력을 구조화된 Human/Assistant 메시지 형식으로 강제합니다. 이는 질의응답(Q&A)에는 적합합니다. 하지만 소설 생성(fiction generation)은 종종 가공되지 않은 이어쓰기(raw continuation)를 필요로 합니다. 즉, 모델에게 부분적인 산문을 제공하면 모델이 챗봇의 답변이 아닌 글을 계속 써 내려가는 방식입니다. 채팅 템플릿(chat template)에 사용자를 가두는 러너들은 이러한 워크플로우를 망가뜨립니다.
-
스토리 메모리 (Story memory). 32k 토큰 컨텍스트(context)는 금방 가득 찹니다. 무엇을 컨텍스트에 남길지(장면 요약, 캐릭터 설명, 활성 플롯 등)와 무엇을 잘라낼지를 결정하는 도구가 필요합니다. 범용 러너들은 이 문제를 전혀 다루지 않습니다.
세 가지 도구 한눈에 보기
KoboldCpp v1.114.1은 llama.cpp의 추론 코어(inference core)를 기반으로 구축되었지만, 창의적인 텍스트 생성을 위해 특별히 설계된 GUI 및 API 레이어로 이를 감싸고 있습니다. 단일 실행 파일 형태이며, 다운로드 후 GGUF 파일을 지정하여 실행하면 됩니다. GitHub에서 LostRuins에 의해 AGPLv3 라이선스로 유지 관리됩니다. 활발하게 개발 중이며, 대략 2~4주마다 릴리스가 나옵니다.
Ollama v0.24.0은 개발자들에게 가장 인기 있는 로컬 LLM 러너입니다. 깔끔한 CLI, ollama pull을 통한 모델 라이브러리, 그리고 OpenAI 호환 REST API를 제공합니다. 템플릿 시스템이 수십 가지의 모델 형식을 자동으로 처리합니다. MIT 라이선스입니다. 채팅 애플리케이션을 구축하는 데는 탁월하지만, 소설 워크플로우를 위해 설계되지는 않았습니다.
**llama.cpp (build b9145)**는 KoboldCpp(및 많은 작업에서의 Ollama)가 구축된 기반 추론 엔진(inference engine)입니다. llama-server 또는 llama-cli를 통해 직접 실행하면 UI 레이어 없이 전체 샘플러 체인(sampler chain)을 사용할 수 있습니다. 최대의 제어권과 최소한의 간섭을 제공합니다. MIT 라이선스입니다.
샘플러 제어 (Sampler Control): KoboldCpp의 가장 명확한 승리
이 부분은 창작 작가들이 가장 주의 깊게 살펴봐야 할 지점입니다.
KoboldCpp는 GUI와 API를 통해 전체 샘플링 스택(sampling stack)을 노출합니다: temperature, top-k, top-p, min-p, tail-free sampling, typical sampling, repetition penalty, presence penalty, frequency penalty, DRY, mirostat (v1 및 v2), CFG (classifier-free guidance), 그리고 XTC가 포함됩니다.
특히 창작 글쓰기를 위해서는 세 가지 샘플러가 가장 중요합니다:
**DRY (Dynamic Repetition Yesterday)**는 단순한 repetition-penalty 방식보다 더 미묘한 대안으로 설계된 토큰 수준의 반복 방지(anti-repetition) 샘플러입니다. 모든 반복된 토큰에 동일하게 페널티를 주는 대신, DRY는 N-gram 시퀀스를 추적하여 최근에 나타난 패턴의 지속에 페널티를 부여합니다. 이는 장문 산문(long-form prose)에서 매우 중요합니다. repetition-penalty만으로는 잡아내지 못할 상황에서도 모델이 네 단락 뒤에 동일한 묘사구를 반복하지 않도록 도와줍니다.
Mirostat는 원시 토큰 확률을 조정하는 대신 출력의 퍼플렉시티(perplexity)를 직접 제어합니다. 특정 "놀라움(surprisingness)" 수준을 목표로 샘플링 파라미터를 실시간으로 조정합니다. 소설 생성의 경우, tau 값이 약 5.0인 Mirostat v2는 순수한 top-p 샘플링보다 더 일관성 있는 장문 산문을 생성하는 경향이 있습니다.
**XTC (Exclude Top Choices)**는 유효한 연속 문구가 많을 때 통계적으로 가장 가능성이 높은 토큰들을 제거하여, 모델이 예측 불가능하지만 더 흥미로운 선택을 하도록 강제합니다. DRY를 개발한 저자들이 XTC도 개발했으며, 이 두 방식은 함께 사용할 때 효과가 좋습니다.
Ollama의 API는 temperature, top_k, top_p, repeat_penalty 및 몇 가지 다른 파라미터를 노출하지만, DRY, mirostat, XTC, CFG는 표준 Ollama API를 통해 사용할 수 없습니다. Modelfile에서도 이들을 설정할 수 없습니다.
llama.cpp의 llama-server 서버는 /completion 엔드포인트를 통해 전체 샘플러 체인(sampler chain)을 노출하며, 많은 경우 KoboldCpp와 동일한 기본값을 제공합니다. 샘플러 순서는 다음과 같습니다: penalties, DRY, top_n_sigma, top_k, typ_p, top_p, min_p, XTC, temperature. JSON을 통해 요청마다 이 중 어떤 것이든 재정의할 수 있습니다. 따라서 llama.cpp 직접 사용은 UI가 없을 뿐, 샘플러 제어 측면에서는 기능적인 대안이 됩니다.
DRY가 활성화된 llama-server 요청 예시:
curl http://localhost:8080/completion \
-H 'Content-Type: application/json' \
-d '{
...
KoboldCpp는 이러한 종류의 제어를 GUI 슬라이더 세트로 감싸서, JSON 페이로드(payload)를 직접 작성하고 싶지 않은 작가들도 쉽게 사용할 수 있게 만듭니다.
프롬프트 포맷팅 (Prompt Formatting): 채팅 템플릿 (Chat Templates) vs 원문 이어쓰기 (Raw Continuation)
이것은 소설 작법에 있어 두 번째로 중요한 차이점입니다.
Ollama는 채팅 메시지를 각 모델이 기대하는 입력 형식으로 변환하는 템플릿 시스템을 사용합니다. ollama run mistral을 사용할 때, Ollama는 사용자의 프롬프트를 Mistral의 [INST] 토큰으로 감쌉니다. API를 사용할 때는 구조화된 메시지를 보내면 Ollama가 포맷팅을 처리합니다. 채팅 용도로는 이것이 정확히 맞습니다. 하지만 원문 이어쓰기(raw continuation)의 경우에는 문제가 됩니다.
소설 생성은 종종 다음과 같은 의미를 갖습니다: 이 불완전한 문단을 보고, 내용을 이어 쓰세요. 모델이 이를 사용자 메시지로 해석하여
llama.cpp의 /completion 엔드포인트 또한 템플릿 강제 적용이 없는 로우 프롬프트 (raw prompts)를 허용합니다. 로우 문자열 (raw string)을 전송하면, 모델은 로우 연속 생성 (raw continuation)을 수행합니다. 이는 스토리 생성 파이프라인을 스크립트로 작성하는 개발자들에게 실행 가능한 대안이 됩니다.
컨텍스트 길이 (Context Length) 및 메모리 관리
세 가지 러너 (runners) 모두 기반 모델의 긴 컨텍스트 (long context)를 지원합니다. 각 도구에서 컨텍스트를 설정하는 방법은 다음과 같습니다:
bash
# KoboldCpp GUI: Co
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기