Инструментирование приложений Node.js с использованием трассировки MLflow

Пакет SDK для TypeScript MLflow предоставляет возможности трассировки MLflow для приложений TypeScript и JavaScript. Добавьте готовую к эксплуатации систему наблюдения в ваши приложения GenAI с минимальными изменениями кода и используйте мощную платформу аналитики и мониторинга Databricks.

Требования

Подсказка

Databricks рекомендует установить последнюю версию пакета SDK для трассировки MLflow TypeScript при разработке приложений Node.js с помощью трассировки.

Чтобы инструментировать приложения Node.js с помощью трассировки MLflow, установите следующее:

  • mlflow-tracing из реестра npm
  • Node.js 14 или более поздней версии
  • Рабочая область Databricks с доступом к экспериментам MLflow

Для автоматической трассировки с помощью OpenAI также требуется:

Настройка пакета SDK

Установите пакет

Установите пакет из реестра npm:

npm install mlflow-tracing

Создание эксперимента MLflow

  1. Откройте рабочую область Databricks.
  2. В левой боковой панели в разделе ИИ/ML щелкните "Эксперименты".
  3. В верхней части страницы "Эксперименты" щелкните приложения GenAI и агенты.
  4. Щелкните значок рядом с именем эксперимента, чтобы найти идентификатор эксперимента и запишите его вниз.

создание эксперимента

Настройка проверки подлинности

Выберите один из следующих методов проверки подлинности:

Переменные среды

  1. В эксперименте MLflow щелкните иконку меню Kebab. Затем >запишите трассировки локально>, после чего щелкните "Создать ключ API".
  2. Скопируйте и запустите созданный код в терминале:
export DATABRICKS_TOKEN=<databricks-personal-access-token>
export DATABRICKS_HOST=https://<workspace-name>.cloud.databricks.com

ENV-файл

  1. В эксперименте MLflow щелкните иконку меню Kebab. Затем >запишите трассировки локально>, после чего щелкните "Создать ключ API".
  2. Скопируйте созданный код в файл в корневом .env каталоге проекта:
DATABRICKS_TOKEN=<databricks-personal-access-token>
DATABRICKS_HOST=https://<workspace-name>.cloud.databricks.com

Инициализация пакета SDK

В приложении Node.js инициализировать пакет SDK с помощью идентификатора эксперимента:

import * as mlflow from 'mlflow-tracing';

mlflow.init({
  trackingUri: 'databricks',
  experimentId: '<your-experiment-id>',
});

Автоматическая трассировка

Добавьте одну строку кода для автоматической трассировки поддерживаемых библиотек. Пакет SDK для трассировки MLflow TypeScript в настоящее время поддерживает автоматическую трассировку для пакета SDK OpenAI.

Чтобы использовать автоматическую трассировку для OpenAI, установите mlflow-openai пакет:

npm install mlflow-openai

Затем оберните клиент OpenAI с помощью функции tracedOpenAI.

import * as mlflow from 'mlflow-tracing';

// Initialize the tracing SDK
mlflow.init({
  trackingUri: 'databricks',
  experimentId: '<your-experiment-id>',
});

import { OpenAI } from 'openai';
import { tracedOpenAI } from 'mlflow-openai';

// Wrap the OpenAI client with the tracedOpenAI function
const client = tracedOpenAI(new OpenAI());

// Invoke the client as usual
const response = await client.chat.completions.create({
  model: 'gpt-4o-mini',
  messages: [
    { role: 'system', content: 'You are a helpful weather assistant.' },
    { role: 'user', content: "What's the weather like in Seattle?" },
  ],
});

Трассировка вручную

Трассировка функции с помощью trace API

trace API полезен, если требуется трассировать функцию.

Именованная функция

import * as mlflow from 'mlflow-tracing';

const getWeather = async (city: string) => {
  return `The weather in ${city} is sunny`;
};

