⚙️ AI工程化实践:从Demo到生产,差距是10倍工程量!

第11期 · AI 工程化实践:从原型到生产的全栈指南

系列 :每日 AI 知识点
期数 :第 11 期
主题 :AI 工程化实践
难度 :⭐⭐⭐⭐(高级)
一句话:把 LLM、RAG、Agent 等技术组合成稳定可靠的生产级 AI 应用,需要系统化的工程化思维和实践。


一、AI 工程化技术栈全景

一个完整的生产级 AI 应用由五层技术栈组成:

第一层:基础设施层

复制代码
计算资源:
  GPU 集群(模型推理)| CPU 集群(向量检索)
  
云服务:
  腾讯云 / AWS / 阿里云(弹性扩缩容)
  
存储:
  对象存储(文档原件)| 向量数据库(Embedding)| 关系数据库(元数据)

第二层:模型层

arduino 复制代码
LLM 选型原则:
  ┌─────────────────────────────────────────┐
  │ 任务类型    │ 推荐模型          │ 原因   │
  ├─────────────────────────────────────────┤
  │ 通用问答    │ Claude 3.5 Sonnet │ 综合强 │
  │ 代码生成    │ Claude 3.5 Sonnet │ 代码强 │
  │ 中文处理    │ DeepSeek-V3       │ 中文优 │
  │ 成本敏感    │ DeepSeek-V3       │ 价格低 │
  │ 私有部署    │ LLaMA 3 / Qwen    │ 开源   │
  └─────────────────────────────────────────┘

Embedding 模型:
  中文场景:BGE-M3(开源,中文优化)
  通用场景:text-embedding-3-small(OpenAI)
  
Reranker 模型:
  bge-reranker-v2-m3(开源,效果好)

第三层:框架层

复制代码
RAG 框架:
  LangChain  --- 功能最全,生态最丰富
  LlamaIndex --- 专注 RAG,更轻量
  
Agent 框架:
  LangGraph  --- 基于图的 Agent 框架,可控性强
  AutoGen    --- 微软的 Multi-Agent 框架
  
向量数据库:
  Milvus     --- 企业级,高性能(推荐)
  Chroma     --- 开源轻量,适合原型
  Pinecone   --- 云服务,易用

第四层:能力层

css 复制代码
RAG 知识库 → 让 AI 基于私有文档回答
Agent 工具调用 → 让 AI 执行具体操作
Prompt 管理 → 版本控制、A/B 测试
MCP 集成 → 标准化工具接入

第五层:应用层

复制代码
AI 助手(对话式)
智能客服(问答式)
自动化工作流(任务式)
AI 测试平台(专业工具式)

二、AI 应用工程化生命周期

阶段一:需求分析

关键问题

markdown 复制代码
1. 用 AI 解决什么问题?
   - 明确问题边界(AI 能解决什么,不能解决什么)
   - 量化成功标准(准确率 >85%?响应时间 <2s?)

2. 有没有更简单的非 AI 方案?
   - 如果规则匹配就能解决,不要用 AI
   - AI 适合:模糊匹配、语义理解、内容生成

3. 数据准备好了吗?
   - 有没有足够的文档/数据?
   - 数据质量如何?需要清洗吗?

4. 成本预算是多少?
   - API 调用费用(按 Token 计费)
   - 向量数据库费用
   - 工程开发和维护成本

阶段二:原型验证(最重要!)

快速验证核心假设

python 复制代码
# 用最简单的方式验证 RAG 效果
# 不需要完整架构,先跑通核心流程

from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.llms import ChatOpenAI

# 1. 加载几个文档
docs = load_documents("test_docs/")

# 2. 向量化存储
vectorstore = Chroma.from_documents(docs, OpenAIEmbeddings())

# 3. 测试检索效果
results = vectorstore.similarity_search("刷掌设备激活流程", k=3)

# 4. 测试 LLM 回答质量
chain = RetrievalQA.from_chain_type(ChatOpenAI(), retriever=vectorstore.as_retriever())
answer = chain.run("刷掌设备激活流程是什么?")
print(answer)

原型验证的目标

  • 2 天内验证核心功能是否可行
  • 用 20 个典型问题测试效果
  • 确认技术路线是否正确

阶段三:数据准备

这是最容易被低估的阶段

