意图识别实战:从概念到落地的工程经验总结

📅 发布时间:2026/10/13 11:34:46
意图识别实战:从概念到落地的工程经验总结
意图识别这四个字刚入行的时候我觉得它特别虚。不就是分个类吗文本扔进去标签吐出来能有多难。后来真正在项目里踩了一圈坑才发现这东西远没有想象中那么简单。用户说“我想把昨天买的那件衣服退了”这是退货意图还是查询订单意图用户说“帮我看看附近有没有好吃的”这是找餐厅还是问推荐更别提那些拐了七八个弯的表达、中英夹杂的句子、还有带着错别字的输入。意图识别做不好后面的对话管理、槽位填充、业务流转全都是空中楼阁。这篇整理是我自己在做对话系统过程中对意图识别这个环节的一些理解和实操总结。从最基础的概念拆解到方案选型的考量再到实际落地时遇到的坑和排查思路我都会尽量讲透。适合正在做对话系统、智能客服、语音助手相关工作的朋友参考也适合刚接触NLP想了解意图识别到底怎么回事的初学者。我不会堆太多公式更多是从工程落地的角度来讲毕竟大部分时候我们需要的不是发论文而是让系统跑起来、跑得稳。1. 意图识别到底在识别什么1.1 从一次真实的翻车说起之前做过一个智能客服的小项目用户输入“我买的那个东西什么时候能到”系统把它分到了“查询物流”意图看起来没问题对吧但实际业务里“查询物流”这个意图下面还分了“按订单号查”“按手机号查”“按收货人查”三个子场景而用户这句话里既没有订单号也没有手机号系统就卡住了不知道该走哪条路。后来我们复盘发现问题不在于分类模型不准而在于意图的粒度定义本身就有问题。这个经历让我意识到意图识别不是简单的文本分类问题。它至少包含三个层面的工作第一定义清楚意图的边界和粒度第二把用户输入映射到正确的意图类别第三处理那些边界模糊、多意图混杂的情况。很多团队一上来就急着选模型、调参数结果意图体系本身就没设计好后面怎么调都是白搭。1.2 意图、槽位、领域别搞混了刚接触对话系统的人容易把意图、槽位、领域这三个概念搅在一起。我用一个生活化的类比来解释假设你走进一家餐厅服务员问你“想吃点什么”。领域就是你走进的是中餐厅还是西餐厅它决定了整个对话的大方向。意图是你想干什么比如“点菜”“退菜”“结账”“问WiFi密码”。槽位是完成这个意图需要补充的信息比如点菜这个意图下槽位可能是“菜品名称”“数量”“口味偏好”。这三个东西的关系是领域限定意图的范围意图决定需要哪些槽位。一个领域下可以有几十个意图一个意图下可以有零到多个槽位。有些意图不需要槽位比如“问WiFi密码”直接给答案就行。有些意图必须填满槽位才能执行比如“订机票”至少需要出发地、目的地、时间。在实际工程中我习惯把意图体系设计成树状结构。顶层是领域第二层是意图大类第三层是意图细类。比如领域电商客服意图大类订单相关意图细类查询订单状态意图细类修改收货地址意图细类取消订单意图大类售后相关意图细类申请退货意图细类申请换货意图细类投诉物流这样设计的好处是当分类模型在细类层面拿不准的时候可以回退到大类层面做兜底处理。比如模型判断“查询订单状态”的置信度只有0.4“取消订单”的置信度是0.35但“订单相关”这个大类加起来有0.85那系统就可以先确认“您是想处理订单相关的问题对吗”而不是硬猜一个细类。1.3 为什么意图识别值得单独拿出来做有人可能会问意图识别能不能和槽位填充合并成一个模型来做技术上当然可以现在很多端到端的方案就是联合建模。但在实际项目中我倾向于把意图识别单独拿出来做原因有几个。第一意图识别的准确率直接影响用户体验。用户说了一句话系统连他想干什么都判断错了后面槽位填得再准也没用。把意图识别单独优化可以更聚焦地提升这个环节的效果。第二意图识别的结果可以复用到多个下游任务。比如意图识别出来是“查询物流”那对话管理模块就知道该走查询流程同时可以触发物流查询接口。如果和槽位填充耦合在一起复用起来就不那么灵活。第三意图识别的数据标注相对独立。槽位标注需要标出每个词的BIO标签成本高、一致性难保证。意图标注只需要给整句话打一个类别标签标注成本低很多也更容易做数据增强和扩充。当然这不是说联合建模不好。如果团队人手有限、数据量不大联合建模可以减少维护成本。但如果是对效果要求比较高的场景我还是建议把意图识别作为独立模块来打磨。2. 意图识别的技术方案怎么选2.1 从规则到深度学习不是越新越好意图识别的技术方案大致经历了几个阶段基于规则的方法、基于统计机器学习的方法、基于深度学习的方法、以及现在基于预训练模型的方法。很多人一上来就想用最先进的方案但我的经验是方案选型要看具体场景不是越新越好。基于规则的方法说白了就是写if-else。比如检测到“退货”“退款”“退”这些关键词就判为退货意图。这种方法在意图数量少、表达方式固定的场景下非常有效而且可解释性强出了问题容易排查。我做过一个内部工具意图只有五个用规则匹配加同义词扩展准确率能到95%以上维护成本也低。但规则方法的瓶颈也很明显意图一多规则之间会打架用户表达一灵活规则就覆盖不全。基于统计机器学习的方法典型的是用TF-IDF或者词袋模型做特征然后用SVM或者朴素贝叶斯做分类。这种方法比规则灵活一些能处理一些没见过的表达但特征工程依赖人工而且对语序和上下文不敏感。比如“我不想要退货”和“我想要退货”词袋模型看到的词几乎一样但意思完全相反。基于深度学习的方法比如TextCNN、BiLSTM、BERT能自动学习文本特征对语序和上下文有更好的建模能力。特别是BERT出来之后在很多意图识别任务上微调一下就能达到不错的效果。但深度学习方案需要更多的标注数据训练和推理的资源消耗也更大。我的建议是如果意图数量少于20个、标注数据少于5000条可以先从规则加统计的方法做起快速上线验证如果意图数量多、数据量充足、对准确率要求高再上深度学习方案。不要为了用新技术而用新技术。2.2 预训练模型微调目前的主流选择现在做意图识别如果数据量还可以我一般会直接上预训练模型微调。具体来说就是把预训练模型的输出接一个分类层然后用标注数据做微调。常用的预训练模型有BERT、RoBERTa、ALBERT这些中文场景下也可以用一些中文预训练模型。微调的过程不复杂核心是几个参数的设置。学习率一般设2e-5到5e-5之间太大容易破坏预训练学到的知识太小收敛太慢。批次大小根据显存来定16或者32比较常见。训练轮数一般3到5轮就够了太多容易过拟合。这些参数不是绝对的需要根据具体数据做调整。有一个细节容易被忽略意图分类的类别不平衡问题。在实际业务中有些意图的样本特别多有些特别少。比如“查询订单”可能占70%的样本“投诉建议”可能只有2%。如果不做处理模型会倾向于预测多数类少数类的召回率会很低。常见的处理方法有对少数类做数据增强、在损失函数里给少数类更高的权重、或者用focal loss。我一般会先看混淆矩阵确认哪些类被压得厉害再针对性地做处理。2.3 小样本和零样本场景怎么办实际项目中经常遇到的情况是新加了一个意图但标注数据只有几十条甚至一条都没有。这时候预训练模型微调就不太适用了因为数据量太少微调容易过拟合。小样本场景下我试过几种方案。一种是基于提示学习的方法把意图识别转化成完形填空的任务。比如输入“这句话的意图是[MASK]”让模型预测MASK位置应该填什么词。这种方法在样本极少的情况下比直接微调效果好但需要设计合适的模板模板的好坏对效果影响很大。另一种是用句子相似度做匹配。把每个意图用几句话描述出来然后计算用户输入和这些描述的相似度取相似度最高的意图。这种方法不需要训练新加意图只需要加几句描述就行非常灵活。但缺点是准确率上限不高适合做冷启动或者兜底方案。零样本场景下还可以借助大语言模型的能力。把意图列表和用户输入一起给到大模型让大模型直接判断意图。这种方法的好处是不需要标注数据坏处是推理成本高、响应速度慢而且大模型的判断结果不稳定同样的输入可能两次给出不同的答案。我的做法是用大模型做冷启动先跑一批数据把大模型判断的结果作为伪标签人工审核修正后再用这些数据去训练小模型。这样既能快速启动又能逐步积累标注数据。3. 数据标注和增强的实操细节3.1 标注规范怎么定才不坑数据标注是意图识别的地基地基没打好后面模型再强也白搭。我见过太多项目因为标注规范不清晰导致标注数据质量差模型效果怎么调都上不去。标注规范的核心是定义清楚每个意图的边界。什么叫“查询订单状态”用户问“我的快递到哪了”算不算用户问“我买的东西发货了吗”算不算这些都需要在规范里写清楚最好配上正例和负例。我一般会要求标注规范里每个意图至少配5个正例和5个容易混淆的负例这样标注员才能准确理解边界。另一个关键是处理多意图的情况。用户说“我要退货顺便问一下退款多久到账”这一句话里包含了“申请退货”和“查询退款进度”两个意图。怎么标我的做法是如果两个意图有明确的先后关系标主要意图如果两个意图同等重要标成多意图。但多意图的标注成本高而且模型处理起来也复杂所以我会尽量引导产品设计上避免多意图比如通过多轮对话来拆分。还有一个坑是标注的一致性。同一个句子不同的标注员可能给出不同的标签。解决方法是做交叉验证让多个标注员标同一批数据计算一致性指标。如果一致性低于90%说明标注规范有问题需要重新讨论和修订。这个环节不能省否则后面模型训练出来你都不知道是模型的问题还是数据的问题。3.2 数据增强别只会同义词替换数据量不够的时候数据增强是一个常用的手段。但很多人做数据增强只会同义词替换把“退货”换成“退款”把“查询”换成“查看”。这种方法有一定效果但局限性也很明显替换后的句子可能不自然而且改变不了句子的结构。我常用的数据增强方法有几种。第一种是回译把中文句子翻译成英文再翻译回中文这样可以得到表达不同但意思相近的句子。比如“我想退一下货”回译后可能变成“我想要退货”。这种方法能增加表达的多样性但需要翻译接口而且有时候回译会改变原意需要人工过滤。第二种是随机插入、删除、交换词语。比如“帮我查一下订单状态”可以变成“帮我查订单状态”或者“查一下帮我订单状态”。这种方法简单但生成的句子可能语法不通需要控制增强的比例一般不超过原数据的30%。第三种是用大模型生成。给大模型几个正例让它生成更多相同意图的句子。这种方法生成的句子质量比较高但需要设计好提示词而且要注意过滤掉那些和原意图不符的生成结果。不管用哪种方法增强后的数据都要人工抽检。我一般会抽10%左右检查如果发现增强数据质量不行就调整增强策略或者降低增强比例。数据增强是锦上添花不是雪中送炭如果原始数据质量就差增强再多也没用。3.3 标注工具和流程的选型建议标注工具的选择也很重要。小团队可以用开源的标注工具比如doccano、brat这些部署简单功能够用。大团队可以考虑自研标注平台集成任务分发、质量监控、进度管理这些功能。流程上我建议采用“预标注人工修正”的方式。先用一个基础模型或者大模型对未标注数据做预标注然后让标注员在预标注的基础上做修正。这样比从零开始标注快很多而且标注员只需要关注模型判断错的部分效率更高。预标注的准确率不需要太高60%到70%就行关键是让标注员有个起点。质量监控方面我会设置“黄金样本”机制。在标注任务里混入一些已经确认过标签的样本如果标注员在这些样本上的准确率低于阈值就说明标注质量有问题需要重新培训或者调整。这个机制能有效发现标注员的理解偏差。4. 模型训练和调优的实战经验4.1 训练集、验证集、测试集怎么分数据划分看起来简单但实际操作中有很多细节。最常见的错误是随机划分导致同一个用户或者同一个会话的句子同时出现在训练集和测试集里造成数据泄露测试效果虚高。我的做法是按会话或者按用户来划分。比如有1000个会话每个会话有若干轮对话那就把800个会话作为训练集100个作为验证集100个作为测试集。这样能保证同一个会话的句子不会跨集合出现测试结果更真实。另一个细节是类别平衡。划分数据的时候要保证每个集合里各个意图的比例大致相当。如果某个意图在训练集里很多、在测试集里很少那测试结果就不能反映真实效果。我一般会用分层抽样的方式来划分确保每个集合的类别分布一致。测试集的大小也有讲究。如果意图有50个每个意图至少要有20到30个测试样本这样评估结果才稳定。算下来测试集至少需要1000到1500条数据。如果数据量不够可以适当减少每个意图的测试样本数但不要少于10条。4.2 评估指标别只看准确率准确率是最直观的指标但在类别不平衡的场景下准确率会骗人。比如100个样本里90个是“查询订单”10个是“投诉建议”模型把所有样本都预测成“查询订单”准确率也有90%但“投诉建议”的召回率是0。这种模型上线后用户投诉根本触发不了投诉流程体验极差。所以我一般会看几个指标准确率、宏平均F1、加权平均F1、以及每个类别的召回率。宏平均F1是每个类别F1的算术平均对少数类更友好。加权平均F1是按类别样本数加权的平均更接近整体表现。两个一起看能更全面地评估模型。还有一个指标是混淆矩阵。通过混淆矩阵能看出哪些类别容易被搞混。比如“申请退货”和“申请换货”经常互相混淆那就说明这两个意图的边界需要重新审视或者需要增加更多区分性的训练样本。在实际项目中我还会关注“高置信度错误率”。就是模型置信度很高但预测错误的样本比例。这些样本往往是标注错误或者意图定义有问题的信号。我会把这些样本挑出来人工审核如果是标注错误就修正如果是意图定义问题就调整意图体系。4.3 超参数调优哪些值得花时间超参数调优是个体力活但有些参数值得花时间调有些调了也白调。根据我的经验对意图识别效果影响最大的几个参数是学习率、批次大小、训练轮数、以及序列长度。学习率是最关键的。太大容易震荡不收敛太小收敛太慢。我一般会先跑几个不同量级的学习率比如1e-5、3e-5、5e-5看验证集效果然后在这个范围里细化。如果用了预训练模型学习率一般不超过5e-5。批次大小受显存限制但也会影响效果。批次太小梯度更新噪声大训练不稳定批次太大泛化能力可能下降。我一般从16开始试如果显存够就试32看哪个效果好。训练轮数要配合早停策略。我一般会设一个较大的轮数上限比如10轮然后监控验证集损失如果连续2到3轮没有下降就停止训练。这样既能保证训练充分又能避免过拟合。序列长度容易被忽略。如果大部分句子长度在30个词以内但你把序列长度设成128那很多位置都是padding浪费计算资源还可能影响效果。我一般会统计训练数据的句子长度分布取95分位数作为序列长度这样能覆盖大部分样本又不至于太长。4.4 模型部署和推理优化模型训练好了部署上线又是另一回事。线上推理对延迟和吞吐有要求不能像离线训练那样慢慢跑。延迟优化方面我常用的手段有模型量化、模型蒸馏、以及推理引擎优化。模型量化是把模型参数从浮点数转成低精度整数减少内存占用和计算量一般能提速2到3倍效果损失很小。模型蒸馏是用一个大模型教一个小模型让小模型达到接近大模型的效果但推理速度快很多。推理引擎方面可以用ONNX Runtime或者TensorRT来加速这些引擎对算子做了优化比原生框架快不少。吞吐优化方面主要是做批处理。把多个请求攒成一个批次一起推理能充分利用GPU的并行能力。但批处理会增加延迟需要根据业务场景做权衡。如果对延迟敏感批次就设小一点如果对吞吐要求高批次可以设大一点。还有一个容易忽略的点是模型版本管理。线上模型更新时要做好灰度发布和回滚机制。新模型先切一小部分流量观察效果和稳定性没问题再逐步扩大流量。如果发现问题能快速回滚到旧版本。这个机制在出问题的时候能救命。5. 常见问题排查和避坑指南5.1 模型效果不好先查数据还是先查模型模型效果不好的时候很多人第一反应是调模型、换模型。但根据我的经验80%的问题出在数据上而不是模型上。我一般会按这个顺序排查先看训练数据有没有标注错误随机抽100条训练数据人工检查如果错误率超过5%那就先修数据。再看测试集和训练集的分布是否一致如果测试集里有大量训练集没见过的表达方式那模型效果差是正常的。然后看混淆矩阵找出哪些类别容易被搞混分析是意图定义问题还是样本不足问题。最后才考虑模型层面的优化比如换模型、调参数、加特征。这个顺序很重要因为数据问题不解决模型怎么调都是治标不治本。我见过一个项目团队花了两周调模型效果只提升了1个点后来发现训练数据里有10%的标注错误修完数据后效果直接提升了8个点。5.2 线上效果比离线差很多怎么回事离线评估准确率90%上线后用户反馈却很差这种情况太常见了。原因通常有几个。第一个是数据分布不一致。离线测试集是从历史数据里随机划分的但线上用户的实际输入可能和 historial 数据分布不同。比如历史数据里大部分是文字输入但线上有很多语音转文字的输入带有识别错误。解决方法是定期从线上采样真实数据加入训练集和测试集保持数据分布的一致性。第二个是意图体系覆盖不全。线上用户的实际意图可能超出了当初设计的意图列表。比如设计时只考虑了“退货”“换货”“查询订单”但用户还会问“能不能修改订单”“能不能加急发货”。这些意图没有被覆盖模型只能强行分到某个已有类别结果就是错的。解决方法是建立“未知意图”的兜底机制当模型置信度低于阈值时不强行分类而是转人工或者引导用户重新表达。第三个是评估指标和业务指标脱节。离线看的是分类准确率但业务看的是问题解决率、用户满意度。分类准确率高不代表业务效果好。比如“查询订单”和“查询物流”这两个意图模型分错了但用户的问题可能也能解决因为两个流程都能查到物流信息。反过来有些分类对了但槽位没填对问题照样解决不了。所以线上评估要结合业务指标一起看。5.3 多意图和意图继承怎么处理多意图是意图识别里比较棘手的问题。用户一句话里包含多个意图比如“我要退货另外帮我查一下退款到账了没有”。严格来说这是两个意图但模型只能输出一个标签。我的处理策略是分场景。如果两个意图有明确的先后顺序比如先退货再查退款那就按主要意图处理在对话管理中通过多轮对话来覆盖第二个意图。如果两个意图同等重要那就标成多意图模型用多标签分类来处理。多标签分类和单标签分类的区别在于输出层用sigmoid而不是softmax每个意图独立判断是否属于当前输入。训练数据需要标出所有相关意图。这种方法能处理多意图但需要更多的标注数据而且阈值需要仔细调。意图继承是另一个问题。在多轮对话中用户可能说“那帮我退了吧”这里的“那”指代的是上一轮提到的商品。如果单独看这句话意图不明确结合上下文才能判断是“申请退货”。处理意图继承需要把对话历史也作为模型的输入。常见的方法是把最近几轮对话拼接起来一起送进模型。但这样会增加输入长度需要控制历史轮数一般2到3轮就够了。5.4 常见问题速查表问题现象可能原因排查方法解决思路离线准确率高线上效果差数据分布不一致对比线上线下数据分布定期采样线上数据加入训练少数类召回率低类别不平衡看混淆矩阵和各类召回率数据增强、损失加权、focal loss某些意图经常混淆意图边界不清分析混淆矩阵中的高频错误对重新定义意图边界或增加区分样本模型置信度普遍偏低训练不充分或数据噪声大看训练损失曲线和标注质量增加训练轮数或清洗数据推理延迟高模型太大或未优化测各环节耗时量化、蒸馏、推理引擎优化新意图效果差样本太少看新意图的样本数量小样本学习、数据增强、大模型冷启动这张表是我在实际项目中总结出来的基本上覆盖了80%的常见问题。遇到问题的时候先按表里的排查方法走一遍能省不少时间。5.5 几个容易踩的坑第一个坑是过度依赖准确率。前面说过类别不平衡的时候准确率会骗人。我一般会同时看宏平均F1和加权平均F1两个差距大的时候就要警惕了。第二个坑是忽略标注质量。标注数据是模型的上限标注质量差模型效果不可能好。我建议在标注阶段就做好质量监控不要等到模型训练完才发现数据有问题。第三个坑是不做错误分析。模型训练完不能只看一个总体指标就完事。要把预测错误的样本挑出来一条一条看分析错误的原因。是标注错了是意图定义不清还是模型能力不够只有做了错误分析才知道下一步该往哪个方向优化。第四个坑是意图体系设计得太细。有些团队一上来就设计几百个意图结果每个意图的样本都很少模型根本学不好。我的建议是先从粗粒度开始比如先分20个大类等数据积累够了再逐步细化。意图体系是演进的不是一开始就定死的。第五个坑是忽略冷启动。新业务上线时没有标注数据怎么办我的做法是先用规则或者大模型做冷启动同时收集用户真实输入人工标注一批种子数据然后逐步迭代。不要等数据完美了再上线先上线收集数据再迭代优化。6. 意图识别的边界和后续扩展6.1 意图识别解决不了的问题意图识别虽然重要但它不是万能的。有些问题不是意图识别能解决的需要其他模块配合。比如用户说“帮我订一张明天去北京的机票”意图识别能判断出是“订机票”意图但具体订哪一班、什么时间、什么舱位这些需要槽位填充和对话管理来完成。意图识别只是第一步。再比如用户说“这个多少钱”单独看这句话意图完全不明确。需要结合上下文知道“这个”指的是什么才能判断意图。这涉及到指代消解和上下文理解超出了意图识别的范畴。还有情感和情绪。用户说“你们这个破系统怎么又出问题了”意图可能是“报障”但情绪是愤怒。如果只识别意图不识别情绪可能就按普通报障流程处理了但用户其实需要的是安抚和快速响应。所以意图识别往往需要和情感分析配合使用。6.2 和大模型结合的新思路大模型出来之后意图识别的做法也在变化。一种思路是用大模型做零样本或少样本的意图识别不需要训练专门的模型。把意图列表和用户输入给到大模型让大模型直接输出意图标签。这种方法在冷启动阶段特别有用能快速搭建原型。另一种思路是用大模型做数据增强和标注辅助。让大模型生成更多训练样本或者对未标注数据做预标注人工只需要做修正。这样能大幅降低标注成本。还有一种思路是用大模型做意图体系的自动发现。把大量用户输入给到大模型让大模型聚类分析发现潜在的意图类别。这对于新业务场景的意图体系设计很有帮助。但大模型也不是银弹。推理成本高、响应速度慢、结果不稳定这些问题都存在。我的做法是把大模型和小模型结合起来用大模型做冷启动和数据增强用小模型做线上推理。这样既能利用大模型的能力又能保证线上的性能和稳定性。6.3 意图识别的评估闭环怎么建意图识别不是做完就完了需要建立持续的评估和优化闭环。第一步是线上监控。记录每次意图识别的输入、输出、置信度以及后续的业务动作和用户反馈。这些数据是优化的基础。第二步是定期采样评估。每周或每月从线上采样一批数据人工标注正确的意图然后和模型预测结果对比计算准确率和各类指标。这样能及时发现效果下降。第三步是错误分析。把预测错误的样本分类整理分析错误原因。是数据问题就补数据是意图定义问题就调整定义是模型问题就优化模型。第四步是迭代更新。根据错误分析的结果更新训练数据、调整意图体系、重新训练模型。然后回到第一步继续监控。这个闭环看起来简单但坚持做下来不容易。很多团队做完第一版就放在那里了效果慢慢下降也不管。我的经验是意图识别是一个持续运营的事情不是一锤子买卖。6.4 一些个人体会做意图识别这几年最大的体会是技术方案的选择往往不是最难的最难的是对业务的理解和对数据的把控。一个对业务理解深刻的规则系统可能比一个数据质量差的深度学习模型效果更好。另一个体会是不要追求一步到位。意图体系是演进的模型是迭代的数据是积累的。先上线一个能用的版本收集真实数据然后逐步优化。完美主义在工程落地里往往是最大的障碍。还有一个体会是评估指标要服务于业务目标。分类准确率再高如果业务问题解决不了那也是白搭。我一般会问自己一个问题这个意图识别模块上线后业务上最关心的是什么是问题解决率是用户满意度还是人工转接率根据业务目标来设计评估指标才能让技术真正产生价值。最后意图识别只是对话系统的一个环节它需要和槽位填充、对话管理、知识库等模块配合才能发挥价值。不要孤立地优化意图识别要从整个对话系统的角度来考虑。有时候意图识别的一个小改进配合对话管理的一个调整能带来整体体验的大提升。这个内容后续还可以这样扩展一是深入讲槽位填充和意图识别的联合建模二是讲多轮对话中的意图追踪和继承三是讲大模型在意图识别中的具体应用案例和效果对比。这些方向我后续会继续整理感兴趣的朋友可以关注。