基于BERT的意图识别实战:从原理到部署,解决模糊口语化表达
最近在开发一个智能对话系统时遇到了一个非常典型的问题用户输入的意图识别准确率总是不尽如人意尤其是在处理一些带有情感倾向或复杂上下文的口语化表达时。比如当用户说“思思想要思思又得到”这样看似重复、模糊的句子时传统的基于关键词或简单规则匹配的NLP模型很容易“卡壳”无法准确理解用户的真实诉求。这直接影响了后续的对话流畅度和任务完成率。本文将围绕如何利用预训练语言模型和意图识别技术来精准解析此类复杂、模糊的用户语句展开。我们将从核心概念入手逐步拆解一个完整的实战项目涵盖从环境搭建、数据准备、模型微调、到服务部署和效果评估的全流程。无论你是刚接触NLP的开发者还是希望优化现有对话系统的工程师都能从本文获得一套可直接复用的解决方案。1. 背景与核心概念意图识别与语义理解在自然语言处理NLP领域意图识别是任务型对话系统的核心模块。它的目标是判断用户输入的一句话utterance背后所隐藏的“意图”或“目的”例如“查询天气”、“播放音乐”、“订餐”等。而“思思想要思思又得到”这样的句子对机器理解构成了多重挑战词汇重复与模糊“思思”可能是一个人名、昵称也可能是一个代号缺乏明确的实体指代。语法非标准“想要...又得到”是一种口语化的、带有转折和情感可能表示渴望与遗憾的表达不符合严格的语法结构。深层语义其真实意图可能非常多样例如“用户‘思思’想要某个物品但又希望重新获得它”或者这本身就是一句测试用的无意义文本。要解决这个问题我们不能依赖简单的字典匹配。现代解决方案的核心是语义理解即让模型学会从文本中提取深层的、上下文相关的含义。这通常通过以下技术栈实现词向量/句向量将文本转化为计算机可处理的数值向量捕获语义信息。预训练语言模型如BERT、RoBERTa、ERNIE等它们在海量文本上预训练对语言有强大的理解能力。微调在特定的意图识别数据集上对预训练模型进行二次训练使其适应特定领域的任务。本文将以BERT模型为例展示如何构建一个能够理解“思思想要思思又得到”这类句子的意图分类器。2. 环境准备与版本说明本项目主要使用Python语言和PyTorch深度学习框架。请确保你的开发环境满足以下要求操作系统Linux (Ubuntu 20.04), macOS, 或 Windows (建议使用WSL2以获得最佳体验)。Python: 3.8 或 3.9。深度学习框架PyTorch 1.12 或 TensorFlow 2.x。本文示例使用PyTorch。关键库transformers(Hugging Face库用于加载预训练模型)datasets(用于数据处理)scikit-learn(用于评估指标)pandas,numpy(用于数据操作)版本兼容性提示transformers库和模型更新较快以下代码基于较稳定的版本编写。如果遇到API变动请参考官方文档调整。你可以使用以下命令创建环境并安装依赖# 创建并激活虚拟环境 (可选但推荐) python -m venv nlp_intent_env source nlp_intent_env/bin/activate # Linux/macOS # nlp_intent_env\Scripts\activate # Windows # 安装PyTorch (请根据你的CUDA版本前往官网 https://pytorch.org/ 获取对应命令) # 例如对于无GPU或CUDA 11.7的环境 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu # 安装其他依赖 pip install transformers datasets scikit-learn pandas numpy3. 核心原理与模型选型3.1 BERT模型如何工作BERTBidirectional Encoder Representations from Transformers的核心创新在于“双向”和“Transformer编码器”。双向传统语言模型如GPT是单向的从左到右阅读文本。BERT在预训练时同时考虑一个词左右两侧的上下文从而获得更丰富的语义表示。Transformer编码器使用自注意力机制能够捕捉句子中任意两个词之间的关系无论它们相距多远。对于分类任务如意图识别我们通常在BERT模型的输出之上添加一个简单的全连接层分类头。模型的工作流程如下输入句子经过分词器Tokenizer转化为模型可识别的Token ID序列。BERT模型处理该序列为每个Token生成一个上下文相关的向量表示。我们通常取第一个特殊Token[CLS]对应的输出向量作为整个句子的语义表示。将该向量输入分类头通过softmax函数得到各个意图类别的概率分布。3.2 针对模糊句子的策略对于“思思想要思思又得到”这类句子直接分类可能效果不佳。我们可以采用以下策略增强模型鲁棒性数据增强在训练数据中人工构造或使用回译等方法生成类似风格的模糊、重复、口语化句子并打上正确的意图标签。集成上下文在实际对话系统中意图识别不应孤立进行。可以将当前语句与之前的几句对话历史一起输入模型让模型基于上下文进行判断。阈值与拒识设置一个置信度阈值如0.8。如果模型对最可能类别的预测概率低于阈值则判定为“未知意图”触发澄清话术如“我没太明白您能再说具体一点吗”而不是强行分类。4. 完整实战构建意图识别模型我们将模拟一个简单的场景假设“思思想要思思又得到”可能属于query_item查询物品或express_desire表达愿望这两个意图之一。4.1 准备模拟数据集由于没有现成的包含此类句子的数据集我们创建一个小的模拟数据集来演示流程。在实际项目中你需要收集和标注大量真实的用户语句。# file: prepare_data.py import pandas as pd from sklearn.model_selection import train_test_split # 模拟数据 data { text: [ 思思想要思思又得到, 帮我查一下手机价格, 我想要一杯咖啡, 昨天的会议记录在哪里, 思思找不到她的钥匙了, 播放周杰伦的歌, 又想要那个玩具了, 订一张明天去北京的机票, 得到之后又想要新的, 关闭卧室的灯 ], intent: [ express_desire, # 表达愿望 query_item, # 查询物品 express_desire, # 表达愿望 query_item, # 查询物品 query_item, # 查询物品 play_music, # 播放音乐 express_desire, # 表达愿望 book_ticket, # 订票 express_desire, # 表达愿望 control_device # 控制设备 ] } df pd.DataFrame(data) print(数据集预览:) print(df) print(f\n意图类别分布:\n{df[intent].value_counts()}) # 划分训练集和测试集 train_df, test_df train_test_split(df, test_size0.2, random_state42, stratifydf[intent]) print(f\n训练集大小: {len(train_df)} 测试集大小: {len(test_df)}) # 保存 train_df.to_csv(train_intents.csv, indexFalse) test_df.to_csv(test_intents.csv, indexFalse)4.2 使用Transformers库加载模型和分词器我们选择bert-base-chinese模型来处理中文。# file: load_model.py from transformers import BertTokenizer, BertForSequenceClassification model_name bert-base-chinese # 中文BERT基础模型 # 加载分词器 tokenizer BertTokenizer.from_pretrained(model_name) # 加载模型。num_labels需要设置为你的意图类别总数 intent_labels df[intent].unique().tolist() num_labels len(intent_labels) print(f意图标签列表: {intent_labels}) print(f类别数量: {num_labels}) model BertForSequenceClassification.from_pretrained(model_name, num_labelsnum_labels) # 测试分词器 test_sentence 思思想要思思又得到 inputs tokenizer(test_sentence, return_tensorspt, paddingTrue, truncationTrue, max_length128) print(f\n测试句子: {test_sentence}) print(fToken IDs: {inputs[input_ids]}) print(fAttention Mask: {inputs[attention_mask]})4.3 创建数据集类和数据加载器我们需要将文本数据转换为模型需要的张量格式。# file: dataset_loader.py import torch from torch.utils.data import Dataset, DataLoader import pandas as pd class IntentDataset(Dataset): def __init__(self, csv_file, tokenizer, max_length128): self.data pd.read_csv(csv_file) self.tokenizer tokenizer self.max_length max_length self.label_map {label: idx for idx, label in enumerate(sorted(self.data[intent].unique()))} self.inverse_label_map {idx: label for label, idx in self.label_map.items()} def __len__(self): return len(self.data) def __getitem__(self, idx): text str(self.data.iloc[idx][text]) label self.data.iloc[idx][intent] label_id self.label_map[label] encoding self.tokenizer( text, add_special_tokensTrue, max_lengthself.max_length, paddingmax_length, truncationTrue, return_attention_maskTrue, return_tensorspt ) return { input_ids: encoding[input_ids].flatten(), attention_mask: encoding[attention_mask].flatten(), labels: torch.tensor(label_id, dtypetorch.long) } # 初始化数据集和数据加载器 train_dataset IntentDataset(train_intents.csv, tokenizer) test_dataset IntentDataset(test_intents.csv, tokenizer) train_loader DataLoader(train_dataset, batch_size4, shuffleTrue) test_loader DataLoader(test_dataset, batch_size2, shuffleFalse) print(f训练样本数: {len(train_dataset)}) print(f标签映射: {train_dataset.label_map}) # 查看一个批次的数据 batch next(iter(train_loader)) print(f\n一个批次的输入ID形状: {batch[input_ids].shape}) print(f一个批次的标签: {batch[labels]})4.4 模型训练与评估# file: train_model.py import torch from transformers import AdamW, get_linear_schedule_with_warmup from sklearn.metrics import accuracy_score, classification_report import numpy as np device torch.device(cuda if torch.cuda.is_available() else cpu) print(f使用设备: {device}) model.to(device) # 训练参数 epochs 10 learning_rate 2e-5 optimizer AdamW(model.parameters(), lrlearning_rate) total_steps len(train_loader) * epochs scheduler get_linear_schedule_with_warmup(optimizer, num_warmup_steps0, num_training_stepstotal_steps) # 训练循环 model.train() for epoch in range(epochs): total_loss 0 for batch in train_loader: input_ids batch[input_ids].to(device) attention_mask batch[attention_mask].to(device) labels batch[labels].to(device) model.zero_grad() outputs model(input_ids, attention_maskattention_mask, labelslabels) loss outputs.loss total_loss loss.item() loss.backward() torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0) # 梯度裁剪防止爆炸 optimizer.step() scheduler.step() avg_train_loss total_loss / len(train_loader) print(fEpoch {epoch 1}/{epochs}, Average Loss: {avg_train_loss:.4f}) # 评估模型 model.eval() predictions, true_labels [], [] with torch.no_grad(): for batch in test_loader: input_ids batch[input_ids].to(device) attention_mask batch[attention_mask].to(device) labels batch[labels].to(device) outputs model(input_ids, attention_maskattention_mask) logits outputs.logits preds torch.argmax(logits, dim1).cpu().numpy() predictions.extend(preds) true_labels.extend(labels.cpu().numpy()) # 将数字标签转回文字标签 predicted_labels [test_dataset.inverse_label_map[p] for p in predictions] true_label_names [test_dataset.inverse_label_map[l] for l in true_labels] print(\n 测试集评估结果 ) print(f准确率: {accuracy_score(true_labels, predictions):.4f}) print(\n分类报告:) print(classification_report(true_label_names, predicted_labels, target_namesintent_labels)) # 保存模型 model.save_pretrained(./saved_intent_model) tokenizer.save_pretrained(./saved_intent_model) print(\n模型已保存至 ./saved_intent_model 目录)4.5 使用模型进行预测训练完成后我们可以加载保存的模型对新句子进行意图预测。# file: predict.py from transformers import BertTokenizer, BertForSequenceClassification import torch # 加载已保存的模型和分词器 model_path ./saved_intent_model tokenizer BertTokenizer.from_pretrained(model_path) model BertForSequenceClassification.from_pretrained(model_path) model.eval() device torch.device(cuda if torch.cuda.is_available() else cpu) model.to(device) # 定义标签映射 (需要与训练时一致) label_map {book_ticket: 0, control_device: 1, express_desire: 2, play_music: 3, query_item: 4} inverse_label_map {v: k for k, v in label_map.items()} def predict_intent(text, confidence_threshold0.7): 预测句子意图并返回结果和置信度 inputs tokenizer(text, return_tensorspt, paddingTrue, truncationTrue, max_length128).to(device) with torch.no_grad(): outputs model(**inputs) logits outputs.logits probabilities torch.nn.functional.softmax(logits, dim-1) confidence, predicted_class torch.max(probabilities, dim-1) confidence confidence.item() predicted_label inverse_label_map[predicted_class.item()] if confidence confidence_threshold: return unknown_intent, confidence, 置信度过低可能为未知意图。 else: return predicted_label, confidence, None # 测试几个句子 test_sentences [ 思思想要思思又得到, 帮我找一下思思的文档, 我想要那个蓝色的, 打开空调, 这句话是什么意思 # 一个可能不在训练集中的句子 ] print(意图预测结果) for sent in test_sentences: intent, conf, msg predict_intent(sent) result f句子: {sent}\n预测意图: {intent} (置信度: {conf:.4f}) if msg: result f\n备注: {msg} print(result \n -*40)运行上述预测代码你可能会看到对于“思思想要思思又得到”这个句子模型基于我们极小的训练数据可能会将其归类为express_desire表达愿望并给出一个置信度。这验证了模型具备了一定的语义理解能力而非简单的关键词匹配。5. 常见问题与排查思路在实际部署意图识别模型时你可能会遇到以下问题问题现象可能原因排查思路与解决方案准确率低1. 训练数据量太少或质量差。2. 类别不平衡。3. 模型复杂度与数据量不匹配过拟合或欠拟合。4. 超参数学习率、批次大小设置不当。1.增加数据收集更多标注数据或使用数据增强技术如回译、EDA。2.处理不平衡对少数类过采样或使用带权重的损失函数。3.调整模型数据少时尝试简化模型如用更小的BERT变体数据多时可尝试更大模型。使用早停法防止过拟合。4.调参进行超参数搜索使用学习率预热和衰减策略。预测速度慢1. 模型太大如BERT-large。2. 未使用GPU或批处理。3. 每次预测都重新加载模型/分词。1.模型轻量化使用蒸馏后的模型如DistilBERT、TinyBERT或使用ONNX Runtime加速。2.硬件与批处理确保使用GPU推理并对请求进行批处理以提升吞吐量。3.服务化将模型部署为常驻内存的API服务如使用FastAPI Uvicorn。对模糊句子如“思思想要思思又得到”判断不准1. 训练数据中缺乏类似句式。2. 模型未利用对话上下文。3. 未设置拒识机制。1.针对性增强数据人工构造或生成类似模糊、口语化的句子加入训练集。2.引入上下文将当前语句与前N轮对话拼接后作为模型输入。3.实现拒识如第3.2节所述设置置信度阈值对低置信度结果返回“未知意图”并引导用户澄清。线上效果与离线评估差异大1. 线上数据分布与训练/测试集不同数据漂移。2. 预处理分词、清洗逻辑线上线下不一致。1.监控与迭代建立线上预测日志定期抽样评估发现新意图或分布变化后更新训练数据。2.统一预处理确保训练和服务的预处理代码完全一致最好封装成共享模块。内存/显存溢出1. 输入序列过长。2. 批次大小设置过大。1.限制长度设置合理的max_length如128或256对超长文本进行截断或分段处理。2.调整批次减小batch_size。使用梯度累积来模拟大批次训练。6. 最佳实践与工程建议将意图识别模型投入生产环境需要考虑更多工程细节数据质量是生命线标注一致性确保不同标注员对同一意图的理解一致定期进行标注复审。覆盖度尽可能收集覆盖所有用户可能表达方式的句子特别是边缘案例和否定句。持续迭代建立数据闭环将线上识别不准的案例收集起来经过审核后加入训练集。模型服务化与性能API设计设计简洁明了的预测接口输入文本返回意图标签、置信度、可能的实体等信息。异步处理对于耗时较长的模型采用异步队列处理预测请求避免阻塞主线程。缓存策略对高频、重复的查询如“你好”、“谢谢”结果进行缓存大幅降低模型调用开销。多意图与意图组合用户一句话可能包含多个意图如“查一下天气然后设个闹钟”。可以考虑将其建模为序列标注问题或者使用管道模式先进行意图分割再进行单个意图识别。与下游模块的集成意图识别通常与实体识别NER结合。例如识别出query_item意图后需要进一步提取“思思”、“钥匙”等实体。识别出的意图和实体应传递给对话状态跟踪模块用于管理多轮对话的上下文。可解释性与日志记录每一次预测的输入、输出、置信度和模型版本便于问题回溯和模型效果分析。可以尝试使用注意力权重可视化等工具分析模型做出决策的依据增加可信度。A/B测试与灰度发布上线新模型时务必进行A/B测试对比新旧模型在关键指标如任务完成率、用户满意度上的差异。采用灰度发布策略先让小部分流量使用新模型稳定后再逐步扩大范围。通过以上步骤我们不仅能够教会模型理解“思思想要思思又得到”这样的句子更能构建一个健壮、可维护、可持续迭代的工业级意图识别系统。核心在于理解语义而非表象利用强大的预训练模型并结合扎实的工程实践让机器真正听懂用户的言外之意。

相关新闻

从零构建主题内容聚合站点:技术选型、部署与合规实践

从零构建主题内容聚合站点:技术选型、部署与合规实践

这次我们来看一个名为“越披哥2026”的项目,它并非传统的AI模型或开发工具,而是一个围绕特定主题内容(如综艺节目、粉丝创作)进行二次创作与分享的社区或内容集合。这类项目通常不涉及复杂的本地部署或API调用,其核心价…

2026/10/16 21:19:37 阅读更多 →
ElasticSearch核心架构与生产部署:从分布式搜索到实时分析引擎实战

ElasticSearch核心架构与生产部署:从分布式搜索到实时分析引擎实战

1. 从“数据库”到“搜索与分析引擎”:ElasticSearch的重新定位 提到ElasticSearch,很多刚接触的朋友会下意识地把它归到MySQL、Oracle这类关系型数据库的阵营里,毕竟名字里就带着“Search”,听起来像个专门搞搜索的数据库。我刚开…

2026/10/20 1:41:52 阅读更多 →
毛瑟C96玩具模型鉴别、拆解与改造全攻略:从新手到玩家

毛瑟C96玩具模型鉴别、拆解与改造全攻略:从新手到玩家

在实际玩具收藏和模型改造领域,很多爱好者会遇到一个看似简单却充满细节的问题:如何将不同品牌、不同型号的“毛瑟盒子炮”(即毛瑟C96手枪的俗称,这里指其玩具模型)进行对比、鉴别,甚至进行部件互换或功能升…

2026/10/16 18:14:07 阅读更多 →

最新新闻

【Spring-SSE】除了 SSE 和 WebSocket,还有哪些现代浏览器支持的服务器推送技术?各自的适用边界是什么?

【Spring-SSE】除了 SSE 和 WebSocket,还有哪些现代浏览器支持的服务器推送技术?各自的适用边界是什么?

现代浏览器服务器推送技术全景:风控规则热更新系统的架构选型与边界分析 发布时间:2026年04月01日 适用环境:Spring Boot 3.2.0+、JDK 17、Chrome 120+、Safari 16+、Firefox 115+ 用户问题原文:除了 SSE 和 WebSocket,还有哪些现代浏览器支持的服务器推送技术?各自的适…

2026/10/20 1:41:06 阅读更多 →
工业互联网建设方案:从数据链路到指标落地的实战指南

工业互联网建设方案:从数据链路到指标落地的实战指南

简介:一份42页的工业互联网建设方案PPT,面向智慧城市、智能制造、能源管理与农业数字化领域的方案架构师、项目经理及技术决策者,系统展示了从设备数据采集、边缘传输到平台化应用的完整建设路径。方案以工业物联网IoT平台为底座,…

2026/10/20 1:41:06 阅读更多 →
Code Mode vs 工具调用:AI Agent执行层范式转移与工程实践

Code Mode vs 工具调用:AI Agent执行层范式转移与工程实践

1. 从"调API"到"写代码":Agent执行层的分水岭过去两年,绝大多数AI Agent的执行层都建立在同一个假设上:模型需要什么能力,就给它挂一个对应的工具接口。查天气有天气API,搜网页有搜索工具&#xf…

2026/10/20 1:41:06 阅读更多 →
Tree-KG框架解析:树状知识图谱建模与路径查询实践

Tree-KG框架解析:树状知识图谱建模与路径查询实践

简介:清华Tree-KG框架可运行源码包,面向知识图谱、自然语言处理与大语言模型研究者,解决传统知识图谱构建在知识复杂度高、人工标注成本大、知识更新快等场景下的痛点。方案采用显式KG与隐式KG双层架构,结合教科书层次化结构与大模…

2026/10/20 1:41:06 阅读更多 →
Spring AI Alibaba停更后,Java开发者在大模型时代的四条出路

Spring AI Alibaba停更后,Java开发者在大模型时代的四条出路

说实话,这两天我的技术交流群被一个消息刷了屏:Spring AI Alibaba 停更了。群里瞬间哀嚎一片,不少后端同行直接问出了那个灵魂问题:“Java 还有希望吗?”我当时的反应是:别急着下结论。消息确实值得重视&am…

2026/10/20 1:41:06 阅读更多 →
【C++修炼】STL容器—list

【C++修炼】STL容器—list

list 1. list 的介绍 list 的文档介绍 list 属于 STL 六大组件之一——容器,前面已介绍过两种容器(string/vector),前两种容器都基于顺序表(数组),而 list 底层则是基于链表(通常为…

2026/10/20 1:40:05 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →