在已部署应用程序中使用提示

重要

此功能在 Beta 版中。

本指南介绍如何在生产环境中的代理中使用 MLflow Prompt Registry 里的提示。

部署代理时,配置它们使用别名而非硬编码版本,从MLflow提示注册表加载提示。 此方法支持动态更新,而无需重新部署。

先决条件

  1. 安装 MLflow 和所需包

    pip install --upgrade "mlflow[databricks]>=3.1.0"
    
  2. 请按照设置环境快速入门创建 MLflow 试验。

  3. 验证你是否有权访问具有 CREATE FUNCTION、EXECUTE 和 MANAGE 权限的 Unity Catalog 架构以使用提示注册表。

步骤 1. 创建新提示

可以使用 Python SDK 以编程方式创建提示。

使用 mlflow.genai.register_prompt(). 以编程方式创建提示。 提示对模板变量使用双大括号语法 ({{variable}})。

import mlflow

# Replace with a Unity Catalog schema where you have CREATE FUNCTION permission
uc_schema = "workspace.default"
# This table will be created in the above UC schema
prompt_name = "summarization_prompt"

# Define the prompt template with variables
initial_template = """\
Summarize content you are provided with in {{num_sentences}} sentences.

Content: {{content}}
"""

# Register a new prompt
prompt = mlflow.genai.register_prompt(
    name=f"{uc_schema}.{prompt_name}",
    template=initial_template,
    # all parameters below are optional
    commit_message="Initial version of summarization prompt",
    tags={
        "author": "data-science-team@company.com",
        "use_case": "document_summarization",
        "task": "summarization",
        "language": "en",
        "model_compatibility": "gpt-4"
    }
)

print(f"Created prompt '{prompt.name}' (version {prompt.version})")

步骤 2. 向提示版本添加别名

别名允许将静态字符串标记分配给特定的提示版本,从而更轻松地在生产应用程序中引用提示。 可以使用有意义的别名(例如 production, staging或 development)而不是硬编码版本号。 当必须更新生产提示时,请重新分配 production 别名以指向较新版本,而无需更改或重新部署应用程序代码。

import mlflow
mlflow.genai.set_prompt_alias(
    name=f"{uc_schema}.{prompt_name}",
    alias="production",
    version=1
)

步骤 3. 在应用中引用提示

注册提示并分配别名后,可以使用提示 URI 格式在已部署的应用程序中引用它。 建议的方法是使用环境变量使应用程序变得灵活,并避免硬编码提示引用。

提示 URI 格式为: prompts:/{catalog}.{schema}.{prompt_name}@{alias}

使用我们在步骤 1 中注册的提示,URI 将为:

  • prompts://workspace.default.summarization_prompt@production

MLflow 客户端缓存提示模板,因此提示注册表不会给代理带来延迟。 有关详细信息,请参阅 提示缓存。

下面介绍如何在应用程序中引用提示:

import mlflow
import os
from typing import Optional

mlflow.set_tracking_uri("databricks")
mlflow.set_registry_uri("databricks-uc")

class ProductionApp:
    def __init__(self):
        # Use environment variable for flexibility
        self.prompt_alias = os.getenv("PROMPT_ALIAS", "production")
        self.prompt_name = os.getenv("PROMPT_URI", "workspace.default.summarization_prompt")

    def get_prompt(self) -> str:
        """Load prompt from registry using alias."""
        uri = f"prompts:/{self.prompt_name}@{self.prompt_alias}"
        prompt = mlflow.genai.load_prompt(uri)
        return prompt

    # Rest of your application's code

# Example usage
app = ProductionApp()
prompt = app.get_prompt()
print(f"Loaded prompt: {prompt}")

版本管理工作流

别名使你可以在开发过程中对提示进行迭代,并在不同环境中逐步推行它们,而无需更改应用程序代码。

开发工作流

在提升到生产之前,使用开发别名测试提示更改:

from datetime import datetime
import mlflow

def develop_prompt(base_name: str, changes: str):
    """Iterate on prompts during development."""

    # Register new version
    new_version = mlflow.genai.register_prompt(
        name=base_name,
        template=changes,
        commit_message=f"Dev iteration: {datetime.now()}"
    )

    # Update dev alias
    mlflow.genai.set_prompt_alias(
        name=base_name,
        alias="dev",
        version=new_version.version
    )

    return new_version

促销流程

通过重新分配别名在不同环境之间传递提示信息。

import mlflow

def promote_prompt(name: str, from_env: str, to_env: str):
    """Promote prompt from one environment to another."""

    # Get current version in source environment
    source = mlflow.genai.load_prompt(f"prompts:/{name}@{from_env}")

    # Point target environment to same version
    mlflow.genai.set_prompt_alias(
        name=name,
        alias=to_env,
        version=source.version
    )

    print(f"Promoted {name} v{source.version} from {from_env} to {to_env}")

别名策略

根据团队的部署模式设计别名策略。 以下示例演示了常见方法:

import mlflow

# Standard environment aliases
ENVIRONMENT_ALIASES = ["dev", "staging", "production"]

# Feature branch aliases
def create_feature_alias(prompt_name: str, feature: str, version: int):
    """Create alias for feature development."""
    mlflow.genai.set_prompt_alias(
        name=prompt_name,
        alias=f"feature-{feature}",
        version=version
    )

# Regional aliases
REGIONAL_ALIASES = {
    "us": "production-us",
    "eu": "production-eu",
    "asia": "production-asia"
}

# Rollback-ready aliases
def safe_production_update(name: str, new_version: int):
    """Update production with rollback capability."""
    try:
        # Save current production
        current = mlflow.genai.load_prompt(f"prompts:/{name}@production")
        mlflow.genai.set_prompt_alias(name, "production-previous", current.version)
    except:
        pass  # No current production

    # Update production
    mlflow.genai.set_prompt_alias(name, "production", new_version)

使用自定义代理将提示注册表与已部署的代理结合使用

若要从使用自定义代理部署的代理访问提示注册表,必须使用手动身份验证并替代安全环境变量来配置 Databricks Client 以连接到注册表。

重要

重写这些安全环境变量将会关闭对于你的代理依赖的其他资源的自动传输功能。

其他资源