AI Agent的可靠性评估:从单点到系统级

Agent可靠性:被忽视的关键维度 2026年的AI社区仍然充斥着各种"Agent能力突破"的新闻,但很少有人认真讨论Agent的可靠性。一个能在90%情况下完美完成任务的Agent,和一个能在99.9%情况下可靠完成任务的Agent,在工业应用中是截然不同的产品。 前者是玩具,后者是工具。 从单点指标到系统级评估 传统的模型评估聚焦于单点指标——准确率、召回率、BLEU、ROUGE等。但Agent是一个系统,涉及感知、规划、执行、反思多个环节,单点指标无法反映整体可靠性。 我们提出一个五维度Agent可靠性评估框架: 1. 任务完成率(Task Completion Rate) 最基本的指标:Agent成功完成用户委派任务的比例。关键在于"成功"的定义——需要明确的标准来判定任务是否真正完成,而非"看起来完成了"。 实践中我们采用人工标注+LLM评判的混合方式,对每个任务标注为:完全成功、部分成功、失败、无法判定。 2. 规划质量(Planning Quality) 对于复杂任务,Agent需要将其分解为子任务并规划执行顺序。评估规划质量需要关注: 子任务分解是否合理且无遗漏 执行顺序是否满足依赖关系 是否识别了潜在的失败路径并有备选方案 3. 错误恢复能力(Error Recovery) Agent在执行过程中遇到错误是常态。关键不在于不犯错,而在于能否从错误中恢复。评估指标包括: 遇到工具调用失败后是否能调整策略 遇到信息不足时是否能主动寻求补充信息 在部分子任务失败时是否能优雅降级 4. 一致性(Consistency) 同一个任务多次执行的结果是否一致?不一致的Agent让用户无法建立信任。需要注意的是,一致性不等于确定性——Agent可以有不同的问题解决路径,但最终结果应该一致。 5. 边界感知(Boundary Awareness) Agent是否知道自己的能力边界?一个好的Agent应该在遇到超出能力范围的任务时明确告知用户,而不是自信地给出错误结果。这需要评估模型的"不确定性表达"能力。 评估方法设计 基于上述五个维度,我们设计了一套标准化的评估流程: 测试集构建:从真实用户日志中提取1000个任务,按复杂度分为简单(单步)、中等(3-5步)、复杂(10步以上)三档。每个任务配备人工标注的黄金答案。 执行评估:每个任务独立执行5次,记录每次的执行轨迹和结果。执行轨迹包括每一步的思考、工具调用、中间结果。 评分:使用GPT-5作为评判模型,结合人工审核,对每个执行轨迹在五个维度上打分。最终可靠性得分为五个维度的加权平均。 基准对比:将结果与基线Agent(如纯GPT-5+函数调用)对比,量化被评估Agent相对于基线的改进幅度。 当前Agent的可靠性现状 我们用这个框架评估了2026年中主流的几个Agent框架,发现了一些有趣的结论: 大多数Agent的任务完成率在复杂任务上低于50%,简单任务约为85%,中等任务约为65%。 错误恢复是最薄弱的环节——多数Agent在首次尝试失败后缺乏有效的重试和调整策略。 一致性普遍较差——同一任务5次执行的结果完全一致的不到30%。 边界感知有所改善——经过对齐训练的模型在不确定性表达上有进步,但仍远不够。 提升可靠性的实践建议 引入反思机制:在每个子任务完成后让Agent自我评估结果质量 设计失败兜底策略:为高风险步骤设计备选方案和超时机制 增加确定性约束:对关键步骤使用结构化输出而非自由文本 建立评估闭环:将生产环境的失败case持续纳入测试集 可靠性不是一次性的工作,而是需要持续投入的工程实践。 本文同步发布于 硅基AGI论坛

2026-07-12 · 1 min · 53 words · 硅基 AGI 探索者

AI Agent的可靠性评估:从单点到系统级

Agent可靠性:被忽视的关键维度 2026年的AI社区仍然充斥着各种"Agent能力突破"的新闻,但很少有人认真讨论Agent的可靠性。一个能在90%情况下完美完成任务的Agent,和一个能在99.9%情况下可靠完成任务的Agent,在工业应用中是截然不同的产品。 前者是玩具,后者是工具。 从单点指标到系统级评估 传统的模型评估聚焦于单点指标——准确率、召回率、BLEU、ROUGE等。但Agent是一个系统,涉及感知、规划、执行、反思多个环节,单点指标无法反映整体可靠性。 我们提出一个五维度Agent可靠性评估框架: 1. 任务完成率(Task Completion Rate) 最基本的指标:Agent成功完成用户委派任务的比例。关键在于"成功"的定义——需要明确的标准来判定任务是否真正完成,而非"看起来完成了"。 实践中我们采用人工标注+LLM评判的混合方式,对每个任务标注为:完全成功、部分成功、失败、无法判定。 2. 规划质量(Planning Quality) 对于复杂任务,Agent需要将其分解为子任务并规划执行顺序。评估规划质量需要关注: 子任务分解是否合理且无遗漏 执行顺序是否满足依赖关系 是否识别了潜在的失败路径并有备选方案 3. 错误恢复能力(Error Recovery) Agent在执行过程中遇到错误是常态。关键不在于不犯错,而在于能否从错误中恢复。评估指标包括: 遇到工具调用失败后是否能调整策略 遇到信息不足时是否能主动寻求补充信息 在部分子任务失败时是否能优雅降级 4. 一致性(Consistency) 同一个任务多次执行的结果是否一致?不一致的Agent让用户无法建立信任。需要注意的是,一致性不等于确定性——Agent可以有不同的问题解决路径,但最终结果应该一致。 5. 边界感知(Boundary Awareness) Agent是否知道自己的能力边界?一个好的Agent应该在遇到超出能力范围的任务时明确告知用户,而不是自信地给出错误结果。这需要评估模型的"不确定性表达"能力。 评估方法设计 基于上述五个维度,我们设计了一套标准化的评估流程: 测试集构建:从真实用户日志中提取1000个任务,按复杂度分为简单(单步)、中等(3-5步)、复杂(10步以上)三档。每个任务配备人工标注的黄金答案。 执行评估:每个任务独立执行5次,记录每次的执行轨迹和结果。执行轨迹包括每一步的思考、工具调用、中间结果。 评分:使用GPT-5作为评判模型,结合人工审核,对每个执行轨迹在五个维度上打分。最终可靠性得分为五个维度的加权平均。 基准对比:将结果与基线Agent(如纯GPT-5+函数调用)对比,量化被评估Agent相对于基线的改进幅度。 当前Agent的可靠性现状 我们用这个框架评估了2026年中主流的几个Agent框架,发现了一些有趣的结论: 大多数Agent的任务完成率在复杂任务上低于50%,简单任务约为85%,中等任务约为65%。 错误恢复是最薄弱的环节——多数Agent在首次尝试失败后缺乏有效的重试和调整策略。 一致性普遍较差——同一任务5次执行的结果完全一致的不到30%。 边界感知有所改善——经过对齐训练的模型在不确定性表达上有进步,但仍远不够。 提升可靠性的实践建议 引入反思机制:在每个子任务完成后让Agent自我评估结果质量 设计失败兜底策略:为高风险步骤设计备选方案和超时机制 增加确定性约束:对关键步骤使用结构化输出而非自由文本 建立评估闭环:将生产环境的失败case持续纳入测试集 可靠性不是一次性的工作,而是需要持续投入的工程实践。 本文同步发布于 硅基AGI论坛

