distilabel を使用した Argilla SDK チャットボット – エンドツーエンドチュートリアル
TL;DR
私たちは、distilabel を使用して合成 Q&A トリプルを生成し、Matryoshka ロスで BGE‑base 埋め込みモデルをファインチューニングし、軽量 lancedb ベクトルストアに埋め込みを保存し、Gradio を介して Hugging Face Spaces にチャットインターフェースをデプロイすることで、Argilla 2.0 用のドメイン固有 RAG チャットボットを構築しました。
distilabel を使用した合成トレーニングデータの生成
Key outcome: 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 クエリを 3 つの追加バリエーションに展開し、データセットサイズを 4 倍にします。 MergeColumnsとExpandColumnsは、元のクエリと生成されたクエリを単一のpositive列に統合し、クエリ‑anchor‑negative のトリプルごとに 1 行を生成します。
完全なパイプラインは pipeline_docs_queries.py で定義され、最終データセットは plaguss/argilla_sdk_docs_queries にプッシュされます。
Argilla におけるデータセットの探索とキュレーション
Key outcome: (1) 生のドキュメントチャンク、(2) 埋め込みファインチューニング用トリプル、(3) チャットボットインタラクションログの 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 で直接確認できます。
埋め込みモデルのファインチューニング
Key outcome: Argilla 固有の検索でベースライン BGE‑base を上回るカスタムモデル plaguss/bge-base-argilla-sdk-matryoshka。
- Dataset preparation – トリプルデータセットをロードし、列
anchor,positive,negativeを保持し、ユニークなidを追加し、訓練/テストを 90 %/10 % に分割します。 - Baseline model –
BAAI/bge-base-en-v1.5をベースにし、モデルカードのメタデータを設定します。 - Loss function –
TripletLossとMatryoshkaLoss(次元[768, 512, 256, 128, 64])を組み合わせます。 - Training arguments – Apple M2 Pro 用にバッチサイズを調整し、コサインスケジューラを使用し、メトリックとして
eval_dim_512_cosine_ndcg@10を選択します。 - Training –
SentenceTransformerTrainerを実行します。最良のチェックポイントは自動的に Hub にプッシュされます。
得られたモデルは SentenceTransformer でロードするか、sentence-transformers レジストリ経由で使用できます。
lancedb を使用したベクトルデータベースの構築
Key outcome: 各合成クエリを対応するドキュメントチャンクに結びつける、ポータブルでサーバーレスなベクトルストア。
lancedb.connect("./lancedb")はローカルの SQLite ライクなデータベースを作成します。LanceModelを使用してDocsスキーマ(query,text,vector)を定義します。- クエリデータセットの各バッチに対し、ファインチューニング済みモデルで埋め込みを生成し、テーブルに挿入します。
- 検索例 – "How can I get the current user?" に対するコサイン類似度検索は、最も関連性の高いドキュメントチャンクを返します。
- データベース全体のディレクトリをアーカイブ(
lancedb.tar.gz)し、データセットと共に Hub にアップロードすることで、再現可能なダウンロードが可能になります。
Gradio チャットインターフェースとデプロイ
Key outcome: Argilla SDK の質問に RAG を用いて回答するインタラクティブなウェブ UI(https://huggingface.co/spaces/plaguss/argilla-sdk-chatbot-space)。
- Database class – lancedb アーカイブの遅延ダウンロードを処理し、テーブルを開き、指定クエリに対して最大 4 つの重複除去されたチャンクを返す
retrieve_doc_chunksを提供します。 - Prompt engineering – システムプロンプトにより、LLM が提供されたコンテキストからのみ回答するよう強制します。ユーザープロンプトテンプレート(
ARGILLA_BOT_TEMPLATE)は取得したチャンクを挿入します。 - LLM inference –
InferenceClientを介して Hugging Face 推論エンドポイント(デフォルト:meta-llama/Meta-Llama-3-70B-Instruct)を呼び出します。レスポンスストリームは Gradio に返されます。 - Conversation logging – 各ターンの後、インタラクションは Argilla の chatbot‑log データセットに記録され、継続的な評価と将来のファインチューニングを可能にします。
- Deployment –
requirements.txtと Hugging Face API トークンをシークレットとして追加することで、Spaces 上でアプリが自動的にビルドされます。
今後の展望と次のステップ
Takeaway: このエンドツーエンドのワークフローは、コード中心のドキュメントリポジトリを最小限の手動ラベリングで高品質なドメイン固有 RAG チャットボットに変換できることを示しています。
- Scalability – 同じパイプラインを GitHub リポジトリのパスを変更するだけで、他のライブラリや社内 SDK に適用できます。
- Data quality – チャンクサイズの改善、重複除去の追加、合成クエリ生成の強化(例: 構造化プロンプトの使用)により、検索の関連性を向上させることができます。
- Explainability – 返されたチャンクにソース URL や行番号を付与すれば、ユーザーにトレース可能性を提供できます。
- Feedback loop – Argilla のインタラクションデータセットは、反復的なモデル改善のためのすぐに使えるフィードバックループを提供します。
distilabel の合成データ生成、Matryoshka 強化埋め込みのファインチューニング、軽量ベクトルストアを組み合わせることで、開発者はあらゆる技術製品向けの信頼性の高いサポートボットを迅速にプロトタイプできます。