最近后台收到特别多留言几乎都是同一个问题我想学大模型到底从哪儿开始 市面上不缺教程缺的是真正能跑通全流程的路线。短视频讲不清楚什么是注意力机制长篇文章又动不动甩给你几十页论文中间最关键的部分——从注册账号、调用API、写提示词到本地部署、微调反而没人系统讲。所以我干脆以 DeepSeek 为主线把一条从入门到精通的完整学习路径整理出来。这篇文章不只讲概念会直接给你能跑的代码、能用的参数表、常见坑的排查思路。看完你可以照着做不必再满天搜教程。1. 先搞清楚你学的到底是什么大模型基础概念与DeepSeek定位1.1 大模型不是搜索引擎也不是数据库很多人第一次用 ChatGPT 类产品时会下意识把它当搜索引擎用发现它胡说八道后又反过来觉得这工具不靠谱。实际上大模型的工作方式和搜索引擎完全不同。大模型LLM, Large Language Model本质上是下一个词预测器你给它一段文本它通过内部参数计算逐个预测后面最可能出现的词。训练阶段它从海量文本里统计词与词之间的模式推理阶段它把这些模式组合成看起来流畅的回答。你可以把它理解成一个被压缩了人类文本模式的黑盒子——它没有查资料的能力只有生成文本的本领。这一点决定了使用它的姿势你不是问它要答案而是给它任务和素材让它生成结果。想让它答得好就要明确任务、给足上下文、说清输出格式。这也解释了为什么提示词工程Prompt Engineering会成为一个值得专门学的技能——模型的能力上限由训练决定但你能榨出多少能力取决于你怎么和它沟通。1.2 DeepSeek有哪些模型可以用DeepSeek 官方对外开放的主要是两大 API 模型搞清楚它们的区别是学习路线的第一站。deepseek-chat 走的是通用对话路线底层对应 DeepSeek-V3 系列日常写作、翻译、代码补全、信息整理这些任务用它响应速度快性价比高。deepseek-reasoner 走的是推理增强路线底层是 DeepSeek-R1 系列它在给出最终答案前会进行一段思维链式的内部推理适合数学证明、逻辑分析、复杂代码调试这类需要推理的任务。用表格对比更直接对比维度deepseek-chatdeepseek-reasoner底层模型DeepSeek-V3系列DeepSeek-R1系列擅长任务对话、写作、翻译、代码生成数学推理、逻辑分析、复杂问题拆解内部推理链不展示先推理再回答响应速度快相对慢适用场景日常应用开发需要想清楚再答的任务另外 DeepSeek-R1 也以开源形式发布了多个参数规模的权重从 1.5B 到 671B这部分放到第 5 章本地部署时详细讲。初学者第一次接触先用官方 API 跑通逻辑想深入底层、想研究微调的朋友再考虑开源权重和本地部署。1.3 为什么新手首推DeepSeek大模型领域不缺选择市面上还有 Qwen、Llama、Mistral、Gemini、Claude 等多家模型家族。但作为学习起点DeepSeek 有几个难得的优势第一是 API 兼容性极好。它的接口设计兼容 OpenAI 的消息格式你用 openai 这个开源SDK只改一行 base_url 就能把请求发到 DeepSeek这大大降低了学习成本。你学到的交互范式换其他模型也能快速迁移。第二是价格亲民适合拿来刷实验练手。第三是开源生态完整从论文、权重、部署工具到微调框架都有现成的资料想深入随时能找到对应材料。第四是中文能力强做中文场景的应用几乎不用额外调教。总结一句话它既是学了马上能用的工具又是想深挖随时有料的研究对象做入门主线非常合适。2. 动手第一课注册、拿到API Key并用代码跑通第一次对话2.1 准备工作与密钥管理先注册一个 DeepSeek 开放平台的账号然后进入控制台的API Keys页面创建密钥。创建之后立刻复制保存密钥只显示一次丢失就得重新生成。这里有个新手最容易踩的坑把 API Key 直接硬编码在代码里然后随手把代码传到公开仓库密钥被爬虫抓走后被人盗刷。正确做法是用环境变量管理。在 Linux 或 macOS 终端里写export DEEPSEEK_API_KEY你的密钥Windows PowerShell 写$env:DEEPSEEK_API_KEY你的密钥然后代码里从环境变量读取不出现明文密钥。项目里再配合 .gitignore 把 .env 文件排除掉基本就不会出大问题。2.2 最小可用代码用Python跑通第一次对话先装好必要依赖这里用官方推荐的 OpenAI SDK 兼容方式pip install openai然后编写代码import os from openai import OpenAI client OpenAI( api_keyos.environ.get(DEEPSEEK_API_KEY), base_urlhttps://api.deepseek.com ) resp client.chat.completions.create( modeldeepseek-chat, messages[ {role: system, content: 你是一个技术写作助手回答尽量精炼。}, {role: user, content: 用三句话解释什么是RAG。} ], temperature0.7, max_tokens500 ) print(resp.choices[0].message.content)跑通这段代码你就完成了和大模型交互的第一个闭环。注意 messages 是一个列表包含一个 system 消息和一个 user 消息这个结构是 OpenAI 系接口的统一约定也是后面学习提示词工程的基础。如果网络环境不稳定加一个超时和重试是成熟工程的做法resp client.chat.completions.create( modeldeepseek-chat, messages[...], timeout60, max_retries2 )2.3 必懂参数表temperature、max_tokens与stream第一次调用成功后你大概率会对各种参数感到疑惑。这里挑最常用的几个说透。temperature 控制输出随机性范围通常是 0 到 1 左右。0 代表每次都选概率最高的词输出稳定但死板接近 1 则更发散、更有创意但也更容易跑题。做分类、抽取、格式化输出这类任务建议设 0.1 到 0.3做文案、头脑风暴可以放到 0.7 到 0.9。理解方式很简单把模型想象成一个答题的学生低温度是照着标准答案背高温度是自由发挥。max_tokens 限制的是输出长度按 token 计。中文场景一个字大概对应 1 到 2 个 token普通问答设置 500 到 2000 足够。要注意 max_tokens 只限制输出不限制输入输入长度由上下文窗口决定。stream 布尔参数决定是否开启流式输出。streamTrue 时模型按 chunk 逐步返回生成的内容用户看到的是一个字一个字蹦出来的效果体验接近真人打字还能避免长等待的焦虑。第 4 章会专门讲流式的完整实现。3. 提示词工程与上下文工程让模型稳定输出你想要的内容3.1 提示词的四段式结构提示词决定了大模型输出的天花板。一个高质量提示词通常可以拆成四个部分角色、任务、约束、输出格式。角色告诉模型你是什么比如你是一名资深数据分析师。这一步能激活模型在对应领域的表达能力。任务明确要干什么比如分析这份销售数据的异常点。任务要具体少用帮我看看这类模糊指令。约束规定不能做什么比如不要使用专业术语面向销售团队汇报。输出格式指定长什么样比如输出一个表格或输出三个要点。举一个改造前后的对比。原始提示词 分析这段数据。 模型可能给出一大段绕来绕去的文本。改造后角色你是一名资深零售行业数据分析师。 任务分析下面这家门店近三个月的销售额数据找出趋势异常和可能原因。 约束用通俗语言不用专业术语结论必须基于给定数据不要编造。 输出格式先给结论再给两个要点最后给出一个行动建议总字数不超过300字。效果会完全不同。原因在于模型生成时是沿着你给的模式走的你给的结构越清晰它输出的结构就越稳定。3.2 Few-shot 示例用例子代替规则有时候规则写一大段模型还是理解不透。这时候直接用示例最有效这就是 Few-shot prompting。典型的做法是在 messages 里追加 assistant 的示例回答messages [ {role: system, content: 你负责把用户输入的句子改写成更礼貌的商务邮件措辞。}, {role: user, content: 这个需求你们三天了还没做出来太慢了。}, {role: assistant, content: 您好想确认一下需求目前的进展期待本周内能完成谢谢。}, {role: user, content: 这个方案不太行你重新写一版。} ]原理是Few-shot 给了模型一个可模仿的输入-输出映射模板模型会倾向于延续这种映射关系而不是靠理解规则后的自由发挥。规则讲不清、场景有规律可循时优先用示例。3.3 上下文工程管理多轮对话与token预算单轮提示词解决单次问答但你做产品时面对的几乎都是多轮对话。上下文工程要解决的就是如何组织历史消息、如何控制上下文长度、如何防止模型失忆。一个常见误区是把所有历史消息无脑塞进 messages。上下文窗口有限塞得越多消耗的 token 越多成本越高而且真正重要的信息会被稀释。经验做法是保留最近的 N 轮对话比如最近 10 轮更早的对话用摘要代替原始文本关键信息用户偏好、任务目标单独放在 system 消息里固化下来不随对话漂移。我做过一个客服机器人最初把全部历史堆给模型每轮请求的 token 数三个月翻了四五倍响应还变慢。改成最近5轮原文整体摘要固定知识库检索结果之后用户体验和数据成本同时改善。上下文工程做的就是这件事不是越多越好而是该给的给全不该给的不浪费。4. 进阶实战流式输出、函数调用与RAG知识库4.1 SSE流式输出Chat打字的实时渲染效果前文提到 streamTrue这里给出完整实现思路。原理是服务端通过 SSEServer-Sent Events协议把一次性返回的长文本拆成多个事件逐块推送。前端收到每个数据块后增量渲染就形成了打字机效果。后端负责转发 DeepSeek 的流前端拿到流再逐段渲染。一个关键细节是 SSE 事件里会混有注释行以 : 开头是连接心跳解析时要跳过否则可能把注释渲染到页面上。常见解析逻辑按行读取遇到以 data: 开头的内容就尝试解析 JSON解析出 choices[0].delta.content 就追加到文本区。前端侧还有另一个重要操作中断。用户点击停止生成按钮时需要真正断掉连接而不是仅仅停止渲染。这里要用 AbortControllerconst controller new AbortController(); const resp await fetch(https://api.deepseek.com/chat/completions, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer apiKey }, body: JSON.stringify({ model: deepseek-chat, messages: history, stream: true }), signal: controller.signal }); // 用户点击停止 stopBtn.onclick () controller.abort();注意后端也要做对应的处理客户端断开后终止对上游 API 的请求否则模型还在继续消耗你的 token。流式场景的踩坑点往往不在怎么接上而在怎么断上。4.2 Function Calling让模型调用你的工具Function Calling函数调用是让大模型脱离纯文本、接入真实系统的重要能力。它做的事是模型根据你的意图输出一个结构化的函数调用指令你的代码执行这个指令再把结果返回给模型模型据此生成最终回答。举一个查天气的例子。你定义了一个函数def get_weather(city: str) - str: # 调用天气接口 return 晴天22度请求时把函数定义传给模型tools [ { type: function, function: { name: get_weather, description: 查询指定城市当前天气, parameters: { type: object, properties: { city: {type: string, description: 城市名} }, required: [city] } } } ]模型会返回 tool_calls 信息里面包含函数名和参数。你的代码解析后执行 get_weather(北京)然后把结果作为一条 roletool 的消息传回去resp client.chat.completions.create( modeldeepseek-chat, messages[ {role: user, content: 北京今天天气怎么样}, {role: assistant, content: null, tool_calls: [{id: call_xxx, type: function, function: {name: get_weather, arguments: {\city\:\北京\}}}]}, {role: tool, tool_call_id: call_xxx, content: 晴天22度} ], toolstools )这里有个关键机制必须理解当模型发出 tool_calls 时它是在要求你立刻执行工具并返回结果你不能跳过这条结果直接再问模型。整个过程是模型提出调用需求 → 代码执行并回填结果 → 模型看到结果继续生成这个循环是同步的叫 tool call 的需要 immediate results 就是这个意思。我见过不少初学者在这一步报错多半是没把 assistant 的那条 tool_calls 消息保留在对话里或者 tool_call_id 对不上。4.3 RAG给模型外挂一本说明书RAGRetrieval-Augmented Generation解决的是大模型不知道你私有数据的问题。原理不复杂把文档切块、向量化后存入向量数据库用户提问时把问题也向量化做相似度检索取出最相关的文档片段拼到提示词里让模型基于这些片段作答。整个流程可以拆成三步文档切片与向量化用 embedding 模型把文本变成向量。切片大小有讲究512 到 1024 字符左右比较常用太短会截断语义太长会混入噪声。检索把用户问题转成向量做余弦相似度搜索取 top-k 片段。生成把检索结果注入提示词明确只根据下面资料回答资料不足时直接说不知道。RAG 相比微调的最大优势是灵活。换知识库内容只需重新切片导入不用动模型权重成本低、见效快。适合企业知识库问答、产品文档助手、客服系统等场景。个人玩的话本地用 Chroma 这类轻量向量库几百行代码就能搭一个私人知识库问答机器人。5. 本地部署与大模型微调从依赖API到拥有自己的模型5.1 本地部署的硬件门槛与选型思路API 用久了很多人会想能不能把模型跑在自己电脑上可以但先算一笔硬件账。DeepSeek 开源了多个规模的模型从 1.5B 到 671B 都有。参数量越大推理时需要的显存越多。以 4-bit 量化后的粗略估计1.5B 模型大约需要 4GB 左右内存7B 模型需要 6GB 左右显存14B 需要 12GB 上下32B 需要 24GB 往上。如果你的机器只有 8GB 显存的消费级显卡跑 7B 或 8B 的量化版比较现实如果想跑满血 671B那已经不是个人电脑该考虑的事需要多卡集群。所以本地部署第一课是认清你的硬件上限。家用场景推荐路线是先用一个 1.5B 或 7B 的模型完整跑通流程理解推理、上下文、量化这些概念再根据需求往上走。嵌入式设备或边缘盒子比如 Jetson Orin 这类平台也完全能跑小模型很多端侧 AI 应用就是这么落地的。5.2 用Ollama三步跑起本地模型工具选型上个人开发者首推 Ollama它把下载模型、起服务、调接口封装得极其简单。三步就能跑起来第一步安装 Ollama然后在终端执行ollama run deepseek-r1:1.5b这条命令会下载模型权重并自动启动一个对话终端。第二步验证服务正常后可以通过它的 HTTP 接口调用curl http://localhost:11434/api/chat -d { model: deepseek-r1:1.5b, messages: [{role: user, content: 11等于几}] }第三步用 OpenAI 兼容的网关Ollama 提供了 /v1 接口接入你已有的 Python 代码把 base_url 改成 http://localhost:11434/v1 即可。你看本地模型和云端模型的调用方式几乎一样这也是前面强调先学统一接口范式的好处。如果追求更高吞吐、需要并发服务可以用 vLLM。它适合有一定工程基础、部署 Qwen 或 DeepSeek 大参数量模型的场景。个人单机学习用 Ollama 就够了不必一上来就上重型框架。5.3 微调的基本流程与数据格式微调解决的是通用模型不够懂我的领域的问题。比如你想让模型模仿某个作者的文风或者学会一套内部术语提示词工程做不到那么稳就需要微调。微调的工程流程一般是准备数据集 → 选择基座模型 → 配置训练参数 → 训练 → 评估 → 合并导出。数据集格式直接决定训练能否开始。最常见的是 Alpaca 格式一个 JSON 文件里放多个样本[ { instruction: 把这句话改成更正式的说法, input: 这个事你赶紧办一下, output: 请您尽快处理此事。 } ]字段含义一目了然instruction 是任务描述input 是输入output 是期望输出。数据量上做垂直领域能力增强几百到几千条高质量样本往往就能看到明显效果不用迷信数据越多越好低质量数据的副作用比想象中大。框架层面个人开发者建议直接用 LLaMA-Factory它把数据加载、训练、导出封装成了命令和 WebUI省去大量底层代码。训练方法优先选 LoRA——只训练一小部分低秩参数显存占用小、训练速度快效果在大多数场景下接近全参微调。5.4 微调避坑指南微调最大的坑不是代码而是数据和参数。说几个我实测踩过的。第一训练集和验证集必须分开。你拿全部数据训练评估时又拿同一批数据问肯定效果很好一上真实场景立刻现原形。至少留出 5% 到 10% 的样本做验证。第二学习率不要贪大。LoRA 通常从 1e-4 左右开始试全参微调从 1e-5 开始试。学习率太高模型会把原有能力冲掉英文术语叫 catastrophic forgetting。最典型的表现是微调后领域能力提升了但连基本的通用对话都变傻了。第三微调不是万能的。如果你只是想让它回答时引用某份文档的内容正确的解法是 RAG而不是微调。微调改变的是模型的说话方式和知识结构RAG 改变的是它当前能看到的信息。两者的适用边界搞混项目会走很多弯路。6. 常见问题排查与成本控制实录6.1 API调用层面的常见问题我在实际调试时把遇到最多的调用问题整理成了速查表现象可能原因检查方向401 UnauthorizedAPI Key错误或已失效检查环境变量是否读取正确密钥是否复制完整402 Payment Required账户余额不足到控制台确认余额补充充值400 Invalid Parameter参数超出范围或格式错误检查 temperature、max_tokens 是否越界messages 是否缺少 role429 Rate Limit请求频率超限查看账号的并发/速率限制增加退避重试503 Service Unavailable服务端过载大概率是临时高峰指数退避重试context length exceeded消息总长度超过窗口精简历史消息截断或改用摘要其中 503 最常见也最容易被误判为我的代码有问题。实际上 DeepSeek 高峰期确实会出现偶发过载正确做法不是反复快速重试而是用一个带退避的重试策略第一次失败等 2 秒第二次等 4 秒第三次等 8 秒一般都能扛过去。6.2 输出质量问题的对症下药调用通了输出不满意怎么办质量问题的排查要按类型分。第一类是答非所问。多数时候提示词太模糊先按第 3 章的四段式把任务说清楚再不行就用 Few-shot 给示例。第二类是编造事实。模型没有的知识它会一本正经地编这是大模型的固有问题。必须给模型不知道就承认的许可同时用 RAG 提供可靠资料生成时限定只能基于给定资料回答。第三类是重复啰嗦。输出同一句话绕来绕去可以调低 temperature比如从 0.8 降到 0.4或者在提示词里明确写不要重复已表达过的观点。第四类是格式不稳定。让它输出 JSON它偶尔多给你一段解释文字。解决办法是提示词里写清只输出 JSON不要任何其它内容必要时用工具解析并做异常兜底。这些问题的排查顺序有讲究先检查输入提示词和数据再检查参数最后才是换模型。大多数问题在提示词层面就能解决。6.3 API成本控制与用量统计最后说下成本。大模型 API 按 token 计费输入和输出价格不同且输入命中缓存时价格会有折扣。学习阶段你花不了多少钱但一旦做成生产级应用成本必须精打细算。三个实用手段其一开启和利用 prompt 缓存把不变的系统提示词放在最前面重复请求时可以命中缓存成本明显下降。其二控制上下文长度历史消息该截断就截断该摘要就摘要不要在每轮对话里反复携带大段背景资料。其三任务分流简单任务如标题改写、意图分类用便宜的小模型或 deepseek-chat只有复杂任务才调用 deepseek-reasoner两个模型的价格差异和推理耗时差异都不小。用好这几个手段我从最初的每万次请求成本不可接受压缩到了一个完全可承受的水平。成本优化不是省钱本身而是让大模型应用能长期跑下去的必要条件。我再分享一个个人体会作为收尾学大模型最忌讳只看不练。你把这篇文章里的代码一段段跑通把提示词一条条改着玩把 RAG 和微调各做一遍小实验你的理解会超过很多看了一年视频的人。技术这行没有捷径但有一条近路——亲手把每个环节踩一遍。刚才提到的几个模块任何一个深入下去都够再写几篇文章如果你想让我展开讲某一块比如函数调用的完整工程实现或者用 LLaMA-Factory 从头微调一个模型的具体操作可以在评论区告诉我。
企业数字化 ERP 产品动态
相关推荐
从大模型到AI Agent:智能体训练、工作流编排与内容生成落地观察 最近在做AI资讯梳理的时候,后台收到不少朋友私信,问得最多的就是“每天那么多AI新闻,到底哪些值得看”“那些项目名听着高大上,又该怎么判断它是不是真落地”。正好借着整理9月下旬这波AI行业动态的机会,我把自己的信息… · 2026/11/3 17:21:30
Maven 4重构解析:核心架构升级与性能优化 1. Maven 4重构背景与核心价值2004年诞生的Maven作为Java生态的构建工具标杆,已经服务开发者整整15年。这次官宣的Maven 4被定位为"彻底重构"(Complete Rewrite),其变革力度远超常规版本迭代。从官方披露的信息来看&… · 2026/11/3 17:21:30
鸿蒙旧机型升级翻车实录:存储校验失败、应用闪退与回退策略 1. 一次升级引发的连锁反应:事情到底卡在哪手里这台备用机是华为al00系列的旧机型,平时拿来跑测试、看日志、偶尔当热点机用,系统一直停在鸿蒙2.0的某个早期版本。前阵子看到推送提示有新版本,想着备用机嘛,升就升了&a… · 2026/11/3 17:20:29
C++中struct与class的本质区别与工程实践 1. 结构体与类的本质探析在C的语法体系中,struct和class就像一对孪生兄弟,表面相似却各有性格。作为从C语言继承而来的语法结构,struct在C中被赋予了全新的内涵。记得我刚接触C时,曾天真地认为struct只是C语言中那个简单的数据打包… · 2026/11/3 18:03:32
内网私有化部署DeepSeek:打造能严苛验证算法的智能音箱 去年年底我把家里的智能音箱从厂商云端切换到了内网私有化部署的 DeepSeek 上。不是简单换一个问答后台,而是做了一个能进行“严苛算法求证”的语音枢纽:语音识别、大模型推理、语音合成全部跑在家庭内网,断外网也能正常工作,数据… · 2026/11/3 18:03:32
2026 AI专业生存指南:Python与大模型应用开发全栈工具清单 2026年了,如果你正准备进入AI专业,或者已经在读大一大二,应该已经感觉到了:学校里教的东西和行业里真正用的东西,中间隔着的不是一两年,而是整整一个技术周期。我这个标题里列了Python和大模型应用… · 2026/11/3 18:03:32
深度学习在服装推荐系统中的应用与实践 1. 项目背景与核心价值服装推荐系统是近年来电商平台和时尚科技领域的热门研究方向。传统基于规则的推荐方式往往存在个性化程度低、更新滞后等问题。这个毕业设计项目通过引入深度学习技术,构建了一套能够自动学习用户偏好与服装特征的智能推荐系统。我在实际开发中… · 2026/11/3 18:03:32
拟贝叶斯方法与STFT结合的非平稳信号处理技术 1. 拟贝叶斯方法与STFT结合的背景与价值在信号处理领域,非平稳信号的分析一直是个棘手的问题。这类信号的特点是统计特性随时间变化,传统的傅里叶变换难以捕捉其瞬时特征。我在处理生物医学信号时就深有体会——心电图、脑电图这些信号往往包含多个随时间… · 2026/11/3 18:03:32
C语言数据结构选择与查找算法优化实践 1. 题目背景与需求解析这道PTA(程序设计能力考试)题目考察的是C语言基础编程能力,属于典型的"信息查询"类问题。题目要求我们根据输入的考生信息,在给定准考证号时快速输出对应的考试座位号。在实际考试系统中ÿ… · 2026/11/3 18:02:31
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46