一、为什么AI输出需要质检

在跨境电商AI智能体的落地过程中,一个看似矛盾的规律反复出现:AI越“聪明”,犯错时造成的后果就越严重。一个客服Agent自信满满地承诺了不存在的退货政策,一个广告Agent错误调高预算导致单日消耗翻倍——这些问题的根源不在于模型能力,而在于我们缺少一套系统性的输出质量保障机制

根据对跨境电商AI Agent生产环境的调研,超过90%的决策失准问题根源在于数据管道或输出保障环节,而非模型能力或提示工程。这意味着,AI输出质量保障不是锦上添花,而是生产上线的必要条件

本文构建一套三层防线体系:质量评估(事后分析)、异常检测(实时监控)、人工兜底(最后保险),并通过代码展示每层的工程实现。

二、第一层防线:输出质量评估

2.1 评估什么:从“看起来不错”到“事实可验证”

传统的质量评估依赖人工或另一个AI的“感觉”——“这个回答看起来不错”。这种做法存在根本性缺陷:一个自信、文笔流畅的错误回答,很容易骗过人类或AI评委。研究表明,仅仅改写Agent的推理过程(而不改变其实际执行的动作),就能将AI评委的误报率推高90%。

更可靠的做法是基于证据链的评估——不信任Agent“说了什么”,而是对照“工具实际返回了什么”逐句验证。

# evaluator/evidence_based_evaluator.py
from typing import List, Dict, Any, Tuple
from dataclasses import dataclass

@dataclass
class ClaimVerification:
    """单个陈述的验证结果"""
    claim: str
    is_supported: bool
    evidence_source: str  # 工具名称或知识库ID
    confidence: float
    verdict: str  # "SUPPORTED" | "CONTRADICTED" | "UNVERIFIABLE"

class EvidenceBasedEvaluator:
    """
    基于证据链的AI输出评估器
    核心原则:每个陈述必须能在工具返回或检索结果中找到依据
    """
    def __init__(self, llm_client, knowledge_retriever):
        self.llm = llm_client
        self.retriever = knowledge_retriever
    
    async def evaluate(self, answer: str, tool_results: List[Dict]) -> Dict[str, Any]:
        """
        评估AI回答的质量
        
        Args:
            answer: Agent的最终回答
            tool_results: Agent调用工具返回的实际结果列表
        
        Returns:
            {
                "score": 0.85,
                "claims": [...],
                "unsupported_claims": [...],
                "hallucination_rate": 0.08,
                "pass": True
            }
        """
        # 步骤1:将回答拆解为原子陈述
        claims = await self._extract_claims(answer)
        
        # 步骤2:构建证据上下文(所有工具返回结果的聚合)
        evidence_context = self._build_evidence_context(tool_results)
        
        # 步骤3:逐一验证每个陈述
        verifications = []
        for claim in claims:
            verified = await self._verify_claim(claim, evidence_context)
            verifications.append(verified)
        
        # 步骤4:计算评估指标
        unsupported = [v for v in verifications if v.verdict in ["CONTRADICTED", "UNVERIFIABLE"]]
        hallucination_rate = len(unsupported) / len(verifications) if verifications else 0
        
        return {
            "score": 1.0 - hallucination_rate,
            "claims": verifications,
            "unsupported_claims": unsupported,
            "hallucination_rate": hallucination_rate,
            "pass": hallucination_rate < 0.15  # 幻觉率低于15%通过
        }
    
    async def _extract_claims(self, text: str) -> List[str]:
        """使用LLM将回答拆解为原子陈述"""
        prompt = f"""
        将以下文本拆解为原子陈述列表。每个陈述应该是可以独立验证的事实性断言。
        只输出陈述列表,每行一个。
        
        文本:{text}
        """
        # 调用LLM提取
        # ...
        return ["订单EB12345678已发货", "预计7月22日送达"]
    
    async def _verify_claim(self, claim: str, context: str) -> ClaimVerification:
        """验证单个陈述是否被证据支持"""
        prompt = f"""
        判断以下陈述是否被提供的证据支持。
        只输出以下选项之一:SUPPORTED(完全支持)、CONTRADICTED(矛盾)、UNVERIFIABLE(无法验证)
        
        陈述:{claim}
        证据:{context}
        """
        verdict = await self.llm.generate(prompt)
        # ...
        return ClaimVerification(claim=claim, is_supported=verdict=="SUPPORTED", ...)

2.2 评估指标体系

一个完整的质量评估体系需要覆盖多个维度。参考AI系统风险治理的实践,每个AI输出都应附带可追溯的决策证据链:

评估维度 指标 获取方式
事实准确性 幻觉率(原子陈述中无法验证的比例) 证据链验证
引用完整性 引用的知识库来源是否可追溯 记录source_context_chunk_ids
逻辑一致性 多个陈述之间是否存在矛盾 NLI模型检测
任务完成度 是否回答了用户问的所有问题 意图覆盖检查

三、第二层防线:异常检测

3.1 幻觉检测的三层策略

异常检测的核心是在AI输出过程中或输出后立即识别问题。幻觉(Hallucination)是最危险的故障模式——模型“自信满满”地输出错误信息。

基于Director-AI等生产级工具的实践,幻觉检测可以分层实施:

第一层:原子陈述验证。将回答拆解为原子陈述,逐一与检索到的知识或工具返回值比对。

第二层:危险模式匹配。通过规则快速拦截明显的问题。

# detector/hallucination_detector.py
import re
from typing import List, Dict, Tuple

class HallucinationDetector:
    """
    跨境电商场景的幻觉检测器
    组合规则匹配 + 逻辑一致性检查
    """
    def __init__(self):
        # 危险模式:这些内容必须有工具结果支撑
        self.dangerous_patterns = [
            (r'库存\s*[::]\s*\d+', '库存数字'),
            (r'价格\s*[::]\s*[\d.]+', '价格数字'),
            (r'订单\s*[A-Z0-9]+', '订单号'),
            (r'已发货|已签收|已退款', '物流/售后状态'),
        ]
    
    def detect(self, response: str, tool_results: List[Dict]) -> Tuple[bool, List[str]]:
        """
        检测回复中是否存在幻觉
        
        Returns:
            (是否安全, 风险列表)
        """
        risks = []
        all_tool_text = " ".join([str(r.get("output", "")) for r in tool_results])
        
        # 检查每个危险模式
        for pattern, label in self.dangerous_patterns:
            matches = re.findall(pattern, response)
            if matches:
                # 检查工具结果中是否有对应数据
                if not self._has_support_in_tool_results(matches, tool_results):
                    risks.append(f"检测到未经工具验证的{label}: {matches[:3]}")
        
        # 检查“声称查询了数据”但实际未调用工具
        if "我查询到" in response or "根据数据" in response:
            tool_names = [r.get("tool_name") for r in tool_results]
            if not any(name in ["search_products", "check_stock", "query_order"] for name in tool_names):
                risks.append("LLM声称查询了数据,但实际没有工具调用记录")
        
        return len(risks) == 0, risks
    
    def _has_support_in_tool_results(self, matches: List[str], tool_results: List[Dict]) -> bool:
        """检查工具结果中是否包含匹配内容"""
        all_text = " ".join([str(r.get("output", "")) for r in tool_results])
        for match in matches:
            if match not in all_text:
                return False
        return True

第三层:置信度打分与动态阈值。不是所有幻觉都同等严重。价格相关的幻觉和预计送达日期的幻觉,风险等级完全不同。因此需要按业务领域配置差异化阈值

# detector/confidence_scorer.py
class ConfidenceScorer:
    """
    置信度打分器
    不同业务字段设置不同的风险权重
    """
    RISK_WEIGHTS = {
        "price": 1.0,        # 价格——最高风险
        "refund": 0.95,      # 退款——极高风险
        "inventory": 0.85,   # 库存——高风险
        "delivery": 0.6,     # 物流——中高风险
        "policy": 0.7,       # 政策——中风险
    }
    
    def score(self, response: str, verification_results: List[Dict]) -> Dict:
        """计算加权置信度分数"""
        total_weight = 0
        weighted_score = 0
        
        for result in verification_results:
            field_type = self._detect_field_type(result["claim"])
            weight = self.RISK_WEIGHTS.get(field_type, 0.5)
            total_weight += weight
            weighted_score += (1.0 if result["is_supported"] else 0) * weight
        
        confidence = weighted_score / total_weight if total_weight > 0 else 0.5
        
        # 动态阈值:价格类信息需要更高置信度
        threshold = 0.8 if "price" in response.lower() else 0.6
        
        return {
            "confidence": confidence,
            "threshold": threshold,
            "pass": confidence >= threshold
        }

3.2 日志追踪与可观测性

异常检测需要完整的执行轨迹作为分析依据。每条AI决策都需要记录:

  • trace_id:全局唯一追踪ID
  • input:用户输入
  • tool_calls:工具调用序列及返回
  • final_answer:最终回答
  • confidence_scores:各维度置信度
  • hallucination_flags:检测到的幻觉

四、第三层防线:人工兜底(Human-in-the-Loop)