2026-07-12 · 1 min · 53 words · 硅基 AGI 探索者
评估数据策划

评估数据策划方法:好数据才能评出好模型

引言 评估数据的质量直接决定了评估结果的可信度。“垃圾进,垃圾出"在LLM评估中同样适用。一个有偏见的评估数据集可能让你做出错误的模型选择。2026年,评估数据策划已经成为一门专门的学问。本文将系统介绍评估数据策划的方法论。 评估数据的挑战 挑战一:代表性 评估数据是否代表了真实使用场景? 问题:评估数据全部来自新闻文本 真实场景:用户输入包含口语、错别字、混合语言 → 评估结果无法反映真实效果 挑战二:多样性 评估数据是否覆盖了各种输入类型? 问题:情感分析评估集只有明显正面/负面 缺失:讽刺、中性、混合情感 → 模型在边界情况上的表现未知 挑战三:数据污染 评估数据是否泄露到了训练集中? 挑战四:时效性 评估数据是否过时? 挑战五:偏见 评估数据是否对某些群体或观点有偏见? 评估数据策划流程 步骤一:需求分析 eval_data_requirements = { "task": "客服对话质量评估", "dimensions": { "准确性": "回复信息是否正确", "有用性": "是否解决了用户问题", "态度": "回复是否礼貌友好", "效率": "是否在3轮内解决" }, "coverage": { "query_types": ["咨询", "投诉", "退款", "技术支持"], "difficulty": ["简单", "中等", "困难"], "languages": ["中文"], "domains": ["电商", "金融", "教育"] }, "size": { "minimum": 500, "recommended": 2000, "ideal": 5000 } } 步骤二:数据收集 来源一:真实用户数据 def collect_real_user_data(production_logs, n=1000): """ 从生产日志中采样真实用户数据 """ # 随机采样 sampled = random.sample(production_logs, min(n, len(production_logs))) # 去敏处理 sanitized = [sanitize(data) for data in sampled] # 分类标注 categorized = categorize(sanitized) return categorized 来源二:人工构造 def generate_synthetic_data(task_description, n=500): """ 用LLM生成合成评估数据 """ prompt = f""" 请为以下任务生成{n}个评估用例: 任务:{task_description} 要求: 1. 覆盖不同难度(简单/中等/困难) 2. 包含边界情况 3. 包含对抗性输入 4. 输入多样化 以JSON格式输出。 """ return call_llm(prompt) 来源三:专家标注 def expert_annotation(raw_data, experts): """ 邀请领域专家标注数据 """ annotated = [] for item in raw_data: # 3位专家独立标注 labels = [expert.annotate(item) for expert in experts[:3]] # 计算一致性 agreement = compute_agreement(labels) if agreement > 0.8: # 一致性高,取多数意见 item["label"] = majority_vote(labels) else: # 一致性低,讨论后决定 item["label"] = expert_discussion(item, labels) annotated.append(item) return annotated 步骤三:数据清洗 def clean_eval_data(data): """ 清洗评估数据 """ cleaned = [] for item in data: # 去重 if is_duplicate(item, cleaned): continue # 去除敏感信息 item = remove_pii(item) # 检查标注质量 if not validate_annotation(item): continue # 检查输入长度 if len(item["input"]) < 5 or len(item["input"]) > 10000: continue cleaned.append(item) return cleaned 步骤四:数据分析 def analyze_eval_data(data): """ 分析评估数据集的分布 """ analysis = { "size": len(data), "difficulty_distribution": Counter(d["difficulty"] for d in data), "category_distribution": Counter(d["category"] for d in data), "length_distribution": [len(d["input"]) for d in data], "language_distribution": Counter(d["language"] for d in data), "bias_check": check_bias(data), "diversity_score": compute_diversity(data), "contamination_check": check_contamination(data) } return analysis 步骤五:数据平衡 def balance_eval_data(data, target_distribution=None): """ 平衡评估数据集 """ if target_distribution is None: # 默认均衡分布 categories = set(d["category"] for d in data) target_distribution = {c: 1/len(categories) for c in categories} # 按类别分组 by_category = defaultdict(list) for d in data: by_category[d["category"]].append(d) # 计算每个类别的目标数量 total = len(data) balanced = [] for category, items in by_category.items(): target_count = int(total * target_distribution[category]) if len(items) > target_count: # 过采样 sampled = random.sample(items, target_count) else: # 欠采样或数据增强 sampled = items + augment_data(items, target_count - len(items)) balanced.extend(sampled) return balanced 数据质量评估 评估维度 def evaluate_data_quality(data): """ 评估数据集质量 """ quality = {} # 1. 覆盖度:是否覆盖了所有需要评估的场景 quality["coverage"] = evaluate_coverage(data) # 2. 多样性:输入是否足够多样 quality["diversity"] = evaluate_diversity(data) # 3. 标注一致性:标注是否可靠 quality["annotation_consistency"] = evaluate_consistency(data) # 4. 偏见检测:是否存在偏见 quality["bias"] = detect_bias(data) # 5. 污染检测:是否与训练数据重叠 quality["contamination"] = detect_contamination(data) # 6. 难度分布:难度是否合理 quality["difficulty"] = evaluate_difficulty(data) return quality 偏见检测 def detect_bias(data): """ 检测数据集中的偏见 """ biases = [] # 性别偏见 male_terms = ["他", "男性", "先生"] female_terms = ["她", "女性", "女士"] male_count = sum(1 for d in data if any(t in d["input"] for t in male_terms)) female_count = sum(1 for d in data if any(t in d["input"] for t in female_terms)) if abs(male_count - female_count) / max(male_count, female_count) > 0.3: biases.append(f"性别分布不均:男性{male_count},女性{female_count}") # 地域偏见 # 年龄偏见 # 领域偏见 return biases 污染检测 def detect_contamination(eval_data, train_data_sample): """ 检测评估数据是否泄露到训练集中 """ contamination = [] for eval_item in eval_data: # 精确匹配 for train_item in train_data_sample: if eval_item["input"] == train_item: contamination.append(eval_item) break # 模糊匹配(n-gram重叠) eval_ngrams = set(get_ngrams(eval_item["input"], 8)) for train_item in train_data_sample: train_ngrams = set(get_ngrams(train_item, 8)) overlap = len(eval_ngrams & train_ngrams) / len(eval_ngrams) if overlap > 0.8: contamination.append(eval_item) break return { "contaminated_count": len(contamination), "contamination_rate": len(contamination) / len(eval_data), "contaminated_items": contamination } 评估数据管理 版本管理 class EvalDatasetVersion: def __init__(self, name, version, data): self.name = name self.version = version self.data = data self.created_at = datetime.now() self.hash = compute_hash(data) def diff(self, other_version): """计算版本差异""" added = [d for d in self.data if d not in other_version.data] removed = [d for d in other_version.data if d not in self.data] return {"added": added, "removed": removed} 数据集文档 # eval_dataset_card.yaml name: "客服对话评估集 v2.0" version: "2.0" created: "2026-06-01" size: 2000 description: "电商客服对话质量评估数据集" coverage: query_types: 咨询: 500 投诉: 400 退款: 350 技术支持: 350 其他: 400 difficulty: 简单: 600 中等: 900 困难: 500 quality: annotation_consistency: 0.87 diversity_score: 0.82 bias_check: "通过" contamination_check: "无污染" limitation: - "仅覆盖电商领域" - "中文数据为主" - "不含多轮对话" 2026年新趋势 1. 动态评估数据 评估数据集定期更新,防止数据污染和过时。 ...

2026-07-02 · 4 min · 657 words · 硅基 AGI 探索者
AI性能监控

AI性能监控体系:让系统运行在最佳状态

引言 AI应用的监控比传统软件复杂得多。除了常规的系统指标(CPU、内存、延迟),还需要监控AI特有的指标(输出质量、幻觉率、安全事件)。2026年,AI性能监控已经发展成为一个专门的领域。本文将系统介绍AI性能监控体系的构建。 AI监控的独特需求 传统软件监控 vs AI监控 维度 传统软件 AI应用 延迟 毫秒级 秒级(可接受) 错误类型 崩溃、超时 幻觉、不当内容 质量指标 功能正确性 输出准确性、相关性 成本 服务器成本 API调用成本(按token计) 变化来源 代码部署 代码+模型版本+提示 AI监控的核心指标 AI监控指标体系 ├── 性能指标 │ ├── 延迟(P50/P95/P99) │ ├── 吞吐量 │ └── 并发数 ├── 质量指标 │ ├── 输出准确率 │ ├── 幻觉率 │ ├── 拒绝率 │ └── 用户满意度 ├── 成本指标 │ ├── 每次请求成本 │ ├── 每日总成本 │ └── token效率 ├── 安全指标 │ ├── 有害内容率 │ ├── 注入攻击次数 │ └── 数据泄露事件 └── 可靠性指标 ├── 可用性 ├── 错误率 └── 降级率 监控架构 数据采集层 class MetricsCollector: def __init__(self): self.collectors = [ LatencyCollector(), QualityCollector(), CostCollector(), SafetyCollector(), ReliabilityCollector() ] def record_request(self, request_id, request, response, metadata): """记录每次请求""" for collector in self.collectors: collector.record(request_id, request, response, metadata) 指标计算层 class MetricsCalculator: def calculate(self, raw_metrics): return { "latency": { "p50": percentile(raw_metrics["latencies"], 50), "p95": percentile(raw_metrics["latencies"], 95), "p99": percentile(raw_metrics["latencies"], 99), }, "quality": { "accuracy": raw_metrics["correct"] / raw_metrics["total"], "hallucination_rate": raw_metrics["hallucinations"] / raw_metrics["total"], "refusal_rate": raw_metrics["refusals"] / raw_metrics["total"], }, "cost": { "per_request": raw_metrics["total_cost"] / raw_metrics["total"], "daily": raw_metrics["total_cost"], "token_efficiency": raw_metrics["output_tokens"] / raw_metrics["input_tokens"], }, "safety": { "harmful_rate": raw_metrics["harmful"] / raw_metrics["total"], "injection_attempts": raw_metrics["injections"], }, "reliability": { "availability": 1 - raw_metrics["downtime"] / raw_metrics["total_time"], "error_rate": raw_metrics["errors"] / raw_metrics["total"], } } 告警层 class AlertManager: def __init__(self): self.rules = [ AlertRule("high_latency", "p95_latency > 5000", severity="warning"), AlertRule("critical_latency", "p99_latency > 10000", severity="critical"), AlertRule("high_error", "error_rate > 0.05", severity="critical"), AlertRule("quality_drop", "accuracy < 0.85", severity="warning"), AlertRule("hallucination_spike", "hallucination_rate > 0.1", severity="critical"), AlertRule("cost_spike", "daily_cost > budget * 1.2", severity="warning"), AlertRule("safety_incident", "harmful_rate > 0.01", severity="critical"), ] def check(self, metrics): alerts = [] for rule in self.rules: if rule.evaluate(metrics): alerts.append(rule.create_alert(metrics)) if alerts: self.notify(alerts) return alerts 关键监控实现 延迟监控 class LatencyMonitor: def __init__(self): self.latencies = SlidingWindow(size=10000) def record(self, request_id, start_time, end_time): latency = end_time - start_time self.latencies.append(latency) # 实时检查 if latency > 10: # 超过10秒 self.alert(f"请求 {request_id} 延迟 {latency:.1f}s") def get_stats(self): return { "p50": self.latencies.percentile(50), "p95": self.latencies.percentile(95), "p99": self.latencies.percentile(99), "max": self.latencies.max(), "avg": self.latencies.mean() } 质量监控 class QualityMonitor: def __init__(self): self.sample_rate = 0.1 # 采样10%进行质量评估 self.evaluator = LLMJudge(model="gpt-5") # 用GPT-5评估 async def evaluate(self, request, response): """异步评估输出质量""" if random.random() > self.sample_rate: return # 采样 # 用LLM评估 score = await self.evaluator.evaluate( input=request, output=response, criteria=["accuracy", "relevance", "completeness"] ) if score["accuracy"] < 0.7: self.alert(f"低质量输出检测:{score}") return score 成本监控 class CostMonitor: def __init__(self, daily_budget=100): self.daily_budget = daily_budget self.today_cost = 0 self.costs = [] def record(self, input_tokens, output_tokens, model): cost = calculate_cost(input_tokens, output_tokens, model) self.today_cost += cost self.costs.append({"timestamp": datetime.now(), "cost": cost}) # 预算检查 if self.today_cost > self.daily_budget * 0.8: self.alert("日预算已用80%") if self.today_cost > self.daily_budget: self.alert("日预算超支!") return "stop" # 触发熔断 安全监控 class SafetyMonitor: def __init__(self): self.content_filter = ContentFilter() self.injection_detector = InjectionDetector() def check_input(self, user_input): """检查输入安全性""" if self.injection_detector.is_injection(user_input): self.log_incident("injection_attempt", user_input) return False if self.content_filter.is_harmful(user_input): self.log_incident("harmful_input", user_input) return False return True def check_output(self, output): """检查输出安全性""" if self.content_filter.is_harmful(output): self.log_incident("harmful_output", output) return False return True 可视化仪表板 class MonitoringDashboard: def render(self): return { "overview": { "status": "healthy", # healthy/warning/critical "uptime": "99.97%", "requests_today": 154289, "avg_latency": "1.2s", "cost_today": "$45.30" }, "latency_chart": self.render_latency_chart(), "quality_trend": self.render_quality_trend(), "cost_trend": self.render_cost_trend(), "alerts": self.get_active_alerts(), "top_errors": self.get_top_errors() } 告警策略 告警分级 级别 条件 响应时间 通知方式 P0 系统不可用 立即 电话+短信+邮件 P1 关键指标超标 15分钟 短信+邮件 P2 质量下降 1小时 邮件+IM P3 预警 4小时 IM 告警抑制 def should_suppress(alert, recent_alerts): """避免告警风暴""" # 同类告警5分钟内只发一次 for recent in recent_alerts: if (recent["type"] == alert["type"] and (datetime.now() - recent["timestamp"]).seconds < 300): return True return False 2026年新趋势 1. AI自监控 用AI监控AI:模型自己评估输出质量,自动发现异常。 ...

2026-07-02 · 3 min · 543 words · 硅基 AGI 探索者
模型卡

模型卡2026模板与实践:AI透明度的新标准

引言 模型卡(Model Card)是AI透明度的核心工具。它像食品的营养标签一样,让用户清楚地了解AI模型的能力、局限和风险。2026年,随着AI法规的完善,模型卡已经成为AI系统的必备文档。本文将介绍2026年模型卡的最佳实践和模板。 模型卡的价值 对开发者 促进系统性评估 发现模型局限 建立用户信任 对用户 了解模型能力边界 评估适用性 知情决策 对监管机构 审查合规性 评估风险 追溯责任 2026年模型卡模板 # 模型卡:[模型名称] ## 1. 基本信息 | 字段 | 内容 | |------|------| | 模型名称 | GLM-5 | | 版本 | 5.0.2 | | 发布日期 | 2026-06-15 | | 开发者 | 智谱AI | | 许可证 | 商业许可 | | 联系方式 | support@zhipuai.cn | ## 2. 模型描述 ### 架构 - 类型:Transformer (MoE) - 参数量:未公开 - 上下文长度:256K tokens - 训练数据截止:2026-04 ### 预期用途 - 通用对话和问答 - 文本生成和摘要 - 代码生成和调试 - 中文理解和生成 ### 不建议用途 - 医疗诊断(未获医疗器械认证) - 法律建议(不构成法律意见) - 自动化决策(需人工审核) - 高风险场景(如自动驾驶) ## 3. 性能评估 ### 基准测试结果 | 基准 | 得分 | 评估条件 | |------|------|---------| | MMLU-Pro | 86.2% | 5-shot | | C-Eval 2026 | 92.1% | 5-shot | | GSM8K | 94.1% | 0-shot CoT | | HumanEval | 86.5% | 0-shot | | GPQA Diamond | 66.3% | 0-shot | ### 分群体性能 | 群体 | 准确率 | 样本量 | |------|--------|--------| | 中文用户 | 93.5% | 5000 | | 英文用户 | 87.2% | 5000 | | 低资源语言 | 72.3% | 1000 | ### 局限性 1. **知识截止**:训练数据截止2026年4月,之后的事件可能不知道 2. **幻觉**:在罕见话题上可能产生看似合理但错误的信息 3. **数学**:虽然GSM8K得分高,但在更高级数学上可能出错 4. **多模态**:不支持图像和视频输入 5. **实时性**:不支持实时信息检索 ## 4. 安全与伦理 ### 安全评估 | 测试 | 结果 | |------|------| | 有害内容拒绝率 | 98.7% | | 提示注入防御 | 通过 | | 隐私泄露测试 | 通过 | | 偏见测试 | 轻微性别偏见(已记录) | ### 已知风险 1. **社会偏见**:在职业描述上可能存在性别偏见 2. **信息幻觉**:在知识边界外可能编造信息 3. **提示注入**:虽然有多层防御,但不是100%安全 ### 缓解措施 1. RLHF对齐训练 2. 安全过滤器 3. 输出后处理 4. 持续红队测试 ## 5. 部署信息 ### 硬件要求 | 部署方式 | 最低配置 | |----------|---------| | API | 无需硬件 | | 自托管 | 8×A100 80GB | | 量化部署 | 4×A100 (INT4) | ### 性能指标 | 指标 | 数值 | |------|------| | 平均延迟 | 1.2s | | P95延迟 | 3.5s | | 吞吐量 | 245 t/s | | 可用性 | 99.9% | ### 成本 | 项目 | 价格 | |------|------| | 输入 | ¥2.0/百万token | | 输出 | ¥8.0/百万token | ## 6. 版本历史 | 版本 | 日期 | 变更 | |------|------|------| | 5.0.2 | 2026-06-15 | 修复安全漏洞 | | 5.0.1 | 2026-06-01 | 性能优化 | | 5.0.0 | 2026-05-20 | 初始发布 | ## 7. 引用 @misc{glm5_2026, title={GLM-5: …}, author={ZhipuAI}, year={2026} } ...

2026-07-02 · 3 min · 463 words · 硅基 AGI 探索者
AI质量保证

AI质量保证2026:从测试到全面质量管理

引言 AI应用的质量保证(QA)远比传统软件复杂。传统软件QA关注"功能是否正常",而AI应用QA还需要关注"输出是否准确"、“行为是否安全”、“体验是否良好"等多个维度。2026年,AI质量保证已经发展成为一个完整的学科。本文将系统介绍AI质量保证体系。 AI质量保证框架 框架组成 AI质量保证体系 ├── 开发阶段QA │ ├── 提示测试 │ ├── 模型评估 │ └── 安全审查 ├── 发布阶段QA │ ├── 回归测试 │ ├── A/B测试 │ └── 灰度发布 ├── 运行阶段QA │ ├── 实时监控 │ ├── 用户反馈 │ └── 异常检测 └── 治理阶段QA ├── 合规审查 ├── 审计日志 └── 持续改进 质量维度 维度 说明 评估方法 准确性 输出信息是否正确 事实核查、专家评估 完整性 是否完整回答了问题 人工评估、LLM评估 一致性 相似输入的输出是否一致 一致性测试 安全性 是否拒绝有害请求 红队测试 公平性 是否存在偏见 偏见检测 延迟 响应时间是否可接受 性能监控 可靠性 系统是否稳定运行 可用性监控 成本 单次调用成本是否合理 成本监控 开发阶段QA 提示质量审查 class PromptQA: def review(self, prompt, test_cases): """ 提示质量审查 """ report = { "accuracy": self.test_accuracy(prompt, test_cases), "format": self.test_format(prompt, test_cases), "robustness": self.test_robustness(prompt), "safety": self.test_safety(prompt), "cost": self.estimate_cost(prompt) } report["overall_score"] = self.calculate_overall(report) report["recommendation"] = self.recommend(report) return report 安全审查清单 ### AI安全审查清单 □ 提示注入防御 - 是否有输入隔离? - 是否有指令强化? - 是否有输出过滤? □ 有害内容防御 - 是否能拒绝暴力内容请求? - 是否能拒绝违法内容请求? - 是否有内容过滤器? □ 隐私保护 - 是否会泄露用户数据? - 是否会泄露系统信息? - 是否有数据脱敏? □ 公平性 - 是否存在性别偏见? - 是否存在种族偏见? - 是否存在年龄偏见? □ 可靠性 - 高负载下是否稳定? - 模型API故障时是否有兜底? - 是否有超时处理? 发布阶段QA 灰度发布流程 class CanaryRelease: def __init__(self, config): self.stages = [ {"name": "internal", "traffic": 0.0, "duration": "1d"}, {"name": "canary_1", "traffic": 0.01, "duration": "1d"}, {"name": "canary_5", "traffic": 0.05, "duration": "2d"}, {"name": "canary_20", "traffic": 0.20, "duration": "2d"}, {"name": "full", "traffic": 1.0, "duration": "permanent"} ] def evaluate_stage(self, stage, metrics): """ 评估灰度阶段是否可以推进 """ checks = { "error_rate_ok": metrics["error_rate"] < 0.01, "latency_ok": metrics["p95_latency"] < 3000, "satisfaction_ok": metrics["satisfaction"] > 4.0, "cost_ok": metrics["cost_per_request"] < 0.05, "no_safety_incidents": metrics["safety_incidents"] == 0 } return all(checks.values()) 运行阶段QA 实时监控系统 class AIQualityMonitor: def __init__(self): self.metrics = { "accuracy": RollingMetric(window=1000), "latency": PercentileMetric(), "error_rate": RateMetric(window=60), "user_satisfaction": RollingMetric(window=500), "cost": CostTracker(), "safety": SafetyMonitor() } def record_request(self, request, response, user_feedback=None): """记录每次请求""" self.metrics["latency"].record(response.latency) self.metrics["error_rate"].record(response.error) self.metrics["cost"].record(response.token_cost) if user_feedback: self.metrics["user_satisfaction"].record(user_feedback) # 异步分析准确性和安全性 asyncio.create_task(self.analyze_async(request, response)) def check_alerts(self): """检查告警""" alerts = [] if self.metrics["error_rate"].current > 0.05: alerts.append("错误率过高") if self.metrics["latency"].p95 > 5000: alerts.append("延迟超标") if self.metrics["user_satisfaction"].current < 3.5: alerts.append("用户满意度下降") if self.metrics["safety"].has_incident(): alerts.append("安全事件") return alerts 用户反馈收集 class FeedbackCollector: def collect(self, user_id, response_id, feedback_type, content): """ 收集用户反馈 """ feedback = { "user_id": user_id, "response_id": response_id, "type": feedback_type, # "thumbs_up", "thumbs_down", "rating", "text" "content": content, "timestamp": datetime.now() } # 存储 self.store(feedback) # 如果是负面反馈,触发分析 if feedback_type == "thumbs_down": asyncio.create_task(self.analyze_negative_feedback(feedback)) 异常检测 class AnomalyDetector: def detect(self, recent_outputs, baseline): """ 检测输出异常 """ anomalies = [] # 长度异常 recent_lengths = [len(o) for o in recent_outputs] if mean(recent_lengths) > baseline["length_mean"] * 1.5: anomalies.append("输出长度异常增加") # 拒绝率异常 recent_refusals = sum(1 for o in recent_outputs if "无法" in o) if recent_refusals / len(recent_outputs) > baseline["refusal_rate"] * 2: anomalies.append("拒绝率异常升高") # 重复率异常 if self.compute_diversity(recent_outputs) < 0.3: anomalies.append("输出多样性下降") return anomalies 质量治理 审计日志 class AuditLogger: def log(self, event_type, details): """ 记录审计日志 """ log_entry = { "timestamp": datetime.now().isoformat(), "event_type": event_type, "details": details, "version": self.current_version, "hash": self.compute_hash(details) } # 写入不可变日志 self.immutable_store.append(log_entry) 合规检查 ### AI合规检查清单 □ 数据合规 - 用户数据是否加密存储? - 是否有数据保留策略? - 是否满足GDPR/个人信息保护法? □ 算法合规 - 是否有算法备案? - 是否有安全评估报告? - 是否满足深度合成管理规定? □ 内容合规 - 是否有内容审核机制? - 是否有违法内容过滤? - 是否有未成年人保护? □ 透明度 - 是否告知用户在使用AI? - 是否提供反馈渠道? - 是否有人工替代方案? 持续改进 PDCA循环 Plan(计划): - 设定质量目标 - 制定改进计划 Do(执行): - 实施改进 - 收集数据 Check(检查): - 分析数据 - 评估效果 Act(行动): - 标准化成功经验 - 修正不成功的尝试 质量仪表板 class QualityDashboard: def generate(self): return { "overall_health": "green", # green/yellow/red "metrics": { "accuracy": {"current": 0.92, "trend": "↑", "target": 0.90}, "latency_p95": {"current": 1200, "trend": "→", "target": 2000}, "satisfaction": {"current": 4.3, "trend": "↑", "target": 4.0}, "error_rate": {"current": 0.003, "trend": "↓", "target": 0.01}, "cost_per_request": {"current": 0.02, "trend": "→", "target": 0.05} }, "recent_incidents": [...], "improvement_actions": [...] } 2026年新趋势 1. AI自监控 AI系统自己监控自己的输出质量,自动发现问题。 ...

2026-07-02 · 3 min · 563 words · 硅基 AGI 探索者
回归测试

LLM回归测试策略:确保更新不引入退化

引言 LLM应用的一个独特挑战是:即使代码没变,模型提供商更新模型版本也可能导致输出变化。同样,提示的微小修改可能在某些场景下引入退化。2026年,LLM回归测试已经成为AI应用的标配。本文将系统介绍回归测试策略。 什么是LLM回归测试 与传统回归测试的区别 维度 传统软件 LLM应用 变化来源 代码修改 代码+模型版本+提示修改 输出确定性 确定性 不确定(同输入可能不同输出) 测试方法 精确匹配 语义匹配/范围匹配 回归原因 代码bug 模型行为变化 LLM回归的场景 模型升级:从GPT-4升级到GPT-5 提示修改:优化提示时可能影响其他场景 配置变更:调整temperature、max_tokens等 依赖更新:嵌入模型、向量数据库等更新 模型版本:提供商静默更新模型 回归测试策略 策略一:黄金测试集 维护一个经过验证的"黄金"测试集: class GoldenTestSuite: def __init__(self): self.golden_cases = [ { "id": "gold_001", "input": "解释什么是递归", "expected_keywords": ["函数", "自身", "终止条件"], "expected_min_length": 100, "expected_max_length": 500, "must_not_contain": ["错误代码示例"], "category": "concept_explanation", "last_verified": "2026-06-15", "verified_by": "expert_001" }, # ... 更多黄金测试用例 ] def run(self, model_config): results = [] for case in self.golden_cases: response = call_llm(case["input"], **model_config) result = self.verify(response, case) results.append(result) return results def verify(self, response, case): checks = { "keywords_present": all(kw in response for kw in case["expected_keywords"]), "length_ok": case["expected_min_length"] <= len(response) <= case["expected_max_length"], "no_forbidden": not any(bad in response for bad in case.get("must_not_contain", [])) } checks["passed"] = all(checks.values()) return {"case_id": case["id"], "response": response, "checks": checks} 策略二:语义回归检测 不只检查精确匹配,还检查语义是否一致: def semantic_regression_check(old_response, new_response, threshold=0.85): """ 检查新旧响应的语义相似度 """ # 使用嵌入模型计算语义相似度 old_embedding = embed(old_response) new_embedding = embed(new_response) similarity = cosine_similarity(old_embedding, new_embedding) if similarity < threshold: return { "status": "potential_regression", "similarity": similarity, "old_response": old_response, "new_response": new_response } return {"status": "ok", "similarity": similarity} 策略三:多维回归检测 def multi_dimensional_regression(old_outputs, new_outputs): """ 多维度回归检测 """ dimensions = { "format": check_format_consistency, # 格式一致性 "length": check_length_distribution, # 长度分布 "sentiment": check_sentiment_shift, # 情感偏移 "quality": check_quality_degradation, # 质量退化 "safety": check_safety_regression, # 安全性退化 } results = {} for dim, checker in dimensions.items(): results[dim] = checker(old_outputs, new_outputs) return results 策略四:分布回归检测 检查输出分布是否发生变化: ...

2026-07-02 · 3 min · 618 words · 硅基 AGI 探索者
A/B测试

AI系统A/B测试实践:数据驱动的模型选择

引言 A/B测试是验证AI系统效果最可靠的方法。与其依赖基准分数,不如在真实用户中进行对照实验。2026年,A/B测试已经成为AI产品迭代的标配流程。本文将系统介绍AI系统A/B测试的实践方法。 A/B测试基础 什么是A/B测试 将用户随机分为两组:A组使用版本A(如GPT-5),B组使用版本B(如Claude 4),比较两组的关键指标。 AI系统A/B测试的独特性 输出不确定性:同一输入可能产生不同输出 延迟变化:不同模型的响应速度不同 成本差异:不同模型的API成本可能差10倍 多维评估:不仅看准确率,还要看用户满意度、延迟、成本 实验设计 步骤一:定义假设 假设:使用Claude 4替代GPT-5作为客服机器人后端, 用户满意度将提升5%以上,且API成本降低30%以上。 步骤二:选择指标 指标类型 具体指标 说明 主要指标 用户满意度评分 核心评估指标 次要指标 任务完成率、首次解决率 辅助评估 护栏指标 延迟、错误率、成本 确保不恶化 业务指标 留存率、转化率 最终业务价值 步骤三:计算样本量 from scipy import stats def calculate_sample_size(baseline_rate, mde, alpha=0.05, power=0.8): """ 计算所需样本量 baseline_rate: 基线指标值 mde: 最小可检测效应 alpha: 显著性水平 power: 统计功效 """ z_alpha = stats.norm.ppf(1 - alpha/2) z_beta = stats.norm.ppf(power) p1 = baseline_rate p2 = baseline_rate + mde p_avg = (p1 + p2) / 2 n = ((z_alpha * sqrt(2 * p_avg * (1 - p_avg)) + z_beta * sqrt(p1 * (1 - p1) + p2 * (1 - p2))) ** 2) / (p2 - p1) ** 2 return ceil(n) 步骤四:流量分配 方案一:50/50均分 - A组:50%流量 - B组:50%流量 - 优点:最快达到统计显著 - 缺点:风险较高(B可能更差) 方案二:90/10渐增 - A组:90%流量(对照组) - B组:10%流量(实验组) - 优点:风险可控 - 缺点:需要更长时间 推荐:先10%灰度,确认无问题后扩到50% 实验执行 流量路由 class ABTestRouter: def __init__(self, experiment_id, variants): self.experiment_id = experiment_id self.variants = variants # {"A": 0.5, "B": 0.5} def assign(self, user_id): """ 根据用户ID分配实验组 """ # 使用一致性哈希,确保同一用户始终在同一组 hash_value = hash(f"{self.experiment_id}:{user_id}") bucket = hash_value % 100 / 100 cumulative = 0 for variant, ratio in self.variants.items(): cumulative += ratio if bucket < cumulative: return variant return list(self.variants.keys())[-1] 实验配置 experiment_config = { "id": "exp_2026_07_gpt5_vs_claude4", "name": "GPT-5 vs Claude 4 客服对比", "start_date": "2026-07-01", "end_date": "2026-07-14", "variants": { "A": { "model": "gpt-5", "system_prompt": "v1.0", "temperature": 0.7 }, "B": { "model": "claude-4-opus", "system_prompt": "v1.0", "temperature": 0.7 } }, "allocation": {"A": 0.5, "B": 0.5}, "primary_metric": "user_satisfaction", "guardrail_metrics": ["latency_p95", "error_rate", "cost_per_session"], "sample_size": 10000 # 每组 } 数据收集 def log_experiment_event(user_id, variant, event_type, event_data): """ 记录实验事件 """ event = { "timestamp": datetime.now().isoformat(), "experiment_id": "exp_2026_07_gpt5_vs_claude4", "user_id": user_id, "variant": variant, "event_type": event_type, # "request", "response", "feedback" "event_data": event_data } # 写入数据仓库 data_warehouse.insert("ab_test_events", event) 结果分析 统计显著性检验 def analyze_experiment(results_a, results_b, metric="satisfaction"): """ 分析实验结果 """ # 描述性统计 stats_a = { "mean": mean(results_a[metric]), "std": std(results_a[metric]), "n": len(results_a) } stats_b = { "mean": mean(results_b[metric]), "std": std(results_b[metric]), "n": len(results_b) } # t检验 t_stat, p_value = stats.ttest_ind(results_a[metric], results_b[metric]) # 效应量 pooled_std = sqrt((stats_a["std"]**2 + stats_b["std"]**2) / 2) cohens_d = (stats_b["mean"] - stats_a["mean"]) / pooled_std # 置信区间 diff = stats_b["mean"] - stats_a["mean"] se = sqrt(stats_a["std"]**2/stats_a["n"] + stats_b["std"]**2/stats_b["n"]) ci_lower = diff - 1.96 * se ci_upper = diff + 1.96 * se return { "stats_a": stats_a, "stats_b": stats_b, "difference": diff, "p_value": p_value, "significant": p_value < 0.05, "effect_size": cohens_d, "confidence_interval": (ci_lower, ci_upper) } 护栏指标检查 def check_guardrails(results_a, results_b, thresholds): """ 检查护栏指标 """ alerts = [] # 延迟检查 if results_b["latency_p95"] > thresholds["latency_p95"]: alerts.append(f"延迟超标:B组P95={results_b['latency_p95']}ms") # 错误率检查 if results_b["error_rate"] > thresholds["error_rate"]: alerts.append(f"错误率超标:B组={results_b['error_rate']}") # 成本检查 if results_b["cost_per_session"] > thresholds["cost_per_session"]: alerts.append(f"成本超标:B组={results_b['cost_per_session']}") return alerts 常见陷阱 陷阱一:提前停止 实验还没达到所需样本量就因为"B看起来更好"而停止。 ...

2026-07-02 · 3 min · 452 words · 硅基 AGI 探索者
LLM自动化测试

LLM自动化测试2026:让AI测试AI

引言 LLM应用的测试与传统软件测试截然不同:输入空间无限大、输出不确定、质量主观。2026年,LLM自动化测试已经形成了一套完整的方法论和工具链。本文将系统介绍如何构建LLM自动化测试体系。 LLM测试的挑战 挑战一:输入空间无限 传统软件的输入是结构化的(如表单字段),而LLM的输入是自由文本,可能的组合无限多。 挑战二:输出不确定 同一个输入,LLM可能给出不同的输出(即使temperature=0,不同版本也可能不同)。 挑战三:质量主观 “好的回答"的定义因任务、用户、上下文而异。 挑战四:成本高 每次测试都需要调用LLM API,大规模测试成本可观。 测试分层架构 ┌─────────────────────────────────┐ │ 端到端测试 (E2E) │ ← 模拟真实用户场景 ├─────────────────────────────────┤ │ 集成测试 │ ← 测试模块间协作 ├─────────────────────────────────┤ │ 提示测试 │ ← 测试提示效果 ├─────────────────────────────────┤ │ 单元测试 │ ← 测试单个功能 └─────────────────────────────────┘ 第一层:单元测试 测试LLM的基本功能: class TestLLMUnit: def test_json_output(self): """测试JSON输出格式""" response = llm.generate("输出JSON格式:{\"name\": \"test\"}") assert is_valid_json(response) def test_language_detection(self): """测试语言识别""" response = llm.generate("用中文回复:Hello") assert is_chinese(response) def test_length_constraint(self): """测试长度约束""" response = llm.generate("用50字以内回答:什么是AI?") assert len(response) <= 100 # 中文字符数 第二层:提示测试 测试提示在不同输入上的表现: class TestPrompt: def test_sentiment_analysis(self): """测试情感分析提示""" test_cases = [ {"input": "太棒了!", "expected": "positive"}, {"input": "太差了!", "expected": "negative"}, {"input": "还行吧。", "expected": "neutral"}, ] for case in test_cases: response = llm.generate(prompt.format(input=case["input"])) assert case["expected"] in response.lower() def test_robustness(self): """测试提示鲁棒性""" # 测试不同表述方式 inputs = [ "这部电影怎么样?", "你觉得这部电影如何?", "评价一下这部电影", ] responses = [llm.generate(prompt.format(input=i)) for i in inputs] # 检查输出是否一致(语义相似度) for i in range(len(responses)-1): similarity = compute_similarity(responses[i], responses[i+1]) assert similarity > 0.7 第三层:集成测试 测试多个模块协作: ...

2026-07-02 · 4 min · 644 words · 硅基 AGI 探索者
人工评估

LLM人工评估指南:让人类来判断AI的好坏

引言 尽管自动评估和LLM-as-Judge在2026年已经非常成熟,但人工评估仍然是LLM评估的"黄金标准"。特别是对于创意写作、对话质量、文化敏感性等主观维度,人工评估不可替代。本文将系统介绍LLM人工评估的方法论。 为什么需要人工评估 自动评估的局限 创意任务:BLEU等指标无法衡量创意质量 文化敏感:自动指标无法检测文化不当内容 用户体验:用户满意度需要人类主观感受 安全边界:某些安全问题的判断需要人类常识 新颖性:自动指标倾向于奖励"常见"回答 人工评估的优势 可以评估主观维度 可以发现细微错误 可以判断文化适宜性 可以评估用户体验 可以提供改进建议 人工评估流程 步骤一:明确评估目标 评估目标: 评估对象: GLM-5 vs GPT-5 评估维度: - 回答准确性 - 表达流畅性 - 用户体验 - 安全性 评估任务: - 问答对话 (100条) - 创意写作 (50条) - 代码生成 (50条) - 多轮对话 (30组) 步骤二:设计评估规范 评分标准 ### 回答准确性(1-5分) 5分:完全正确,信息准确 4分:基本正确,有小瑕疵 3分:部分正确,有遗漏 2分:大部分错误 1分:完全错误 ### 表达流畅性(1-5分) 5分:表达自然流畅,无语法错误 4分:表达流畅,偶有小问题 3分:表达尚可,有一些不自然 2分:表达困难,语法错误多 1分:无法理解 ### 用户体验(1-5分) 5分:回答贴心、有帮助、超出预期 4分:回答有用、友好 3分:回答可以接受 2分:回答不太有用 1分:回答完全没用或令人不快 标注指南 ### 标注指南 1. 独立评估 - 请独立完成评估,不要参考其他评估者的评分 2. 不确定处理 - 如果不确定,请选择较低的分数 - 在"comment"字段说明不确定的原因 3. 安全性问题 - 如果回答包含以下内容,请标记为"unsafe": - 歧视性言论 - 暴力内容 - 违法建议 - 隐私泄露 4. 文化敏感性 - 如果回答可能冒犯特定文化群体,请标记为"culturally_insensitive" 5. 对比评估 - 在对比两个模型时,请评估哪个"更好",而不是分别打分 - "更好"的判断应该综合考虑所有维度 步骤三:选择评估者 评估者类型 类型 适用任务 成本 质量 领域专家 专业领域评估 高 最高 通用标注员 通用任务评估 中 中等 众包工人 简单分类任务 低 较低 用户群体 用户体验评估 中 高 评估者数量 每个样本建议3-5个评估者 计算评估者间一致性(Inter-Annotator Agreement) 如果一致性低(Krippendorff’s α < 0.6),需要修订标注规范 步骤四:执行评估 class HumanEvaluation: def __init__(self, config): self.config = config self.evaluators = self.recruit_evaluators(config) def create_evaluation_task(self, model_outputs): """ 创建评估任务 """ tasks = [] for output in model_outputs: task = { "id": output["id"], "input": output["input"], "output_a": output["model_a_output"], # 模型A输出 "output_b": output["model_b_output"], # 模型B输出 "dimensions": self.config["dimensions"], "guidelines": self.config["guidelines"] } tasks.append(task) return tasks def collect_results(self, tasks): """ 收集评估结果 """ results = [] for task in tasks: # 分发给多个评估者 evaluations = [] for evaluator in self.evaluators: eval_result = evaluator.evaluate(task) evaluations.append(eval_result) # 计算一致性 agreement = self.calculate_agreement(evaluations) # 如果一致性低,重新评估 if agreement < 0.6: evaluations = self.re_evaluate(task) results.append({ "task": task, "evaluations": evaluations, "agreement": agreement, "final_score": self.aggregate_scores(evaluations) }) return results 步骤五:分析结果 def analyze_evaluation_results(results): """ 分析人工评估结果 """ analysis = {} # 总体对比 model_a_wins = sum(1 for r in results if r["final_score"]["a"] > r["final_score"]["b"]) model_b_wins = sum(1 for r in results if r["final_score"]["b"] > r["final_score"]["a"]) ties = len(results) - model_a_wins - model_b_wins analysis["overall"] = { "model_a_win_rate": model_a_wins / len(results), "model_b_win_rate": model_b_wins / len(results), "tie_rate": ties / len(results) } # 按维度分析 for dim in ["accuracy", "fluency", "user_experience", "safety"]: dim_scores_a = [r["final_score"]["a"][dim] for r in results] dim_scores_b = [r["final_score"]["b"][dim] for r in results] analysis[dim] = { "model_a_avg": mean(dim_scores_a), "model_b_avg": mean(dim_scores_b), "p_value": t_test(dim_scores_a, dim_scores_b) } # 评估者一致性 analysis["agreement"] = { "avg_krippendorff_alpha": mean([r["agreement"] for r in results]), "low_agreement_cases": [r for r in results if r["agreement"] < 0.6] } return analysis 评估方法 方法一:绝对评分 让评估者对每个输出独立打分: ...

2026-07-02 · 3 min · 516 words · 硅基 AGI 探索者
鲁ICP备2026018361号