GPT-4o API接入实战:认证、流式输出与工程优化全攻略

2. 调用核心机制与参数配置

其实说“解锁”,对于大部分开发者来说,真正要解决的是两件事:第一,怎么拿到合法的调用凭证;第二,怎么把请求封装得又快又稳。这一节我把这两块展开讲透。

2.1 认证机制与请求流程

GPT-4o 走的是标准的 API Key 认证。你需要在某个云服务商的开发者后台创建一个密钥,然后每次请求都在 HTTP 头里带上这个密钥。我用最常用的requests库举个例子:

import requests API_KEY = "sk-你的密钥" url = "https://api.openai.com/v1/chat/completions" headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } data = { "model": "gpt-4o", "messages": [ {"role": "system", "content": "你是一个专业的编程助手"}, {"role": "user", "content": "用Python写一个快速排序函数"} ], "max_tokens": 1024, "temperature": 0.7 } resp = requests.post(url, headers=headers, json=data) print(resp.json())

这里有几个容易踩坑的细节:

第一,密钥一定要放在环境变量里,不要硬编码到代码中。我见过太多人把密钥直接提交到 Git 仓库,然后被爬虫扫到,一夜之间余额被刷光。正确做法是:

export OPENAI_API_KEY="sk-你的密钥"

然后在代码里通过os.environ读取。

第二,max_tokens不是“回答的最大字数”,而是“生成的最大 token 数”。一个 token 大约相当于 0.75 个英文单词或 0.5 个汉字。如果你设得太小,回答会被截断,甚至出现半句话。

第三,temperature控制随机性。0 表示几乎每次都输出相同的确定性结果,1 表示非常有创造性。写代码场景我一般用 0.2 以下,写文案场景可以调到 0.8 以上。

2.2 并发与重试策略

  • 超时设置:requests默认没有超时,如果网络抖动,代码会一直挂着。必须显式设置timeout=(5, 30),5 秒连接超时,30 秒读取超时。
  • 退避重试:如果遇到 429 限流或 5xx 服务端错误,不要立刻重试,要采用指数退避策略。例如第一次等 1 秒,第二次等 2 秒,第三次等 4 秒。
  • 批量处理降级为串行:如果你要批量处理大量文本,建议控制并发数在 5 左右,超过这个阈值很容易触发限流。我实测过,10 个并发跑 20 分钟就会被限到每分钟 3 次请求,非常痛苦。

2.3 函数调用与结构化输出

GPT-4o 支持函数调用(Function Calling),这意味着你可以让它输出结构化的 JSON,而不是自由文本。这在做业务开发时极其有用。比如你想让它从一段简历中提取信息,可以这样定义函数:

functions = [ { "name": "extract_resume", "description": "从简历文本中提取候选人信息", "parameters": { "type": "object", "properties": { "name": {"type": "string", "description": "姓名"}, "age": {"type": "integer", "description": "年龄"}, "skills": {"type": "array", "items": {"type": "string"}, "description": "技能列表"} }, "required": ["name", "skills"] } } ]

请求时加上functions参数,模型会返回一个function_call对象,包含函数名和参数 JSON 字符串。你解析后直接调用自己的业务逻辑即可。这套机制比“提示词让它输出 JSON”稳定得多,强烈推荐。

3. 完整接入实战:从零搭建一个对话服务

理论讲完了,来点实际的。我带大家从零搭建一个基于 GPT-4o 的简易对话服务,用到 FastAPI 作为后端框架,前端页面简单到一个输入框就行。每一步都附上完整代码和说明。

3.1 环境准备

假设你用的是 Python 3.10 以上的环境,创建一个项目目录,安装依赖:

mkdir gpt4o-demo cd gpt4o-demo python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate pip install fastapi uvicorn openai python-dotenv

注意,官方 SDK 在 1.0 版本后改过 API,我用的是最新版 1.x 的写法。旧版openai.ChatCompletion.create的写法已经废弃了,如果你在网上搜到老教程,跑不通很正常。

3.2 后端服务的完整代码

新建main.py:

import os import json from fastapi import FastAPI, HTTPException from fastapi.responses import HTMLResponse from pydantic import BaseModel from openai import OpenAI from dotenv import load_dotenv load_dotenv() app = FastAPI() client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) class ChatRequest(BaseModel): message: str system_prompt: str = "你是一个乐于助人的助手。" class ChatResponse(BaseModel): reply: str usage: dict @app.post("/chat", response_model=ChatResponse) async def chat(req: ChatRequest): try: response = client.chat.completions.create( model="gpt-4o", messages=[ {"role": "system", "content": req.system_prompt}, {"role": "user", "content": req.message} ], max_tokens=1024, temperature=0.7 ) return ChatResponse( reply=response.choices[0].message.content, usage=response.usage.model_dump() ) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.get("/", response_class=HTMLResponse) async def index(): html = """ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>GPT-4o 对话演示</title> <style> body { font-family: Arial, sans-serif; max-width: 700px; margin: 50px auto; } .chat-box { border: 1px solid #ddd; padding: 20px; border-radius: 8px; min-height: 300px; } .message { margin: 10px 0; } .user { color: #333; background: #e9f5ff; padding: 8px; border-radius: 4px; } .bot { color: #333; background: #f0f0f0; padding: 8px; border-radius: 4px; } input { width: 80%; padding: 10px; margin-right: 10px; } button { padding: 10px 20px; } </style> </head> <body> <h1>GPT-4o 对话演示</h1> <div class="chat-box" id="chat-box"></div> <div> <input type="text" id="message" placeholder="输入你的问题..."> <button onclick="sendMessage()">发送</button> </div> <script> async function sendMessage() { const msg = document.getElementById('message').value; if (!msg) return; const box = document.getElementById('chat-box'); box.innerHTML += '<div class="message user">' + msg + '</div>'; document.getElementById('message').value = ''; const resp = await fetch('/chat', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({message: msg}) }); const data = await resp.json(); box.innerHTML += '<div class="message bot">' + data.reply + '</div>'; } </script> </body> </html> """ return html

启动服务:

uvicorn main:app --host 0.0.0.0 --port 8000 --reload

打开浏览器访问http://localhost:8000,就能看到一个简单的聊天页面了。

这套代码有几个细节值得说明:

第一,model="gpt-4o"是模型的名字,但在某些地区的服务商平台上,模型可能被重命名为类似gpt-4o-2024-08-06这样带日期快照的版本。如果你用官方平台,直接写gpt-4o就行,它会自动指向最新稳定版;如果用的是第三方中转服务,需要去他们的文档里查一下确切的模型标识。

第二,response.usage会返回本次请求消耗的prompt_tokens、completion_tokens和total_tokens。这个数据对成本核算很重要,我建议每次调用都把它存到日志里,月底汇总一下就能知道花了多少钱。

第三,FastAPI 的async函数中,如果你需要调用同步的 SDK 方法,长耗时请求会阻塞事件循环。严格来说,应该用def而不是async def声明,或者用run_in_executor把阻塞调用放到线程池。不过对于个人学习 demo,这个影响可以忽略。

3.3 流式输出的实现

刚才的代码是一次性返回整个回复。如果回答很长,用户要等好几秒才看到内容,体验很差。GPT-4o 支持流式输出(streaming),也就是像 ChatGPT 网页版那样一个字一个字地蹦出来。

实现流式输出在 FastAPI 中有点绕,因为 SSE(Server-Sent Events)需要保持连接。我给出一个简化版本,用 FastAPI 的StreamingResponse:

from fastapi.responses import StreamingResponse from fastapi import FastAPI from pydantic import BaseModel class StreamRequest(BaseModel): message: str @app.post("/chat-stream") async def chat_stream(req: StreamRequest): def generate(): response = client.chat.completions.create( model="gpt-4o", messages=[ {"role": "system", "content": "你是一个乐于助人的助手。"}, {"role": "user", "content": req.message} ], max_tokens=1024, stream=True # 开启流式 ) for chunk in response: delta = chunk.choices[0].delta if delta.content: yield f"data: {delta.content}\n\n" return StreamingResponse(generate(), media_type="text/event-stream")

前端用EventSource或fetch的ReadableStream接口来逐步渲染即可。注意前提是你的反向代理服务器不能缓冲响应,否则流式就白做了。Nginx 需要加:

proxy_buffering off;

这一条我踩过坑,本地跑流式一切正常,一部署到服务器就变成一次性返回,查了半天才发现是 Nginx 默认开着缓冲。

4. 常见问题与排查技巧实录

这部分是实战中最容易踩坑的地方,我把高频问题的排查思路和解决方案都整理出来了。

问题现象可能原因解决方案
请求超时网络代理配置异常;服务端负载高检查系统代理设置;增加超时时间到 60s;尝试换接入点
429 Too Many Requests触发限流降低并发数;增加退避重试;检查是否有请求泄漏没关连接
401 Unauthorized密钥错误;密钥过期检查密钥前后是否有空格;确认环境变量是否生效;重新生成密钥
context length exceeded上下文过长裁剪历史消息;用摘要代替原始文本;加大max_tokens没有用,要减少输入
模型输出乱码响应中混入特殊字符;tokenizer 问题用response.encoding指定 UTF-8;检查代理是否篡改数据
代码被截断max_tokens太小调大max_tokens;或让模型分两段输出
请求被拒绝内容安全策略触发根据返回的过滤原因调整提示词;确保合规使用

4.1 上下文长度管理

GPT-4o 的上下文窗口很大,可以塞下几十万 token 的文本,但并不意味着你不需要管理上下文。因为:

  • 输入越长,单次调用费用越高;
  • 输入越长,响应速度越慢;
  • 输入太长,模型可能“迷失”在早期信息中,忽略最后一条指令。

我处理长文档的策略是:先让模型总结前一段的关键信息,然后把摘要作为后续对话的 system message。这样既保留了核心信息,又控制了 token 消耗。

4.2 成本控制与用量监控

调用 GPT-4o 不是免费的,每个 token 都要计费。对个人开发者来说,如果不做控制,很容易在调试阶段烧掉预算。我建议:

  • 设置一个token_budget变量,在每次调用前检查累计消耗,超过阈值就拒绝请求。
  • 把max_tokens设小一点,比如 512,够用就行。
  • 用流式输出时,注意stream_options={"include_usage": true}参数,让最后一个 chunk 带上用量统计。

4.3 网络环境问题排查

这是一个非常现实的问题。GPT-4o 的 API 服务可能无法在你所在的区域直接访问,这会导致连接超时或 DNS 解析失败。但在有些地区是可用的,而且速率很快。

排查方法:

  • 先curl -v https://api.example.com/v1/models看能否连通;
  • 如果连接超时,换一个 API 接入域名试试(比如某些服务商提供国内可直接访问的兼容网关);
  • 如果是企业网络,可能被防火墙拦截,尝试走 HTTPS 端口 443 而不是其他端口。

这里需要特别说明:使用官方服务时,请遵守当地法律法规和相关服务条款。若 API 无法访问,最稳妥的替代方案是寻找合规的国内大模型服务(例如文心一言、通义千问等),国内模型的开发体验和效果已经非常接近 GPT-4o 了。

5. 实用技巧与优化建议

这一节分享一些我反复用过、觉得特别有价值的小技巧,让 GPT-4o 在你手里真正发挥生产力工具的作用,而不仅仅是聊天玩具。

5.1 系统提示词设计

很多人用 GPT-4o 效果不好,问题出在 system prompt 写得太烂。合格的 system prompt 应该包含四个要素:身份、任务、约束条件、输出格式。例如:

你是一位经验丰富的 Python 开发工程师。你的任务是为用户提供简洁、安全的代码解决方案。 约束条件: 1. 代码必须包含错误处理; 2. 代码必须附带注释说明关键逻辑; 3. 如果用户的问题涉及安全隐患(如 SQL 注入),必须给出警示。 输出格式:先用一段话概括思路,再输出完整代码,最后列出运行注意事项。

有了这个约束,模型输出的质量会提升一个明显的档位。

5.2 多轮对话的状态管理

在构建多轮对话应用时,你需要自己维护消息历史。每次请求把之前的对话全部传上去。但是消息列表不能无限增长,否则迟早会打爆上下文窗口。

我的方案是维护一个messages队列,超过一定条数就把最早的消息移出,同时把移出消息的摘要附加到 system prompt 中。这样历史信息不会完全丢失,又控制了 token。

5.3 模型选择:GPT-4o 与其他模型对比

GPT-4o 并不是万能的,有时候用别的模型效果更好、成本更低。我根据任务类型做了一个简单对照表:

任务类型推荐模型理由
日常问答gpt-4o-mini便宜、速度快,足够聪明
复杂代码生成gpt-4o逻辑推理更强,代码质量高
简单分类/抽取小型微调模型或函数调用成本极低,延迟极低
文本润色其他风格化模型不同模型风格差异大
数学推理带思维链的专用模型准确率更高

我见过一个开发者把所有请求都打到 gpt-4o 上,月末账单出来吓一跳。后来改成了路由策略:先用一个轻量模型判断任务难度,简单问题走轻量模型,复杂问题才走 gpt-4o。账单直接砍掉了 60%。

5.4 多模态能力的调用

GPT-4o 的“o”代表 omni,也就是原生支持文本、图片、音频的混合输入。这意味着你可以直接给它一张图片,让它看图回答问题,而不需要像老版本那样把图片转成 Base64 塞进文本里。

from openai import OpenAI client = OpenAI() response = client.chat.completions.create( model="gpt-4o", messages=[ { "role": "user", "content": [ {"type": "text", "text": "这张图片里有哪些物体?"}, {"type": "image_url", "image_url": {"url": "https://example.com/image.jpg"}} ] } ], max_tokens=300 )

本地图片需要先用 Base64 编码或使用data URL格式。实测下来,它对图片的理解能力相当惊人,基本能准确识别场景、物体、文字甚至图表数据。

6. 经验总结与最后叮嘱

做了这么多 GPT-4o 接入项目,我最深的感受是:模型能力固然重要,但真正决定项目成败的是工程细节。认证、超时、重试、章节管理、成本控制,每个环节都值得你认真对待。

6.1 一套推荐的最小可用设计模式

写一个 GPT-4o 接入服务的时候,我建议直接套用这个模式:

  • 环境变量管理密钥
  • 独立配置中心管理模型名和参数
  • 封装一个call_gpt()函数处理所有异常和重试
  • 所有调用记录时间和 token 消耗的日志
  • 前端永远用流式输出
import time import json from openai import OpenAI import os client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) def call_gpt(messages, max_tokens=1024, temperature=0.7, retries=3): for attempt in range(retries): try: resp = client.chat.completions.create( model="gpt-4o", messages=messages, max_tokens=max_tokens, temperature=temperature ) return resp.choices[0].message.content, resp.usage.total_tokens except Exception as e: if attempt == retries - 1: raise wait = 2 ** attempt time.sleep(wait) print(f"第 {attempt + 1} 次重试,等待 {wait}s,错误: {e}")

这个封装足够简单,又涵盖了最关键的异常处理逻辑。你在它的基础上扩展缓存、日志、业务判断,就可以应对绝大多数生产场景了。

6.2 风险提示与合规使用

在项目中使用大模型 API,有几条红线务必注意:

  • API 密钥是敏感信息,任何前端代码中都不应出现,只允许后端使用。
  • 涉及用户隐私数据的场景,要对请求内容做脱敏处理。
  • 生成的内容可能存在幻觉或偏见,重要决策场景需要人工审核。
  • 内容生成必须在法律法规允许的范围内,不能用于生成违规、违法、侵权或欺骗性内容。

最后再分享一个我个人的习惯:每次新写一个 GPT-4o 项目,我第一件事不是写业务代码,而是写个脚本把 API 连通性、基础对话、流式输出分别跑一遍,确认接口正常再动手。这一步花不了 5 分钟,但能让你知道问题到底是出在代码逻辑,还是 API 配置上,排除掉最大的不确定因素。这个习惯帮我省了无数排查时间,推荐你试试。

相关新闻

知识工作插件体系设计:从插件边界划分到流水线调度落地实践

知识工作插件体系设计:从插件边界划分到流水线调度落地实践

1. 从"知识工作插件"这个命名说起&#xff1a;它到底在解决什么问题第一次看到"knowledge-work-plugins"这个命名&#xff0c;我的直觉是&#xff1a;这不是一个具体的工具&#xff0c;而是一类面向知识工作者的可插拔能力扩展集合。知识工作这个词本身就很…

2026/10/21 5:31:11 阅读更多 →
差分隐私在Transformers微调中的实战:DP-SGD配置与调参指南

差分隐私在Transformers微调中的实战:DP-SGD配置与调参指南

做模型训练这几年&#xff0c;我最怕听到的需求不是“精度要再高一点”&#xff0c;而是这句&#xff1a;“这批数据里有个人信息&#xff0c;你拿去训练&#xff0c;但出了事你负责。”后来把差分隐私&#xff08;Differential Privacy&#xff09;真正落到 Transformers 训练…

2026/10/21 5:31:11 阅读更多 →
使用 Zafiro.Avalonia 语义容器构建可维护的 Avalonia 布局:HeaderedContainer、EdgePanel 与 Card 实战指南

使用 Zafiro.Avalonia 语义容器构建可维护的 Avalonia 布局:HeaderedContainer、EdgePanel 与 Card 实战指南

AI 技能AI 插件人工智能 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,600 agentic skills. Includes CLI, local MCP, c…

2026/10/21 5:30:11 阅读更多 →

最新新闻

iOS 15 ATT审核被拒两次?Xcode自动隐私清单解法揭秘

iOS 15 ATT审核被拒两次?Xcode自动隐私清单解法揭秘

1. 项目概述&#xff1a;一次被驳回两次的ATT权限申请&#xff0c;背后藏着什么真实逻辑&#xff1f; “苹果审核iOS 15版本App Tracking Transparency两次被驳回”——这个标题一出来&#xff0c;很多做iOS开发、运营或合规的同学第一反应是&#xff1a;又一个被ATT政策卡住的…

2026/10/21 6:12:29 阅读更多 →
多智能体动态事件触发共识控制的Matlab仿真与实现

多智能体动态事件触发共识控制的Matlab仿真与实现

多智能体系统的分布式协同控制&#xff0c;这些年无论是在学术界还是工业界都是个大热点。以前我们做多机器人编队、无人机集群、卫星星座协同这类课题时&#xff0c;最头疼的问题之一就是&#xff1a;怎么用最少的信息交互&#xff0c;还能保证所有智能体最终达到一致的状态&a…

2026/10/21 6:12:29 阅读更多 →
鸿蒙ArkUI开发:Slider滑块与Progress进度条从入门到工程实践

鸿蒙ArkUI开发:Slider滑块与Progress进度条从入门到工程实践

在鸿蒙应用开发的实际项目中&#xff0c;Slider和Progress这两个组件往往不会像Text、Button那样被单独拎出来讲&#xff0c;但它们恰恰是提升应用完成度与交互质感的关键细节。很多开发者在入门阶段容易忽略这两个控件&#xff0c;直到做播放器、设置页、上传下载状态展示时&a…

2026/10/21 6:12:29 阅读更多 →
ONVIF Java SDK实战:摄像头统一接入、RTSP取流与PTZ控制

ONVIF Java SDK实战:摄像头统一接入、RTSP取流与PTZ控制

简介&#xff1a;这份资源是一套基于Java的ONVIF协议开发SDK&#xff0c;面向需要对接网络摄像头、实现设备发现、鉴权与媒体流控制的开发者。包内共1157个文件&#xff0c;主体为1147个Java源码文件&#xff0c;另有少量jar依赖库&#xff08;如commons-codec、javaWsDiscover…

2026/10/21 6:12:29 阅读更多 →
知识工作插件实战:搭建高效采集整理输出工作流

知识工作插件实战:搭建高效采集整理输出工作流

“知识工作插件”这几年被反复提起&#xff0c;但真要问它到底是什么——是一类浏览器扩展&#xff0c;还是编辑器里的组件&#xff0c;又或者某个知识管理工具的二次开发能力&#xff1f;我自己的答案是&#xff1a;都不是单独一个&#xff0c;而是围绕“输入→处理→沉淀→输…

2026/10/21 6:12:29 阅读更多 →
机器人对话系统地图模块设计:POI检索、路径规划与避坑实践

机器人对话系统地图模块设计:POI检索、路径规划与避坑实践

做机器人对话系统最头疼的一件事&#xff0c;不是意图识别&#xff0c;也不是自然语言生成&#xff0c;而是把真实世界接进来。用户问一句“我从现在的地方去服务中心怎么走”&#xff0c;你得在几百毫秒内完成坐标解析、路径计算、话术拼接&#xff0c;还得把路线图用卡片发出…

2026/10/21 6:11:29 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/21 4:27: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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →