RAG系统全链路观测实战:LangSmith接入与排查指南
1. 为什么 RAG 系统需要一台“心电监护仪”做过 RAG 应用的人大概都有过这种体验用户反馈“答得不对”你打开日志一看检索回来的文档片段看起来没问题生成模型也没报错但最终答案就是跑偏了。更让人头疼的是你根本不知道问题出在检索环节、重排序环节还是生成环节。整个链路就像一个黑盒输入进去输出出来中间发生了什么全靠猜。这就是 RAG 系统最典型的困境——链路太长环节太多排查全靠玄学。一个完整的 RAG 流程至少包含查询改写、向量检索、关键词检索、结果融合、重排序、上下文组装、Prompt 拼接、大模型生成这么七八个步骤任何一个环节出问题都会导致最终结果异常。传统做法是在每个环节手动打日志但日志之间没有关联你看到的是散落的点拼不出完整的链路图。LangSmith 解决的就是这个问题。它本质上是一个面向大模型应用的全链路观测平台可以理解成给 RAG 系统装了一台“心电监护仪”——每一次用户请求进来从入口到出口每个环节的输入输出、耗时、Token 消耗、中间状态全部被自动记录下来并且以树状结构呈现。你不再需要手动埋点只要接入 SDK整条链路就自动被追踪。这篇文章适合正在做 RAG 应用、已经被排查问题折磨过一轮、想建立系统化观测能力的开发者。不管你是用 LangChain 还是自己手写的链路只要涉及多步骤的大模型调用这套观测思路都能直接复用。我会从整体设计思路讲起然后拆解核心概念和实操要点再走一遍完整的接入流程最后把踩过的坑和排查技巧整理出来。2. 全链路观测的整体设计思路拆解2.1 为什么传统日志方案不够用先说清楚为什么不能靠print和logging解决问题。RAG 链路的调用关系是嵌套的一次用户请求会触发多个子调用子调用之间还有依赖关系。用传统日志你看到的是时间线上平铺的一堆记录但看不出谁调用了谁、哪个检索结果被传给了哪个生成步骤。举个例子用户问“某个产品的保修政策是什么”链路可能是这样的查询改写把问题拆成两个子查询分别走向量检索和关键词检索两路结果合并后经过重排序取 Top-3 片段拼进 Prompt最后生成答案。如果最终答案错了你需要知道是改写后的查询偏了还是向量检索没召回相关文档还是重排序把正确文档排到了后面还是 Prompt 拼接时截断了关键信息传统日志只能告诉你“检索返回了 5 条结果”但没法告诉你这 5 条结果在后续环节中的流转路径。LangSmith 的树状追踪结构天然解决了这个问题——每个环节是一个节点节点之间有父子关系你可以沿着树从上往下逐层展开精确定位问题出在哪一层。2.2 观测系统的三个核心能力一套好用的 RAG 观测系统需要具备三个核心能力这也是我在选型时重点考察的维度。第一是自动追踪能力。理想情况下接入 SDK 后不需要改业务代码链路自动被记录。LangSmith 通过回调机制实现这一点LangChain 的callbacks参数或者环境变量配置就能开启全局追踪。对于手写链路用traceable装饰器也能达到类似效果。第二是结构化呈现能力。追踪数据不能是一堆散乱的 JSON需要以可视化的树状图展示调用层级每个节点能展开看输入输出。LangSmith 的 Trace 视图就是这种设计左侧是调用树右侧是选中节点的详情排查时非常直观。第三是评估与对比能力。光看到链路还不够你还需要知道“这次改动后效果是变好了还是变差了”。LangSmith 提供了数据集管理和自动评估功能可以把典型问题做成测试集每次改动后跑一遍对比不同版本的检索命中率、答案准确率等指标。2.3 接入方式的选择逻辑LangSmith 的接入方式主要有三种选择哪种取决于你的技术栈和改造意愿。第一种是环境变量全局开启设置LANGCHAIN_TRACING_V2true和 API Key 后所有 LangChain 调用自动被追踪。这种方式改动最小适合已经用 LangChain 构建链路的项目基本零成本接入。第二种是代码级显式配置在创建 LLM 或 Chain 时传入callbacks参数。这种方式更灵活可以控制哪些调用被追踪、哪些不被追踪适合需要精细化管理的场景。第三种是手动埋点用traceable装饰器标记自定义函数。适合不用 LangChain、完全手写链路的项目或者需要追踪 LangChain 之外的业务逻辑。我个人的建议是如果项目已经深度使用 LangChain直接走第一种五分钟就能看到效果如果是混合架构用第二种加第三种组合核心链路自动追踪自定义逻辑手动埋点。3. 核心概念与实操要点解析3.1 Trace、Run、Span 的关系LangSmith 的数据模型有三个核心概念理解它们是用好这个工具的前提。Run是最小追踪单元代表一次具体的操作比如一次 LLM 调用、一次检索、一次工具调用。每个 Run 有独立的 ID、输入、输出、开始时间、结束时间、Token 消耗等属性。Trace是一次完整请求的追踪记录包含从入口到出口的所有 Run。一个 Trace 就是一棵调用树根节点是入口函数子节点是各个子调用。Span是 Run 在树状结构中的表现形式强调层级关系。父 Span 和子 Span 之间通过parent_run_id关联。用生活化的类比一次用户请求是一次“就诊”Trace 就是这次就诊的完整病历Run 是病历里的每一项检查记录验血、拍片、心电图Span 是这些检查之间的层级关系先挂号挂号下面有分诊分诊下面有各项检查。实操中你需要注意Run 的嵌套层级不要太深。我见过有的项目把每个函数都包一层结果一棵树有十几层排查时展开都费劲。建议只对关键环节打点比如检索、重排序、生成这三个核心步骤辅助性的工具函数不用单独追踪。3.2 关键参数配置与含义接入 LangSmith 需要配置几个关键参数每个参数的含义和取值逻辑需要说清楚。参数名作用推荐值注意事项LANGCHAIN_TRACING_V2开启追踪开关true生产环境建议按需开启避免全量追踪LANGCHAIN_API_KEY认证密钥从平台获取不要硬编码在代码里用环境变量注入LANGCHAIN_PROJECT项目分组按环境命名建议区分 dev/staging/prodLANGCHAIN_ENDPOINT数据上报地址默认即可一般不需要改这里重点说LANGCHAIN_PROJECT的命名策略。我踩过的坑是开发阶段所有追踪都往一个项目里塞结果测试数据和线上数据混在一起排查时根本分不清。后来改成按环境加日期命名比如rag-dev-0715、rag-prod清晰很多。另一个容易忽略的是采样率。LangSmith 默认全量上报高并发场景下会产生大量数据既增加成本也影响性能。虽然社区版没有直接的采样率配置但可以通过代码级控制实现——只对特定用户或特定类型的请求开启追踪。3.3 追踪数据的隐私与安全边界这一点必须单独拿出来说。RAG 系统的输入输出往往包含业务敏感信息追踪数据上报到第三方平台前需要做脱敏处理。LangSmith 提供了hide_inputs和hide_outputs参数可以在特定 Run 上隐藏输入输出。我的做法是对涉及用户隐私的字段如手机号、身份证号在进入链路前就做脱敏追踪记录里只保留脱敏后的数据。另外对于核心业务逻辑的 Prompt如果不想暴露可以用hide_inputsTrue隐藏具体内容只保留调用结构和耗时信息。注意脱敏要在数据进入追踪系统之前完成不要指望平台帮你处理。我见过有团队直接把原始用户数据上报后来做安全审计时被要求整改返工成本很高。4. 完整接入流程与核心环节实现4.1 环境准备与依赖安装先把手头的环境理清楚。假设你用的是 Python 技术栈LangChain 版本在 0.1 以上那么接入 LangSmith 只需要装一个包。pip install langsmith如果你用的是 LangChainlangsmith会作为依赖自动安装不需要单独装。但如果你要用手动埋点的方式就需要显式安装。环境变量配置有三种方式按优先级从高到低排列第一种是直接在 shell 里 export适合临时调试export LANGCHAIN_TRACING_V2true export LANGCHAIN_API_KEYyour_api_key_here export LANGCHAIN_PROJECTrag-observability-demo第二种是写在.env文件里用python-dotenv加载适合本地开发from dotenv import load_dotenv load_dotenv()第三种是在代码里用os.environ设置适合容器化部署时从配置中心注入import os os.environ[LANGCHAIN_TRACING_V2] true os.environ[LANGCHAIN_API_KEY] os.getenv(LANGSMITH_KEY) os.environ[LANGCHAIN_PROJECT] rag-prod我个人的习惯是本地开发用.env文件CI/CD 环境用环境变量注入生产环境从密钥管理服务读取。绝对不要把 API Key 硬编码在代码里提交到仓库这是安全红线。4.2 LangChain 链路的自动追踪接入如果你的 RAG 链路是用 LangChain 的 LCEL 或者 Chain 构建的接入追踪几乎零成本。设置好环境变量后所有调用自动被记录。from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser llm ChatOpenAI(modelgpt-4o-mini) prompt ChatPromptTemplate.from_template(根据以下上下文回答问题\n{context}\n\n问题{question}) chain prompt | llm | StrOutputParser() result chain.invoke({ context: 某产品的保修期为两年自购买之日起计算。, question: 保修期是多久 })这段代码执行后LangSmith 里会自动出现一条 Trace包含 Prompt 渲染、LLM 调用、输出解析三个 Span。你可以在平台上看到每个环节的输入输出和耗时。但这里有个细节需要注意LCEL 的追踪粒度。默认情况下LCEL 会把整个链作为一个 Trace内部每个步骤作为子 Span。如果你用了RunnableParallel做并行检索并行分支会作为兄弟节点出现在树里排查时能清楚看到哪一路先返回、哪一路拖了后腿。4.3 自定义 RAG 链路的手动埋点不用 LangChain 的项目或者需要在链路中插入自定义逻辑的用traceable装饰器手动埋点。from langsmith import traceable traceable(namevector_retrieval, run_typeretriever) def vector_search(query: str, top_k: int 5): # 模拟向量检索 results vector_db.search(query, top_ktop_k) return results traceable(namererank, run_typetool) def rerank_documents(query: str, documents: list): # 模拟重排序 scored [(doc, compute_score(query, doc)) for doc in documents] scored.sort(keylambda x: x[1], reverseTrue) return [doc for doc, _ in scored[:3]] traceable(namerag_pipeline, run_typechain) def rag_pipeline(question: str): docs vector_search(question) reranked rerank_documents(question, docs) context \n.join([d.content for d in reranked]) answer llm.generate(context, question) return answer这里的关键是run_type参数它决定了 Span 在平台上的图标和分类。常用的类型有llm、chain、retriever、tool、embedding等。设置正确的类型能让 Trace 视图更清晰排查时一眼就能区分检索和生成。name参数也很重要默认会用函数名但函数名往往不够直观。建议用业务语义命名比如vector_retrieval比search更清楚rerank比process更明确。4.4 关键指标的采集与呈现接入追踪只是第一步真正有价值的是从追踪数据中提取关键指标。RAG 系统需要重点关注的指标有这么几类。检索质量指标召回文档数量、重排序后的 Top-1 得分、检索耗时。这些指标能帮你判断检索环节是否健康。如果召回数量总是很少可能是向量库索引有问题如果重排序得分普遍偏低可能是 Embedding 模型不适合当前领域。生成质量指标输入 Token 数、输出 Token 数、生成耗时、首 Token 延迟。Token 数异常增长往往意味着 Prompt 拼接出了问题比如上下文片段重复拼接或者截断逻辑有 Bug。链路整体指标端到端耗时、各环节耗时占比、错误率。我习惯在 LangSmith 的 Dashboard 里看耗时分布如果检索环节占了总耗时的 80%那优化重点就很明确了。LangSmith 的 Trace 详情页会自动展示这些指标但你也可以自定义反馈Feedback来记录业务指标。比如在答案生成后用client.create_feedback记录用户是否满意后续做数据分析时就能把技术指标和业务指标关联起来。5. 常见问题与排查技巧实录5.1 追踪数据不出现的排查思路这是接入阶段最高频的问题按以下顺序排查基本能覆盖 90% 的情况。第一步确认环境变量是否生效。在代码里打印os.getenv(LANGCHAIN_TRACING_V2)看是不是true。我遇到过.env文件没被加载的情况原因是load_dotenv()调用时机太晚在 import LangChain 之后才执行。第二步确认 API Key 是否有效。可以在终端用 curl 测试连通性或者看 LangSmith 平台上的项目列表是否有新项目创建。如果 Key 无效SDK 通常会静默失败不会抛异常这点很坑。第三步确认网络是否可达。追踪数据需要上报到平台如果部署环境有网络限制数据会积压在本地缓冲区。LangSmith SDK 有重试机制但网络不通时最终会丢弃数据。第四步检查是否有异常被吞掉。LangChain 的回调机制在某些异常场景下会跳过追踪比如 Chain 执行中途抛异常。建议在关键环节加 try-catch把异常信息也记录到追踪里。5.2 追踪数据量过大导致性能下降全量追踪在高并发场景下确实会影响性能。我实测过一个中等规模的 RAG 服务开启全量追踪后 P99 延迟增加了约 15%。优化手段有这么几个。按需开启只对特定用户或特定类型的请求开启追踪。比如只追踪 VIP 用户的请求或者只追踪走了兜底逻辑的请求。异步上报LangSmith SDK 默认是异步上报的但如果你的服务本身就在高负载状态可以调整缓冲区大小和上报间隔。定期清理LangSmith 免费版有数据保留期限超期的数据会自动清理。如果用的是自部署版本需要自己配置清理策略。采样策略虽然社区版没有内置采样但可以在代码里用随机数控制比如 10% 的请求开启追踪。5.3 常见问题速查表问题现象可能原因排查方法解决方案平台上看不到 Trace环境变量未生效打印环境变量值检查加载顺序确保在 import 前设置Trace 只有根节点子调用未正确嵌套检查parent_run_id确保子函数在父函数内调用输入输出显示为空数据被隐藏检查hide_inputs配置调整隐藏策略或脱敏后上报耗时数据异常时钟不同步对比本地日志时间确保服务器时间同步Token 数不准模型不匹配检查模型名称配置使用平台支持的模型标识并行分支顺序混乱异步执行时序问题查看各分支开始时间用asyncio.gather明确并发控制5.4 几个容易踩的坑坑一在循环里调用被追踪的函数。如果在一个 for 循环里调用traceable装饰的函数每次调用都会生成一个独立的 Trace而不是嵌套在同一个 Trace 里。解决方案是把循环逻辑包在一个外层函数里外层函数加装饰器循环内的调用自然成为子 Span。坑二异常处理吞掉了追踪信息。用 try-except 捕获异常后如果直接pass或者只打印日志追踪记录里看不到异常信息。正确做法是在 except 块里用langsmith.Client手动记录错误或者让异常继续抛出由框架层捕获。坑三Prompt 模板变量未正确传递。LCEL 的追踪会记录 Prompt 渲染前后的内容但如果变量名拼写错误渲染结果会是空值追踪里看到的就是一个空 Prompt。建议在开发阶段加断言检查关键变量不为空。坑四多线程环境下的上下文丢失。LangSmith 用上下文变量传递 Trace ID多线程环境下如果没正确处理子线程的调用会丢失父 Trace 关联。解决方案是用contextvars显式传递或者改用异步编程模型。6. 从观测到优化的闭环思路追踪数据本身不产生价值基于数据做优化才产生价值。我通常按这个闭环来迭代先看 Trace 定位问题环节然后针对该环节做改动再用数据集评估改动效果最后把有效的改动固化下来。举个实际例子。之前有个 RAG 服务用户反馈“答非所问”的比例偏高。打开 LangSmith 看 Trace发现检索环节召回了不少文档但重排序后的 Top-1 得分普遍在 0.6 左右而正常情况应该在 0.8 以上。进一步看重排序的输入发现查询改写后的子查询和原始问题语义偏差较大。问题定位到查询改写环节调整了改写 Prompt 的约束条件后重排序得分提升到 0.75 以上用户反馈明显改善。这个过程中LangSmith 的价值在于把“答非所问”这个模糊的用户反馈快速定位到了具体的代码环节。没有追踪系统你可能要花几天时间逐个环节排查有了追踪系统半小时就能锁定问题。后续还可以把典型问题做成评估数据集每次改动后自动跑一遍对比检索命中率、答案准确率等指标。LangSmith 的 Dataset 和 Evaluation 功能就是干这个的把观测能力升级成持续优化的基础设施。我个人在实际操作中的体会是观测系统的价值不在于数据多全而在于能不能快速回答“问题出在哪”这个问题。LangSmith 的树状追踪和自动埋点把 RAG 链路的黑盒变成了白盒这是它最核心的价值。至于评估、对比这些进阶功能等基础观测跑顺了再逐步接入不要一上来就追求大而全。

相关新闻

开放式代码评审框架:从粒度控制到文化落地的完整实践指南

开放式代码评审框架:从粒度控制到文化落地的完整实践指南

1. 从“代码评审”这件事说起:为什么我们需要一个开放式的评审框架代码评审这件事,做过开发的人都不陌生。不管你是刚入行的新手,还是带了几年团队的老手,只要涉及到多人协作,代码评审就是绕不过去的一道坎。但现实情况…

2026/10/12 18:07:44 阅读更多 →
开放代码评审实战:从流程设计到工具链选型

开放代码评审实战:从流程设计到工具链选型

1. 从“代码评审”到“开放评审”:一个被低估的工程实践第一次看到“open-code-review”这个标题,我脑子里蹦出来的不是某个具体工具,而是一种工作方式的转变。过去几年里,我参与过不少团队的代码评审流程搭建,从最初几…

2026/10/12 18:07:44 阅读更多 →
Java面试必考:HashMap、HashTable与CurrentHashMap深度对比与选型指南

Java面试必考:HashMap、HashTable与CurrentHashMap深度对比与选型指南

1. 面试官为什么总爱问这三个Map的区别但凡你面过几家中高级Java岗位,就会发现一个规律:集合框架里的Map家族,几乎是绕不开的必考题。尤其是CurrentHashMap、HashMap、HashTable这三兄弟,面试官翻来覆去地问,候选人翻来…