// Wrap the function with mlflow.trace to create a traced function
const tracedGetWeather = mlflow.trace(getWeather, { name: 'get-weather' });

// Invoke the traced function as usual
const result = await tracedGetWeather('San Francisco');

Анонимная функция

import * as mlflow from 'mlflow-tracing';

const getWeather = mlflow.trace(
  (city: string) => {
    return `The weather in ${city} is sunny`;
  },
  // When wrapping an anonymous function, specify the span name
  { name: 'get-weather' },
);

// Invoke the traced function as usual
const result = getWeather('San Francisco');

При вызове трассировки функции MLflow автоматически создаст диапазон, который фиксирует:

  • Входные аргументы
  • Возвращаемое значение
  • Сведения об исключении, если было вызвано
  • Задержка

Запись вызовов вложенных функций

При трассировке вложенных функций MLflow создаст трассировку с несколькими диапазонами, где структура диапазона фиксирует вложенные вызовы функций.

const sum = mlflow.trace(
  (a: number, b: number) => {
    return a + b;
  },
  { name: 'sum' },
);

const multiply = mlflow.trace(
  (a: number, b: number) => {
    return a * b;
  },
  { name: 'multiply' },
);

const computeArea = mlflow.trace(
  (a: number, b: number, h: number) => {
    const sumOfBase = sum(a, b);
    const area = multiply(sumOfBase, h);
    return multiply(area, 0.5);
  },
  { name: 'compute-area' },
);

computeArea(1, 2, 3);

Трассировка будет выглядеть следующим образом:

- compute-area
  - sum (a=1, b=2)
  - multiply (a=3, b=3)
  - multiply (a=9, b=0.5)

Трассировка метода класса с помощью @trace API

TypeScript версии 5.0+ поддерживает декораторы. MLflow Tracing поддерживает этот синтаксис для удобной трассировки методов класса. MLflow автоматически создаст диапазон, который фиксирует:

  • Входные аргументы
  • Возвращаемое значение
  • Сведения об исключении, если было вызвано
  • Задержка
import * as mlflow from 'mlflow-tracing';

class MyClass {
  @mlflow.trace({ spanType: mlflow.SpanType.LLM })
  generateText(prompt: string) {
    return "It's sunny in Seattle!";
  }
}

const myClass = new MyClass();
myClass.generateText("What's the weather like in Seattle?");

Трассировка блока кода с помощью withSpan API

withSpan API полезен, если требуется трассировать блок кода, а не функцию.

import * as mlflow from 'mlflow-tracing';

const question = "What's the weather like in Seattle?";

const result = await mlflow.withSpan(
  async (span: mlflow.Span) => {
    return "It's sunny in Seattle!";
  },
  // Pass name, span type, and inputs as options.
  {
    name: 'generateText',
    spanType: mlflow.SpanType.TOOL,
    inputs: { prompt: question },
  },
);

Создание и завершение диапазона явным образом

Чтобы получить больше контроля над жизненным циклом диапазона, можно создать и завершить диапазон явным образом.

import * as mlflow from 'mlflow-tracing';

const span = mlflow.startSpan({
  name: 'generateText',
  spanType: mlflow.SpanType.LLM,
  inputs: { prompt: question },
});

span.end({
  outputs: { answer: "It's sunny in Seattle!" },
  status: 'OK',
});

Группирование трассировок по пользователям и сеансам

Многие приложения, используемые на практике, используют сеансы для поддержки многократных взаимодействий с пользователями. С другой стороны, следы часто создаются по запросу. MLflow поддерживает группирование трассировок по сеансам пользователей, чтобы помочь вам понять пути взаимодействия конечных пользователей и выявить проблемы. Дополнительные сведения см. в руководстве по добавлению контекста в трассировку .

Пример фулл-стек приложения

Ознакомьтесь с примером полного стека , чтобы получить полный пример использования пакета SDK трассировки MLflow TypeScript в приложении Node.js.

Дальнейшие шаги

См. следующие страницы: