한국어 잘하는 로컬모델로 챗봇 만들기
한국어에 특화된 로컬 언어 모델을 사용하여 챗봇을 만드는 방법을 소개해드리려고 합니다. 이 프로젝트에서는 Llama-3 한국어 모델과 Ollama, 그리고 Streamlit을 활용하여 간단하면서도 강력한 챗봇을 구현하겠습니다.
이 프로젝트에서는 Llama-3 기반의 한국어 모델을 사용하여 챗봇을 만들고, 두 가지 다른 버전의 모델 성능을 비교해 보겠습니다.
Ollama 설치 및 모델 생성
Ollama 설치 관련된 내용은 이전 포스팅 [ollama 소개 및 WSL 환경 설정] 를 참고하세요. Ollama가 설치되면, 다음 단계로 모델을 생성해야 합니다. 우리는 두 가지 버전의 Llama-3 한국어 모델을 사용할 것입니다:
우선, 첫번째 모델을 위한 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} 초 입니다."
})
이 코드는 다음과 같은 기능을 수행합니다:
- Ollama API를 사용하여 모델과 통신합니다.
- 사용자의 입력을 받아 두 가지 버전의 모델에 전달합니다.
- 각 모델의 응답과 응답 생성에 걸린 시간을 표시합니다.
- Streamlit의 채팅 인터페이스를 사용하여 대화 기록을 유지합니다.
애플리케이션 실행
코드를 app.py
파일에 저장한 후, 다음 명령어로 애플리케이션을 실행합니다:
streamlit run app.py
브라우저에서 애플리케이션이 열리면, 채팅 인터페이스를 통해 모델과 대화할 수 있습니다. 각 질문에 대해 두 가지 버전의 모델이 응답하며, 응답 시간도 함께 표시됩니다.
실행결과
이 챗봇을 사용해보면, 두 모델 간의 성능 차이를 쉽게 비교할 수 있습니다. 일반적으로 Q5_K_M 모델이 FP16 모델보다 빠른 응답 시간을 보이지만, 응답의 품질이나 정확성에는 약간의 차이가 있을 수 있습니다.
이러한 비교를 통해 사용 목적에 따라 적절한 모델을 선택할 수 있습니다. 빠른 응답이 필요한 경우 Q5_K_M 모델을, 더 정확하고 상세한 응답이 필요한 경우 FP16 모델을 선택할 수 있습니다.
마치며
이 프로젝트를 통해 우리는 로컬 환경에서 한국어 챗봇을 구현하고, 서로 다른 버전의 모델 성능을 비교해 볼 수 있었습니다. Ollama와 Streamlit의 조합은 빠르고 효율적인 챗봇 개발을 가능하게 해주었습니다. 앞으로 이 프로젝트를 발전시켜 더 다양한 기능을 추가하거나, 다른 한국어 모델들과의 성능 비교도 해볼 수 있을 것 같습니다.
'언어모델 LLM > 모델 및 프레임워크' 카테고리의 다른 글
RAG vs 파인튜닝: AI 모델 최적화의 두 가지 접근 (0) | 2024.07.21 |
---|---|
Gemma2 모델을 Ollama와 Streamlit으로 테스트하기 (0) | 2024.07.20 |
Whisper 모델로 텍스트로 변환하기 (0) | 2024.07.13 |
oneMinTTS: 오픈소스 음성 합성 프로젝트 소개 (0) | 2024.07.09 |
Piper TTS: 설치 및 사용 가이드 (0) | 2024.07.08 |