ollama 를 사용하면서 하네스엔지니어링을 적용하는 방법

**하네스 엔지니어링(Harness Engineering)**은 소프트웨어 테스트 분야에서 유래된 용어로, LLM(대규모 언어 모델) 개발 환경에서는 모델의 성능을 평가, 테스트 및 비교하기 위한 자동화된 프레임워크를 구축하는 과정을 의미합니다.

Ollama를 활용하면서 하네스 엔지니어링을 적용하면, 로컬 모델의 답변 품질을 정량적으로 관리하고 최적의 프롬프트를 찾아낼 수 있습니다. 이를 단계별로 정리해 드립니다.


1. 하네스 엔지니어링의 핵심 구성 요소

Ollama 환경에서 하네스를 구축할 때 다음 4가지가 필요합니다.

  1. Test Dataset (Gold Dataset): 모델에게 던질 질문과 기대하는 정답(Ground Truth)의 집합.

  2. Execution Engine: Ollama API를 호출하여 모델에 질문을 던지고 응답을 받는 코드.

  3. Evaluation Metrics: 응답이 얼마나 정확한지 측정하는 지표 (BLEU, ROUGE, BERTScore, 또는 LLM-as-a-judge).

  4. Reporting: 테스트 결과를 시각화하고 모델 간 성능을 비교하는 대시보드.


2. Ollama를 이용한 하네스 구축 단계

1단계: Ollama 모델 준비 및 서빙

먼저 테스트할 모델들을 Ollama에 설치합니다.

Bash

ollama pull llama3
ollama pull mistral
ollama pull gemma

Ollama는 기본적으로 localhost:11434에서 REST API를 제공하므로, 이를 테스트 하네스의 엔드포인트로 사용합니다.

2단계: 테스트 데이터셋 작성 (tests.json)

질문과 예상 답변을 준비합니다.

JSON

[
  {"instruction": "사과를 영어로 뭐야?", "expected": "Apple"},
  {"instruction": "Python에서 리스트를 정렬하는 방법은?", "expected": "sort() 메서드나 sorted() 함수를 사용합니다."}
]

3단계: 테스트 실행 엔진 구축 (Python 예시)

Ollama Python 라이브러리나 requests를 사용하여 자동화 스크립트를 작성합니다.

Python

import ollama
import json

models = ['llama3', 'mistral']
test_cases = [
    {"input": "대한민국의 수도는?", "expected": "서울"},
    {"input": "2+2는?", "expected": "4"}
]

results = []

for model in models:
    for case in test_cases:
        response = ollama.chat(model=model, messages=[
            {'role': 'user', 'content': case['input']}
        ])
        
        actual_out = response['message']['content']
        results.append({
            "model": model,
            "input": case['input'],
            "expected": case['expected'],
            "actual": actual_out
        })

# 결과 저장
with open('test_results.json', 'w', encoding='utf-8') as f:
    json.dump(results, f, ensure_content=False, indent=2)

4단계: 평가 지표 적용 (Evaluation)

단순 텍스트 일치 외에 더 정교한 평가가 필요합니다.

  • LLM-as-a-Judge: 더 강력한 모델(예: GPT-4 또는 로컬의 Llama3 70B)에게 “A 모델의 답변이 정답과 일치하는가?”라고 채점을 맡깁니다.

  • Semantic Similarity: Sentence-Transformers를 사용해 답변의 벡터 유사도를 측정합니다.


3. 추천 도구 (Harness Frameworks)

ollama 를 사용하면서 하네스엔지니어링을 적용하는 방법

직접 코드를 짜는 대신, Ollama와 호환되는 오픈소스 하네스 도구를 사용하는 것이 훨씬 효율적입니다.

① Promptfoo (강력 추천)

프롬프트와 모델을 비교 테스트하는 데 가장 널리 쓰이는 도구입니다. Ollama와 완벽하게 연동됩니다.

  • 설치: npm install -g promptfoo

  • 설정(promptfooconfig.yaml):

    Yaml

    providers:
      - id: ollama:chat:llama3
      - id: ollama:chat:mistral
    prompts:
      - "다음 질문에 짧게 답해줘: {{questions}}"
    tests:
      - vars:
          questions: "한국의 수도는?"
        assert:
          - type: contains
            value: "서울"
  • 실행: promptfoo view를 실행하면 웹 대시보드에서 모델별 성공률과 지연 시간(Latency)을 한눈에 볼 수 있습니다.

② DeepEval

LLM 유닛 테스트를 위한 프레임워크로, Pytest와 유사한 방식으로 Ollama 모델을 테스트할 수 있습니다.

  • 답변의 환각(Hallucination) 여부, 관련성 등을 체크하는 메트릭을 제공합니다.


4. 하네스 엔지니어링 적용 시 고려사항

  1. 파라미터 고정: 테스트 시에는 temperature를 0으로 설정하여 결과의 일관성(Reproducibility)을 확보해야 합니다.

  2. 하드웨어 모니터링: 로컬에서 실행하므로, 하네스 실행 중 GPU 메모리 사용량과 토큰 생성 속도(Tokens per second)를 함께 측정하여 리소스 효율성을 평가하십시오.

  3. 버전 관리: Ollama 모델은 업데이트될 수 있으므로, 테스트한 모델의 정확한 체크섬이나 버전을 기록해 두어야 합니다.

요약

Ollama에 하네스 엔지니어링을 적용한다는 것은 **”Promptfoo 같은 도구를 연결하여, 여러 모델(Llama3 vs Mistral)에 동일한 질문 데이터셋을 던지고, 그 결과를 정량적 지표로 비교하는 자동화 파이프라인을 만드는 것”**입니다. 처음 시작하신다면 Promptfoo를 Ollama와 연결해 보시는 것을 가장 추천드립니다.