实验管理与版本控制
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测试与上线 — 上线策略详解