← 返回
IT技术

如何构建能够知道自己不知道的AI系统:实用指南

✍️ zhirenhun 📅 2026/9/4 👁 168 阅读 ⏱ 27 分钟
如何构建能够知道自己不知道的AI系统:实用指南

大型语言模型(LLM)从根本上改变了我们构建内部业务应用的方式。它们使开发者能够创建智能软件,能够综合复杂的企业数据,回答内部查询,并自动化重复的工作流程。

然而,将LLM应用从本地原型迁移到生产企业系统时,可能会暴露一个关键的可靠性问题:过度自信

标准语言模型被优化为生成统计上最可能的下一个标记,而不是评估自身的确定性基线。面对模糊的提示、不完整的检索上下文或领域外的边缘情况时,未加防护的模型会自信地编造听起来合理的虚假信息,产生幻觉,而不向用户提供任何不确定性的指示。

在任务关键型企业环境中,盲目猜测的AI应用构成严重的业务风险。在本指南中,您将学习如何构建生产级别的不确定性框架。我将带您了解一种架构,该架构旨在检测知识差距,计算概率置信度指标,并将低确定性的请求平滑地路由给人工操作员或安全的后备响应。

我们将涵盖的内容

前置条件和环境设置

要跟随本实用指南并在本地运行实现代码,您需要满足以下基本要求:

软件包安装

打开终端并执行以下命令以安装所需的外部依赖项:

pip install openai sentence-transformers numpy python-dotenv

本地目录结构

使用整洁的结构组织工作区,以保持执行的可重复性:

uncertainty-engine/

│

├── .env

├── README.md

└── app.py

环境配置

在项目根目录下创建一个 .env 文件,用于存储访问凭据和阈值配置:

代码片段

OPENAI_API_KEY=your_actual_api_key_here
ENVIRONMENT=development
CONFIDENCE_THRESHOLD=0.75

挑战:应对过度自信漏洞

标准LLM没有内部机制可以说“我不知道”。当RAG应用遇到文档缺失或收到超出范围的查询时,核心模型会把缺失的数据当作必须不惜一切代价解决的文本补全谜题。

图1:标准LLM管道的漏洞架构

图1展示了标准LLM管道的漏洞架构:首先出现含糊或超出范围的请求,随后是天真的提示执行,最后是自信的幻觉。

依赖类似"只有在确定100%时才回答"的系统提示无效,因为模型在预测token序列时容易绕过系统提示限制。企业系统需要确定性的代码边界,独立于LLM的原始输出,评估语义相关性、文档距离和token概率。

理解企业请求生命周期以评估不确定性

为了防止未校准的输出,我们采用确定性请求生命周期拦截请求。每笔交易在最终输出发送给终端用户之前,会依次经过三层验证。

图2:具有回退升级的安全企业LLM架构

图2展示了具有回退升级的安全企业LLM架构:用户请求依次经过输入边界验证、检索质量评估和输出不确定性检查,随后才返回响应。

通过将安全决策与LLM解耦,您的代码充当决策边界,而语言模型则严格作为分析生成引擎运行。

步骤1:实施第一层——输入意图与边界检测

第一道防线负责在调用检索管道或模型API之前,判断传入的查询是否落在系统的有效域参数范围内。

import numpy as np
from sentence_transformers import SentenceTransformer

class BoundaryDetector:
    def __init__(self, target_domains: list, similarity_threshold: float = 0.45):
        self.encoder = SentenceTransformer("all-MiniLM-L6-v2")
        self.domain_embeddings = self.encoder.encode(target_domains)
        self.threshold = similarity_threshold

    def verify_domain_relevance(self, query: str) -> dict:
        query_vector = self.encoder.encode([query])
        
        # Calculate cosine similarity against domain boundaries
        similarities = np.dot(self.domain_embeddings, query_vector.T) / (
            np.linalg.norm(self.domain_embeddings, axis=1, keepdims=True) * np.linalg.norm(query_vector)
        )
        max_similarity = float(np.max(similarities))
        
        if max_similarity < self.threshold:
            return {
                "is_valid": False,
                "score": round(max_similarity, 4),
                "reason": "Query falls outside operational domain boundaries."
            }
            
        return {
            "is_valid": True,
            "score": round(max_similarity, 4),
            "reason": "Query verified within target operational scope."
        }

if __name__ == "__main__":
    approved_topics = [
        "company VPN configuration",
        "employee payroll schedules",
        "internal IT software deployment"
    ]
    detector = BoundaryDetector(target_domains=approved_topics)
    out_of_scope_query = "What is the optimal baking temperature for sourdough bread?"
    result = detector.verify_domain_relevance(out_of_scope_query)
    print(f"Domain Validation Result: {result}")

该模块将批准的运营主题转换为语义向量嵌入。当用户提交查询时,脚本将输入转换为嵌入向量,并计算其与预定义域界限的余弦相似度。如果对齐得分低于阈值,请求将立即停止,从而节省 API 计算成本并防止领域外猜测。

步骤 2:实现第 2 层 – 语义距离与检索质量评分

RAG 平台经常出现幻觉,因为在缺少相关上下文时,向量检索引擎会返回低分的文档匹配。我们通过测量查询与检索到的上下文块之间的语义距离来验证检索质量。

class RetrievalQualityScorer:
    def __init__(self, minimum_relevance: float = 0.60):
        self.encoder = SentenceTransformer("all-MiniLM-L6-v2")
        self.min_relevance = minimum_relevance

    def evaluate_retrieved_context(self, user_query: str, retrieved_chunks: list) -> tuple:
        if not retrieved_chunks:
            return False, 0.0

        query_vec = self.encoder.encode(user_query)
        chunk_vecs = self.encoder.encode(retrieved_chunks)

        # Compute cosine similarity across retrieved chunks
        scores = np.dot(chunk_vecs, query_vec) / (
            np.linalg.norm(chunk_vecs, axis=1) * np.linalg.norm(query_vec)
        )
        top_score = float(np.max(scores))

        is_sufficient = top_score >= self.min_relevance
        return is_sufficient, round(top_score, 4)

