从零搭建现代化AI实验室:技术栈、工具链与RAG实战指南
最近在技术圈里一个关于“旧金山AI新贵”和“千个新实验室”的讨论引起了我的注意。这背后反映的其实是全球范围内尤其是以旧金山湾区为代表的创新中心正在经历一场由生成式AI驱动的、前所未有的基础设施与人才需求变革。对于身处一线的开发者、技术决策者乃至学生而言理解这股浪潮背后的技术栈、工具链和落地模式远比关注新闻标题本身更有价值。本文将从一个务实的技术视角出发拆解一个现代化“AI实验室”或“AI创新团队”所需的核心技术要素、环境搭建、典型工作流以及工程化实践希望能为想要投身AI应用开发或构建内部AI能力的团队提供一份可落地的参考指南。1. 背景与核心概念什么是现代“AI实验室”传统意义上的“实验室”可能让人联想到装满昂贵硬件的房间。但在AI特别是大模型LLM时代“AI实验室”的概念已经发生了根本性的演变。它更多指的是一个高度协同、工具链完备、以快速实验和迭代为核心的技术单元。核心目标不再是单纯的基础研究而是快速将最新的AI模型能力尤其是大语言模型转化为可验证、可交付的应用原型或产品功能。这包括智能对话、内容生成、代码辅助、数据分析增强等场景。关键特征云原生与算力抽象重度依赖云GPU如AWS P3/G5实例、Google Cloud TPU、Azure NCv3系列和弹性算力池而非自建固定集群。通过Kubernetes等容器编排技术管理计算任务。模型即服务MaaS大量使用OpenAI API、Anthropic Claude API、Google Vertex AI等云端大模型服务以及开源模型的托管服务如Replicate, Hugging Face Inference Endpoints。实验室的核心工作从“训练大模型”转向“高效调用和编排模型”。数据与实验管理需要系统化的工具来管理提示词Prompt版本、模型参数、实验配置和评估结果。MLflow、Weights Biases (WB)、DVC等工具变得至关重要。敏捷开发流程融合了软件工程的最佳实践包括版本控制Git、CI/CD、自动化测试针对AI输出的测试以及基于容化的部署。对于开发者来说加入或构建这样一个“实验室”意味着需要掌握一套从底层基础设施到上层应用开发的完整技能栈。下面我们就从零开始搭建一个具备上述特征的微型“AI实验室”环境。2. 环境准备与版本说明我们的目标是搭建一个可用于原型开发和个人研究的标准化环境。我们将采用目前最主流、最易上手的工具组合。基础环境操作系统Ubuntu 22.04 LTS 或 macOS Monterey/Ventura本文以Ubuntu命令行示例为主macOS命令类似。包管理器pip(Python),conda可选用于环境隔离。容器运行时Docker 20.10 与 Docker Compose v2。这是实现环境可复现和云部署的关键。版本控制Git 2.34。核心软件与版本Python: 3.10 或 3.11。这是AI领域的事实标准语言。关键Python库openai1.0.0: 官方OpenAI Python SDK。langchain0.1.0: 用于构建基于LLM的应用程序的框架。chromadb0.4.0: 轻量级向量数据库用于实现检索增强生成RAG。fastapi0.104.0uvicorn: 用于快速构建模型服务API。pydantic2.0.0: 数据验证和设置管理。jupyterlab: 交互式实验笔记本。实验跟踪MLflow 2.0。我们将用它来记录Prompt、参数和结果。项目结构一个清晰的目录结构是工程化的开端。版本策略说明AI生态迭代极快本文示例代码基于上述主流稳定版本编写。在实际项目中请务必根据官方文档和团队技术栈确定版本并建议使用requirements.txt或pyproject.toml严格锁定依赖。3. 核心组件与工具链拆解一个高效的AI实验室工作流依赖于几个核心组件的协同。我们来逐一拆解其作用和选择理由。3.1 模型接入层直接API调用 vs. 本地部署云端API如OpenAI优点开箱即用免运维性能稳定持续获得模型更新如GPT-4 Turbo。缺点持续成本数据隐私考量需确认合规网络依赖。适用场景快速原型验证、产品核心功能、不具备GPU运维能力的团队。关键代码模式# 示例使用OpenAI Python SDK v1.0 from openai import OpenAI import os # 建议通过环境变量管理API Key client OpenAI(api_keyos.environ.get(OPENAI_API_KEY)) def chat_with_gpt(messages, modelgpt-3.5-turbo): try: response client.chat.completions.create( modelmodel, messagesmessages, temperature0.7, # 控制创造性 max_tokens500, ) return response.choices[0].message.content except Exception as e: return fAPI调用错误: {e} # 使用 messages [{role: user, content: 用Python写一个快速排序函数}] answer chat_with_gpt(messages) print(answer)本地/自托管开源模型如Llama 3, Qwen优点数据完全私有一次投入长期使用可深度定制。缺点需要强大的GPU资源如A100/H100技术栈复杂模型量化、推理优化性能调优门槛高。适用场景对数据隐私要求极高、有长期稳定且可控的预算、需要定制化模型微调。常用工具ollama本地运行大模型最简单的方式、vLLM高性能推理服务器、TransformersHugging Face库。建议对于大多数“新实验室”的启动阶段从云端API开始是最高效的选择。它可以让你在几天内就构建出可演示的原型快速验证想法。待业务逻辑跑通后再根据成本、性能和隐私需求评估是否引入开源模型。3.2 应用框架层LangChain与智能体Agent当你的应用逻辑超出一次简单的API调用时比如需要联网搜索、查数据库、执行代码就需要一个编排框架。LangChain是目前最流行的选择。它解决了什么将大模型与外部数据源、工具、记忆系统连接起来构建端到端的应用链Chain。核心概念LCELLangChain Expression Language声明式地组合链。Tools赋予模型操作外部世界的能力如搜索、计算、API调用。Agents由模型决定何时、使用何种Tools来完成任务。Retrieval与向量数据库结合实现基于自有知识的问答RAG。一个简单的Agent示例# 示例一个使用SerpAPI进行搜索的Agent from langchain.agents import AgentExecutor, create_react_agent from langchain.tools import Tool from langchain_community.utilities import SerpAPIWrapper from langchain_openai import ChatOpenAI from langchain import hub # 用于拉取预设的Prompt # 1. 初始化模型和工具 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) search SerpAPIWrapper() tools [ Tool( nameSearch, funcsearch.run, description当需要回答关于当前事件或具体事实的问题时使用。输入应该是一个搜索查询。 ), ] # 2. 获取一个预设的Agent Prompt prompt hub.pull(hwchase17/react-chat) # 3. 创建Agent agent create_react_agent(llm, tools, prompt) agent_executor AgentExecutor(agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue) # 4. 运行 result agent_executor.invoke({input: 旧金山最近有什么重要的AI技术会议, chat_history: []}) print(result[output])注意此示例需要配置SERPAPI_API_KEY环境变量。3.3 数据与实验管理MLflow跟踪实验的可复现性是AI研发的基石。MLflow的Tracking组件可以完美记录每次实验的输入Prompt、参数、输出和代码状态。# 示例使用MLflow跟踪一次Prompt调优实验 import mlflow import os # 设置MLflow跟踪服务器本地 os.environ[MLFLOW_TRACKING_URI] http://127.0.0.1:5000 mlflow.set_experiment(Prompt_Optimization_for_Email_Generation) # 模拟不同的Prompt模板和参数 prompt_templates [ 请写一封专业的工作邮件主题是{topic}, 以友好且清晰的风格起草一封关于{topic}的邮件。, ] topics [项目进度更新, 会议邀请] with mlflow.start_run(): for i, template in enumerate(prompt_templates): for topic in topics: # 记录参数 mlflow.log_param(ftemplate_{i}, template) mlflow.log_param(topic, topic) mlflow.log_param(temperature, 0.7) # 这里模拟调用LLM并获取结果 # simulated_response call_llm(template.format(topictopic)) simulated_response f这是使用模板{template}生成关于{topic}的邮件草稿。 # 记录输出和评估指标例如人工评分或自动评估分数 mlflow.log_text(simulated_response, fresponse_t{i}_{topic}.txt) # 假设有一个评分函数 score len(simulated_response) * 0.1 # 模拟评分 mlflow.log_metric(readability_score, score) print(实验已记录到MLflow。运行 mlflow ui 查看。)运行后在终端执行mlflow ui即可在浏览器http://127.0.0.1:5000查看所有实验的对比。4. 完整实战案例构建一个内部知识库智能问答系统RAG这是当前AI实验室最常见的落地场景之一。我们将构建一个最小可用的系统包含文档加载、向量化、存储和检索问答全流程。4.1 创建项目结构my_ai_lab/ ├── docker-compose.yml # 启动向量数据库等服务 ├── requirements.txt ├── .env.example # 环境变量模板 ├── app/ │ ├── main.py # FastAPI主应用 │ ├── core/ │ │ ├── config.py # 配置管理 │ │ └── chains.py # LangChain链定义 │ ├── services/ │ │ ├── ingest.py # 文档处理入库服务 │ │ └── query.py # 问答查询服务 │ └── models/ │ └── schemas.py # Pydantic数据模型 └── data/ # 存放原始文档 └── company_handbook.pdf4.2 使用Docker Compose启动基础设施创建docker-compose.yml一键启动ChromaDB向量数据库和MLflow服务器。# docker-compose.yml version: 3.8 services: chromadb: image: chromadb/chroma:latest container_name: chroma_db environment: - IS_PERSISTENTTRUE - PERSIST_DIRECTORY/chroma_data ports: - 8000:8000 volumes: - chroma_data:/chroma_data command: uvicorn chromadb.app:app --host 0.0.0.0 --port 8000 --workers 1 mlflow: image: ghcr.io/mlflow/mlflow:latest container_name: mlflow_tracking environment: - MLFLOW_TRACKING_URIhttp://127.0.0.1:5000 ports: - 5000:5000 volumes: - mlflow_artifacts:/mlflow command: mlflow server --backend-store-uri sqlite:///mlflow.db --default-artifact-root /mlflow --host 0.0.0.0 --port 5000 volumes: chroma_data: mlflow_artifacts:运行docker-compose up -d启动服务。4.3 编写核心代码1. 配置管理 (app/core/config.py)# app/core/config.py from pydantic_settings import BaseSettings from pydantic import Field class Settings(BaseSettings): openai_api_key: str Field(..., envOPENAI_API_KEY) chroma_host: str Field(localhost, envCHROMA_HOST) chroma_port: int Field(8000, envCHROMA_PORT) mlflow_tracking_uri: str Field(http://localhost:5000, envMLFLOW_TRACKING_URI) class Config: env_file .env settings Settings()2. 文档处理与入库 (app/services/ingest.py)# app/services/ingest.py import os from langchain_community.document_loaders import PyPDFLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_chroma import Chroma from app.core.config import settings def ingest_documents(pdf_path: str, collection_name: str company_handbook): 将PDF文档加载、分割并存入向量数据库 # 1. 加载文档 loader PyPDFLoader(pdf_path) documents loader.load() # 2. 分割文本 text_splitter RecursiveCharacterTextSplitter( chunk_size1000, chunk_overlap200, length_functionlen, is_separator_regexFalse, ) splits text_splitter.split_documents(documents) print(f已将文档分割为 {len(splits)} 个片段。) # 3. 创建向量存储 embeddings OpenAIEmbeddings(openai_api_keysettings.openai_api_key) chroma Chroma.from_documents( documentssplits, embeddingembeddings, collection_namecollection_name, persist_directoryNone, # 使用远程服务器 client_settingsChroma.Settings( chroma_server_hostsettings.chroma_host, chroma_server_http_portsettings.chroma_port, ), ) print(f文档已成功存入向量数据库集合{collection_name}) return chroma3. 构建问答链 (app/core/chains.py)# app/core/chains.py from langchain.chains import create_retrieval_chain from langchain.chains.combine_documents import create_stuff_documents_chain from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from langchain_chroma import Chroma from langchain_openai import OpenAIEmbeddings from app.core.config import settings def get_qa_chain(collection_name: str company_handbook): 创建并返回一个RAG问答链 # 1. 连接远程向量数据库 embeddings OpenAIEmbeddings(openai_api_keysettings.openai_api_key) vectorstore Chroma( collection_namecollection_name, embedding_functionembeddings, client_settingsChroma.Settings( chroma_server_hostsettings.chroma_host, chroma_server_http_portsettings.chroma_port, ), ) retriever vectorstore.as_retriever(search_kwargs{k: 3}) # 检索最相关的3个片段 # 2. 定义系统Prompt system_prompt ( 你是一个专业的公司知识库助手。请严格根据以下上下文信息回答问题。 如果上下文信息不足以回答问题请直接说‘根据现有知识库我无法回答这个问题’不要编造信息。\n\n 上下文{context} ) prompt ChatPromptTemplate.from_messages([ (system, system_prompt), (human, {input}), ]) # 3. 初始化LLM llm ChatOpenAI(modelgpt-3.5-turbo, temperature0, openai_api_keysettings.openai_api_key) # 4. 组合链文档组合链 检索链 question_answer_chain create_stuff_documents_chain(llm, prompt) rag_chain create_retrieval_chain(retriever, question_answer_chain) return rag_chain4. 主API服务 (app/main.py)# app/main.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from app.core.chains import get_qa_chain from app.services.ingest import ingest_documents import mlflow import os from app.core.config import settings app FastAPI(titleAI Lab 知识库问答API) mlflow.set_tracking_uri(settings.mlflow_tracking_uri) class QueryRequest(BaseModel): question: str collection_name: str company_handbook class IngestRequest(BaseModel): file_path: str collection_name: str company_handbook app.post(/ingest) async def ingest_docs(request: IngestRequest): 接收文档路径处理并存入向量数据库 if not os.path.exists(request.file_path): raise HTTPException(status_code404, detail文件不存在) try: ingest_documents(request.file_path, request.collection_name) return {message: f文档 {request.file_path} 已成功入库到集合 {request.collection_name}。} except Exception as e: raise HTTPException(status_code500, detailf文档处理失败: {str(e)}) app.post(/query) async def query_knowledge_base(request: QueryRequest): 提出问题返回基于知识库的答案 with mlflow.start_run(run_nameQA_Query) as run: # 记录输入 mlflow.log_param(question, request.question) mlflow.log_param(collection, request.collection_name) try: # 获取问答链并执行 qa_chain get_qa_chain(request.collection_name) result qa_chain.invoke({input: request.question}) answer result.get(answer, 未找到答案。) source_docs result.get(context, []) # 记录输出和来源 mlflow.log_text(answer, answer.txt) for i, doc in enumerate(source_docs): mlflow.log_text(doc.page_content, fsource_doc_{i}.txt) mlflow.log_metric(source_docs_count, len(source_docs)) return { question: request.question, answer: answer, source_documents_count: len(source_docs), } except Exception as e: mlflow.log_param(error, str(e)) raise HTTPException(status_code500, detailf查询过程出错: {str(e)}) app.get(/health) async def health_check(): return {status: healthy} if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8080)4.4 运行与验证安装依赖在项目根目录创建requirements.txt包含所有上述库然后运行pip install -r requirements.txt。配置环境变量复制.env.example为.env填入你的OPENAI_API_KEY。启动基础设施docker-compose up -d启动API服务cd app python main.py测试流程文档入库将PDF放入data/目录然后使用curl或Postman调用curl -X POST http://localhost:8080/ingest \ -H Content-Type: application/json \ -d {file_path: ../data/company_handbook.pdf}进行问答curl -X POST http://localhost:8080/query \ -H Content-Type: application/json \ -d {question: 公司的年假政策是怎样的}查看实验记录访问http://localhost:5000查看MLflow UI中记录的每次问答实验。5. 常见问题与排查思路在搭建和运行上述系统时你可能会遇到以下典型问题问题现象可能原因排查步骤与解决方案OpenAIError: Invalid API KeyAPI密钥错误或未设置。1. 检查.env文件中的OPENAI_API_KEY。2. 在终端执行echo $OPENAI_API_KEY确认环境变量已加载。3. 确保密钥有效且未过期。ConnectionError连接ChromaDB失败Docker服务未启动或网络配置问题。1. 运行docker-compose ps确认chroma_db容器状态为Up。2. 检查app/core/config.py中的chroma_host和chroma_port是否与docker-compose.yml映射一致。3. 尝试在容器内curl localhost:8000/api/v1/heartbeat测试连通性。问答结果与文档无关“幻觉”1. 文档分割不合理。2. 检索到的片段不相关。3. Prompt指令不够严格。1.调整分割尝试不同的chunk_size和chunk_overlap。2.优化检索调整search_kwargs{k: 3}中的k值或使用MMR搜索类型平衡相关性与多样性。3.强化Prompt在系统指令中明确要求“严格根据上下文”并加入“不知道就说不知道”的约束。处理长文档时内存不足默认的文本分割器一次性加载整个文档。使用支持流式或分页加载的Loader如PyPDFLoader本身是分页的但若PDF很大可考虑先提取大纲再分部分处理。对于超长文本文档可使用CharacterTextSplitter并配合文件流读取。MLflow UI中看不到实验跟踪服务器URI未正确设置或实验未记录。1. 确认MLFLOW_TRACKING_URI环境变量或代码中mlflow.set_tracking_uri()设置正确。2. 检查主程序是否在with mlflow.start_run():块内执行日志记录。3. 查看MLflow容器日志docker logs mlflow_tracking。LangChain版本兼容性报错LangChain版本迭代快API常有变动。1. 锁定requirements.txt中的具体版本号如langchain0.1.0。2. 遇到ImportError或AttributeError时第一时间查阅对应版本的官方文档或迁移指南。3. 考虑使用langchain-community等子包来导入特定组件。6. 最佳实践与工程建议将原型推进为可维护、可扩展的生产级应用需要遵循以下工程实践配置与密钥管理绝对不要将API密钥等敏感信息硬编码在代码中。使用.env文件配合pydantic-settings或python-dotenv管理。在生产环境中使用云服务商提供的密钥管理服务如AWS Secrets Manager, GCP Secret Manager。错误处理与重试对所有外部服务调用OpenAI API、向量数据库进行完善的异常捕获和重试。使用tenacity或backoff库实现指数退避重试。from tenacity import retry, stop_after_attempt, wait_exponential retry(stopstop_after_attempt(3), waitwait_exponential(multiplier1, min4, max10)) def call_llm_with_retry(prompt): # 调用LLM的代码 pass性能与成本优化缓存对频繁的相同或相似查询结果进行缓存减少API调用。可以使用langchain.cache如SQLiteCache,RedisCache。异步对于I/O密集型操作如批量文档处理、并发用户查询使用asyncio和异步客户端如openai.AsyncOpenAI提升吞吐量。Token管理监控API的Token使用量设置预算警报。对输入文本进行必要的清洗和截断。可观测性与监控除了MLflow跟踪实验还需集成应用性能监控APM工具如OpenTelemetry来追踪请求延迟、错误率。记录所有用户查询和模型响应注意隐私脱敏用于后续分析和模型迭代。为关键业务指标如回答准确率、用户满意度设置监控看板。安全与合规输入输出过滤对用户输入进行严格的检查和过滤防止Prompt注入攻击。对模型输出进行内容安全审查。数据隐私如果使用云端API务必了解服务提供商的数据处理政策。对敏感数据考虑在发送前进行脱敏或使用本地模型。权限控制在API网关或应用层实现基于角色的访问控制RBAC确保只有授权用户能访问特定知识库或模型。代码与项目结构遵循清晰的模块化设计如本案例中的core/,services/,models/分离。编写单元测试和集成测试特别是针对Prompt模板、检索逻辑和链的组合。使用代码格式化工具black,isort和 lint 工具ruff,pylint保持代码质量。构建一个现代化的“AI实验室”技术选型只是第一步。真正的挑战在于如何将快速发展的AI能力通过稳健的软件工程实践安全、可靠、高效地集成到业务流中。从一个小而美的原型开始逐步完善其架构、监控和治理是应对这场AI浪潮最务实的策略。希望这份从环境搭建到实战落地的指南能为你启动自己的AI项目提供扎实的起点。

