当前位置: 首页 > article >正文

【大模型工程实践③】RAG 基础架构与完整实现

【大模型工程实践③】RAG 基础架构与完整实现:从0到1跑通作者:AI学习者 | 来源:大模型工程实践学习系列 | 更新:2026年3月【理论要点速览】学习本篇前,建议先掌握以下核心理论(点击跳转):① 为什么需要RAG?② RAG vs Fine-tuning vs Long Context的决策框架③ Naive RAG → Advanced RAG → Modular RAG的架构演进④ Self-RAG的理论基础⑤ 检索-生成协同的理论基础前言RAG(Retrieval-Augmented Generation,检索增强生成)是目前大模型工程落地最成熟、最广泛使用的架构。不夸张地说:不懂 RAG,就等于不懂大模型工程。2025-2026年 RAG 的最新进展RAG 领域在过去一年发生了重大演变:① 工具生态的爆发RAGFlow(开源,阿里开发):企业级RAG平台,支持复杂文档解析、多模态检索Dify:低代码RAG应用构建平台,已成为开发者首选LlamaIndex:从单纯的索引库演进为完整的RAG编排框架LangChain:从链式调用升级到LangGraph(有向图编排)② 架构范式的转变Native RAG → Modular RAG:从简单的检索+生成,演进到模块化、可组合的架构查询改写(Query Rewriting)多路召回(Multi-path Retrieval)融合排序(Fusion Ranking)自适应检索(Adaptive Retrieval)Self-RAG 的兴起:模型自主决定何时检索、检索什么、如何利用检索结果相比传统RAG,准确率提升15-25%减少不必要的检索调用,降低成本③ Embedding 模型的升级BGE-M3(2024年底发布):支持稠密+稀疏向量混合检索,中英文双语,成为业界标准本地部署成为主流:FlagEmbedding库使得BGE-M3本地部署成本极低多语言、多粒度检索:从单一向量到多种检索方式的融合④ 国产LLM的成熟通义千问(Qwen):API稳定,成本低,中文理解能力强DeepSeek:开源模型质量突破,本地部署成本大幅下降零一万物(Yi):长上下文支持,适合RAG场景1. RAG 为什么存在?1.1 大模型的知识困境大模型有两大硬伤:① 知识过时GPT-4(2023年4月训练) → 无法知道2024年的事情 你问它最新的技术进展 → 它会编造(幻觉)② 知识盲区你公司的内部数据 → 大模型从未见过 你的私有文档 → 大模型无法回答1.2 RAG 的解决思路“不要让模型记住一切,让模型学会查找。”用户问题 → 查询改写 → 多路召回 → 融合排序 → 上下文组装 → LLM生成回答本质:把"知识的存储"和"知识的推理"分开:检索系统负责找相关知识(可以实时更新,支持多种检索方式)LLM 负责理解和生成(利用强大的推理能力)2. 现代 RAG 完整架构图┌────────────────────────────────────────────────────────────────────────┐ │ 现代 Modular RAG 系统 │ │ │ │ ┌──────────────┐ ┌──────────────────────┐ │ │ │ 文档输入 │ │ 用户问题 │ │ │ └──────┬───────┘ └────────┬─────────────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌──────────────┐ 写入流 ┌──────────────────────┐ │ │ │ 文档加载 │ ──────────────────────▶ │ 查询改写/扩展 │ │ │ │ (多格式支持) │ │ (Query Rewriting) │ │ │ └──────┬───────┘ └────────┬─────────────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌──────────────┐ ┌──────────────────────┐ │ │ │ 文本分块 │ │ 多路召回 │ │ │ │ (智能分块) │ │ (Multi-path) │ │ │ └──────┬───────┘ │ ├─ 稠密向量检索 │ │ │ │ │ ├─ 稀疏向量检索 │ │ │ ▼ │ ├─ 关键词检索 │ │ │ ┌──────────────┐ │ └─ 混合检索 │ │ │ │ Embedding │ └────────┬─────────────┘ │ │ │ (BGE-M3) │ ────────┐ │ │ │ │ 稠密+稀疏向量 │ │ ▼ │ │ └──────┬───────┘ │ ┌──────────────────────┐ │ │ │ │ │ 融合排序 │ │ │ ▼ ▼ │ (Fusion Ranking) │ │ │ ┌──────────────┐ ┌──────────────┐ │ ├─ RRF算法 │ │ │ │ 向量数据库 │◀─┤ 相似度计算 │ │ ├─ 学习排序 │ │ │ │ (FAISS/Qdrant)│ └──────────────┘ │ └─ 重排序模型 │ │ │ └──────┬───────┘ └────────┬─────────────┘ │ │ │ │ │ │ └───────────────────────┬───────────────────┘ │ │ ▼ │ │ ┌──────────────────────┐ │ │ │ 上下文组装 │ │ │ │ (Context Assembly) │ │ │ └────────┬─────────────┘ │ │ │ │ │ ▼ │ │ ┌──────────────────────┐ │ │ │ Self-RAG 决策 │ │ │ │ (是否需要检索?) │ │ │ └────────┬─────────────┘ │ │ │ │ │ ▼ │ │ ┌──────────────────────┐ │ │ │ LLM 生成回答 │ │ │ │ (支持流式输出) │ │ │ └──────────────────────┘ │ │ │ └────────────────────────────────────────────────────────────────────────┘3. 环境准备与镜像配置3.1 关键依赖安装为什么需要这些依赖?库作用选型理由langchainRAG 流程抽象统一文档加载、分割、检索接口faiss-cpu/faiss-gpu向量索引高效最近邻搜索,支持百万级向量sentence-transformersEmbedding 模型生成文档和查询的语义向量transformersLLM 调用与各类大模型交互的统一接口版本注意:Windows 推荐faiss-cpu;如使用 CUDA 用faiss-gpu。conda 安装示例(推荐):conda install faiss-cpu langchain langchain-community \ sentence-transformers transformers -c conda-forge pip install langchain-openai # 如果使用 OpenAI API# 核心RAG框架pipinstalllangchain langchain-community langchain-openai# Embedding模型(本地)pipinstallFlagEmbedding# 向量数据库(选择一个或多个)pipinstallfaiss-cpu# 轻量级,适合原型pipinstallqdrant-client# 生产级,支持持久化pipinstallchromadb# 简单易用,适合快速原型# 文档处理pipinstallpypdf# PDF解析pipinstallpython-docx# Word文档pipinstallbeautifulsoup4# HTML解析pipinstallmarkdown# Markdown解析# 工具库pipinstalltiktoken# Token计数pipinstallrequests# HTTP请求3.2 镜像源配置(必须在import之前)为什么镜像必须在 import 前配置?transformers/sentence-transformers在首次 import 时自动下载模型权重如果没有提前设置镜像,国内网络访问huggingface.co会超时设置HF_ENDPOINT环境变量可以在代码层面指定镜像地址,无需手动改 pip 源镜像检测逻辑:依次尝试hf-mirror.com→hf.duiniucdn.com→huggingface.co用urllib做 5 秒超时探测,可访问则选中均不可用时继续运行(后续 import 可能失败,给出明确错误提示)其他可选镜像(补充):腾讯云:https://hf.duiniucdn.com(推荐国内)火山引擎:https://hf-mirror.com(备选)""" 重要:镜像配置必须在所有huggingface/transformers相关import之前执行 这样可以加速模型下载,避免网络超时 """importos# ==== Mirror config (must be before import) ====HF_MIRRORS=["https://hf-mirror.com","https://hf.duiniucdn.com","https://huggingface.co",]for_minHF_MIRRORS:os.environ["HF_ENDPOINT"]=_mtry:importurllib.request urllib.request.urlopen(_m,timeout=5)print(f"Mirror available:{_m}")breakexceptException:print(f"Mirror failed:{_m}")else:print("WARNING: all mirrors failed")os.environ["HF_HUB_CACHE"]="C:/Users/OMEN/.hf_cache"os.environ["HF_HOME"]="C:/Users/OMEN/.hf_home"os.environ["HF_HUB_DISABLE_SYMLINKS_WARNING"]="1"importosimportsys# ============ 镜像源配置(第一步,必须最先执行) ============# HuggingFace 镜像(用于下载BGE-M3等模型)os.environ["HF_ENDPOINT"]="https://hf-mirror.com"# 国际源# 或使用国内镜像(如果国际源慢):# os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"# 通义千问 API Key(如果使用国产LLM)os.environ["DASHSCOPE_API_KEY"]="your-dashscope-api-key"# OpenAI API Key(如果使用GPT)os.environ["OPENAI_API_KEY"]="your-openai-api-key"# ============ 现在才能import相关库 ============fromlangchain_openaiimportOpenAIEmbeddings,ChatOpenAIfromlangchain_community.vectorstoresimportFAISSfromlangchain.text_splitterimportRecursiveCharacterTextSplitterfromlangchain.document_loadersimportPyPDFLoader,TextLoaderfromFlagEmbeddingimportFlagModelimporttiktoken4. 完整代码实现4.1 第一步:文档加载(多格式支持)文档加载在 RAG 中的地位:文档加载是 RAG 流水线的入口,负责将原始文件(PDF/Word/Markdown/TXT)解析为纯文本加载质量直接影响后续分块和检索的效果:噪声内容会被一并灌入 EmbeddingLangChain 文档加载器的设计思路:每个加载器只负责一种格式,实现单一职责PyPDFLoader:逐页读取 PDF,保留页码信息(用于溯源)TextLoader:最简单,直接读纯文本文件UnstructuredMarkdownLoader:解析 Markdown 结构(标题、列表、代码块)UnstructuredWordDocumentLoader:解析 Word 文档,提取正文段落最佳实践:加载后建议打印page_content确认格式是否符合预期PDF 扫描件(图片)需要先用 OCR 处理,纯 PyPDFLoader 无法提取文字importosfrompathlibimportPathfromlangchain.document_loadersimport(PyPDFLoader,TextLoader,UnstructuredMarkdownLoader,UnstructuredWordDocumentLoader)defload_documents(file_path:str)-list:""" 根据文件类型加载文档 支持格式:PDF、TXT、MD、DOCX """file_path=Path(file_path)ifnotfile_path.exists():raiseFileNotFoundError(f"文件不存在:{file_path}")suffix=file_path.suffix.lower()try:ifsuffix==".pdf":loader=PyPDFLoader(str(file_path))elifsuffix==".txt":loader=TextLoader(str(file_path),encoding="utf-8")elifsuffix==".md":loader=UnstructuredMarkdownLoader(str(file_path))elifsuffix==".docx":loader=UnstructuredWordDocumentLoader(str(file_path))else:raiseValueError(f"不支持的文件类型:{suffix}")documents=loader.load()# 添加文件名到metadatafordocindocuments:doc.metadata["source_file"]=file_path.namereturndocumentsexceptExceptionase:print(f"加载文档失败:{e}")raise# 示例if__name__=="__main__":docs=load_documents("data/产品手册.pdf")print(f"✓ 加载了{len(docs)}个文档块")print(f"✓ 内容预览:{docs[0].page_content[:200]}...")4.2 第二步:文本分块(智能分块策略)分块是 RAG 中最影响召回质量的环节之一:模型对每个 chunk 生成一个向量;chunk 太大则语义稀释、容易被截断chunk 太小则语义不完整、丢失上下文常用分块策略对比:策略原理优点缺点固定长度按 token 数直接切简单快速语义可能被截断递归字符分割按\n\n→\n→.优先级递归切尽量保持段落完整参数敏感语义分割用模型判断句子边界语义最完整速度慢父子块大块存父、小块检索引、召回后挂载父兼顾精度和上下文实现复杂关键参数:chunk_size:每块 token 数,推荐 256~512(中文约 200~400 字)chunk_overlap:块间重叠 token 数,推荐 chunk_size 的 10~20%,避免边界截断丢失语义fromlangchain.text_splitterimportRecursiveCharacterTextSplitterimporttiktokendefchunk_documents(documents:list,chunk_size:int=512,chunk_overlap:int=100,use_token_count:bool=True)-list:""" 将文档分割成小块(智能分块) Args: documents: 原始文档列表 chunk_size: 每个块的大小(字符数或token数) chunk_overlap: 块之间的重叠(防止边界信息丢失) use_token_count: 是否使用token计数(更精确) Returns: 分块后的文档列表 说明: - chunk_size=512 对应约150-200个token - chunk_overlap=100 保证相邻块有约30%的重叠 - 对于中文文本,建议chunk_size=400-600 """# 如果使用token计数,需要转换ifuse_token_count:try:encoding=tiktoken.get_encoding("cl100k_base")deftoken_length(text):returnlen(encoding.encode(text))length_function=token_lengthexcept:# 如果tiktoken失败,回退到字符计数length_function=lenelse:length_function=len# 递归分块:优先按段落、句子、词语切割text_splitter=RecursiveCharacterTextSplitter(chunk_size=chunk_size,chunk_overlap=chunk_overlap,length_function=length_function,separators=["\n\n",# 段落分隔"\n",# 行分隔"。",# 中文句号"!",# 中文感叹号"?",# 中文问号";",# 中文分号" ",# 空格importosimportos# ==== Mirror config (must be before import) ====HF_MIRRORS=["https://hf-mirror.com","https://hf.duiniucdn.com","https://huggingface.co",]for_minHF_MIRRORS:os.environ["HF_ENDPOINT"]=_mtry:importurllib.request urllib.request.urlopen(_m,timeout=5)print(f"Mirror available:{_m}")breakexceptException:print(f"Mirror failed:{_m}")else:print("WARNING: all mirrors failed")os.environ["HF_HUB_CACHE"]="C:/Users/OMEN/.hf_cache"os.environ["HF_HOME"]="C:/Users/OMEN/.hf_home"os.environ["HF_HUB_DISABLE_SYMLINKS_WARNING"]="1"fromFlagEmbeddingimportFlagModelfromlangchain_community.vectorstoresimportFAISSfromlangchain.embeddings.baseimportEmbeddingsfromtypingimportListclassBGEEmbeddings(Embeddings):""" 使用 BGE-M3 模型的 Embedding 类 支持稠密向量 + 稀疏向量混合检索 """def__init__(self,model_name:str="BAAI/bge-m3",use_fp16:bool=True,device:str="cuda"):""" Args: model_name: 模型名称(默认BGE-M3) use_fp16: 是否使用半精度(节省显存) device: 设备(cuda/cpu) """self.model=FlagModel(model_name,query_instruction_for_retrieval="为这个句子生成表示以用于检索相关文章:",use_fp16=use_fp16,device=device)defembed_documents(self,texts:List[str])-List[List[float

相关文章:

【大模型工程实践③】RAG 基础架构与完整实现

【大模型工程实践③】RAG 基础架构与完整实现:从0到1跑通 作者:AI学习者 | 来源:大模型工程实践学习系列 | 更新:2026年3月 【理论要点速览】 学习本篇前,建议先掌握以下核心理论(点击跳转): ① 为什么需要RAG? ② RAG vs Fine-tuning vs Long Context的决策框架 ③ …...

高效对接Tiktok电商API:PHP开发者的一站式解决方案指南

高效对接Tiktok电商API:PHP开发者的一站式解决方案指南 【免费下载链接】tiktokshop-php Unofficial Tiktok Shop API Client in PHP. Use API version 202309 and later 项目地址: https://gitcode.com/gh_mirrors/ti/tiktokshop-php 在瞬息万变的电商生态中…...

【GitHub 加速计划】:解决智能家居插件获取难题的网络适配方案

【GitHub 加速计划】:解决智能家居插件获取难题的网络适配方案 【免费下载链接】integration 项目地址: https://gitcode.com/gh_mirrors/int/integration 在智能家居系统搭建过程中,插件获取往往是用户面临的首要障碍。许多优质的智能家居插件托…...

解锁TikTok电商API:PHP开发者的零门槛接入方案

