从安装到上线:langchain-openai 实战指南,一篇打通 OpenAI 接入 LangChain 的全部场景
从安装到上线langchain-openai 实战指南一篇打通 OpenAI 接入 LangChain 的全部场景【免费下载链接】langchainThe agent engineering platform.项目地址: https://gitcode.com/GitHub_Trending/la/langchainlangchain-openai是 LangChain 官方维护的 OpenAI 集成包它基于openaiPython SDK把 GPT 系列聊天模型、传统补全模型和 Embedding 模型包装成 LangChain 标准接口BaseChatModel、BaseLLM、Embeddings让你可以直接在Runnable链、Agent 和工作流里调用 OpenAI。本文按想做什么来组织内容从三步拿到第一个回答到流式、工具调用、结构化输出再到 Responses API、向量化和 Azure/兼容服务落地最后汇总常见坑。三步拿到第一个回答uv 安装、配 Key、首次调用整个准备过程只需要三步。第一步安装。推荐用uv一条命令装好uv add langchain-openai不用uv的话pip install -U langchain-openai同样可以。当前版本为1.6.7见 pyproject.toml要求 Python3.10,4.0核心依赖是langchain-core1.6.6,2.0.0、openai2.45.0,4.0.0外加tiktoken本地 token 计数和certifiCA 证书。第二步配 Key。设置环境变量即可代码里不用再显式传api_keyexport OPENAI_API_KEYyour-api-key几个容易忽略的回退规则源码里写得很明确base_url未显式传入时依次回退到环境变量OPENAI_API_BASE、OPENAI_BASE_URLorganization回退到OPENAI_ORG_ID。第三步发第一个请求。from langchain_openai import ChatOpenAI model ChatOpenAI(modelgpt-4.1-mini, temperature0) messages [ (system, You are a helpful translator. Translate the user sentence to French.), (human, I love programming.), ] ai_msg model.invoke(messages) print(ai_msg.content) # 回答正文 print(ai_msg.usage_metadata) # {input_tokens: ..., output_tokens: ..., total_tokens: ...} print(ai_msg.response_metadata[finish_reason])invoke返回的是标准的AIMessage正文在contentresponse_metadata里有token_usage、model_name、system_fingerprint、finish_reason等信息usage_metadata是结构化的 token 统计。还有一个很实用的机制未被显式声明为类参数的参数会直接透传给底层openaiSDK 的create(...)。也就是说ChatOpenAI(..., frequency_penalty0.2)与每次调用时传invoke(..., frequency_penalty0.2)等价——OpenAI SDK 的完整参数面你都能用不必等 LangChain 逐个封装。场景一基础问答怎么发消息格式怎么写上一节的例子其实已经是一个完整的问答了这里把消息格式讲透。输入既可以是(role, content)元组也可以是消息对象SystemMessage、HumanMessage等来自langchain_core.messagesfrom langchain_core.messages import SystemMessage, HumanMessage messages [ SystemMessage(Answer in one sentence.), HumanMessage(What is LangChain?), ] ai_msg model.invoke(messages)多轮对话就是维护一个消息列表把上一轮的AIMessage和工具消息继续追加进去。 顺带一提如果你用的是非聊天式的纯补全模型如gpt-3.5-turbo-instruct走的是langchain_openai.llms里的OpenAI类用法一致model.invoke(The meaning of life is )直接返回字符串model.stream(...)逐段输出。日常开发 95% 的场景用ChatOpenAI就够了。场景二流式输出与异步调用怎么写同步流式stream返回的每个chunk是携带增量内容的AIMessageChunk直接打印.textfor chunk in model.stream(messages): print(chunk.text, end)需要拿完整消息就累加AIMessageChunk支持stream model.stream(messages) full next(stream) for chunk in stream: full chunk异步是另一组方法一一对应await model.ainvoke(messages) # 异步单次 async for chunk in model.astream(messages): ... await model.abatch([messages, other_messages]) # 异步批量注意两个实战细节流式时想要 token 统计必须显式开启stream_usageTrue它等价于在请求里下发stream_options{include_usage: True}然后从累加后的完整消息上读usage_metadatastream model.stream(messages, stream_usageTrue) full next(stream) for chunk in stream: full chunk print(full.usage_metadata)流式中断会抛出StreamChunkTimeoutError包顶层已导出需要区分网络断了和模型还在生成时可以针对它单独做重试逻辑。场景三工具调用怎么绑定custom_tool 是什么用 bind_tools 绑定 Pydantic 工具OpenAI 的函数调用协议在 LangChain 里对应的就是bind_tools工具用 Pydantic 模型定义from pydantic import BaseModel, Field class GetWeather(BaseModel): Get the current weather in a given location location: str Field(..., descriptionThe city and state, e.g. San Francisco, CA) model_with_tools model.bind_tools([GetWeather]) ai_msg model_with_tools.invoke(Which city is hotter today: LA or NY?) print(ai_msg.tool_calls) # [{name: GetWeather, args: {location: ...}, id: call_...}, ...]拿到tool_calls后你执行工具、把结果包成ToolMessage回传模型继续生成——这就是 Agent 循环的骨架。两个可调参数strictTrue可要求模型严格遵循工具参数的 JSON Schema并行工具调用默认开启parallel_tool_callsTrue。想关掉可以在调用时传invoke(..., parallel_tool_callsFalse)也可以model.bind(parallel_tool_callsFalse)或在初始化时通过model_kwargs固定。custom_tool自由格式输入的自定义工具OpenAI 的 Custom Tools 允许工具参数是自由格式的长字符串典型场景把整段代码丢给模型执行。仓库提供了custom_tool装饰器tools/custom_tool.py它会把你的函数返回值包装成{type: custom_tool_call_output, output: ...}from langchain_openai import ChatOpenAI, custom_tool custom_tool def execute_code(code: str) - str: Execute python code. return 27 model ChatOpenAI(modelgpt-5, output_versionresponses/v1) # 配合 LangGraph 的 create_react_agent(model, [execute_code]) 使用装饰器还支持format参数用上下文无关文法grammar约束工具输出格式。场景四结构化输出与 JSON 模式怎么选with_structured_output直接拿 Pydantic 对象让模型按你定义的 schema 输出返回的就是对象而不是字符串解析和校验一步到位from pydantic import BaseModel, Field class Joke(BaseModel): Joke to tell user. setup: str Field(descriptionThe setup of the joke) punchline: str Field(descriptionThe punchline to the joke) rating: int | None Field(descriptionHow funny the joke is, from 1 to 10) structured_model model.with_structured_output(Joke) joke structured_model.invoke(Tell me a joke about cats) # Joke(setupWhy was the cat sitting on the computer?, # punchlineTo keep an eye on the mouse!, ratingNone)JSON 模式只要合法 JSON不想上 schemabind(response_format{type: json_object})只保证输出是合法 JSON字段结构由你在 prompt 里约定json_model model.bind(response_format{type: json_object}) ai_msg json_model.invoke( Return a JSON object with key random_ints and a value of 10 random ints in [0-99] ) # ai_msg.content 是 JSON 字符串自行 json.loads经验法则字段需要类型/取值约束就上with_structured_output只是输出别带废话才用 JSON 模式。进阶模型调用Responses API、推理与 Flex 档位ChatOpenAI对 OpenAI 的 Responses API 支持已经比较完整三个开关model ChatOpenAI( model..., use_responses_apiTrue, # 请求改走 /v1/responses 通道 output_versionresponses/v1, # 新版消息格式 )注意output_versionresponses/v1会把推理摘要、内置工具调用等内容格式化进消息的content字段而不是塞在additional_kwargs里新应用建议统一用这个格式。推理模型reasoning通过reasoning参数控制思考力度与摘要reasoning { effort: medium, # low | medium | high summary: auto, # detailed | auto | None } model ChatOpenAI(model..., reasoningreasoning, output_versionresponses/v1) response model.invoke(What is 3^3?) for block in response.content: if block[type] reasoning: for summary in block[summary]: print(summary[text])会话状态续接Responses API 支持服务端保存会话。把上一次响应的 ID 作为previous_response_id传入即可延续对话不必每次重发全部历史response model.invoke(Hi, Im Bob.) second model.invoke( What is my name?, previous_response_idresponse.response_metadata[id], )也可以初始化时设use_previous_response_idTrue请求会自动丢弃到最近一次响应为止的输入消息并用最近响应 ID 填充previous_response_id。 源码提示对接 OpenAI 兼容端点且启用推理时如果遇到请求格式错误优先改用这个参数让服务端自己持有会话状态。服务端内置工具配合 Responses API 可以直接绑定 OpenAI 的服务端工具如网页搜索model ChatOpenAI(model..., output_versionresponses/v1) model_with_tools model.bind_tools([{type: web_search}])省钱档位service_tierflex走 flex 层级价格更低但响应可能更慢适合模型评测、数据增强等非实时任务beta 特性仅部分模型支持。向量化OpenAIEmbeddings 使用与长文本分块机制Embedding 部分实现langchain_core.embeddings.Embeddings接口embeddings/base.pyfrom langchain_openai import OpenAIEmbeddings embeddings OpenAIEmbeddings( modeltext-embedding-3-large, # dimensions1024 # text-embedding-3 及以后系列可指定输出维度 ) vector embeddings.embed_query(hello) # 单条 vectors embeddings.embed_documents([hello, goodbye]) # 批量 await embeddings.aembed_query(hello) # 异步几个关键默认值源码里可直接查到model默认text-embedding-ada-002embedding_ctx_length8191单次嵌入的最大 token 数chunk_size1000每个批次的文本条数max_retries2tiktoken_enabledTrue用 tiktoken 本地分词做长度校验。长文本怎么处理当文本超过embedding_ctx_length时它会被切块分别嵌入最终结果按各块的 token 数加权平均再归一化逻辑见_process_batched_chunked_embeddings。所以超长文档不会报错只是向量是多块的合成。⚠️ 接 OpenRouter、Ollama、vLLM 等兼容服务时的标准姿势embeddings OpenAIEmbeddings( model..., base_url..., check_embedding_ctx_lengthFalse, # 很多兼容服务不支持 token 化直接发原文 # encoding_formatfloat, # 避免 base64 编码问题 )生产落地Azure 部署、兼容服务与异常处理Azure OpenAI企业环境走 Azure 时换一套类名和环境变量export AZURE_OPENAI_API_KEYyour-api-key export AZURE_OPENAI_ENDPOINThttps://your-endpoint.openai.azure.com/from langchain_openai import AzureChatOpenAI model AzureChatOpenAI( azure_deploymentyour-deployment, # Azure 部署名 api_version2024-05-01-preview, # REST API 版本注意这不是模型版本 )两个容易混淆的点api_version是 Azure REST API 的版本号和模型版本无关model参数在 Azure 里只用于 tracing 和 token 计数不影响实际调用真正决定调用的是azure_deployment。还支持azure_ad_token/azure_ad_token_provider用 Microsoft Entra ID 令牌替代 API Key。Embeddings 与补全模型的 Azure 版本分别是AzureOpenAIEmbeddings和AzureOpenAI。OpenAI 兼容服务base_url 与 extra_body接 LM Studio、vLLM、Ollama 等本地或第三方服务时base_url指定地址、api_key填任意占位值即可# LM Studio支持 TTL 自动卸载 model ChatOpenAI( base_urlhttp://localhost:1234/v1, api_keylm-studio, modelmlx-community/QwQ-32B-4bit, extra_body{ttl: 300}, # 5 分钟无活动自动卸载模型 ) # vLLM model ChatOpenAI( base_urlhttp://localhost:8000/v1, api_keyEMPTY, modelmeta-llama/Llama-2-7b-chat-hf, extra_body{use_beam_search: True, best_of: 4}, )model_kwargs和extra_body的分工是踩坑重灾区记住一句话标准 OpenAI 参数走model_kwargs合并进请求体顶层如max_completion_tokens、modalities兼容服务商的自定义参数必须走extra_body嵌套在extra_body键下。自定义参数误塞进model_kwargs会直接报 API 错误。另外两点注意请求走/v1/chat/completions还是/v1/responses会部分依据模型名推断对接兼容服务时建议显式设use_responses_apiFalse消除歧义ChatOpenAI只解析官方 OpenAI 规范的响应字段第三方供应商加的非标准字段如reasoning_content、reasoning_details不会被提取保留。接 OpenRouter、DeepSeek 这类服务商优先用对应的专属包ChatOpenRouter、ChatDeepSeek。异常处理包把 OpenAI SDK 的异常统一翻译成了 LangChain 标准异常定义在 chat_models/base.py你可以按语义精确捕获限流抛OpenAIRateLimitError、上下文超长抛OpenAIContextOverflowError同时继承openai.BadRequestError和 LangChain 的ContextOverflowError、超时抛OpenAITimeoutError、连接问题抛OpenAIConnectionError认证/模型不存在/权限拒绝也各有对应类。统一兜底可以捕获基类ModelAPIError这一族。常见坑 FAQQ1自定义参数到底放model_kwargs还是extra_body标准 OpenAI 参数max_completion_tokens、stream_options、audio等放model_kwargs会拍平到请求体顶层vLLM 的use_beam_search、LM Studio 的ttl这类非标准参数放extra_body。放错位置会直接 API 报错。Q2流式调用后拿不到usage_metadata流式请求默认不带用量传stream_usageTrue再累加 chunk最后一个统计信息会合进full.usage_metadata。Q3长文本 embedding 报 token 超限默认embedding_ctx_length8191会自动分块后加权平均正常不会报错如果接的是兼容服务改用check_embedding_ctx_lengthFalse跳过本地分词校验直接发原文。Q4接了第三方服务响应里的reasoning_content之类的字段拿不到ChatOpenAI只认官方 OpenAI 规范字段供应商私货不会被保留。这种情况换供应商专属包。Q5限流、超时怎么兜底初始化时设max_retriesEmbeddings 默认 2 次处理可重试错误不可重试的按上面提到的异常类精确捕获后做降级或告警。Q6工具调用后 Agent 循环在非 OpenAI 端点上挂了试试ChatOpenAI(..., use_responses_apiTrue, use_previous_response_idTrue)让服务端保持会话状态绕开推理历史转发问题。一页速查包langchain-openai当前版本1.6.7Python3.10底层依赖openaiSDK安装uv add langchain-openai密钥export OPENAI_API_KEYyour-api-key端点回退链base_url→OPENAI_API_BASE→OPENAI_BASE_URL聊天ChatOpenAI(modelgpt-4.1-mini).invoke(messages)→ 返回AIMessage纯补全OpenAI(modelgpt-3.5-turbo-instruct).invoke(...)流式model.stream(msgs)要统计加stream_usageTrue流中断抛StreamChunkTimeoutError异步ainvoke/astream/abatch工具model.bind_tools([PydanticModel])读ai_msg.tool_calls自由字符串工具用custom_tool结构化输出model.with_structured_output(MyModel)轻量 JSONmodel.bind(response_format{type: json_object})向量化OpenAIEmbeddings(modeltext-embedding-3-large)长文本自动分块 token 加权平均Responses APIuse_responses_apiTrue, output_versionresponses/v1会话续接传previous_response_idservice_tierflex省钱AzureAzureChatOpenAI(azure_deployment..., api_version...)配AZURE_OPENAI_API_KEYAZURE_OPENAI_ENDPOINT兼容服务base_url指向服务地址自定义参数走extra_body必要时显式use_responses_apiFalse【免费下载链接】langchainThe agent engineering platform.项目地址: https://gitcode.com/GitHub_Trending/la/langchain创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

UE4反射系统深度解析:SSR、平面反射与反射捕获的协同机制

UE4反射系统深度解析:SSR、平面反射与反射捕获的协同机制

1. 项目概述:这不是教科书里的“反射”,而是UE4引擎里真正跑得起来的光路逻辑“【UE4】反射系统分析(二)”这个标题,乍看像一篇技术续章,但如果你正在调试一个水面泛着奇怪紫边的游艇场景,或者发…

2026/10/15 3:13:37 阅读更多 →
unity实现截屏-全屏-区域截屏

unity实现截屏-全屏-区域截屏

放个美女养眼注意事项只测试Canvas是ScreenSpace-Camera模式的情况需要Unitask插件单例自己维护下&#xff0c;会报错会自动保存成jpg到特定目录代码速览public async UniTask<CaptureData> BeginCaptureByRect(RectTransform rtUI) public async UniTask<CaptureData…

2026/10/15 3:12:37 阅读更多 →
MutatingAdmissionPolicy 实践指南:用声明式策略替代 Mutating Webhook

MutatingAdmissionPolicy 实践指南:用声明式策略替代 Mutating Webhook

MutatingAdmissionPolicy 实践指南&#xff1a;用声明式策略替代 Mutating Webhook 【免费下载链接】website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/GitHub_Trending/webs/website Kubernetes 的 MutatingAdmissionPolicy 是一种…

2026/10/15 3:12:37 阅读更多 →

最新新闻

一种可快速恢复的Zabbix高可用架构设计

一种可快速恢复的Zabbix高可用架构设计

做运维的朋友们可能都有过这样的深夜惊魂&#xff1a;好容器完成了监控的Server、Proxy的部署、告警的收敛&#xff0c;监控的覆盖率也达标了&#xff0c;结果承载Zabbix Server和PostgreSQL的机器突然宕机。那一刻&#xff0c;不是“少看几张图”的问题&#xff0c;而是整个团…

2026/10/15 4:01:45 阅读更多 →
2026网站创建用什么ai建站系统?科技赋能才能事半功倍!

2026网站创建用什么ai建站系统?科技赋能才能事半功倍!

2026网站创建用什么AI建站系统&#xff1f;科技赋能才能事半功倍&#xff01;中国信通院2026年初发布的《中小企业数字化发展白皮书》显示&#xff0c;国内超六成中小企业将“低成本快速搭建线上阵地”列为数字化转型首要需求&#xff0c;AI建站系统凭借低门槛、高效率、全链路…

2026/10/15 4:01:45 阅读更多 →
做了这么久技术博主,我从后台私信里看透了这几种人

做了这么久技术博主,我从后台私信里看透了这几种人

做技术专栏这么久&#xff0c;后台私信几千条&#xff0c;我现在是分情况处理的——但一开始不是。 刚开号那会儿我每条都回。有人问问题&#xff0c;我认认真真写解答&#xff1b;有人要加微信&#xff0c;我不好意思拒绝&#xff1b;有人半夜甩过来一整段代码让帮忙看&#x…

2026/10/15 4:01:45 阅读更多 →
从零开始用Canvas开发五子棋网页游戏:技术选型、AI博弈与实战解析

从零开始用Canvas开发五子棋网页游戏:技术选型、AI博弈与实战解析

1. 项目设计与技术选型思路1.1 这个项目到底在做什么五子棋网页版小游戏&#xff0c;是前端练手项目里出现频率极高的一种。它看起来简单&#xff0c;但如果把完整需求列出来&#xff0c;会发现麻雀虽小五脏俱全&#xff1a;棋盘渲染、落子交互、胜负判定、悔棋、重置、人机对战…

2026/10/15 4:01:45 阅读更多 →
Superpowers:基于浏览器的开源协作游戏开发平台

Superpowers:基于浏览器的开源协作游戏开发平台

最近好几个做独立游戏的朋友都在问同一个词&#xff1a;superpowers。我一开始以为他们说的是某款超能力题材的新游戏&#xff0c;直到有位朋友发来一张浏览器截图&#xff0c;我才反应过来——他们问的是开源协作游戏开发工具 Superpowers&#xff0c;一个真正能让你不装全家桶…

2026/10/15 4:01:45 阅读更多 →
2026大厂AI薪资大起底:普通研发卷到40万,Agent开发狂撒80万年薪?

2026大厂AI薪资大起底:普通研发卷到40万,Agent开发狂撒80万年薪?

2026年大厂AI薪资揭秘&#xff1a;普通研发岗薪资锚定40万左右&#xff0c;但竞争激烈&#xff1b;AI Agent开发岗&#xff08;50-80K15薪&#xff09;对标SSP&#xff0c;高薪且门槛低&#xff0c;企业抢“应用落地”人才&#xff1b;顶级AI科学家包揽80-220万年薪。求职建议分…

2026/10/15 4:00:45 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

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

周新闻

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

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

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

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

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

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

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

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

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#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/14 7:53:34 阅读更多 →