if __name__ == "__main__":
    scorer = RetrievalQualityScorer()
    sample_query = "How do I configure mutual TLS for gRPC services?"
    sample_context = [
        "Standard deployment uses isolated network clusters with automated releases."
    ]
    has_context, score = scorer.evaluate_retrieved_context(sample_query, sample_context)
    print(f"Context Sufficient: {has_context} | Top Match Score: {score}")

此步骤将检索到的文档块与用户查询一起转换为向量嵌入,以计算各自的相似度得分。若最高得分的块未达到最低相关性阈值,则该模块会将上下文标记为不足,从而阻止系统向模型发送无关文本。

步骤 3:实现第 3 层 – 概率 Logit 分析及输出验证

最终层会检查模型 API 返回的 token 生成概率(对数概率)。当 LLM 对其答案不确定时,token 分布的熵会增加,从而在 API 有效载荷中直接暴露不确定性。

import math

class OutputLogprobValidator:
    def __init__(self, logprob_threshold: float = -0.35):
        self.threshold = logprob_threshold

    def evaluate_token_certainty(self, token_logprobs: list) -> dict:
        if not token_logprobs:
            return {"is_confident": False, "avg_logprob": -1.0, "perplexity": 999.0}

        avg_logprob = sum(token_logprobs) / len(token_logprobs)
        perplexity = math.exp(-avg_logprob)
        is_confident = avg_logprob >= self.threshold

        return {
            "is_confident": is_confident,
            "avg_logprob": round(avg_logprob, 4),
            "perplexity": round(perplexity, 4)
        }

if __name__ == "__main__":
    validator = OutputLogprobValidator()
    # Simulated logprob arrays from an API output
    unconfident_logprobs = [-0.12, -0.85, -1.20, -0.45, -0.95]
    result = validator.evaluate_token_certainty(unconfident_logprobs)
    print(f"Generation Certainty Assessment: {result}")

该类负责处理生成令牌的原始对数概率,计算平均对数概率指标并结合文本困惑度。通过将该值与经过校准的阈值进行比较,应用程序能够客观判断模型在文本生成过程中是否存在不确定性。

将验证层整合到单一流水线中

我们现在将这三个孤立的验证模块统一为单一的编排引擎,以端到端管理企业请求流水线。

class EnterpriseUncertaintyEngine:
    def __init__(self, approved_domains: list):
        self.boundary_layer = BoundaryDetector(target_domains=approved_domains)
        self.retrieval_layer = RetrievalQualityScorer()
        self.output_layer = OutputLogprobValidator()

    def process_request(self, user_query: str, retrieved_docs: list) -> str:
        print(f"\n--- Processing Query: '{user_query}' ---")

        # Check 1: Input Boundary Evaluation
        boundary_result = self.boundary_layer.verify_domain_relevance(user_query)
        if not boundary_result["is_valid"]:
            return f"Request Rejected: {boundary_result['reason']}"
        print("[Pass] Input verified within operational domain.")

        # Check 2: Retrieval Context Quality
        valid_context, ret_score = self.retrieval_layer.evaluate_retrieved_context(user_query, retrieved_docs)
        if not valid_context:
            return f"Escalated: Insufficient ground-truth data retrieved (Score: {ret_score}). Routing to support team."
        print(f"[Pass] Context quality validated (Score: {ret_score}).")

        # Step 3: Simulated LLM Generation & Logprob Verification
        # In production, replace dummy logprobs with actual API responses
        simulated_logprobs = [-0.08, -0.05, -0.12, -0.04]
        certainty = self.output_layer.evaluate_token_certainty(simulated_logprobs)

        if not certainty["is_confident"]:
            return "Fallback Active: Generated output exhibited low token certainty."
        print(f"[Pass] Output probability verified (Avg Logprob: {certainty['avg_logprob']}).")

        return "Response Generated: Navigate to portal.company.internal to reset your VPN credentials."

if __name__ == "__main__":
    domains = ["VPN credentials", "software provisioning", "network settings"]
    engine = EnterpriseUncertaintyEngine(approved_domains=domains)

    # Test Case: Query with valid retrieved context
    context_data = ["To update VPN credentials, access portal.company.internal."]
    final_output = engine.process_request("How do I update my VPN password?", context_data)
    print(f"System Output: {final_output}")

该编排类将输入验证、检索评分和 logprob 检查合并为单一执行工作流。它按顺序将请求路由通过每个验证检查点,阻止领域外查询,将检索不足的上下文升级至人工支持,并过滤低概率生成。

运行不确定性检测系统的运营洞察

设计具备不确定性感知的 LLM 架构能够带来若干实际的部署经验:

结论

构建生产级 AI 应用需要从天真的提示工程转向以安全为先的工程思维。虽然大型语言模型提供了强大的自然语言能力,但它们是未校准的工具,无法原生衡量真实性或确定性。

通过用确定性代码边界包装模型,以评估输入意图、文档相关性和生成概率,你可以将不可预测的语言模型转变为可靠的企业平台:在有信心时提供有用的答案,并在恰当的时候明确说出 “我不知道”。

感谢阅读。

我希望本指南能为在企业环境中构建不确定性感知的 AI 应用提供一个清晰的框架。

如果您想讨论 AI 工程、Agentic 架构、LLM 运维或 AI 治理,欢迎与我联系:

——

🧑‍💻

zhirenhun

一个热爱技术的程序员,喜欢分享前沿AI知识和开发经验。