跳转至

实验管理与版本控制

1. Prompt版本化

1.1 为什么需要Prompt版本化

  • Prompt的微小修改可能导致输出质量巨变
  • 需要追踪每次修改的原因和效果
  • 支持A/B测��和回滚
  • 团队协作需要统一管理

1.2 版本管理方案

方案一:Git管理

prompts/
├── chat/
│   ├── system_prompt.txt
│   ├── few_shot_examples.json
│   └── CHANGELOG.md
├── classification/
│   ├── system_prompt.txt
│   └── CHANGELOG.md
└── prompt_config.yaml
# prompt_config.yaml
chat:
  version: "1.3"
  model: "gpt-4"
  temperature: 0.7
  system_prompt: "prompts/chat/system_prompt.txt"
  few_shot: "prompts/chat/few_shot_examples.json"

classification:
  version: "2.1"
  model: "gpt-3.5-turbo"
  temperature: 0.0
  system_prompt: "prompts/classification/system_prompt.txt"

方案二:数据库管理

class PromptVersion:
    id: str
    name: str
    version: str
    content: str
    model: str
    parameters: dict
    created_at: datetime
    created_by: str
    evaluation_score: float
    is_active: bool
    changelog: str

方案三:专用工具

  • LangSmith: LangChain生态的Prompt管理
  • PromptLayer: 专门的Prompt版本管理平台
  • Humanloop: Prompt优化和版本管理

1.3 最佳实践

  • 每次修改记录变更原因
  • 关联评估分数和版本号
  • 支持快速回滚到上一版本
  • 使用语义化版本号(主版本.次版本.修订版本)

2. 模型注册表 (Model Registry)

2.1 概念

模型注册表是管理模型生命周期的中央仓库,追踪模型版本、元数据和部署状态。

2.2 MLflow Model Registry

import mlflow

# 注册模型
with mlflow.start_run():
    mlflow.log_params({
        "model_name": "llama-3-8b",
        "quantization": "AWQ-4bit",
        "fine_tune_dataset": "custom_v2",
    })
    mlflow.log_metrics({
        "eval_accuracy": 0.85,
        "eval_latency_ms": 120,
        "eval_cost_per_1k": 0.002,
    })
    mlflow.log_artifact("model_config.yaml")

    # 注册到Registry
    mlflow.register_model(
        model_uri=f"runs:/{mlflow.active_run().info.run_id}/model",
        name="chat-assistant"
    )

# 模型阶段管理
client = mlflow.tracking.MlflowClient()
client.transition_model_version_stage(
    name="chat-assistant",
    version=3,
    stage="Production"  # Staging / Production / Archived
)

2.3 模型元数据

model:
  name: chat-assistant
  version: 3
  base_model: meta-llama/Llama-3-8B-Instruct
  quantization: AWQ-4bit

training:
  dataset: custom_instructions_v2
  epochs: 3
  learning_rate: 2e-5

evaluation:
  accuracy: 0.85
  latency_p95_ms: 150
  hallucination_rate: 0.03

deployment:
  stage: production
  serving_framework: vllm
  gpu: A100-40GB
  replicas: 2

3. 数据版本化

3.1 DVC (Data Version Control)

# 初始化DVC
dvc init

# 追踪数据文件
dvc add data/training_set.jsonl
dvc add data/knowledge_base/

# 推送到远程存储
dvc remote add -d myremote s3://my-bucket/dvc-store
dvc push

# 切换数据版本
git checkout v1.0
dvc checkout

3.2 知识库版本化

class KnowledgeBaseVersion:
    """RAG知识库的版本管理"""

    def __init__(self, version_id: str):
        self.version_id = version_id
        self.metadata = {
            "version": version_id,
            "created_at": datetime.now(),
            "document_count": 0,
            "embedding_model": "text-embedding-3-small",
            "chunk_size": 512,
            "chunk_overlap": 100,
        }

    def add_documents(self, documents: list):
        """添加文档并记录版本"""
        self.metadata["document_count"] += len(documents)
        # 索引文档...

    def diff(self, other_version: "KnowledgeBaseVersion"):
        """比较两个版本的差异"""
        added = self.documents - other_version.documents
        removed = other_version.documents - self.documents
        return {"added": added, "removed": removed}

3.3 对话数据管理

# 记录用户对话用于评估和改进
class ConversationLogger:
    def log(self, conversation):
        record = {
            "conversation_id": conversation.id,
            "messages": conversation.messages,
            "model": conversation.model,
            "prompt_version": conversation.prompt_version,
            "user_feedback": conversation.feedback,  # 点赞/踩
            "tokens_used": conversation.token_usage,
            "latency_ms": conversation.latency,
            "timestamp": datetime.now(),
        }
        self.store.insert(record)

4. 实验追踪

4.1 W&B (Weights & Biases) for LLMs

import wandb

wandb.init(project="llm-prompt-optimization")

# 记录Prompt实验
wandb.log({
    "prompt_version": "v1.3",
    "model": "gpt-4",
    "temperature": 0.7,
    "eval_accuracy": 0.85,
    "eval_faithfulness": 0.92,
    "eval_relevancy": 0.88,
    "avg_latency_ms": 1200,
    "avg_cost_per_query": 0.05,
})

# 记录Prompt内容
wandb.log({"system_prompt": wandb.Html(system_prompt_content)})

# 记录评估样本
table = wandb.Table(columns=["query", "response", "score", "feedback"])
for sample in eval_samples:
    table.add_data(sample.query, sample.response, sample.score, sample.feedback)
wandb.log({"eval_samples": table})

4.2 MLflow for LLMs

import mlflow

with mlflow.start_run(run_name="prompt_v1.3_gpt4"):
    # 记录参数
    mlflow.log_params({
        "prompt_version": "v1.3",
        "model": "gpt-4",
        "temperature": 0.7,
        "chunk_size": 512,
        "top_k": 5,
    })

    # 记录指标
    mlflow.log_metrics({
        "accuracy": 0.85,
        "faithfulness": 0.92,
        "relevancy": 0.88,
        "avg_latency_ms": 1200,
        "cost_per_query": 0.05,
    })

    # 记录Prompt文件
    mlflow.log_artifact("prompts/system_prompt_v1.3.txt")
    mlflow.log_artifact("eval_results.json")

4.3 实验对比

实���1: prompt_v1.2 + gpt-4 + temp=0.5
  准确率: 0.80 | 忠实度: 0.88 | 延迟: 1100ms | 成本: $0.04

实验2: prompt_v1.3 + gpt-4 + temp=0.7
  准确率: 0.85 | 忠实度: 0.92 | 延迟: 1200ms | 成本: $0.05

实验3: prompt_v1.3 + gpt-3.5-turbo + temp=0.7
  准确率: 0.78 | 忠实度: 0.85 | 延迟: 400ms | 成本: $0.002

结论: 实验2最优(如果预算允许),实验3性价比最高

5. 配置管理

5.1 环境配置

# config/production.yaml
llm:
  provider: openai
  model: gpt-4
  temperature: 0.7
  max_tokens: 1024
  timeout: 30

rag:
  embedding_model: text-embedding-3-small
  chunk_size: 512
  chunk_overlap: 100
  top_k: 5
  reranker: cohere-rerank-v3

prompt:
  version: v1.3
  path: prompts/production/

monitoring:
  log_level: INFO
  trace_sampling: 0.1
  alert_threshold:
    latency_p95: 3000
    error_rate: 0.01

5.2 Feature Flags

from featureflags import FeatureFlags

flags = FeatureFlags()

# 根据Feature Flag选择行为
if flags.is_enabled("use_new_prompt_v2"):
    prompt = load_prompt("v2.0")
else:
    prompt = load_prompt("v1.3")

if flags.is_enabled("enable_reranker"):
    results = rerank(retrieval_results)

6. 可复现性挑战

6.1 LLM的可复现性问题

  • 温度采样: 非零温度导致输出随机性
  • API版本变化: 模型提供商可能更新模型
  • 上下文差异: RAG检索结果可能不同
  • 系统Prompt: 微小修改导致行为变化

6.2 提高可复现性的方法

# 1. 固定随机种子(如果API支持)
response = client.chat.completions.create(
    model="gpt-4",
    messages=messages,
    temperature=0,  # 确定性输出
    seed=42,        # 固定种子
)

# 2. 记录完整的请求和响应
experiment_log = {
    "request": {
        "model": "gpt-4",
        "messages": messages,
        "temperature": 0,
        "seed": 42,
    },
    "response": response.model_dump(),
    "metadata": {
        "api_version": "2024-01",
        "prompt_version": "v1.3",
        "rag_index_version": "20240301",
    }
}

7. A/B测试设置

详见 AB测试与上线

参考资料

  • MLflow Documentation
  • Weights & Biases Documentation
  • DVC Documentation
  • LLMOps综述 — LLMOps整体概述
  • AB测试与上线 — 上线策略详解

评论 #