Prompt 在游戏 NPC Agent 中的应用:角色一致性、记忆和交互逻辑
Prompt 在游戏 NPC Agent 中的应用角色一致性、记忆和交互逻辑一、深度引言与场景痛点大家好我是赵咕咕。去年我们参与了一个开放世界游戏的 NPC 对话系统项目。游戏里有 200 多个 NPC每个都有自己的背景故事、性格特征和行为逻辑。产品经理想实现的是玩家走过去跟 NPC 聊天NPC 能真正像那个人一样回应记住之前跟玩家的互动并根据自己的性格做出合理反应。原型阶段我们用了一个简单的 System Prompt 定义角色你是一个脾气暴躁的铁匠住在北境讨厌说废话。——效果还行大概 60% 的对话让人感觉合理。但进入测试阶段问题爆发了NPC 经常失忆上一轮玩家送了铁匠一壶酒下一轮铁匠完全不记得。性格不稳定同一个铁匠有时候很暴躁有时候突然变温柔因为 LLM 当时心情好。世界观不一致中世纪背景的铁匠突然说我去 Google 一下。这篇文章我把 NPC Agent 的 Prompt 工程方案——角色一致性、记忆系统和交互逻辑——完整整理出来。二、底层机制与原理深度剖析2.1 NPC Agent 和通用 Chat Agent 的本质区别通用 Chat Agent 只需要回答用户问题NPC Agent 需要扮演一个角色——这意味着它不仅要作出正确的回答还要以符合角色的方式作答。三个核心挑战角色一致性铁匠永远脾气暴躁诗人永远文绉绉。不能偶尔温柔。记忆系统记住跟玩家交互过的历史赠礼、任务、对话内容。交互逻辑根据关系值、玩家等级、背包物品等游戏状态调整行为。2.2 NPC Prompt 的六层结构这六层结构的核心设计原则角色档案是锚点所有的行为都从角色档案推导。铁匠不会写诗诗人不会打铁——这是硬约束。记忆是上下文短期记忆保证对话连贯性长期记忆保证老朋友见面的亲近感。交互逻辑是动态层好感度、任务状态是变量影响 NPC 的态度和可选项。安全边界是底线NPC 不能说我是 AI、不能透露游戏机制。2.3 为什么通用 LLM 很难保持角色一致性LLM 的本质是概率模型。当你让 LLM扮演一个脾气暴躁的铁匠它在概率空间中找最可能的铁匠回答——但它不知道上一句是不是骂了人也不知道这个铁匠三小时前是怎么说话的。解决方案是在每次生成时将角色状态显式注入 Prompt。不是简单地扮演铁匠而是你现在扮演铁匠汉斯你当前的心情是【愤怒因为刚才被玩家拒绝】你对玩家的好感度是【-15】你记得上次玩家【偷了你的矿石】。每一条都是对 LLM 概率空间的约束让它的生成偏向于愤怒的铁匠而不是中性的铁匠。三、生产级代码实现import asyncio import logging from dataclasses import dataclass, field from datetime import datetime, timezone from enum import Enum from typing import Any from pydantic import BaseModel, Field logger logging.getLogger(__name__) # ─── 数据模型 ─── class NPCPersonality(str, Enum): FRIENDLY friendly GRUMPY grumpy MYSTERIOUS mysterious CHEERFUL cheerful COLD cold TIMID timid class RelationLevel(str, Enum): HOSTILE hostile # -30 COLD cold # -30 ~ -10 NEUTRAL neutral # -10 ~ 10 WARM warm # 10 ~ 30 CLOSE close # 30 ~ 60 TRUSTED trusted # 60 dataclass class NPCProfile: NPC 角色档案。 npc_id: str name: str title: str # 职业/身份 personality: NPCPersonality background: str # 背景故事100-300 字 knowledge: list[str] # 知识范围不能超出 speech_style: str # 说话风格指令 forbidden_topics: list[str] field(default_factorylist) def build_system_prompt(self) - str: 从角色档案构建 System Prompt。 personality_guide { NPCPersonality.FRIENDLY: 说话热情友好喜欢帮助他人经常笑, NPCPersonality.GRUMPY: 说话简短粗暴不耐烦讨厌废话但心地不坯, NPCPersonality.MYSTERIOUS: 说话含糊其辞喜欢用隐喻不直接回答问题, NPCPersonality.CHEERFUL: 说话充满活力乐观积极喜欢开玩笑, NPCPersonality.COLD: 说话冷漠疏离惜字如金从不主动搭话, NPCPersonality.TIMID: 说话小心翼翼容易紧张声音小, } guide personality_guide.get( self.personality, 说话自然 ) return f你是游戏中的 NPC必须严格扮演你的角色。 ## 四、边界分析与架构权衡 - 名字: {self.name} - 身份: {self.title} - 性格: {self.personality.value} - 说话风格: {guide} - 额外风格: {self.speech_style} ## 五、总结 {self.background} ## 你知道的事不要超出这个范围 {chr(10).join(f- {k} for k in self.knowledge)} ## 严格禁止 - 禁止谈论游戏机制升级/经验/掉落率等 - 禁止说你是一个 AI 或程序 - 禁止使用现代词汇手机/网络/电脑等 - 禁止透露你不知道的信息 - 禁止打破第四面墙 {chr(10).join(f- {t} for t in self.forbidden_topics)} ## 回复规则 - 每次回复 30-80 字 - 符合说话风格 - 根据好感度调整态度 - 记住和玩家的历史互动 class NPCMemory(BaseModel): NPC 记忆系统。 npc_id: str player_id: str # 短期记忆最近 5 轮对话 recent_dialogues: list[dict[str, str]] Field( default_factorylist, max_length10, ) # 长期记忆摘要 memory_summary: str # 关键记忆节点 key_memories: list[dict[str, Any]] Field( default_factorylist, ) # 好感度 (-100 ~ 100) affection: int Field(default0, ge-100, le100) property def relation_level(self) - RelationLevel: if self.affection -30: return RelationLevel.HOSTILE elif self.affection -10: return RelationLevel.COLD elif self.affection 10: return RelationLevel.NEUTRAL elif self.affection 30: return RelationLevel.WARM elif self.affection 60: return RelationLevel.CLOSE return RelationLevel.TRUSTED def add_dialogue(self, player_said: str, npc_said: str) - None: 添加一轮对话到短期记忆。 self.recent_dialogues.append({ player: player_said, npc: npc_said, }) # 只保留最近 5 轮 if len(self.recent_dialogues) 10: self.recent_dialogues self.recent_dialogues[-10:] def adjust_affection(self, delta: int) - int: 调整好感度。 self.affection max(-100, min(100, self.affection delta)) return self.affection def build_context(self) - str: 构建记忆上下文注入 Prompt。 parts [] # 关系状态 relation_desc { RelationLevel.HOSTILE: 极度厌恶, RelationLevel.COLD: 态度冷淡, RelationLevel.NEUTRAL: 关系普通, RelationLevel.WARM: 比较友善, RelationLevel.CLOSE: 关系亲密, RelationLevel.TRUSTED: 完全信任, } parts.append( f当前关系: {relation_desc[self.relation_level]} f(好感度 {self.affection}) ) # 短期记忆 if self.recent_dialogues: parts.append(最近对话:) for d in self.recent_dialogues[-4:]: parts.append( f 玩家: {d[player]}\n f {self.npc_id}: {d[npc]} ) # 长期记忆 if self.memory_summary: parts.append(f之前的互动总结: {self.memory_summary}) # 关键记忆 if self.key_memories: parts.append(重要事件:) for m in self.key_memories[-3:]: parts.append(f - {m.get(event, )}) return \n.join(parts) class NPCInteractionSystem: NPC 交互系统。 def __init__( self, npc: NPCProfile, memory: NPCMemory, llm_client: Any, memory_store: Any, # Redis/DB 用于持久化记忆 ): self._npc npc self._memory memory self._llm llm_client self._memory_store memory_store async def interact( self, player_input: str, game_context: dict[str, Any] | None None ) - dict[str, Any]: NPC 与玩家交互的主入口。 # 1) 解析意图和情感 intent await self._analyze_intent(player_input) # 2) 根据交互更新好感度 affection_delta self._calculate_affection_delta( intent, game_context or {} ) self._memory.adjust_affection(affection_delta) # 3) 构建 Prompt prompt self._build_interaction_prompt( player_input, game_context or {} ) # 4) LLM 生成回复 response await self._generate_response(prompt) # 5) 输出自检 response await self._consistency_check(response, player_input) # 6) 更新记忆 self._memory.add_dialogue(player_input, response) # 7) 持久化记忆 await self._save_memory() return { npc_name: self._npc.name, response: response, affection: self._memory.affection, relation: self._memory.relation_level.value, affection_delta: affection_delta, } async def _analyze_intent( self, player_input: str ) - dict[str, Any]: 分析玩家意图和情感。 prompt f分析以下对话的意图和情感。 对话: {player_input} 返回 JSON: {{ intent: 问候/询问/请求/挑衅/赠送/道别/闲聊, emotion: 积极/中性/消极, is_gift: true/false, is_insult: true/false }} try: response await self._llm.chat.completions.create( modelgpt-4o-mini, messages[{role: user, content: prompt}], temperature0, response_format{type: json_object}, ) import json return json.loads( response.choices[0].message.content or {} ) except Exception: return {intent: 闲聊, emotion: 中性} def _calculate_affection_delta( self, intent: dict[str, Any], game_context: dict[str, Any] ) - int: 根据意图和游戏状态计算好感度变化。 delta 0 # 基础情绪影响 if intent.get(emotion) 积极: delta 2 elif intent.get(emotion) 消极: delta - 3 # 特殊行为 if intent.get(is_gift): delta 5 # 赠礼 5 if intent.get(is_insult): delta - 10 # 侮辱 -10 # 性格修正 if self._npc.personality NPCPersonality.GRUMPY: # 暴躁 NPC 好感增长较慢 delta max(0, delta - 1) if delta 0 else delta # 关系修正好感度越高增长越慢 if self._memory.affection 50: delta max(1, delta - 1) return delta def _build_interaction_prompt( self, player_input: str, game_context: dict[str, Any] ) - str: 构建完整的交互 Prompt。 system self._npc.build_system_prompt() memory_context self._memory.build_context() # 游戏状态上下文 game_state if game_context: time_of_day game_context.get(time_of_day, 白天) weather game_context.get(weather, 晴朗) location game_context.get(location, 未知) game_state ( f当前游戏状态: {time_of_day}, {weather}, f你在 {location}。 ) full_prompt f{system} ## 当前记忆状态 {memory_context} ## 当前环境 {game_state} ## 玩家刚才说的话 {player_input} 请以{self._npc.name}的身份回复。 return full_prompt async def _generate_response(self, prompt: str) - str: 调用 LLM 生成 NPC 回复。 try: response await self._llm.chat.completions.create( modelgpt-4o, messages[{role: user, content: prompt}], temperature0.7, max_tokens150, ) return response.choices[0].message.content or ... except Exception as e: logger.error(NPC 回复生成失败: %s, e) return ……沉默 async def _consistency_check( self, response: str, player_input: str ) - str: 回复一致性自检。 check_prompt f检查以下 NPC 回复是否违背角色设定。 NPC: {self._npc.name}{self._npc.title}, 性格{self._npc.personality.value} 玩家说: {player_input} NPC 回复: {response} 检查项: 1. 是否违背了角色性格 2. 是否使用了现代词汇 3. 是否透露了不该知道的信息 4. 是否打破了第四面墙 如果全部通过返回 {{pass: true}}。 如果有问题返回 {{pass: false, issue: 问题描述}}。 try: check await self._llm.chat.completions.create( modelgpt-4o-mini, messages[{role: user, content: check_prompt}], temperature0, response_format{type: json_object}, ) import json result json.loads( check.choices[0].message.content or {pass: true} ) if not result.get(pass, True): logger.warning( NPC 一致性检查失败: %s, result.get(issue, ) ) # 重修回复 return await self._generate_response( self._build_interaction_prompt(player_input, {}) f\n注意上次回复被拒绝原因{result.get(issue)}。请重新回复。 ) except Exception: pass return response async def _save_memory(self) - None: 持久化记忆到 Redis。 if not self._memory_store: return try: key fnpc_memory:{self._npc.npc_id}:{self._memory.player_id} await self._memory_store.set( key, self._memory.model_dump_json(), ttl86400 * 7 ) except Exception as e: logger.error(记忆持久化失败: %s, e) # ─── 使用示例 ─── async def main(): # 铁匠汉斯的角色档案 blacksmith NPCProfile( npc_idblacksmith_hans, name汉斯, title北境铁匠, personalityNPCPersonality.GRUMPY, background( 汉斯是北境最有名的铁匠年轻时曾为国王打造过佩剑。 他脾气暴躁但手艺精湛讨厌讨价还价的客人。 他喜欢喝烈酒但从不喝醉。他对徒弟很严厉但内心关心他们。 ), knowledge[ 锻造、冶金、武器修理, 北境的地理和天气, 国王的往事但不愿多谈, 矿石的价格和品质, ], speech_style说话简短直接用词粗犷经常用打铁的比喻。不耐烦时说哼、啧。, forbidden_topics[ 不提他为什么离开王都, 不谈论南方贵族, ], ) # 玩家记忆 memory NPCMemory( npc_idblacksmith_hans, player_idplayer_001, affection5, # 初始好感度 5中立偏友善 ) system NPCInteractionSystem( npcblacksmith, memorymemory, llm_clientNone, # 实际初始化 memory_storeNone, ) # 模拟交互 result await system.interact( 汉斯大叔帮我修一下这把剑, game_context{time_of_day: 黄昏, weather: 下雪}, ) print(f{result[npc_name]}: {result[response]}) print(f好感度变化: {result[affection_delta]:d}) print(f当前关系: {result[relation]}) if __name__ __main__: asyncio.run(main())代码的关键设计角色档案→System Prompt 自动构建NPCProfile 通过build_system_prompt()生成完整的 System Prompt包括性格指南、知识范围、禁止事项。动态好感度根据玩家意图问候/挑衅/赠礼和 NPC 性格暴躁/友好动态计算好感度变化。好感度影响 NPC 的对话态度。六层记忆结构短期对话、长期摘要、关键事件节点、好感度数值都在每次交互时注入 Prompt。一致性自检回复生成后用轻量模型做自检——是否违背角色性格是否用了现代词汇如果不通过重新生成。记忆持久化每次交互结束后将记忆序列化到 Redis保证玩家下次登录时 NPC 的记忆不丢失。四、边界分析与架构权衡4.1 记忆系统的容量管理长期记忆不能无限增长。如果玩家和 NPC 交互了 500 轮全部注入 Prompt 会超过 context window。解决方案记忆摘要 遗忘机制。每 20 轮交互后用 LLM 做一次记忆摘要把 20 轮对话压缩为 100 字摘要。关键事件节点赠礼/任务完成/好感度重大变化永久保留。旧摘要的权重随时间衰减超过 30 天的交互摘要被丢弃。4.2 性格一致性的提示词技巧技巧示例效果正例 反例你应该这样说……你不应该这样说……说话风格标签用粗犷的口吻效果中等LLM 理解模糊禁止列表严禁说你好、谢谢效果一般LLM 可能忽略Temperature 控制temperature0.7控制创造力但一致性下降一致性自检生成后自检 重修最可靠但增加 token 消耗和延迟最佳组合是正反例示例Few-shot 一致性自检。Few-shot 给 LLM 一个明确的行为模板自检做最后的门禁。4.3 好感度系统的设计好感度不能是简单的线性增长——现实中人际关系有瓶颈期和爆发点。设计建议瓶颈设计好感度以 20 为区间每突破一个区间需要一次关键事件任务完成/赠礼/重大帮助。回归设计长时间不互动7 天好感度每天 -1模拟感情变淡。性格修正友好 NPC 好感度增长快冷漠 NPC 增长慢。4.4 什么时候 NPC Agent 可以真正像人当前技术的天花板短期对话 10 轮可以做到 90% 的角色一致性。中期对话10-50 轮需要记忆摘要辅助一致性约 75%。长期对话 50 轮记忆管理成为核心挑战需要大量工程工作。完全像人的 NPC 还需要 LLM 在长程记忆和情感模拟方面的根本性突破。目前只能做到在短对话中足够像人。五、总结NPC Agent 的 Prompt 工程是一门角色约束的艺术——不是让 LLM 自由发挥而是通过多层约束把 LLM 锁定在一个角色里。六层 Prompt 结构角色档案定义我是谁——身份、性格、故事。知识边界定义我知道什么——不能超出。禁令列表定义我绝对不能做什么——最后防线。记忆系统提供上下文——我们之前聊过什么。关系系统提供情感上下文——我对你的好感度是多少。一致性自检兜底——我刚才说的符合角色吗前五层是约束的注入第六层是约束的验证。两者缺一不可。真正优秀的 NPC 对话系统不是让玩家觉得在和人类对话而是让玩家愿意相信这个角色是真实存在的。这需要的不是最强的模型而是最精心设计的角色约束。下一篇预告短视频内容理解 Agent多模态 embedding 在视频检索中的工程挑战。

相关新闻

聚龙汇刘睿带队赴苏州考察智能制造园区

聚龙汇刘睿带队赴苏州考察智能制造园区

7月中旬,长三角的梅雨季刚过,苏州工业园区的香樟树叶子还挂着雨后的水珠,空气里满是湿润的草木香气,聚龙汇刘睿带领近30名来自装备制造、工业软件行业的学员,前往苏州工业园区开展为期两天的智能制造专项调研。这次出行…

2026/10/14 16:59:02 阅读更多 →
Python 3.14无GIL性能实测与多线程优化分析

Python 3.14无GIL性能实测与多线程优化分析

1. 项目概述:Python 3.14无GIL性能实测 作为一名长期跟踪Python演进的开发者,当我看到Python 3.14发布消息时,最吸引我注意的是其"无GIL"特性。GIL(全局解释器锁)一直是Python多线程性能的瓶颈,这…

2026/10/12 21:19:17 阅读更多 →
稳定日收益200+,一台设备全天运行的最省心项目推荐

稳定日收益200+,一台设备全天运行的最省心项目推荐

# 稳定日收益200,一台设备全天运行的最省心项目推荐在众多“挂机赚钱”的项目中,绝大多数要么收益不稳定,要么需要频繁手动操作,要么存在封号或跑路风险。经过长期实践和筛选,我找到一个真正符合“稳、省心、可持续”的…

2026/10/5 11:05:31 阅读更多 →

最新新闻

C4D插件Octane 4.0 RC7上手指南:安装、调参与避坑

C4D插件Octane 4.0 RC7上手指南:安装、调参与避坑

简介:面向C4D用户的OctaneRender 4.0 RC7渲染器资源包,覆盖C4D R15至R20等主流版本,专为需要GPU加速、实时预览和照片级输出的设计师打造。压缩包共605个文件,内含184张png贴图、164个res资源文件、80个str字符串、78个h头文件与6…

2026/10/15 13:02:27 阅读更多 →
VS Code配置MATLAB:小白零基础到跑通全流程

VS Code配置MATLAB:小白零基础到跑通全流程

你是不是也经历过这种场景:只是想改一行 plot 的颜色,却得等 MATLAB 那个慢悠悠的启动界面转半天;想翻一翻别人几十个 .m 文件组成的项目,自带编辑器又让你在文件树和标签页之间来回折腾。于是大家自然都想到同一个问题——VS Cod…

2026/10/15 13:02:27 阅读更多 →
Flutter安全库sec的鸿蒙适配与性能优化实践

Flutter安全库sec的鸿蒙适配与性能优化实践

1. 项目背景与核心价值在跨平台开发领域,Flutter因其高效的渲染性能和跨端一致性备受开发者青睐。而sec作为Flutter生态中重要的安全加解密库,其鸿蒙化适配对于构建全场景安全应用具有关键意义。最近我在为某金融类应用做鸿蒙适配时,发现sec库…

2026/10/15 13:02:27 阅读更多 →
DFTtoolbox:MATLAB离散傅里叶变换工程化验证工具箱

DFTtoolbox:MATLAB离散傅里叶变换工程化验证工具箱

简介:本资源是一个面向凝聚态物理与计算材料科学领域的DFT计算辅助工具箱,专为使用Quantum ESPRESSO、ABINIT、ELK等主流第一性原理软件的研究者设计,显著降低DFT建模与后处理的学习门槛。工具箱以Python实现,核心理念是“用户输入…

2026/10/15 13:02:27 阅读更多 →
深入拆解VNode:从虚拟节点到真实DOM的渲染全流程

深入拆解VNode:从虚拟节点到真实DOM的渲染全流程

做前端这些年,如果要我选一个最值得拿出来单独拆开讲的底层概念,排第一的应该就是 VNode,也就是虚拟节点。我们平时写模板、写渲染函数,最后都是靠一套 VNode 结构和相应的处理逻辑,把"界面应该长什么样"翻译…

2026/10/15 13:02:27 阅读更多 →
Qt跨数据库获取SQL表字段元数据的工程实践

Qt跨数据库获取SQL表字段元数据的工程实践

1. 项目概述:为什么“获取SQL数据表所有字段”是Qt开发中绕不开的硬需求在用Qt做数据库应用开发时,我几乎每天都会遇到这个场景:界面刚打开,需要动态加载某张表的全部字段名来构建查询条件面板;或者用户点开一个数据编…

2026/10/15 13:01:26 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →