5a558eb09e
TypeScript SDK Compatibility V1.x E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / TypeScript SDK Compatibility V1.x E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
TypeScript SDK E2E Tests / TypeScript SDK E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
Python SDK E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK E2E Tests / Python SDK E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK E2E Tests / build-opik (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Python SDK Compatibility V1.x E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK E2E Tests / build-opik (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer E2E Tests Python ${{matrix.python_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer Integration Smoke Tests (push) Has been cancelled
🐙 Code Quality / detect (push) Has been cancelled
🐙 Code Quality / lint (${{ matrix.leg.name }}) (push) Has been cancelled
🐙 Code Quality / summary (push) Has been cancelled
TypeScript SDK Library Integration Tests / Check Secrets (push) Has been cancelled
TypeScript SDK Library Integration Tests / opik-vercel (Vercel AI SDK / eve) (push) Has been cancelled
SDK Library Integration Tests Runner / Check Secrets (push) Has been cancelled
SDK Library Integration Tests Runner / Missed OpenAI API Key Warning (push) Has been cancelled
SDK Library Integration Tests Runner / Build (push) Has been cancelled
SDK Library Integration Tests Runner / openai_tests (push) Has been cancelled
SDK Library Integration Tests Runner / langchain_tests (push) Has been cancelled
SDK Library Integration Tests Runner / langchain_legacy_tests (push) Has been cancelled
SDK Library Integration Tests Runner / llama_index_tests (push) Has been cancelled
SDK Library Integration Tests Runner / anthropic_tests (push) Has been cancelled
SDK Library Integration Tests Runner / mistral_tests (push) Has been cancelled
SDK Library Integration Tests Runner / groq_tests (push) Has been cancelled
SDK Library Integration Tests Runner / aisuite_tests (push) Has been cancelled
SDK Library Integration Tests Runner / haystack_tests (push) Has been cancelled
SDK Library Integration Tests Runner / dspy_tests (push) Has been cancelled
SDK Library Integration Tests Runner / crewai_v0_tests (push) Has been cancelled
SDK Library Integration Tests Runner / crewai_v1_tests (push) Has been cancelled
SDK Library Integration Tests Runner / genai_tests (push) Has been cancelled
SDK Library Integration Tests Runner / adk_tests (push) Has been cancelled
SDK Library Integration Tests Runner / adk_legacy_1_3_0_tests (push) Has been cancelled
SDK Library Integration Tests Runner / evaluation_metrics_tests (push) Has been cancelled
SDK Library Integration Tests Runner / bedrock_tests (push) Has been cancelled
SDK Library Integration Tests Runner / litellm_tests (push) Has been cancelled
SDK Library Integration Tests Runner / harbor_tests (push) Has been cancelled
SDK Library Integration Tests Runner / Slack Notification (push) Has been cancelled
Lint Opik Helm Chart / render-equality (push) Has been cancelled
Opik Optimizer - Unit Tests / Opik Optimizer Unit Tests Python ${{matrix.python_version}} (push) Has been cancelled
Python BE E2E Tests / Python BE E2E (push) Has been cancelled
Python Backend Tests / run-python-backend-tests (push) Has been cancelled
Python SDK Unit Tests / Python SDK Unit Tests ${{matrix.python_version}} (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
SDK E2E Libraries Integration Tests / Check Secrets (push) Has been cancelled
SDK E2E Libraries Integration Tests / Missed OpenAI API Key Warning (push) Has been cancelled
SDK E2E Libraries Integration Tests / build-opik (push) Has been cancelled
SDK E2E Libraries Integration Tests / E2E Lib Integration Python ${{matrix.python_version}} (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-gemini) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-langchain) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-openai) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-otel) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-vercel) (push) Has been cancelled
TypeScript SDK Build & Publish / build-and-publish (push) Has been cancelled
TypeScript SDK Unit Tests / Test on Node ${{ matrix.node-version }} (push) Has been cancelled
Backend Tests / discover-tests (push) Has been cancelled
Backend Tests / ${{ matrix.name }} (push) Has been cancelled
Build and Publish SDK / build-and-publish (push) Has been cancelled
Build Opik Docker Images / set-version (push) Has been cancelled
Build Opik Docker Images / build-backend (push) Has been cancelled
Build Opik Docker Images / build-sandbox-executor-python (push) Has been cancelled
Build Opik Docker Images / build-python-backend (push) Has been cancelled
Build Opik Docker Images / build-frontend (push) Has been cancelled
Build Opik Docker Images / create-git-tag (push) Has been cancelled
ClickHouse Migration Cluster Check / validate-clickhouse-migrations (push) Has been cancelled
Docs - Publish / run (push) Has been cancelled
E2E Tests - Post Merge (v2) / 🧪 E2E v2 Tests (${{ github.event.inputs.tier || 't1' }}) (push) Has been cancelled
E2E Tests - Post Merge (v2) / 📢 Slack Notification (push) Has been cancelled
Frontend Unit Tests / Test on Node 20 (push) Has been cancelled
Guardrails E2E Tests / Select Python version matrix (push) Has been cancelled
Guardrails E2E Tests / Guardrails E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Guardrails E2E Tests / 📢 Slack Notification (push) Has been cancelled
Guardrails Backend Unit Tests / Guardrails Backend Unit Tests (push) Has been cancelled
Guardrails Backend Unit Tests / 📢 Slack Notification (push) Has been cancelled
Lint Opik Helm Chart / lint-helm-chart (Helm v3.21.0) (push) Has been cancelled
Lint Opik Helm Chart / lint-helm-chart (Helm v4.2.0) (push) Has been cancelled
Lint Opik Helm Chart / unittest-helm-chart (push) Has been cancelled
400 lines
12 KiB
Plaintext
400 lines
12 KiB
Plaintext
---
|
|
description: Start here to integrate Opik with Hugging Face Datasets for end-to-end
|
|
LLM observability, unit testing, and optimization.
|
|
headline: Hugging Face Datasets | Opik Documentation
|
|
og:description: Learn how to convert and import datasets from Hugging Face into Opik
|
|
for effective model evaluation and optimization.
|
|
og:site_name: Opik Documentation
|
|
og:title: Integrate Hugging Face Datasets with Opik
|
|
title: Observability for Hugging Face Datasets with Opik
|
|
---
|
|
|
|
<Note>
|
|
In Opik 2.0, datasets and experiments are project-scoped. Make sure to specify a `project_name` when creating datasets and running experiments so they are associated with the correct project.
|
|
</Note>
|
|
|
|
[Hugging Face Datasets](https://huggingface.co/docs/datasets/) is a library that provides easy access to thousands of datasets for machine learning and natural language processing tasks.
|
|
|
|
This guide explains how to integrate Opik with Hugging Face Datasets to convert and import datasets into Opik for model evaluation and optimization.
|
|
|
|
## Account Setup
|
|
|
|
[Comet](https://www.comet.com/site?from=llm&utm_source=opik&utm_medium=colab&utm_content=huggingface-datasets&utm_campaign=opik) provides a hosted version of the Opik platform, [simply create an account](https://www.comet.com/signup?from=llm&utm_source=opik&utm_medium=colab&utm_content=huggingface-datasets&utm_campaign=opik) and grab your API Key.
|
|
|
|
> You can also run the Opik platform locally, see the [installation guide](https://www.comet.com/docs/opik/self-host/overview/?from=llm&utm_source=opik&utm_medium=colab&utm_content=huggingface-datasets&utm_campaign=opik) for more information.
|
|
|
|
## Getting Started
|
|
|
|
### Installation
|
|
|
|
To use Hugging Face Datasets with Opik, you'll need to have both the `datasets` and `opik` packages installed:
|
|
|
|
```bash
|
|
pip install opik datasets transformers pandas tqdm huggingface_hub
|
|
```
|
|
|
|
### Configuring Opik
|
|
|
|
Configure the Opik Python SDK for your deployment type. See the [Python SDK Configuration guide](/tracing/advanced/sdk_configuration) for detailed instructions on:
|
|
|
|
- **CLI configuration**: `opik configure`
|
|
- **Code configuration**: `opik.configure()`
|
|
- **Self-hosted vs Cloud vs Enterprise** setup
|
|
- **Configuration files** and environment variables
|
|
|
|
### Configuring Hugging Face
|
|
|
|
In order to access private datasets on Hugging Face, you will need to have your Hugging Face token. You can create and manage your Hugging Face tokens on [this page](https://huggingface.co/settings/tokens).
|
|
|
|
You can set it as an environment variable:
|
|
|
|
```bash
|
|
export HUGGINGFACE_HUB_TOKEN="YOUR_TOKEN"
|
|
```
|
|
|
|
Or set it programmatically:
|
|
|
|
```python
|
|
import os
|
|
import getpass
|
|
|
|
if "HUGGINGFACE_HUB_TOKEN" not in os.environ:
|
|
os.environ["HUGGINGFACE_HUB_TOKEN"] = getpass.getpass("Enter your Hugging Face token: ")
|
|
|
|
# Set project name for organization
|
|
os.environ["OPIK_PROJECT_NAME"] = "huggingface-datasets-integration-demo"
|
|
```
|
|
|
|
## HuggingFaceToOpikConverter
|
|
|
|
The integration provides a utility class to convert Hugging Face datasets to Opik format:
|
|
|
|
```python
|
|
from datasets import load_dataset, Dataset as HFDataset
|
|
from opik import Opik
|
|
from typing import Optional, Dict, Any, List
|
|
import json
|
|
from tqdm import tqdm
|
|
import warnings
|
|
import numpy as np
|
|
import pandas as pd
|
|
|
|
warnings.filterwarnings('ignore')
|
|
|
|
class HuggingFaceToOpikConverter:
|
|
"""Utility class to convert Hugging Face datasets to Opik format."""
|
|
|
|
def __init__(self, opik_client: Opik):
|
|
self.opik_client = opik_client
|
|
|
|
def load_hf_dataset(
|
|
self,
|
|
dataset_name: str,
|
|
split: Optional[str] = None,
|
|
config: Optional[str] = None,
|
|
subset_size: Optional[int] = None,
|
|
**kwargs
|
|
) -> HFDataset:
|
|
"""
|
|
Load a dataset from Hugging Face Hub.
|
|
|
|
Args:
|
|
dataset_name: Name of the dataset on HF Hub
|
|
split: Specific split to load (train, validation, test)
|
|
config: Configuration/subset of the dataset
|
|
subset_size: Limit the number of samples
|
|
**kwargs: Additional arguments for load_dataset
|
|
|
|
Returns:
|
|
Loaded Hugging Face dataset
|
|
"""
|
|
print(f"📥 Loading dataset: {dataset_name}")
|
|
if config:
|
|
print(f" Config: {config}")
|
|
if split:
|
|
print(f" Split: {split}")
|
|
|
|
# Load the dataset
|
|
dataset = load_dataset(
|
|
dataset_name,
|
|
name=config,
|
|
split=split,
|
|
**kwargs
|
|
)
|
|
|
|
# Limit dataset size if specified
|
|
if subset_size and len(dataset) > subset_size:
|
|
dataset = dataset.select(range(subset_size))
|
|
print(f" Limited to {subset_size} samples")
|
|
|
|
print(f" ✅ Loaded {len(dataset)} samples")
|
|
print(f" Features: {list(dataset.features.keys())}")
|
|
|
|
return dataset
|
|
```
|
|
|
|
## Basic Usage
|
|
|
|
### Convert and Upload a Dataset
|
|
|
|
Here's how to convert a Hugging Face dataset to Opik format and upload it:
|
|
|
|
```python
|
|
# Initialize the converter
|
|
opik_client = Opik()
|
|
converter = HuggingFaceToOpikConverter(opik_client)
|
|
|
|
# Load a dataset from Hugging Face
|
|
dataset = converter.load_hf_dataset(
|
|
dataset_name="squad",
|
|
split="validation",
|
|
subset_size=100 # Limit for demo
|
|
)
|
|
|
|
# Convert to Opik format
|
|
opik_data = converter.convert_to_opik_format(
|
|
dataset=dataset,
|
|
input_columns=["question"],
|
|
output_columns=["answers"],
|
|
metadata_columns=["id", "title"],
|
|
dataset_name="squad-qa-dataset",
|
|
description="SQuAD question answering dataset converted from Hugging Face"
|
|
)
|
|
|
|
print(f"✅ Converted {len(opik_data)} items to Opik format!")
|
|
```
|
|
|
|
### Convert to Opik Format
|
|
|
|
The converter provides a method to transform Hugging Face datasets into Opik's expected format:
|
|
|
|
```python
|
|
def convert_to_opik_format(
|
|
self,
|
|
dataset: HFDataset,
|
|
input_columns: List[str],
|
|
output_columns: List[str],
|
|
metadata_columns: Optional[List[str]] = None,
|
|
dataset_name: str = "huggingface-dataset",
|
|
description: str = "Dataset converted from Hugging Face"
|
|
) -> List[Dict[str, Any]]:
|
|
"""
|
|
Convert a Hugging Face dataset to Opik format.
|
|
|
|
Args:
|
|
dataset: Hugging Face dataset
|
|
input_columns: List of column names to use as input
|
|
output_columns: List of column names to use as expected output
|
|
metadata_columns: Optional list of columns to include as metadata
|
|
dataset_name: Name for the Opik dataset
|
|
description: Description for the Opik dataset
|
|
|
|
Returns:
|
|
List of Opik dataset items
|
|
"""
|
|
opik_items = []
|
|
|
|
for row in tqdm(dataset, desc="Converting to Opik format"):
|
|
# Extract input data
|
|
input_data = {}
|
|
for col in input_columns:
|
|
if col in dataset.features:
|
|
input_data[col] = self._extract_field_value(row, col)
|
|
|
|
# Extract expected output
|
|
expected_output = {}
|
|
for col in output_columns:
|
|
if col in dataset.features:
|
|
expected_output[col] = self._extract_field_value(row, col)
|
|
|
|
# Extract metadata
|
|
metadata = {}
|
|
if metadata_columns:
|
|
for col in metadata_columns:
|
|
if col in dataset.features:
|
|
metadata[col] = self._extract_field_value(row, col)
|
|
|
|
# Create Opik dataset item
|
|
item = {
|
|
"input": input_data,
|
|
"expected_output": expected_output,
|
|
"metadata": metadata
|
|
}
|
|
opik_items.append(item)
|
|
|
|
return opik_items
|
|
```
|
|
|
|
## Using with @track decorator
|
|
|
|
Use the `@track` decorator to create comprehensive traces when working with your converted datasets:
|
|
|
|
```python
|
|
from opik import track
|
|
|
|
@track
|
|
def evaluate_qa_model(dataset_item):
|
|
"""Evaluate a Q&A model using Hugging Face dataset."""
|
|
question = dataset_item["input"]["question"]
|
|
|
|
# Your model logic here (replace with actual model)
|
|
if 'what' in question.lower():
|
|
response = "This is a question asking for information."
|
|
elif 'how' in question.lower():
|
|
response = "This is a question asking for a process or method."
|
|
else:
|
|
response = "This is a general question that requires analysis."
|
|
|
|
return {
|
|
"question": question,
|
|
"response": response,
|
|
"expected": dataset_item["expected_output"],
|
|
"metadata": dataset_item["metadata"]
|
|
}
|
|
|
|
# Evaluate on your dataset
|
|
for item in opik_data[:5]: # Evaluate first 5 items
|
|
result = evaluate_qa_model(item)
|
|
print(f"Question: {result['question'][:50]}...")
|
|
```
|
|
|
|
## Popular Dataset Examples
|
|
|
|
### SQuAD (Question Answering)
|
|
|
|
```python
|
|
# Load SQuAD dataset
|
|
squad_dataset = converter.load_hf_dataset(
|
|
dataset_name="squad",
|
|
split="validation",
|
|
subset_size=50
|
|
)
|
|
|
|
# Convert to Opik format
|
|
squad_opik = converter.convert_to_opik_format(
|
|
dataset=squad_dataset,
|
|
input_columns=["question"],
|
|
output_columns=["answers"],
|
|
metadata_columns=["id", "title"],
|
|
dataset_name="squad-qa-dataset",
|
|
description="SQuAD question answering dataset"
|
|
)
|
|
```
|
|
|
|
### GLUE (General Language Understanding)
|
|
|
|
```python
|
|
# Load GLUE SST-2 dataset
|
|
sst2_dataset = converter.load_hf_dataset(
|
|
dataset_name="glue",
|
|
config_name="sst2",
|
|
split="validation",
|
|
subset_size=100
|
|
)
|
|
|
|
# Convert to Opik format
|
|
sst2_opik = converter.convert_to_opik_format(
|
|
dataset=sst2_dataset,
|
|
input_columns=["sentence"],
|
|
output_columns=["label"],
|
|
metadata_columns=["idx"],
|
|
dataset_name="sst2-sentiment-dataset",
|
|
description="SST-2 sentiment analysis dataset from GLUE"
|
|
)
|
|
```
|
|
|
|
### Common Crawl (Text Classification)
|
|
|
|
```python
|
|
# Load Common Crawl dataset
|
|
cc_dataset = converter.load_hf_dataset(
|
|
dataset_name="common_crawl",
|
|
subset_size=200
|
|
)
|
|
|
|
# Convert to Opik format
|
|
cc_opik = converter.convert_to_opik_format(
|
|
dataset=cc_dataset,
|
|
input_columns=["text"],
|
|
output_columns=["language"],
|
|
metadata_columns=["url", "timestamp"],
|
|
dataset_name="common-crawl-dataset",
|
|
description="Common Crawl text classification dataset"
|
|
)
|
|
```
|
|
|
|
## Results viewing
|
|
|
|
Once your Hugging Face datasets are converted and uploaded to Opik, you can view them in the Opik UI. Each dataset will contain:
|
|
|
|
- Input data from specified columns
|
|
- Expected output from specified columns
|
|
- Metadata from additional columns
|
|
- Source information (Hugging Face dataset name and split)
|
|
|
|
## Feedback Scores and Evaluation
|
|
|
|
Once your Hugging Face datasets are in Opik, you can evaluate your LLM applications using Opik's evaluation framework:
|
|
|
|
```python
|
|
from opik.evaluation import evaluate
|
|
from opik.evaluation.metrics import Hallucination
|
|
|
|
# Define your evaluation task
|
|
def evaluation_task(x):
|
|
return {
|
|
"message": x["input"]["question"],
|
|
"output": x["response"],
|
|
"reference": x["expected_output"]["answers"]
|
|
}
|
|
|
|
# Create the Hallucination metric
|
|
hallucination_metric = Hallucination()
|
|
|
|
# Run the evaluation
|
|
evaluation_results = evaluate(
|
|
experiment_name="huggingface-datasets-evaluation",
|
|
dataset=squad_opik,
|
|
task=evaluation_task,
|
|
scoring_metrics=[hallucination_metric],
|
|
project_name="my-project",
|
|
)
|
|
```
|
|
|
|
## Environment Variables
|
|
|
|
Make sure to set the following environment variables:
|
|
|
|
```bash
|
|
# Hugging Face Configuration (optional, for private datasets)
|
|
export HUGGINGFACE_HUB_TOKEN="your-huggingface-token"
|
|
|
|
# Opik Configuration
|
|
export OPIK_PROJECT_NAME="your-project-name"
|
|
export OPIK_WORKSPACE="your-workspace-name"
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
1. **Authentication Errors**: Ensure your Hugging Face token is correct for private datasets
|
|
2. **Dataset Not Found**: Verify the dataset name and configuration are correct
|
|
3. **Memory Issues**: Use `subset_size` parameter to limit large datasets
|
|
4. **Data Type Conversion**: The converter handles most data types, but complex nested structures may need custom handling
|
|
|
|
### Getting Help
|
|
|
|
- Check the [Hugging Face Datasets Documentation](https://huggingface.co/docs/datasets/) for dataset loading
|
|
- Review the [Hugging Face Hub Documentation](https://huggingface.co/docs/hub/) for authentication
|
|
- Contact Hugging Face support for dataset-specific problems
|
|
- Check Opik documentation for tracing and evaluation features
|
|
|
|
## Next Steps
|
|
|
|
Once you have Hugging Face Datasets integrated with Opik, you can:
|
|
|
|
- [Evaluate your LLM applications](/evaluation/overview) using Opik's evaluation framework
|
|
- [Create datasets](/evaluation/advanced/manage_datasets) to test and improve your models
|
|
- [Set up feedback collection](/tracing/advanced/annotate_traces) to gather human evaluations
|
|
- [Monitor performance](/tracing/concepts) across different models and configurations |