新闻详情

新闻详情

首页 / 资讯中心 / 详情

DeepSeek Harness实战:从API对接、Agent搭建到RAG知识库落地

发布时间:2026/9/16 3:09:52来源:尧图网络
DeepSeek Harness实战:从API对接、Agent搭建到RAG知识库落地
最近好几个朋友跑来问我同一个问题DeepSeek Harness 到底是个什么系统它和直接用 DeepSeek API 有什么区别老实说我第一次看到这个名字也琢磨了一会儿。很多人把 Harness 理解成聊天客户端其实完全跑偏了。如果你只是想跟模型聊聊天官方网页就够用但如果你想做的正经一点比如把大模型接进自己的业务系统、让模型去调用工具、按固定流程输出内容、再把自己的文档喂进去变成一个能答问题的知识库那 DeepSeek Harness 的价值就完全不一样了。这篇实战记录我按自己踩坑之后的经验把 DeepSeek Harness 从零开始的完整链路重新走一遍环境准备、API 对接配置、Agents 智能体搭建、工作流开发、RAG 知识库落地每一段都会给出能直接参考的配置、代码和排错思路。适合刚接触大模型开发的新手也适合想把手头项目快速接上模型能力的独立开发者。话不多说直接开始。1. 先搞清楚 DeepSeek Harness 到底是个什么系统1.1 它不是一个聊天客户端而是一套大模型应用开发底座Harness 这个词在软件工程里本来就有脚手架、控制框架的意思DeepSeek Harness 走的正是这个方向。它不是给你一个对话框去聊天而是把大模型应用开发里的公共部分抽出来做成一套可以本地运行、也可以部署到服务器的开发底座。我们日常调 API 写业务代码时密钥管理、模型路由、上下文组装、工具调用协议、向量数据库对接这些事每个项目都要重复做一遍。Harness 把这些事情集中处理你在上面专注于业务逻辑本身。用个生活化的类比裸调 API 相当于把电灯直接接到电线上能亮但非常脆弱稍微有点波动就跳闸Harness 则是一套配电箱断路器、开关、仪表盘都是现成的你只需要规划好哪条线接到哪里。遇到模型服务异常它能重试、能降级、能记录日志新增一个模型服务改配置不用改代码要接入知识库不用自己从头搭向量检索链路。1.2 四个核心模块拆解连接层、Agent、工作流、RAG以我实际使用的感受来看DeepSeek Harness 可以拆成四个核心模块这四个模块正好对应这篇文章的四个重点。第一个是 API 连接层。它统一管理各个模型服务的 Base URL、API Key、模型名称、限流和重试策略。你在业务代码里不需要到处硬编码密钥统一走 Harness 的连接管理。第二个是 Agent 运行时。它处理工具注册、函数调用Function Calling、多轮对话状态和终止条件。你要搭智能体核心就是跟这一层打交道。第三个是工作流引擎。它把调用模型执行脚本检索文档请求外部接口这些动作编排成固定流水线支持条件分支、循环和异常重试。适合那些流程固定、要求每次输出结构一致的场景。第四个是 RAG 组件。它负责文档解析、文本切块、向量化、索引建库、检索重排序是知识库问答功能的底座。我用一张表对比裸调 API 和用 Harness 的区别这样更直观对比维度裸调 DeepSeek API使用 DeepSeek Harness密钥与连接管理每个项目单独管理易泄露统一配置支持环境变量注入工具调用自己维护协议和请求格式内置 Function Calling 框架多步骤流程自己写状态机容易乱配置化编排支持分支和重试知识库检索自己对接向量库和切块逻辑内置 RAG 链路直接可用可观测性基本没有日志有调用追踪和日志面板1.3 适合谁用、能避开什么坑结合我接触到的实际场景Harness 最适合三类人。第一类是刚开始学大模型开发的学生或者转行的人。直接去啃模型论文和框架源码很容易劝退但先用 Harness 把 Agent、RAG、工作流这些概念跑通心里有了整体画面之后再回头补基础效率会高很多。第二类是独立开发者。一个人要快速做出 MVP最怕把时间浪费在搭环境、写胶水代码上。我见过不少人花两周搭了一套前后端结果核心功能还没动。用 Harness 把通用能力抽出来一周做出一个带知识库的问答 Agent是完全可以实现的。第三类是需要在公司做真实业务落地的研发。统一配置、统一日志、可插拔组件意味着多个项目能共用一套基础设施。以前最头疼的模型换了代码全要改的问题也能解决因为模型层被 Harness 封装了底层从 DeepSeek 切到别的兼容模型只需要改配置。2. 环境准备与 API 对接配置这是第一个真正的门槛2.1 基础环境与安装Python 版本、虚拟环境、Harness 安装我习惯用 Python 3.10 以上的版本太老的版本在一些异步特性和类型标注上会有问题。强烈建议先创建一个干净的虚拟环境不要直接用系统的 Python 环境不然装包的时候各种依赖冲突会让你怀疑人生。创建虚拟环境命令行操作如下python -m venv harness_env source harness_env/bin/activate # Windows 下用 harness_env\Scripts\activate然后安装 DeepSeek Harnesspip install deepseek-harness装完之后命令行里会多一个harness命令这就是我们接下来要用的主要入口。安装过程如果遇到依赖编译报错大概率是网络源的问题可以把 pip 源切换到国内镜像再试。安装完成后可以先执行harness --version确认版本号正常输出。2.2 获取 DeepSeek API Key 的正确姿势API 对接的第一步是拿到密钥。去 DeepSeek 开放平台注册账号然后在控制台创建 API Key。这里有两个容易踩的坑第一API Key 创建后只在页面上完整显示一次一定要立刻复制保存到本地第二不要把 Key 写死在代码仓库里否则一旦仓库泄露密钥就废了。我习惯把密钥放在项目根目录的.env文件里并在.gitignore中加入.env。内容大概是这样的DEEPSEEK_API_KEYsk-在这里填你的key BASE_URLhttps://api.deepseek.comHarness 启动时会自动读取这个文件。如果你是在服务器上部署可以用环境变量的方式注入原理一样只是入口不同。密钥的权限管理也要注意最好按最小权限原则创建专用密钥不要一个 Key 到处用。2.3 在 Harness 中配置模型服务并验证连通性Harness 安装完成后第一次启动会生成一个配置文件一般放在用户目录下的.deepseek-harness/config.yaml。我们需要配置 Provider 信息包括模型服务地址、模型名称和 API Key 的引用方式。一个最简配置长这样llm: default_provider: deepseek providers: deepseek: base_url: https://api.deepseek.com api_key: ${DEEPSEEK_API_KEY} models: - name: deepseek-chat role: chat - name: deepseek-reasoner role: reasoner配置完成后可以用 Harness 自带的诊断命令验证环境harness doctor这个命令会依次检查配置文件格式、密钥是否能读取、网络到模型服务是否通、依赖组件是否齐全。如果你的环境正常会输出绿色的 OK如果哪一项出了问题它会直接提示你具体是哪一步失败。我第一次跑的时候就因为.env文件位置放错导致密钥读取失败医生命令直接指出来了省了很多排查时间。2.4 三个层面的首次调用HTTP、SDK、Harness Chat配置好之后我建议新手分别用三个层面各调一次接口这样你能彻底搞清楚每次调用背后发生了什么。第一层直接用 HTTP 调用 DeepSeek 的接口看看最原始的请求和返回是什么样curl https://api.deepseek.com/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer $DEEPSEEK_API_KEY \ -d { model: deepseek-chat, messages: [{role: user, content: 你好请简单介绍一下你自己}] }第二层用 OpenAI 兼容 SDK 调用。DeepSeek 的接口是兼容 OpenAI 协议格式的所以可以直接复用现有生态from openai import OpenAI client OpenAI( api_keysk-在这里填你的key, base_urlhttps://api.deepseek.com ) resp client.chat.completions.create( modeldeepseek-chat, messages[{role: user, content: 用一句话解释什么是大模型}] ) print(resp.choices[0].message.content) print(token 消耗:, resp.usage)第三层通过 Harness 的会话接口调用。这一步你会发现前面配置的 Provider 已经自动生效了from harness import Harness h Harness.from_config(~/.deepseek-harness/config.yaml) resp h.chat(deepseek, 请用一句话总结 API 对接的核心步骤) print(resp.text)做完这三层调用你的 API 对接就算真正跑通了。我建议每次跑之前想一下这一层多做了什么事HTTP 是裸请求SDK 帮你做了协议封装Harness 则把模型路由和密钥管理也接管了。想清楚这些后面遇到问题定位会很快。3. Agents 智能体搭建让模型学会使用工具3.1 Agent 的本质模型 工具 循环很多人一听到 Agent 就觉得很高深其实用一句话就能说清楚Agent 就是让大模型在具备工具的情况下通过思考-行动-观察的循环来完成一个目标。模型本身只会输出文字但当你给它几个可调用的工具比如计算器、天气查询接口、数据库查询器它就能自己判断什么时候该用哪个工具然后用返回的结果继续推理直到任务完成。打个比方Agent 像一个只会说话不会动手的实习生你给他配上电脑、计算器和订餐 App他通过想一步、做一步、看结果的方式最终也能把活干完。大模型应用里最常说的智能体本质上就是这么个机制DeepSeek Harness 的 Agent 运行时替你管理了循环控制这部分你只需要提供工具列表和任务目标。3.2 Function Calling 机制与工具 Schema 编写Function Calling也叫工具调用或者函数调用是 Agent 能动手的关键机制。流程是这样的你把工具用 JSON Schema 的格式描述出来放到请求里一起发给模型模型在需要的时候会返回一个结构化的调用请求而不是直接执行真正执行工具的是你的程序执行完再把结果返回给模型让它继续思考。工具描述写得好不好直接决定 Agent 能不能正确调用。我见过太多人在这上面翻车一个常见的反例是这样{ name: get_weather, description: 查询天气, parameters: { type: object, properties: { city: {type: string, description: 城市} }, required: [city] } }这个描述会不会出错不一定但模型很可能不确定参数格式。正确写法是尽量把描述写具体让模型知道传入什么{ name: get_weather, description: 查询指定城市的当前天气情况城市名称需要是中国标准城市名例如北京、上海、深圳, parameters: { type: object, properties: { city: { type: string, description: 城市中文名称如北京 } }, required: [city], additionalProperties: false } }关键点是工具名称要动词开头且语义清晰description 要写清什么时候该用这个工具和参数应该填什么参数约束能写死就写死。这样能明显减少模型乱传参的问题。3.3 实操搭建一个会计算和查天气的工具型 Agent下面我在 Harness 里注册两个工具一个是本地计算器一个是天气查询接口然后让 Agent 完成一个需要两步推理的任务。先定义两个工具函数def calculate(expression: str) - str: 执行简单的数学计算返回结果字符串 try: return str(eval(expression, {__builtins__: {}}, {})) except Exception as e: return f计算失败{e} def get_weather(city: str) - str: 模拟天气接口实际项目中替换为真实 API 调用 weather_data {北京: 晴30度, 上海: 多云28度} return weather_data.get(city, 暂无数据)然后在 Harness 里创建 Agent注册这两个工具from harness import Agent agent Agent( nameassistant, modeldeepseek-chat, tools[calculate, get_weather], system_prompt你是一个助手需要使用工具时请按工具描述准确传参。, max_iterations5 ) result agent.run(北京今天30度明天比今天冷5度那明天是多少度请计算出来) print(result)这个任务看起来简单实际执行链路是模型先识别出需要天气数据于是触发 get_weather 工具请求执行完拿到北京 晴30度然后它发现题目里提到降温 5 度于是触发 calculate 工具计算 30 减 5最后把 25 度组织成自然语言输出。这一步里面蕴含了两轮工具调用和一次结果汇总如果没有 Function Calling 机制你只能自己在代码里写死逻辑那就失去了智能体的意义。3.4 防止 Agent 失控的四个关键配置Agent 好用但也很容易跑飞。我在真实项目里见过不少事故比如 Agent 陷入无限循环、反复调用同一个工具、把参数传错导致外部系统数据异常。要控制风险下面这几个配置在 Harness 里一定要设置。max_iterations最大迭代次数是最重要的一个。没有上限的话Agent 可能一直思考下去token 费用哗哗地涨。我一般设置为 5 到 8简单任务 3 就够了。工具白名单也要收窄。每个工具只暴露最少的参数能用字符串参数就不用复杂对象。我有一次给 Agent 接了数据库查询工具参数没限制好Agent 差点执行了一条全表删除语句从那以后我就坚持工具内部做参数校验和操作确认。超时和上下文长度也要管住。单个工具调用超过 10 秒就终止对话轮数过多就触发自动总结压缩。Agent 的消息列表会越来越长不控制的话很快就把上下文窗口撑爆。最后是日志观察。Harness 的 Agent 运行时会把每一步的推理、工具调用、返回结果都记录到日志里建议把日志等级打开。调试的时候你能看到模型每一轮在想什么、调了什么参数排查问题效率会高很多。4. 工作流开发把固定流程变成可靠流水线4.1 工作流和 Agent 的边界怎么划很多人分不清 Agent 和工作流的区别其实边界很简单Agent 适合目标明确但步骤不固定的开放式任务工作流适合步骤固定、输出格式要求严格的流程化任务。换句话说Agent 是一个自由职业者你只告诉他目标他自由发挥工作流是一条流水线每个工位干固定的活顺序不能乱。我在实际项目里的经验是能不用 Agent 就不用 Agent流程固定就上工作流。为什么Agent 每次输出都有随机性你很难保证它每次都走同一条路径而工作流的每个节点都是确定的输出结构可控出了问题也好定位。真正开工前先问自己一句这个任务到底需要模型自主决策还是只需要按固定顺序调用模型和工具想清楚这个你的架构就清晰了一大半。4.2 实操编排一条数据采集 → 分析 → 报告生成流水线下面我用一个实际案例说明工作流怎么编排。需求是每天自动从一份销售数据文件里提取关键指标然后生成一段分析摘要最后写入日报文档。先看 Harness 的工作流配置文件workflow: name: daily_sales_report nodes: - id: read_data type: filesystem action: read path: /data/sales.csv - id: extract_metrics type: llm model: deepseek-chat prompt: | 从下面的销售数据中提取关键指标总销售额、订单数、环比变化。 数据内容 {{read_data.output}} output_var: metrics - id: analyze_trend type: llm model: deepseek-reasoner prompt: | 基于这些指标做简要分析指出异常点 {{extract_metrics.output}} output_var: analysis - id: write_report type: filesystem action: append path: /reports/daily.md content: | ## 每日销售分析 {{extract_metrics.output}} {{analyze_trend.output}}这个工作流里有四个节点读取文件、提取指标、分析趋势、写报告。你会发现每个节点的输入输出都是显式声明的数据流向一目了然。节点之间通过{{node_id.output}}这种模板语法传递数据不用写一行胶水代码。在 Harness 里启动工作流harness workflow run --config daily_sales_report.yaml运行完之后去日志面板看每个节点的输入输出和耗时就能清楚知道时间花在哪里。这一步就是工作流相对 Agent 最大的优势可观测、可重跑、可定位。4.3 工作流调试单节点跑通再串全链路工作流一长排错就会变麻烦。我总结了一个笨但有效的方法先让单个节点单独跑通再串联全链路。在 Harness 中可以用单节点模式执行harness workflow run --config daily_sales_report.yaml --node extract_metrics这个命令会只执行 extract_metrics 节点输入数据需要你手动指定。跑通之后确认输出格式符合预期再逐步增加后续节点。每次加一个节点跑一次观察输出。这样出了问题你几乎不用猜就知道是哪个节点的事。这里再提醒一个很多新手容易犯的错误LLM 节点的输出是自然语言文本不是结构化对象。如果你想在下游节点里按字段读取最好在 prompt 里明确要求输出 JSON并在 JSON 前后加上固定标记方便解析。工作流节点之间的数据传递最好是标准格式否则后面各种解析错误会让你怀疑人生。5. RAG 知识库落地让大模型学会查资料再回答5.1 RAG 的原理与价值RAG 的全称是 Retrieval-Augmented Generation翻译过来就是检索增强生成。核心思路很简单不直接让模型回答而是先从你的知识库里检索出与问题最相关的内容把这些内容塞进提示词再让模型基于检索到的内容来回答。为什么要做这一步两个原因。第一大模型的知识有截止日期训练完就固定在参数里了你的私有文档、最新数据它根本不知道第二直接让模型回答它不了解的问题它容易一本正经地胡说八道。RAG 相当于给模型配了一个考前小抄它不用背下来考试时翻一翻就能答对。所以 RAG 不是可选项而是知识密集型业务落地的刚需。5.2 文档处理解析、切块、向量化RAG 链路的第一步是把文档处理成模型能检索的形式。分三步走解析、切块、向量化。文档解析要把 PDF、Word、Markdown、HTML 这些格式转成纯文本。要注意 PDF 里的表格和扫描件解析出来经常是乱的所以我在实际项目里会优先要求业务方提供 Markdown 或者 Word 源文件。切块是 RAG 效果的关键。整个文档塞进上下文肯定不现实所以要切成小块。切块参数怎么定我一般从 chunk_size512 字符、chunk_overlap50 起步。overlap 的作用是避免一段完整语义被从中间切断让前一块的尾部信息和后一块的头部信息有重叠。对于代码文档或条款性文档我建议按标题结构切块先按 Markdown 标题分段再处理过长的段落。这个参数没有标准答案需要结合你的文档类型调试。向量化是把文本变成高维向量这样就能计算相似度。Harness 内置了嵌入模型接入方式也支持外接本地或远端的 Embedding 服务。向量维度不用太纠结模型选好了维度就定了。5.3 检索质量优化混合检索、重排、Top-K向量检索不是万能的。纯向量检索对语义相似有效但如果你搜订单号 A12345向量检索的效果反而不如传统的关键词精确匹配。所以我的建议是上混合检索同时跑向量检索和关键词检索BM25 或倒排索引再把两路结果合并。合并之后还有一个关键操作叫重排序Rerank。检索出来的候选结果可能有几十条但真正相关的可能只有三五条。重排序模型会基于问题和候选文档的相关性重新打分把最相关的排到前面。Top-K最终取几条进入上下文我一般设 3 到 5多了会稀释模型的注意力也浪费 token。在 Harness 的 RAG 配置里这些参数都可以直接设置。5.4 案例从零搭建一个产品手册问答知识库最后用一个完整案例串一遍 RAG 落地。假设你手上有一堆产品手册想做一个能回答这个功能在哪里打开这个报错怎么处理这类问题的问答系统。先在 Harness 中创建一个知识库并导入文档harness rag create --name product_manual harness rag import --name product_manual --path ./docs导入时 Harness 会自动做解析、切块和向量化。导入完成后可以在 Harness 的可视化界面里查看切块数量检查文档是否被正确拆分。然后是问答调用在 Python 里编写from harness import Harness h Harness.from_config(~/.deepseek-harness/config.yaml) answer h.rag_chat( knowledge_baseproduct_manual, question导出报表功能在哪个菜单下面, top_k3, rerankTrue ) print(answer.text) print(参考来源:, answer.sources)第一次跑完你需要问自己几个问题回答得准不准检索到的片段是不是相关如果答案不对去检查是检索环节的问题还是生成环节的问题。检索环节的问题就调切块参数和 top_k生成环节的问题就改 Prompt 模板让模型严格基于检索内容回答不许编造。这里我强调一个经验RAG 的效果提升很多问题出在没检索到而不是模型不会答。做知识库问答前期 80% 的力气要花在文档清洗和切块调优上不要一上来就怪模型。文档本身质量差再好的 RAG 链路也白搭。6. 常见问题与排查技巧实录6.1 那些高频报错到底在说什么附速查表跑大模型开发报错是家常便饭。我把这段时间遇到的高频问题整理成了速查表方便你对照排查报错信息常见原因处理方式api error: 400 invalid schema for function artifact工具函数的 JSON Schema 中正则或约束写法不合法简化 parameters 里的 pattern复杂校验移到代码内部做去掉模型端不支持的正则语法比如某些 Unicode 属性转义写法failed to connect to the docker api at npipe:////./pipe/dockerdesktoplinuxen容器化部署时 Docker Desktop 未启动或引擎未就绪启动 Docker Desktop确认处于 Linux 容器模式必要时重启引擎context length exceeded上下文超过模型窗口上限截断早期对话、压缩中间步骤、减小 top_k 或 chunk_sizerate limit exceeded触发接口限流检查是否并发过高开启 Harness 的重试降级策略tool call timeout工具执行超时优化工具逻辑配置更长超时或者精简 Agent 的工具链其中 400 invalid schema 这个报错我特别想多说一句。JSON Schema 在模型接口里是用来约束参数的很多人喜欢在 pattern 里写复杂的正则结果模型端解析不了直接报错。我的建议是Schema 里只做最基础的字段类型校验复杂的业务校验放在真正执行工具的函数内部。这样既避免报错也能更好地兜底异常输入。6.2 排查问题的基础方法论日志、隔离、最小复现最后聊一套通用的排查方法论不管你是调 API、搭 Agent 还是改 RAG这套方法都适用。第一先看日志不要靠猜。Harness 的日志会把每个步骤都记录下来比如模型请求的输入输出、工具调用的参数和结果、RAG 检索的命中片段。我之前遇到过一个问题Agent 回答总是不对我猜了半天是不是 Prompt 写得不好结果一看日志发现是工具返回的数据格式和 Prompt 里描述的完全不一样。要是早看日志能省一个下午。第二做隔离实验。问题出现时先判断是哪个环节出的问题。Agent 回答错误先单独测工具本身是否正常再单独测模型对工具描述的解析能力最后测完整的 Agent 链路。RAG 回答错误先单独看检索结果是否相关再单独看生成 Prompt 是否合理。逐层隔离问题瞬间缩小范围。第三构造最小复现。把一个复杂任务简化成最小可复现的样例。比如 Agent 报错你把它干的事情简化到只有一次工具调用看是否还能复现。能复现问题就好定位了不能复现再逐步增加复杂度加到哪里出错问题就在哪里。这三板斧说起来简单但在真实项目里特别管用。我自己在排查Agent 偶尔会漏掉关键步骤这个问题时就是靠最小复现一步步定位到系统提示词里漏了一条约束补上之后问题彻底解决。遇到问题先不要慌按这套方法来绝大多数问题都能解决。最后再分享一个个人心得学大模型开发千万不要只看文档不实操。API 对接、Agent、工作流、RAG 这些概念光看文章永远隔着一层只有真正自己搭一遍、踩一遍坑、把报错一个个解决掉这些东西才会变成你自己的能力。DeepSeek Harness 这一类工具的出现本质上就是想把门槛降下来让更多人能把精力花在业务创新上而不是无穷无尽的基础设施工程里。希望这篇记录能帮你少走一些弯路。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

