news 2026/5/18 18:34:25

从Transformer到RAG:大语言模型学习笔记与工程实践指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从Transformer到RAG:大语言模型学习笔记与工程实践指南

1. 项目概述:一份面向实践者的LLM学习笔记

最近几年,大语言模型(LLM)的发展速度,用“日新月异”来形容都显得有些保守。从ChatGPT横空出世,到各类开源模型如雨后春笋般涌现,再到多模态、智能体(Agent)等概念的不断深化,这个领域的技术迭代快得让人应接不暇。对于很多开发者、研究者甚至是对技术趋势保持敏感的产品经理来说,如何系统性地跟进、理解并应用这些技术,成了一个不小的挑战。市面上不缺零散的博客、论文和官方文档,但往往缺乏一条清晰、连贯、从理论到实践的主线。

正是在这样的背景下,我注意到了GitHub上一个名为“harleyszhang/llm_note”的项目。这并非一个可以直接运行的代码库,而是一份精心整理的、关于大语言模型的学习笔记。它的价值不在于提供了某个具体的工具或框架,而在于它尝试为所有对LLM感兴趣的人,搭建一个结构化的知识图谱和一条高效的学习路径。这份笔记就像一位经验丰富的同行,将他在探索LLM过程中遇到的坑、总结的经验、提炼的核心概念,毫无保留地分享出来,帮助后来者少走弯路,更快地抓住技术本质。

这份笔记的核心受众,是那些希望从零开始系统学习LLM,或者已经有一定基础但希望查漏补缺、构建完整知识体系的实践者。它不满足于简单的概念罗列,而是深入到模型架构、训练方法、应用范式、评测体系等各个层面,并结合了代码示例和实践思考。对于我这样长期在一线从事AI相关工作的从业者来说,阅读这样的笔记,不仅能温故知新,更能从作者的梳理和见解中获得新的启发,尤其是在如何将庞杂的知识点串联起来,形成自己的技术判断力方面。

2. 笔记内容架构与核心脉络解析

2.1 知识体系的模块化设计

打开“llm_note”的目录结构,你就能立刻感受到作者在内容组织上的用心。它不是一篇冗长的文章,而是采用了清晰的模块化设计,将庞大的LLM知识体系分解为若干个相对独立又相互关联的模块。这种设计非常符合现代学习者的认知习惯——你可以根据自己的兴趣和当前的知识短板,选择性地深入某个模块,而不必被线性阅读所束缚。

典型的模块划分可能包括但不限于:基础理论篇(涵盖Transformer架构、注意力机制、位置编码等基石性知识)、模型家族篇(梳理GPT、BERT、T5、LLaMA等主流模型系列的演进与特点)、训练与优化篇(深入预训练、指令微调、人类反馈强化学习等关键过程)、应用范式篇(探讨提示工程、检索增强生成、智能体等核心应用模式)、评测与部署篇(介绍主流评测基准、模型量化、推理加速等工程实践)。每个模块内部,又会进一步细分为更具体的主题,形成一个树状的知识网络。

这种架构的优势在于“可伸缩性”。对于初学者,可以按照“基础理论 -> 模型家族 -> 应用范式”的顺序,建立一个宏观的理解框架。对于进阶者,可以直接跳入“训练与优化”或“评测与部署”等深水区,解决实际项目中遇到的具体问题。笔记的价值,很大程度上就体现在这种清晰、灵活且富有逻辑性的内容组织上,它让自学变得有章可循。

2.2 从原理到实践的贯穿线

一份优秀的学习笔记,绝不能停留在“是什么”的层面,必须深入到“为什么”和“怎么做”。“llm_note”在这方面做得相当出色。它在讲解每一个核心概念时,都力求贯穿“理论原理 -> 数学直觉 -> 代码实现 -> 实践思考”这条主线。

注意力机制为例。很多资料会直接给出公式,然后说“这就是计算Query和Key相似度的方法”。但这本笔记可能会从“人脑如何聚焦关键信息”这个直觉出发,引出注意力机制的必要性。然后,它会一步步推导出缩放点积注意力的公式,并解释为什么要除以根号d_k(为了在softmax中保持梯度的稳定性)。紧接着,它会提供一个精简的PyTorch或NumPy实现代码片段,让你看到公式是如何转化为实际计算的。最后,它可能会讨论多头注意力的设计动机——模拟不同子空间的表征能力,并指出在实际训练中需要注意的初始化技巧。

再比如讲到指令微调,它不会仅仅定义这个概念,而是会对比“预训练”、“指令微调”和“基于人类反馈的强化学习”三者的区别与联系,阐明指令微调是如何让模型“学会听从指令”的关键步骤。然后,它会介绍常见的指令微调数据集格式(如Alpaca格式),并可能提供一个使用Hugging Face Transformers库进行LoRA微调的代码示例,同时附上作者在实际操作中关于学习率设置、数据清洗等方面的经验之谈。

注意:阅读这类笔记时,切忌“只看不练”。最好的方式是,在阅读完一个章节后,立刻找到对应的代码块,在自己的环境中运行一遍,甚至尝试修改一些参数,观察输出的变化。只有经过“手过一遍”的过程,抽象的知识才会内化为你的直觉。

3. 核心主题深度拆解与实操要点

3.1 Transformer架构的再理解与编码实现

Transformer是LLM的基石,任何深入的学习都绕不开它。“llm_note”对Transformer的解读,很可能超越了简单的框图复述,而是抓住了几个常被忽略但至关重要的细节。

位置编码的奥秘:为什么用正弦余弦函数?笔记可能会深入解释这种设计如何让模型捕获相对位置信息,以及绝对位置编码与相对位置编码(如RoPE,旋转位置编码)的演进与优劣。在实操中,理解这一点对于后续阅读使用RoPE的模型(如LLaMA)的源码至关重要。你可以尝试自己编写一个简单的RoPE函数,感受一下它是如何将位置信息融入注意力计算的。

层归一化(LayerNorm)的位置:Transformer原始论文中,LayerNorm放在残差连接之后(Post-LN)。但后来的很多模型(如GPT、LLaMA)采用了Pre-LN(放在残差连接之前)。笔记会分析这种改动对训练稳定性和收敛速度的影响。如果你要自己从零实现一个Transformer,这里就是一个需要做出选择的关键点。通常,对于深层模型,Pre-LN是更稳定、更常见的选择。

前馈网络(FFN)的维度:FFN中间层的维度通常是模型隐藏层的4倍。这个“4倍”并非金科玉律,但是一个经过大量实践验证的经验值。笔记可能会探讨这个比例背后的原因(提供足够的非线性变换能力),并提醒在调整模型大小时,这个比例是一个需要谨慎考虑的超参数。

一个极佳的练习是,跟随笔记的指引,使用PyTorch从头实现一个迷你版的Transformer(比如6层编码器,隐藏维度512)。在这个过程中,你会遇到维度对齐、矩阵乘法、掩码处理等一系列工程细节,这些是看多少遍论文都无法替代的实战经验。

3.2 大模型训练的关键技术剖析

理解了架构,下一步就是如何“制造”一个大模型。训练一个LLM是计算和工程上的巨大挑战,“llm_note”会重点拆解其中的核心技术。

分布式训练策略:当模型参数或数据大到单卡无法容纳时,就必须使用分布式训练。笔记会清晰对比数据并行(Data Parallelism)、张量并行(Tensor Parallelism)、流水线并行(Pipeline Parallelism)以及最新的零冗余优化器(ZeRO)之间的区别和应用场景。

  • 数据并行:最简单,每张卡都有完整的模型副本,处理不同的数据批次,适合当模型能放进单卡但数据量大的情况。
  • 张量并行:将单个矩阵运算拆分到多张卡上,适合模型层中的大矩阵(如FFN层)无法放入单卡时。
  • 流水线并行:将模型的不同层放到不同的设备上,像一个流水线,适合模型层数极深的情况。
  • ZeRO:通过优化器状态、梯度、参数的分区,极大减少数据并行中的内存冗余,是目前非常主流且高效的策略。

在实际操作中,对于大多数研究者和小型团队,可能更多接触的是基于DeepSpeed(实现了ZeRO)或FSDP(PyTorch Fully Sharded Data Parallel)的分布式训练。笔记应该会提供如何配置DeepSpeed配置文件(ds_config.json)的示例,并解释关键参数如stage(ZeRO阶段)、offload_optimizer(优化器状态卸载到CPU)等的含义和适用场景。

混合精度训练与梯度缩放:使用FP16或BF16浮点数格式可以大幅减少内存占用和加速计算,但会带来数值下溢(梯度太小变为0)的问题。笔记会解释梯度缩放(Gradient Scaling)技术如何解决这个问题:在前向和反向传播时使用FP16,但在优化器更新权重时,先将梯度放大(scale),更新后再缩小(unscale)。使用PyTorch的AMP(Automatic Mixed Precision)或NVIDIA的Apex库可以自动完成这些操作,但理解其原理对于调试训练不稳定问题至关重要。

大Batch训练与学习率预热:为了充分利用分布式计算,常常需要使用非常大的全局批次大小(Global Batch Size)。直接使用大Batch和初始学习率会导致训练不稳定。笔记会强调学习率预热(Learning Rate Warmup)的重要性:在训练开始时,从一个很小的学习率线性或余弦增加到预设值,让模型参数先“热身”适应梯度方向。通常,预热步数(Warmup Steps)占总训练步数的1%到10%是一个常见的经验范围。

4. 主流开源模型家族与应用范式实战

4.1 LLaMA家族与ChatGLM的本地化实践

对于国内开发者,如何在有限的资源下高效地使用和微调开源大模型是核心诉求。“llm_note”很可能会重点覆盖Meta的LLaMA系列和清华的ChatGLM系列,因为它们在开源生态和中文能力上各有优势。

LLaMA系列的精髓:笔记会剖析LLaMA模型的核心改进,如SwiGLU激活函数、RoPE位置编码、以及更干净、数据量更大的预训练语料。更重要的是,它会指导你如何获取和使用这些模型的“平替”版本(如Chinese-LLaMA-Alpaca、Linly等社区项目),这些项目通常提供了完整的从词表扩展到指令微调的中文化方案。

实操环节,笔记可能会给出一个标准的本地推理与微调流程:

  1. 模型下载与转换:从Hugging Face Model Hub下载模型(如decapoda-research/llama-7b-hf),注意可能需要申请权限。使用transformers库的LlamaForCausalLM加载。
  2. 本地推理测试:编写一个简单的生成脚本,使用pipeline或手动调用model.generate()函数,注意设置max_lengthtemperature(控制随机性)、top_p(核采样)等关键参数。
  3. 使用PEFT进行高效微调:这是重中之重。介绍Parameter-Efficient Fine-Tuning方法,特别是LoRA。提供一个使用peft库为LLaMA添加LoRA适配器的完整示例。
    from peft import LoraConfig, get_peft_model config = LoraConfig( r=8, # LoRA的秩,影响参数量,通常8或16 lora_alpha=32, # 缩放因子 target_modules=["q_proj", "v_proj"], # 对Transformer的query和value投影层添加适配器 lora_dropout=0.1, bias="none", task_type="CAUSAL_LM" ) model = get_peft_model(model, config) model.print_trainable_parameters() # 查看可训练参数占比,通常不到1%
  4. 准备与训练:将你的指令数据整理成JSON格式,使用transformers.Traineraccelerate库进行训练。笔记会强调数据质量的重要性,以及如何设置gradient_accumulation_steps来模拟大Batch训练。

ChatGLM系列的特点:笔记会指出ChatGLM(如GLM-4-9B)基于GLM架构,在中文理解和生成上具有先天优势,且通常提供了更友好的开源协议和量化版本。它会比较使用transformers加载ChatGLM与LLaMA的细微差别,例如注意力掩码的实现方式。

实操心得:在本地微调时,最常遇到的是显存不足(OOM)问题。除了使用LoRA,还可以尝试:

  • 梯度检查点:以时间换空间,在Trainer中设置gradient_checkpointing=True
  • 量化加载:使用bitsandbytes库的8位或4位量化加载模型,如load_in_8bit=True,这能极大减少加载时的显存占用。
  • 优化器选择:使用内存高效的优化器,如adamw_8bit

4.2 提示工程与RAG应用构建

让大模型发挥能力,离不开有效的“交互方式”。提示工程和检索增强生成是当前最主流的两种应用范式。

系统化的提示设计:笔记不会只给出几个零散的“咒语”,而是会总结出一套方法论。例如,它可能会介绍“角色设定(Role)-> 任务描述(Task)-> 上下文(Context)-> 输出格式(Format)”的提示结构。并强调“少样本提示(Few-shot Prompting)”的强大之处:通过提供几个输入输出的例子,能让模型快速理解复杂任务的要求。在实操中,维护一个高质量的“提示词库”并不断迭代优化,是提升应用效果的关键。

RAG技术栈全链路实现:检索增强生成是解决模型“幻觉”和知识过时问题的利器。笔记会详细拆解RAG的每一个环节:

  1. 文档加载与切分:使用LangChainDocumentLoader(支持PDF、Word、网页),然后用RecursiveCharacterTextSplitter进行智能切分,注意重叠(overlap)的设置,以保证上下文的连贯性。
  2. 向量化与存储:选择嵌入模型(如text-embedding-ada-002的OpenAI API,或开源的BGE-M3m3e),将文本块转换为向量。使用向量数据库(如ChromaMilvusQdrant)进行存储和索引。笔记会对比不同向量数据库在本地部署难度、性能和功能上的差异。
  3. 检索与重排:实现相似度检索(如余弦相似度)。进阶部分会介绍“重排(Re-ranking)”技术,即用一个更精细的交叉编码器模型对检索到的Top K结果进行重新排序,提升相关性。
  4. 提示合成与生成:将检索到的相关文档片段作为上下文,与用户问题一起合成最终的提示,交给LLM生成答案。

一个简单的RAG应用代码骨架可能如下所示:

from langchain.vectorstores import Chroma from langchain.embeddings import HuggingFaceEmbeddings from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.document_loaders import DirectoryLoader # 1. 加载与切分 loader = DirectoryLoader('./docs/', glob="**/*.txt") documents = loader.load() text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) texts = text_splitter.split_documents(documents) # 2. 向量化与存储 embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5") vectorstore = Chroma.from_documents(texts, embeddings, persist_directory="./chroma_db") # 3. 检索 retriever = vectorstore.as_retriever(search_kwargs={"k": 3}) docs = retriever.get_relevant_documents("你的问题是什么?") # 4. 合成提示并生成(此处简化) context = "\n".join([doc.page_content for doc in docs]) prompt = f"基于以下上下文回答问题:\n{context}\n\n问题:你的问题是什么?\n答案:" # 将prompt送入LLM...

5. 模型评测、量化与部署的工程实践

5.1 如何科学地评估一个LLM

“这个模型到底好不好?”需要一个客观的答案。笔记会系统介绍LLM的评测体系。

能力导向评测:使用标准基准测试,如MMLU(大规模多任务语言理解)、C-Eval(中文评测)、GSM8K(数学推理)、HumanEval(代码生成)等。笔记会解释这些数据集的构成和评测方式,并提醒注意:评测结果高度依赖提示词和采样参数。直接比较不同论文中报告的数字可能不准确,最好在统一的评测框架(如OpenCompass、LM-Evaluation-Harness)下自行复现。

实用性评测:对于垂直应用,标准基准往往不够。笔记会介绍如何构建自己的评测集:

  1. 定义评估维度:例如,对于客服机器人,可分为“事实准确性”、“回答相关性”、“语言流畅度”、“安全性”。
  2. 构建测试用例:收集真实用户问题或构造边缘案例。
  3. 选择评估方法
    • 人工评估:黄金标准,但成本高。需要设计详细的评分标准(如1-5分利克特量表)。
    • 基于GPT-4的自动评估:用更强的模型(如GPT-4)作为裁判,评估其他模型的输出。提示词设计是关键,例如:“请判断以下回答在事实准确性上是否满分5分制能得几分?请只输出分数。”
  4. 分析结果:计算平均分、胜率等指标,并进行错误分析,找出模型的系统性弱点。

5.2 模型量化与轻量化部署实战

让大模型在消费级硬件上运行,量化是必备技能。笔记会深入浅出地讲解量化的原理和实践。

量化原理简述:将模型权重和激活值从高精度(如FP32)转换为低精度(如INT8、INT4),从而减少内存占用和加速推理。主要分为:

  • 训练后量化:模型训练完成后直接转换,简单快捷,但可能有精度损失。
  • 量化感知训练:在训练过程中模拟量化效应,让模型适应低精度,精度保持更好。

GGUF与llama.cpp的黄金组合:对于LLaMA系模型,社区最流行的方案是使用llama.cpp工具和GGUF格式。笔记会提供详细步骤:

  1. 模型转换:使用convert.py脚本将Hugging Face格式的模型转换为GGUF格式。关键是指定量化类型,如q4_0(4位整数量化)、q8_0(8位整数量化)等。q4_0在精度和速度上是一个很好的平衡点。
  2. 本地推理:使用llama.cppmain工具进行推理。可以指定线程数(-t)、提示模板(--prompt)等。对于多轮对话,需要正确处理聊天历史。
  3. API服务化:使用llama.cpp项目中的server示例,快速启动一个类OpenAI API的HTTP服务,方便其他应用调用。

更先进的量化技术:笔记还会提及AWQ(激活感知权重量化)和GPTQ(基于二阶信息的训练后量化)等更精细的量化方法。这些方法通常能获得比传统RTN(轮转量化)更好的精度。例如,使用AutoAWQ库可以轻松对Transformers模型进行AWQ量化并导出,然后在支持AWQ的推理引擎(如vLLM)上运行。

轻量级推理引擎选择

  • vLLM:以极高的吞吐量和高效的内存管理(PagedAttention)著称,非常适合高并发API服务。
  • TensorRT-LLM:NVIDIA官方优化,在NVIDIA GPU上能达到极致性能,但使用门槛稍高。
  • MLC-LLM:支持多种硬件后端(手机、网页),部署灵活性高。

选择哪个引擎,取决于你的部署场景(云端服务、边缘设备、移动端)、硬件(NVIDIA GPU、其他)以及对性能、易用性的权衡。

6. 学习路径规划与常见问题避坑指南

6.1 循序渐进的个人学习路线图

面对“llm_note”这样丰富的知识库,新手容易感到无从下手。基于笔记的内容,我可以为你梳理一条建议的学习路径:

第一阶段:筑基(约2-4周)

  1. 掌握Python和PyTorch基础:这是入场券。至少能熟练使用Tensor操作、自动求导和简单的模型定义。
  2. 吃透Transformer:集中精力学习笔记中的“基础理论篇”。完成一个迷你Transformer的编码实现。理解Self-Attention、FFN、LayerNorm、位置编码的每一个细节。
  3. 运行第一个预训练模型:使用Hugging Facetransformers库,加载一个像bert-base-uncased这样的小模型,完成一个文本分类的微调任务。熟悉TrainerAPI的基本用法。

第二阶段:进阶(约1-2个月)

  1. 深入开源模型:学习笔记中的“模型家族篇”。在本地运行LLaMA-7B或ChatGLM-6B的推理。理解它们的架构特点。
  2. 掌握高效微调:重点学习PEFT,尤其是LoRA。在自己的数据集上对一个小模型进行指令微调实验。
  3. 构建第一个RAG应用:按照笔记的指引,用LangChain和Chroma搭建一个基于本地知识库的问答系统。

第三阶段:深化(长期)

  1. 钻研训练技术:学习分布式训练、混合精度、大Batch优化等。尝试在单机多卡或云服务器上跑通一个完整的预训练或继续预训练流程。
  2. 关注模型评测与优化:建立自己的评测体系,学习模型量化和加速推理技术,将模型部署到实际环境中。
  3. 跟踪前沿:关注论文(如arXiv)、顶级会议(NeurIPS, ICLR)和开源社区(Hugging Face, GitHub Trending),将新知识不断补充到自己的知识体系中。

6.2 高频问题与实战排错记录

在实际操作中,你一定会遇到各种各样的问题。以下是一些我踩过的坑和解决方案:

问题一:微调时Loss不下降或变成NaN。

  • 可能原因1:学习率过高。这是最常见的原因。尝试大幅降低学习率(例如从2e-4降到5e-5),并启用学习率预热。
  • 可能原因2:数据格式错误。检查你的指令数据格式是否与模型要求的模板完全匹配。一个多余的空格都可能导致模型困惑。
  • 可能原因3:梯度爆炸。启用梯度裁剪(gradient_clip_val=1.0),并检查模型权重初始化是否合理。
  • 排查方法:先在一个极小的数据集(如10条样本)上过拟合,如果模型能很快将loss降到接近0,说明训练流程基本正确,问题可能出在数据或超参上。

问题二:RAG系统检索不到相关文档。

  • 可能原因1:文本切分不合理。块大小(chunk_size)太大或太小,或者切分时破坏了句子和段落的完整性。尝试调整chunk_size(如200-1000)和overlap(如50-100)。
  • 可能原因2:嵌入模型不匹配。用于检索的嵌入模型与查询的语义空间不匹配。对于中文,优先选择BGEm3e等针对中文优化的模型。
  • 可能原因3:检索策略单一。仅使用简单的向量相似度检索可能不够。可以尝试混合检索(Hybrid Search),结合关键词搜索(如BM25)和向量搜索的结果。
  • 排查方法:单独测试检索环节。输入一个问题,打印出检索到的文本块和它们的相似度分数,人工判断相关性。如果相关性差,就从切分和嵌入模型入手优化。

问题三:量化后模型效果严重下降。

  • 可能原因1:量化比特数过低或方法不当。对于7B以上的模型,q4_0通常可以接受,但对于更小的模型或精度要求高的任务,尝试q8_0或更高级的AWQ/GPTQ量化。
  • 可能原因2:校准数据不具代表性。量化感知训练或某些量化方法需要校准数据。确保校准数据能覆盖你任务的数据分布。
  • 可能原因3:推理框架不支持某些操作。某些特殊的算子可能在量化后不被支持。检查llama.cpp或相关推理引擎的issue列表。
  • 排查方法:在量化前后,用同一个评测集测试模型性能,量化量化前后的输出差异。先从高比特数量化(如q8_0)开始,逐步降低,找到精度和效率的平衡点。

这份“harleyszhang/llm_note”的价值,就在于它将这些散落在各处的知识点、工具和最佳实践,以一种系统化、工程化的视角串联了起来。它更像是一张精心绘制的地图,而非具体的宝藏。真正的宝藏,需要你沿着地图的指引,亲手去挖掘、去实践、去踩坑,最终构建起属于你自己的、扎实的LLM知识体系和工程能力。在这个快速变化的领域,保持持续学习和动手实践,是唯一不变的法宝。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/18 18:33:36

对比直接使用厂商API,Taotoken在账单追溯上的优势体验

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接使用厂商API,Taotoken在账单追溯上的优势体验 1. 多模型账单分散带来的管理挑战 在直接使用各模型厂商的API进…

作者头像 李华
网站建设 2026/5/18 18:33:36

股市学习心得-物理AI将成为万亿级主线

物理AI将成为万亿级主线(所提供内容仅用于学习交流,不作为股市交易依据)一、物理 AI 定义:物理 AI 是算法 硬件 现实物理世界的结合,是 AI 从线上走到线下的形态,涵盖无人机、人形机器人、自动驾驶汽车等;区别于仅存…

作者头像 李华
网站建设 2026/5/18 18:33:06

第二天学习

HelloWorld 1.建一个文件夹,存放代码 2.新建一个java文件 文件后缀名为.java Hello.java 3.编写代码 public class Hello //类别public class {public static void main(String[] args){System.out.print("Hello,World!");}} 4.路径前面输入cmd+空格,打开该文…

作者头像 李华
网站建设 2026/5/18 18:26:40

硬科技创业指南:深创赛福田预选赛报名冲刺与项目优化策略

1. 赛事全景与核心价值解析时间窗口正在快速收窄,对于华南地区的硬科技创业者而言,一个不容错过的关键节点已经进入最后48小时的冲刺阶段。我说的正是第十五届中国深圳创新创业大赛福田预选赛区,其核心载体——华秋第九届中国硬件创新创客大赛…

作者头像 李华
网站建设 2026/5/18 18:26:27

嵌入式Linux开发板二维码生成实战:从轻量级库选型到屏幕渲染优化

1. 项目概述:当嵌入式开发板遇上二维码 最近在ELF 1开发板上折腾一个数据采集和展示的小项目,需要把采集到的设备序列号、传感器读数等信息,通过屏幕展示成一个二维码。这样,现场维护人员用手机一扫,就能立刻看到所有关…

作者头像 李华
网站建设 2026/5/18 18:23:10

Linux系统中atd和crond区别与定时任务

在Linux系统中,atd和crond都用于任务调度的进程,主要区别是任务的执行频率atd:单一执行的例行性任务(是在指定的时间只能执行一次任务 )crond:循环执行的例行性任务(可以循环重复的执行定时任务…

作者头像 李华