[플레이데이터 SK네트웍스 Family AI 캠프 10기] 12주차 회고 - 기본 환경 설치2

문승기·2025년 3월 28일
0

SK네트웍스 Family AI캠프 10기 12주차 회고록 (25.03.24 ~ 25.03.28)

기간

  • 2025.03.24(월) ~ 2025.03.28(금)

학습 내용 요약


※ Ollama

이번 주에는 로컬 환경에서 LLM을 실행할 수 있는 프레임워크인 Ollama를 설치하고 직접 활용해보았다.
주요 학습 포인트는 다음과 같았다:


✅ 설치 및 모델 실행

공식 사이트에서 윈도우용 설치 파일을 다운로드한 뒤, Install을 눌러 설치를 진행하였다.
이후 PowerShell을 실행하여 아래의 명령어로 간단하게 모델을 구동해보았다.

ollama run gemma3:1b

설치가 완료된 후 위 명령어를 입력하니 로컬에서 바로 Gemma3 모델이 실행되었으며, 명령어 기반의 인터랙션을 통해 간단한 테스트가 가능하였다.


✅ Ollama 사용 가이드

설치 이후 Ollama의 주요 기능을 다양하게 실습해보았다.
명령어 기반 사용뿐만 아니라, LangChain 연동 및 JSON/멀티모달 응답 처리 방식까지 테스트하였다.

  • 서버 실행

    ollama serve
  • 모델 다운로드

    ollama pull llama3
  • 모델 실행

    ollama run llama3
  • 설치된 모델 목록 확인

    ollama list
  • 모델 삭제

    ollama rm llama3

✅ Huggingface 모델 등록 (.gguf)

Huggingface에 등록된 .gguf 모델도 Ollama에서 사용할 수 있었다.
예시로 llama-3-Korean-Bllossom-8B 모델을 다운로드한 후 Modelfile을 구성하였다.

FROM llama-3-Korean-Bllossom-8B-Q4_K_M.gguf

TEMPLATE """{{- if .System }}
<s>{{ .System }}</s>
{{- end }}
<s>Human:
{{ .Prompt }}</s>
<s>Assistant:
"""

SYSTEM """A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions."""

PARAMETER temperature 0.7
PARAMETER num_predict 2048
PARAMETER num_ctx 4096
PARAMETER stop <s>
PARAMETER stop </s>

각 파라미터의 의미는 다음과 같다:

파라미터 이름설명
temperature생성되는 텍스트의 다양성을 조절하는 값으로, 0에 가까울수록 결정론적이고 1에 가까울수록 창의적인 응답을 생성한다.
num_predict모델이 생성할 최대 토큰 수를 지정한다. 이 값이 클수록 더 긴 응답을 생성할 수 있다.
num_ctx문맥(Context) 윈도 크기를 설정하며, 한 번에 모델이 참고할 수 있는 최대 입력 토큰 수를 의미한다. 모델의 메모리 및 처리 속도에 영향을 준다.
stop응답 생성을 중단할 조건이 되는 문자열 또는 토큰이다. <s>, </s> 같은 토큰을 통해 특정 시점에서 응답 생성을 멈추도록 제어할 수 있다. 같은 키를 여러 번 지정하면 중복된 종료 조건을 넣을 수 있다.

이후 아래 명령어를 통해 커스텀 모델을 실행할 수 있었다.

ollama create llama3-korean -f Modelfile
ollama run llama3-korean

직접 실습한 Modelfile은 아래와 같았으며, 다양한 파라미터 튜닝을 통해 실험적인 테스트도 가능하였다.

FROM gemma3-miniproj3-finetune-model2.Q8_0.gguf

TEMPLATE """{{- if .System }}
<s>{{ .System }}</s>
{{- end }}
<s>Human:
{{ .Prompt }}</s>
<s>Assistant:
"""

SYSTEM """A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions."""

PARAMETER temperature 0
PARAMETER num_predict 3000
PARAMETER num_ctx 4096
PARAMETER stop <s>
PARAMETER stop </s>

해당 파라미터는 모델 성능과 응답 특성을 실험할 때 유용했으며, 특히 temperature, num_predict, stop 조건은 대화형 모델에서 핵심적인 튜닝 요소였다.


✅ LangChain 연동

LangChain에서는 ChatOllama를 사용해 Ollama 모델을 불러올 수 있었으며, ChatPromptTemplate과 함께 스트리밍 체인을 구성할 수 있었다.

from langchain_community.chat_models import ChatOllama
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

llm = ChatOllama(model="gemma:7b")
prompt = ChatPromptTemplate.from_template("{topic} 에 대해 간단히 설명해줘.")
chain = prompt | llm | StrOutputParser()

for chunk in chain.stream({"topic": "딥러닝"}):
    print(chunk, end="", flush=True)

실제로 사용 시 출력 결과는 스트리밍 방식으로 나타나며, 자연스러운 대화형 인터페이스를 구현할 수 있었다.


✅ JSON 출력 지원

Ollama는 format="json" 파라미터를 활용해 응답을 구조화할 수 있었다.
다만 프롬프트에 "response in JSON format"이 포함되어야 한다.

llm = ChatOllama(model="gemma:7b", format="json", temperature=0)
prompt = "유럽 여행지 10곳을 알려줘. key: `places`. response in JSON format."
response = llm.invoke(prompt)
print(response.content)

응답 결과는 명확한 key-value 형태로 출력되며, 후속 처리나 프론트엔드 연동에 매우 유리했다.


✅ 멀티모달 지원

llava, bakllava와 같은 모델은 이미지와 텍스트를 함께 다룰 수 있었다.
이미지를 base64로 인코딩한 후 ChatOllama를 통해 함께 전달하면, 시각 정보 기반 응답 생성이 가능했다.

# 이미지 + 텍스트 입력 → 시각 정보 요약
from langchain_core.output_parsers import StrOutputParser
from langchain_community.chat_models import ChatOllama
from langchain_core.messages import HumanMessage

llm = ChatOllama(model="llava:7b", temperature=0)

# Base64 이미지 처리 + 프롬프트 구성 생략
# ...

query_chain = chain.invoke({
  "text": "이미지를 설명해줘", 
  "image": image_b64
})

결과는 이미지에 대한 설명을 bullet point로 요약해주는 형식으로 출력되었으며, 향후 이미지 기반 질의응답 서비스 설계에 큰 도움이 될 것으로 기대된다.


※ 챗봇 프로젝트: Provider 선택 및 모델 실행 흐름

이번 주에는 챗봇 프로젝트 구조를 개선하기 위해, Provider 시스템을 기반으로 다양한 LLM 모델을 유연하게 선택할 수 있는 구조를 구현하였다.

  • init_display()를 통해 사용자가 Provider 및 모델을 선택
  • 선택값을 기반으로 PROVIDER_TYPE enum을 참조해 인스턴스를 생성하고 응답 처리

코드는 다음과 같다.

generator = get_response_from_llm(
    choiced_provider=PROVIDER_TYPE[choiced_provider].value[1](
        provider_LLMs=PROVIDER_TYPE[choiced_provider].value[2]
    ),
    messages=st.session_state.messages,
    llm_name=choiced_llm
)

Ollama의 경우 LangChain의 ChatOllama를 활용해 로컬 모델을 연동하였다.

class Provider_Ollama(Provider):
    def __call__(self, model_name, messages):
        llm = ChatOllama(model=self.provider_LLMs[model_name].value[1])
        prompts = [(msg['role'], msg['content']) for msg in messages[:-1]]
        prompts += [("user", "{user_input}")]
        chain = ChatPromptTemplate.from_messages(prompts) | llm | StrOutputParser()
        for token in chain.stream({"user_input": messages[-1]['content']}):
            yield token

이와 같은 구조를 통해 다양한 모델을 동일한 응답 파이프라인으로 처리할 수 있었으며, 확장성과 유지보수성을 높일 수 있었다.


※ 로컬 DB 연동 (PostgreSQL + pgvector)

챗봇의 검색 성능을 강화하기 위해 PostgreSQL과 pgvector 기반의 벡터 DB 환경을 구성하였다.
Docker로 PostgreSQL 17을 설치하고 pgvector 확장을 활성화한 뒤, DBeaver를 통해 GUI 기반 쿼리도 함께 실습하였다.

향후에는 이를 통해 자체 임베딩 기반의 검색 시스템을 구현할 계획이다.


※ 트러블슈팅: Enum 기반 모델 관리

Enum 클래스를 사용한 모델명 관리는 코드 안정성 측면에서 큰 도움이 되었다.
문자열이 아닌 Enum 타입으로 Provider 및 LLM을 관리함으로써 오타로 인한 예외 발생 가능성을 줄일 수 있었다.

class PROVIDER_TYPE(enum.Enum):
    Groq = ...
    OpenAI = ...
    Ollama = ...

KPT 회고 (12주차)

✅ Keep

  • 학습과 체력 관리를 함께 병행하고 있으며, 꾸준한 운동 루틴을 유지하고 있다.
  • 프로젝트 실습에서 어려움이 있어도 쉽게 포기하지 않고 직접 부딪혀보는 자세를 유지했다.

❌ Problem

  • 오전 이론 수업의 난이도가 높아 집중이 어려웠다.
  • 정보처리기사 준비가 늦어지고 있으며, 병행 학습에 대한 피로도가 누적되고 있다.
  • 개념 학습에 필요한 서적이나 강의 접근이 금전적으로 부담이 되었다.

🚀 Try

  • 부트캠프 수료 전까지는 오직 캠프 학습 + 정보처리기사 자격증에 집중하기로 했다.
  • 이후에는 어학, 코딩테스트, 인터뷰 준비 등을 순차적으로 진행할 예정이다.
  • 단기 목표에 집중하며 루틴을 무너뜨리지 않고, 하루 한 챕터라도 학습 진도를 유지하는 것이 핵심이다.

마무리

이번 주에는 Ollama 실습을 통해 로컬 환경에서의 LLM 실행 경험을 확보하고, 이를 챗봇 프로젝트에 통합하는 작업까지 진행할 수 있었다.

특히 LangChain과의 연동 테스트, JSON 구조화 출력, 멀티모달 이미지 처리까지 다양한 활용 가능성을 실험해보며 로컬 LLM의 활용 범위에 대한 감을 잡을 수 있었다.

Provider 기반 설계 구조와 Enum 기반 모델 선택 로직은 실제 서비스 수준의 코드를 구현하는 데 있어 구조적 안정성을 크게 향상시켰다.

다음 주에는 사용자 세션 관리, 예외 처리 로직, 벡터 DB 기반 검색 기능을 통합해 챗봇 MVP 버전을 완성하는 것을 목표로 삼을 예정이다.

profile
AI 모델을 개발하여 이를 활용한 서비스를 개발하고 운영하는 개발자가 되기 위해 꾸준히 노력하겠습니다!

0개의 댓글