背景痛点规则引擎为何“听不懂人话”过去两年我维护过一套基于正则关键词的客服系统。用户问“我昨天买的手机能退吗”规则要写“退|退货|退款|能不能退”一旦用户换成“想把手上的新机退了”规则立刻抓瞎。更糟的是多轮对话用户先问“运费谁出”再问“那要是七天外呢”上下文一丢答案全靠猜。结果客服同学每天仍要人工兜底 60% 的咨询量。LLM 的出现把“写规则”变成了“读语义”。它能把“想把手上的新机退了”自动映射到“退货政策”意图还能记住前面的“运费”话题给出连贯回答。对开发团队来说最大收益是把维护上万条正则的成本变成维护一段自然语言 prompt。技术选型OpenAI、Claude 还是本地 LLM我花两周跑了三组对比实验结论直接放表维度OpenAI GPT-3.5Claude 3 Haiku本地 7B 量化首 token 延迟ms600-900400-600120-200每 1k 会话成本$0.002$0.001电费≈0数据隐私出公网出公网完全本地开发速度最快快需 GPU 运维上下文长度4k200k8k可扩展选型建议冷启动、无 GPU直接 OpenAI两周就能上线。对数据出境敏感用 Claude再通过 AWS Bedrock 做 VPC Endpoint。日均百万轮以上租 A100 本地部署成本可降到原来的 1/10。核心实现Python 搭一套最小可用框架下面代码全部跑通 Python 3.10依赖仅openai1.0和redis。1. 会话 ID 生成与上下文缓存import uuid import redis from typing import Dict, List r redis.Redis(hostlocalhost, decode_responsesTrue) def get_session_id() - str: return uuid.uuid4().hex def save_turn(sid: str, role: str, content: str, ttl: int 3600) - None: key fchat:{sid} r.lpush(key, f{role}:{content}) r.expire(key, ttl) def load_history(sid: str) - List[Dict[str, str]]: key fchat:{sid} items r.lrange(key, 0, -1) history [] for item in reversed(items): # 按时间正序 role, content item.split(:, 1) history.append({role: spinxo role, content: content}) return history2. 带退避机制的 API 调用封装import openai import time from typing import List, Dict client openai.OpenAI() def chat_with_backoff(messages: List[Dict[str, str]], max_retry: int 5) - str: for attempt in range(1, max_retry 1): try: rsp client.chat.completions.create( modelgpt-3.5-turbo, messagesmessages, temperature0.3, max_tokens300 ) return rsp.choices[0].message.content except openai.RateLimitError as e: wait 2 ** attempt time.sleep(wait) except Exception as e: raise RuntimeError(fLLM call failed: {e}) from e raise RuntimeError(Exceed max retry)3. 意图识别 prompt 模板intent_prompt 你是客服意图识别器只输出 JSON不解释。 用户问题{question} 可选意图[退货政策, 运费说明, 优惠券, 账号安全, 其他] {intent: 退货政策} 把intent_prompt.format(questionmsg)塞进messages里LLM 会返回干净 JSON后续用json.loads即可。生产考量并发、安全都不能省1. 性能压测我用 locust 起 100 并发脚本里每次随机拿 200 条真实对话。结果平均延迟 780 msP95 1.2 s错误率 0.8%全部来自限流触发退避优化手段把 Redis 换成 6 GB 连接池rps 从 1200 提到 3200在网关层做 20 次/秒令牌桶减少打到 LLM 的突发2. 安全方案敏感词过滤先过一遍本地 DFA 树100 μs 内完成日志脱敏写文件前用正则把手机、邮箱、身份证打码返回侧再扫一次防止模型幻觉泄露内部知识避坑指南血泪经验总结1. 上下文长度超限场景用户聊了 50 轮token 数飙到 3.8kGPT-3.5 直接截断。解决对历史消息做滑窗保留最近 6 轮 系统摘要摘要由 LLM 自己生成100 token 概括前面所有关键信息实测意图准确率不掉2. 模型幻觉回答现象用户问“你们卖苹果吗”模型答“有的红富士农场直采”。实际我们只做 3C。检测让 LLM 先输出{confidence: 0.85}低于 0.7 走兜底话术答案里出现品牌词必须命中后台 SKU 白名单否则触发“暂未提供转人工”纠正把官方文档切成 512 token 块做向量索引检索 Top3 相关段落塞进 prompt实测幻觉率从 12% 降到 2%代码规范小结全项目强制black isortCI 里跑flake8 --max-line-length 88所有函数写类型标注public 函数加Raises声明网络、磁盘、LLM 三类异常分别捕获日志用extra{sid: sid}便于追踪开放问题如何平衡大模型成本与响应速度我把 Claude 换到 Haiku 后成本降一半但平均延迟仍比 GPT-3.5 高 200 ms本地 7B 模型速度飞起却需要常备 GPU。你的业务场景会怎么选是“小而快”的本地量化还是“贵但稳”的云上 API欢迎留言聊聊你们的折中方案。