2026/10/12 18:07:43 阅读更多 →

最新新闻

89C52单片机驱动旋转LED的POV显示原理与实战

89C52单片机驱动旋转LED的POV显示原理与实战

1. 项目概述:为什么旋转LED至今仍是单片机入门的“试金石”你有没有在科技展会、校园创新实验室,甚至某家咖啡馆的角落里,见过那种悬空漂浮、自带呼吸感的LED文字?它没有屏幕,却能清晰显示“HELLO”“2024”甚至简单动…

2026/10/12 19:29:10 阅读更多 →
AM5平台ECC支持真相:静默SEC-DED与固件门禁机制解析

AM5平台ECC支持真相:静默SEC-DED与固件门禁机制解析

1. 为什么AM5平台的ECC支持成了“薛定谔的猫”?在某实验室搭建一套用于长期数据校验的计算节点时,我遇到一个典型困境:手头有块华硕ROG STRIX X670E-E GAMING WIFI主板、一颗锐龙7 7800X3D处理器,以及几条标称支持ECC的DDR5内存。…

2026/10/12 19:29:10 阅读更多 →
DMA总读旧数据?CPU与Cache一致性问题的三种解决策略

DMA总读旧数据?CPU与Cache一致性问题的三种解决策略

做DMA相关开发久了,迟早会遇到这么个诡异的现象:代码明明先把新数据写到了缓冲区,DMA把数据搬出去,接收端拿到的却是上一批内容。反过来也一样,DMA搬进来一批数据,CPU读到的偏偏是改动前的旧值。我最近在某…

2026/10/12 19:29:10 阅读更多 →
smart-doc + showdoc:接口文档自动化生成与协作管理实战

smart-doc + showdoc:接口文档自动化生成与协作管理实战

1. 接口文档管理的痛点与方案选型但凡带过团队、跟过中大型项目的人,大概都经历过接口文档那点糟心事。后端改了一个字段类型,前端拿着三天前的文档联调,结果字段对不上,两边互相甩锅;测试同学照着文档写用例&#xff…

2026/10/12 19:29:09 阅读更多 →
基于机器学习的URL恶意性检测系统落地实践与踩坑指南

基于机器学习的URL恶意性检测系统落地实践与踩坑指南

简介:一套基于机器学习的URL恶意性检测系统,通过提取URL字符串自身特征并结合sklearn库构建分类模型,用于识别网络钓鱼、恶意软件下载等恶意链接,适合网络安全学习者、算法工程师及数据挖掘爱好者参考与二次开发。压缩包内共24个文…

2026/10/12 19:28:08 阅读更多 →
Naoqi库函数深度解析:Python控制Nao机器人的核心技巧与避坑指南

Naoqi库函数深度解析:Python控制Nao机器人的核心技巧与避坑指南

1. 为什么naoqi这层封装值得单独拿出来聊很多人第一次接触Nao机器人,注意力都放在动作编排和外观上,觉得会调几个挥手、走路、说话的接口就算入门了。真正上手做项目才会发现,naoqi这套库函数才是决定项目能不能跑稳的关键。它本质上是一组运…

2026/10/12 19:28:08 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →