
LangSmith와 Lilac을 활용한 LLM 파인튜닝 (Fine-tuning)
요약
LLM 애플리케이션을 프로덕션 단계로 전환할 때 필수적인 고품질 데이터셋 구축을 위해 LangSmith와 Lilac을 결합하는 워크플로우를 소개합니다. LangSmith로 실행 트레이스를 수집하고, Lilac을 통해 데이터를 정제 및 레이블링함으로써 효과적인 파인튜닝 데이터셋을 큐레이션하는 방법을 다룹니다.
핵심 포인트
- LangSmith는 LLM 애플리케이션의 실행 데이터를 대규모로 수집하고 관리하는 데 사용됩니다.
- Lilac은 수집된 데이터셋을 구조화, 필터링, 레이블링하여 데이터 파이프라인을 개선하는 데 특화되어 있습니다.
- 성공적인 파인튜닝을 위해서는 애플리케이션의 컨텍스트가 반영된 고품질의 데이터 큐레이션이 필수적입니다.
- LangSmith의 트레이스 캡처, Lilac의 데이터 정제, 그리고 모델 파인튜닝으로 이어지는 통합 워크플로우를 구축할 수 있습니다.
LLM (Large Language Model)을 프로토타입에서 프로덕션 단계로 전환할 때, 많은 이들이 애플리케이션에서 더 일관되고 고품질의 동작을 얻기 위해 모델 파인튜닝 (Fine-tuning)을 선택해 왔습니다. OpenAI 및 HuggingFace와 같은 서비스는 사용자의 애플리케이션 특화 데이터로 모델을 파인튜닝하는 것을 쉽게 만들어 줍니다. JSON 파일 하나만 있으면 충분합니다!
까다로운 부분은 그 데이터에 무엇을 포함할지 결정하는 것입니다. 일단 LLM이 배포되면 어떤 입력값이든 프롬프트 (Prompt)로 주어질 수 있는데, 모델이 상호작용하려는 사용자나 기계에 대해 적절하게 응답할 것이라고 어떻게 확신할 수 있을까요?
이를 위해서는 고유한 애플리케이션 컨텍스트 (Context)에서 추출한 고품질 데이터 외에는 진정한 대안이 없습니다. 바로 이 지점에서 LangSmith와 Lilac이 도움을 줄 수 있습니다.
LangSmith + Lilac
어떠한 언어 모델 애플리케이션이라도 이해하고 개선하기 위해서는 모델이 접하는 데이터를 빠르게 탐색하고 정리할 수 있는 능력이 중요합니다. 이를 달성하기 위해 LangSmith와 Lilac은 상호 보완적인 기능을 제공합니다:
LangSmith**:** LLM 애플리케이션에서 생성된 데이터셋을 대규모로 효율적으로 수집, 연결 및 관리합니다. 이를 사용하여 파인튜닝에 사용할 수 있는 양질의 예시(및 실패 사례)와 사용자 피드백을 캡처하세요.
Lilac**:** 데이터셋을 구조화, 필터링 및 정제하기 위한 고급 분석 기능을 제공하여 데이터 파이프라인 (Data Pipeline)을 지속적으로 개선하기 쉽게 만듭니다.
저희는 여러분의 파인튜닝 워크플로 (Workflow)를 시작할 수 있도록 이 두 강력한 도구를 연결하는 방법을 공유하고자 합니다.
Q&A 챗봇 파인튜닝
다음 섹션에서는 LangSmith와 Lilac을 사용하여, 문서에 대한 질문에 답하기 위해 검색 증강 생성 (RAG, Retrieval-Augmented Generation)을 사용하는 챗봇의 LLM을 파인튜닝하기 위한 데이터셋을 큐레이션할 것입니다. 예시를 위해, LangChain 문서용 Q&A 앱에서 샘플링된 데이터셋을 사용하겠습니다. 전체 프로세스는 아래 이미지에 요약되어 있습니다:
주요 단계는 다음과 같습니다:
- 프로토타입에서 트레이스 (Traces)를 캡처하여 후보 데이터셋으로 변환합니다.
- Lilac으로 가져와 레이블링 (Labeling), 필터링 (Filtering), 풍부화 (Enrichment)를 수행합니다.
- 풍부화된 데이터셋으로 모델을 파인튜닝 (Fine-tuning)합니다.
- 개선된 애플리케이션에서 파인튜닝된 모델을 사용합니다.
트레이스 (Traces) 캡처
LangChain을 사용하면 프롬프트 체이닝 (Prompt chaining)을 통해 프로토타입을 쉽게 설계할 수 있습니다. 처음에는 프롬프트 엔지니어링 (Prompt engineering)이 미흡하여 애플리케이션이 완전히 최적화되지 않거나 오류가 발생할 수 있지만, 데이터셋 큐레이션 (Dataset curation) 프로세스를 시작하기 위해 기능의 알파 버전을 빠르게 만들 수 있습니다. LangChain으로 구축할 때, 몇 가지 환경 변수를 설정하면 모든 실행 단계를 LangSmith로 쉽게 트레이스 (Trace)할 수 있습니다.
그 다음 LangSmith에서 UI를 통해 또는 프로그래밍 방식으로 (노트북 참조) 후보 데이터셋에 추가할 실행 건들을 선택할 수 있습니다.
Lilac으로 가져오기
💡
아래 섹션은 Lilac UI에 대한 개략적인 개요를 제공합니다. 이 워크플로우를 재현하며 더 깊이 있게 학습하려면 Python 쿡북 (Python cookbook)을 참조하세요.
Lilac은 LangSmith 데이터셋과 네이티브 통합을 제공합니다. Lilac을 로컬에 설치한 후, 환경 변수에 LANGCHAIN_API_KEY를 설정하면 Lilac UI에 LangSmith 데이터셋 목록이 자동으로 채워지는 것을 볼 수 있습니다. 파인튜닝 (Fine-tuning)을 위해 지정해 둔 데이터셋을 선택하면 Lilac이 나머지를 처리합니다.
데이터셋 큐레이션 (Curate your dataset)
이제 Lilac에 데이터셋이 준비되었으므로, Lilac의 시그널 (Signals), 컨셉 (Concepts), 레이블 (Labels)을 실행하여 데이터셋을 정리하고 필터링할 수 있습니다. 우리의 목표는 다양한 입력 유형에 대해 언어 모델 (Language model)이 생성한 양질의 결과물을 보여주는 뚜렷한 예시들을 선택하는 것입니다. Lilac이 데이터셋 구조를 잡는 데 어떻게 도움이 되는지 살펴보겠습니다.
시그널 (Signals)
우선, Lilac은 데이터셋에 적용할 수 있는 두 가지 유용한 시그널 (Signals)을 제공합니다: 유사 중복 (Near-duplicates) 및 *개인정보(PII) 탐지 (PII detection)*입니다. 입력값에 대한 유사 중복을 필터링하는 것은 모델이 다양한 정보를 학습하도록 보장하고 암기 (Memorization) 가능성을 줄이는 데 중요합니다. UI에서 시그널을 계산하려면 왼쪽 상단의 스키마 (Schema)를 확장하고, 풍부하게 만들고자 하는 필드의 컨텍스트 메뉴에서 “Compute Signal”을 선택하세요.
컨셉 (Concepts)
시그널 외에도 Lilac은 사용자가 중요하게 생각하는 축을 따라 데이터를 정리할 수 있는 강력한 방법인 *컨셉 (Concepts)*을 제공합니다. 컨셉은 간단히 말해 긍정 예시 (Positive examples, 컨셉과 관련된 텍스트)와 부정 예시 (Negative examples, 컨셉과 반대되거나 관련 없는 텍스트)의 집합입니다. Lilac에는 독성 (Toxicity), 비속어 (Profanity), 감성 (Sentiment) 등과 같은 여러 내장 컨셉이 포함되어 있으며, 직접 생성할 수도 있습니다. 데이터셋에 컨셉을 적용하기 전에, 우리가 관심을 갖는 필드에 대해 텍스트 임베딩 (Text embeddings)을 계산해야 합니다.
임베딩을 계산하고 나면, 검색창 메뉴에서 컨셉을 선택하여 이를 미리보기 (Preview) 할 수 있습니다.
데이터셋 전체에 대해 컨셉을 계산하려면 스키마 뷰어의 컨텍스트 메뉴에서 “Compute concept”을 선택하세요.
컨셉 외에도 임베딩은 데이터를 탐색하기 위한 두 가지 유용한 기능인 시맨틱 검색 (Semantic search) 및 유사한 (Similar) 예시 찾기를 가능하게 합니다.
레이블 (Labels)
시그널과 컨셉을 이용한 자동 레이블링 외에도, Lilac을 사용하면 개별 행에 커스텀 레이블을 태깅할 수 있으며, 이는 나중에 데이터셋을 가지치기 (Pruning) 하는 데 사용할 수 있습니다.
Lilac에서 예시에 레이블 지정하기
계산 (Calculation) 새로운 레이블을 추가하면 시그널이나 컨셉과 마찬가지로 데이터셋에 새로운 최상위 *열 (Column)*이 생성됩니다. 생성된 열은 추가적인 분석을 수행하는 데 사용할 수 있습니다.
데이터셋 내보내기 (Export the dataset)
필터링에 필요한 정보가 계산되면, 노트북에 표시된 것처럼 Python을 통해 강화된 데이터셋 (enriched dataset)을 내보내거나, Lilac의 UI를 통해 브라우저에서 JSON 파일로 다운로드할 수 있습니다. 대량의 데이터를 다운로드하거나 데이터 선택에 대해 더 정밀한 제어가 필요한 경우에는 Python API를 사용하는 것을 권장합니다.
강화된 데이터셋을 내보낸 후에는, 강화된 필드 (enriched fields)를 사용하여 Python에서 예시들을 쉽게 필터링할 수 있습니다.
파인튜닝 (Fine-tune)
데이터셋이 준비되었으니, 이제 파인튜닝 (fine-tune)을 할 차례입니다! LangChain의 메시지 형식 (message format)을 OpenAI, HuggingFace 또는 기타 학습 프레임워크 (training frameworks)에서 요구하는 형식으로 변환하는 것은 매우 쉽습니다. 더 자세한 정보는 링크된 노트북을 확인해 보세요!
체인에서의 사용 (Use in your Chain)
파인튜닝된 LLM을 확보했다면, LLM의 "model" 인자 (argument)를 업데이트하여 해당 모델로 전환할 수 있습니다.
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model="ft:gpt-3.5-turbo-0613:{openaiOrg}::{modelId}")
데이터를 적절하게 구조화했다고 가정하면, 이 모델은 응답을 생성할 때 사용자가 원하는 구조와 스타일에 대해 더 높은 인지 능력을 갖게 될 것입니다.
결론 (Conclusion)
이 글은 Lilac과 LangSmith를 통합하여 트레이스 (traces)로부터 파인튜닝된 모델로 나아가는 과정에 대한 간단한 개요를 다루었습니다. 데이터 프로세스가 구축되면, 문맥적 추론 (contextual reasoning) 애플리케이션의 각 구성 요소를 지속적으로 개선할 수 있습니다. LangSmith는 데이터 캡처 시 시간을 절약할 수 있도록 사용자 및 모델 보조 피드백 (user and model-assisted feedback)을 수집하는 것을 용이하게 하며, Lilac은 모든 텍스트 데이터를 분석, 라벨링 (labeling) 및 정리하여 모델을 적절하게 개선할 수 있도록 도와줍니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 LangChain Blog의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기