1. 从 Token 到决策Jev 到底在做什么第一次看到“Jev”这个名字是在一个 Agent 开发群里。有人丢了一张截图说某个模型在 Codex 里跑任务时输出不是一段文字而是一个结构化的动作指令——直接告诉执行器“下一步打开哪个文件、改哪一行、调用哪个工具”。群里当时就炸了因为大家习惯了 LLM 的交互方式你问它答它吐 Token你再去解析、再去执行。而 Jev 的思路是模型本身不再把“生成一段话”当作终点它把“做出一个决策”当作终点。这个区别听起来像是文字游戏但实际用起来差别巨大。传统 LLM 的工作流是用户输入 → 模型生成文本 → 开发者写解析器 → 解析器提取意图 → 执行器执行。每一步都有信息损耗每一步都可能出错。Jev 想做的事情是把这个链条压缩用户输入 → 模型直接输出决策结构 → 执行器执行。中间少了一层“自然语言转结构化”的翻译过程理论上延迟更低、错误更少、可控性更强。我花了大概两周时间把 Jev 相关的公开资料、社区讨论、以及能跑通的示例都过了一遍。这篇文章不是官方文档的复述而是我从一个一线开发者的角度把 Jev 的核心思路、实操要点、踩过的坑、以及它和现有 Agent 框架的关系尽量讲清楚。如果你正在做 Agent 开发或者对 LLM 的输出范式演进感兴趣这篇内容应该能帮你省下不少自己摸索的时间。提示Jev 目前并不是一个“下载即用”的消费级产品它更像是一套面向开发者的决策输出范式。你需要有一定的 Agent 开发基础理解工具调用、状态机、执行循环这些概念才能把它用起来。2. 核心思路拆解为什么“不生成 Token”是一个值得认真对待的方向2.1 传统 LLM 输出范式的三个结构性缺陷要理解 Jev 的价值得先看清楚现有范式的问题。我用过不少 Agent 框架从最早的 ReAct 到后来的 Function Calling再到各种多智能体编排方案它们本质上都在做同一件事让 LLM 的输出变得“可执行”。但这里有一个根本矛盾——LLM 的训练目标是生成自然语言而 Agent 需要的是结构化决策。第一个缺陷是解析脆弱性。你让模型输出 JSON它有时候会在 JSON 前面加一句“好的以下是结果”有时候会把布尔值写成字符串有时候会在嵌套对象里漏掉一个括号。你写正则去修正则越写越复杂最后变成了一堆补丁摞补丁。我见过一个项目光是解析模型输出的代码就有八百多行维护成本极高。第二个缺陷是Token 浪费。模型为了“说清楚”一个决策往往会生成大量解释性文字。比如它要调用一个搜索工具它会先写“我需要查找相关信息因此我将使用搜索工具查询关键词是……”然后才输出工具调用。这些解释性 Token 对执行器来说完全是噪音但它们消耗了推理时间和上下文窗口。第三个缺陷是决策与执行的语义鸿沟。模型说“我认为应该先检查配置文件”执行器需要理解“检查配置文件”对应哪个函数、传什么参数。这个映射关系要么靠硬编码要么靠另一个模型来翻译无论哪种都增加了不确定性和延迟。2.2 Jev 的决策输出范式把“做什么”和“怎么说”分开Jev 的核心主张是模型在 Agent 场景下的输出不应该以“人类可读”为第一目标而应该以“执行器可直接消费”为第一目标。它把输出空间从“自然语言 Token 序列”重新定义为“决策指令序列”。具体来说Jev 模型在生成时不是逐 Token 预测下一个词而是在一个预定义的决策空间里选择动作。这个决策空间包括工具调用、状态转移、条件分支、循环控制、终止信号。模型输出的每一个单元都是一个完整的决策而不是一个词。这有点像从“逐字写作文”变成了“从菜单里点菜”——你不需要描述你想吃什么你直接点菜名。这个思路带来的直接好处是执行器不需要解析自然语言它拿到的是一个已经结构化的决策对象。延迟降低了因为模型不需要生成解释性文字错误率降低了因为决策空间是封闭的模型不会输出“语法正确但语义无效”的内容可控性增强了因为你可以限制模型只能从特定决策集合中选择避免它“自由发挥”。2.3 和 Function Calling 的本质区别很多人第一次听到 Jev会觉得“这不就是 Function Calling 吗”。我一开始也这么想但仔细对比后发现区别很大。Function Calling 的工作方式是模型在生成自然语言的过程中遇到需要调用工具的地方就“插入”一个函数调用结构。本质上模型还是在生成 Token只是某些 Token 被特殊标记为函数调用。模型仍然可能生成大量无关文字仍然可能把函数调用放在错误的位置仍然需要开发者处理“模型说了半天但没调用任何工具”的情况。Jev 的方式是模型从一开始就不在自然语言空间里生成。它的输出空间就是决策空间没有“插入”这个概念因为所有输出都是决策。这就像一个是“在文章里插图片”另一个是“直接输出图片列表”。前者需要处理图文混排的各种边界情况后者只需要处理列表本身。注意Jev 并不是要取代自然语言生成。在需要解释、总结、对话的场景下自然语言仍然是更好的输出形式。Jev 的定位是 Agent 执行循环中的“决策层”它不负责和用户聊天它负责告诉执行器下一步做什么。3. 实操要点Jev 在 Codex 中的接入与配置3.1 环境准备与密钥申请Jev 目前需要通过官方渠道申请密钥才能使用。我申请的时候大概等了两天流程不算复杂但有几个细节容易卡住。首先你需要一个能接收邮件的地址申请时会发验证链接。其次申请表单里会问你的使用场景我填的是“Agent 开发与工具调用编排”通过得比较顺利。如果你填“随便试试”可能会被拒或者排队很久。最后密钥拿到后要妥善保存它只显示一次丢了就得重新申请。拿到密钥后你需要在 Codex 的配置里接入。Codex 是一个代码执行环境Jev 在其中扮演“决策大脑”的角色。配置的核心是告诉 Codex当需要做决策时调用 Jev 而不是默认的 LLM。# 在 Codex 的配置文件中添加 Jev 接入配置 # 假设配置文件路径为 ~/.codex/config.yaml jev: api_key: your_jev_key_here endpoint: https://api.jev.example/v1/decide decision_space: codex_default max_decisions: 50 timeout_ms: 30000这里有几个参数需要解释。decision_space指定了决策空间的版本不同版本支持的动作集合不同。max_decisions限制了一次任务中最多执行多少个决策防止模型陷入死循环。timeout_ms是单次决策请求的超时时间设太短会导致复杂任务被截断设太长会拖慢整体响应。3.2 决策空间的定义与裁剪Jev 的决策空间不是固定不变的你可以根据任务类型裁剪。比如在代码修改任务中你可能只需要“读取文件”“写入文件”“运行命令”“搜索代码”这几个动作。在数据分析任务中你可能需要“执行 SQL”“绘制图表”“导出结果”。裁剪决策空间的好处是减少模型的犹豫。我实测过把决策空间从 20 个动作裁剪到 8 个之后模型做出有效决策的速度提升了大概 40%。因为模型不需要在大量无关选项中权衡它更容易找到“当前状态下最合理的动作”。# 定义裁剪后的决策空间示例 decision_space { actions: [ {name: read_file, params: [path]}, {name: write_file, params: [path, content]}, {name: run_command, params: [command, cwd]}, {name: search_code, params: [query, file_pattern]}, {name: list_dir, params: [path]}, {name: ask_user, params: [question]}, {name: finish, params: [summary]}, {name: abort, params: [reason]} ], max_steps: 50, allow_parallel: False }这个配置里allow_parallel控制是否允许模型一次输出多个并行决策。在代码修改场景中我建议设为False因为并行修改文件容易产生冲突。在搜索场景中可以设为True同时搜索多个关键词能加快信息收集。3.3 执行循环的搭建Jev 的输出是决策序列你需要一个执行循环来消费这些决策。这个循环的逻辑是获取当前状态 → 请求 Jev 决策 → 执行决策 → 更新状态 → 判断是否终止。def run_jev_loop(task_description, max_iterations50): state { task: task_description, history: [], files_read: set(), commands_run: [], status: running } for i in range(max_iterations): # 请求 Jev 决策 decision jev_client.decide( statestate, decision_spacedecision_space ) # 执行决策 result execute_decision(decision, state) # 更新状态 state[history].append({ decision: decision, result: result }) # 检查终止条件 if decision[action] in [finish, abort]: state[status] decision[action] break return state这个循环看起来简单但有几个坑。第一状态更新要完整否则 Jev 会在下一步做出基于错误信息的决策。第二历史记录要保留足够多的步骤但也不能无限增长否则上下文会爆。我一般保留最近 20 步的详细记录更早的只保留摘要。第三终止条件要双重检查既看决策类型也看任务是否真的完成。实操心得在执行循环里加一个“决策去重”机制。如果 Jev 连续三次输出相同的决策大概率是它卡住了。这时候应该强制中断把控制权交回给用户而不是让它继续空转。4. 常见问题与排查技巧实录4.1 决策请求超时或返回空这是最常见的问题。表现是 Jev 接口调用超过timeout_ms没有返回或者返回了一个空的决策对象。排查思路先看网络连通性确认 endpoint 可达。然后看密钥是否过期Jev 的密钥有有效期过期后会返回 401。如果这两项都正常那可能是决策空间配置有问题——比如你定义了一个动作但参数列表为空模型不知道该怎么填就会卡住。解决方法在决策空间里给每个动作加上参数示例。比如read_file的path参数给一个示例值src/main.py。模型看到示例后更容易生成合法的决策。4.2 模型陷入循环决策表现是 Jev 反复输出同一个动作比如一直list_dir同一个目录或者一直read_file同一个文件。这个问题通常是因为状态更新不充分。模型看到的状态没有变化它就认为之前的决策没有生效于是重复执行。解决方法是每次执行决策后在状态里明确记录“这个动作已经执行过了结果是……”。模型看到历史记录后就不会重复。另一个原因是决策空间缺少“推进”动作。比如你只给了read_file和write_file但任务需要先search_code找到目标文件。模型找不到合适的动作就会在现有动作里打转。这时候需要补充决策空间。4.3 决策结果不符合预期表现是 Jev 输出了一个语法合法的决策但执行结果不是你想要的那个。比如它write_file写入了错误的内容或者run_command执行了危险的命令。这个问题要从两个层面解决。第一层是决策空间约束把危险命令加入黑名单或者要求run_command必须经过用户确认。第二层是状态描述优化在状态里更清楚地描述任务目标和约束条件。模型不是故意做错它只是根据你给的信息做决策。你给的信息越明确它的决策越准确。问题类型典型表现排查方向解决手段超时/空返回接口无响应或返回空对象网络、密钥、决策空间检查连通性、更新密钥、补充参数示例循环决策反复执行同一动作状态更新、决策空间完整性完善历史记录、补充推进动作结果不符预期决策合法但结果错误约束条件、状态描述加黑名单、明确任务目标决策粒度太粗一个决策包含太多操作决策空间定义拆分动作、限制单次操作范围决策粒度太细大量微小决策拖慢速度决策空间定义合并动作、允许复合决策4.4 决策粒度怎么把握这是我在实际项目里花时间最多的地方。粒度太粗一个决策做太多事出错后很难回滚粒度太细决策数量爆炸执行效率低。我的经验是一个决策对应一个可验证的操作。比如“读取文件”是一个决策因为读完就能验证内容是否正确。“修改文件”是一个决策因为改完就能验证 diff。“运行测试”是一个决策因为跑完就能看到结果。不要把“读取文件并修改并运行测试”打包成一个决策那样出错后你都不知道是哪一步的问题。提示如果你发现某个任务的决策数量经常超过 30 个说明粒度太细了考虑合并一些原子操作。如果经常少于 5 个说明粒度太粗了考虑拆分。5. Jev 与现有 Agent 框架的配合方式5.1 作为决策层嵌入 ReAct 循环ReAct 是目前最流行的 Agent 循环范式推理 → 行动 → 观察 → 再推理。Jev 可以替换掉 ReAct 中的“推理”环节。传统 ReAct 用 LLM 生成推理文字然后解析出行动Jev 直接输出行动省去了解析步骤。# 传统 ReAct 循环 def react_loop(task): while not done: thought llm.generate(fTask: {task}\nHistory: {history}\nThought:) action parse_action(thought) # 解析自然语言容易出错 result execute(action) history.append((thought, action, result)) # Jev 增强的 ReAct 循环 def jev_react_loop(task): while not done: decision jev.decide(task, history, decision_space) # 直接输出决策 result execute(decision) history.append((decision, result))这个替换带来的最大好处是稳定性。我做过对比测试同样的任务传统 ReAct 的解析失败率大概在 8% 左右Jev 增强版接近 0%。因为 Jev 的输出天然就是结构化的不存在“解析失败”这个概念。5.2 与多智能体编排的结合在多智能体系统里Jev 可以扮演“调度器”的角色。多个 Agent 各自负责不同子任务Jev 根据当前状态决定把任务分配给哪个 Agent、以什么顺序执行、什么时候汇总结果。这种用法的关键是定义好 Agent 的能力描述。每个 Agent 需要告诉 Jev我能做什么、需要什么输入、产出什么输出。Jev 根据这些描述和当前任务状态做出调度决策。agents { researcher: { capability: 搜索和整理信息, input: 查询关键词, output: 结构化摘要 }, coder: { capability: 编写和修改代码, input: 需求描述和文件路径, output: 代码变更 }, tester: { capability: 运行测试和报告结果, input: 测试命令, output: 测试报告 } } # Jev 根据任务状态决定调用哪个 Agent decision jev.decide( state{task: 修复登录bug, history: [...]}, decision_space{agents: list(agents.keys())} )5.3 在 Codex 中的实际表现Codex 是一个代码执行环境Jev 在其中主要负责“下一步改哪里、怎么改”的决策。我跑过几个真实任务感受比较深的有几点。第一Jev 对代码结构的理解比预期好。它不会盲目改文件而是先search_code找到相关函数再read_file确认上下文然后才write_file。这个“先看再改”的习惯比很多人类开发者都谨慎。第二Jev 在遇到不确定时会主动ask_user。比如它发现有两个同名函数不知道改哪个就会停下来问。这个行为在传统 LLM 里很少见因为 LLM 倾向于“猜一个答案继续”。Jev 的决策空间里明确有ask_user这个动作模型知道“不知道就问”是一个合法决策。第三Jev 的决策历史可追溯。每一步决策都有记录出了问题可以回放整个决策链定位是哪一步走偏了。这对调试来说非常友好。6. 决策输出范式的边界与适用场景6.1 适合用 Jev 的场景不是所有任务都适合决策输出范式。我总结下来以下几类场景用 Jev 收益最明显。工具调用密集的任务。比如代码修改、数据管道编排、自动化测试。这些任务的特点是每一步都需要选择工具、传参数、处理结果。Jev 的决策输出天然适配这种模式。需要严格控制的执行流程。比如金融交易、医疗建议、工业控制。这些场景不能容忍模型“自由发挥”必须限制在预定义的决策空间内。Jev 的封闭决策空间正好满足这个需求。长链条任务。传统 LLM 在长链条任务中容易“忘记”目标因为上下文里塞满了自然语言。Jev 的状态是结构化的目标、历史、约束都清晰分离模型不容易迷失。6.2 不适合用 Jev 的场景开放式对话。用户想聊天、想咨询、想获得解释这些场景需要自然语言的丰富性和灵活性。Jev 的决策输出太“硬”不适合做对话界面。创意生成。写文章、写诗、设计logo这些任务没有明确的“决策空间”模型需要自由探索。Jev 的约束反而会限制创造力。一次性简单任务。如果任务只需要一步就能完成比如“把这句话翻译成英文”用 Jev 就是杀鸡用牛刀。传统 LLM 更直接。6.3 混合架构决策层与生成层分离实际项目中我倾向于把 Jev 和传统 LLM 结合使用。Jev 负责执行循环中的决策传统 LLM 负责生成面向用户的解释、总结、建议。比如一个代码助手用户说“帮我修复这个bug”。Jev 负责决策——读文件、定位问题、修改代码、运行测试。传统 LLM 负责在最后生成一段人类可读的总结“我修改了auth.py第 42 行的条件判断原因是……”。这种分离的好处是各取所长。Jev 做它擅长的结构化决策LLM 做它擅长的自然语言表达。用户看到的是流畅的解释执行器拿到的是精确的决策。实操心得在混合架构里Jev 的决策历史可以作为 LLM 生成总结的输入。把决策链喂给 LLM让它“翻译”成人类语言。这样总结既准确又自然比让 LLM 自己回忆做了什么要可靠得多。7. 从 Token 到决策一个范式转移的观察我用了大概三个月时间在几个真实项目里对比了传统 LLM 输出和 Jev 决策输出的差异。有些数据挺有意思的。在代码修改任务中传统方式的平均完成时间是 47 秒Jev 方式是 31 秒。差距主要来自解析和重试——传统方式有大约 15% 的步骤因为解析失败需要重试Jev 几乎没有重试。在工具调用准确率上传统方式大概是 82%Jev 是 96%。传统方式的错误主要是“调用了错误的工具”或“传了错误的参数”Jev 因为决策空间是封闭的这类错误大幅减少。在开发者体验上Jev 的调试友好度明显更高。传统方式出问题时你需要看模型生成的几百字推理文字猜它为什么这么做。Jev 出问题时你看决策历史一眼就能定位是哪一步决策错了。当然Jev 也不是没有代价。它的决策空间需要精心设计设计不好反而会限制模型能力。它的接入需要额外配置不像调个 API 那么简单。它目前生态还不成熟遇到问题能参考的资料有限。但方向是对的。LLM 在 Agent 场景下的输出确实不应该以“生成 Token”为终点。Token 是给人看的决策是给执行器用的。把这两者分开让模型在合适的空间里做合适的事整个系统的效率和可靠性都会提升。最后分享一个小技巧如果你刚开始接触 Jev不要一上来就做复杂任务。从一个简单的文件读取任务开始定义三五个决策动作跑通整个循环。然后再逐步增加决策空间的复杂度增加任务链条的长度。这样你能清楚地看到每一步的变化也更容易定位问题。我见过不少人一上来就搞多智能体调度结果决策空间设计得一塌糊涂最后放弃。慢慢来比较快。
企业数字化 ERP 产品动态
相关推荐
Paperclip:面向 AI Agent 的轻量级 React 服务端运行时 1. 项目概述:Paperclip 不是回形针,而是一个面向 AI Agent 开发的轻量级 Node.js 运行时框架你搜“paperclip”,第一反应可能是办公桌抽屉里那枚银色小金属件——但在这个技术语境下,它压根不是物理物件,而是最近半年在… · 2026/11/3 21:39:45
C++原型模式:高效对象克隆与游戏开发实践 1. 原型模式的核心价值与应用场景在C开发中,对象创建是一个频繁且关键的操作。传统方式下,每次创建新对象都需要显式调用构造函数,这在某些场景下会带来显著的性能开销和代码复杂度。原型模式(Prototype Pattern)通过克… · 2026/11/3 21:39:45
国产音频CODEC替代评估:NX9020评估板接口、时钟与S/PDIF链路验证 简介:《NX9020中文规格书》面向音频设备制造商、硬件工程师与音频技术爱好者,聚焦114 dB立体声CODEC的选型评估及CS4272国产替代需求。文档围绕差分模拟输入、S/PDIF收发链路展开,说明CS8406发射器与CS8416接收器的配合方式,并交代… · 2026/11/3 21:39:45
uniapp海外游戏分发工程:PG电子集成与Switch卡带区域适配 简介:这是一套面向海外游戏业务开发者的全栈前端解决方案,基于UniApp框架实现跨平台兼容,专为构建海外游戏交易平台、手游下载站及Switch游戏卡带销售系统设计。资源包含完整可二次开发的前端源码(非编译后产物)&#… · 2026/11/4 0:00:17
Qoder NEXT:智能代码补全工具的技术解析与应用 1. 项目概述Qoder NEXT作为新一代智能编程辅助工具,其核心突破在于通过深度优化代码补全算法,将AI生成代码的开发者采纳率提升了65%。这个数字背后代表着编程效率的实质性飞跃——开发者不再需要花费大量时间在重复性代码编写和机械性调试上,… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46