B+树与HNSW——数据库索引与向量检索的两座丰碑
一、两类检索,两套解法做后端的同学应该都有体会:检索这件事,本质上分两种。 第一种是精确检索——"查 id = 10086 的记录"、"查工资在 1万~2万之间的员工"。结果必须一个不多、一个不少,错了就是事故。 第二种是近似检索——"找和这段文字意思最像的文档"、"找长得最像的这张脸"。结果只要**"差不多"就行**,漏掉一两个冷门候选完全可以接受,但速度必须快到毫秒级。 这两种需求,各自催生了各自的事实标准: 精确检索 → B+ 树(MySQL InnoDB、PostgreSQL、SQLite 的默认索引结构) 近似检索 → HNSW(Milvus、Weaviate、Qdrant、FAISS 的主流索引结构) 它们名字里都带个"树"或"图",但设计哲学天差地别。这篇把它们放一起掰开揉碎地对比——搞清楚它们各自解决什么问题、为什么长成这样、什么时候该用哪个。 二、B+ 树:为磁盘而生的"多路平衡树"2.1 ...
相机 RGA 硬件加速实战:把图像预处理从 CPU 搬到 2D 加速单元
一、相机预处理是怎么拖垮检测的做智能摄像头、机器人视觉的人几乎都踩过同一个坑:摄像头采集的 YUV 数据哗啦啦地进来,你的检测模型嗷嗷待哺地等着 RGB 输入,中间还得做缩放、裁剪、旋转。 你一开始图省事,用 OpenCV 的 cvtColor + resize 在 CPU 上跑。结果画面一复杂、分辨率一高,CPU 占用直接飙到七八十,帧率掉得惨不忍睹,整个板子热得能煎鸡蛋。 这就是典型的「CPU 预处理瓶颈」:算法本身还没发力,数据搬运和格式转换就把系统拖垮了。问题根子在——YUV 转 RGB、缩放、裁剪这些 2D 图像操作,根本不该占用通用 CPU 的算力。 以 Rockchip RK3588 上一块四路 1080P 智能门禁为例:每路都要把 NV12 格式的 YUV 流实时转成 RGB,并缩放到模型要的 300×300。纯 CPU 方案下,四核 A76 全开、占用率接近 100%,帧率勉强 15 帧,延迟肉眼可见。 二、RGA 是什么:Rockchip 的 2D 图像加速单元这时候,RK3588 内置的一个「神器」该登场了——RGA(Raster Graphic Accel...
CUDA编程模型深度解析——从线程层次到性能优化实战
一、为什么要学 CUDA:CPU 的困境与 GPU 的答案作为 C++ 工程师,我们习惯了"多线程 + 锁"的并发模型。但当你面对数据密集型计算——向量相加、矩阵乘法、图像滤波、神经网络推理——CPU 的多核会迅速撞到天花板。 举个直观的例子:两个 1000 万长度的数组逐元素相加。 CPU 单线程:约 30ms CPU 16 线程(OpenMP):约 3ms GPU(CUDA):约 0.3ms GPU 能快两个数量级,靠的不是"更强的核心",而是海量的简单核心: 1234567891011121314┌─────────────────────────── CPU ───────────────────────────┐│ Core0 Core1 Core2 ... Core15 ││ (复杂, 大缓存, 乱序执行, 4~5GHz) │└────────────────────────────────────────────...
RoPE旋转位置编码——让大模型"记住"字词顺序的旋转魔法:读《RoFormer》论文有感
一、为什么大模型需要"位置"?作为一名长期写 C++ 和关注大模型的工程师,我最早对**位置编码(Positional Encoding)**产生兴趣,是因为一个看似反直觉的问题: Transformer 本身,是"看不见顺序"的。 自注意力机制(Self-Attention)计算的是两个 token 之间的"相关程度": 1Attention(Q, K, V) = softmax(Q·Kᵀ / √d) · V 注意这个公式——Q·Kᵀ 是点积,衡量的是内容相似度。把"我爱你"和"你爱我"送进 Transformer,如果不加位置信息,模型看到的几乎是一模一样的东西。因为"我"和"你"不管谁在前谁在后,它们的点积都一样。 这就引出了一个大问题:语言是讲究顺序的。"猫追老鼠"和"老鼠追猫"完全是两回事。所以我们必须给每个 token 注入"它是第几个"的信息——这就是位置编码存在...
读代码前必运行的五个Git命令——快速诊断代码库健康状况
本文灵感来源于文章《The Git Commands I Run Before Reading Any Code》 一、为什么读代码前要先看Git历史作为一个 C++ 工程师,我接手过很多新项目。以前我总是迫不及待地打开代码编辑器,试图从第一行代码开始理解整个系统。但我发现,这种方法效率很低——我常常在代码迷宫中迷失方向,不知道哪里是核心、哪里是坑。 后来我学到了一个重要的技巧:在打开任何代码文件之前,先运行几个 Git 命令,从提交历史中获取代码库的诊断画像。 这就像看医生之前,护士会先测体温、量血压一样。Git 历史能告诉我们: 谁构建了这个系统? 哪里是问题集中的地方? 团队是充满信心地迭代,还是小心翼翼地拆炸弹? 项目是在加速还是在衰退? 二、命令一:谁是代码改动最频繁的文件1git log --format=format: --name-only --since="1 year ago" | sort | uniq -c | sort -nr | head -20 运行结果示例: 12345156 src/core/engine.cpp 8...
string_view——现代C++的零拷贝字符串视图
一、为什么需要string_view作为一个 C++ 工程师,我相信很多人和我一样,写过无数次这样的代码: 12345678void process(const std::string& str) { // 只是读取,不修改 std::cout << str.size() << std::endl;}process("hello");process(std::string("world"));process(std::string_view("test")); 每次调用 process("hello") 时,都会创建一个临时的 std::string 对象,拷贝字符串内容,然后在函数结束时销毁它。这是一种不必要的开销。 同样的问题也存在于从 std::string 中截取子串时: 12std::string s = "hello world";std::string substr = s.substr(0, 5); ...
RAG原理就一句话——检索、拼接、加工:写给想祛魅的你
系列导读:本文是"检索与 RAG"系列的第三篇(收尾篇)——前两篇分别认识了 RAG、深挖了检索环节的坑,本篇回归本质,用一句话看穿 RAG 的骨架。本系列阅读顺序: 《RAG检索增强生成——让大模型学会翻书作答》(认识 RAG) 《权重大却不相关——BM25检索失效场景与两阶段救赎》(深挖检索环节) 本文《RAG原理就一句话——检索、拼接、加工》(回归本质,收尾) 一、RAG 被讲复杂了打开任何一篇 RAG 教程,你会看到:向量数据库、embedding、切分策略、重排、混合检索、RRF 融合、引用溯源、评估指标……名词堆成一座山。 但如果你剥掉所有包装,RAG 的原理真的只有一句话: 用传统软件工程的办法,把用户输入对应的知识搜索出来,拼到大模型的提示词里,让大模型帮你二次加工一下。 就这么简单。私域文件知识库问答是这样,联网搜索是这样,企业内部文档检索也是这样——框架完全同构。 这篇不教你搭系统,只帮你把 RAG 看穿:它到底是什么、每一环在干什么、为什么教程写得天花乱坠。 二、拆开看:三个环节,一个都不新RAG 的全流程可以拆成三个环节: ...
权重大却不相关——BM25检索失效场景与两阶段救赎
系列导读:本文是"检索与 RAG"系列的第二篇——在《RAG检索增强生成——让大模型学会翻书作答》认识了 RAG 之后,本文深挖 RAG 的检索环节:为什么纯 BM25 词法检索会"权重大但不相关",以及两阶段检索如何救赎。本系列阅读顺序: 《RAG检索增强生成——让大模型学会翻书作答》(认识 RAG) 本文《权重大却不相关——BM25检索失效场景与两阶段救赎》(深挖检索环节) 《RAG原理就一句话——检索、拼接、加工》(回归本质) 一、一个让人抓狂的现象:分数越高,越不对前司做经典 OA 系统时,我负责文档检索模块。文章通过 BM25 分片、倒排索引计算权重,前端搜索按权重排序返回"相关性最高的文档"。 一开始很顺。直到有一天,运营同事拿着截图来找我: "搜'差旅报销流程',排第一的是一篇《2024 年度行政费用总结》——里面'报销'两个字出现了 27 次。我们想看的《差旅费报销实施细则》,排到了第七页。" 我第一反应是权重算错了。查了一遍公式,没错——B...
RAG检索增强生成——让大模型学会翻书作答:读《Retrieval-Augmented Generation》论文有感
系列导读:本文是"检索与 RAG"系列的第一篇——先认识 RAG 是什么(为什么需要它、它的架构是什么)。本系列共三篇,阅读顺序如下: 本文《RAG检索增强生成——让大模型学会翻书作答》(认识 RAG) 《权重大却不相关——BM25检索失效场景与两阶段救赎》(深挖检索环节的坑) 《RAG原理就一句话——检索、拼接、加工》(回归本质,一句话看穿 RAG) 一、大模型的知识困境作为一个 C++ 工程师,我一直在思考一个问题:为什么大语言模型知道很多东西,但又常常"胡说八道"? 比如,如果你问 GPT-3 "2024年美国总统是谁",它可能会给你一个错误的答案——因为它的知识截止到2021年。更糟糕的是,它可能会编造一个不存在的事实,还说得煞有介事。 这就是大模型的"知识困境": 知识过时:训练完成后,参数就被冻结了,无法获取最新信息 容易幻觉:经常生成看似合理但实际上错误的内容 缺乏可解释性:无法追溯答案的来源 专业知识不足:对于冷门或专业领域的知识,模型的准确性大打折扣 这正是《Retrie...
const&万能引用的陷阱——现代C++参数传递的正确姿势
本文灵感来源于知乎专栏文章《最后的绅士》 一、一条刻在肌肉记忆里的铁律作为一个 C++ 工程师,我相信很多人和我一样,脑子里都刻着一条铁律: "传参用 const&,拷贝贵。" 这条规则在很多场景下确实是正确的。当函数只是观察参数,不作任何修改时,使用 const& 可以避免不必要的拷贝: 1234567double norm(std::vector<double> const& xs) { double sum = 0.0; for (double x : xs) { sum += x * x; } return std::sqrt(sum);} 这个函数只是读取向量的元素,不会修改它。使用 const& 是完全合理的选择。 但是,这条铁律在一种场景下会完全失效——当函数的工作是转发参数的时候。 二、const& 毁掉一切的场景让我们来看一个看似人畜无害的包装类: 12345678910template <clas...
设计模式真的很烂吗:读《Design Patterns Suck》有感
一、偶然读到一篇"离经叛道"的文章今天偶然看到一篇标题很刺眼的文章:"Design Patterns Suck"(设计模式很烂)。作为一个从 C++ 起步、曾经把《设计模式》奉为圭臬的程序员,我带着好奇和一丝抵触点了进去。 文章的观点非常激进: "设计模式被高估了、滥用了,而且常常是完全不必要的。" "设计模式不过是丑陋的变通方案,因为我们的编程语言不够强大、不够灵活,无法表达我们真正想要的东西。" 读完之后,我陷入了沉思。这些话虽然刺耳,但似乎又有点道理。让我从自己的经历出发,谈谈对这个话题的看法。 二、我的设计模式之旅2.1 C++时代的"模式实践"我最早接触设计模式是在大学学习 C++ 的时候。那时候,《设计模式》这本书几乎是每个 C++ 开发者的必备读物。工厂模式、单例模式、观察者模式、策略模式……这些名词像咒语一样被反复念叨。 记得当时做一个简单的学生管理系统,我非要往里塞各种设计模式: 1234567891011121314151617181920212223242...
思维链提示——让大模型学会推理的神奇方法:读《Chain-of-Thought Prompting》论文有感
一、为什么大模型需要"思考"作为一个 C++ 工程师,我一直在思考一个问题:为什么大语言模型在处理简单任务时表现出色,但在需要多步推理的复杂问题上却常常翻车? 比如这个数学题: "小明有5个苹果,小红比小明多3个苹果,小李的苹果是小红的2倍。问小李有多少个苹果?" 标准提示下的模型可能会直接给出答案,但不一定正确。而如果让模型"一步一步思考",结果就会大不相同。 这正是《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》这篇论文要解决的问题。 二、什么是思维链提示(Chain-of-Thought Prompting)2.1 核心思想思维链提示(Chain-of-Thought Prompting,简称 CoT)的核心思想非常简单: 在提示中加入一些包含中间推理步骤的示例,让模型学会"一步步思考"。 对比一下两种提示方式: 标准提示(Standard Prompting): 12Q: 小明有5个苹果,小红...
Codex Desktop gpt-5.5调用失败解决方案
一、遇到问题今天在使用 Codex Desktop 0.142.2 时,发现一个非常令人困扰的问题:当我切换到 gpt-5.5 模型时,每次发送请求都会立即失败,错误信息是: 1This model is not supported when using X-OpenAI-Internal-Codex-Responses-Lite. 具体表现就是: 在 Windows 上打开 Codex Desktop,进入某个线程 切换模型到 gpt-5.5 发送任何提示词,请求都会立刻失败 没有任何助手回复产生 最奇怪的是,同一台机器上的 gpt-5.4 模型完全正常,而且就在同一天稍早的时候,gpt-5.5 在其他线程里还正常工作过。这说明不是简单的配置问题,而是某个动态变化导致的。 二、我的排查过程2.1 从错误信息入手看到这个错误信息,我首先注意到了 X-OpenAI-Internal-Codex-Responses-Lite 这个 HTTP 头。从命名来看,这应该是一种"轻量级响应模式"。 问题很明显:Codex 在请求时发送了这个 Lite 头,但 gpt...
算法早已实现:读AI寓言故事有感
一、迷雾森林里的算法灵魂最近让AI写了几篇关于算法的寓言故事,读来颇有感触。故事里,林大山在迷雾森林里"乱走"着探路,扔下石子做记号,碰到树就绕过去——这不就是RRT算法吗?当我看到这个隐喻时,忽然意识到:计算机算法并不是凭空创造的,它们早就以某种形式存在于我们的生活中。 我们总觉得算法是高深的、抽象的、只存在于代码世界里的东西。但事实上,算法的本质就是解决问题的方法和步骤。人类在几千年的生存实践中,早就摸索出了各种各样的算法,只是我们没有用"算法"这个词来称呼它们。 二、生活中的算法原型细细想来,生活中的算法无处不在。猜数字游戏是二分查找,每次将搜索范围缩小一半;找零钱是贪心算法,每一步都选择当前最优方案;地图导航是Dijkstra算法,从起点逐步扩展到终点;人生决策是动态规划,将大问题分解为子问题求解;手机通讯录是哈希表,通过哈希值直接定位存储位置。 算法的发展,其实是一个从生活到代码的抽象过程:观察现象 → 总结规律 → 形式化表达 → 代码实现 → 优化改进。以RRT算法为例,林大山在迷雾森林里随机探路是生活原型,通过随机采样快速探...
GBFS贪婪最佳优先搜索算法深度解析
一、从一个问路的场景说起假设你站在一个陌生城市的街头,想要去市中心的火车站。你手里没有地图,只有一个指南针和一张标注了火车站方向的简易示意图。 你会怎么走? 大多数人的选择是:朝着火车站的方向走,遇到岔路口就选那条看起来更靠近火车站的路。你不会绕到城市的另一头去试探,也不会把所有的路都走一遍。你只做一件事——每一步都选择看起来离目标最近的方向。 这种"跟着感觉走"的策略,在计算机科学中就叫做贪婪最佳优先搜索(Greedy Best-First Search,简称GBFS)。它是启发式搜索算法家族中最直观、最简单的一员,也是理解更复杂搜索算法(如A*)的基础。 二、GBFS的核心思想2.1 什么是启发式搜索在介绍GBFS之前,我们先来理解一个关键概念:启发函数(Heuristic Function)。 传统的搜索算法(如BFS、DFS)就像是蒙着眼睛找路——它们只知道自己走过了哪里,却不知道目标在哪里。而启发式搜索则像是睁开了眼睛,它通过一个"启发函数"来估算当前位置到目标的距离,从而引导搜索方向。 用一个简单的公式来表示: 1f(n) = ...
交叉编译深度解析——从工具链到 CMake 的完整实战
那个周四下午,CI 流水线已经跑了 47 分钟还没结束。我打开日志一看,QEMU 里模拟的 ARM 编译器正在以大约 1/20 的原生速度吭哧吭哧地编译我们的 C++ 项目。一个 make -j4 在 x86 服务器上 3 分钟搞定的事,在模拟环境里变成了一个多小时。这不是第一次了——但这是我们决定把所有 ARM 构建全部切到交叉编译的那一天。 交叉编译不是新鲜事物,但很多人对它的理解停留在"装个交叉编译器然后改一下 CC 变量"的水平。真正动手时会发现:头文件找不到、链接器报奇怪的错误、configure 脚本在各种检测中翻车。这篇文章要做的,是把交叉编译的完整链条拆开——从工具链三元组到 sysroot,从 CMake toolchain file 到容器化构建,每一步都有可复现的命令和踩过的坑。 一、先搞清楚一个核心事实交叉编译的本质一句话:编译器和目标平台之间隔着一个 ABI 鸿沟,你要做的所有事情都是在桥接这条鸿沟。 很多人以为交叉编译就是"换一个编译器"。不是。编译器只是产生目标平台指令的那一环。真正麻烦的是这四件事:...
CMake 链接时隐藏静态库导出符号:-Bsymbolic 与 --exclude-libs 深度解析
在大型 C/C++ 项目中,动态库(.so / .dll)往往会链接多个静态库(.a / .lib)作为内部实现。然而,默认情况下静态库的符号会被"穿透"到动态库的导出符号表中——外部调用者不仅能看见动态库自身的符号,还能看见所有被链接进来的静态库的符号。这会引发符号冲突、接口泄露、ABI 污染等一系列问题。本文将深入解析如何通过链接器标志 -Bsymbolic 与 --exclude-libs 彻底隐藏静态库的导出符号。 一、问题场景:静态库符号为何会"泄漏"1.1 一个典型场景假设你的项目结构如下: 123456uav/├── libinternal.a # 内部静态库(不希望对用户暴露)│ ├── engine.cpp # 内部引擎实现│ └── helper.cpp # 内部辅助函数├── uav.cpp # 动态库对外的接口└── CMakeLists.txt libuav.so 链接了 libinternal.a,你只希望对外暴露 u...
git pull 与 git pull --rebase 的差异
日常使用 Git 时,git pull 是最频繁的命令之一。但很多人不知道,git pull 实际上有两种截然不同的工作方式,它们在提交历史上产生的影响天差地别。本文将深入对比 git pull(默认 merge 模式)与 git pull --rebase 的核心差异,帮你做出合适的选择。 一、git pull 的本质:两步操作的快捷方式先厘清一个基本事实:git pull 不是原子操作,它是两条命令的组合。 12git pull = git fetch + git merge # 默认行为git pull --rebase = git fetch + git rebase # rebase 模式 第一步永远是 git fetch:从远程仓库下载最新的提交对象,更新本地的远程跟踪分支(origin/main),但不会动你的本地分支。 第二步才是差异所在——用什么方式把远程的更新"合入"你当前的工作。 二、默认模式:fetch + merge假设你和同事都在 main 分支上工作。你本地有两个新提交,同事推送了三个新提交。执行 git pull(默认...
一次与 AI 的代码重构对话实录:十一个决策如何成形
一、起点代码库主体为 C++,约 2000 行核心业务逻辑,运行在 ARM 嵌入式和 x86 双平台上,通过 MQTT 与远程设备通信,串口与多个外设交互。我在这个项目上工作了一年,近期整理出一份架构重构计划(Strand + Offload 模式),但缺少外部视角的校验。 我将代码库和重构计划一并提交给 AI,要求其以独立视角进行全面审查。AI 的初始动作是并行扫描目录结构、核心文件、依赖关系和 CMake 构建系统,在五分钟内建立起对代码库的整体理解。 二、第一轮:信息差暴露AI 输出了涵盖十个维度的架构评估报告——线程模型、瓶颈识别、改进方案、组件交互优化、可扩展性增强、第三方库集成策略、Device/DeviceNode 关注点分离、SystemFactory 设计模式改进、实施路线图、风险矩阵。 覆盖全面,但有三处与实际情况不符: 计算卸载方案中 ComputePool 的设计是冗余的。项目已引入 ZLMediaKit,其内置的 WorkThreadPool 可直接复用。 第三方库仅有 x86 预编译版本,而目标平台为 ARM,跨架构编译的管理策略未被考虑...
Vibe Check 即一切:读 Olshansky《Vibe Checks Are All You Need》
一、你每天都在做 Vibe Check,只是不承认Olshansky 在他的文章《Vibe Checks Are All You Need》里扔出了一个让人不太舒服但难以反驳的判断:日常实践中 ~99% 的 LLM "评估"本质上都是 vibe check——直觉驱动的、主观的、非量化的感受判断。 什么叫 vibe check?就是你打开 ChatGPT/Claude/Gemini,扔一个问题进去,看一眼输出,然后心里给出一个模糊结论:"还行""不太行""这次挺聪明""刚才那段胡说八道"。这个过程没有评分量表,没有对照基线,没有统计显著性计算——它纯粹是你作为人类用户对模型输出的一次主观感受采样。 大多数人不会把这种体验称为"评估"。他们会说"我只是在试用""我在了解这个模型""我先随便玩玩"。但 Olshansky 的观点是:别骗自己了,你就是在做评估——只不过用的是最原始的方式。...
一次 C++ 程序三重 bug 的调试之旅:double-free、静态初始化 fiasco 与 RTSP 死锁
借助 AI 在 30 分钟内定位并修复了三个偶发性崩溃问题。本文复盘整个排查过程,记录诊断思路和修复方案。 一、背景项目是一个基于 ZLMediaKit 的嵌入式多媒体客户端,运行在 ARM 平台上。最近重构了 RTSP 服务管理代码后,程序同时出现三个症状: 偶尔 double-free 崩溃(ARM 和 x86 都有) ARM 启动即段错误,x86 却正常 RTSP 服务无法正常退出(卡死) 前两个问题看起来像内存错误,第三个像死锁,直觉上互不相干。但折腾一圈后发现,三个 bug 共享同一个根——静态库与动态库的符号冲突。下面按排查顺序逐个说。 二、Bug 1:偶尔 double-free —— ELF 符号介入症状程序退出时偶尔报 double-free,不是每次都出现。valgrind 能抓到,但指向的调用栈涉及动态库的析构阶段,信息模糊。 排查过程让 AI 遍历 src/ 下所有源文件做内存管理分析。AI 很快从 CMakeLists.txt 中拎出一段关键注释: 1234# libcore_api.so 提供 toolkit 基础库符号(SocketHelpe...
AI 辅助调试的误区:为什么让 AI 直接修 bug 是低效的
一、你可能用错了 AI过去两周,我修复了一个 C++ 无人机地面站服务的两类问题: 内存问题:Valgrind 报告 112 个 use-after-free 错误,分布在关机顺序、容器清理、回调生命周期等多个维度。 性能问题:gperftools 火焰图显示 CPU 被三个瓶颈吞噬——一个 0.5ms 间隔的定时器线程独占 50.7% 采样,日志系统的无差别 flush 占 17.4%,protobuf 热路径深拷贝占 11.6%。 两次排查经历得出同一个结论:AI 最适合的角色不是"修 bug 的人",而是"读工具输出的人"。 这不是一个关于 AI 能力边界的哲学讨论。这是两组真实火焰图、112 个 Valgrind 错误、和 11 个代码修复的工程复盘。 二、一个典型的 AI 调试场景(以及它为什么失败)假设你遇到这样一个问题:程序在退出时偶尔 crash,日志的最后几行是乱序的。 如果你把出问题的代码直接丢给 AI: 1234567用户:这段代码退出时崩溃,帮我修一下void SystemFactory::stop() ...
C++ 服务崩溃复盘:从 Valgrind 112 个错误到零
一、十点夜晚的 Valgrind 日志那是一个周四的晚上。我已经盯着终端看了一个小时,屏幕上是一份 Valgrind 报告——112 个错误,全是 use-after-free。 123456789101112==3300263== Invalid read of size 1==3300263== at 0x4852A10: memmove==3300263== by 0x60818AD: basic_streambuf::xsputn==3300263== by 0x6073B64: __ostream_insert==3300263== by 0x15C2DB: operator<<==3300263== by 0x15C2DB: MqttClient::publish (mqttClient.cpp:382)==3300263== by 0x1935E7: LogPublisher::publish (LogPublisher.cpp:68)==3300263== by 0x191540: Logger::worker...
LoRa Mesh 下的高频 MQTT 通信:10Hz 消息洪流的可行性与实现方案
零、一个看似自相矛盾的需求前面的 Mesh 系列文章反复强调了一件事:LoRa 带宽极低,单信道不到 6 kbps。在这个前提下,如果有人对你说—— "我想在这个 LoRa Mesh 上跑 MQTT,10Hz 频率,大量消息。" 你的第一反应大概率是:不可能。 但先别急。这个需求并非凭空想象——工业传感器、无人机遥测、车辆追踪、机器人状态上报,这些场景天然需要高频数据流。即便在低带宽 Mesh 上,我们也可以通过一套组合策略让"10Hz MQTT over LoRa"在某些约束条件下变得可行。 这篇文章不讲"能不能",讲的是"在什么条件下能,以及怎么做"。 一、先算账:10Hz 到底要吃掉多少带宽1.1 标准 MQTT 在 LoRa 上的自杀式开销一个最小化的 MQTT v3.1.1 PUBLISH 报文的结构: 1234567891011┌──────────────┬────────┬───────┬─────────┬──────────┐│ Fixed Header │ Topic │ ...
DeepSeek v4 Pro 在 TRAE 中输出乱序问题的最终解决
四月底,我写了一篇《DeepSeek v4 Pro 在 TRAE 中输出乱序问题分析与解决》,详细记录了 DeepSeek v4 Pro 在 TRAE IDE 中出现词级/片段级输出乱序的问题,并给出了一个核心推测:DeepSeek v4 Pro 作为推理模型,在 SSE 流中同时发送 reasoning_content 和 content 两种字段,而 TRAE 的解析器未能正确分离它们。 一个多月过去了,问题已经解决。本文是最终篇——记录根因的确认、修复的实际发生方式,以及一个耐人寻味的事实:整个过程中,我们从未收到任何一封邮件回复。 一、时间线回顾 时间 事件 4 月中旬 首次在 TRAE 中配置 DeepSeek v4 Pro,发现长回复几乎必然乱序 4 月 27 日 发布问题分析文章,向 TRAE 和 DeepSeek 双方提交 issue / 反馈 4 月底 — 5 月中旬 不定期复测,乱序问题仍然存在。未收到任何官方邮件或 issue 回复 5 月 20 日左右 TRAE 推送了一次版本更新(Windows 客户端 + 内...

