LangChain 1.0 模型接入实战:DeepSeek、OpenAI、通义千问统一切换
如果你是从 LangChain 0.2、0.3 一路用上来的升到 1.0 之后最直观的感受一定是import 路径又变了以前顺手写的那套 ChatOpenAI 代码在新版本里要么报错、要么提示推荐用新的统一入口。这一篇不聊虚的只干活。我会用同一套业务场景把 DeepSeek、OpenAI、通义千问三个模型的接入分别跑通再把它们封装成一套可以随时切换的调用入口。整个过程会标注版本号、环境变量、依赖包以及我在真实项目里踩过的坑。适不适合新手适合只要你装好了 Python 3.10 以上环境跟着敲一遍就能跑。已经有 LangChain 基础的朋友可以跳过第一部分直接看模型接入部分。1. 先看清 1.0 的接入层变化1.1 为什么你的旧代码跑不起来了LangChain 1.0 之前模型接入的典型写法是这种from langchain.chat_models import ChatOpenAI或者走社区包from langchain_community.chat_models import ChatOpenAI到了 1.0这两个路径都不再是主推方向。官方把“模型接入”做成了统一协议每个模型供应商对应一个独立扩展包比如langchain-openai、langchain-deepseek、langchain-dashscope。主包只保留统一接口和编排能力不直接绑定某个模型的具体实现。这么改表面上是路径变了底层其实是两个原因第一社区包质量参差不齐把模型接入分散到官方维护的扩展包能保证每个供应商的适配及时跟进模型接口变化第二调用侧协议统一之后业务代码不需要感知底层 HTTP 请求的差异切换模型时改动量能控制在很小范围。我碰到的第一个坑就是升级后直接pip install -U langchain然后旧项目里报ModuleNotFoundError: langchain_community。这不是包没装而是langchain_community里的模型实现被逐步移出需要按需安装对应厂商扩展包。解决办法很简单缺哪个装哪个装完之后接口要改成新写法。1.0 中所有模型调用都统一走invoke、stream、batch这些标准方法不再推荐旧的__call__方式。你写的任何代码只要接入层用的是这组标准方法上游换模型基本无感。1.2 init_chat_model 到底解决了什么问题init_chat_model是 1.0 推荐的统一模型初始化入口。它做的事情很简单根据你传入的model和model_provider两个参数自动找到对应的实现类并实例化。比如这句from langchain.chat_models import init_chat_model llm init_chat_model( modelgpt-4o-mini, model_provideropenai, )它会自动读取OPENAI_API_KEY创建一个 OpenAI 的聊天模型实例。换一个供应商也一样llm init_chat_model( modeldeepseek-chat, model_providerdeepseek, )这条 API 表面上只是省了几行代码实际解决的是一个很痛的维护问题以前不同模型的初始化参数不统一有的叫model_name有的叫model有的要传endpoint有的要传base_url。项目里如果同时接三个模型你会写三套初始化逻辑还容易在切换时漏参数。init_chat_model把参数名统一成一套把差异收敛到model_provider这一个维度上。它的另一个价值在于如果没有对应供应商的官方 provider你仍然可以借助 OpenAI 兼容协议来接。很多模型平台都提供 OpenAI 兼容的 REST 接口比如通义千问的兼容模式。遇到这种情况init_chat_model可能没法直接覆盖那就退一步用langchain_openai.ChatOpenAI配合base_url来实例化。我建议新项目一律从init_chat_model起步因为它强制你先把模型和供应商拆开。后面要换模型、做灰度、做多模型路由代码结构上都会顺手很多。2. 环境初始化与密钥管理2.1 依赖安装与版本确认先创建虚拟环境我习惯用 venv干净且不污染系统 Pythonpython -m venv .venv source .venv/bin/activate然后一次性装齐本文需要的包pip install -U langchain langchain-openai langchain-deepseek langchain-dashscope python-dotenv装完确认版本避免后续接口对不上import langchain print(langchain.__version__)我实测时用的是 1.0.x 版本如果你看到的大版本是 0.3.x说明没装上最新的需要检查是不是 pip 源缓存了旧版本可以加--upgrade强制更新。这里有一个很多人忽略的点langchain-openai和openaiSDK 是两个东西。langchain-openai是 LangChain 对 OpenAI 的适配层它底层会依赖openai库但你不能只装openai就在 LangChain 里调ChatOpenAI。同理langchain-deepseek、langchain-dashscope也是适配层必须装。2.2 三套 API Key 的配置与加载三个模型对应三个 Key统一放到项目根目录的.env文件里DEEPSEEK_API_KEYsk-xxxxxxxx OPENAI_API_KEYsk-xxxxxxxx DASHSCOPE_API_KEYsk-xxxxxxxx.env文件不是 Python 代码不要在里面加引号也不要带分号直接键值就行。然后在入口文件里加载import os from dotenv import load_dotenv load_dotenv()这里有个实际开发中特别容易踩的坑load_dotenv()默认会从当前工作目录找.env。如果你在 IDE 里运行脚本工作目录可能不是项目根目录导致加载不到 Key。解决方式是显式指定路径from pathlib import Path from dotenv import load_dotenv env_path Path(__file__).resolve().parent / .env load_dotenv(dotenv_pathenv_path)还有一点不要把 Key 写进代码再提交到 Git。我见过不止一次 Key 被提交到仓库然后被爬虫抓走刷爆额度的例子。正确做法是.env加入.gitignore仓库里只留一个.env.example模板写清需要哪些环境变量不填真实值。如果你在服务器上跑建议用进程环境变量或者密钥管理服务比.env更安全。本地开发倒是无所谓.env足够方便。3. DeepSeek 接入实战3.1 用官方扩展包快速接入DeepSeek 的官方 LangChain 扩展包是langchain-deepseek安装之后直接用init_chat_model接入from langchain.chat_models import init_chat_model llm init_chat_model( modeldeepseek-chat, model_providerdeepseek, temperature0.7, max_tokens2048, ) response llm.invoke(用一句话解释什么是上下文窗口) print(response.content)跑通之后你会看到类似输出上下文窗口是模型在生成回复时能同时参考的最大 token 数量就像工作台能铺开多少张便签纸。这个包会自动读取DEEPSEEK_API_KEY不需要手动传api_key。如果你的环境变量名不是这个也可以用api_key参数显式传llm init_chat_model( modeldeepseek-chat, model_providerdeepseek, api_keysk-xxxx, )不过我建议不要走显式传参路线统一交给环境变量管理后面切配置时只改.env代码零变动。3.2 DeepSeek 的参数习惯和实测要点DeepSeek 有两个常用模型名一个是deepseek-chat一个是deepseek-reasoner。前者是通用对话模型适合大部分业务场景后者是推理增强模型会先进行内部推理再给最终答案适合数学、逻辑、代码这类任务。实测中我用deepseek-reasoner做复杂问题拆解效果明显比普通模式更稳但响应时间会变长你需要评估业务是否能接受。关于temperatureDeepSeek 官方范围是 0 到 2。我自己的经验是代码生成、数据抽取、结构化输出这类任务设置在 0.1 到 0.3 之间减少幻觉创意写作、头脑风暴设置在 0.7 到 0.9能明显感受到多样化超过 1.0 之后回答可能会开始出现不连贯不建议常规使用。max_tokens控制的是生成的最大 token 数而不是总上下文长度。如果你需要模型输出很长的结果务必调高这个值否则会被截断。我之前做文档摘要时就吃过这个亏默认 1024 直接把长文后半段截没了摘要看起来像是烂尾。实际项目中DeepSeek 的接入成本低、中文理解好尤其适合做知识库问答、文案生成、意图识别这类中文密集型的任务。它唯一的短板在我看来是工具调用生态没有 OpenAI 那么丰富但基础 Function Calling 是支持的简单 Agent 场景没问题。4. OpenAI 接入实战4.1 最小可用链路OpenAI 的接入分两条路。一条是用init_chat_model统一入口llm init_chat_model( modelgpt-4o-mini, model_provideropenai, temperature0.3, )另一条是直接用langchain_openai.ChatOpenAIfrom langchain_openai import ChatOpenAI llm ChatOpenAI( modelgpt-4o-mini, temperature0.3, )两条路最终拿到的都是BaseChatModel的子类调用方式一致。区别在于init_chat_model更强调 provider 抽象ChatOpenAI则保留了 OpenAI 系特有的参数透传能力。我建议基础场景用init_chat_model但是如果你的代码里已经写了一批基于ChatOpenAI的逻辑且暂时不想重构直接用ChatOpenAI也完全没问题。LangChain 1.0 没有强制你必须换 API只是给了更推荐的入口。4.2 结构化输出让模型按 Schema 返回OpenAI 的强项之一就是结构化输出和函数调用。在 LangChain 里做结构化输出最方便的方式是结合 Pydanticfrom pydantic import BaseModel, Field from langchain.chat_models import init_chat_model class MovieReview(BaseModel): name: str Field(description电影名称) score: int Field(description1到10分的评分) reason: str Field(description评分理由) llm init_chat_model( modelgpt-4o-mini, model_provideropenai, temperature0.2, ) structured_llm llm.with_structured_output(MovieReview) result structured_llm.invoke(评价一部最近上映的科幻电影) print(result.name, result.score, result.reason)with_structured_output是 LangChain 提供的便捷方法底层会根据模型能力自动选择 JSON mode、函数调用或工具调用然后帮你把模型输出解析成 Pydantic 对象。这样你拿到的就不是一个自由文本而是一个可以直接取字段的对象后续下游逻辑干干净净。这里要注意结构化输出对模型版本有要求别用太老的模型名。如果你用的是某个不支持 JSON mode 的模型with_structured_output会退化成提示词解析准确性会打折扣。实测下来OpenAI 的gpt-4o系在结构化输出上最稳DeepSeek 和千问也支持但偶尔需要多试几次。5. 通义千问接入实战5.1 官方 DashScope 包通义千问的官方 LangChain 扩展包是langchain-dashscope安装后通过model_providerdashscope接入from langchain.chat_models import init_chat_model llm init_chat_model( modelqwen-plus, model_providerdashscope, temperature0.6, ) response llm.invoke(写一段电商客服欢迎语语气亲和) print(response.content)它会自动读取DASHSCOPE_API_KEY。千问的模型名主要有qwen-turbo、qwen-plus、qwen-max几个档位turbo便宜快速plus均衡max更强但更贵。还有一个qwen-long专门处理超长文本如果你做百万 token 级别的文档分析可以优先看它。实测中千问在中文理解、中文知识问答上表现很稳特别是涉及中文文化、习惯用语、口语化表达时回答的自然度比很多海外模型好。它的响应速度也快大批量调用时成本控制有明显优势。5.2 OpenAI 兼容模式与 base_url除了官方包通义千问还提供了 OpenAI 兼容接口。这意味着你可以只用langchain_openai不装langchain-dashscope直接切换base_url就能接上千问import os from langchain_openai import ChatOpenAI llm ChatOpenAI( modelqwen-plus, api_keyos.getenv(DASHSCOPE_API_KEY), base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1, ) response llm.invoke(你好介绍一下你自己) print(response.content)这种方式的爽点在于你以前如果是一套ChatOpenAI写到底的代码切到千问只需要把base_url换掉业务逻辑一行都不用动。对于已经有大量 OpenAI 兼容代码的团队这是最小成本的迁移方案。两种方式怎么选我的建议是新建项目优先用官方包langchain-dashscope因为它和 LangChain 的抽象集成得更深存量项目用 OpenAI 兼容模式改造量最小。不管用哪种都建议在代码里加一层配置开关别在多个文件里硬编码模型名和 base_url。6. 统一封装与模型切换6.1 做一个 get_llm 工厂函数三个模型都跑通之后下一步就是把它们统一到一个入口。我习惯的做法是写一个工厂函数用配置项决定当前用哪个模型import os from langchain.chat_models import init_chat_model from langchain_openai import ChatOpenAI def get_llm(provider: str, model: str, temperature: float 0.3): if provider openai: return init_chat_model( modelmodel, model_provideropenai, temperaturetemperature, ) if provider deepseek: return init_chat_model( modelmodel, model_providerdeepseek, temperaturetemperature, ) if provider qwen: # 优先走 OpenAI 兼容模式方便统一维护 return ChatOpenAI( modelmodel, api_keyos.getenv(DASHSCOPE_API_KEY), base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1, temperaturetemperature, ) raise ValueError(fUnsupported provider: {provider})使用的时候配置项一份文件管住llm get_llm( provideros.getenv(LLM_PROVIDER, deepseek), modelos.getenv(LLM_MODEL, deepseek-chat), )这样一来业务代码里只有一个llm对象不存在散落的模型初始化逻辑。切换模型时只改.env里的LLM_PROVIDER和LLM_MODEL或者在调参数时改调用侧配置不需要碰业务代码。我在实际项目里还会再加一层缓存比如用functools.lru_cache把已初始化的模型实例缓存住避免每次调用都重新初始化省去不必要的握手开销。6.2 三个模型的实测对比与取舍把三个模型放在同一个场景里轮换测试了几轮之后我的感受是这样的维度DeepSeekOpenAI通义千问中文理解强表达自然中上英文逻辑更优强文化相关场景最稳工具调用基础能力可用最成熟稳定基础能力可用结构化输出支持偶发不稳定最稳定支持需要调参响应速度快快快成本倾向性价比高偏高性价比高生态兼容一般最好兼容模式丰富如果你做的是中文知识库问答、文本摘要、内容生成DeepSeek 和千问都能打如果做复杂 Agent、多步推理、需要频繁工具调用的系统OpenAI 的稳定性暂时还是最优解。我的习惯是项目里默认 DeepSeek 跑快速验证验证通过后线上长期运行用千问因为成本更可控。OpenAI 更多用来做评测基准——拿同一批问题跑三个模型输出对比一下很快能看出差异。6.3 超时与重试策略模型接入还有一个容易被忽略但线上一定会遇到的点超时和重试。默认配置下如果模型服务暂时不可用或者请求量过大你的代码可能直接抛异常体验很不好。ChatOpenAI和init_chat_model都支持传入timeout和max_retriesllm init_chat_model( modelgpt-4o-mini, model_provideropenai, timeout60, max_retries2, )timeout单位是秒设置的是单次请求的超时上限。max_retries是在遇到网络错误、5xx错误、连接超时时自动重试的次数。注意它不会对 429 限流无限重试429 的处理主要靠指数退避OpenAI 的 SDK 内部已经有基础重试LangChain 这层主要兜住连接层的问题。我在生产环境里还会再包一层异常捕获把模型不可用、超时、限流这些情况统一转成业务侧可读的提示而不是直接把堆栈抛给用户。7. 常见问题速查表7.1 API 错误与模型参数问题现象大概率原因处理方法401 UnauthorizedAPI Key 错误或环境变量没加载检查.env路径确认load_dotenv执行成功404 Not Found模型名不存在或拼写错误核对模型名比如deepseek-chat不能写成deepseek_chat429 Too Many Requests触发限流降低并发增加重试拆分请求超时网络不稳定或服务响应慢调大timeout增加max_retries模型返回乱码流式输出处理不当检查是否有部分响应未正确组装结构化输出报错模型不支持 JSON mode 或函数调用换新模型或退回普通文本解析7.2 容易踩的版本与路径细节还有一个高频问题把model写成model_name。新版本统一用model但很多旧资料还在写model_name直接搬过来会报不认识的参数。如果你看到 Type 相关报错第一件事检查是不是参数名写错了。langchain_community里的模型类在 1.0 中不再是主力别指望装一个langchain全功能包就什么模型都能接。供应商对应的扩展包必须单独装OpenAI 用langchain-openaiDeepSeek 用langchain-deepseek千问用langchain-dashscope。装错了包init_chat_model会在初始化时直接告诉你找不到对应 provider。如果你用的是公司内部网关自建模型服务且它提供 OpenAI 兼容接口那ChatOpenAI配合自定义base_url是你唯一需要掌握的姿势。这一点对所有兼容 OpenAI 协议的服务都通用学会了就是一通百通。最后再分享一个个人习惯模型接入这件事很多人只做到“能跑通”就停了但我建议你一定要做到“能切换”。哪怕你现在只用一个模型也把工厂函数和配置项结构搭好。原因很简单模型市场变化太快今天的最优解可能三个月后就变了。接口统一了切换成本低了你才有更多试错空间。另外一个小技巧无论用哪个模型保存一个“标准测试集”里面放几十条覆盖不同业务场景的问题。每次接入新模型、改模型版本、调参数先用这套测试集跑一遍批量回归对比输出质量比自己零散地试几个问题靠谱得多。这个办法救了我很多次希望也能帮到你。

相关新闻

语音标注工具Transcriber:从音频到结构化训练数据的完整流程

语音标注工具Transcriber:从音频到结构化训练数据的完整流程

简介:Transcriber是一款面向语音处理、AI语音识别及自然语言处理研究者的专业语音标注工具,主要用于为音频文件添加逐句或逐字的文字字幕,并精确生成时间戳,解决传统人工转录效率低、对齐不准的痛点。压缩包共含307个文件&#xf…

2026/10/18 20:36:06 阅读更多 →
从Superpowers到可控方案:低代码工具迁移与数据锁死避坑指南

从Superpowers到可控方案:低代码工具迁移与数据锁死避坑指南

“如果你还在用Superpowers,那我不要和你说话”,我第一次看到这句话是在某个技术讨论群里。当时有人发了张截图,紧接着就是两派人在底下吵了一百多条。说这句话的人明显带着火气,而被他点名的用户则一脸委屈:我用得好好…

2026/10/18 20:36:06 阅读更多 →
ADINA中文手册实战指南:9.6.2版本卡片填法、报错定位与工程避坑

ADINA中文手册实战指南:9.6.2版本卡片填法、报错定位与工程避坑

简介:本资源为ADINA中文手册与入门教程合集,面向结构、流体、热传导等工程领域的初学者及仿真工程师,旨在系统解决非线性有限元建模与分析的学习门槛问题。压缩包共3个文件(1.57MB),含核心PDF教程《aybook.…

