Отслеживание антропного принципа

Трассировка OpenAI с использованием autolog

Трассировка MLflow предоставляет возможность автоматической трассировки для Anthropic LLMs. Включив автоматическую трассировку для Anthropic с помощью вызова функции mlflow.anthropic.autolog, MLflow будет отслеживать вложенные трассировки и записывать их в активный эксперимент MLflow при использовании Anthropic Python SDK.

import mlflow

mlflow.anthropic.autolog()

Трассировка MLflow автоматически записывает следующие сведения о вызовах Anthropic:

  • Запросы и результаты выполнения
  • Задержки
  • Имя модели
  • Дополнительные метаданные, такие как temperature, max_tokensесли задано.
  • Вызов функции, если она возвращается в рамках ответа
  • Любое исключение, если оно возникнет

Замечание

В бессерверных вычислительных кластерах автоматическая журнализация не включена автоматически. Необходимо явно вызвать mlflow.anthropic.autolog(), чтобы включить автоматическую трассировку для этой интеграции.

Замечание

В настоящее время интеграция MLflow Anthropic поддерживает трассировку только для синхронных вызовов в рамках взаимодействия с текстом. Асинхронные API не трассируются, а полные входные данные нельзя записывать для много модальных входных данных.

Предпосылки

Чтобы использовать трассировку MLflow с Anthropic, необходимо установить MLflow и Anthropic SDK.

Развитие

Для сред разработки установите полный пакет MLflow с дополнительными компонентами Databricks и anthropic:

pip install --upgrade "mlflow[databricks]>=3.1" anthropic

Полный mlflow[databricks] пакет включает все функции для локальной разработки и экспериментирования в Databricks.

Производство

Для рабочих развертываний установите mlflow-tracing и anthropic:

pip install --upgrade mlflow-tracing anthropic

Пакет mlflow-tracing оптимизирован для использования в рабочей среде.

Замечание

MLflow 3 настоятельно рекомендуется для лучшего опыта отслеживания с Anthropic.

Прежде чем выполнять приведенные ниже примеры, необходимо настроить среду:

Для пользователей вне ноутбуков Databricks: задайте переменные среды Databricks:

export DATABRICKS_HOST="https://your-workspace.cloud.databricks.com"
export DATABRICKS_TOKEN="your-personal-access-token"

Для пользователей записных книжек Databricks: эти учетные данные устанавливаются автоматически.

Ключи API: Убедитесь, что ключ API Anthropic сконфигурирован. Для использования в рабочей среде рекомендуется использовать секреты шлюза ИИ или Databricks вместо переменных среды:

export ANTHROPIC_API_KEY="your-anthropic-api-key"

Поддерживаемые API

MLflow поддерживает автоматическую трассировку для следующих API от Anthropic:

Завершение чата Вызов функции Стриминг Асинхронность Изображение Партия
✅ (*1)

(*1) В версии MLflow 2.21.0 была добавлена поддержка асинхронного использования.

Чтобы запросить поддержку дополнительных API, откройте запрос на функцию на сайте GitHub.

Базовый пример

import anthropic
import mlflow
import os

# Ensure your ANTHROPIC_API_KEY is set in your environment
# os.environ["ANTHROPIC_API_KEY"] = "your-anthropic-api-key" # Uncomment and set if not globally configured

# Enable auto-tracing for Anthropic
mlflow.anthropic.autolog()

# Set up MLflow tracking to Databricks
mlflow.set_tracking_uri("databricks")
mlflow.set_experiment("/Shared/anthropic-tracing-demo")

# Configure your API key.
client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])

# Use the create method to create new message.
message = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "Hello, Claude"},
    ],
)

Предупреждение

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

Асинхронность

import anthropic
import mlflow
import os

# Ensure your ANTHROPIC_API_KEY is set in your environment
# os.environ["ANTHROPIC_API_KEY"] = "your-anthropic-api-key" # Uncomment and set if not globally configured

