共计 1806 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点:为什么 Agent 开发面试容易翻车?
最近辅导了不少准备 Agent 开发岗位面试的同学,发现大家常在这些地方栽跟头:

- 状态机理解不扎实 :很多同学能画出状态转移图,但被问到 ” 用户突然打断当前流程怎么办 ” 时就卡壳
- 多轮对话边界模糊 :比如用户先说 ” 订机票 ” 又改口 ” 算了还是查天气 ”,系统该如何优雅降级
- 过度关注准确率 :在介绍项目时只提意图识别 F1 值,却说不清实际业务中的 fallback 处理策略
有个典型案例:候选人 A 在演示订餐机器人时,当用户输入 ” 不要辣但微麻 ”,系统直接报错——这就是典型的实体冲突处理缺失。
技术对比:三大框架到底怎么选?
面试官常会问 ” 为什么选 Rasa 不选 Dialogflow”,这里有个功能对比表供参考:
| 能力维度 | Rasa | Dialogflow | LangChain |
|---|---|---|---|
| 意图识别 | 自定义 ML 模型 | 预训练 + 微调 | 连接 LLM |
| 实体抽取 | CRF+ 正则 | 系统实体 | 函数调用 |
| 对话管理 | 状态机 + 策略 | 线性流程 | 链式组合 |
| 定制化程度 | 高 | 低 | 中 |
选择建议 :
1. 需要快速上线选 Dialogflow
2. 复杂业务逻辑用 Rasa
3. 想结合大模型能力考虑 LangChain
核心实现:两个关键代码示例
状态机对话控制(Python)
class BookingFSM:
def __init__(self):
self.state = 'IDLE' # 初始状态
def transition(self, user_input):
if self.state == 'IDLE':
if '预订' in user_input:
self.state = 'COLLECTING_INFO'
return "请问要预订什么?"
elif self.state == 'COLLECTING_INFO':
if '机票' in user_input:
self.state = 'FLIGHT_DETAILS'
return "请说出出发地和目的地"
elif '酒店' in user_input:
self.state = 'HOTEL_DETAILS'
return "需要几星级的?"
# 其他状态转移...
# 默认 fallback
return "抱歉我没听懂,能再说一遍吗?"
BERT 意图分类(PyTorch)
from transformers import BertTokenizer, BertForSequenceClassification
# 加载预训练模型
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertForSequenceClassification.from_pretrained(
'bert-base-chinese',
num_labels=5 # 假设有 5 种意图
)
# 预测函数
def predict_intent(text):
inputs = tokenizer(text, return_tensors="pt")
outputs = model(**inputs)
predicted_class = outputs.logits.argmax().item()
return ['查询', '预订', '取消', '投诉', '其他'][predicted_class]
生产环境必须考虑的工程问题
- 并发处理 :
- 使用会话 ID 隔离不同用户状态
- Redis 存储临时对话上下文
-
考虑引入消息队列削峰
-
超时管理 :
from datetime import datetime, timedelta class Session: def __init__(self): self.last_active = datetime.now() def is_expired(self): return datetime.now() > self.last_active + timedelta(minutes=5) -
敏感词过滤 :建议使用 DFA 算法实现高效匹配
新手常踩的三大坑
- 硬编码流程 :
- 错误做法:用 if-else 处理所有分支
-
正确做法:将流程配置化,支持动态加载
-
上下文丢失 :
- 典型症状:用户问 ” 刚才说的那家店 ” 时系统失忆
-
解决方案:持久化最近 3 轮对话
-
过度依赖准确率 :
- 要记住:生产环境中 85% 的准确率 + 完善的 fallback
好过 95% 准确率但遇到异常就崩溃
留给读者的思考题
当我们需要设计一个支持语音 + 图像 + 文本的多模态 Agent 时:
1. 应该如何统一不同模态的输入表示?
2. 多模态之间的注意力机制如何设计?
3. 如何平衡模型复杂度与实时性要求?
期待大家在评论区分享自己的设计方案~
正文完