解锁TikTok电商API:PHP开发者的零门槛接入方案 【免费下载链接】tiktokshop-php Unofficial Tiktok Shop API Client in PHP. Use API version 202309 and later 项目地址: https://gitcode.com/gh_mirrors/ti/tiktokshop-php 跨境电商API对接新选择&#xf…...

3D场景重建与实时渲染:XV3DGS-UEPlugin技术指南

3D场景重建与实时渲染:XV3DGS-UEPlugin技术指南 【免费下载链接】XScene-UEPlugin 项目地址: https://gitcode.com/gh_mirrors/xv/XScene-UEPlugin XV3DGS-UEPlugin是由XVERSE Technology Inc.开发的基于Unreal Engine 5的混合编辑插件,提供Gaus…...

MoMask终极指南:5分钟学会AI生成3D人体运动动画

MoMask终极指南:5分钟学会AI生成3D人体运动动画 【免费下载链接】momask-codes Official implementation of "MoMask: Generative Masked Modeling of 3D Human Motions (CVPR2024)" 项目地址: https://gitcode.com/gh_mirrors/mo/momask-codes 想…...

GCC编译选项详解与工程实践指南

GCC编译选项深度解析与工程实践指南1. 编译选项基础概念1.1 编译过程与选项作用GCC编译过程分为预处理、编译、汇编和链接四个阶段。编译选项通过控制这些阶段的行为,实现不同的编译目标:# 完整编译流程示例 gcc -E main.c -o main.i # 预处理 gcc -S…...

Dify私有化部署实战:如何在企业内网快速搭建AI开发平台(含Docker镜像打包技巧)

Dify私有化部署实战:企业内网AI开发平台搭建全攻略 1. 企业内网部署Dify的核心价值与挑战 在数字化转型浪潮中,越来越多的企业开始将AI能力纳入核心业务系统。Dify作为开源的大语言模型应用开发平台,其私有化部署方案尤其适合对数据安全有严…...

别再硬编码了!Qt QTabBar标签宽度自适应窗体的5种实战方案对比(附完整代码)

Qt QTabBar标签宽度自适应窗体的5种实战方案深度评测 每次看到Qt界面中那些挤在一起或稀疏分布的标签页,总让人想起超市货架上摆放不齐的商品——既影响美观又降低使用效率。作为中级Qt开发者,你一定遇到过这样的困境:当窗体尺寸变化时&#…...

如何实现Flomo到Obsidian的高效迁移与无缝衔接?一站式数据迁移工具全解析

如何实现Flomo到Obsidian的高效迁移与无缝衔接?一站式数据迁移工具全解析 【免费下载链接】flomo-to-obsidian Make Flomo Memos to Obsidian Notes 项目地址: https://gitcode.com/gh_mirrors/fl/flomo-to-obsidian 当你需要将积累已久的Flomo笔记迁移到Obs…...

SparkFun ICM-20948 Arduino库:DMP硬件协处理器深度实践指南

1. 项目概述SparkFun ICM-20948 Arduino Library 是面向 TDK InvenSense ICM-20948 九轴惯性测量单元(9DoF IMU)的官方 Arduino 封装库,专为 SparkFun 9DoF IMU Breakout - ICM-20948(Qwiic 接口版本,型号 SEN-15335&a…...

Agent 性能优化:降低 Token 消耗的 5 个技巧

Agent 性能优化:降低 Token 消耗的 5 个技巧系列文章: 《AI Agent 开发实战》第 7 期 难度等级: ⭐⭐⭐⭐ 预计耗时: 35 分钟🎯 本文目标 学会优化 AI Agent 性能: ✅ 减少 Token 消耗✅ 提高响应速度✅ 降…...

WebGL BIM可视化:浏览器端BIM解决方案的技术实践与行业应用

WebGL BIM可视化:浏览器端BIM解决方案的技术实践与行业应用 【免费下载链接】xeokit-bim-viewer A browser-based BIM viewer, built on the xeokit SDK 项目地址: https://gitcode.com/gh_mirrors/xe/xeokit-bim-viewer 如何解决浏览器端BIM模型加载慢、操…...

Llama-3.2-3B效果体验:Ollama简单操作,产出专业级文案

Llama-3.2-3B效果体验:Ollama简单操作,产出专业级文案 1. 模型概览:小而精的文本生成专家 Llama-3.2-3B是Meta最新推出的轻量级语言模型,在3B参数规模下实现了接近大模型的文本生成质量。经过指令微调优化后,它在多语…...

打破数据标注瓶颈:Label Studio如何让AI训练效率提升300%?

打破数据标注瓶颈:Label Studio如何让AI训练效率提升300%? 【免费下载链接】label-studio Label Studio is a multi-type data labeling and annotation tool with standardized output format 项目地址: https://gitcode.com/GitHub_Trending/la/labe…...

水库调度员必看:动态规划在月度发电计划中的5个避坑指南

水库调度员实战指南:动态规划在月度发电计划中的5个关键避坑策略 在水利工程领域,水库调度是一项集科学性、技术性和艺术性于一体的复杂工作。作为水库调度员,我们每天都在与时间、水量和电力需求进行着精妙的博弈。而动态规划作为一种强大的…...

YOLOv8目标检测新玩法:用VMamba替换C2f模块,我在DDSM医疗数据集上mAP涨到了0.724

YOLOv8与VMamba融合:医疗影像目标检测的突破实践 在医疗影像分析领域,目标检测技术正经历着从传统卷积神经网络到新型架构的转变。最近,我们将YOLOv8模型中的C2f模块替换为VMamba模块,在DDSM乳腺X光数据集上取得了mAP 0.724的显著…...

用LDA模型挖掘微信聊天秘密:Gensim实战教程(含pyLDAvis可视化)

用LDA模型挖掘微信聊天秘密:Gensim实战教程(含pyLDAvis可视化) 微信聊天记录中隐藏着大量有价值的信息,从日常对话到重要决策,这些文本数据就像一座未被充分挖掘的金矿。本文将带你用Python中的Gensim库构建LDA主题模型…...

LVGL 7.11.0 Chart控件实战:5分钟搞定动态心率折线图(附完整代码)

LVGL 7.11.0 Chart控件实战:5分钟搞定动态心率折线图(附完整代码) 在嵌入式设备上实现流畅的数据可视化一直是开发者的痛点。LVGL作为轻量级图形库,其Chart控件能完美解决这一问题。本文将手把手教你用LVGL 7.11.0的Chart控件&am…...

视觉语言模型VLM高效部署:基于TensorRT-LLM的C++推理实践

1. 视觉语言模型VLM与TensorRT-LLM的黄金组合 视觉语言模型(VLM)这两年真是火得不行,它能让AI同时理解图片和文字,像人类一样看图说话。但实际部署时,很多团队都会遇到性能瓶颈——特别是用Python直接推理时&#xff0…...

别再让电费偷偷溜走!用智能时间开关改造家里的热水器和空调(附保姆级选购指南)

别再让电费偷偷溜走!用智能时间开关改造家里的热水器和空调(附保姆级选购指南) 每到月底收到电费账单时,那种"钱不知不觉就溜走"的感觉总是让人心疼。特别是热水器和空调这两大"电老虎",它们往往…...

三步掌握Dark Reader:从入门到精通的护眼浏览解决方案

三步掌握Dark Reader:从入门到精通的护眼浏览解决方案 【免费下载链接】darkreader Dark Reader Chrome and Firefox extension 项目地址: https://gitcode.com/gh_mirrors/da/darkreader Dark Reader是一款能够为任何网站启用深色模式的浏览器扩展&#xff…...

Phi-4-Reasoning-Vision基础教程:双卡4090环境安装、镜像拉取与端口映射

Phi-4-Reasoning-Vision基础教程:双卡4090环境安装、镜像拉取与端口映射 1. 环境准备与快速部署 在开始之前,请确保您的系统满足以下要求: 硬件配置:至少两张NVIDIA RTX 4090显卡(24GB显存)软件环境&…...

项目分享|VibeVoice:微软开源的前沿语音AI

引言 在语音合成(TTS)技术领域,长篇幅、多说话者、低延迟的自然语音生成一直是行业痛点。传统TTS模型往往受限于生成时长、说话者数量或实时响应速度,难以满足播客制作、智能对话等复杂场景需求。微软开源的VibeVoice框架彻底打破…...

煤矿电液阀系统摄像仪护套连接器 DLJ01(1000)参数

在煤矿综采工作面液压支架电液控制系统中,摄像仪护套连接器 DLJ01(1000)作为矿用本安型摄像仪与电源、信号传输线缆之间的专用接口,承担着视频信号与供电的稳定传输任务。其型号中的“1000”代表线缆长度为1000mm(1米)&#xff0c…...

日志分散难管理?用Visual Syslog Server实现企业级日志集中监控的5个实战方案

日志分散难管理?用Visual Syslog Server实现企业级日志集中监控的5个实战方案 【免费下载链接】visualsyslog Syslog Server for Windows with a graphical user interface 项目地址: https://gitcode.com/gh_mirrors/vi/visualsyslog 痛点诊断:日…...

正点原子IMX6ULL史诗级新内核Linux7.0移植教程(5)梭哈配置主线设备树

正点原子IMX6ULL史诗级新内核Linux7.0移植教程(5)梭哈配置主线设备树 仓库已经开源,可以研究补丁和直接看完整教程:https://github.com/Awesome-Embedded-Learning-Studio/imx-forge 有任何意见欢迎提出 PR!会第一时间…...

别再让PowerBI报告挤成一团了!用按钮+书签,一个页面搞定趋势和明细分析

PowerBI交互设计进阶:用按钮与书签打造空间魔术 当业务分析报告遇上数据爆炸时代,信息过载与界面拥挤成为每个分析师挥之不去的噩梦。我曾见过某零售企业的季度分析仪表板——12个图表密密麻麻挤在A4纸大小的画布上,趋势线相互缠绕&#xff…...

用Python+Control库实现倒立摆LQR控制:从建模到仿真全流程

用PythonControl库实现倒立摆LQR控制:从建模到仿真全流程 倒立摆问题一直是控制理论中的经典案例,它不仅能帮助我们理解线性二次调节器(LQR)的核心思想,还能锻炼我们解决实际工程问题的能力。本文将带你从零开始&#…...

Matlab散点图进阶:如何用颜色、大小和形状搞定六维数据可视化(附完整代码)

Matlab散点图进阶:如何用颜色、大小和形状搞定六维数据可视化(附完整代码) 在数据分析领域,我们常常需要处理包含多个维度的复杂数据集。传统的二维或三维图表已经无法满足这类数据的可视化需求。本文将深入探讨如何利用Matlab的s…...