风光储微电网下垂控制仿真:一次调频与并离网切换模型搭建详解 2026/9/16 3:57:55

风光储微电网下垂控制仿真:一次调频与并离网切换模型搭建详解

做微电网仿真最耗时间的,不是把光伏、风电、储能三个单元各自搭出来,而是让这三个单元在同一个系统里听同一个“指挥”——基于下垂控制策略的风光储微电网协调仿真控制,是我最近完整跑通的一套模型,带一次调频和并离网切换。这套…

阅读更多 →
ZeroClaw执行模型:具身智能的硬实时调度与安全执行机制 2026/9/16 3:57:55

ZeroClaw执行模型:具身智能的硬实时调度与安全执行机制

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

阅读更多 →
贝叶斯平滑在点击率预估与推荐系统冷启动中的应用 2026/9/16 3:57:55

贝叶斯平滑在点击率预估与推荐系统冷启动中的应用

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

阅读更多 →
窗函数法设计FIR滤波器:原理、选型与工程避坑指南 2026/9/16 3:57:55

窗函数法设计FIR滤波器:原理、选型与工程避坑指南

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

阅读更多 →
暗通道去雾算法详解:基于OpenCV和Python的图像去雾实践 2026/9/16 3:57:55

暗通道去雾算法详解:基于OpenCV和Python的图像去雾实践

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

阅读更多 →
点餐外卖小程序前后端源码部署指南:从解压到上线运营 2026/9/16 3:54:55

点餐外卖小程序前后端源码部署指南:从解压到上线运营

简介:这是一套面向餐饮行业与微信小程序开发者的点餐外卖餐饮小程序前后端源码,采用微信小程序作为用户端、PHP 作为服务端,完整覆盖从首页推荐、菜单浏览、购物车结算、微信支付到订单管理与用户中心的全流程。适合需要快速搭建在线点餐系统…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