用 Cursor 高效开发:基于 FastAPI + LangChain + Vue3 打造智能 AI 对话系统(TaoToken 统一 Key 接入版)
1. 多模型 Key 分散的真实痛点与 Cursor 开发场景做 AI 对话系统最烦的不是写代码而是 Key 管理。我手上这个项目要同时对接 DeepSeek、OpenAI、通义千问三个模型每个模型一个 Key、一个 Base URL.env文件里塞了七八行配置改一个模型就要动三处代码。更崩溃的是前端联调时后端换了模型前端还得跟着改请求地址Cursor 里搜base_url能搜出十几个文件。这个场景其实很典型FastAPI 做后端接口、LangChain 做模型编排、Vue3 做前端界面三件套本身没问题问题出在模型接入层。传统做法是每个模型写一个 adapterKey 硬编码在环境变量里Base URL 散落在各个 service 文件。一旦要加新模型就得复制粘贴改一遍维护成本随模型数量线性增长。TaoToken 在这里的价值就很直接它提供一个统一的 OpenAI 兼容通道所有模型走同一个 Base URL、同一个 Key模型差异只体现在model参数上。后端 LangChain 只需要配置一次base_url和api_key前端调用/chat接口时传不同 model 名就行。这样 Cursor 里的代码量能砍掉一半联调时也不用反复切环境变量。适合谁看正在用 FastAPI LangChain 搭 AI 应用、被多模型 Key 折磨、想在 Cursor 里一次配置跑通前后端的开发者。下面我会给出完整的.env配置、Cursor 内 settings 修改步骤、curl 验证命令以及 Vue3 前端对接的完整代码。2. TaoToken 统一 Key 接入前置准备在动手改代码之前先把 TaoToken 的接入信息准备好。你需要拿到三样东西API Key、Base URL、可用模型列表。这三样在控制台里都能找到。先访问控制台创建 API Keyhttps://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentconsole创建完 Key 之后Base URL 统一用https://taotoken.net/api注意这个地址不带任何路径后缀LangChain 和 OpenAI SDK 都会自动拼接/v1/chat/completions。模型 ID 方面常用的有deepseek-chat、gpt-4o-mini、claude-3-5-sonnet等具体以控制台模型列表为准。这里有个坑要提前说很多人把 Base URL 写成https://taotoken.net/api/v1结果 LangChain 又拼了一次/v1变成/api/v1/v1/chat/completions直接 404。记住 Base URL 只到/api为止。如果你还没决定用哪些模型可以先在模型对话页面测试一下https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentmodel-chat在对话页面里选模型、发消息确认通道正常后再写代码能省掉很多排障时间。API 文档在这里https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc前置准备清单项目值说明Base URLhttps://taotoken.net/api不带 /v1 后缀API Key控制台创建形如sk-xxxxModel IDdeepseek-chat等以控制台为准兼容协议OpenAI Chat CompletionsLangChain 直接复用拿到这些信息后接下来配置 Cursor 和项目环境。3. Cursor 内 settings 与项目 .env 可复制配置Cursor 本身不直接管理模型 Key但它的 AI 补全和 Chat 功能需要配置模型通道。如果你想让 Cursor 的 AI 功能也走 TaoToken可以在 Cursor 设置里改 OpenAI Base URL。不过更关键的是项目本身的配置因为后端服务才是真正调用模型的地方。先看项目结构我用的目录布局是这样的ai-chat-system/ ├── backend/ │ ├── app/ │ │ ├── main.py │ │ ├── config.py │ │ └── services/ │ │ └── llm_service.py │ ├── .env │ └── requirements.txt ├── frontend/ │ ├── src/ │ │ ├── api/ │ │ │ └── chat.js │ │ └── views/ │ │ └── ChatView.vue │ └── package.json └── .cursor/ └── settings.json后端.env文件这是核心配置直接复制改 Key 就行# backend/.env TAOTOKEN_API_KEYsk-你的实际Key TAOTOKEN_BASE_URLhttps://taotoken.net/api DEFAULT_MODELdeepseek-chat FALLBACK_MODELgpt-4o-mini注意TAOTOKEN_BASE_URL结尾不要加斜杠也不要加/v1。LangChain 的ChatOpenAI会自动处理路径拼接。Cursor 的项目级 settings 放在.cursor/settings.json用来告诉 Cursor 这个项目的 Python 解释器和环境变量加载方式{ python.defaultInterpreterPath: ${workspaceFolder}/backend/.venv/bin/python, python.envFile: ${workspaceFolder}/backend/.env, python.analysis.extraPaths: [${workspaceFolder}/backend], editor.formatOnSave: true, files.exclude: { **/__pycache__: true, **/.venv: true } }如果你想让 Cursor 的 AI Chat 也走 TaoToken在 Cursor 设置里搜索OpenAI API Key填入 TaoToken 的 Key然后把OpenAI Base URL改成https://taotoken.net/api。这样 Cursor 的代码补全和对话都会走统一通道不用再单独买 Cursor 的模型额度。后端config.py读取环境变量# backend/app/config.py import os from dotenv import load_dotenv load_dotenv() TAOTOKEN_API_KEY os.getenv(TAOTOKEN_API_KEY) TAOTOKEN_BASE_URL os.getenv(TAOTOKEN_BASE_URL, https://taotoken.net/api) DEFAULT_MODEL os.getenv(DEFAULT_MODEL, deepseek-chat) FALLBACK_MODEL os.getenv(FALLBACK_MODEL, gpt-4o-mini) if not TAOTOKEN_API_KEY: raise ValueError(TAOTOKEN_API_KEY 未配置请检查 backend/.env)LangChain 的 LLM 服务封装这里用ChatOpenAI直接对接 TaoToken因为 TaoToken 兼容 OpenAI 协议# backend/app/services/llm_service.py from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, SystemMessage from app.config import TAOTOKEN_API_KEY, TAOTOKEN_BASE_URL, DEFAULT_MODEL def get_llm(model: str None): return ChatOpenAI( modelmodel or DEFAULT_MODEL, api_keyTAOTOKEN_API_KEY, base_urlTAOTOKEN_BASE_URL, temperature0.7, timeout60, ) async def chat_once(message: str, model: str None, history: list None): llm get_llm(model) messages [SystemMessage(content你是一个乐于助人的 AI 助手。)] if history: for item in history: if item[role] user: messages.append(HumanMessage(contentitem[content])) messages.append(HumanMessage(contentmessage)) response await llm.ainvoke(messages) return response.contentFastAPI 入口文件# backend/app/main.py from fastapi import FastAPI, HTTPException from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel from typing import List, Optional from app.services.llm_service import chat_once app FastAPI(titleAI Chat System) app.add_middleware( CORSMiddleware, allow_origins[http://localhost:5173], allow_credentialsTrue, allow_methods[*], allow_headers[*], ) class ChatMessage(BaseModel): role: str content: str class ChatRequest(BaseModel): message: str model: Optional[str] None history: Optional[List[ChatMessage]] [] app.post(/api/chat) async def chat(req: ChatRequest): try: reply await chat_once( req.message, modelreq.model, history[h.dict() for h in req.history] if req.history else None, ) return {reply: reply, model: req.model or deepseek-chat} except Exception as e: raise HTTPException(status_code500, detailstr(e))依赖安装cd backend python -m venv .venv source .venv/bin/activate pip install fastapi uvicorn langchain-openai python-dotenv pydantic到这里后端配置就完成了。关键点再强调一次base_url只写到/apiapi_key用 TaoToken 的 Key模型名通过参数传入。4. curl 验证 TaoToken 通道连通性与前后端联调配置写完别急着跑前端先用 curl 验证通道是否通。这一步能帮你快速定位是 Key 问题、Base URL 问题还是模型名问题。最基础的验证命令curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的实际Key \ -H Content-Type: application/json \ -d { model: deepseek-chat, messages: [{role: user, content: 你好请回复一句话}], temperature: 0.7 }注意 curl 里的 URL 是https://taotoken.net/api/v1/chat/completions因为 curl 不会自动拼/v1而 LangChain 的ChatOpenAI会自动拼。这是两套逻辑别搞混。正常返回长这样{ id: chatcmpl-xxx, object: chat.completion, created: 1730000000, model: deepseek-chat, choices: [ { index: 0, message: { role: assistant, content: 你好有什么可以帮你的吗 }, finish_reason: stop } ], usage: { prompt_tokens: 10, completion_tokens: 12, total_tokens: 22 } }看到choices[0].message.content有内容说明通道正常。如果返回 401检查 Key 是否复制完整如果返回 404检查 URL 路径如果返回model not found检查模型名是否在控制台列表里。后端服务启动cd backend uvicorn app.main:app --reload --port 8000用 curl 测后端接口curl -X POST http://localhost:8000/api/chat \ -H Content-Type: application/json \ -d { message: 用一句话介绍 FastAPI, model: deepseek-chat }返回{ reply: FastAPI 是一个基于 Python 类型注解的高性能异步 Web 框架适合快速构建 API 服务。, model: deepseek-chat }前端 Vue3 部分先建 API 封装// frontend/src/api/chat.js import axios from axios; const api axios.create({ baseURL: http://localhost:8000, timeout: 60000, }); export function sendChat(message, model deepseek-chat, history []) { return api.post(/api/chat, { message, model, history, }); }Vue3 对话页面template div classchat-container div classmodel-select select v-modelselectedModel option valuedeepseek-chatDeepSeek/option option valuegpt-4o-miniGPT-4o mini/option option valueclaude-3-5-sonnetClaude 3.5/option /select /div div classmessages div v-formsg in messages :keymsg.id :classmsg.role strong{{ msg.role user ? 我 : AI }}/strong span{{ msg.content }}/span /div /div div classinput-area input v-modelinput keyup.entersend placeholder输入问题回车发送... :disabledloading / button clicksend :disabledloading {{ loading ? 思考中... : 发送 }} /button /div /div /template script setup import { ref } from vue; import { sendChat } from /api/chat; const input ref(); const messages ref([]); const loading ref(false); const selectedModel ref(deepseek-chat); async function send() { if (!input.value.trim() || loading.value) return; const userMsg { role: user, content: input.value, id: Date.now() }; messages.value.push(userMsg); const currentInput input.value; input.value ; loading.value true; try { const history messages.value .filter(m m.role ! system) .map(m ({ role: m.role, content: m.content })); const res await sendChat(currentInput, selectedModel.value, history); messages.value.push({ role: assistant, content: res.data.reply, id: Date.now() 1, }); } catch (err) { messages.value.push({ role: assistant, content: 请求失败 (err.response?.data?.detail || err.message), id: Date.now() 2, }); } finally { loading.value false; } } /script前端启动cd frontend npm install npm run dev打开http://localhost:5173选模型、发消息能看到 AI 回复就说明前后端联调通了。切换模型时不用改任何配置只改下拉框的值这就是统一 Key 接入的好处。5. 常见报错排查401、local proxy failed、reading choices、OAuth接入过程中最容易踩的坑集中在几个报错上我按实际遇到的频率排一下。401 Unauthorized最常见。原因通常是 Key 没配、Key 复制时带了空格、或者.env文件没被加载。排查步骤先在终端echo $TAOTOKEN_API_KEY看有没有值再确认load_dotenv()在config.py顶部执行。如果 Key 是从控制台复制的注意前后不要有换行。还有一种情况是 Cursor 的 settings 里填了旧 Key但项目.env是新 Key两边不一致建议统一用项目.env。local proxy failed / connection refused这个报错通常出现在 Cursor 的 AI 功能里原因是 Cursor 配置了本地代理地址但代理没启动。检查 Cursor 设置里的HTTP Proxy是否为空如果之前填过http://127.0.0.1:xxxx之类的地址清空即可。项目代码层面如果报连接拒绝检查TAOTOKEN_BASE_URL是否写成了http://而不是https://或者多写了/v1。reading choices of undefinedLangChain 或前端解析响应时报这个错说明返回体里没有choices字段。原因一般是模型名写错了TaoToken 返回了错误信息而不是正常 completion。比如把deepseek-chat写成deepseek或者用了控制台里不存在的模型 ID。解决办法先用 curl 单独测这个模型名确认返回体结构再改代码。另外检查base_url是否多拼了/v1导致请求打到了错误路径。OAuth / authentication error如果用的是 Claude Code 或 Codex 这类工具报 OAuth 错误通常是因为它们默认走官方 OAuth 流程而不是 API Key。需要在工具配置里显式指定base_url和api_key。以 Claude Code 为例配置三件套{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: claude-3-5-sonnet }Codex 的auth.json类似{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: gpt-4o-mini }Cline MCP 配置也是同样三件套Base URL Key Model ID 缺一不可。如果只填了 Key 没填 Base URL工具会走默认官方地址自然报 OAuth 或 401。模型返回空内容有时候choices[0].message.content是空字符串但finish_reason是stop。这种情况一般是 prompt 触发了模型的安全策略或者temperature设得太低导致输出被截断。把temperature调到 0.7 以上再试或者换一个模型验证。CORS 跨域报错前端localhost:5173调后端localhost:8000被浏览器拦截。检查 FastAPI 的CORSMiddleware是否加了allow_origins[http://localhost:5173]注意端口号要一致。如果前端用了127.0.0.1而不是localhost也要加进去。排障时建议按这个顺序先 curl 直连 TaoToken 确认通道通再 curl 测后端接口确认服务正常最后开前端确认跨域配置。三层分开测问题定位快很多。6. 长期编码与 Agent 场景的接入建议如果你只是偶尔跑一下对话上面的配置够用了。但如果要把这套系统长期用于编码辅助或 Agent 工作流有几个点值得优化。第一把模型选择做成配置化。不要在前端硬编码模型列表而是后端提供一个/api/models接口从 TaoToken 控制台拉取可用模型。这样加新模型不用改前端代码。第二LangChain 的ChatOpenAI支持流式输出把streamingTrue打开前端用 SSE 接收体验会好很多。FastAPI 侧用StreamingResponse包装Vue3 侧用EventSource或 fetch 的 ReadableStream 处理。第三如果你在用 Cursor 做长期开发建议把 Cursor 的 AI 通道也统一到 TaoToken。这样代码补全、Chat、项目后端调用走同一个 Key账单和额度管理都集中在一处。Coding Plan 页面有详细的套餐说明https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding-plan第四Agent 场景下建议加一层重试和降级。比如主模型deepseek-chat超时了自动切到gpt-4o-mini。LangChain 的with_fallbacks可以直接实现from langchain_openai import ChatOpenAI primary ChatOpenAI(modeldeepseek-chat, api_keyKEY, base_urlBASE_URL) fallback ChatOpenAI(modelgpt-4o-mini, api_keyKEY, base_urlBASE_URL) llm primary.with_fallbacks([fallback])这样即使某个模型临时不可用服务也不会直接挂掉。第五Key 管理方面不要把 Key 提交到 Git。.env加到.gitignore团队协作时用.env.example做模板。如果多人共用建议每个人在 TaoToken 控制台创建自己的子 Key方便按人统计用量。API Key 管理页面在这里https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-keys接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc最后说一个实际经验统一 Key 接入最大的收益不是省了几行配置而是让模型切换变成了一个参数的事。以前加一个新模型要改代码、改环境变量、重新部署现在只需要在请求里传不同的model值。对于快速迭代的 AI 应用来说这个灵活性比什么都重要。

相关新闻

基于深度学习的肺结节检测与分类源码解析:从CT预处理到迁移学习实战

基于深度学习的肺结节检测与分类源码解析:从CT预处理到迁移学习实战

简介:这份资源面向医学影像分析与深度学习入门者,提供一套完整的肺结节检测与分类项目源码,帮助读者理解如何用卷积神经网络在肺部CT图像中定位结节并判别良恶性。压缩包共22个文件、约37.27MB,以Python脚本为主体,辅以…

2026/10/11 19:45:40 阅读更多 →
建议量化系统实战:用权重模型和情绪过滤做出更理性的决策

建议量化系统实战:用权重模型和情绪过滤做出更理性的决策

别再“多听建议”了,我用程序把建议量化成决策分,真香提示:本博文为个人实践分享,文中涉及个人与机构信息均为虚构代称,如有雷同纯属巧合。说句很多人不爱听的实话:“多听听别人建议”这句话,本…

2026/10/11 19:44:39 阅读更多 →
OTA 断电变砖——擦完旧区没备份就跳,加双备份 + 标记有效区再切

OTA 断电变砖——擦完旧区没备份就跳,加双备份 + 标记有效区再切

OTA 断电变砖——擦完旧区没备份就跳,加双备份 标记有效区再切文章标签:#嵌入式开发 #单片机 #Flash #OTA升级 #OTA #远程升级 #Bootloader #固件 #双备份摘要:OTA 升级最怕中途断电——运行区只剩残包,设备直接变砖。本文从真实…

2026/10/11 19:44:39 阅读更多 →

最新新闻

YashanDB单机部署实操:从环境准备到实例启动的完整指南

YashanDB单机部署实操:从环境准备到实例启动的完整指南

数据库这玩意儿,平时看着没啥存在感,可真到要部署的时候,环境、依赖、权限、端口、内核参数,哪一个拎出来都能把人折腾得没脾气。最近一段时间,因为项目选型,我在几台机器上反复部署过YashanDB——一款国产…

2026/10/11 20:34:21 阅读更多 →
基于卷积神经网络的农作物病虫害识别系统实战:从数据集到部署

基于卷积神经网络的农作物病虫害识别系统实战:从数据集到部署

简介:这份资源是面向计算机相关专业毕业设计与项目实战学习者的农作物病虫害识别检测系统,基于深度学习卷积神经网络实现,涵盖从模型训练到Web端部署的完整链路。项目经导师指导并通过评审,源码均经本地编译调试可运行&#xff0c…

2026/10/11 20:34:21 阅读更多 →
基于动态分时电价的电动汽车有序充放电实时优化调度系统详解

基于动态分时电价的电动汽车有序充放电实时优化调度系统详解

做电动汽车充放电调度这个方向,算起来也有不短时间了。从最早单纯追求“充得便宜”,到后来加上V2G反向放电,再到把动态分时电价引入优化过程,每一步都踩过不少坑。今天趁项目收尾,把这套基于动态分时电价的电动汽车有序…

2026/10/11 20:34:21 阅读更多 →
从Excel到ERP:小微商家数字化转型的真实痛点与破局路径(附ROI测算)

从Excel到ERP:小微商家数字化转型的真实痛点与破局路径(附ROI测算)

写在前面网上管家婆成立于1993年,30余年服务超过80万中小客户。在对373家电商客户的调研中,52%的客户属于"初创型"——在引入系统之前只用过打单软件甚至纯靠Excel管理。以下内容从这些客户的真实痛点出发,分析从表格到ERP的转型难…

2026/10/11 20:34:21 阅读更多 →
MySQL中trx_mysql_thread_id为0的真相:XA事务与锁等待排查指南

MySQL中trx_mysql_thread_id为0的真相:XA事务与锁等待排查指南

1. 从一次诡异的锁等待说起 先讲个真实场景。某天中午,线上业务突然出现大量锁等待超时,监控面板上一片红色。当时我第一时间看了 information_schema.innodb_trx ,发现有一条事务状态为 RUNNING ,已经跑了快二十分钟&#xf…

2026/10/11 20:34:21 阅读更多 →
医院六大医疗信息系统集成实战:HIS、LIS、PACS、EMR、RIS、CDR数据流与接口详解

医院六大医疗信息系统集成实战:HIS、LIS、PACS、EMR、RIS、CDR数据流与接口详解

简介:本资源是一份面向医院信息科人员、医疗IT从业者及卫生信息管理专业学习者的系统性入门资料,全面梳理当前主流医疗信息化系统的核心定位、功能模块与协同关系,助力快速建立行业知识框架并支撑系统选型、实施或运维工作。文档为单文件Word…

2026/10/11 20:33:20 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

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

周新闻

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

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

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

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

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

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

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

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

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

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

月新闻

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