데이터셋을 생성하는 과정에서 예상과 달리 CSV 파일의 행 수가 맞지 않는 문제가 발생했습니다. 원래는 데이터셋 크기가 16행이어야 했으나, 실제로 생성된 데이터셋의 행 수는 줄어들었습니다. 이를 분석해본 결과, SingleHopSpecificQuerySynthesizer 쿼리 생성 과정에서 필터링이 일어나면서 일부 데이터가 누락된 것으로 보입니다.
주요 원인:
쿼리 생성 과정에서 필터링: 모델이 특정 문서에 대해 질문을 생성하지 못하는 경우, 그 문서는 데이터셋에 포함되지 않습니다. 예를 들어, 문서 내용이 부족하거나 의미가 부족할 경우 쿼리가 생성되지 않아 행 수가 줄어들 수 있습니다.
testset_size 파라미터: testset_size=row
로 설정된 경우, 실제로 생성된 질문이 적다면 데이터셋의 행 수가 설정된 크기보다 적을 수 있습니다.
빈 데이터나 잘못된 데이터 처리: 전처리된 데이터에서 빈 캡션이 포함되거나 잘못된 데이터가 있을 경우, 해당 데이터는 질문을 생성하는 데 사용되지 않아 데이터셋에 포함되지 않을 수 있습니다.
언어 모델의 응답 문제: 모델이 적절한 질문을 생성하지 못한 경우, 해당 문서는 데이터셋에서 제외됩니다.
암 관련 정보를 바탕으로 모델을 파인튜닝한 후, 파인튜닝한 모델과 원본 모델을 비교했을 때 기대했던 만큼 큰 차이는 없었습니다. 예상보다 성능 향상이 두드러지지 않았지만, 파인튜닝이 확실히 도움이 되었음을 확인할 수 있었습니다.
비교 결과:
Ollama 모델을 효율적으로 관리하고 사용할 수 있도록 여러 모델을 통합하는 작업을 진행했습니다.
Ollama 모델을 사용하기 위해 OLLAMA_LLMs
라는 열거형 클래스에서 모델들을 정의했습니다. 여기서 두 가지 모델을 정의했습니다:
gemma3_4b_q8
: 일반 목적의 Ollama 모델gemma3_4b_q8_recipe
: 레시피와 관련된 작업을 수행할 수 있도록 튜닝된 Ollama 모델class OLLAMA_LLMs(enum.Enum):
gemma3_4b_q8 = (enum.auto(), "gemma3-q8")
gemma3_4b_q8_recipe = (enum.auto(), "gemma3-recipe")
Provider_Ollama
클래스Provider_Ollama
클래스는 Provider
클래스를 상속받아 Ollama 모델을 초기화하고 제공하는 역할을 합니다. 모델을 선택하고 호출하는 과정을 간편하게 만들어줍니다.
class Provider_Ollama(Provider):
def __init__(self, provider_LLMs=OLLAMA_LLMs):
super().__init__(provider_LLMs)
def __call__(self, model_name, messages):
# 선택된 모델로 ChatOllama 인스턴스 생성
llm = ChatOllama(model=self.provider_LLMs[model_name].value[1])
Provider
클래스 (provider.py)Provider
클래스는 모델을 초기화하고 호출하는 기능을 제공하는 추상 클래스입니다. 실제 모델을 선택하고 제공하는 로직은 Provider_Ollama
에서 구현됩니다.
class Provider:
def __init__(self, provider_LLMs):
self.provider_LLMs = provider_LLMs
def __call__(self, model_name):
# 모델을 호출하고 반환하는 방식
model = self.provider_LLMs[model_name].value[1]
return model
모델 정의 후, Provider_Ollama
클래스에서 모델을 호출하는 과정을 구현했습니다.
def get_llm_model():
# Provider_Ollama 인스턴스 생성
provider = Provider_Ollama()
# 'gemma3_4b_q8_recipe' 모델을 선택하여 ChatOllama 인스턴스를 반환
llm = provider("gemma3_4b_q8_recipe")
return llm
사용자 질문을 받아 모델에 전달하고 그에 대한 답변을 생성하는 흐름을 구현했습니다.
def ask(question, message_history, cooking_time=None, cooking_tools=None):
if len(message_history) == 0:
message_history.append({"role": "system", "content": "You are a helpful cooking recipe assistant. You must answer in Korean."})
message_history = add_history(message_history, role="user", content=question)
write_chat(role="user", message=message_history[-1]["content"])
response = write_chat(
role="assistant",
message=get_response_from_llm(message_history, cooking_time, cooking_tools)
)
message_history = add_history(message_history, role="assistant", content=response)
return message_history
Ollama 모델을 활용하여 다양한 작업을 효율적으로 처리할 수 있습니다. 예를 들어, 레시피 생성, 질문 응답 등의 작업에서 gemma3_4b_q8_recipe
모델을 활용해 작업을 진행할 수 있습니다.
gemma3_4b_q8_recipe
모델을 사용하여 사용자에게 제공할 레시피를 생성하고, 필요한 도구와 조리 방법을 구체적으로 안내할 수 있습니다.
**레시피 예시**
- **재료**: 계란, 토마토
- **조리 도구**: 프라이팬, 국자
**조리 방법**:
1. 토마토를 손질하여 자릅니다.
2. 계란을 풀어 프라이팬에 넣고 익힙니다. 약 3분 정도 익혀 주세요.
3. 익힌 계란에 토마토를 넣고 2분 정도 더 볶습니다.
4. 불을 끄고 서빙합니다.
이와 같은 방식으로 다양한 요리에 대한 상세한 레시피를 생성할 수 있습니다.
이번 프로젝트에서는 Provider_Ollama
와 OLLAMA_LLMs
열거형을 사용하여 Ollama 모델을 효율적으로 관리하고 호출할 수 있도록 했습니다. 이를 통해 사용자 맞춤형 레시피 생성 시스템을 구축할 수 있었고, 향후 다양한 모델을 추가하는 데 유연하게 대처할 수 있는 구조를 마련했습니다.
이번 주는 미니프로젝트에서 Ollama 모델을 통합하고, 파인튜닝된 모델을 사용하여 다양한 작업을 자동화하는 방법을 배웠습니다. 모델을 선택하고 활용하는 방법에 대한 이해가 조금 더 깊어졌고, 향후 다양한 분야에서 활용할 수 있을 것 같습니다. 앞으로도 지속적으로 배우고 개선하며 발전할 수 있도록 노력하겠습니다!