4.1 分级兜底架构

在AI生产环境中,完全依赖人工审核每一条输出是不可扩展的。有效的做法是分级兜底架构

┌─────────────────────────────────────────────────────────────┐
│                      第一级:自动通过                        │
│              置信度 > 0.8 && 无风险标记                      │
│                    直接返回用户                             │
└─────────────────────┬───────────────────────────────────────┘
                      ▼
┌─────────────────────────────────────────────────────────────┐
│                      第二级:标记复核                        │
│           置信度 0.5~0.8 或 存在低风险标记                   │
│             输出标记后异步推送人工抽查                       │
└─────────────────────┬───────────────────────────────────────┘
                      ▼
┌─────────────────────────────────────────────────────────────┐
│                      第三级:强制人工                        │
│       置信度 < 0.5 或 高风险操作(退款/调价/删除)           │
│              拦截输出,等待人工审批                         │
└─────────────────────────────────────────────────────────────┘

4.2 工具调用的安全护栏

对于高风险工具调用(退款、调价、删除数据),需要在工具调用层设置硬性护栏:

# guardrail/tool_guardrail.py
from enum import Enum
from pydantic import BaseModel

class ToolRiskLevel(Enum):
    READ = "read"         # 只读操作,直接执行
    WRITE = "write"       # 写操作,需要二次确认
    DANGEROUS = "danger"  # 危险操作,必须人工审批

class ToolGuardrail:
    """工具调用的安全护栏"""
    
    RISK_MAP = {
        "query_order": ToolRiskLevel.READ,
        "check_stock": ToolRiskLevel.READ,
        "search_products": ToolRiskLevel.READ,
        "create_campaign": ToolRiskLevel.WRITE,
        "modify_inventory": ToolRiskLevel.WRITE,
        "adjust_budget": ToolRiskLevel.DANGEROUS,
        "refund_order": ToolRiskLevel.DANGEROUS,
        "cancel_order": ToolRiskLevel.DANGEROUS,
        "update_price": ToolRiskLevel.DANGEROUS,
    }
    
    @classmethod
    def check(cls, tool_name: str, args: Dict, user_role: str) -> Tuple[bool, str]:
        """检查工具调用是否安全"""
        risk = cls.RISK_MAP.get(tool_name, ToolRiskLevel.READ)
        
        if risk == ToolRiskLevel.DANGEROUS:
            if user_role != "admin":
                return False, f"危险操作 {tool_name} 需要管理员权限,已转人工审批"
            return False, f"危险操作 {tool_name} 需要人工二次确认,请审批参数: {args}"
        
        if risk == ToolRiskLevel.WRITE:
            return False, f"写操作 {tool_name} 需要用户确认,是否继续?参数: {args}"
        
        return True, "自动执行"

4.3 兜底响应设计

当AI服务超时、异常或置信度过低时,必须返回安全的兜底响应,而非将错误直接透传给用户:

# fallback/response_fallback.py
from typing import Dict, Any

class FallbackManager:
    """兜底响应管理器"""
    
    FALLBACK_TEMPLATES = {
        "customer_service": "系统正在处理您的请求,预计将在3分钟内回复。如情况紧急,请联系在线客服。",
        "order_inquiry": "订单状态查询暂不可用,请稍后重试或查看您的订单邮件。",
        "ad_operation": "广告操作需要审批,已提交人工处理,请等待通知。",
    }
    
    @classmethod
    def get_fallback(cls, scenario: str, error: Exception) -> Dict[str, Any]:
        """生成兜底响应"""
        return {
            "status": "fallback",
            "scenario": scenario,
            "message": cls.FALLBACK_TEMPLATES.get(scenario, "服务暂时不可用,请稍后重试"),
            "reason": str(error)[:200],
            "timestamp": datetime.now().isoformat(),
            "requires_human": True
        }

五、总结

AI输出的质量保障,本质上是从“信任模型”转向“验证事实”。三层防线各司其职:

防线 目标 核心手段 触发条件
质量评估 确保输出符合业务标准 原子陈述验证、证据链追溯 每次输出后执行
异常检测 实时发现危险信号 幻觉检测、置信度打分、模式匹配 输出过程中或输出后立即
人工兜底 在自动化失效时拦住 分级拦截、工具护栏、兜底响应 置信度低于阈值或高风险操作

三者协同,才能让AI智能体从“演示级玩具”变成“生产级工具”。正如业界实践所证明的:把HITL从“持续监控”重新定位为“战略审计”,组织才能在保证合规的同时不拖慢创新速度。质量保障不是AI的敌人,而是让AI走得更远的护栏。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