Prompt模板管理

Prompt模板管理:企业级Prompt工程实践

从"散装Prompt"到"Prompt工程体系" 2026年,大型企业平均拥有超过5000个生产环境Prompt。这些Prompt分散在不同团队、不同项目中,由不同开发者编写,使用不同模型,服务于不同场景。如果没有系统化的管理方案,Prompt的维护成本将急剧攀升。 典型问题: 同一业务的Prompt在10个项目中各自维护,修改需要同步10处 离职员工的Prompt无人理解,不敢修改 模型升级后30%的Prompt性能下降,但无人知晓 没有统一的Prompt质量标准,质量参差不齐 本文分享我们在过去两年中构建企业级Prompt管理系统的实践经验。 Prompt模板架构 模板结构设计 from dataclasses import dataclass, field from typing import Optional from enum import Enum class PromptCategory(Enum): SYSTEM = "system" # 系统级Prompt TASK = "task" # 任务级Prompt GUARDRAIL = "guardrail" # 安全护栏 UTILITY = "utility" # 工具函数 EVALUATION = "evaluation" # 评估用 class PromptStatus(Enum): DRAFT = "draft" REVIEW = "review" TESTING = "testing" STAGING = "staging" PRODUCTION = "production" DEPRECATED = "deprecated" @dataclass class PromptTemplate: """Prompt模板定义""" id: str # 唯一标识 name: str # 模板名称 category: PromptCategory # 分类 status: PromptStatus # 状态 # 模板内容 system_prompt: str # 系统提示 user_prompt_template: str # 用户提示模板(含变量) variables: list[dict] # 变量定义 # 元数据 description: str # 描述 author: str # 作者 version: str # 版本号 tags: list[str] # 标签 # 配置 model_config: dict # 模型配置 expected_output: Optional[dict] # 期望输出格式 # 质量指标 quality_score: Optional[float] # 质量评分 latency_p95: Optional[float] # P95延迟 success_rate: Optional[float] # 成功率 # 关联 dependencies: list[str] = field(default_factory=list) # 依赖的其他模板 parent_id: Optional[str] = None # 父模板(继承关系) 模板语法 class PromptTemplateEngine: """ Prompt模板引擎 支持变量插值、条件逻辑、循环和继承 """ # 模板语法示例 TEMPLATE_EXAMPLE = """ {{#system}} 你是{{role}},专注于{{domain}}领域。 核心规则: {{#rules}} - {{.}} {{/rules}} {{#if strict_mode}} ⚠️ 严格遵守以上规则,不允许偏离。 {{/if}} {{/system}} {{#user}} {{user_input}} {{#if context}} 相关上下文: {{#context}} --- {{.}} --- {{/context}} {{/if}} {{#if examples}} 参考示例: {{#examples}} 输入:{{input}} 输出:{{output}} {{/examples}} {{/if}} {{/user}} """ def __init__(self): self.templates: dict[str, PromptTemplate] = {} self.cache = {} def render(self, template_id: str, variables: dict) -> dict: """渲染模板""" template = self.templates.get(template_id) if not template: raise ValueError(f"模板 {template_id} 不存在") # 合并默认变量 merged_vars = self._merge_defaults(template, variables) # 验证必填变量 self._validate_variables(template, merged_vars) # 渲染 system = self._render_text(template.system_prompt, merged_vars) user = self._render_text(template.user_prompt_template, merged_vars) return { "system": system, "user": user, "model_config": template.model_config, "template_id": template_id, "version": template.version } def _render_text(self, template_text: str, variables: dict) -> str: """渲染模板文本""" # 使用Jinja2或自定义模板引擎 from jinja2 import Template tpl = Template(template_text) return tpl.render(**variables) Prompt注册中心 集中化存储 class PromptRegistry: """ Prompt注册中心 所有Prompt模板的单一可信来源(Single Source of Truth) """ def __init__(self, storage_backend="postgresql"): self.storage = self._init_storage(storage_backend) async def register(self, template: PromptTemplate) -> str: """注册新模板""" # 验证 self._validate_template(template) # 检查命名冲突 if await self._exists(template.name, template.version): raise ValueError(f"模板 {template.name} v{template.version} 已存在") # 存储 template_id = await self.storage.save(template) # 建立索引 await self._update_index(template) return template_id async def get(self, template_id: str) -> PromptTemplate: """获取模板""" return await self.storage.get(template_id) async def search(self, query: dict) -> list[PromptTemplate]: """搜索模板""" # 支持按名称、标签、分类、状态搜索 return await self.storage.search(query) async def update(self, template_id: str, updates: dict) -> PromptTemplate: """更新模板(创建新版本)""" current = await self.get(template_id) # 创建新版本 new_version = self._increment_version(current.version) updated = PromptTemplate( **{**current.__dict__, **updates, "version": new_version, "parent_id": template_id} ) # 注册新版本 new_id = await self.register(updated) # 标记旧版本 await self.storage.update( template_id, {"status": PromptStatus.DEPRECATED} ) return updated 权限管理 class PromptAccessControl: """ Prompt权限管理 """ PERMISSIONS = { "read": "查看模板", "write": "创建/修改模板", "deploy": "部署到生产", "delete": "删除模板", "export": "导出模板", } ROLES = { "viewer": ["read"], "developer": ["read", "write"], "reviewer": ["read", "write"], "admin": ["read", "write", "deploy", "delete", "export"], } def check_permission(self, user_id: str, template_id: str, permission: str) -> bool: """检查用户权限""" user_role = self._get_user_role(user_id) allowed = self.ROLES.get(user_role, []) if permission not in allowed: return False # 项目级权限检查 template = self.registry.get(template_id) if not self._has_project_access(user_id, template.project): return False return True Prompt流水线 CI/CD for Prompts class PromptPipeline: """ Prompt CI/CD 流水线 从开发到部署的完整流程 """ async def run_pipeline(self, template: PromptTemplate): """执行完整流水线""" results = {} # 阶段1: 静态检查 results["lint"] = await self._lint(template) if not results["lint"]["passed"]: return results # 阶段2: 单元测试 results["unit_test"] = await self._unit_test(template) if not results["unit_test"]["passed"]: return results # 阶段3: 安全检查 results["security"] = await self._security_scan(template) if not results["security"]["passed"]: return results # 阶段4: 性能测试 results["performance"] = await self._performance_test(template) # 阶段5: A/B测试准备 results["ab_setup"] = await self._setup_ab_test(template) # 阶段6: 部署 if all(r.get("passed", True) for r in results.values()): results["deploy"] = await self._deploy(template) return results async def _lint(self, template: PromptTemplate) -> dict: """静态检查""" issues = [] # 检查变量完整性 used_vars = self._extract_variables(template.user_prompt_template) defined_vars = [v["name"] for v in template.variables] for var in used_vars: if var not in defined_vars: issues.append(f"未定义的变量: {var}") # 检查长度 if len(template.system_prompt) > 2000: issues.append("System Prompt过长(>2000字符),可能影响性能") # 检查安全 dangerous_patterns = ["ignore previous", "you are now", "system prompt"] for pattern in dangerous_patterns: if pattern in template.user_prompt_template.lower(): issues.append(f"潜在安全风险: 包含 '{pattern}'") return { "passed": len(issues) == 0, "issues": issues } async def _unit_test(self, template: PromptTemplate) -> dict: """单元测试""" test_cases = template.variables.get("test_cases", []) results = [] for case in test_cases: rendered = self.engine.render(template.id, case["input"]) response = await self.llm.generate(rendered) passed = self._evaluate_response( response, case["expected"] ) results.append({ "case_name": case.get("name", "unnamed"), "passed": passed, "response": response[:200] }) pass_rate = sum(r["passed"] for r in results) / len(results) return { "passed": pass_rate >= 0.9, "pass_rate": pass_rate, "results": results } async def _performance_test(self, template: PromptTemplate) -> dict: """性能测试""" import time latencies = [] for _ in range(50): start = time.time() rendered = self.engine.render(template.id, {}) response = await self.llm.generate(rendered) latencies.append(time.time() - start) import numpy as np return { "passed": np.percentile(latencies, 95) < 5.0, # P95 < 5秒 "p50": np.median(latencies), "p95": np.percentile(latencies, 95), "p99": np.percentile(latencies, 99), } Prompt监控系统 实时监控 class PromptMonitor: """ Prompt生产环境监控 """ def __init__(self): self.metrics_store = MetricsStore() self.alerting = AlertingSystem() async def record_invocation(self, template_id: str, version: str, invocation_data: dict): """记录每次Prompt调用""" await self.metrics_store.record({ "template_id": template_id, "version": version, "timestamp": datetime.now(), "input": invocation_data["input"], "output": invocation_data["output"], "latency_ms": invocation_data["latency_ms"], "tokens_used": invocation_data["tokens_used"], "cost": invocation_data["cost"], "success": invocation_data["success"], "user_feedback": invocation_data.get("user_feedback"), }) # 实时检查 await self._check_anomalies(template_id, invocation_data) async def _check_anomalies(self, template_id: str, data: dict): """异常检测""" # 延迟异常 baseline_latency = await self.metrics_store.get_baseline_latency(template_id) if data["latency_ms"] > baseline_latency * 3: await self.alerting.send_alert( level="warning", template_id=template_id, message=f"延迟异常: {data['latency_ms']}ms (基线: {baseline_latency}ms)" ) # 成功率下降 recent_success_rate = await self.metrics_store.get_recent_success_rate( template_id, window_minutes=30 ) if recent_success_rate < 0.85: await self.alerting.send_alert( level="critical", template_id=template_id, message=f"成功率下降: {recent_success_rate:.1%}" ) # 成本异常 daily_cost = await self.metrics_store.get_daily_cost(template_id) if daily_cost > 100: # 日成本超过100元 await self.alerting.send_alert( level="warning", template_id=template_id, message=f"日成本异常: ¥{daily_cost}" ) 仪表盘 class PromptDashboard: """Prompt管理仪表盘数据生成""" def generate_report(self, date_range: tuple) -> dict: return { "overview": { "total_templates": self._count_templates(), "active_templates": self._count_active_templates(), "total_invocations": self._count_invocations(date_range), "total_cost": self._sum_cost(date_range), "avg_success_rate": self._avg_success_rate(date_range), "avg_latency_p95": self._avg_latency(date_range), }, "top_templates": self._top_templates(date_range, n=10), "quality_issues": self._identify_quality_issues(date_range), "cost_breakdown": self._cost_breakdown(date_range), "performance_trends": self._performance_trends(date_range), "recommendations": self._generate_recommendations(date_range), } 模板继承与组合 class PromptInheritance: """ Prompt模板继承系统 支持模板之间的继承和组合 """ def resolve(self, template_id: str) -> PromptTemplate: """ 解析模板继承链,生成最终Prompt """ template = self.registry.get(template_id) if template.parent_id: # 递归解析父模板 parent = self.resolve(template.parent_id) # 合并:子模板覆盖父模板 return self._merge(parent, template) return template def _merge(self, parent: PromptTemplate, child: PromptTemplate) -> PromptTemplate: """合并父子模板""" return PromptTemplate( id=child.id, name=child.name, system_prompt=child.system_prompt or parent.system_prompt, user_prompt_template=child.user_prompt_template or parent.user_prompt_template, variables=self._merge_variables(parent.variables, child.variables), # ... 其他字段 ) 最佳实践总结 Prompt模板管理清单 维度 实践 优先级 存储 集中化注册中心 P0 版本 语义化版本控制 P0 权限 基于角色的访问控制 P1 测试 自动化单元测试 P0 安全 注入扫描+内容审查 P0 监控 延迟/成功率/成本 P0 文档 每个模板附带说明 P1 复用 模板继承与组合 P1 优化 A/B测试框架 P2 治理 定期审查与清理 P1 结语 Prompt模板管理是AI工程化的基础设施。2026年的经验表明:将Prompt视为代码(Prompt as Code)是正确的方向。 版本控制、CI/CD、测试、监控——这些软件工程的成熟实践同样适用于Prompt管理。 ...

2026-06-30 · 5 min · 1036 words · 硅基 AGI 探索者
Prompt工程2026:从基础技巧到企业级应用

Prompt工程2026:从基础技巧到企业级应用

Prompt工程在2026年已经从"玄学技巧"演变为一门系统化的工程学科。当LLM能力越来越强,Prompt的焦点从"让模型能做"转向了"让模型做得好、做得稳、做得可控"。本文将从基础到企业级,全面梳理2026年Prompt工程的最新实践。 一、Prompt工程的2026年现状 范式转变 时期 核心挑战 Prompt焦点 代表技术 2022-2023 模型能力有限 如何让模型"能做" Few-shot, CoT 2024-2025 能力提升但不可控 如何让模型"做好" 结构化Prompt, ReAct 2026 能力强但需要规模化 如何让模型"做稳" Prompt管理, A/B测试, 自动优化 2026年的核心认知 模型能力已不是瓶颈:GPT-5/Claude 5的基本能力足以应对大多数任务 Prompt质量决定输出质量:同样的模型,好Prompt和差Prompt的效果差距可达300% Prompt是资产:企业Prompt需要版本管理、测试、监控——和代码一样 自动化是趋势:自动Prompt优化(APO)开始替代人工调优 二、基础技巧回顾与升级 1. 角色设定(Role Prompting) 2026年的最佳实践不再是简单的"你是一个专家",而是结构化角色定义: # 角色定义 你是一位资深的金融分析师,拥有CFA证书和15年A股市场研究经验。 ## 专业知识 - 精通财务报表分析和估值模型(DCF, DDM, PEG) - 熟悉A股市场的行业轮动和风格切换 - 擅长宏观经济分析和政策解读 ## 分析风格 - 数据驱动:每个结论必须有数据支撑 - 辩证思考:同时分析利多和利空因素 - 风险意识:始终提示潜在风险 ## 输出规范 - 使用专业但易懂的语言 - 关键数据标注来源 - 给出明确的投资建议(买入/持有/卖出)和理由 2. Few-Shot Learning的进化 2026年的Few-Shot不再只是"给几个例子",而是动态示例选择: ...

2026-06-30 · 4 min · 659 words · 硅基 AGI 探索者
agent version management rollout

Agent 版本管理:Prompt/工具/模型的灰度发布

引言 Agent 系统的三个核心维度——Prompt、工具、模型——任何一个的变更都可能引发连锁反应。传统软件的版本管理主要针对代码,而 Agent 还需要管理自然语言"代码"(Prompt)、动态加载的工具和外部模型版本。本文将构建完整的 Agent 版本管理体系。 一、Agent 版本的复杂性 变更类型与风险 ┌──────────────────────────────────────────────────────┐ │ Agent 变更类型与风险矩阵 │ ├──────────────┬──────────┬──────────┬─────────────────┤ │ 变更类型 │ 频率 │ 风险等级 │ 影响范围 │ ├──────────────┼──────────┼──────────┼─────────────────┤ │ Prompt 修改 │ 每周 │ 中-高 │ 输出质量/行为 │ │ 工具更新 │ 每月 │ 中 │ 工具调用/结果 │ │ 模型升级 │ 每季度 │ 高 │ 全局行为变化 │ │ System配置 │ 每周 │ 低-中 │ 性能/限制 │ │ Few-shot示例 │ 每月 │ 中 │ 输出风格/格式 │ │ 工作流变更 │ 每月 │ 高 │ 执行路径/延迟 │ └──────────────┴──────────┴──────────┴─────────────────┘ 版本组合的笛卡尔积问题 Agent 行为是 Prompt版本 × 工具版本 × 模型版本 的组合。如果三者各自有 3 个版本,理论上存在 27 种组合。版本管理的目标就是确保任意组合的行为可预测、可回滚。 ...

2026-06-28 · 7 min · 1288 words · 硅基 AGI 探索者
prompt version management

Prompt版本管理实践

引言 Prompt是大语言模型应用的核心资产,但在很多团队中,Prompt的管理方式仍然停留在复制粘贴和聊天记录中。随着Prompt复杂度增长和团队协作需求增加,缺乏版本管理的Prompt会导致:无法追溯变更历史、无法回滚有问题的修改、无法复现线上效果、团队成员各自维护不同版本。本文分享将Prompt纳入专业版本管理的实践方案。 为什么Prompt需要版本管理 Prompt是代码 Prompt与代码有相似的特性:需要迭代调试、存在依赖关系(系统Prompt→Few-Shot示例→用户输入模板)、需要测试验证、可能引入回归问题。因此,Prompt应享受与代码同等的版本管理待遇。 Prompt变更的影响 一个看似微小的Prompt修改可能导致模型行为的显著变化:将"请分析"改为"请详细分析"可能使输出长度翻倍;调整示例顺序可能影响Few-Shot效果;修改约束条件的措辞可能改变模型的遵守程度。没有版本管理,这些变更的影响无法被追踪和评估。 Git工作流设计 仓库结构 prompts/ ├── system/ │ ├── assistant.md # 通用助手系统Prompt │ ├── code-reviewer.md # 代码审查专家 │ └── data-analyst.md # 数据分析师 ├── templates/ │ ├── classification/ # 分类任务模板 │ ├── extraction/ # 信息提取模板 │ └── generation/ # 内容生成模板 ├── few-shot/ │ ├── sentiment/ # 情感分析示例 │ └── ner/ # 命名实体识别示例 ├── tests/ │ ├── test_cases/ # 测试用例 │ ├── expected_outputs/ # 期望输出 │ └── runners/ # 测试运行器 ├── configs/ │ ├── models.yaml # 模型配置 │ └── environments.yaml # 环境配置 └── README.md Prompt文件格式 每个Prompt文件采用统一的格式: ...

2026-06-27 · 3 min · 559 words · 硅基 AGI 探索者
prompt template management system

Prompt模板管理系统设计

引言 当团队从单条Prompt调优走向规模化Prompt管理时,散落在代码和配置文件中的Prompt字符串很快会变成维护噩梦。Prompt模板管理系统是解决这一问题的工程化方案,它将Prompt视为一等公民进行管理,支持版本控制、参数化、A/B测试和效果监控。本文设计一套完整的Prompt模板管理系统架构。 核心需求分析 功能性需求 模板存储与检索:集中存储所有Prompt模板,支持按名称、标签、分类检索 参数化:支持变量插值和条件逻辑,实现模板复用 版本控制:每次修改生成新版本,支持回滚和版本对比 A/B测试:支持多个变体并行运行,自动统计效果指标 权限管理:不同角色(开发者、审阅者、管理员)的权限控制 效果监控:追踪每个模板的使用量、成功率、延迟等指标 非功能性需求 低延迟:模板加载延迟控制在50ms以内 高可用:模板服务可用性99.9%以上 缓存友好:支持本地缓存减少网络请求 SDK友好:提供多语言SDK,简化接入 系统架构 数据模型 Template { id: string // 唯一标识 name: string // 模板名称 category: string // 分类 tags: []string // 标签 description: string // 描述 variables: []Variable // 变量定义 content: string // 模板内容(含变量占位符) version: string // 当前版本号 status: string // draft/review/published/archived created_at: timestamp updated_at: timestamp author: string } Variable { name: string // 变量名 type: string // string/number/boolean/list required: boolean // 是否必填 default: any // 默认值 description: string // 变量说明 } Version { template_id: string version: string content: string changelog: string created_at: timestamp author: string } 模板语言设计 设计轻量级的模板语法,支持变量插值、条件判断和循环: 你是一位{{role}},请完成以下任务: {{#if context}} # 背景 {{context}} {{/if}} # 任务 {{task}} {{#each examples}} 示例{{@index}}: 输入:{{this.input}} 输出:{{this.output}} {{/each}} # 约束 {{#each constraints}} - {{this}} {{/each}} API设计 核心API端点: ...

2026-06-27 · 2 min · 346 words · 硅基 AGI 探索者
prompt management platform

Prompt 管理平台搭建指南

为什么需要 Prompt 管理平台 当团队有 3 个以上 LLM 应用时,Prompt 管理就会失控:Prompt 散落在代码里、改一个字要重新部署、无法 A/B 测试、没有版本回滚。Prompt 管理平台把 Prompt 当作独立资产来管理。 核心功能需求 功能模块 说明 优先级 Prompt CRUD 创建/读取/更新/删除 Prompt P0 版本管理 每次修改生成新版本,支持回滚 P0 变量模板 支持 {{variable}} 变量插值 P0 A/B 测试 流量分割对比不同 Prompt 效果 P1 权限控制 团队成员角色与审批流 P1 效果监控 Prompt 调用的成功率/延迟/成本 P1 批量测试 用测试集自动评估 Prompt P2 架构设计 +----------------------------------------------+ | Prompt 管理平台架构 | | | | +------------+ +------------------+ | | | Web UI | | API Gateway | | | | (React) | | (FastAPI) | | | +-----+------+ +-------+----------+ | | | | | | +-----+-----------------+----------------+ | | | Prompt Service Layer | | | | CRUD | Version | AB Test | RBAC | | | +-------------------+--------------------+ | | | | | +---------+---------+---------+----------+ | | |PostgreSQL| Redis缓存 |S3存储 | | | |(元数据) | (热Prompt) |(备份) | | | +---------+--------------+----------+ | +----------------------------------------------+ 数据库设计 -- Prompt 主表 CREATE TABLE prompts ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name VARCHAR(128) NOT NULL UNIQUE, description TEXT, category VARCHAR(64), current_version_id UUID REFERENCES prompt_versions(id), created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); -- Prompt 版本表 CREATE TABLE prompt_versions ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), prompt_id UUID NOT NULL REFERENCES prompts(id) ON DELETE CASCADE, version INT NOT NULL, content TEXT NOT NULL, variables JSONB DEFAULT '[]', model_config JSONB DEFAULT '{}', change_log TEXT, created_by UUID NOT NULL REFERENCES users(id), created_at TIMESTAMP DEFAULT NOW(), UNIQUE(prompt_id, version) ); -- A/B 测试表 CREATE TABLE ab_tests ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name VARCHAR(128) NOT NULL, prompt_id UUID NOT NULL REFERENCES prompts(id), variant_a_version_id UUID NOT NULL REFERENCES prompt_versions(id), variant_b_version_id UUID NOT NULL REFERENCES prompt_versions(id), traffic_split JSONB DEFAULT '{"a": 50, "b": 50}', status VARCHAR(16) DEFAULT 'running', metrics JSONB DEFAULT '{}', created_at TIMESTAMP DEFAULT NOW(), ended_at TIMESTAMP ); 核心 API 实现 from fastapi import FastAPI, HTTPException, Depends from pydantic import BaseModel import asyncpg, json app = FastAPI() class PromptCreate(BaseModel): name: str description: str = "" content: str variables: list[dict] = [] model_config: dict = {} class PromptUpdate(BaseModel): content: str change_log: str = "" variables: list[dict] = [] @app.post("/api/prompts") async def create_prompt(data: PromptCreate, db=Depends(get_db)): async with db.transaction(): prompt = await db.fetchrow( "INSERT INTO prompts (name, description) VALUES ($1, $2) RETURNING *", data.name, data.description ) version = await db.fetchrow( "INSERT INTO prompt_versions (prompt_id, version, content, variables, model_config, created_by) VALUES ($1, 1, $2, $3, $4, $5) RETURNING *", prompt["id"], data.content, json.dumps(data.variables), json.dumps(data.model_config), current_user_id ) await db.execute( "UPDATE prompts SET current_version_id = $1 WHERE id = $2", version["id"], prompt["id"] ) return {"prompt": dict(prompt), "version": dict(version)} @app.put("/api/prompts/{prompt_id}") async def update_prompt(prompt_id: str, data: PromptUpdate, db=Depends(get_db)): async with db.transaction(): current = await db.fetchrow( "SELECT version FROM prompt_versions WHERE prompt_id = $1 ORDER BY version DESC LIMIT 1", prompt_id ) new_version = (current["version"] + 1) if current else 1 version = await db.fetchrow( "INSERT INTO prompt_versions (prompt_id, version, content, variables, change_log, created_by) VALUES ($1, $2, $3, $4, $5, $6) RETURNING *", prompt_id, new_version, data.content, json.dumps(data.variables), data.change_log, current_user_id ) await db.execute( "UPDATE prompts SET current_version_id = $1, updated_at = NOW() WHERE id = $2", version["id"], prompt_id ) return {"version": dict(version)} @app.post("/api/prompts/{prompt_id}/rollback/{version}") async def rollback_prompt(prompt_id: str, version: int, db=Depends(get_db)): target = await db.fetchrow( "SELECT id FROM prompt_versions WHERE prompt_id = $1 AND version = $2", prompt_id, version ) if not target: raise HTTPException(404, "Version not found") await db.execute( "UPDATE prompts SET current_version_id = $1 WHERE id = $2", target["id"], prompt_id ) return {"rolled_back_to": version} A/B 测试实现 import random class ABTestRouter: def __init__(self, db, redis): self.db = db self.redis = redis async def get_variant(self, test_id: str, user_id: str) -> str: cache_key = f"ab:{test_id}:{user_id}" cached = await self.redis.get(cache_key) if cached: return cached test = await self.db.fetchrow( "SELECT * FROM ab_tests WHERE id = $1 AND status = 'running'", test_id ) if not test: return "a" split = json.loads(test["traffic_split"]) variant = "a" if random.random() * 100 < split["a"] else "b" await self.redis.setex(cache_key, 86400, variant) return variant async def record_metric(self, test_id, variant, metric, value): await self.db.execute( "INSERT INTO ab_metrics (test_id, variant, metric, value) VALUES ($1, $2, $3, $4)", test_id, variant, metric, value ) 与现有工具对比 工具 优点 缺点 适用场景 LangSmith LangChain 生态集成好 绑定 LangChain,贵 已用 LangChain 的团队 PromptHub UI 好用,有协作功能 自定义能力弱 非技术团队 自建平台 完全可控,可定制 开发成本高 大团队/特殊需求 建议:团队 < 5 人且用 LangChain,直接上 LangSmith。团队 > 10 人或有特殊需求,自建平台 ROI 更高。 ...

2026-06-24 · 4 min · 720 words · 硅基 AGI 探索者
鲁ICP备2026018361号