distilabel을 활용한 Argilla SDK 챗봇 – 엔드‑투‑엔드 튜토리얼
TL;DR
우리는 distilabel을 사용해 합성 Q&A 삼중항을 생성하고, Matryoshka 손실로 BGE‑base 임베딩 모델을 파인튜닝하며, 가벼운 lancedb 벡터 저장소에 임베딩을 저장하고, Gradio를 통해 Hugging Face Spaces에 채팅 인터페이스를 배포함으로써 Argilla 2.0용 도메인‑특화 RAG 챗봇을 구축했습니다.
distilabel로 합성 학습 데이터 생성
핵심 결과: Argilla 문서에 대한 현실적인 질의와 어려운 네거티브를 포착하는 삼중항 데이터셋(anchor, positive, negative).
- 파이프라인은 Hub 데이터셋
plaguss/argilla_sdk_docs_raw_unstructured에서 원시 문서 청크를 로드하고, 컬럼chunks를anchor로 이름을 바꾸는 것으로 시작합니다. GenerateSentencePair(삼중항 모드)는 LLMmeta-llama/Meta-Llama-3-70B-Instruct를 사용해 각 청크에 대한 positive 질의를 생성하고, 관련 없지만 어휘적으로 유사한 negative 질의를 생성합니다.- 커스텀
MultipleQueries작업은 각 positive 질의를 세 개의 추가 변형으로 확장하여 데이터셋 크기를 네 배로 늘립니다. MergeColumns와ExpandColumns는 원본 및 생성된 질의를 하나의positive컬럼으로 합쳐, 질의‑anchor‑negative 삼중항당 한 행을 생성합니다.
전체 파이프라인은 pipeline_docs_queries.py에 정의되어 있으며, 최종 데이터셋을 plaguss/argilla_sdk_docs_queries에 푸시합니다.
Argilla에서 데이터셋 탐색 및 정제
핵심 결과: (1) 원시 문서 청크, (2) 임베딩 파인튜닝 삼중항, (3) 챗봇 상호작용 로그를 위한 세 개의 Argilla 데이터셋.
- Documentation chunks –
filename과chunk필드에 인간 검증을 위한 이진 레이블good_chunk가 포함됩니다. - Embedding triples –
anchor,positive,negative필드와 이진 관련성 레이블is_positive_relevant및is_negative_irrelevant가 포함됩니다. - Chatbot logs –
instruction와response필드에 메타데이터conv_id와turn이 추가되며, 레이블은 정답 여부와 가드레일 위반을 평가하고, 자유형feedback필드는 사용자 의견을 수집합니다.
모든 데이터셋은 Argilla Python 클라이언트(rg.Argilla)를 통해 생성되며, Argilla UI에서 직접 확인할 수 있습니다.
임베딩 모델 파인튜닝
핵심 결과: Argilla‑특화 검색에서 기본 BGE‑base보다 우수한 커스텀 모델 plaguss/bge-base-argilla-sdk-matryoshka.
- 데이터셋 준비 – 삼중항 데이터셋을 로드하고,
anchor,positive,negative컬럼을 유지하며, 고유id를 추가하고, 90 %/10 % 비율로 학습/테스트를 분할합니다. - 베이스라인 모델 –
BAAI/bge-base-en-v1.5를 시작점으로 사용하고 모델 카드 메타데이터를 설정합니다. - 손실 함수 –
TripletLoss와MatryoshkaLoss(차원[768, 512, 256, 128, 64])를 결합합니다. - 학습 인자 – Apple M2 Pro에 맞게 배치 크기를 조정하고, 코사인 스케줄러를 사용하며, 메트릭으로
eval_dim_512_cosine_ndcg@10을 선택합니다. - 학습 –
SentenceTransformerTrainer를 실행합니다; 최상의 체크포인트는 자동으로 Hub에 푸시됩니다.
생성된 모델은 SentenceTransformer를 사용하거나 sentence-transformers 레지스트리를 통해 로드할 수 있습니다.
lancedb로 벡터 데이터베이스 구축
핵심 결과: 각 합성 질의를 해당 문서 청크와 연결하는 포터블하고 서버리스인 벡터 저장소.
lancedb.connect("./lancedb")는 로컬 SQLite와 유사한 데이터베이스를 생성합니다.LanceModel을 사용해Docs스키마(query,text,vector)를 정의합니다.- 질의 데이터셋의 각 배치에 대해 파인튜닝된 모델로 임베딩을 생성하고 테이블에 삽입합니다.
- 검색 예시 – *"How can I get the current user?"*에 대한 코사인 유사도 검색은 가장 관련성 높은 문서 청크를 반환합니다.
- 전체 데이터베이스 디렉터리를 (
lancedb.tar.gz) 압축하여 데이터셋과 함께 Hub에 업로드함으로써 재현 가능한 다운로드를 가능하게 합니다.
Gradio 채팅 인터페이스 및 배포
핵심 결과: Argilla SDK 질문에 RAG를 활용해 답변하는 인터랙티브 웹 UI(https://huggingface.co/spaces/plaguss/argilla-sdk-chatbot-space).
- Database class – lancedb 아카이브를 지연 다운로드하고 테이블을 열며, 주어진 질의에 대해 최대 네 개의 중복 제거된 청크를 반환하는
retrieve_doc_chunks를 제공합니다. - 프롬프트 엔지니어링 – 시스템 프롬프트는 LLM이 제공된 컨텍스트에서 오직 답변하도록 강제합니다. 사용자 프롬프트 템플릿(
ARGILLA_BOT_TEMPLATE)은 검색된 청크를 삽입합니다. - LLM 추론 –
InferenceClient를 통해 Hugging Face 추론 엔드포인트(기본:meta-llama/Meta-Llama-3-70B-Instruct)를 호출합니다. 응답 스트림은 Gradio에 반환됩니다. - 대화 로깅 – 각 턴 이후 상호작용을 Argilla 챗봇‑로그 데이터셋에 기록하여 지속적인 평가와 향후 파인튜닝을 가능하게 합니다.
- 배포 –
requirements.txt와 Hugging Face API 토큰을 비밀로 추가하면 앱이 Spaces에서 자동으로 빌드됩니다.
시사점 및 향후 과제
핵심 요점: 엔드‑투‑엔드 워크플로우는 코드 중심 문서 저장소를 최소한의 수동 라벨링으로 고품질 도메인‑특화 RAG 챗봇으로 전환하는 방법을 보여줍니다.
- 확장성 – 동일한 파이프라인을 GitHub 저장소 경로를 교체함으로써 다른 라이브러리나 내부 SDK에 적용할 수 있습니다.
- 데이터 품질 – 청크 크기 개선, 중복 제거 추가, 합성 질의 생성 강화(예: 구조화된 프롬프트 사용)로 검색 관련성을 높일 수 있습니다.
- 설명 가능성 – 반환된 청크에 소스 URL이나 라인 번호를 추가하면 사용자가 추적성을 확보할 수 있습니다.
- 피드백 루프 – Argilla 상호작용 데이터셋은 반복적인 모델 개선을 위한 즉시 사용 가능한 피드백 루프를 제공합니다.
distilabel의 합성 데이터 생성, Matryoshka 강화 임베딩 파인튜닝, 경량 벡터 저장소를 결합함으로써 개발자는 어떤 기술 제품에 대해서도 신뢰할 수 있는 지원 봇을 빠르게 프로토타이핑할 수 있습니다.