Поделиться через


Обеспечение наблюдаемости агента посредством отслеживания в MLflow

В этой статье описывается, как добавить наблюдаемость для генеративных приложений ИИ с помощью трассировки MLflow в Databricks.

Что такое трассировка MLflow?

MLflow Tracing обеспечивает сквозное наблюдение за генеративными приложениями ИИ от разработки до развертывания. Трассировка полностью интегрирована с инструментарием генеративного ИИ от Databricks, предоставляя подробные аналитические сведения на всех этапах жизненного цикла разработки и производства.

Встроенная трассировка фиксирует подробные сведения на каждом этапе в приложении генеративного ИИ

Ниже приведены ключевые варианты использования трассировки в приложениях ИИ поколения.

  • Упрощенная отладка: трассировка обеспечивает видимость каждого шага вашего приложения генеративного ИИ, что упрощает диагностику и устранение проблем.

  • офлайн-оценка: Трассировка генерирует ценные данные для оценки агента, позволяя измерять и улучшать качество агента с течением времени.

  • Производственный мониторинг: Трассировка обеспечивает видимость поведения агента и подробные шаги его выполнения, что позволяет контролировать и оптимизировать производительность агента в производственной среде.

  • журналы аудита: трассировка MLflow создает комплексные журналы аудита действий и решений агента. Это жизненно важно для обеспечения соответствия требованиям и поддержки отладки при возникновении непредвиденных проблем.

Требования

Отслеживание MLflow доступно в MLflow версии 2.13.0 и выше. Databricks рекомендует установить последнюю версию MLflow для доступа к новейшим функциям и улучшениям.

%pip install mlflow>=2.13.0 -qqqU
%restart_python

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

автоматический журнал MLflow позволяет быстро инструментировать агент, добавив одну строку в код, mlflow.<library>.autolog().

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

Библиотека Поддержка версий автологирования Команда автологирования
LangChain 0.1.0 ~ Последняя версия mlflow.langchain.autolog()
Langgraph 0.1.1 ~ Последняя версия mlflow.langgraph.autolog()
OpenAI 1.0.0 ~ Последняя версия mlflow.openai.autolog()
LlamaIndex 0.10.44 ~ Последняя версия mlflow.llamaindex.autolog()
DSPy 2.5.17 ~ Последняя версия mlflow.dspy.autolog()
Amazon Bedrock 1.33.0 ~ Latest (boto3) mlflow.bedrock.autolog()
Антропик 0.30.0 ~ Последняя версия mlflow.anthropic.autolog()
AutoGen 0.2.36 ~ 0.2.40 mlflow.autogen.autolog()
Гугл Джемини 1.0.0 ~ Последняя версия mlflow.gemini.autolog()
CrewAI 0.80.0 ~ Последняя версия mlflow.crewai.autolog()
LiteLLM 1.52.9 ~ Последняя версия mlflow.litellm.autolog()
Groq 0.13.0 ~ Последняя версия mlflow.groq.autolog()
Мистраль 1.0.0 ~ Последняя версия mlflow.mistral.autolog()

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

Трассировка автологирования включена по умолчанию в Databricks Runtime 15.4 ML и выше для следующих библиотек:

  • LangChain
  • Langgraph
  • OpenAI
  • LlamaIndex

Чтобы отключить трассировку автологирования для этих библиотек, выполните следующую команду в записной книжке:

`mlflow.<library>.autolog(log_traces=False)`

Добавление трассировок вручную

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

API трассировки в MLflow — это API-интерфейсы с минимальным кодированием для добавления трассировок без необходимости управления древовидной структурой трассировки. MLflow определяет соответствующие связи между родительскими и дочерними элементами автоматически с помощью стека Python.

Объедините автоматическое логирование и ручную трассировку

Интерфейсы отслеживания вручную можно использовать с автологированием. MLflow объединяет диапазоны, созданные с помощью автологирования и ручной трассировки, чтобы создать полную трассировку выполнения агента. Пример объединения автоматического ведения журнала и ручной трассировки см. в Пример использования агента вызова инструментов с трассировкой MLflow.

Функции трассировки с помощью декоратора @mlflow.trace

Самый простой способ вручную инструментировать код — декорировать функцию с помощью декоратора @mlflow.trace. декоратор трассировки MLflow создает "диапазон" с областью украшенной функции, которая представляет единицу выполнения в трассировке и отображается в виде одной строки в визуализации трассировки. Диапазон записывает входные и выходные данные функции, задержки и все исключения, вызванные функцией.

Например, следующий код создает диапазон с именем my_function, который записывает входные аргументы x и y и выходные данные.

import mlflow

@mlflow.trace
def add(x: int, y: int) -> int:
  return x + y

Кроме того, можно настроить имя диапазона, тип диапазона и добавить настраиваемые атрибуты в диапазон:

from mlflow.entities import SpanType

@mlflow.trace(
  # By default, the function name is used as the span name. You can override it with the `name` parameter.
  name="my_add_function",
  # Specify the span type using the `span_type` parameter.
  span_type=SpanType.TOOL,
  # Add custom attributes to the span using the `attributes` parameter. By default, MLflow only captures input and output.
  attributes={"key": "value"}
)
def add(x: int, y: int) -> int:
  return x + y

Трассировка произвольных блоков кода с помощью диспетчера контекстов

Чтобы создать диапазон для произвольного блока кода, а не только функции, используйте mlflow.start_span() в качестве диспетчера контекстов, который упаковывает блок кода. Диапазон начинается при вводе контекста и заканчивается при выходе контекста. Входные и выходные параметры диапазона должны быть предоставлены вручную с помощью методов установки объекта диапазона, предоставленного контекстным менеджером. Дополнительные сведения см. в документации по MLflow — обработчик контекста.

with mlflow.start_span(name="my_span") as span:
  span.set_inputs({"x": x, "y": y})
  result = x + y
  span.set_outputs(result)
  span.set_attribute("key", "value")

Библиотеки трассировки нижнего уровня

MLflow также предоставляет низкоуровневые API для явного управления структурой дерева трассировки. См. документацию по MLflow —ручная инструментализация.

Пример трассировки : сочетание автоматического логирования и ручной трассировки.

В следующем примере объединяются автоматическая запись OpenAI и ручное отслеживание для полного оснащения инструментами агента, вызов которого осуществляется с помощью инструментов.

import json
from openai import OpenAI
import mlflow
from mlflow.entities import SpanType

client = OpenAI()

# Enable OpenAI autologging to capture LLM API calls
# (*Not necessary if you are using the Databricks Runtime 15.4 ML and above, where OpenAI autologging is enabled by default)
mlflow.openai.autolog()

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


tools = [
  {
    "type": "function",
    "function": {
      "name": "get_weather",
      "parameters": {
        "type": "object",
        "properties": {"city": {"type": "string"}},
      },
    },
  }
]

_tool_functions = {"get_weather": get_weather}

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

  # Invoke the model with the given question and available tools
  response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=messages,
    tools=tools,
  )
  ai_msg = response.choices[0].message
  messages.append(ai_msg)

  # If the model requests tool calls, invoke the function(s) with the specified arguments
  if tool_calls := ai_msg.tool_calls:
    for tool_call in tool_calls:
      function_name = tool_call.function.name
      if tool_func := _tool_functions.get(function_name):
        args = json.loads(tool_call.function.arguments)
        tool_result = tool_func(**args)
      else:
        raise RuntimeError("An invalid tool is returned from the assistant!")

      messages.append(
        {
          "role": "tool",
          "tool_call_id": tool_call.id,
          "content": tool_result,
        }
      )

    # Send the tool results to the model and get a new response
    response = client.chat.completions.create(
      model="gpt-4o-mini", messages=messages
    )

  return response.choices[0].message.content

# Run the tool calling agent
question = "What's the weather like in Paris today?"
answer = run_tool_agent(question)

Аннотирование трассировок с использованием тегов

теги трассировки MLflow являются парами "ключ-значение", которые позволяют добавлять пользовательские метаданные в трассировки, такие как идентификатор беседы, идентификатор пользователя, хэш фиксации Git и т. д. Теги отображаются в пользовательском интерфейсе MLflow для фильтрации и поиска трассировок.

Теги можно задать для текущей или завершенной трассировки с помощью API MLflow или пользовательского интерфейса MLflow. В следующем примере показано добавление тега в текущую трассировку с помощью API mlflow.update_current_trace().

@mlflow.trace
def my_func(x):
    mlflow.update_current_trace(tags={"fruit": "apple"})
    return x + 1

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

Рассмотрение трассировок

Чтобы просмотреть следы после запуска агента, используйте один из следующих вариантов:

  • визуализация в строке. В записных книжках Databricks трассировки отображаются в выходных данных ячейки.
  • эксперимент MLflow: в Databricks перейдите к Эксперименты>, выберите эксперимент >итрассировки для просмотра и поиска по всем трассировкам этого эксперимента.
  • запуск MLflow: когда агент запускается в рамках активного сеанса MLflow, трассировки (traces) отображаются на странице сеанса пользовательского интерфейса MLflow.
  • интерфейса оценивания агента. В Mosaic AI оценке агента, вы можете просмотреть трассировки для каждого выполнения агента, нажав на Просмотреть подробную трассировку в результате оценки.
  • API поиска трассировки: для программного извлечения трассировок используйте API поискатрассировки.

Оценка агентов с помощью трассировок

Данные трассировки служат ценным ресурсом для оценки агентов. Записывая подробные сведения о выполнении моделей, трассировка MLflow играет важную роль в офлайн оценке. Данные трассировки можно использовать для оценки производительности вашего агента в сравнении с эталонным набором данных, выявления проблем и повышения его производительности.

%pip install -U mlflow databricks-agents
%restart_python
import mlflow

# Get the recent 50 successful traces from the experiment
traces = mlflow.search_traces(
    max_results=50,
    filter_string="status = 'OK'",
)

traces.drop_duplicates("request", inplace=True) # Drop duplicate requests.
traces["trace"] = traces["trace"].apply(lambda x: x.to_json()) # Convert the trace to JSON format.

# Evaluate the agent with the trace data
mlflow.evaluate(data=traces, model_type="databricks-agent")

Дополнительные сведения об оценке агента см. в статье Запуск оценки и просмотр результатов.

Мониторинг развернутых агентов с таблицами вывода данных

После развертывания агента на платформе Mosaic AI для предоставления моделей, можно использовать таблицы вывода данных для мониторинга агента. Таблицы вывода содержат подробные журналы запросов, ответов, трассировок агента и обратную связь агента из приложения для проверки. Эта информация позволяет отлаживать проблемы, отслеживать производительность и создавать золотой набор данных для автономной оценки.

Сведения о включении таблиц вывода для развертываний агентов см. в разделе Включение таблиц вывода для агентов ИИ.

Запрос сетевых трассировок

Используйте записную книжку для запроса таблицы вывода и анализа результатов.

Чтобы визуализировать трассировки, выполните display(<the request logs table>) и выберите строки для проверки:

# Query the inference table
df = spark.sql("SELECT * FROM <catalog.schema.my-inference-table-name>")
display(df)

Мониторинг агентов

См. Как отслеживать приложения генеративного ИИ.

** Задержка из-за накладных издержек трассировки

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

В следующей таблице приведены приблизительные оценки влияния задержки на размер трассировки:

Размер трассы на запрос Влияние на задержку скорости отклика (мс)
~10 КБ ~ 1 мс
~ 1 МБ 50 ~ 100 мс
10 МБ 150 мс ~

Устранение неполадок

Сведения об устранении неполадок и распространенных проблемах см. в документации по MLflow: руководство по трассировке и документации по MLflow: вопросы и ответы