LM Studio를 활용하면 편하게 로컬에서 최신 언어 모델을 실행하고 자신의 애플리케이션에 연동할 수 있습니다. 이번 글에서는 Gemma 4 모델을 LM Studio로 로드한 뒤, FastAPI를 이용해 간단한 REST 엔드포인트로 서빙하는 방법을 소개해보겠습니다.


3. 실행: 설치 후 LM Studio를 실행하면 모델 탐색 화면이 나타납니다.








LM Studio의 Python SDK(lmstudio-python)를 이용하면 다른 서비스에서 로컬 모델을 쉽게 호출할 수 있습니다. 공식 개발 문서의 예시처럼 pip install lmstudio로 SDK를 설치한 뒤, 모델을 불러와 응답을 받는 코드를 작성할 수 있습니다. 이를 FastAPI와 결합해 간단한 REST 서비스로 만들겠습니다.
Python 가상환경을 생성하고 활성화합니다.
필요한 패키지를 설치합니다.
pip install lmstudio fastapi uvicorn

아래 코드는 FastAPI를 사용해 /chat 엔드포인트를 생성하고, 요청으로 받은 프롬프트를 LM Studio에 전달해 응답을 반환합니다. Medium 기사에서 소개한 방법을 참고했습니다.
import lmstudio as lms
from fastapi import FastAPI
app = FastAPI()
MODEL_ID = "google/gemma-4-e4b"
model = None
@app.on_event("startup")
def startup():
global model
# 첫 convenience API 호출 전에 먼저 설정
lms.configure_default_client("localhost:1234")
# 서버 확인
if not lms.Client.is_valid_api_host("localhost:1234"):
raise RuntimeError("LM Studio 서버가 localhost:1234 에서 실행 중이 아닙니다.")
model = lms.llm(MODEL_ID)
@app.get("/health")
def health():
return {"ok": True}
@app.get("/ask")
def ask(q: str):
result = model.respond(q)
return {"answer": str(result)}
위 코드에서
google/gemma-4-e4b는 LM Studio에서 다운로드하고 로드한 모델의 이름입니다. 다른 모델을 사용한다면 이 부분을 변경하면 됩니다. SDK의respond메서드는 전체 응답을 한 번에 받아오며,respond_stream메서드를 사용하면 토큰 단위로 스트리밍 받을 수 있습니다.
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
curl -X POST "http://localhost:8000/ask" \
-H "Content-Type: application/json" \
-d '{"prompt": "당신은 누구인가요?"}'
응답으로 `{"response": "..."}` 형태의 결과가 반환되며, 내부적으로는 LM Studio에 연결되어 Gemma 4 모델이 프롬프트를 처리합니다.
http://localhost:8000/docs 에 접속하여 테스트를 해봅니다.
{
"answer": "<|channel>thought\nThinking Process:\n\n1. **Identify the user's request:** The user is asking, \"Who are you?\" (당신은 누구인가요?).\n2. **Determine core identity components (Self-Correction/Verification based on persona):**\n * Name: Gemma 4.\n * Developer: Google DeepMind.\n * Nature: Large Language Model (LLM).\n * Type: Open weights model.\n3. **Formulate the response in Korean (the language of the request):** The tone should be polite, informative, and direct.\n4. **Drafting the content structure:**\n * Start with a clear identity statement (Name).\n * Explain what I am (Nature/Model type).\n * State who developed me (Developer).\n * (Optional but helpful) Explain my function or purpose.\n5. **Refining the Korean phrasing:**\n * *I am Gemma 4.* -> 저는 Gemma 4입니다.\n * *I am a Large Language Model.* -> 저는 대규모 언어 모델(LLM)입니다.\n * *I was developed by Google DeepMind.* -> 저는 Google DeepMind에 의해 개발되었습니다.\n * *My function is to help with various tasks like answering questions, summarizing, and generating text.* -> 질문 답변, 요약, 텍스트 생성 등 다양한 작업을 도와드릴 수 있습니다.\n\n6. **Final Polish (Korean Output):** Combine the elements into a smooth, comprehensive answer. (This leads directly to the provided Korean response.)<channel|>저는 **Gemma 4**입니다.\n\n저는 Google DeepMind에서 개발한 대규모 언어 모델(Large Language Model, LLM)입니다.\n\n저의 주된 역할은 사용자와 소통하고 다양한 정보를 제공하며, 질문에 답변하거나 글을 작성하는 등 여러 가지 언어 기반 작업을 도와드리는 것입니다. 궁금한 점이 있거나 도움이 필요한 부분이 있으면 언제든지 말씀해 주세요!"
}
응답의 내용을 살펴보면 정상적인 최종 답변만 나온 상태가 아니라, 모델의 중간 사고 과정(Thinking Process)과 최종 답변이 함께 노출된 형태입니다.
<|channel>thought
이 부분은 모델이 내부적으로 답을 만들기 위해 사용한 사고 채널처럼 보입니다.
Thinking Process: 아래의 1~6번
사용자의 질문을 어떻게 해석하고, 어떤 요소를 답변에 넣을지 정리한 중간 추론 과정입니다.
<channel|>저는 **Gemma 4**입니다. 이후
이 부분이 실제 사용자에게 보여주려던 최종 응답입니다.
즉, 이 JSON의 answer 값에는 “생각 과정 + 최종 답변”이 한 문자열에 같이 들어가 있습니다. 해석하면 이런 구조입니다.
이 과정은 사용자에게 그대로 보이면 안 되는 경우가 많습니다. 따라서 현재의 응답 형태는 로직 구현에서는 사용하되, 답변 받은 그대로를 서빙하지는 않도록 해야겠습니다.
이번 글에서는 Windows 환경에서 LM Studio로 Gemma 4 모델을 다운로드·로드하고, Python의 FastAPI를 사용해 간단한 REST API를 만드는 방법을 살펴보았습니다.
LM Studio가 제공하는 로컬 API를 직접 호출할 수도 있지만, FastAPI를 덧씌우면 네트워크를 통한 활용이나 추가 로직을 포함한 애플리케이션 통합이 쉬워집니다. 필요에 따라 다음과 같은 확장을 시도해볼 수 있겠습니다.
respond_stream 메서드를 사용하여 웹소켓이나 SSE(Server-Sent Events) 형태로 토큰을 실시간으로 전달할 수 있습니다.LM Studio와 FastAPI를 통해 로컬 LLM을 간편하게 활용해 보시면, 여러분의 프로젝트나 서비스에 맞춰 자유롭게 커스터마이징할 수 있습니다.