LLM对话系统安全实践:从提示词工程到内容过滤的完整指南
1. 引言对话场景中LLM应用的挑战与责任边界在人工智能技术快速发展的今天大型语言模型LLM已成为对话系统、智能客服、内容创作等领域的核心技术。然而随着LLM应用的普及开发者们面临着新的挑战如何在保证技术效果的同时确保对话内容的安全性、准确性和合规性。近期在实际项目中我们经常遇到LLM生成内容不可控、存在偏见或安全风险的问题这直接影响了产品的用户体验和商业价值。本文将从工程实践角度系统探讨如何在对话场景中负责任地使用LLM。我们将涵盖从基础概念到实际部署的全流程包括模型选择、提示词工程、安全过滤、监控机制等关键环节。无论你是刚接触LLM的新手还是有一定经验的开发者都能从中获得可直接落地的解决方案。2. LLM基础概念与对话应用场景2.1 什么是大型语言模型LLM大型语言模型是基于深度学习技术训练的自然语言处理模型能够理解和生成人类语言。从技术架构上看主流LLM通常采用Transformer架构通过预训练和微调两个阶段获得语言能力。预训练阶段让模型学习语言的统计规律和知识微调阶段则针对特定任务进行优化。在对话场景中LLM的核心价值在于其能够理解上下文、维持对话连贯性并生成符合语境的回复。与传统规则引擎相比LLM的优势在于其泛化能力和灵活性但同时也带来了可控性方面的挑战。2.2 对话系统中LLM的典型应用模式在实际对话系统设计中LLM主要应用于以下几种模式单轮问答场景用户提出明确问题LLM基于知识库生成直接答案。这种场景相对简单但需要确保答案的准确性和权威性。# 简单的单轮问答示例 def single_turn_qa(question, knowledge_base): # 首先从知识库检索相关信息 relevant_info retrieve_from_knowledge_base(question, knowledge_base) # 构建提示词限制LLM的回答范围 prompt f 基于以下信息回答问题如果信息不足请明确说明不知道。 相关信息{relevant_info} 问题{question} 请给出准确、简洁的回答 response llm.generate(prompt) return validate_response(response)多轮对话场景需要维护对话历史理解上下文关联。这种场景下LLM需要具备对话状态跟踪和能力。class ConversationManager: def __init__(self, max_history10): self.conversation_history [] self.max_history max_history def add_to_history(self, role, content): self.conversation_history.append({role: role, content: content}) # 保持历史记录在合理范围内 if len(self.conversation_history) self.max_history * 2: self.conversation_history self.conversation_history[-self.max_history*2:] def generate_response(self, user_input): # 构建包含对话历史的提示词 prompt self._build_prompt(user_input) response llm.generate(prompt) # 添加安全过滤和内容检查 safe_response self._apply_safety_filters(response) self.add_to_history(assistant, safe_response) return safe_response任务导向型对话帮助用户完成特定任务如预订机票、查询信息等。这类对话需要LLM与后端系统API进行集成。3. 环境准备与工具选型3.1 LLM服务接入方案选择根据项目需求和资源情况可以选择不同的LLM接入方案云端API服务如OpenAI GPT系列、百度文心一言、阿里通义千问等。适合快速原型开发和小规模应用。# 使用OpenAI API的示例配置 import openai from typing import Optional class OpenAIClient: def __init__(self, api_key: str, base_url: Optional[str] None): self.client openai.OpenAI( api_keyapi_key, base_urlbase_url or https://api.openai.com/v1 ) def chat_completion(self, messages, modelgpt-3.5-turbo, **kwargs): try: response self.client.chat.completions.create( modelmodel, messagesmessages, **kwargs ) return response.choices[0].message.content except Exception as e: # 重要的错误处理逻辑 logger.error(fAPI调用失败: {str(e)}) return 抱歉服务暂时不可用请稍后重试。本地部署模型如Llama、ChatGLM等开源模型。适合数据敏感或需要定制化训练的场景。# 使用Ollama本地部署LLM的示例 # 安装Ollama curl -fsSL https://ollama.ai/install.sh | sh # 拉取模型 ollama pull llama2:7b # 启动服务 ollama serve3.2 开发环境配置确保开发环境包含必要的监控和调试工具# 基础配置类 import logging from dataclasses import dataclass from typing import Dict, Any dataclass class LLMConfig: model_name: str max_tokens: int 2048 temperature: float 0.7 timeout: int 30 retry_times: int 3 # 安全相关配置 enable_content_filter: bool True max_query_length: int 1000 prohibited_topics: list None class LLMConversation: def __init__(self, config: LLMConfig): self.config config self.logger self._setup_logging() self.safety_checker SafetyChecker(config.prohibited_topics) def _setup_logging(self): logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s ) return logging.getLogger(__name__)4. 负责任使用LLM的核心原则4.1 透明度原则用户有权知道正在与AI对话而不是人类。在对话开始时明确说明AI身份避免误导。def initialize_conversation(self): 初始化对话明确AI身份 welcome_message 我是AI助手基于大型语言模型技术为您提供服务。 请注意 1. 我是人工智能不是真人 2. 我的知识截止于训练数据的时间点 3. 对于重要决策请咨询专业人士 请问有什么可以帮您 return welcome_message4.2 准确性验证机制建立多层次的准确性验证体系防止错误信息传播。class FactChecker: def __init__(self, knowledge_sources): self.knowledge_sources knowledge_sources def verify_response(self, response, original_query): 验证回答的准确性 # 1. 内部一致性检查 if self._check_internal_consistency(response): return False, 检测到内部矛盾 # 2. 与知识库对比 knowledge_match self._check_against_knowledge(response, original_query) if knowledge_match 0.7: # 相似度阈值 return False, 与已知信息不符 # 3. 置信度评估 confidence self._assess_confidence(response) if confidence 0.8: return False, 信息置信度不足 return True, 验证通过4.3 安全与合规框架构建完整的内容安全过滤系统确保生成内容符合法律法规和道德标准。class SafetyChecker: def __init__(self, prohibited_patterns): self.prohibited_patterns prohibited_patterns or [] self.toxicity_detector ToxicityDetector() def check_content(self, text): 多层次内容安全检查 checks [ self._check_prohibited_topics(text), self._check_toxicity(text), self._check_personal_info(text), self._check_legal_compliance(text) ] # 任何一项检查不通过即拒绝 for check_name, passed, reason in checks: if not passed: self.logger.warning(f安全检查失败: {check_name} - {reason}) return False, reason return True, 安全检查通过 def _check_prohibited_topics(self, text): 检查是否涉及禁止话题 for pattern in self.prohibited_patterns: if pattern.lower() in text.lower(): return 禁止话题检查, False, f涉及禁止话题: {pattern} return 禁止话题检查, True, 通过5. 实战构建负责任的对话系统5.1 系统架构设计设计一个模块化的对话系统每个环节都包含责任控制机制。class ResponsibleConversationSystem: def __init__(self, llm_client, safety_checker, fact_checker): self.llm_client llm_client self.safety_checker safety_checker self.fact_checker fact_checker self.conversation_history [] def process_message(self, user_input): 处理用户输入的全流程 # 1. 输入预处理和安全检查 safe_input, input_check_reason self.safety_checker.check_content(user_input) if not safe_input: return f输入内容不符合安全要求: {input_check_reason} # 2. 生成响应 raw_response self.llm_client.generate_response( user_input, self.conversation_history ) # 3. 响应安全性检查 safe_response, response_check_reason self.safety_checker.check_content(raw_response) if not safe_response: return 抱歉我无法生成合适的回复。 # 4. 事实准确性验证针对知识性回答 if self._is_knowledge_query(user_input): is_accurate, accuracy_reason self.fact_checker.verify_response( raw_response, user_input ) if not is_accurate: return 我无法确认这个信息的准确性建议您查阅权威资料。 # 5. 记录对话历史 self._update_conversation_history(user_input, raw_response) return raw_response5.2 提示词工程最佳实践设计有效的提示词是确保LLM负责任行为的关键。def build_safe_prompt(user_input, conversation_history, system_roleassistant): 构建安全的提示词模板 system_message 你是一个有帮助的AI助手。请遵守以下准则 1. 提供准确、有用的信息 2. 如果不知道答案明确说明而不是猜测 3. 避免讨论敏感或有害话题 4. 保持专业和友好的语气 5. 对于医疗、法律、金融等专业问题建议咨询专业人士 当前对话上下文 # 添加对话历史 history_text \n.join([ f{msg[role]}: {msg[content]} for msg in conversation_history[-6:] # 最近3轮对话 ]) full_prompt f{system_message}\n{history_text}\n\n用户: {user_input}\n助手: return full_prompt5.3 实现上下文感知的对话管理class ContextAwareDialogManager: def __init__(self): self.dialog_state { current_topic: None, user_intent: None, sensitive_topics_mentioned: False, conversation_turn: 0 } def update_dialog_state(self, user_input, ai_response): 更新对话状态 self.dialog_state[conversation_turn] 1 # 检测话题变化 new_topic self._detect_topic(user_input) if new_topic ! self.dialog_state[current_topic]: self.dialog_state[current_topic] new_topic self.dialog_state[sensitive_topics_mentioned] False # 检查敏感话题 if self._contains_sensitive_topic(user_input ai_response): self.dialog_state[sensitive_topics_mentioned] True # 识别用户意图 self.dialog_state[user_intent] self._classify_intent(user_input) def should_terminate_conversation(self): 判断是否应该终止对话 conditions [ self.dialog_state[sensitive_topics_mentioned] and self.dialog_state[conversation_turn] 10, self.dialog_state[conversation_turn] 50, # 对话轮次过多 ] return any(conditions)6. 监控与评估体系6.1 建立完整的监控指标class ConversationMonitor: def __init__(self): self.metrics { total_conversations: 0, safety_violations: 0, accuracy_issues: 0, user_satisfaction: 0, average_response_time: 0 } def record_conversation(self, user_input, ai_response, safety_check_passed, response_time, user_feedbackNone): 记录对话指标 self.metrics[total_conversations] 1 self.metrics[average_response_time] ( self.metrics[average_response_time] * (self.metrics[total_conversations] - 1) response_time ) / self.metrics[total_conversations] if not safety_check_passed: self.metrics[safety_violations] 1 if user_feedback is not None: self.metrics[user_satisfaction] ( self.metrics[user_satisfaction] * (self.metrics[total_conversations] - 1) user_feedback ) / self.metrics[total_conversations]6.2 自动化测试框架import unittest from unittest.mock import Mock class TestResponsibleLLM(unittest.TestCase): def setUp(self): self.llm_system ResponsibleConversationSystem( Mock(), Mock(), Mock() ) def test_safety_filtering(self): 测试安全过滤功能 test_cases [ (正常问题, True), (敏感话题, False), (含有不当内容的问题, False) ] for input_text, should_pass in test_cases: with self.subTest(input_textinput_text): # 模拟安全检查 self.llm_system.safety_checker.check_content Mock( return_value(should_pass, 测试原因) ) result self.llm_system.process_message(input_text) if not should_pass: self.assertIn(安全要求, result)7. 常见问题与解决方案7.1 安全性问题排查问题1LLM生成不当内容现象模型生成包含偏见、歧视或有害信息的内容解决方案加强提示词中的安全约束实现多层内容过滤使用专门的安全检测模型def enhance_safety_prompt(base_prompt): 增强安全约束的提示词 safety_addendum 重要安全约束 - 绝不生成暴力、歧视、仇恨言论 - 不提供医疗诊断、法律建议等专业服务 - 不生成个人信息或隐私内容 - 遇到不确定的问题时明确说明局限性 return base_prompt safety_addendum问题2对话上下文管理混乱现象在多轮对话中模型忘记重要约束或偏离主题解决方案定期在对话中重新注入系统提示实现对话状态跟踪设置对话轮次限制7.2 性能与准确性优化问题3响应速度慢现象对话响应延迟影响用户体验解决方案实现响应缓存机制优化提示词长度使用更高效的模型版本class ResponseCache: def __init__(self, max_size1000, ttl3600): self.cache {} self.max_size max_size self.ttl ttl # 缓存存活时间秒 def get_cached_response(self, query_hash): 获取缓存响应 if query_hash in self.cache: cached_time, response self.cache[query_hash] if time.time() - cached_time self.ttl: return response return None def cache_response(self, query_hash, response): 缓存响应 if len(self.cache) self.max_size: # 简单的LRU淘汰策略 oldest_key min(self.cache.keys(), keylambda k: self.cache[k][0]) del self.cache[oldest_key] self.cache[query_hash] (time.time(), response)8. 生产环境部署最佳实践8.1 安全部署配置# deployment-config.yaml api: rate_limiting: requests_per_minute: 60 burst_limit: 10 safety: content_filter: enabled: true model: safety-checker-v2 confidence_threshold: 0.9 input_validation: max_length: 2000 prohibited_patterns: - 敏感词1 - 敏感词2 monitoring: metrics: - response.quality - safety.violations - user.satisfaction alerting: enabled: true safety_violation_threshold: 58.2 灾难恢复与降级策略class FallbackStrategy: def __init__(self): self.fallback_responses { safety_violation: 抱歉我无法回答这个问题。, service_unavailable: 服务暂时不可用请稍后重试。, timeout: 响应超时请简化您的问题。 } def get_fallback_response(self, error_type, original_query): 获取降级响应 base_response self.fallback_responses.get( error_type, 发生未知错误。 ) # 记录降级事件用于后续分析 self._log_fallback_event(error_type, original_query) return base_response def _log_fallback_event(self, error_type, query): 记录降级事件 logger.info(f降级响应触发 - 类型: {error_type}, 查询: {query[:100]})8.3 持续优化流程建立基于用户反馈的持续优化机制class FeedbackLoop: def __init__(self): self.feedback_data [] def collect_feedback(self, conversation_id, user_rating, user_comments): 收集用户反馈 feedback_record { conversation_id: conversation_id, rating: user_rating, comments: user_comments, timestamp: datetime.now() } self.feedback_data.append(feedback_record) def analyze_feedback_trends(self): 分析反馈趋势 if len(self.feedback_data) 10: return 数据不足进行趋势分析 recent_feedback self.feedback_data[-100:] # 最近100条反馈 average_rating sum(fb[rating] for fb in recent_feedback) / len(recent_feedback) # 提取常见问题关键词 common_issues self._extract_common_issues(recent_feedback) return { average_rating: average_rating, common_issues: common_issues, sample_size: len(recent_feedback) }9. 伦理与法律考量9.1 数据隐私保护在对话系统设计中必须严格遵守数据隐私保护原则class PrivacyProtection: def __init__(self, data_retention_days30): self.data_retention_days data_retention_days def anonymize_conversation_data(self, conversation_data): 匿名化对话数据 anonymized conversation_data.copy() # 移除可能识别个人身份的信息 anonymized[user_id] self._hash_user_id(conversation_data[user_id]) anonymized[ip_address] None # 检测并移除个人信息 anonymized[content] self._remove_pii(conversation_data[content]) return anonymized def auto_delete_old_data(self): 自动删除过期数据 cutoff_date datetime.now() - timedelta(daysself.data_retention_days) # 执行数据删除逻辑 self._delete_data_older_than(cutoff_date)9.2 合规性检查清单定期进行合规性审计确保系统符合相关法律法规[ ] 用户知情同意机制是否完善[ ] 数据收集和处理是否符合最小必要原则[ ] 是否有明确的数据保留和删除政策[ ] 是否提供用户数据导出和删除功能[ ] 安全措施是否达到行业标准10. 总结与后续学习方向构建负责任的LLM对话系统是一个系统工程需要技术能力、伦理意识和工程实践的结合。本文介绍的方法和代码示例可以作为一个起点但实际项目中还需要根据具体需求进行调整和优化。关键要点回顾透明度和知情同意是负责任AI的基础多层安全过滤确保内容安全性准确性验证防止错误信息传播持续监控和优化保持系统可靠性后续可以深入学习的领域更先进的提示词工程技术多模态对话系统开发个性化与自适应对话管理联邦学习在对话系统中的应用在实际项目中建议从小规模开始逐步验证每个环节的有效性建立完整的测试和监控体系。负责任地使用LLM不仅是对用户负责也是确保技术可持续发展的关键。

相关新闻

工业焊接自动化中焊枪姿态检测数据集构建与应用

工业焊接自动化中焊枪姿态检测数据集构建与应用

1. 项目背景与核心价值在工业焊接自动化领域,焊枪姿态的精确检测直接关系到焊接质量和工艺稳定性。传统人工检测方式存在效率低、主观性强等问题,而基于计算机视觉的自动化检测方案正在逐步替代人工。这个包含1730张图像、YOLO格式标注、1个类别和2个关键…

2026/10/4 20:27:10 阅读更多 →
AI智能体技术解析与学习路径指南

AI智能体技术解析与学习路径指南

1. 智能体(AI Agent)技术全景解析在2023年ChatGPT引爆AI热潮后,智能体技术正以惊人的速度渗透到各行各业。不同于传统AI模型的被动响应模式,智能体具备自主感知、决策和执行能力,能够像数字员工一样完成复杂任务链。根…

2026/10/5 22:03:44 阅读更多 →
基于Markdown与MCP协议的项目管理平台实战指南

基于Markdown与MCP协议的项目管理平台实战指南

基于 Markdown 的项目管理平台:从 CLI 到 MCP 协议的完整实战指南在软件开发团队中,项目管理工具的选择往往决定了协作效率。传统项目管理平台虽然功能丰富,但常常伴随着复杂的界面、臃肿的功能和陡峭的学习曲线。最近,基于 Markd…

2026/10/4 0:16:02 阅读更多 →

最新新闻

配置光猫的上网与IPTV通过LAN1口单线复用

配置光猫的上网与IPTV通过LAN1口单线复用

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

2026/10/5 22:02:09 阅读更多 →
STM32F745VG驱动MR25H40CDF MRAM:SPI配置与工业存储实战

STM32F745VG驱动MR25H40CDF MRAM:SPI配置与工业存储实战

1. 为什么工业现场还在用 MRAM,而不是继续堆 Flash如果你拆过工业网关、PLC 扩展模块或者电力监测终端,大概率会在板子上看到一颗 8 脚的小芯片,旁边紧挨着一颗 STM32 或者类似的 MCU。过去十年,这个位置基本被 SPI Flash 和 EEPR…

2026/10/5 22:02:09 阅读更多 →
STM32L496ZG 与 MR25H40CDF MRAM 高速存储方案实战

STM32L496ZG 与 MR25H40CDF MRAM 高速存储方案实战

1. 为什么偏偏是 MRAM 加 STM32L496ZG 这个组合搞嵌入式存储选型这些年,我经手的方案从 24C02 这种 I2C EEPROM 到 W25Q 系列 SPI Flash,再到铁电存储器 FRAM,几乎把能踩的坑都踩了一遍。直到项目里开始频繁出现“高频写入、掉电不能丢、还要…

2026/10/5 22:01:08 阅读更多 →
工业嵌入式存储方案:SPI MRAM与8位MCU的实战配置与掉电保护

工业嵌入式存储方案:SPI MRAM与8位MCU的实战配置与掉电保护

嵌入式存储方案里,SPI接口的MRAM和8位MCU的组合,算是工业场景里一个相当务实的搭配。MR25H40CDF这颗4Mb的磁性随机存储器,配合PIC18F96J94这颗带自编程能力的8位微控制器,能解决不少传统方案里掉电丢数据、写入寿命不够、写入速度…

2026/10/5 22:01:08 阅读更多 →
STM32L496ZG驱动MR25H40CDF:MRAM嵌入式存储实战

STM32L496ZG驱动MR25H40CDF:MRAM嵌入式存储实战

1. 为什么 MRAM 在嵌入式存储里越来越受关注搞过工业设备或者数据采集终端的朋友应该都有体会,选存储芯片这件事,看着简单,实际上坑特别多。EEPROM 写入慢、寿命有限;NOR Flash 擦除块大、写入前必须擦除;FRAM 速度快但…

2026/10/5 22:00:06 阅读更多 →
软考-系统架构师论文(一)

软考-系统架构师论文(一)

一、论文考试规则考试规则:120 分钟,4 道题目选 1 道写;总分 75,≥45 分及格;全文一般要求2000 字左右 摘要 300 字,机考(打字)二、核心考察目标不是作文,考架构落地经验…

2026/10/5 21:58:05 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

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

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

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

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 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/4 11:40:45 阅读更多 →
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/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练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/4 20:14:29 阅读更多 →