언어모델 LLM/모델 및 프레임워크

한국어 잘하는 로컬모델로 챗봇 만들기

General AI 2024. 7. 20. 17:57
728x90
반응형

한국어 잘하는 로컬모델로 챗봇 만들기

한국어에 특화된 로컬 언어 모델을 사용하여 챗봇을 만드는 방법을 소개해드리려고 합니다. 이 프로젝트에서는 Llama-3 한국어 모델과 Ollama, 그리고 Streamlit을 활용하여 간단하면서도 강력한 챗봇을 구현하겠습니다.

한국어 잘하는 로컬모델로 챗봇 만들기

이 프로젝트에서는 Llama-3 기반의 한국어 모델을 사용하여 챗봇을 만들고, 두 가지 다른 버전의 모델 성능을 비교해 보겠습니다.

Ollama 설치 및 모델 생성

Ollama 설치 관련된 내용은 이전 포스팅 [ollama 소개 및 WSL 환경 설정] 를 참고하세요. Ollama가 설치되면, 다음 단계로 모델을 생성해야 합니다. 우리는 두 가지 버전의 Llama-3 한국어 모델을 사용할 것입니다:

  1. Llama-3-Open-Ko-8B-FP16 (링크)
  2. Llama-3-Open-Ko-8B-Q5_K_M (링크)

우선, 첫번째 모델을 위한 Modelfile을 생성합니다. Modelfile.fp16라는 이름으로 저장합니다.

FROM ./models/Llama-3-Open-Ko-8B-FP16.gguf
PARAMETER temperature 0.7
PARAMETER top_p 0.9
SYSTEM You are a helpful AI assistant fluent in Korean.

두번째 모델을 위한 Modelfile을 생성합니다. Modelfile.fp16라는 이름으로 저장합니다.

FROM ./models/Llama-3-Open-Ko-8B-Q5_K_M.gguf
PARAMETER temperature 0.7
PARAMETER top_p 0.9
SYSTEM You are a helpful AI assistant fluent in Korean.

이제 다음 명령어로 모델을 생성합니다:

ollama create llama-3-open-ko-8b-fp16 -f Modelfile.fp16
ollama create llama-3-open-ko-8b-q5_k_m -f Modelfile.q5

필요한 패키지 설치

프로젝트에 필요한 Python 패키지를 설치합니다:

pip install streamlit requests

챗봇 애플리케이션 구현

이제 Streamlit을 사용하여 챗봇 애플리케이션을 구현해 보겠습니다. 다음은 전체 코드입니다:

import streamlit as st
import requests
import time

OLLAMA_API_BASE = "http://localhost:11434/api"

def generate_response(model_name, prompt):
    url = f"{OLLAMA_API_BASE}/generate"
    data = {
        "model": model_name,
        "prompt": prompt,
        "stream": False
    }
    start_time = time.time()
    response = requests.post(url, json=data)
    total_time = time.time() - start_time

    if response.status_code == 200:
        result = response.json()
        return result['response'], total_time
    else:
        return f"Error: {response.status_code}", total_time

st.title("Llama-3 한국어 챗봇")

if "messages" not in st.session_state:
    st.session_state.messages = []

for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.markdown(message["content"])

if prompt := st.chat_input("무엇을 도와드릴까요?"):
    st.chat_message("user").markdown(prompt)
    st.session_state.messages.append({"role": "user", "content": prompt})

    models = ["llama-3-open-ko-8b-fp16:latest", "llama-3-open-ko-8b-q5_k_m:latest"]

    for model in models:
        with st.spinner(f'{model} 모델이 응답을 생성 중입니다...'):
            response, total_time = generate_response(model, prompt)

        with st.chat_message("assistant"):
            st.markdown(f"**{model} 모델 응답:**")
            st.markdown(response)
            st.markdown(f"응답에 소요된 시간은 {total_time:.2f} 초 입니다.")

        st.session_state.messages.append({
            "role": "assistant", 
            "content": f"**{model} 모델 응답:**\n{response}\n\n응답에 소요된 시간은 {total_time:.2f} 초 입니다."
        })

이 코드는 다음과 같은 기능을 수행합니다:

  1. Ollama API를 사용하여 모델과 통신합니다.
  2. 사용자의 입력을 받아 두 가지 버전의 모델에 전달합니다.
  3. 각 모델의 응답과 응답 생성에 걸린 시간을 표시합니다.
  4. Streamlit의 채팅 인터페이스를 사용하여 대화 기록을 유지합니다.

애플리케이션 실행

코드를 app.py 파일에 저장한 후, 다음 명령어로 애플리케이션을 실행합니다:

streamlit run app.py

브라우저에서 애플리케이션이 열리면, 채팅 인터페이스를 통해 모델과 대화할 수 있습니다. 각 질문에 대해 두 가지 버전의 모델이 응답하며, 응답 시간도 함께 표시됩니다.

실행결과

이 챗봇을 사용해보면, 두 모델 간의 성능 차이를 쉽게 비교할 수 있습니다. 일반적으로 Q5_K_M 모델이 FP16 모델보다 빠른 응답 시간을 보이지만, 응답의 품질이나 정확성에는 약간의 차이가 있을 수 있습니다.

한국어 잘하는 로컬모델로 챗봇 만들기

 

 

이러한 비교를 통해 사용 목적에 따라 적절한 모델을 선택할 수 있습니다. 빠른 응답이 필요한 경우 Q5_K_M 모델을, 더 정확하고 상세한 응답이 필요한 경우 FP16 모델을 선택할 수 있습니다.

마치며

이 프로젝트를 통해 우리는 로컬 환경에서 한국어 챗봇을 구현하고, 서로 다른 버전의 모델 성능을 비교해 볼 수 있었습니다. Ollama와 Streamlit의 조합은 빠르고 효율적인 챗봇 개발을 가능하게 해주었습니다. 앞으로 이 프로젝트를 발전시켜 더 다양한 기능을 추가하거나, 다른 한국어 모델들과의 성능 비교도 해볼 수 있을 것 같습니다.

 

728x90
반응형