相关新闻

宏智树 AI|跳出模板化写作,解锁期刊论文完整创作链路

宏智树 AI|跳出模板化写作,解锁期刊论文完整创作链路

不少准备刊发文章的同学、科研从业者都会陷入相同困境:耗费数月构思研究,落笔却无从搭建框架;文献综述只会堆砌文献,难以梳理研究脉络;初稿完成后反复调整格式、修改语句,大量精力消耗在机械性工作上。期刊…

2026/10/27 6:48:06 阅读更多 →
高精度问题

高精度问题

高精度问题 一、基本了解 C 中普通整数能存多大的数? int:大约 9e9long long:大约 9e18 看着很大对不对? 但是!竞赛、算法题里经常出现这种数据: 输入一个 100 位、200 位、1000 位的超大整数,…

2026/10/25 13:23:49 阅读更多 →
远程工作台巡检:把证书、磁盘和备份交给脚本

远程工作台巡检:把证书、磁盘和备份交给脚本

远程工作台巡检:把证书、磁盘和备份交给脚本 工作台与小服务的巡检可以安静运行:检查证书、磁盘、备份和关键接口,只在需要处理时提醒。自动修复应限于可逆动作,并保留执行记录。 远程开发者日常巡检防线的四大常见陷阱 对于自由度…

2026/10/25 21:49:45 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/26 12:00:21 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/26 4:52:12 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/26 12:00:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 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/26 12:00:19 阅读更多 →
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/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练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/26 8:34:37 阅读更多 →