mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
1011 字
3 分钟
构建你的第一个AI应用:架构与工程实践
2026-01-26

学会了AI的基础知识,接下来是动手实践:构建一个真正的AI应用。

这篇文章不讲理论,讲实操:从架构设计到技术选型,从开发到上线,用一个完整的智能客服案例带你走完全流程。

本文要点#

  • 四种AI应用架构模式
  • 技术栈选择指南
  • 工程化实践要点
  • 完整案例:智能客服从0到1
  • 评估与监控体系
  • 安全与合规

一、AI应用架构模式#

1.1 模式1:LLM as Generator(生成器)#

flowchart TD N0["输入"] N1["LLM"] N0 --> N1 N1["LLM"] N2["输出"] N1 --> N2

1.2 模式2:LLM as Orchestrator(协调器)#

flowchart TD N0["用户请求"] N1["LLM协调多个工具"] N0 --> N1 N1["LLM协调多个工具"] N2["完成任务"] N1 --> N2

1.3 模式3:LLM as Interface(接口层)#

flowchart TD N0["用户自然语言"] N1["LLM解析意图"] N0 --> N1 N1["LLM解析意图"] N2["调用后端服务"] N1 --> N2 N2["调用后端服务"] N3["返回结果"] N2 --> N3

1.4 模式4:RAG增强模式#

flowchart TD N0["用户问题"] N1["检索知识库"] N0 --> N1 N1["检索知识库"] N2["LLM+知识生成"] N1 --> N2 N2["LLM+知识生成"] N3["回答"] N2 --> N3

二、技术栈选择#

2.1 应用框架对比#

框架语言特点适用场景
LangChainPython/JS生态丰富、组件多快速原型、通用应用
LlamaIndexPythonRAG专精、文档处理好知识库应用
Semantic KernelC#/Python微软出品、企业级企业集成、.NET项目
HaystackPython搜索增强、模块化搜索类应用
FastAPI + OpenAI SDKPython灵活、轻量自定义需求强

选择建议

  • 快速上手:LangChain
  • 知识库应用:LlamaIndex
  • 企业项目:Semantic Kernel
  • 追求灵活:直接用SDK

2.2 向量数据库对比#

数据库部署方式特点适用场景
Pinecone云托管简单、可扩展生产环境
Chroma本地/Docker轻量、开源开发测试
Milvus自部署高性能、分布式大规模生产
Qdrant自部署/云高效、开源性能敏感
Weaviate自部署/云语义强复杂查询

2.3 模型选择#

任务类型推荐模型理由
通用对话GPT-4o / Claude 3.5 Sonnet综合能力强
代码生成Claude 3.5 Sonnet / DeepSeek V3代码能力突出
知识问答GPT-4o-mini / DeepSeek V3性价比高
推理任务o3-mini / DeepSeek R1推理能力强
私有部署Qwen 2.5 / LLaMA 3.1开源可控

三、工程化实践#

3.1 Prompt版本管理#

mindmap root((不要把Prompt硬编码在代码里!)) 推荐结构: prompts/ v1/ system_prompt.txt user_prompt_template.txt v2/ system_prompt.txt user_prompt_template.txt current -> v2 # 软链接指向当前版本 好处: 可追溯:知道什么时候改了什么 可回滚:出问题切回旧版本 可A/B测试:不同版本对比效果
prompt_manager.py
from pathlib import Path
class PromptManager:
def __init__(self, version="current"):
self.base_path = Path("prompts") / version
def get_system_prompt(self) -> str:
return (self.base_path / "system_prompt.txt").read_text()
def get_user_prompt(self, **kwargs) -> str:
template = (self.base_path / "user_prompt_template.txt").read_text()
return template.format(**kwargs)

3.2 评估与监控体系#

┌─────────────────────────────────────────────────────────────┐
│ AI应用评估体系 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 功能评估: │
│ ├── 准确率:答案正确的比例 │
│ ├── 相关性:答案与问题的相关程度 │
│ ├── 完整性:是否完整回答了问题 │
│ └── 格式正确率:输出格式是否符合预期 │
│ │
│ 性能评估: │
│ ├── 延迟(P50/P95/P99) │
│ ├── 吞吐量(QPS) │
│ └── Token消耗 │
│ │
│ 用户体验: │
│ ├── 满意度评分 │
│ ├── 反馈率(点赞/点踩) │
│ └── 对话轮数 │
│ │
│ 成本监控: │
│ ├── API调用费用 │
│ ├── 基础设施成本 │
│ └── 成本/查询 │
│ │
└─────────────────────────────────────────────────────────────┘
# 监控示例
import time
from dataclasses import dataclass
@dataclass
class QueryMetrics:
query_id: str
latency_ms: float
input_tokens: int
output_tokens: int
model: str
success: bool
def track_query(func):
async def wrapper(*args, **kwargs):
start = time.time()
try:
result = await func(*args, **kwargs)
success = True
except Exception as e:
success = False
raise
finally:
latency = (time.time() - start) * 1000
metrics = QueryMetrics(
query_id=kwargs.get("query_id"),
latency_ms=latency,
input_tokens=result.usage.input_tokens,
output_tokens=result.usage.output_tokens,
model=result.model,
success=success
)
# 发送到监控系统
send_metrics(metrics)
return result
return wrapper

3.3 成本优化策略#

flowchart TD N0["- 简单问题"] N1["小模型(GPT-4o-mini)"] N0 --> N1 N2["- 复杂问题"] N3["大模型(GPT-4o)"] N2 --> N3

3.4 安全措施#

mindmap root((输入安全:)) 敏感信息检测(PII、密钥) 恶意Prompt注入防护 内容审核(违规内容) 长度限制 输出安全: 有害内容过滤 幻觉检测 格式验证 来源标注 访问控制: 用户认证 权限管理 调用限流 审计日志

四、完整案例:智能客服从0到1#

4.1 需求分析#

背景:
某电商公司需要智能客服系统,处理用户咨询
核心需求:
1. 回答产品相关问题
2. 处理订单查询
3. 处理退换货申请
4. 无法解决时转人工
约束条件:
- 响应时间 < 3秒
- 准确率 > 85%
- 7x24小时服务
- 成本可控

4.2 架构设计#

┌─────────────────────────────────────────────────────────────┐
│ 智能客服系统架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ │
│ │ 用户 │ │
│ └────┬─────┘ │
│ ↓ │
│ ┌────────────────────────────────────────────┐ │
│ │ API网关 │ │
│ │ 认证 / 限流 / 路由 │ │
│ └────────────────────┬───────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────────────┐ │
│ │ 意图分类器 │ │
│ │ 产品咨询 / 订单查询 / 退换货 / 其他 │ │
│ └────────────────────┬───────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────────────┐ │
│ │ 路由层 │ │
│ ├────────────────────────────────────────────┤ │
│ │ 产品咨询 → RAG知识库 │ │
│ │ 订单查询 → 订单系统API │ │
│ │ 退换货 → 退换货流程 │ │
│ │ 其他 → 通用对话 / 转人工 │ │
│ └────────────────────┬───────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────────────┐ │
│ │ LLM服务层 │ │
│ │ GPT-4o-mini / DeepSeek V3 │ │
│ └────────────────────┬───────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────────────┐ │
│ │ 响应生成 │ │
│ │ 格式化 / 安全检查 / 缓存 │ │
│ └────────────────────┬───────────────────────┘ │
│ ↓ │
│ ┌──────────┐ │
│ │ 用户 │ │
│ └──────────┘ │
│ │
│ ┌────────────────────────────────────────────┐ │
│ │ 支撑服务 │ │
│ ├────────────────────────────────────────────┤ │
│ │ 向量数据库(产品知识库) │ │
│ │ Redis(缓存/会话) │ │
│ │ MySQL(日志/分析) │ │
│ │ 监控系统(Prometheus + Grafana) │ │
│ └────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

4.3 核心代码实现#

项目结构

mindmap root((smart-customer-service/)) app/ __init__.py main.py # FastAPI入口 routers/ chat.py # 对话接口 health.py # 健康检查 services/ intent_classifier.py # 意图分类 rag_service.py # RAG服务 order_service.py # 订单服务 llm_service.py # LLM封装 models/ request.py # 请求模型 response.py # 响应模型 utils/ cache.py # 缓存工具 metrics.py # 监控工具 prompts/ v1/ system_prompt.txt intent_prompt.txt tests/ requirements.txt Dockerfile

意图分类器

app/services/intent_classifier.py
from enum import Enum
from openai import OpenAI
class Intent(Enum):
PRODUCT_INQUIRY = "product_inquiry" # 产品咨询
ORDER_QUERY = "order_query" # 订单查询
RETURN_REQUEST = "return_request" # 退换货
GENERAL = "general" # 通用/其他
class IntentClassifier:
def __init__(self):
self.client = OpenAI()
self.prompt = """
分析用户意图,返回以下之一:
- product_inquiry: 产品相关问题
- order_query: 订单查询
- return_request: 退换货申请
- general: 其他
用户消息:{message}
意图:
"""
def classify(self, message: str) -> Intent:
response = self.client.chat.completions.create(
model="gpt-4o-mini",
messages=[{
"role": "user",
"content": self.prompt.format(message=message)
}],
temperature=0,
max_tokens=20
)
intent_str = response.choices[0].message.content.strip()
return Intent(intent_str)

RAG服务

app/services/rag_service.py
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA
class RAGService:
def __init__(self):
self.embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
self.vectorstore = Chroma(
persist_directory="./chroma_db",
embedding_function=self.embeddings
)
self.llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
self.qa_chain = RetrievalQA.from_chain_type(
llm=self.llm,
chain_type="stuff",
retriever=self.vectorstore.as_retriever(search_kwargs={"k": 3}),
return_source_documents=True
)
def query(self, question: str) -> dict:
result = self.qa_chain({"query": question})
return {
"answer": result["result"],
"sources": [doc.metadata for doc in result["source_documents"]]
}

主服务

app/main.py
from fastapi import FastAPI, Depends
from app.routers import chat, health
from app.services.intent_classifier import IntentClassifier, Intent
from app.services.rag_service import RAGService
from app.services.order_service import OrderService
from app.utils.cache import Cache
app = FastAPI(title="Smart Customer Service")
# 初始化服务
classifier = IntentClassifier()
rag_service = RAGService()
order_service = OrderService()
cache = Cache()
@app.post("/chat")
async def chat(message: str, user_id: str):
# 1. 检查缓存
cached = cache.get(f"chat:{user_id}:{message}")
if cached:
return {"response": cached, "cached": True}
# 2. 意图分类
intent = classifier.classify(message)
# 3. 路由处理
if intent == Intent.PRODUCT_INQUIRY:
result = rag_service.query(message)
response = result["answer"]
elif intent == Intent.ORDER_QUERY:
response = order_service.handle_query(message, user_id)
elif intent == Intent.RETURN_REQUEST:
response = order_service.handle_return(message, user_id)
else:
# 通用处理或转人工
response = "抱歉,我暂时无法回答这个问题。正在为您转接人工客服..."
# 4. 缓存结果
cache.set(f"chat:{user_id}:{message}", response, ttl=3600)
return {
"response": response,
"intent": intent.value,
"cached": False
}

4.4 测试与评估#

测试用例

tests/test_intent.py
import pytest
from app.services.intent_classifier import IntentClassifier, Intent
class TestIntentClassifier:
def test_product_inquiry(self):
classifier = IntentClassifier()
assert classifier.classify("这个手机多少钱") == Intent.PRODUCT_INQUIRY
assert classifier.classify("这款衣服有L码吗") == Intent.PRODUCT_INQUIRY
assert classifier.classify("产品有什么颜色") == Intent.PRODUCT_INQUIRY
def test_order_query(self):
classifier = IntentClassifier()
assert classifier.classify("我的订单到哪了") == Intent.ORDER_QUERY
assert classifier.classify("查一下订单123456") == Intent.ORDER_QUERY
def test_return_request(self):
classifier = IntentClassifier()
assert classifier.classify("我想退货") == Intent.RETURN_REQUEST
assert classifier.classify("衣服不合适,怎么换货") == Intent.RETURN_REQUEST

评估脚本

scripts/evaluate.py
import json
from app.main import app
from sklearn.metrics import accuracy_score, precision_recall_fscore_support
def evaluate_intent_classification():
"""评估意图分类准确率"""
test_data = json.load(open("tests/intent_test_data.json"))
y_true = []
y_pred = []
for item in test_data:
pred = classifier.classify(item["message"])
y_true.append(item["expected_intent"])
y_pred.append(pred.value)
accuracy = accuracy_score(y_true, y_pred)
precision, recall, f1, _ = precision_recall_fscore_support(
y_true, y_pred, average='weighted'
)
print(f"准确率: {accuracy:.2%}")
print(f"精确率: {precision:.2%}")
print(f"召回率: {recall:.2%}")
print(f"F1分数: {f1:.2%}")
def evaluate_rag_quality():
"""评估RAG回答质量"""
test_data = json.load(open("tests/rag_test_data.json"))
correct = 0
for item in test_data:
result = rag_service.query(item["question"])
# 人工或自动评估
if is_answer_correct(result["answer"], item["expected_answer"]):
correct += 1
print(f"RAG准确率: {correct/len(test_data):.2%}")

4.5 部署与运维#

Dockerfile

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

docker-compose.yml

version: '3.8'
services:
api:
build: .
ports:
- "8000:8000"
environment:
- OPENAI_API_KEY=${OPENAI_API_KEY}
depends_on:
- redis
- chroma
redis:
image: redis:alpine
ports:
- "6379:6379"
chroma:
image: chromadb/chroma
ports:
- "8001:8000"
volumes:
- chroma_data:/chroma/data
volumes:
chroma_data:

五、评估与监控#

5.1 评估指标体系#

┌─────────────────────────────────────────────────────────────┐
│ 评估指标体系 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 在线指标(实时监控): │
│ ├── 响应延迟:P50 < 1s, P95 < 3s │
│ ├── 成功率:> 99% │
│ ├── QPS:峰值处理能力 │
│ └── 错误率:< 1% │
│ │
│ 离线指标(定期评估): │
│ ├── 意图分类准确率:> 90% │
│ ├── 回答准确率:> 85% │
│ ├── 用户满意度:> 4.0/5.0 │
│ └── 转人工率:< 15% │
│ │
│ 业务指标: │
│ ├── 问题解决率 │
│ ├── 平均对话轮数 │
│ ├── 用户留存率 │
│ └── 成本/查询 │
│ │
└─────────────────────────────────────────────────────────────┘

5.2 监控告警#

prometheus_rules.yml
groups:
- name: ai-service
rules:
- alert: HighLatency
expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 3
for: 5m
annotations:
summary: "响应延迟过高"
- alert: HighErrorRate
expr: rate(http_requests_total{status="500"}[5m]) / rate(http_requests_total[5m]) > 0.01
for: 5m
annotations:
summary: "错误率过高"
- alert: HighCost
expr: rate(llm_token_cost_total[1h]) > 100
for: 1h
annotations:
summary: "LLM调用成本过高"

六、安全与合规#

6.1 安全措施#

mindmap root((1. 数据安全)) 敏感信息脱敏(手机号、地址) 数据传输加密(HTTPS) 日志脱敏 数据保留策略 2. 应用安全 认证鉴权 限流防刷 输入验证 SQL/命令注入防护 3. AI安全 Prompt注入防护 输出内容审核 幻觉检测 来源追溯

6.2 合规考量#

mindmap root((1. 数据合规)) 个人信息保护法(PIPL) 数据本地化存储 用户授权同意 2. 内容合规 违禁词过滤 敏感话题识别 内容审核机制 3. 行业合规 金融行业:数据隔离 医疗行业:专业审核 电商行业:消费者保护

常见问题 FAQ#

Q1: 如何选择框架?

A:

  • 快速原型:LangChain
  • 知识库应用:LlamaIndex
  • 企业集成:Semantic Kernel
  • 追求灵活:直接用SDK

Q2: 如何评估AI应用效果?

A:

  • 建立评估基准(测试集)
  • 多维度指标(准确率、满意度、成本)
  • 定期评估迭代
  • A/B测试不同方案

Q3: 如何控制成本?

A:

  • 选择合适模型(小模型优先)
  • 使用缓存策略
  • 监控Token消耗
  • 批量处理非实时任务

Q4: 有哪些安全风险?

A:

  • 数据泄露:敏感信息保护
  • Prompt注入:输入过滤
  • 幻觉输出:内容审核
  • 恶意使用:权限控制

Q5: 如何处理模型升级?

A:

  • 保持API版本兼容
  • 新模型先灰度测试
  • 监控效果变化
  • 准备回滚方案

小结#

构建AI应用的关键:

  1. 选择合适的架构模式:Generator/Orchestrator/Interface/RAG
  2. 技术栈匹配场景:框架、数据库、模型
  3. 工程化保障稳定性:Prompt管理、监控、测试
  4. 从简单开始,逐步迭代:先MVP,再优化

AI应用开发不是一次性工程,而是持续优化的过程。


下篇预告#

通用模型不够用?需要定制专属能力?


参考资料#

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

构建你的第一个AI应用:架构与工程实践
https://blog.souloss.com/posts/machine-learning/llm/build-ai-application/
作者
Souloss
发布于
2026-01-26
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时