ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

智慧家庭聊天机器人毕设:BERT意图识别与规则回复实战指南

智慧家庭聊天机器人毕设:BERT意图识别与规则回复实战指南 简介基于深度学习的智慧家庭聊天机器人是一份可直接用于计算机毕业设计的完整项目方案面向计算机相关专业本科生、研究生及正在准备毕设答辩的学生尤其适合选择人工智能、自然语言处理或智能家居应用方向的学习者。资源包共27个文件核心包含7个Python源文件、8个pyc编译文件以及pkl模型文件、cityWeather.sql数据脚本、xml配置、README说明文档和论文doc整体大小约340.77MB代码结构清晰便于按目录查看和二次开发。项目不仅实现聊天机器人的自然语言交互还整合了微信自动回复、城市天气查询等实用功能配合论文可掌握从模型训练到系统部署的完整链路附带的300套计算机本科毕业设计题目Excel和计算机专业答辩PPT模板覆盖选题与答辩环节实用性很强。已有2706人学习下载适合需要一套可运行、可扩展的智能对话毕设资源的同学。1. 智慧家庭聊天机器人这个毕设题先搞懂它到底在做什么把智慧家庭聊天机器人当成毕业设计来做的人通常一开始想的是做一个能陪人聊天的语音助手像小爱同学那样。但真正动手后会发现精力和时间大部分消耗在模型之外的地方数据从哪来、训练环境怎么搭、答辩现场怎么保证一次跑通、论文实验数据怎么和演示效果对上。这个题目本质上是把自然语言处理和智能家居控制叠在一起属于典型的深度学习 AIoT应用型选题。我能直接给到的结论是别一上来就做端到端生成式对话那会让你在数据和效果两头都失控。用意图识别深度学习模型加上规则回复与设备动作映射是这个题里可靠运行最稳的一条链路。适合正在选题、或者已经在做但卡在效果和部署上的计算机类毕设生。这篇就把架构选型、数据标注、模型训练、本地部署、答辩前的自检顺序讲透。2. 先定架构再写代码为什么意图识别规则回复比端到端生成更稳2.1 端到端生成在毕设答辩里的三个翻车点聊天机器人最容易想到的方案是训练一个 Seq2Seq 或 Transformer 生成模型输入一句话输出一句话。这个方向在论文里写起来很漂亮但放到毕设场景里有三个非常现实的问题。第一个是数据量。生成式对话想要有基本可看的回复质量通常需要十万条以上的对话对而且领域越垂直越好。智慧家庭这个场景本身就小众公开的垂直数据集几乎找不到自己标注十万条不现实。两三千条数据训出来的生成模型回复内容会频繁出现重复、无关、答非所问。第二个是效果不可控。生成模型在采样模式下同一句话多次输入输出可能每次都不一样。答辩现场最怕的就是这个评委问一句打开客厅灯第一次回好的第二次回我不会你没法解释这是参数随机性导致的。不可控的输出在演示环节就是定时炸弹。第三个是难排查。生成模型的错误是黑匣子你很难判断是数据问题、训练问题还是解码参数问题。而毕设答辩一定会被问这个错误是怎么排查的生成式方案很难给出清晰的技术链路。相比之下分类模型的错误可以精确归因到训练集、标签或阈值设置上。所以我一般做的是把生成从主链路里拿掉只在闲聊聊天的兜底模块里留一个检索式回复。深度学习仍然在核心位置——意图识别系统的其他部分全部走可控的规则逻辑。2.2 八类家庭意图与数据流从文本到设备动作智慧家庭场景下用户指令是高度套路化的。我整理过一份意图清单毕设做到八类基本能覆盖大多数演示需求标签意图触发示例设备动作/回复light_control灯光控制打开客厅灯客厅灯设为 onac_control空调调节把空调调到26度空调目标温度设 26curtain_control窗帘控制拉开窗帘窗帘设为 openmusic_control音乐播放放一首歌进入音乐播放流程device_query设备状态查询空调现在多少度返回设备当前状态weather_query天气查询今天天气怎么样返回预设天气信息alarm_set闹钟设置明早八点叫我设定闹钟并确认chat日常闲聊你好呀检索式闲聊回复这八类意图的数据流是固定的用户文本进入预处理层先做清洗和长度截断然后交给深度学习模型做意图分类同时用词典和正则做槽位抽取设备名、动作、温度数值。分类结果和槽位一起进入回复决策层决策层查设备状态表生成最终回复。整个过程里深度学习只负责最核心的理解其余步骤全部可追踪、可调试。这个设计的好处是任何一步出错日志都能直接告诉你卡在哪。评委问你的深度学习用在哪了你可以明确回答意图识别是BERT微调模型实现的设备指令映射是规则层。模型有深度系统不失控。2.3 技术选型BERT微调、Rasa与生成式模型的取舍做过技术调研的人会知道Rasa 是专门做对话系统的开源框架生成式方案则有 GPT 系列可以用。那为什么毕设我仍然推荐自己训练一个 BERT 分类模型Rasa 的优点是组件齐全但它是一个大框架NLU 管道、故事文件、动作服务器、自定义组件一套下来学习成本高而且答辩时很容易被连环追问框架内部原理。自己用 BERT 微调一个分类器代码量不大原理清楚出问题能自己修。GPT 生成则前面已经说过数据量和可控性都是门槛。比较下来BERT 微调方案在三个维度上最平衡工作量可控核心代码就几百行、技术点突出预训练模型微调是深度学习里非常成熟的方向、答辩容错率高每个模块都能单独演示和解释。选型这件事没有绝对对错但毕设的评分逻辑决定了评委更看重你把某个点做透了吗而不是你用了多少框架。3. 数据集与意图设计标注规范、样本规模与训练集切分3.1 意图标签表与槽位规则让开灯和调空调分得清意图标签确定了接下来要解决的是标注规范。训练数据的每一行都应该遵循文本 标签的结构槽位不参与训练而是交给推理阶段的规则去抽取。这样标注工作量小模型也更容易收敛。槽位抽取用词典加正则就够了。设备词典放在一个列表里比如 [客厅灯, 卧室灯, 空调, 窗帘, 电视, 风扇]动作词典分两组开类包括 打开/开开/启动/开启关类包括 关闭/关上/关掉。温度数值用正则\d直接提取再结合调高/调低/调到这些词判断设置目标。这套规则对家庭指令的覆盖已经很可靠而且每一类意图抽什么槽位是预设好的不会出现模型乱填槽的情况。训练阶段要注意标签和中文文本的映射关系。我习惯把标签存成字符串在训练脚本里统一转成整型索引并且把label_names列表单独保存为文件。这个列表在训练、评估、导出 ONNX、部署推理四个环节都要用到顺序一旦不一致推理结果就会整体错位。3.2 每类意图多少样本才够规模估算与数据增强短文本分类任务对数据量的要求没那么恐怖。每个意图 300 到 500 条样本八类一共三千条左右已经能训出一个在演示场景下比较稳定的模型。关键不在总量而在每类的均衡程度。最忌讳的是天气查询写了一千条灯光控制只写五十条模型会对少数类严重偏置。写样本时要注意覆盖口语变化。比如灯光控制不能只写打开灯还要写把灯开一下灯打开亮一点把客厅的灯开着这类日常说法。我给自己的要求是每类至少包含五种句式变体每个变体再扩展出设备名差异和语序差异。数据不够就做增强。常见做法是同义词替换和插入语气词例如把打开换成开开把把空调调到26度扩展成帮我吧空调调到26度和空调设成26度。增强不用做太多每类控制在 1.5 倍以内过多反而会让模型学到重复模式。3.3 构建数据集的Python脚本清洗、去重、切分一次完成数据准备的落地方式是这样的先把所有样本按文本 \t 标签的格式写进一个 raw.txt然后跑下面的脚本一次性完成清洗、去重和切分。import json import random from collections import Counter def clean_text(text): text text.strip().replace(\n, ).replace(\u3000, ) # 统一全角半角标点避免影响后续分词和编码 text text.replace(, ,).replace(。, .).replace(, ?).replace(, !) return text def build_dataset(raw_path, out_dir, val_ratio0.1, test_ratio0.1, seed42): random.seed(seed) # 固定随机种子保证每次切分结果一致 samples [] for line in open(raw_path, encodingutf-8): parts line.strip().split(\t) if len(parts) ! 2: continue text clean_text(parts[0]) label parts[1].strip() if text and label: samples.append({text: text, label: label}) # 去重同一句话只保留一条 samples list({s[text] \t s[label]: s for s in samples}.values()) random.shuffle(samples) n len(samples) n_val int(n * val_ratio) n_test int(n * test_ratio) train samples[n_val n_test:] val samples[:n_val] test samples[n_val:n_val n_test] for name, data in zip([train, val, test], [train, val, test]): with open(f{out_dir}/{name}.json, w, encodingutf-8) as f: json.dump(data, f, ensure_asciiFalse, indent2) # 打印整体标签分布检查是否有类别严重不均衡 print(Counter([s[label] for s in samples]))这段脚本的逻辑是读取原始文本行按 Tab 分离文本和标签清洗后按文本标签的组合去重然后乱序切分成训练集、验证集和测试集。最后打印的标签分布非常重要如果发现某类样本数不到 200就应该回去补数据而不是直接开训。参数说明val_ratio和test_ratio默认都是 0.1即每一类都会分 10% 出来做验证、10% 做测试seed42固定随机种子保证重新跑脚本得到的切分结果一致这对论文实验的可复现性很关键。输出的三份 JSON 文件就是后续训练脚本的输入。4. 用BERT微调意图分类模型训练、评估与ONNX导出4.1 环境准备与训练脚本主干训练环境建议分两套机器训练机可以没有 GPU因为三千条数据在 CPU 上也能跑完只是慢一些演示机则只需要部署用的运行库不需要完整训练环境。这个分离策略在后面避坑章节还会细说。核心依赖就几样torch、transformers、scikit-learn、onnxruntime、flask。安装时用requirements.txt锁版本训练机和部署机分开写部署机不需要 torch。训练脚本的主干部分是这样的import json import random import numpy as np import torch from torch.utils.data import Dataset, DataLoader from transformers import BertTokenizer, BertForSequenceClassification, AdamW class IntentDataset(Dataset): def __init__(self, json_path, tokenizer, max_len32): self.data json.load(open(json_path, encodingutf-8)) self.tokenizer tokenizer self.max_len max_len def __len__(self): return len(self.data) def __getitem__(self, idx): item self.data[idx] encoded self.tokenizer( item[text], max_lengthself.max_len, truncationTrue, paddingmax_length, return_tensorspt ) return { input_ids: encoded[input_ids].squeeze(0), attention_mask: encoded[attention_mask].squeeze(0), token_type_ids: encoded[token_type_ids].squeeze(0), labels: torch.tensor(int(item[label])) } def set_seed(seed): random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) set_seed(42) tokenizer BertTokenizer.from_pretrained(bert-base-chinese) model BertForSequenceClassification.from_pretrained( bert-base-chinese, num_labels8 )这个 Dataset 类的设计逻辑是从 JSON 读数据Tokenizer 把文本编码成 BERT 需要的三个输入张量。paddingmax_length把所有样本统一填充到 max_len 长度这样后面导出 ONNX 时输入形状直接固定省去动态轴的很多麻烦。参数说明max_len32对家庭指令完全够用你见过几句话说超过 50 个字的开关灯命令设太大会浪费计算资源CPU 推理时延迟明显上升。num_labels8必须和上一章 label_names 的长度一致这是训练和推理对齐的第一道关口。训练循环部分train_loader DataLoader( IntentDataset(data/train.json, tokenizer), batch_size16, shuffleTrue ) val_loader DataLoader( IntentDataset(data/val.json, tokenizer), batch_size16, shuffleFalse ) optimizer AdamW(model.parameters(), lr2e-5) model.train() for epoch in range(5): total_loss 0 for batch in train_loader: outputs model(**batch) # 除了labels其余都是模型输入 loss outputs.loss loss.backward() optimizer.step() optimizer.zero_grad() total_loss loss.item() print(fepoch {epoch 1}, loss {total_loss / len(train_loader):.4f})逻辑说明训练循环里直接把 Dataset 返回的 dict 展开传给模型loss由 transformers 内部按交叉熵计算。shuffleFalse的验证集在后面评估时用保证评估顺序稳定。参数说明lr2e-5是 BERT 微调最常用的学习率实际在 1e-5 到 5e-5 之间都算正常范围超过 1e-4 大概率训不收敛。epochs5配合早停验证损失连续三轮不降就停避免过拟合。CPU 训练三千条数据每个 epoch 大约几分钟完全可以接受。4.2 三个关键参数学习率、max_len、batch_size怎么定BERT 微调在毕设规模下真正影响成败的参数就三个。第一个是学习率。BERT 预训练权重已经很接近最优解微调只是小幅调整学习率必须小。2e-5 是我的默认值数据量少于一千条时可以降到 1e-5。如果 loss 不降或者震荡优先怀疑学习率而不是换模型。第二个是 max_len。刚才说过 32 足够家庭指令用但如果你往数据里加了长文本闲聊比如一整句你好我想问一下今天天气怎么样32 也还够。只有当你打算把闲聊扩展到长对话时才需要提到 64。长度每翻一倍Transformer 的计算量近似翻倍CPU 推理延迟非常敏感。第三个是 batch_size。GPU 显存 8G 以上可以到 32没有 GPU 就 8 或 16。毕设数据量小batch_size 对最终精度的影响远小于学习率没必要在这个参数上纠结。稳定可复现比性能极限重要。4.3 导出ONNX与CPU推理验证精度和耗时的平衡模型训完评估环节用classification_report看每个类别的精确率、召回率和 F1。八类意图的短文本分类准确率做到 96% 以上是正常水平如果低于 90%优先检查训练集标签分布和数据质量。评估通过后导出 ONNX 是让系统在答辩现场保证可靠运行的关键一步model.eval() dummy_input tokenizer( 把空调调到26度, max_length32, truncationTrue, paddingmax_length, return_tensorspt ) torch.onnx.export( model, (dummy_input[input_ids], dummy_input[attention_mask], dummy_input[token_type_ids]), model/intent.onnx, input_names[input_ids, attention_mask, token_type_ids], output_names[logits], dynamic_axes{ input_ids: {0: batch_size}, attention_mask: {0: batch_size}, token_type_ids: {0: batch_size}, logits: {0: batch_size} } )逻辑说明dummy_input是一个长度为 32 的示例输入用来固定模型的输入结构。dynamic_axes只把 batch 维声明为动态sequence 长度维度保持固定 32这样导出后的模型在推理时不需要处理变长输入逻辑更简单速度也更快。参数说明input_names和output_names是部署阶段在 ONNX Runtime 里引用的名字必须和这里保持一致。logits是分类层输出后面取argmax得到意图索引。导出后用一段简短代码验证精度和耗时import onnxruntime as ort import numpy as np import time sess ort.InferenceSession(model/intent.onnx) texts [打开客厅灯, 空调调到26度, 放首歌听听] for text in texts: inputs tokenizer(text, max_length32, truncationTrue, paddingmax_length, return_tensorsnp) start time.time() logits sess.run(None, { input_ids: inputs[input_ids].astype(np.int64), attention_mask: inputs[attention_mask].astype(np.int64), token_type_ids: inputs[token_type_ids].astype(np.int64), })[0] print(text, logits.argmax(axis1)[0], f{time.time() - start:.3f}s)这里有个经验值未量化 ONNX 在普通 CPU 上单次推理约 80 到 120 毫秒量化之后可以降到 40 到 60 毫秒。对一个对话系统来说这个延迟是完全可以接受的。5. 把模型装进智慧家庭外壳Flask接口、设备模拟层与网页终端5.1 对话服务接口一个POST接口完成意图识别与回复模型只是内核要成为聊天机器人还得有一个对外服务的壳。用 Flask 写一个 POST 接口接收前端传过来的文本返回回复消息。所有逻辑都收敛在这一个函数里。import onnxruntime as ort import numpy as np from flask import Flask, request, jsonify sess ort.InferenceSession(model/intent.onnx) label_names [light_control, ac_control, curtain_control, music_control, device_query, weather_query, alarm_set, chat] label_map {i: name for i, name in enumerate(label_names)} def predict_intent(text): inputs tokenizer(text, max_length32, truncationTrue, paddingmax_length, return_tensorsnp) logits sess.run(None, { input_ids: inputs[input_ids].astype(np.int64), attention_mask: inputs[attention_mask].astype(np.int64), token_type_ids: inputs[token_type_ids].astype(np.int64), })[0] return label_map[int(logits.argmax(axis1)[0])] app Flask(__name__) app.route(/chat, methods[POST]) def chat(): data request.get_json() text data.get(text, ) intent predict_intent(text) reply make_reply(intent, text) return jsonify({intent: intent, reply: reply})逻辑说明predict_intent负责从 ONNX 模型获取意图make_reply是下一步要写的回复决策函数。接口返回意图名和回复文本前端拿到后直接展示。参数说明label_names的顺序就是训练时的标签索引顺序前面强调过这里再次出现部署时务必核对这个文件。模型会话在模块加载时就初始化避免每个请求都重新加载一次模型——那会把系统拖垮。5.2 设备控制层为什么演示环节用模拟设备更可靠智慧家庭的控制层有两条路线真实硬件联动或者模拟设备。真实硬件要求现场有网关、有设备、有局域网环境一个环节出问题演示就卡壳。我一般建议毕设做模拟设备层但保留真实硬件的对接接口。模拟设备层的实现很简单class DeviceManager: def __init__(self): self.devices { 客厅灯: off, 卧室灯: off, 空调: 26.0, 窗帘: closed, 电视: off } def control(self, device, action): if device not in self.devices: return f没有找到设备{device} if action in (on, off): self.devices[device] action elif action open: self.devices[device] open elif action close: self.devices[device] closed return f好的已将{device}设为{self.devices[device]} def query(self, device): return f{device}当前状态是{self.devices.get(device, 未知)}逻辑说明设备状态全部存在内存字典里控制操作直接改字典值。make_reply根据意图决定调用control还是query再拼接回复模板。参数说明设备名和动作值用字符串常量方便扩展。如果以后要接真实硬件只需要把control方法内部换成paho-mqtt的 publish 调用接口签名不变上层代码一行不用改。这个设计在论文里可以写成设备抽象层是加分项。5.3 网页对话终端与一键启动脚本前端不需要框架一个 HTML 文件加原生 JavaScript 就够。核心代码只有调用/chat并渲染回复div idchatBox styleheight:300px;overflow-y:auto;border:1px solid #ccc;/div input idtextInput placeholder试试说把客厅灯打开 stylewidth:300px; / button onclicksend()发送/button script async function send() { const text document.getElementById(textInput).value; const res await fetch(/chat, { method: POST, headers: {Content-Type: application/json}, body: JSON.stringify({text: text}) }); const data await res.json(); const box document.getElementById(chatBox); box.innerHTML p你 text /pp助手 data.reply /p; document.getElementById(textInput).value ; } /script这里的逻辑是点击按钮后把输入框内容 POST 给 Flask收到 JSON 回复后追加到对话区。原生 fetch 不需要引入任何前端依赖答辩演示时打开浏览器即可。启动脚本用 shell 写把激活虚拟环境和启动服务的步骤固定下来#!/bin/bash source venv/bin/activate python app.py这个脚本贴在项目根目录命名为run.sh演示前一天先跑一遍确认端口通。以后你就是把电脑带到答辩现场双击打开终端敲bash run.sh三秒后服务起来浏览器打开本地地址就能开始演示。5.4 论文提纲与源码的对应答辩评委要看什么论文写作和源码是绑在一起的评委通常从系统设计章节开始翻代码验证你写的东西是否真的存在。提纲结构建议论文章节对应源码/材料评委可能追问的点绪论选题背景智慧家庭场景为什么需要对话交互相关技术技术选型说明BERT 和传统分类模型的区别需求分析意图清单、用例表这八类意图是怎么确定的系统设计架构图、数据流图意图识别和设备控制的边界系统实现app.py、model.py、dataset.py哪些代码是你自己写的系统测试测试集、实验结果准确率怎么测出来的这个地方要特别提醒不要在论文里写系统通过 GPU 集群训练毕设就是单机跑的写真实环境才能经得起追问。数据集的统计信息也要和第三章的脚本输出一致训练样本数、验证集比例、各类样本分布评委是会拿计算器对的。6. 避坑与排查5个让毕设翻车的典型问题6.1 现象训练loss不降反升准确率卡在50%上下训练几轮后 loss 不下降甚至升高分类准确率在八类意图里只有一半左右。这个现象在第一次跑通训练脚本时非常常见。原因基本是三个一是学习率设太大超过 1e-4 后 pre-trained 权重被快速冲乱二是标签索引和 label 文本对不上比如某类意图在数据里是light_control但训练代码里对应的数字是 3而实际应该是 0整个分类任务被学歪三是数据里混入了大量空文本或清洗不干净的重复句。解决路径是先打印训练集里前 20 个样本的 label 列表人工核对数字映射然后把学习率调回 2e-5最后检查 raw.txt 里有没有异常行重点关注文本和标签之间的 Tab 是否被空格替代了。6.2 现象CPU推理太慢对话卡顿严重有的同学训练完成后直接把 PyTorch 模型塞进 Flask每句话推理要等一两秒前端转圈很久才出回复。这个延迟在演示时很掉价评委等到第三句话就不耐烦了。原因是 CPU 上跑 PyTorch 动态图特别是不小心装了 GPU 版 torch纯 CPU 模式效率极低。解决方法是前面提过的 ONNX 导出加动态量化。量化代码很少from onnxruntime.quantization import quantize_dynamic, QuantType quantize_dynamic(model/intent.onnx, model/intent_quant.onnx, weight_typeQuantType.QUInt8)量化后的模型在普通笔记本 CPU 上单次推理降到几十毫秒精度损失通常在 1% 以内完全不影响演示效果。部署时加载量化的那个文件就行。6.3 现象答辩现场断网无GPU依赖装不上、模型起不来最翻车的场景是答辩教室的网络不允许访问 Python 包仓库现场安装 transformers 直接超时而第一次加载bert-base-chinese还需要从网上下载预训练权重。模型没加载演示就没了。原因是对运行时依赖的误判BERT 预训练权重、transformers 库、torch这些都是训练时才需要的。解决方法是做两道隔离第一道预训练权重下载好后把整个目录拷贝到项目里改用from_pretrained(./models/bert-base-chinese)加载本地路径第二道模型导出 ONNX 后演示机只装onnxruntime和flask不装 torch 和 transformers。这样演示机环境压缩到最小断网也能跑。6.4 现象开灯和放音乐意图混淆少样本下分不开语义上打开客厅灯和打开音乐有相似的结构如果数据量小模型可能把两者混淆。具体表现是测试集里这两类的 F1 明显低于其他类。原因是训练数据里缺少区分性样本。解决方法是针对性地补数据灯光类多写灯亮了把灯关掉调暗一点音乐类多写来首歌放点声音音量调大。另外推理端加一个置信度阈值当最大概率低于 0.85 时回复我没太听清您是要控制灯光还是播放音乐用澄清绕开误判。这个逻辑在代码里是这样加的probs np.exp(logits) / np.exp(logits).sum(axis1, keepdimsTrue) max_prob float(probs.max()) if max_prob 0.85: return confused, 没太明白您是要控制设备还是想聊点别的6.5 现象论文实验数据与现场演示对不上论文里写意图识别准确率 97%现场演示时连续两次识别错误非常尴尬。原因通常是论文的准确率来自随机划分的测试集而演示输入是临时想的句子恰好踩在模型的盲区上。解决方法是演示前把要说的句子先跑一遍别临场发挥。更稳妥的做法是从测试集里挑五条覆盖不同意图的样本作为演示脚本固定下来。论文里写数字时附上测试集的划分方式和各类别的详细指标做到可复现。这样评委要求现场跑的时候你掏出的是已经验证过的句子而不是赌模型发挥。7. 答辩前半小时的自检清单用一段脚本锁住演示状态答辩前半小时不要再去调模型参数那不是临阵磨枪那是给自己制造焦虑。这时候要做的是确认系统在演示环境里原样跑得起来。我习惯写一个自检脚本把关键检查项全部自动化。#!/bin/bash echo 1. 检查模型文件 ls -lh model/intent_quant.onnx echo 2. 检查端口占用 lsof -i :5000 | grep LISTEN || echo 端口5000空闲 echo 3. 启动服务 pkill -f python app.py || true source venv/bin/activate nohup python app.py /tmp/app.log 21 sleep 4 echo 4. 发送两条测试指令 curl -s -X POST http://127.0.0.1:5000/chat \ -H Content-Type: application/json \ -d {text:把客厅灯打开} echo curl -s -X POST http://127.0.0.1:5000/chat \ -H Content-Type: application/json \ -d {text:空调现在多少度} echo 脚本先确认模型文件存在再确认端口没有被别的进程占用接着拉起服务最后用两条 curl 命令验证核心链路通的。输出里出现预期的意图名和回复就说明系统处于可演示状态。配合一张检查清单更稳妥检查项命令/操作预期结果模型文件ls model/intent_quant.onnx 存在端口lsof -i :5000空闲或被本服务占用服务bash run.sh日志无报错对话链路curl 测试指令返回正确意图和回复浏览器访问打开 localhost:5000页面正常加载断网模拟关闭 WiFi 再测一次功能不受影响断网模拟这一点我是吃过亏的有一次演示现场教室网络隔离网页里因为引用了一个在线 CDN 样式导致按钮加载不出来。从那以后前端页面的资源一律砍到零外链全部内联或本地文件。关于答辩 PPT我的习惯是不要放一大段代码评委看不过来。打开作品前先放一张系统架构图再把对话演示录像压缩到 30 秒内循环播放评委一般会要求现场操作所以关键的还是系统本身稳。模板只是版式参考真正撑场面的还是你自己项目的截图和数据。这套方案的边界我也说清楚它适合可靠运行 论文有据可依的毕设目标不适合去做开放域闲聊对话。若你想做研究型的对话生成那要换一套数据规模和训练策略。如果目标是顺利毕业并且扎实掌握一条完整的深度学习落地链路意图识别加规则回复这条路是损失最小的选择。希望帮到你。本文还有配套的精品资源点击获取
返回列表