erlang 复制代码
数据准备工作量占比(经验值):
  需求分析:5%
  原型验证:10%
  数据准备:30%  ← 通常被低估
  工程化开发:25%
  测试优化:20%
  上线运维:10%

数据准备清单

复制代码
□ 文档收集:确认覆盖所有业务场景
□ 格式处理:PDF 扫描版需要 OCR
□ 质量过滤:去除重复、过时、低质量内容
□ 结构整理:确保文档有清晰的标题和章节
□ 脱敏处理:去除个人信息、商业机密
□ 版本管理:建立文档更新机制
□ 测试集准备:准备 100 个典型问题和标准答案

阶段四:模型选型

评估维度

python 复制代码
# 模型评估框架
evaluation_metrics = {
    "accuracy": {
        "weight": 0.4,  # 准确率最重要
        "test_cases": 100,
        "threshold": 0.85
    },
    "latency": {
        "weight": 0.2,
        "p95_target": 2000,  # ms
        "p99_target": 5000
    },
    "cost": {
        "weight": 0.2,
        "monthly_budget": 10000  # 元
    },
    "safety": {
        "weight": 0.2,
        "test_cases": 50  # 安全红线测试
    }
}

# 对每个候选模型跑评估
for model in ["claude-3.5-sonnet", "gpt-4o", "deepseek-v3"]:
    score = evaluate_model(model, evaluation_metrics)
    print(f"{model}: {score}")

阶段五:工程化

从原型到生产的关键工作

python 复制代码
# 生产级 AI 应用的必备组件

# 1. 错误处理和重试
@retry(max_attempts=3, backoff=exponential)
def call_llm(prompt: str) -> str:
    try:
        return llm.invoke(prompt)
    except RateLimitError:
        raise  # 触发重试
    except Exception as e:
        logger.error(f"LLM 调用失败: {e}")
        return fallback_response()

# 2. 流式输出(提升用户体验)
async def stream_response(query: str):
    async for chunk in llm.astream(query):
        yield chunk.content

# 3. 缓存热点问题(降低成本)
@lru_cache(maxsize=1000)
def get_cached_answer(query_hash: str) -> Optional[str]:
    return cache.get(query_hash)

# 4. 并发控制
semaphore = asyncio.Semaphore(10)  # 最多 10 个并发请求

# 5. 超时控制
response = await asyncio.wait_for(
    call_llm(prompt),
    timeout=30.0  # 30 秒超时
)

阶段六:持续优化

建立反馈闭环

markdown 复制代码
用户使用 → 收集反馈 → 分析问题 → 优化改进 → 重新评估

反馈收集方式:
  1. 显式反馈:用户点赞/踩
  2. 隐式反馈:用户是否追问(说明第一次没回答好)
  3. 日志分析:哪些问题召回率低?哪些问题用户不满意?
  4. 定期评测:每周用标准测试集跑评估

三、AI 应用监控与质量保障

监控指标体系

性能指标

python 复制代码
# 关键性能指标
metrics = {
    "latency_p50": "50%的请求响应时间",
    "latency_p95": "95%的请求响应时间(用户体验关键)",
    "latency_p99": "99%的请求响应时间(异常检测)",
    "success_rate": "请求成功率",
    "token_usage": "每日Token消耗量",
    "cost_per_query": "每次查询的平均成本"
}

# 告警阈值
alerts = {
    "latency_p95 > 3000ms": "P1告警",
    "success_rate < 95%": "P1告警",
    "success_rate < 90%": "P0告警",
    "daily_cost > budget * 1.2": "P2告警"
}

质量指标

python 复制代码
# AI 回答质量评估(自动化)
quality_metrics = {
    "relevance": "回答与问题的相关性(0-1)",
    "faithfulness": "回答是否忠实于检索到的文档(0-1)",
    "completeness": "是否完整回答了问题(0-1)",
    "safety": "是否包含不安全内容(0/1)"
}

# 使用 RAGAS 框架自动评估
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy

score = evaluate(
    dataset=test_dataset,
    metrics=[faithfulness, answer_relevancy]
)

日志设计

python 复制代码
# 结构化日志,便于分析
import structlog

logger = structlog.get_logger()

def handle_query(query: str, user_id: str):
    start_time = time.time()
    
    # 记录请求
    logger.info("query_received",
        query=query[:100],  # 截断避免日志过大
        user_id=user_id,
        session_id=session_id
    )
    
    # 执行查询
    retrieved_docs = retriever.retrieve(query)
    response = llm.generate(query, retrieved_docs)
    
    # 记录结果
    latency = (time.time() - start_time) * 1000
    logger.info("query_completed",
        latency_ms=latency,
        retrieved_doc_count=len(retrieved_docs),
        response_length=len(response),
        top_doc_score=retrieved_docs[0].score if retrieved_docs else None
    )
    
    return response

四、成本优化策略

AI 应用的成本主要来自 LLM API 调用,以下是常用的优化策略:

策略一:问题分级路由

python 复制代码
def route_query(query: str) -> str:
    """根据问题复杂度选择不同的模型"""
    
    complexity = estimate_complexity(query)
    
    if complexity == "simple":
        # 简单问题用便宜的模型
        return "deepseek-v3"  # 成本约 GPT-4 的 1/20
    elif complexity == "medium":
        return "claude-3-haiku"
    else:
        # 复杂问题用强模型
        return "claude-3.5-sonnet"

策略二:缓存常见问题

python 复制代码
# 对相似问题返回缓存结果
def get_answer_with_cache(query: str) -> str:
    # 检查语义相似的缓存
    cache_hit = semantic_cache.search(query, threshold=0.95)
    
    if cache_hit:
        logger.info("cache_hit", query=query[:50])
        return cache_hit.answer
    
    # 缓存未命中,调用 LLM
    answer = call_llm(query)
    semantic_cache.store(query, answer)
    return answer

实测效果:热点问题缓存可以减少 30-50% 的 API 调用成本。

策略三:Prompt 压缩

python 复制代码
# 压缩过长的上下文,减少 Token 消耗
def compress_context(context: str, max_tokens: int = 2000) -> str:
    if count_tokens(context) <= max_tokens:
        return context
    
    # 用 AI 摘要压缩(用便宜的模型)
    summary = cheap_llm.summarize(context, max_tokens=max_tokens)
    return summary

五、安全与合规

输入安全

python 复制代码
# Prompt 注入防护
def sanitize_input(user_input: str) -> str:
    # 检测 Prompt 注入攻击
    injection_patterns = [
        "ignore previous instructions",
        "you are now",
        "act as",
        "jailbreak"
    ]
    
    for pattern in injection_patterns:
        if pattern.lower() in user_input.lower():
            raise SecurityError(f"检测到潜在的 Prompt 注入攻击")
    
    return user_input

输出安全

python 复制代码
# 敏感信息过滤
def filter_output(response: str) -> str:
    # 过滤手机号
    response = re.sub(r'1[3-9]\d{9}', '[手机号已隐藏]', response)
    
    # 过滤身份证号
    response = re.sub(r'\d{17}[\dXx]', '[身份证已隐藏]', response)
    
    # 过滤内部 IP 地址
    response = re.sub(r'10\.\d+\.\d+\.\d+', '[内网IP已隐藏]', response)
    
    return response

六、一句话总结

AI 工程化 = 正确的技术选型 + 高质量的数据准备 + 完善的监控体系 + 持续的迭代优化。技术只是 20%,数据质量和工程规范才是决定 AI 应用成败的 80%。


延伸阅读


下一期预告:第12期 · AI + 测试/研发场景 --- 系列收官之作!把前11期的所有知识点串联起来,展示 AI 在测试和研发工作中的完整应用场景和实践案例。

相关推荐
巫山老妖2 小时前
🧠 LLM大语言模型:AI世界的「概率引擎」,你真的了解它吗?
前端
巫山老妖2 小时前
📚 知识库工程:RAG落地的「最后一公里」,数据质量才是王道!
前端
巫山老妖2 小时前
📋 AI Rules行为规范:让Agent「可预期、可信任、可审计」!
前端
巫山老妖2 小时前
💬 Prompt提示词工程:同样的AI,为什么别人用出10倍效果?
前端
Mintopia2 小时前
学技术总半途而废?因为你没找对输入方式
前端
巫山老妖2 小时前
🔍 RAG检索增强生成:让AI「说话有依据」,彻底告别幻觉!
前端
mfxcyh2 小时前
实现签名画板
前端·javascript·vue.js
是大强2 小时前
electron调用dll 方案
前端·javascript·electron