**하네스 엔지니어링(Harness Engineering)**은 소프트웨어 테스트 분야에서 유래된 용어로, LLM(대규모 언어 모델) 개발 환경에서는 모델의 성능을 평가, 테스트 및 비교하기 위한 자동화된 프레임워크를 구축하는 과정을 의미합니다.
Ollama를 활용하면서 하네스 엔지니어링을 적용하면, 로컬 모델의 답변 품질을 정량적으로 관리하고 최적의 프롬프트를 찾아낼 수 있습니다. 이를 단계별로 정리해 드립니다.
1. 하네스 엔지니어링의 핵심 구성 요소
Ollama 환경에서 하네스를 구축할 때 다음 4가지가 필요합니다.
-
Test Dataset (Gold Dataset): 모델에게 던질 질문과 기대하는 정답(Ground Truth)의 집합.
-
Execution Engine: Ollama API를 호출하여 모델에 질문을 던지고 응답을 받는 코드.
-
Evaluation Metrics: 응답이 얼마나 정확한지 측정하는 지표 (BLEU, ROUGE, BERTScore, 또는 LLM-as-a-judge).
-
Reporting: 테스트 결과를 시각화하고 모델 간 성능을 비교하는 대시보드.
2. Ollama를 이용한 하네스 구축 단계
1단계: Ollama 모델 준비 및 서빙
먼저 테스트할 모델들을 Ollama에 설치합니다.
ollama pull llama3
ollama pull mistral
ollama pull gemma
Ollama는 기본적으로 localhost:11434에서 REST API를 제공하므로, 이를 테스트 하네스의 엔드포인트로 사용합니다.
2단계: 테스트 데이터셋 작성 (tests.json)
질문과 예상 답변을 준비합니다.
[
{"instruction": "사과를 영어로 뭐야?", "expected": "Apple"},
{"instruction": "Python에서 리스트를 정렬하는 방법은?", "expected": "sort() 메서드나 sorted() 함수를 사용합니다."}
]
3단계: 테스트 실행 엔진 구축 (Python 예시)
Ollama Python 라이브러리나 requests를 사용하여 자동화 스크립트를 작성합니다.
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와 호환되는 오픈소스 하네스 도구를 사용하는 것이 훨씬 효율적입니다.
① Promptfoo (강력 추천)
프롬프트와 모델을 비교 테스트하는 데 가장 널리 쓰이는 도구입니다. Ollama와 완벽하게 연동됩니다.
-
설치: npm install -g promptfoo
-
설정(promptfooconfig.yaml):
Yamlproviders: - 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. 하네스 엔지니어링 적용 시 고려사항
-
파라미터 고정: 테스트 시에는 temperature를 0으로 설정하여 결과의 일관성(Reproducibility)을 확보해야 합니다.
-
하드웨어 모니터링: 로컬에서 실행하므로, 하네스 실행 중 GPU 메모리 사용량과 토큰 생성 속도(Tokens per second)를 함께 측정하여 리소스 효율성을 평가하십시오.
-
버전 관리: Ollama 모델은 업데이트될 수 있으므로, 테스트한 모델의 정확한 체크섬이나 버전을 기록해 두어야 합니다.
요약
Ollama에 하네스 엔지니어링을 적용한다는 것은 **”Promptfoo 같은 도구를 연결하여, 여러 모델(Llama3 vs Mistral)에 동일한 질문 데이터셋을 던지고, 그 결과를 정량적 지표로 비교하는 자동화 파이프라인을 만드는 것”**입니다. 처음 시작하신다면 Promptfoo를 Ollama와 연결해 보시는 것을 가장 추천드립니다.