共计 3744 个字符,预计需要花费 10 分钟才能阅读完成。
从传统方案到现代架构的进化
去年我们团队接手了一个银行智能客服升级项目,原系统基于正则表达式 + 规则引擎,每次业务变更都需要:

- 人工编写 300+ 条新规则
- 测试周期长达 2 周
- 线上误判率高达 18%
另一个电商客户用纯 GPT-3.5 实现的客服系统,虽然意图识别灵活,但存在:
- 单次响应延迟经常超过 5 秒
- 会话状态丢失率 23%
- 每月 API 调用成本超 $8000
这些痛点催生了我们现在的混合架构方案。
技术选型三维度对比
规则引擎方案
- 优点:确定性高、调试直观
- 缺点:维护成本指数增长
- 适用场景:业务流程固定的简单场景
LLM+ 微服务架构
- 优点:灵活可扩展、迭代速度快
- 缺点:需要设计状态管理
- 适用场景:中复杂度动态业务
端到端神经架构
- 优点:端到端优化潜力大
- 缺点:数据需求量大、黑箱调试难
- 适用场景:研究性质项目
我们选择 LLM+ 微服务架构,因其在可维护性和灵活性间取得最佳平衡。
核心实现三层架构
意图识别层设计
采用 BERT-base 微调 + 业务规则兜底的混合方案:
# 基于 HuggingFace 的意图分类器
from transformers import AutoTokenizer, AutoModelForSequenceClassification
class IntentClassifier:
def __init__(self):
self.tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
self.model = AutoModelForSequenceClassification.from_pretrained("./fine-tuned-model")
def predict(self, text):
inputs = self.tokenizer(text, return_tensors="pt")
outputs = self.model(**inputs)
return outputs.logits.argmax().item()
业务规则兜底策略:
- 当模型置信度 <80% 时触发规则引擎
- 高频问题配置强匹配规则
- 新业务问题自动进入人工审核队列
决策引擎实现
用有限状态机 (FSM) 管理对话流程:
from transitions import Machine
class ConversationFSM:
states = ['init', 'collecting_info', 'processing', 'confirmation', 'completed']
def __init__(self):
self.machine = Machine(
model=self,
states=self.states,
initial='init',
ignore_invalid_triggers=True
)
# 添加状态转移规则
self.machine.add_transition('start', 'init', 'collecting_info')
self.machine.add_transition('submit', 'collecting_info', 'processing')
self.machine.add_transition('confirm', 'confirmation', 'completed')
动作执行器设计
使用 Celery+Redis 实现异步任务:
from celery import Celery
from celery.schedules import crontab
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task(bind=True, max_retries=3)
def execute_action(self, action_type, params):
try:
if action_type == 'refund':
process_refund(params)
elif action_type == 'query':
return query_database(params)
except Exception as exc:
self.retry(exc=exc, countdown=60)
完整接口实现示例
FastAPI 主服务
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@app.post("/chat")
async def chat_endpoint(
message: str,
session_id: str,
token: str = Depends(oauth2_scheme)
):
# JWT 验证逻辑
if not validate_token(token):
raise HTTPException(status_code=401, detail="Invalid token")
# 获取或创建会话状态
state = redis.get(f"session:{session_id}") or init_state()
# 处理流程
intent = intent_classifier.predict(message)
next_state = fsm.transition(state, intent)
task = execute_action.delay(intent, message)
# 保存状态
redis.setex(f"session:{session_id}", 3600, next_state)
return {"task_id": task.id, "state": next_state}
Redis 会话管理
import redis
from datetime import timedelta
redis_pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
redis = redis.Redis(connection_pool=redis_pool)
class SessionManager:
@staticmethod
def save_context(session_id, context, ttl=3600):
redis.setex(name=f"session:{session_id}",
time=timedelta(seconds=ttl),
value=json.dumps(context)
)
@staticmethod
def load_context(session_id):
data = redis.get(f"session:{session_id}")
return json.loads(data) if data else None
性能优化实战
负载测试数据
使用 Locust 进行压力测试(4 核 8G 云主机):
| 并发数 | 平均响应时间 | 错误率 |
|---|---|---|
| 100 | 238ms | 0% |
| 500 | 417ms | 0.2% |
| 1000 | 892ms | 1.5% |
优化手段:
- Redis 管道技术减少网络往返
- 预加载 BERT 模型到 GPU
- Celery 工作进程动态扩展
状态持久化策略
采用二级存储方案:
- 热数据:Redis 内存存储(TTL 1 小时)
- 温数据:MongoDB(保留 7 天)
- 冷数据:S3 归档(保留 1 年)
熔断配置示例
from circuitbreaker import circuit
@circuit(
failure_threshold=5,
recovery_timeout=60,
expected_exception=HTTPException
)
def call_external_api(url):
response = requests.get(url, timeout=3)
response.raise_for_status()
return response.json()
避坑指南
意图识别准确率提升
- 业务数据增强技巧:
- 同义词替换(” 还款 ”→” 偿还 ”)
- 句式变换(” 怎么还款 ”→” 还款方式有哪些 ”)
-
添加错别字(” 网银 ”→” 网银转帐 ”)
-
模型微调策略:
- 分层学习率:底层 1e-5,分类头 1e-4
- 困难样本挖掘:聚焦识别错误的 case
上下文长度控制
采用滑动窗口策略:
- 保留最近 3 轮对话完整内容
- 更早对话仅保留意图标签
- 超长时自动触发总结(GPT-3.5-turbo 16k)
敏感信息过滤
import re
sensitive_patterns = [r"\d{16}", # 银行卡号
r"\d{3}-?\d{2}-?\d{4}" # SSN
]
def sanitize_input(text):
for pattern in sensitive_patterns:
text = re.sub(pattern, "[REDACTED]", text)
return text
延伸思考
- 如何设计多 Agent 协作架构?考虑联邦学习 + 消息总线
- 实时学习机制如何实现?在线学习 +AB 测试框架
- 小样本场景如何优化?提示工程 +LoRA 微调
这套方案已在金融、电商领域多个项目验证,平均开发周期缩短 40%,运维成本降低 65%。关键是把复杂问题拆解为可管理的组件,在灵活性和可控性间找到平衡点。
正文完
