[플레이데이터 SK네트웍스 Family AI 캠프 10기] 14주차 회고

문승기·2025년 4월 14일
0

SK네트웍스 Family AI캠프 14기 14주차 회고록 (25.04.07 ~ 25.04.11)

기간: 25.04.07 ~ 25.04.11


※ 트러블 슈팅

1. 데이터셋을 만드는 과정에서 csv의 행의 개수가 동일하게 만들어지지 않는다.

데이터셋을 생성하는 과정에서 예상과 달리 CSV 파일의 행 수가 맞지 않는 문제가 발생했습니다. 원래는 데이터셋 크기가 16행이어야 했으나, 실제로 생성된 데이터셋의 행 수는 줄어들었습니다. 이를 분석해본 결과, SingleHopSpecificQuerySynthesizer 쿼리 생성 과정에서 필터링이 일어나면서 일부 데이터가 누락된 것으로 보입니다.

주요 원인:

  1. 쿼리 생성 과정에서 필터링: 모델이 특정 문서에 대해 질문을 생성하지 못하는 경우, 그 문서는 데이터셋에 포함되지 않습니다. 예를 들어, 문서 내용이 부족하거나 의미가 부족할 경우 쿼리가 생성되지 않아 행 수가 줄어들 수 있습니다.

  2. testset_size 파라미터: testset_size=row로 설정된 경우, 실제로 생성된 질문이 적다면 데이터셋의 행 수가 설정된 크기보다 적을 수 있습니다.

  3. 빈 데이터나 잘못된 데이터 처리: 전처리된 데이터에서 빈 캡션이 포함되거나 잘못된 데이터가 있을 경우, 해당 데이터는 질문을 생성하는 데 사용되지 않아 데이터셋에 포함되지 않을 수 있습니다.

  4. 언어 모델의 응답 문제: 모델이 적절한 질문을 생성하지 못한 경우, 해당 문서는 데이터셋에서 제외됩니다.


2. 파인튜닝 결과 비교

암 관련 정보를 바탕으로 모델을 파인튜닝한 후, 파인튜닝한 모델과 원본 모델을 비교했을 때 기대했던 만큼 큰 차이는 없었습니다. 예상보다 성능 향상이 두드러지지 않았지만, 파인튜닝이 확실히 도움이 되었음을 확인할 수 있었습니다.

비교 결과:

  • 파인튜닝 전: 일반적인 모델을 사용한 결과
  • 파인튜닝 후: 암 관련 정보에 대해 파인튜닝한 모델을 사용한 결과
  • 두 모델 간 성능 차이가 있었지만, 눈에 띄게 큰 차이는 없었습니다.

※ 3. Ollama 모델 통합 및 사용

1. Ollama 모델 통합 (ollama.py)

Ollama 모델을 효율적으로 관리하고 사용할 수 있도록 여러 모델을 통합하는 작업을 진행했습니다.

1.1. 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")
1.2. 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])

2. 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

3. 시스템 통합 흐름

3.1. 모델 선택 및 호출

모델 정의 후, Provider_Ollama 클래스에서 모델을 호출하는 과정을 구현했습니다.

def get_llm_model():
    # Provider_Ollama 인스턴스 생성
    provider = Provider_Ollama()

    # 'gemma3_4b_q8_recipe' 모델을 선택하여 ChatOllama 인스턴스를 반환
    llm = provider("gemma3_4b_q8_recipe")
    return llm
3.2. 대화 흐름

사용자 질문을 받아 모델에 전달하고 그에 대한 답변을 생성하는 흐름을 구현했습니다.

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

4. 프로젝트에서의 활용

Ollama 모델을 활용하여 다양한 작업을 효율적으로 처리할 수 있습니다. 예를 들어, 레시피 생성, 질문 응답 등의 작업에서 gemma3_4b_q8_recipe 모델을 활용해 작업을 진행할 수 있습니다.

4.1. 레시피 생성

gemma3_4b_q8_recipe 모델을 사용하여 사용자에게 제공할 레시피를 생성하고, 필요한 도구와 조리 방법을 구체적으로 안내할 수 있습니다.

**레시피 예시**

- **재료**: 계란, 토마토
- **조리 도구**: 프라이팬, 국자

**조리 방법**:
1. 토마토를 손질하여 자릅니다.
2. 계란을 풀어 프라이팬에 넣고 익힙니다. 약 3분 정도 익혀 주세요.
3. 익힌 계란에 토마토를 넣고 2분 정도 더 볶습니다.
4. 불을 끄고 서빙합니다.

이와 같은 방식으로 다양한 요리에 대한 상세한 레시피를 생성할 수 있습니다.


5. 추가적인 설명

이번 프로젝트에서는 Provider_OllamaOLLAMA_LLMs 열거형을 사용하여 Ollama 모델을 효율적으로 관리하고 호출할 수 있도록 했습니다. 이를 통해 사용자 맞춤형 레시피 생성 시스템을 구축할 수 있었고, 향후 다양한 모델을 추가하는 데 유연하게 대처할 수 있는 구조를 마련했습니다.


KPT 회고 (14주차)

Keep (계속 유지할 점)

  • 꾸준히 진행 중인 공부와 운동을 계속 이어가며, 힘든 순간에도 포기하지 않기
  • 파인튜닝과 모델 통합 과정에서 배운 점들을 계속 발전시켜 나가기

Problem (개선이 필요한 점)

  • 새로운 개념을 배울 때, 한 번에 모든 것을 이해하려 하기보다는 단계적으로 접근할 필요가 있음
  • 데이터셋을 만들 때 예기치 않은 문제들이 발생할 수 있음을 인지하고, 문제 해결을 위한 접근 방법을 더 다양화할 필요 있음

Try (앞으로 시도할 것)

  • 더 작은 목표를 설정하고 이를 차근차근 해결해 나가면서 성취감을 느끼는 방법을 시도
  • 데이터셋을 만들 때 발생할 수 있는 문제를 미리 예측하고, 다양한 테스트 케이스를 고려하여 안정적인 시스템을 구축
  • 모델 성능을 높이기 위한 추가적인 파인튜닝이나 하이퍼파라미터 조정 방법을 계속 실험해보기

마무리

이번 주는 미니프로젝트에서 Ollama 모델을 통합하고, 파인튜닝된 모델을 사용하여 다양한 작업을 자동화하는 방법을 배웠습니다. 모델을 선택하고 활용하는 방법에 대한 이해가 조금 더 깊어졌고, 향후 다양한 분야에서 활용할 수 있을 것 같습니다. 앞으로도 지속적으로 배우고 개선하며 발전할 수 있도록 노력하겠습니다!

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

0개의 댓글