8. 性能与成本
8.1 弹性伸缩
伸缩策略
智能客服系统需要根据负载自动伸缩,确保服务稳定和成本优化:
水平伸缩(Horizontal Scaling)
自动伸缩规则:
- CPU使用率:>70%时扩容,<30%时缩容
- 内存使用率:>80%时扩容,<40%时缩容
- 请求队列长度:>100时扩容,<10时缩容
- 响应时间:P95>1000ms时扩容
Kubernetes HPA配置:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: customer-service-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: customer-service
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 50
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 15
- type: Pods
value: 4
periodSeconds: 15
selectPolicy: Max
垂直伸缩(Vertical Scaling)
资源调整规则:
- 根据历史负载预测资源需求
- 在业务高峰期前提前扩容
- 在业务低峰期自动缩容
VPA配置:
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: customer-service-vpa
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: customer-service
updatePolicy:
updateMode: "Auto"
resourcePolicy:
containerPolicies:
- containerName: customer-service
minAllowed:
cpu: 100m
memory: 128Mi
maxAllowed:
cpu: 4
memory: 8Gi
资源调度
调度策略
节点选择:
- GPU节点:用于AI模型推理
- CPU节点:用于业务逻辑处理
- 内存优化节点:用于缓存服务
Pod调度:
apiVersion: v1
kind: Pod
spec:
nodeSelector:
node-type: gpu
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
containers:
- name: ai-model
resources:
requests:
nvidia.com/gpu: 1
limits:
nvidia.com/gpu: 1
资源优化
资源请求和限制:
- 合理设置requests和limits
- 避免资源浪费
- 确保服务稳定性
多租户隔离:
- 使用命名空间隔离不同租户
- 设置资源配额
- 防止资源争抢
成本优化
成本优化策略
1. 使用Spot实例
- 非关键服务使用Spot实例
- 成本降低60-90%
- 需要容忍中断
2. 预留实例
- 长期稳定负载使用预留实例
- 成本降低30-50%
- 需要提前规划
3. 自动休眠
- 低峰期自动休眠非关键服务
- 节省计算资源
- 需要快速唤醒机制
4. 模型选择优化
- 简单问题使用低成本模型
- 复杂问题使用高性能模型
- 平衡成本和效果
8.2 缓存策略
缓存设计
多级缓存架构
1. CDN缓存
- 缓存静态资源(JS、CSS、图片)
- 缓存常见问题的回答
- 减少服务器压力
2. 应用缓存(本地缓存)
- 缓存热点数据
- 缓存用户会话
- 减少网络请求
3. Redis缓存(分布式缓存)
- 缓存知识库检索结果
- 缓存模型推理结果
- 缓存用户对话 历史
缓存策略
1. 常见问题缓存
- Key:问题文本的MD5
- Value:标准回答
- TTL:24小时
- 更新策略:知识库更新时清除
2. 知识检索结果缓存
- Key:查询文本 + 知识库版本
- Value:检索到的文档列表
- TTL:1小时
- 更新策略:知识库更新时清除
3. 模型推理结果缓存
- Key:问题 + 上下文 + 模型版本
- Value:生成的回答
- TTL:根据问题类型动态调整
- 更新策略:模型更新时清除
实现示例:
import redis
import hashlib
import json
class CacheManager:
def __init__(self):
self.redis_client = redis.Redis(host='localhost', port=6379)
def get_cache_key(self, question, context=None):
key_data = {
"question": question,
"context": context or "",
"kb_version": self.get_kb_version()
}
key_str = json.dumps(key_data, sort_keys=True)
return f"answer:{hashlib.md5(key_str.encode()).hexdigest()}"
def get_answer(self, question, context=None):
cache_key = self.get_cache_key(question, context)
cached = self.redis_client.get(cache_key)
if cached:
return json.loads(cached)
return None
def set_answer(self, question, answer, context=None, ttl=3600):
cache_key = self.get_cache_key(question, context)
self.redis_client.setex(
cache_key,
ttl,
json.dumps(answer)
)