基于OpenClaw AI智能体实现实时司机位置查询的实战教程
1. 项目概述当AI智能体遇上实时出行最近在折腾一个挺有意思的项目用OpenClaw这个AI智能体框架去模拟实现一个类似滴滴打车的核心功能——查询司机位置。这听起来可能有点“跨界”但背后的逻辑其实非常清晰。我们不是在开发一个真正的打车App而是想探索一下当我们将一个强大的AI智能体框架接入到一个需要实时数据、状态管理和复杂逻辑判断的业务场景时它能展现出多大的潜力。OpenClaw本身是一个开源的AI智能体平台它允许你通过配置和编排让大语言模型LLM去调用各种工具Tools和技能Skills从而完成一系列自动化任务。而“查询司机位置”这个动作恰恰是一个典型的、需要串联多个步骤的自动化流程理解用户意图、验证订单状态、调用地图API、解析返回数据、并以人类可读的方式呈现结果。这个项目的核心价值在于验证和演示AI智能体在流程自动化领域的应用边界。对于开发者而言它提供了一个绝佳的实战案例来学习如何将OpenClaw从一个“聊天机器人”升级为一个能处理具体业务逻辑的“数字员工”。对于产品经理或业务人员它能直观地展示AI如何替代或辅助那些规则明确但步骤繁琐的重复性工作。整个过程会涉及到OpenClaw的基础部署、技能Skill开发、与外部API的集成以及如何设计一个健壮的智能体工作流。无论你是想深入了解OpenClaw的实战用法还是对AI智能体如何落地到具体业务场景感到好奇这个项目都能给你带来不少启发。接下来我就把自己从环境搭建到功能实现的完整过程以及踩过的那些坑详细拆解一遍。2. 核心思路与架构设计2.1 为什么选择OpenClaw市面上AI智能体框架不少比如LangChain、AutoGen等。选择OpenClaw来做这个项目主要基于几个实际的考量。首先OpenClaw的设计理念强调“低代码”和“配置化”它通过YAML文件来定义智能体的行为、技能和工具这对于快速原型构建特别友好。我不需要写大量的胶水代码来连接LLM和外部功能而是可以像搭积木一样通过声明式的配置组合出复杂的工作流。其次OpenClaw对“技能”Skill的抽象做得很好。一个“查询司机位置”的技能可以被清晰地定义输入、输出、执行逻辑以及所需工具这种模块化设计让后续的维护和扩展变得非常清晰。最后OpenClaw的社区活跃度不错遇到问题相对容易找到解决方案或思路这对于一个探索性项目来说至关重要。当然它也有自己的学习曲线尤其是其配置文件的语法和概念体系需要花点时间熟悉。但一旦掌握你会发现用它来编排一个多步骤的自动化任务效率非常高。2.2 系统架构与数据流设计要实现“查询司机位置”我们不能让AI凭空想象必须让它有能力与真实或模拟的后端服务进行交互。因此整个系统的架构可以划分为三层交互层用户通过自然语言如“帮我查一下我当前订单的司机到哪了”发起请求。这一层可以是OpenClaw提供的Web界面、接入的飞书/微信机器人或者一个简单的命令行接口。智能体层OpenClaw这是我们项目的核心。OpenClaw智能体接收到用户请求后会利用内置的大语言模型如通过Ollama本地部署的Llama 3或配置的云端API来理解用户意图。然后它会根据我们预先定义的技能和工作流决定需要调用哪个技能即“查询司机位置技能”。服务层这是提供实际业务能力的后端。为了模拟滴滴打车的环境我们需要构建或模拟几个关键服务订单服务用于验证用户身份、查询当前有效的订单及其对应的司机ID。这可以是一个简单的Mock API返回固定的测试数据。地图服务用于根据司机ID查询其实时位置经纬度。我们可以使用高德地图、百度地图的Web API或者更简单地用一个随机生成位置的模拟API。逆地理编码服务将查询到的经纬度转换为人类可读的地址信息如“北京市海淀区中关村大街XX号附近”。这通常也是地图API提供的能力。数据流是这样的用户提问 - OpenClaw解析意图 - 调用“查询司机位置”技能 - 该技能首先调用“订单服务”获取司机ID - 再用司机ID调用“地图服务”获取经纬度 - 最后调用“逆地理编码服务”得到具体地址 - OpenClaw将地址信息组织成自然语言回复给用户。2.3 技能Skill设计要点在OpenClaw中技能是实现具体功能的核心单元。针对“查询司机位置”我们需要设计一个技能它至少需要两个关键工具Toolsget_driver_id_by_order: 根据当前用户上下文需要从对话中提取或通过身份验证获得获取司机ID。get_location_by_driver_id: 根据司机ID获取实时位置经纬度并进行逆地理编码。技能的定义需要详细描述其功能、输入参数、输出格式以及调用上述工具的顺序和逻辑。OpenClaw的LLM会根据这些描述在合适的时机自动调用它们。这里的一个设计难点在于状态管理如何在不同工具调用之间传递数据如司机ID。我们需要在技能配置中明确指定输出变量的映射关系确保上一个工具的输出能作为下一个工具的输入。3. 环境部署与OpenClaw配置实操3.1 基础环境搭建Docker vs 原生安装部署OpenClaw最快捷的方式是使用Docker这能避免复杂的依赖问题。官方通常提供了docker-compose.yml文件一键启动所有服务包括OpenClaw本身、必要的数据库等。# 假设已有docker-compose.yml git clone OpenClaw仓库地址 cd openclaw docker-compose up -d部署成功后访问http://localhost:3000端口可能根据配置不同就能看到OpenClaw的Web管理界面。如果你倾向于原生安装步骤会繁琐一些需要准备好Python环境建议3.9然后按照官方文档安装依赖。我个人的经验是对于快速实验和开发Docker方式是最稳妥的它能保证环境一致性。但在需要深度定制或调试时原生安装可能更方便。特别注意在Ubuntu或Mac上部署时注意检查系统权限和端口占用情况。Windows部署则更推荐使用Docker Desktop可以绕过很多环境配置的坑。3.2 配置大模型后端OllamaOpenClaw本身不提供模型需要连接一个大模型服务来处理自然语言理解与生成。本地部署推荐使用Ollama它能让您轻松在本地运行如Llama 3、Qwen等开源模型。安装Ollama前往Ollama官网下载对应系统的安装包安装并启动服务。拉取模型在终端运行ollama pull llama3:8b来拉取一个适中的模型。在OpenClaw中配置在OpenClaw的Web管理界面或配置文件中找到模型设置部分。将Ollama的API地址通常是http://localhost:11434和模型名称如llama3:8b配置进去。关键参数ollama_base_url和default_model。确保这两个参数指向正确的Ollama服务地址和你刚拉取的模型。注意如果OpenClaw在Docker容器内而Ollama运行在宿主机那么ollama_base_url不能写localhost而需要写宿主机的IP地址如http://host.docker.internal:11434在Mac/Windows的Docker Desktop中有效Linux下可能需要配置为宿主机实际IP。这是跨容器通信的常见问题。3.3 创建并配置“查询司机位置”技能这是项目的核心。我们需要在OpenClaw中创建一个新的Skill。通常可以通过Web界面或直接编辑配置文件如skills/目录下的YAML文件来实现。一个简化的技能YAML配置可能如下所示name: query_driver_location description: 根据当前用户的订单查询接单司机的实时位置并转换为具体地址。 inputs: - name: user_id description: 当前用户的唯一标识 required: true tools: - name: get_current_order description: 根据用户ID获取其当前有效订单及司机ID。 # 这里需要配置该工具实际调用的API地址和参数映射 # 例如可能是一个HTTP请求工具指向我们模拟的订单服务端点 - name: fetch_driver_gps description: 根据司机ID从地图服务获取其当前的GPS坐标经纬度。 - name: reverse_geocode description: 将GPS坐标经纬度转换为可读的街道地址。 execution: # 定义执行流程顺序调用上述工具并传递数据 - call: get_current_order with: user_id: {{inputs.user_id}} set: order_info # 将结果存储到变量order_info - call: fetch_driver_gps with: driver_id: {{order_info.driver_id}} set: gps_coords - call: reverse_geocode with: lat: {{gps_coords.latitude}} lng: {{gps_coords.longitude}} set: formatted_address output: | 司机当前位于{{formatted_address}}。 预计基于当前位置的到达时间约为{{order_info.eta}}分钟。这个配置定义了技能的输入、所需的工具链以及执行步骤。execution部分清晰地描述了工作流先查订单再查GPS最后转地址。set关键字用于将每个工具的输出保存到变量供后续步骤使用。3.4 模拟后端服务的搭建由于我们没有真实的滴滴后端需要搭建几个简单的Mock API服务。这里可以用任何你熟悉的轻量级框架比如Python的FastAPI或Flask。例如一个用FastAPI编写的模拟订单服务# mock_order_service.py from fastapi import FastAPI app FastAPI() app.get(/api/order/current) def get_current_order(user_id: str): # 模拟数据库查询返回固定数据 return { order_id: ORDER_123456, driver_id: DRIVER_789, status: accepted, eta: 8 # 模拟预计到达时间 }同样地再写一个模拟地图服务当收到driver_id为DRIVER_789时返回一个固定的或随机在某个范围内的经纬度。逆地理编码服务则可以硬编码返回一个地址或者简单调用一次高德/百度的逆地理编码API需要申请测试Key。将这些服务运行起来并确保OpenClaw所在的网络能够访问到它们的API端点如http://localhost:8000/api/order/current。然后在OpenClaw的技能配置中将工具如get_current_order的实际调用指向这些端点。4. 核心功能实现与集成测试4.1 工具Tool的封装与注册在OpenClaw中工具是技能与外部世界交互的桥梁。我们需要将上面创建的Mock API封装成OpenClaw能识别的工具。OpenClaw支持多种工具类型最常见的是HTTP工具用于调用REST API和Python函数工具用于执行本地代码。对于调用外部API使用HTTP工具更合适。我们需要在OpenClaw的配置中可能是单独的tools配置文件或Web界面添加这个工具# 在OpenClaw的工具配置中 - type: http name: get_current_order_tool description: 调用订单服务获取用户当前订单信息。 http_config: url: http://localhost:8000/api/order/current method: GET params: user_id: {{user_id}} # 这是一个变量会在执行时从上下文中注入 headers: Content-Type: application/json然后在前面的技能配置中tools部分里get_current_order这个工具名就应该指向这里定义的get_current_order_tool。同理配置好fetch_driver_gps和reverse_geocode对应的HTTP工具。4.2 智能体Agent的工作流编排有了技能和工具还需要一个智能体Agent来作为与用户对话的入口并决定何时调用哪个技能。我们创建一个新的智能体在其配置中关联我们刚刚创建的query_driver_location技能。name: ride_hailing_assistant description: 一个出行助手可以处理查询司机位置等请求。 skills: - query_driver_location # 还可以配置默认的对话开场白、系统提示词等 system_prompt: | 你是一个专业的出行助手。当用户需要查询其当前订单的司机位置时请使用query_driver_location技能。 你需要向用户询问其用户ID以便进行查询。这样当用户向这个智能体提问时它的大语言模型会根据system_prompt和对话历史判断用户意图是否匹配“查询司机位置”。如果匹配它会尝试执行query_driver_location技能并自动向用户索要缺失的输入参数如user_id。4.3 端到端测试与对话模拟一切配置就绪后就可以进行测试了。在OpenClaw的Web聊天界面中选择我们创建的ride_hailing_assistant智能体开始对话。测试对话示例用户“我的司机到哪了”智能体“为了帮您查询司机位置我需要您的用户ID。请问您的用户ID是多少”因为技能需要user_id输入用户“我的ID是U123。”智能体内部触发query_driver_location技能依次调用三个工具调用get_current_order_tool带参数user_idU123获得driver_idDRIVER_789。调用fetch_driver_gps带参数driver_idDRIVER_789获得{“latitude”: 39.98961, “longitude”: 116.48128}。调用reverse_geocode带参数lat39.98961, lng116.48128获得“北京市朝阳区望京街附近”。智能体“司机当前位于北京市朝阳区望京街附近。预计基于当前位置的到达时间约为8分钟。”如果一切顺利你就能看到这样一条完整的自动化回复。这个测试验证了从自然语言输入到智能体意图识别再到技能链式调用最后生成自然语言回复的整个闭环。5. 常见问题排查与优化心得在实际操作中你几乎一定会遇到各种问题。下面是我踩过的一些坑和解决方案。5.1 部署与连接类问题OpenClaw启动后无法访问Web界面检查端口确认docker-compose.yml中映射的端口如3000是否被其他程序占用。可以用netstat -tulnp | grep 3000Linux/Mac或netstat -ano | findstr :3000Windows检查。查看日志运行docker-compose logs查看容器日志通常会有具体的错误信息。常见问题包括数据库连接失败、配置文件错误等。OpenClaw无法连接Ollama网络问题这是最常见的问题。如果两者都在Docker中确保它们在同一个Docker网络下。如果Ollama在宿主机OpenClaw在容器内记得使用宿主机的特殊域名或IP而不是localhost。验证Ollama服务先在宿主机用curl http://localhost:11434/api/generate -d {model:llama3:8b, prompt:hello}测试Ollama API是否正常。配置检查确认OpenClaw配置中的ollama_base_url完全正确没有多余的斜杠或错误协议。技能配置错误导致执行失败工具调用失败首先去OpenClaw的日志或Web界面的“执行历史”中查看详细错误。通常是HTTP工具的URL、参数格式不对或者Mock服务本身没响应。用Postman或curl单独测试一下你的Mock API确保其能正确返回数据。变量未定义在技能execution流程中如果引用了未设置的变量会报错。仔细检查每个set的变量名和后续with中引用变量名{{variable_name}}是否完全一致注意大小写。5.2 逻辑与性能优化处理用户意图识别偏差用户可能说“我的车到哪了”、“司机还有多久来”而不仅仅是“查询司机位置”。这取决于你给智能体的system_prompt以及底层LLM的理解能力。可以通过在system_prompt中提供更多同义句示例来优化例如“如果用户询问车辆位置、司机位置、还有多久到车等都视为需要查询司机位置。”更高级的做法是利用OpenClaw的“分类”或“路由”功能先做一个意图识别再分发到不同的技能。但对于我们这个单一功能的演示优化提示词通常就够了。技能执行超时或响应慢链式调用三个HTTP接口如果某个接口响应慢整个技能就会变慢。可以考虑为HTTP工具设置合理的timeout参数如5秒。如果逆地理编码调用的是真实的外部API如高德地图其响应时间受网络影响较大。在实际应用中可能需要引入缓存机制比如对同一经纬度在短时间内不重复查询。错误处理与友好回复当前的技能配置假设一切顺利。但现实中订单可能不存在、司机GPS可能离线、地图API可能失败。我们需要增强技能的健壮性。可以在每个HTTP工具配置中增加error_handling策略比如定义当HTTP状态码非200时返回一个特定的错误信息。在技能的execution中可以加入条件判断。例如在调用get_current_order后检查返回的order_info是否包含有效的driver_id如果没有则直接输出“未找到您的有效订单”并终止后续工具调用。这可能需要使用OpenClaw更高级的流程控制语法。5.3 扩展思路从模拟走向真实这个项目目前完全基于模拟数据。如果你想让它更接近真实应用可以考虑以下扩展方向接入真实地图API将fetch_driver_gps和reverse_geocode工具替换为调用高德地图、百度地图的官方Web服务。这需要申请开发者Key并注意API的调用频率限制和计费方式。集成身份认证在真实的打车App中用户身份是自动识别的通过登录态。我们可以修改Mock订单服务使其接受一个Token而非简单的user_id并在服务端进行验证。OpenClaw的技能也可以配置在HTTP请求头中携带认证信息。实现更复杂的对话管理OpenClaw的一个常见问题是对话状态管理。默认情况下它可能不记得很长的上下文。如果你发现智能体“第二天就不知道昨天会话的内容了”需要检查OpenClaw的会话存储配置。通常需要配置一个持久的会话存储后端如数据库并确保智能体配置中启用了长上下文支持。同时在system_prompt中明确指示智能体需要参考历史对话。构建技能市场OpenClaw允许你将自己的技能打包分享。当你把这个“查询司机位置”技能打磨稳定后可以将其导出方便其他出行类项目的开发者快速集成。通过这个项目你不仅学会了如何部署和配置OpenClaw更重要的是掌握了如何将一个具体的业务场景拆解成AI智能体可以理解和执行的技能与工作流。这种“问题拆解-工具封装-流程编排”的思维模式是应用AI智能体解决实际问题的关键。

相关新闻

Codex 工具调用报 400,问题到底出在哪?

Codex 工具调用报 400,问题到底出在哪?

如果 Codex 经 Responses API 兼容接口回传工具结果时出现: No tool call found for function call output with call_id ...这条 400 能直接说明的是:当前处理 function_call_output 的系统,无法在本次请求关联的上下文中找到对应 call_id。…

2026/10/2 10:36:36 阅读更多 →
SpringBoot面试核心:自动装配、启动流程与生产部署实战解析

SpringBoot面试核心:自动装配、启动流程与生产部署实战解析

1. 项目概述:为什么SpringBoot面试题如此重要?如果你是一名Java开发者,或者正在向这个方向努力,那么“SpringBoot面试”这个词组对你来说一定不陌生。它几乎成了求职路上的一个必经关卡,无论是初级、中级还是高级岗位&…

2026/9/29 7:08:54 阅读更多 →
状态模式与策略模式深度辨析:从设计意图到Python实战

状态模式与策略模式深度辨析:从设计意图到Python实战

1. 项目概述:当“状态”与“策略”狭路相逢在软件设计的江湖里,状态模式和策略模式这对“孪生兄弟”常常让开发者们傻傻分不清楚。它们都基于组合和接口,都旨在将行为封装成独立的类,乍一看,结构图都长得差不多。但如果…

2026/10/8 14:14:55 阅读更多 →

最新新闻

基于卷积神经网络的海洋垃圾识别分类:从数据清洗到模型部署全流程

基于卷积神经网络的海洋垃圾识别分类:从数据清洗到模型部署全流程

简介:这是一套面向计算机相关专业学生的毕业设计资源,主题为基于卷积神经网络的海洋垃圾识别分类,适合正在准备毕设、课程设计或期末大作业的学习者,也可作为深度学习项目实战练习的参考。资源包共101个文件,约74.62MB…

2026/10/9 17:27:35 阅读更多 →
爆款复刻提示词怎么写?2026年爆款视频复刻,5款工具怎么选

爆款复刻提示词怎么写?2026年爆款视频复刻,5款工具怎么选

做短视频矩阵或技术型自媒体时,看到对标账号起量却来不及拆解,是常见痛点。爆款复刻提示词怎么写?本质是用结构化自然语言指令,将原视频的钩子、节奏与信息层转化为可执行的生成参数。鲸剪(WhaleClip)是一款…

2026/10/9 17:27:35 阅读更多 →
Claude Code 速查手册:命令、快捷键与高效工作流实战

Claude Code 速查手册:命令、快捷键与高效工作流实战

1. 为什么我要整理这份 Claude Code 速查手册 用 Claude Code 有一段时间了,从最初把它当成一个"能跑命令的聊天窗口",到后来真正把它嵌进日常开发流里,中间踩的坑不算少。最典型的一个场景是:明明知道有个命令能解决当…

2026/10/9 17:27:35 阅读更多 →
pc-lint plus 1.2 试用实战:C/C++ 静态分析工具集成与避坑指南

pc-lint plus 1.2 试用实战:C/C++ 静态分析工具集成与避坑指南

简介:pc-lint plus 1.2 是 Gimpel Software 于 2019 年 4 月发布的 C/C 静态代码分析工具版本,面向嵌入式开发、系统底层编程及对代码质量要求较高的工程师,用于在编译前发现潜在缺陷、类型不匹配、未定义行为与可移植性问题。压缩包为 zip 格…

2026/10/9 17:27:34 阅读更多 →
OpenWorkMate:用开源架构打造能干活的企业AI工作伙伴

OpenWorkMate:用开源架构打造能干活的企业AI工作伙伴

1. 从“只会聊天”到“真能干活”:企业AI工作伙伴的破局思路公司里那套AI工具,说实话,前两年就是个高级玩具。你问它“帮我写个周报”,它能洋洋洒洒给你整出八百字废话;你问它“上季度的客户投诉主要集中在哪些环节”&…

2026/10/9 17:27:34 阅读更多 →
AI编程IDE卡成PPT?低配电脑用TaoToken把Base URL改到统一通道的实测

AI编程IDE卡成PPT?低配电脑用TaoToken把Base URL改到统一通道的实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 17:26:33 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26: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/9 6:17:20 阅读更多 →