В этом руководстве мы реализуем полный рабочий процесс для создания, отслеживания и оценки конвейера LLM с использованием Opik. Мы пошагово структурируем систему, начиная с лёгкой модели, добавляя планирование на основе подсказок, создавая набор данных и, наконец, выполняя автоматическую оценку.
Установка среды
Мы устанавливаем необходимые библиотеки и инициализируем Opik. Мы загружаем основные модули, определяем устройство и настраиваем наш проект так, чтобы каждая трассировка поступала в нужное рабочее пространство. Это основа для остальной части руководства.
«`python
!pip install -q opik transformers accelerate torch
import torch
from transformers import pipeline
import textwrap
import opik
from opik import Opik, Prompt, track
from opik.evaluation import evaluate
from opik.evaluation.metrics import Equals, LevenshteinRatio
device = 0 if torch.cuda.is_available() else -1
print(«Using device:», «cuda» if device == 0 else «cpu»)
opik.configure()
PROJECT_NAME = «opik-hf-tutorial»
«`
Загрузка модели и создание функции генерации текста
Мы загружаем облегчённую модель Hugging Face и создаём небольшую вспомогательную функцию для генерации текста. Мы готовим LLM для работы локально без внешних API. Это даёт нам надёжный и воспроизводимый уровень генерации для остальной части конвейера.
«`python
llm = pipeline(
«text-generation»,
model=»distilgpt2″,
device=device,
)
def hfgenerate(prompt: str, maxnew_tokens: int = 80) -> str:
result = llm(
prompt,
maxnewtokens=maxnewtokens,
do_sample=True,
temperature=0.3,
padtokenid=llm.tokenizer.eostokenid,
)[0][«generated_text»]
return result[len(prompt):].strip()
«`
Определение структурированных подсказок
Мы определяем две структурированные подсказки, используя класс Prompt из Opik. Мы контролируем фазу планирования и фазу ответа через чёткие шаблоны. Это помогает нам поддерживать согласованность и наблюдать, как структурированные подсказки влияют на поведение модели.
«`python
plan_prompt = Prompt(
name=»hfplanprompt»,
prompt=textwrap.dedent(«»»
You are an assistant that creates a plan to answer a question
using ONLY the given context.
Context:
{{context}}
Question:
{{question}}
Return exactly 3 bullet points as a plan.
«»»).strip(),
)
answer_prompt = Prompt(
name=»hfanswerprompt»,
prompt=textwrap.dedent(«»»
You answer based only on the given context.
Context:
{{context}}
Question:
{{question}}
Plan:
{{plan}}
Answer the question in 2–4 concise sentences.
«»»).strip(),
)
«`
Создание набора данных и функции извлечения контекста
Мы создаём крошечный документ-магазин и функцию извлечения контекста, которую Opik отслеживает как инструмент. Мы позволяем конвейеру выбирать контекст на основе вопроса пользователя. Это позволяет нам имитировать минимальный рабочий процесс в стиле RAG без необходимости использования реальной векторной базы данных.
«`python
DOCS = {
«overview»: «»»
Opik is an open-source platform for debugging, evaluating,
and monitoring LLM and RAG applications. It provides tracing,
datasets, experiments, and evaluation metrics.
«»»,
«tracing»: «»»
Tracing in Opik logs nested spans, LLM calls, token usage,
feedback scores, and metadata to inspect complex LLM pipelines.
«»»,
«evaluation»: «»»
Opik evaluations are defined by datasets, evaluation tasks,
scoring metrics, and experiments that aggregate scores,
helping detect regressions or issues.
«»»,
}
@track(projectname=PROJECTNAME, type=»tool», name=»retrieve_context»)
def retrieve_context(question: str) -> str:
q = question.lower()
if «trace» in q or «span» in q:
return DOCS[«tracing»]
if «metric» in q or «dataset» in q or «evaluate» in q:
return DOCS[«evaluation»]
return DOCS[«overview»]
«`
Планирование и ответы в конвейере
Мы объединяем планирование, рассуждения и ответы в полностью отслеживаемом конвейере LLM. Мы фиксируем каждый шаг с помощью декораторов Opik, чтобы можно было анализировать диапазоны в панели управления. Тестируя конвейер, мы подтверждаем, что все компоненты интегрируются гладко.
«`python
@track(projectname=PROJECTNAME, type=»llm», name=»plan_answer»)
def plan_answer(context: str, question: str) -> str:
rendered = plan_prompt.format(context=context, question=question)
return hfgenerate(rendered, maxnew_tokens=80)
@track(projectname=PROJECTNAME, type=»llm», name=»answerfromplan»)
def answerfromplan(context: str, question: str, plan: str) -> str:
rendered = answer_prompt.format(
context=context,
question=question,
plan=plan,
)
return hfgenerate(rendered, maxnew_tokens=120)
@track(projectname=PROJECTNAME, type=»general», name=»qa_pipeline»)
def qa_pipeline(question: str) -> str:
context = retrieve_context(question)
plan = plan_answer(context, question)
answer = answerfromplan(context, question, plan)
return answer
«`
Создание и заполнение набора данных
Мы создаём и заполняем набор данных внутри Opik, который будет использоваться для оценки. Мы вставляем несколько пар вопрос-ответ, охватывающих различные аспекты Opik. Этот набор данных послужит основой для нашей оценки QA позже.
«`python
client = Opik()
dataset = client.getorcreate_dataset(
name=»HFOpikQA_Dataset»,
description=»Small QA dataset for HF + Opik tutorial»,
)
dataset.insert([
{
«question»: «What kind of platform is Opik?»,
«context»: DOCS[«overview»],
«reference»: «Opik is an open-source platform for debugging, evaluating and monitoring LLM and RAG applications.»,
},
{
«question»: «What does tracing in Opik log?»,
«context»: DOCS[«tracing»],
«reference»: «Tracing logs nested spans, LLM calls, token usage, feedback scores, and metadata.»,
},
{
«question»: «What are the components of an Opik evaluation?»,
«context»: DOCS[«evaluation»],
«reference»: «An Opik evaluation uses datasets, evaluation tasks, scoring metrics and experiments that aggregate scores.»,
},
])
«`
Определение задачи оценки и выбор метрик
Мы определяем задачу оценки и выбираем две метрики — Equals и LevenshteinRatio — для измерения качества модели. Мы обеспечиваем, чтобы задача производила выходные данные в точном формате, требуемом для оценки. Это соединяет наш конвейер с механизмом оценки Opik.
«`python
equals_metric = Equals()
lev_metric = LevenshteinRatio()
def evaluation_task(item: dict) -> dict:
output = qa_pipeline(item[«question»])
return {
«output»: output,
«reference»: item[«reference»],
}
«`
Запуск эксперимента оценки
Мы запускаем эксперимент оценки, используя функцию evaluate из Opik. Мы поддерживаем последовательное выполнение для стабильности в Colab. После завершения мы получаем ссылку для просмотра деталей эксперимента внутри панели управления Opik.
«`python
evaluation_result = evaluate(
dataset=dataset,
task=evaluation_task,
scoringmetrics=[equalsmetric, lev_metric],
experimentname=»HFOpikQAExperiment»,
projectname=PROJECTNAME,
task_threads=1,
)
print(«\nExperiment URL:», evaluationresult.experimenturl)
«`
Агрегирование и печать результатов оценки
Мы агрегируем и печатаем результаты оценки, чтобы понять, насколько хорошо наш конвейер работает. Мы проверяем результаты метрик, чтобы увидеть, где выходные данные соответствуют ссылкам, а где необходимы улучшения. Это закрывает цикл в нашем полностью инструментированном рабочем процессе LLM.
«`python
agg = evaluationresult.aggregateevaluation_scores()
print(«\nAggregated scores:»)
for metricname, stats in agg.aggregatedscores.items():
print(metric_name, «=>», stats)
«`
В заключение мы настроили небольшую, но полностью функциональную экосистему оценки LLM, работающую исключительно на Opik и локальной модели. Мы наблюдаем, как трассировки, подсказки, наборы данных и метрики объединяются, чтобы дать нам прозрачную видимость процесса рассуждений модели.
1. Какие инструменты и библиотеки используются для реализации локального конвейера LLM в статье?
В статье используются следующие инструменты и библиотеки: Opik, Hugging Face Transformers, Accelerate, Torch.
2. Какие этапы включает в себя процесс создания и оценки конвейера LLM с использованием Opik?
Процесс включает в себя:
* установку среды и необходимых библиотек;
* загрузку облегчённой модели Hugging Face;
* создание функции генерации текста;
* определение структурированных подсказок;
* создание набора данных и функции извлечения контекста;
* планирование и ответы в конвейере;
* создание и заполнение набора данных для оценки;
* определение задачи оценки и выбор метрик;
* запуск эксперимента оценки;
* агрегирование и печать результатов оценки.
3. Какие метрики используются для измерения качества модели в статье?
Для измерения качества модели используются две метрики: Equals и LevenshteinRatio.
4. Какие преимущества даёт использование Opik для мониторинга и оценки LLM-приложений?
Opik предоставляет возможность трассировки, оценки и мониторинга LLM-приложений. Это позволяет отслеживать каждый шаг работы модели, оценивать её производительность с помощью различных метрик и получать подробную информацию о работе приложения.
5. Какие шаги необходимо предпринять для создания набора данных для оценки LLM-модели?
Для создания набора данных необходимо:
* определить структуру данных;
* создать и заполнить набор данных внутри Opik;
* вставить несколько пар вопрос-ответ, охватывающих различные аспекты;
* использовать функцию `insert` для добавления данных в набор.