# Enable trace logging
mlflow.anthropic.autolog()

# Set up MLflow tracking to Databricks if not already configured
# mlflow.set_tracking_uri("databricks")
# mlflow.set_experiment("/Shared/anthropic-async-demo")

client = anthropic.AsyncAnthropic()

response = await client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "Hello, Claude"},
    ],
)

Расширенный пример: агент вызова инструментов

Трассировка MLflow автоматически фиксирует ответы на вызовы инструментов из моделей Anthropic. Инструкция функции в ответе будет выделена в интерфейсе трассировки. Более того, можно аннотировать функцию инструмента с помощью декоратора @mlflow.trace, чтобы создать область для выполнения инструмента.

Трассировка вызовов средства Anthropic

В следующем примере реализован простой агент вызова функции с использованием Anthropic Tool Calling и MLflow Tracing для Anthropic. В примере также используется асинхронный пакет SDK anthropic, чтобы агент может обрабатывать одновременные вызовы без блокировки.

import json
import anthropic
import mlflow
import asyncio
from mlflow.entities import SpanType
import os

# Ensure your ANTHROPIC_API_KEY is set in your environment
# os.environ["ANTHROPIC_API_KEY"] = "your-anthropic-api-key" # Uncomment and set if not globally configured

# Set up MLflow tracking to Databricks if not already configured
# mlflow.set_tracking_uri("databricks")
# mlflow.set_experiment("/Shared/anthropic-tool-agent-demo")

# Assuming autolog is enabled globally or called earlier
# mlflow.anthropic.autolog()

client = anthropic.AsyncAnthropic()
model_name = "claude-3-5-sonnet-20241022"


# Define the tool function. Decorate it with `@mlflow.trace` to create a span for its execution.
@mlflow.trace(span_type=SpanType.TOOL)
async def get_weather(city: str) -> str:
    if city == "Tokyo":
        return "sunny"
    elif city == "Paris":
        return "rainy"
    return "unknown"


tools = [
    {
        "name": "get_weather",
        "description": "Returns the weather condition of a given city.",
        "input_schema": {
            "type": "object",
            "properties": {"city": {"type": "string"}},
            "required": ["city"],
        },
    }
]

_tool_functions = {"get_weather": get_weather}


# Define a simple tool calling agent
@mlflow.trace(span_type=SpanType.AGENT)
async def run_tool_agent(question: str):
    messages = [{"role": "user", "content": question}]

    # Invoke the model with the given question and available tools
    ai_msg = await client.messages.create(
        model=model_name,
        messages=messages,
        tools=tools,
        max_tokens=2048,
    )
    messages.append({"role": "assistant", "content": ai_msg.content})

    # If the model requests tool call(s), invoke the function with the specified arguments
    tool_calls = [c for c in ai_msg.content if c.type == "tool_use"]
    for tool_call in tool_calls:
        if tool_func := _tool_functions.get(tool_call.name):
            tool_result = await tool_func(**tool_call.input)
        else:
            raise RuntimeError("An invalid tool is returned from the assistant!")

        messages.append(
            {
                "role": "user",
                "content": [
                    {
                        "type": "tool_result",
                        "tool_use_id": tool_call.id,
                        "content": tool_result,
                    }
                ],
            }
        )

    # Send the tool results to the model and get a new response
    response = await client.messages.create(
        model=model_name,
        messages=messages,
        max_tokens=2048,
    )

    return response.content[-1].text


# Run the tool calling agent
cities = ["Tokyo", "Paris", "Sydney"]
questions = [f"What's the weather like in {city} today?" for city in cities]
answers = await asyncio.gather(*(run_tool_agent(q) for q in questions))

for city, answer in zip(cities, answers):
    print(f"{city}: {answer}")

Отключение автоматической трассировки

Автоматическая трассировка для Anthropic может быть отключена глобально путем вызова mlflow.anthropic.autolog(disable=True) или mlflow.autolog(disable=True).