LangSmith를 사용하여 파인튜닝 지원하기
요약
본 가이드는 LangSmith를 활용하여 LLM의 데이터셋 관리, 평가 및 파인튜닝 과정을 안내합니다. 오픈 소스 모델(LLaMA2)과 OpenAI의 gpt-3.5-turbo 등 다양한 환경에서 추출 작업에 대한 파인튜닝을 진행하고 그 결과를 평가하는 방법을 다룹니다.
핵심 포인트
- LangSmith를 사용해 데이터셋 관리 및 LLM 평가가 가능합니다.
- 파인튜닝은 새로운 지식 학습보다 전문화된 작업을 가르치는 데 적합합니다.
- 오픈 소스 모델과 OpenAI의 파인튜닝 지원 증가로 활용도가 높아지고 있습니다.
요약
저희는 LangSmith를 활용하여 데이터셋 관리 및 평가를 통해 LLM을 파인튜닝하고 평가하는 가이드를 제작했습니다. 이 과정은 CoLab과 HuggingFace에서 오픈 소스 LLM으로 모델 학습을 진행한 경우와 OpenAI의 새로운 파인튜닝 서비스를 이용한 경우 모두에 대해 다루었습니다. 테스트 케이스로, 저희는 LangSmith에서 내보낸 훈련 데이터를 사용하여 LLaMA2-7b-chat 및 gpt-3.5-turbo를 추출 작업(지식 그래프 트리플 추출)을 위해 파인튜닝했으며, 또한 LangSmith를 이용해 그 결과를 평가했습니다. CoLab 가이드는 여기에서 확인할 수 있습니다.
배경
최근 몇 주 동안 파인튜닝에 대한 관심이 급격히 증가했습니다. 이는 주로 두 가지 원인에 기인합니다.
첫째, 오픈 소스 LLM 생태계가 놀라울 정도로 성장했습니다. 과거에는 최신 기술(SOTA) 대비 현저히 뒤처졌던 오픈 소스 LLM에서, 이제는 일반 소비자용 노트북에서도 구동할 수 있는 근접 SOTA (예: Llama-2) LLM으로 발전했습니다! 이러한 발전의 동력으로는 점점 더 커지는 훈련 데이터 코퍼스(x축, 아래)와 명령어 준수 및 인간과의 정렬성이 향상된 응답을 위한 파인튜닝(y축)이 있습니다. 성능 좋은 오픈 소스 기반 모델은 비용 절감(예: 토큰 집약적 작업의 경우), 개인 정보 보호 등의 이점을 제공하며, 특히 파인튜닝을 통해 매우 구체적인 작업을 수행하는 데 있어 훨씬 작은 오픈 소스로 SOTA LLM을 능가할 기회를 제공합니다.
둘째, 선도적인 LLM 제공업체인 OpenAI가 gpt-3.5-turbo (및 다른 모델)에 대한 파인튜닝 지원을 출시했습니다. 이전에는 파인튜닝이 구형 모델에만 가능했습니다. 이 모델들은 신규 모델만큼의 성능을 갖추지 못했기 때문에, 파인튜닝을 거친 후에도 GPT-3.5나 퓨샷(few-shot) 예제와 비교했을 때 경쟁력이 없는 경우가 많았습니다. 이제 새로운 모델들도 파인튜닝이 가능해지면서 많은 사람들이 변화를 기대하고 있습니다.
일각에서는 조직이 단일한 거대 범용 모델(generalist model) 대신 오픈 소스 기반 모델에서 파생된 여러 전문 특화 LLM을 선택할 수 있다고 주장했습니다. 이러한 점과 HuggingFace와 같은 라이브러리가 파인튜닝을 지원한다는 것을 염두에 두고, 언제 어떻게 파인튜닝해야 하는지 궁금하실 수 있습니다. 이 가이드는 개요를 제공하고 LangSmith가 이 과정을 어떻게 지원할 수 있는지 보여줍니다.

언제 파인튜닝을 해야 할까요 (When to fine-tune)
LLM은 적어도 두 가지 방식으로 새로운 지식을 학습할 수 있습니다. 바로 가중치 업데이트(weight updates) (예: 사전 학습 또는 파인튜닝) 방식과 프롬프팅(prompting) 방식(예: 검색 증강 생성, RAG)입니다. 모델의 가중치는 장기 기억과 같고, 프롬프트는 단기 기억과 같습니다. 이 OpenAI 코크북에는 유용한 비유가 있습니다. 모델을 파인튜닝하는 것은 시험 일주일 전에 공부하는 것과 같습니다. 지식을 프롬프트에 삽입할 때(예: 검색을 통해)는 필기 노트를 가지고 시험을 치르는 것과 같습니다.
이 점을 염두에 둘 때, 파인튜닝은 LLM에게 새로운 지식이나 사실적 회상을 가르치는 데 적합하지 않습니다. OpenAI의 John Schulman이 발표한 이 강연에서는 파인튜닝이 환각(hallucinations)을 증가시킬 수 있다고 언급합니다. 파인튜닝은 전문화된 작업을 가르치는 데 더 적합하지만, 프롬프팅이나 RAG와 비교하여 고려해야 합니다. 여기서 논의했듯이, 파인튜닝은 충분한 예제가 있는 명확하게 정의된 작업(well-defined tasks) 또는 퓨샷 프롬프팅(few-shot prompting)을 위한 인컨텍스트 학습 능력(in-context learning capacity)이 부족한 LLM에 도움이 될 수 있습니다. 이 Anyscale 블로그는 이러한 요점들을 잘 요약합니다: 파인튜닝은 사실(facts)이 아니라 형식(form)을 위한 것입니다.
어떻게 파인튜닝을 해야 할까요 (How to fine-tune)
HuggingFace의 OpenAssistant 코퍼스 일부를 사용하여 채팅과 같은 작업을 위해 많은 유용한 LLaMA 파인튜닝 레시피가 공개되었습니다. 주목할 만한 점은 이러한 작업들이 단일 CoLab GPU에서 작동하여 워크플로우 접근성이 높다는 것입니다. 하지만, 파인튜닝에서 남아있는 가장 큰 두 가지 문제점은 데이터셋 수집/정제(dataset collection / cleaning)와 평가(evaluation)입니다. 아래에서는 LangSmith가 이 두 가지 문제를 해결하는 데 어떻게 사용될 수 있는지 보여줍니다 (녹색 부분 참고).

작업 (Task)
작업 (Task)
분류(classification), 태깅(tagging) 또는 추출(extraction)과 같은 작업은 파인튜닝에 적합합니다. Anyscale은 LLaMA 7B 및 13B LLM을 추출, 텍스트-투-SQL, QA에 대해 파인튜닝하여 GPT4를 능가하는 유망한 결과를 보고했습니다. 테스트 사례로, 우리는 텍스트에서 (주어, 관계, 목적어) 형태의 지식 삼중항(knowledge triples) 추출을 선택했습니다. 여기서 주어와 목적어는 개체(entity)이며, 관계는 그들 사이의 속성 또는 연결입니다. 이 삼중항들은 나중에 지식 그래프(knowledge graphs), 즉 개체와 그들의 관계에 대한 정보를 저장하는 데이터베이스를 구축하는 데 사용될 수 있습니다. 우리는 LLM(GPT3.5 또는 4)이 함수 호출(function calling)을 통해 삼중항을 추출하는 능력을 탐색하기 위해 사용자 입력 텍스트에서 삼중항 추출을 위한 공개 Streamlit 앱을 구축했습니다. 병렬로, 우리는 공용 데이터셋을 사용하여 LLaMA2-7b-chat과 GPT-3.5를 이 작업에 대해 파인튜닝했습니다.
데이터셋 (Dataset)
LLM 훈련에서 데이터셋 수집 및 정제는 종종 어려운 작업입니다. 프로젝트가 LangSmith에 설정되면, 생성(generation)이 자동으로 기록되어 대량의 데이터를 얻기 쉽습니다. LangSmith는 사용자 피드백 필터, 태그 및 기타 메트릭을 사용하여 품질이 낮은 사례를 선택하고, 앱에서 출력을 수정하여 모델 결과를 개선하는 데 사용할 수 있는 데이터셋으로 저장할 수 있도록 쿼리 가능한 인터페이스를 제공합니다 (아래 참조).

예시로, 우리는 공개 BenchIE 및 CarbIE 데이터셋의 지식 그래프 삼중항을 사용하여 LangSmith 학습(train) 및 테스트(test) 데이터셋을 만들었습니다. 우리는 이를 {s: 주어, object: 목적어, relation: 관계}로 각 삼중항이 표현되는 공유 JSON 형식으로 변환하고, 결합된 데이터를 무작위로 약 1500개의 레이블링된 문장으로 구성된 학습 세트와 100개 문장으로 구성된 테스트 세트로 분할했습니다. CoLab은 LangSmith 데이터셋을 쉽게 로드하는 방법을 보여줍니다. 일단 로드되면, 아래 시스템 프롬프트와 LLaMA 지침 토큰을 사용하여 파인튜닝을 위한 지침을 생성합니다 (여기서 수행한 것처럼):
`
"s": 문장의 주어(subject)로, 진술의 주요 개체입니다.
"object": 목적어로, 주어가 관련된 개체나 개념입니다.
"relation": 주어와 목적어 사이의 관계입니다.
그리고 A100에서 CoLab의 약 1500개 지침을 사용하여 파인튜닝했습니다. 학습 구성을 위해 여기에서 LLaMA 파인튜닝 매개변수를 사용했습니다: BitsAndBytes는 기본 모델을 4비트 정밀도로 로드하지만, 순전파(forward) 및 역전파(backward) 과정은 fp16으로 이루어집니다. 저희는 지침에 대한 파인튜닝을 위해 지도 학습 (Supervised Fine-Tuning, SFT)을 사용했으며, 이는 이 작은 데이터 볼륨의 경우 A100에서 매우 빠릅니다(< 15분).
OpenAI 파인튜닝
OpenAI의 GPT-3.5-turbo 채팅 모델을 파인튜닝하기 위해, 저희는 학습 데이터셋에서 50개의 예시를 선택하여 예상 형식의 채팅 메시지 목록으로 변환했습니다:
`{
"messages": [
{
"role": "user",
"content": "다음 문장에서 세 개의 쌍(triplets)을 추출하세요:\n\n{sentence}"},
{
"role": "assistant",
"content": "{triples}"
},
...
]
}
기본 모델이 매우 광범위한 능력을 가지고 있기 때문에, 원하는 동작을 달성하는 데 많은 데이터가 필요하지 않았습니다. 학습 데이터는 모델에게 실질적인 정보를 가르치기보다는 항상 올바른 형식과 스타일로 생성하도록 유도하는 역할을 합니다. 아래 평가 섹션에서 볼 수 있듯이, 50개의 학습 예시는 모델이 매번 정확한 형식으로 세 개의 쌍을 예측하기에 충분했습니다.
저희는 파인튜닝 데이터를 openai SDK를 통해 업로드하고, 결과로 나온 모델을 LangChain의 ChatOpenAI 클래스에서 직접 사용했습니다. 파인튜닝된 모델은 다음과 같이 직접 사용할 수 있습니다:
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model="ft:gpt-3.5-turbo-0613:{openaiOrg}::{modelId}")
전체 과정은 몇 분밖에 걸리지 않았으며, 프롬프트 템플릿에서 몇 가지 예시를 추가할 필요가 없다는 점을 제외하고는 저희 체인에 코드 변경이 필요하지 않았습니다. 그런 다음 이 모델의 성능을 정량화하기 위해 다른 모델들과 비교했습니다. 전체 과정의 예시는 저희 CoLab 노트북에서 확인할 수 있습니다.
평가
평가
각 모델은 LangSmith를 사용하여 평가되었으며, LLM(GPT-4) 평가자를 적용하여 각 예측을 채점했습니다. 이 평가자는 레이블과 예측된 트리플렛 간의 사실적 불일치를 식별하도록 지시받았으며, 이를 통해 해당 레이블에 존재하지 않는 트리플렛을 예측하거나 예측이 트리플렛을 포함하는 데 실패할 경우 감점합니다. 하지만 객체나 관계의 정확한 표현 방식이 의미 없는 방식으로 다를 경우에는 관대하게 평가합니다. 평가자는 0점에서 100점 사이의 점수로 결과를 채점합니다. 저희는 커스텀 평가자와 테스트 체인을 쉽게 구성하기 위해 CoLab에서 평가를 실행했습니다.
아래 표는 llama 기본 채팅 모델과 파인튜닝된 변형 모델에 대한 평가 결과를 보여줍니다. 비교를 위해 OpenAI의 채팅 모델 3가지(few-shot 프롬프팅을 사용한 gpt-3.5-turbo, 50개의 학습 데이터 포인트로 파인튜닝된 gpt-3.5-turbo 모델, 그리고 few-shot gpt-4 체인)도 벤치마크했습니다:
- Few-shot 프롬프팅을 사용한 GPT-4가 가장 좋은 성능을 보였습니다.
- 파인튜닝된 GPT-3.5가 그 뒤를 이었습니다.
- 파인튜닝된 LLaMA-7b-chat이 GPT-3.5의 성능을 능가했습니다.
- 그리고 파인튜닝된 LLaMA-7b-chat은 기준선(baseline) LLaMA-7b-chat보다 약 29% 더 좋았습니다.
| Fine-tuned llama-2 | Base llama-2 chat model | Few-shot gpt-3.5-turbo | Finetuned gpt-3.5-turbo | Few-shot gpt-4 | Score | |
|---|---|---|---|---|---|---|
| 49% | 38% | 40% | 56% | 59% |
분석
저희는 LangSmith를 사용하여 일반적인 실패 모드를 파악하고, 파인튜닝된 모델이 기본 모델보다 더 잘 작동하는 지점을 더 잘 이해합니다. 낮은 점수를 받은 예측을 필터링함으로써, 기준선 LLaMA-7b-chat이 얼마나 우스꽝스럽게 환각(hallucinates)을 일으키는지 볼 수 있습니다. 아래 사례에서 LLM은 주어를 호머 심슨으로 생각하고 원하는 형식 범위를 벗어나 무심하게 답변합니다 (여기). 반면 파인튜닝된 LLaMA-7b-chat (여기)는 참조 값(ground truth)에 훨씬 더 가깝게 접근합니다.

few-shot 예시가 있음에도 불구하고, 기준선 LLaMA-7b-chat은 비공식적인 잡담 스타일로 답변하려는 경향이 있습니다 (여기).

반면, 파인튜닝된 모델은 원하는 답변 형식에 맞춰 텍스트를 생성하는 경향이 있으며 원치 않는 대화를 추가하지 않습니다 (여기). 
파인튜닝된 모델이라도 여전히 원하는 콘텐츠 생성을 실패하는 경우가 있었습니다. 아래 예시(링크)에서 이 모델은 추출된 결과를 생성하기보다 지침을 반복했습니다. 이는 다양한 접근 방식, 예를 들어 다른 디코딩 파라미터 사용 (또는 로짓 바이어싱 사용), 더 많은 지침 추가, 더 큰 기반 모델 사용 (예: 13b), 또는 개선된 지침(프롬프트 엔지니어링) 등을 통해 수정될 수 있습니다.

위의 몇 가지 예시로 프롬프트한 GPT-4와 비교해 볼 수 있는데, 이는 학습 데이터셋으로 파인튜닝하지 않고도 합리적인 삼중항(triplet)을 추출할 수 있었습니다. 
결론
우리는 몇 가지 핵심 교훈을 도출할 수 있습니다:
AI 자동 생성 콘텐츠
본 콘텐츠는 LangChain Blog의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기