跟踪用户和会话
许多现实世界的 AI 应用程序使用会话来维护多轮用户交互。MLflow 跟踪内置支持将跟踪与用户关联并将它们分组到会话中。在您的 GenAI 应用程序中跟踪用户和会话可为理解用户行为、分析对话流程和改进个性化提供重要背景。
在元数据中存储用户和会话 ID
MLflow 3 中的新功能
用于用户和会话跟踪的标准元数据仅在 MLflow 3 及更高版本中可用。要升级,请运行 pip install --upgrade mlflow。
MLflow 为会话和用户跟踪提供了两个标准元数据字段
mlflow.trace.user- 将跟踪与特定用户关联mlflow.trace.session- 将属于多轮对话的跟踪分组
当您使用这些标准元数据字段时,MLflow 会自动在 UI 中启用过滤和分组。与标签不同,元数据在跟踪日志记录后无法更新,因此非常适合用户 ID 和会话 ID 等不可变标识符。
基本用法
要记录应用程序中的用户和会话信息,请使用 mlflow.update_current_trace() API,并将用户和会话 ID 传递到元数据中。
- Python
- TypeScript
以下是如何为您的应用程序添加用户和会话跟踪
python
import mlflow
@mlflow.trace
def chat_completion(message: list[dict], user_id: str, session_id: str):
"""Process a chat message with user and session tracking."""
# Add user and session context to the current trace
mlflow.update_current_trace(
metadata={
"mlflow.trace.user": user_id, # Links trace to specific user
"mlflow.trace.session": session_id, # Groups trace with conversation
}
)
# Your chat logic here
return generate_response(message)
typescript
import * as mlflow from "mlflow-tracing";
const chatCompletion = mlflow.trace(
(message: list[dict], user_id: str, session_id: str) => {
// Add user and session context to the current trace
mlflow.updateCurrentTrace({
metadata: {
"mlflow.trace.user": user_id,
"mlflow.trace.session": session_id,
},
});
// Your chat logic here
return generate_response(message);
},
{ name: "chat_completion" }
);
Web 应用程序示例
- Python (FastAPI)
- TypeScript (express)
python
import mlflow
import os
from fastapi import FastAPI, Request
from pydantic import BaseModel
from openai import OpenAI
app = FastAPI()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
mlflow.set_tracking_uri("https://:5000")
mlflow.set_experiment(experiment_id="<your-experiment-id>")
mlflow.openai.autolog()
class ChatRequest(BaseModel):
message: str
@mlflow.trace
def process_chat(message: str, user_id: str, session_id: str):
# Update trace with user and session context
mlflow.update_current_trace(
metadata={
"mlflow.trace.session": session_id,
"mlflow.trace.user": user_id,
}
)
# Process chat message using OpenAI API
response = client.chat.completions.create(
model="gpt-4.1-mini",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": message},
],
)
return response.choices[0].message.content
@app.post("/chat")
def handle_chat(request: Request, chat_request: ChatRequest):
session_id = request.headers.get("X-Session-ID", "default-session")
user_id = request.headers.get("X-User-ID", "default-user")
response_text = process_chat(chat_request.message, user_id, session_id)
return {"response": response_text}
@app.get("/")
async def root():
return {"message": "FastAPI MLflow Tracing Example"}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
typescript
import express, { Request, Response } from 'express';
import bodyParser from 'body-parser';
import * as mlflow from 'mlflow-tracing';
import { tracedOpenAI } from "mlflow-openai";
import OpenAI from 'openai';
const app = express();
app.use(bodyParser.json());
const openai = tracedOpenAI(new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
}));
mlflow.init({
trackingUri: "https://:5000",
experimentId: "<your-experiment-id>",
});
class Chat {
@mlflow.trace({ spanType: mlflow.SpanType.LLM })
static async process(message: string, userId: string, sessionId: string) {
// Update MLflow trace metadata for this user and session
await mlflow.updateCurrentTrace({
metadata: {
'mlflow.trace.session': sessionId,
'mlflow.trace.user': userId,
},
});
const response = await openai.responses.create({
model: 'gpt-4.1-mini',
instructions: 'You are a helpful assistant.',
input: message,
});
return response.output_text;
}
}
app.post('/chat', async (req: Request, res: Response) => {
const sessionId = req.header('X-Session-ID') || 'default-session';
const userId = req.header('X-User-ID') || 'default-user';
const message = req.body.message;
try {
const response = await Chat.process(message, userId, sessionId);
res.json({ response: response });
} catch (err) {
res.status(500).json({ error: 'OpenAI request failed.' });
}
});
app.get('/', (req: Request, res: Response) => {
res.json({ message: 'Express MLflow Tracing Example' });
});
if (require.main === module) {
app.listen(8000, () => {
console.log('Server listening on https://:8000');
});
}
示例请求
bash
curl -X POST https://:8000/chat \
-H "Content-Type: application/json" \
-H "X-Session-ID: session-123" \
-H "X-User-ID: user-456" \
-d '{"message": "Hello, how are you?"}'
查询
- MLflow UI 搜索
- 程序化分析
使用这些搜索查询在 MLflow UI 中过滤跟踪
text
# Find all traces for a specific user
metadata.`mlflow.trace.user` = 'user-123'
# Find all traces in a session
metadata.`mlflow.trace.session` = 'session-abc-456'
# Find traces for a user within a specific session
metadata.`mlflow.trace.user` = 'user-123' AND metadata.`mlflow.trace.session` = 'session-abc-456'
以编程方式分析用户行为模式
python
import mlflow
import pandas as pd
# Search for all traces from a specific user
user_traces_df: pd.DataFrame = mlflow.search_traces(
filter_string=f"metadata.`mlflow.trace.user` = '{user_id}'",
)
# Calculate key metrics
total_interactions = len(user_traces_df)
unique_sessions = user_traces_df["metadata.mlflow.trace.session"].nunique()
avg_response_time = user_traces_df["info.execution_time_ms"].mean()
success_rate = user_traces_df["info.state"].value_counts()["OK"] / total_interactions
# Display the results
print(f"User has {total_interactions} interactions across {unique_sessions} sessions")
print(f"Average response time: {avg_response_time} ms")
print(f"Success rate: {success_rate}")