2026/10/18 20:35:06 阅读更多 →

最新新闻

PlantUML驱动的可执行架构图设计方法论

PlantUML驱动的可执行架构图设计方法论

1. 项目概述:这不是画图,是构建可执行的逻辑骨架“diagram-design”这个词组乍一看像美术课作业,但在我过去十年带过的几十个跨领域项目里,它从来不是PPT里的装饰性插图,而是系统落地前最关键的“可执行蓝图”。我见过…

2026/10/19 0:26:02 阅读更多 →
扩展有限元XFEM从原理到C++实现:裂缝模拟与渗透率联动实战

扩展有限元XFEM从原理到C++实现:裂缝模拟与渗透率联动实战

干数值模拟这行当,最让人头秃的往往不是力学推导本身,而是建模那一关。常规有限元里,裂缝面必须跟单元边界重合,网格拓扑得迁就裂缝几何。遇到一条弯弯曲曲的裂缝倒还好,顶多多切几刀;可真到了多裂缝交叉、…

2026/10/19 0:26:02 阅读更多 →
Agent Skills深度架构解析与实战:从MCP到TaoToken的智能体能力编排

Agent Skills深度架构解析与实战:从MCP到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/19 0:25:02 阅读更多 →
如何将 PostgreSQL MCP 服务器与 Cursor 或 Claude 结合使用:TaoToken 统一 Key 接入实战

如何将 PostgreSQL MCP 服务器与 Cursor 或 Claude 结合使用: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/19 0:25:02 阅读更多 →
那张被审稿人点赞的图是怎么做出来的?科迅捷AI(官方网站:www.kexunjie.com)有答案

那张被审稿人点赞的图是怎么做出来的?科迅捷AI(官方网站:www.kexunjie.com)有答案

想象这样一个场景:你的博士论文投稿三个月,审稿意见回来了,其中一条写着这张图设计得尤其清晰、信息量大。这是审稿人少见的正面评价,在满是修改意见的意见单里格外显眼。那张被点赞的图,到底是怎么做出来的&#xff1…

2026/10/19 0:25:02 阅读更多 →
论文里的数据分析别硬编,科迅捷AI(官方网站:www.kexunjie.com)把方法讲明白

论文里的数据分析别硬编,科迅捷AI(官方网站:www.kexunjie.com)把方法讲明白

本科论文里最常见的硬伤之一,是数据分析部分。数据是编的、图表是凑的、结论是事先想好再回头找数的。每年答辩季,老师都能听到几个自相矛盾的回答,问题几乎都出在数据不是自己做的。这一段对比一下硬编数据和认真做分析两种路径的差别&#…

2026/10/19 0:25:02 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →