跟踪语义内核

语义内核 是一种轻型开源 SDK,充当 C#、Python 和 Java 的 AI 中间件。 它抽象化模型交互,并跨提供程序编写提示、函数和插件。

MLflow 跟踪 与语义内核集成,可自动检测内核回调并捕获全面的执行跟踪。 无需更改应用逻辑 , 即可启用 mlflow.semantic_kernel.autolog它。

集成提供了完整的视图:

  • 提示和完成响应
  • 聊天历史记录和消息
  • 潜伏期
  • 模型名称和提供程序
  • 内核函数和插件
  • 模板变量和参数
  • 令牌使用情况信息
  • 引发的任何异常

注释

流式处理当前未跟踪。

先决条件

若要将 MLflow 跟踪与语义内核配合使用,需要安装 MLflow 和相关语义内核包。

开发

对于开发环境,请使用 Databricks Extras 和 Semantic Kernel 安装完整的 MLflow 包:

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

完整 mlflow[databricks] 包包括用于 Databricks 的本地开发和试验的所有功能。

生产

对于生产部署,安装和 mlflow-tracing 语义内核:

pip install --upgrade mlflow-tracing semantic_kernel openai

mlflow-tracing 已针对生产用途进行优化。

注释

建议使用 MLflow 3 来获得最佳跟踪体验。

在运行示例之前,需要配置环境:

对于不使用 Databricks 笔记本的用户:设置 Databricks 环境变量:

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

对于 Databricks 笔记本中的用户:这些凭据会自动为您设置。

API 密钥:确保配置 LLM 提供程序 API 密钥。 对于生产环境,请使用 马赛克 AI 网关或 Databricks 机密,而不要使用硬编码的值,以便更安全地管理 API 密钥。

export OPENAI_API_KEY="your-openai-api-key"
# Add other provider keys as needed

示例用法

语义内核主要使用异步模式。 在笔记本中,可以直接 await ;在脚本中,用 asyncio.run()包装。

import mlflow

mlflow.semantic_kernel.autolog()
import openai
from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion

openai_client = openai.AsyncOpenAI()

kernel = Kernel()
kernel.add_service(
    OpenAIChatCompletion(
        service_id="chat-gpt",
        ai_model_id="gpt-4o-mini",
        async_client=openai_client,
    )
)

answer = await kernel.invoke_prompt("Is sushi the best food ever?")
print("AI says:", answer)

令牌使用情况跟踪

MLflow 3.2.0+ 记录每个 LLM 调用的令牌使用情况,并聚合跟踪信息中的总计。

import mlflow

last_trace_id = mlflow.get_last_active_trace_id()
trace = mlflow.get_trace(trace_id=last_trace_id)

print(trace.info.token_usage)
for span in trace.data.spans:
    usage = span.get_attribute("mlflow.chat.tokenUsage")
    if usage:
        print(span.name, usage)

禁用自动跟踪

禁用语义内核自动跟踪,mlflow.semantic_kernel.autolog(disable=True)或者禁用所有 。mlflow.autolog(disable=True)