北京时间:2026年4月10日 | 目标读者:技术进阶者、学生、面试备考者、开发工程师
定位:技术科普 + 原理讲解 + 代码示例 + 面试要点 | 风格:由浅入深、通俗易懂
一、开篇引入

ai助手订外卖正成为智能生活与对话式AI落地的典型场景——用户只需对手机说“帮我点份宫保鸡丁”,系统就能自动完成选店、下单、支付。许多学习者只会调用现成接口,不懂背后的意图识别、实体抽取与流程编排,面试时被问到“如何设计一个订外卖对话系统”便无从下手。本文将从痛点出发,讲解核心概念、代码示例、底层原理,并附高频面试题,帮你建立完整的知识链路。
本文为「对话式AI实战」系列第一篇,后续将深入多轮对话状态机与微调技巧。

二、痛点切入:为什么需要AI助手订外卖?
传统订外卖流程需要用户手动打开App、、筛选、加购、填写地址、支付,共7~8步。代码上通常用硬编码分支实现:
传统方式:if-else堆砌 def order_food(user_input): if "宫保鸡丁" in user_input: search("宫保鸡丁") if "辣" in user_input: filter_spicy() if "便宜" in user_input: filter_price() ... 无穷无尽的规则
缺点:
耦合高:业务规则与代码逻辑揉在一起,改一个条件要改多处。
扩展性差:新增“少糖”“加急配送”等需求需大量修改if-else。
维护困难:规则组合爆炸,易遗漏边界情况。
因此需要基于AI的智能助手,用自然语言理解(NLU)和对话管理(DM)替代硬编码规则。
三、核心概念讲解:意图识别(Intent Recognition)
定义:Intent Recognition(意图识别)是判断用户一句话背后“想做什么”的任务。在ai助手订外卖中,意图可以是 order_food(点餐)、track_order(查单)、cancel_order(取消)等。
关键词拆解:
意图:用户的目的,而非字面内容。如“帮我整个盖浇饭”意图仍是点餐。
识别:从自然语言中分类,通常转化为多分类问题。
生活化类比:你去餐厅对服务员说“来份炒饭”,服务员立刻知道你是“点菜”而不是“结账”或“投诉”——这就是意图识别。
作用与价值:将无限的自由文本映射到有限的业务动作,是对话系统入口的“交通指挥员”。
四、关联概念讲解:实体抽取(Entity Extraction)
定义:Entity Extraction(实体抽取)是从用户话术中提取关键信息片段,如菜品名、数量、口味、地址等。
与意图识别的关系:
意图识别决定“做什么”(Action)。
实体抽取决定“对谁做、怎么做”(Parameter)。二者共同构成自然语言理解(NLU)的核心。
对比差异:
| 维度 | 意图识别 | 实体抽取 |
|---|---|---|
| 输出 | 一个类别标签 | 多个键值对 |
| 示例 | order_food | {"dish":"宫保鸡丁", "spicy":"微辣"} |
| 技术 | 文本分类 | 序列标注(BERT+CRF) |
简单示例:用户说“两份不辣的麻婆豆腐,送科技园B座”
意图:
order_food实体:
{quantity:2, dish:"麻婆豆腐", spice:"不辣", address:"科技园B座"}
五、概念关系与区别总结
一句话记忆:意图识别决定“路由器”的出口,实体抽取负责“打包数据包”。
逻辑关系:意图是“整体目标”,实体是“局部参数”;意图识别先定方向,实体抽取再填细节。
协作流程:用户输入 → 意图识别(分类)→ 根据意图调用对应的实体抽取模板 → 得到结构化指令。
六、代码/流程示例:极简AI助手订外卖核心逻辑
以下示例使用规则+轻量模型(为突出核心,用正则模拟意图识别,真实场景可用BERT)。展示从输入到执行的全流程。
import re 模拟意图识别(实际可用分类模型) def recognize_intent(text): if re.search(r'点|来份|要个|订', text): return "order_food" elif re.search(r'查|订单|到哪了', text): return "track_order" else: return "unknown" 模拟实体抽取(正则+关键词) def extract_entities(text, intent): entities = {} if intent == "order_food": 提取菜品(简单匹配预设列表) dish_match = re.search(r'(宫保鸡丁|麻婆豆腐|盖浇饭)', text) if dish_match: entities["dish"] = dish_match.group(1) 提取数量 num_match = re.search(r'(\d+)份', text) if num_match: entities["quantity"] = int(num_match.group(1)) else: entities["quantity"] = 1 提取口味 if "不辣" in text: entities["spice"] = "不辣" elif "微辣" in text: entities["spice"] = "微辣" return entities 执行订外卖(模拟API调用) def execute_order(entities): print(f"📦 正在订餐:{entities.get('quantity',1)}份 {entities.get('dish')},口味:{entities.get('spice','默认')}") 实际此处调用外卖平台开放API(美团/饿了么) return {"order_id": "202604100001", "status": "success"} 主流程 user_input = "帮我点两份微辣的宫保鸡丁" intent = recognize_intent(user_input) if intent == "order_food": entities = extract_entities(user_input, intent) result = execute_order(entities) print(f"✅ 下单成功,订单号:{result['order_id']}") else: print("暂不支持该意图")
执行输出:
📦 正在订餐:2份 宫保鸡丁,口味:微辣 ✅ 下单成功,订单号:202604100001
新旧对比:传统if-else需要为每个菜品、每个口味写分支;而AI方式只需维护意图列表和实体抽取规则(或模型),扩展新菜品只需更新菜品词表,改进效果显著。
七、底层原理/技术支撑
ai助手订外卖背后依赖两大基础技术:
自然语言处理中的预训练模型(如BERT、GPT)
意图识别本质是文本分类,BERT通过
[CLS]向量接softmax即可得到意图概率。实体抽取采用BERT+CRF:BERT提供上下文相关的字向量,CRF学习标签间的转移约束(如“B-dish”后不能直接跟“I-address”)。
对话状态机与API编排
多轮对话需要维护状态图(例如:缺菜品→追问菜品;缺地址→询问地址)。
底层使用Redis缓存会话状态,通过RESTful API调用外卖平台(美团/饿了么开放接口)。
深度原理(如Transformer注意力机制、CRF损失函数)将在系列后续文章中展开,本文先做定位。
八、高频面试题与参考答案
Q1:请简述AI助手订外卖系统中,意图识别和实体抽取的区别与联系。
参考答案:
区别:意图识别是文本分类任务,输出单个标签(如
order_food);实体抽取是序列标注任务,输出多个键值对(如菜品、数量)。联系:两者共同构成NLU模块;意图识别为实体抽取提供上下文约束(例如
order_food意图下才抽取菜品实体),实体抽取的结果又用于执行具体业务逻辑。
踩分点:任务类型不同 + 协作流程 + 举例说明。
Q2:如何应对用户输入中“缺实体”的情况(比如只说“点个菜”)?
参考答案:采用对话状态机 + 槽位填充。系统先定义必填槽位(菜品、地址等),当识别到order_food意图后检查槽位,缺失则主动反问:“您想点什么菜?”。使用Redis存储当前会话的已填充槽位,直到所有必填槽位完整再调用下单API。
Q3:在实际ai助手订外卖中,如何保证实体抽取的准确率?
参考答案:
使用预训练模型(BERT)微调实体抽取任务,并加入CRF层。
构建领域词典(菜品名、口味词)做规则后修正。
针对混淆案例(如“鱼香肉丝”被拆成“鱼”“香肉丝”)增加数据增强。
引入上下文窗口:上一轮说“不要辣”,本轮说“宫保鸡丁”则继承口味实体。
九、结尾总结
本文围绕ai助手订外卖这一典型场景,讲解了:
✅ 痛点:硬编码规则维护难 → 引入NLU。
✅ 核心概念:意图识别(做什么)与实体抽取(填参数)。
✅ 关系:分类 vs 序列标注,先意图后实体。
✅ 代码示例:从正则模拟到可运行的订餐流程。
✅ 底层原理:BERT+CRF支撑识别,状态机+API完成执行。
✅ 面试考点:区别联系、缺实体处理、准确率提升。
重点与易错点:不要把意图识别和实体抽取混为一谈;实际工程中必须处理多轮对话的槽位继承;面试时强调“状态机”和“预训练模型”是加分项。
下一篇预告:深入多轮对话中的对话状态跟踪(DST),用Transformer实现可插拔的槽位填充模块。欢迎关注!
本文所有代码基于Python 3.9+,可复制运行。外卖平台接口需替换真实token。