AI测试实战:从接口用例到缺陷预测的完整方案
简介这份AI赋能软件测试源码包聚焦人工智能在软件测试全流程中的落地应用适合测试工程师、软件研发人员以及对智能测试方案感兴趣的开发者使用。资源围绕需求分析、测试计划、测试用例设计、用例执行与结果报告等关键环节展示了如何借助百度文心一言大模型与标准化AI互动指令格式将缺陷预测、数据收集和结果比较等任务自动化从而提升测试质量与效率。包体信息方面压缩包共3个文件包含1个inscode工程配置、1个html页面和1个gitignore文件整体仅7KB结构紧凑便于快速浏览和部署。目前已有124人学习下载。通过阅读源码读者可以直观理解AI指令的具体写法与流程编排思路参考其中测试用例生成和缺陷分析的设计模式并将其迁移到自己的测试项目中具有较强的实践参考价值。1. AI赋能软件测试先解决回归漏测再谈让AI自己写测试“AI赋能软件测试”这个概念今年已经很热了但我发现不少团队第一脚就踩空一上来就让模型写全部用例结果生成的用例要么重复要么跑到一半因为一个字段名错误直接失败压根没法进自动化体系。我自己更愿意把AI放在测试体系里两个“老手靠眼力、新手靠运气”的位置上一个是回归阶段的长尾场景补全另一个是结果分析阶段的异常定位。这两个位置既不要求AI对业务理解得很深又能实打实减少漏测。这篇文章不打算讲某个现成工具怎么用而是分享一套可以自己搭起来的源码骨架用大模型生成接口用例用视觉模型做UI回归差异定位用轻量机器学习模型做缺陷风险排序。每一节都给了可执行代码片段和参数经验也会把我们踩过的坑单独拿出来说。适合正在搭AI测试框架的工程师也适合想判断“AI测试到底值不值得投人”的技术负责人。2. 用大模型生成接口用例提示词模板、结构化输出与去重2.1 为什么先做接口层用例生成接口层是AI介入成本最低的位置。UI自动化需要维护选择器App端需要处理设备环境而接口用例的输入输出是结构化的大模型不需要掌握前端实现仅凭一份接口文档就能生成一批还过得去的正反向用例。我见过不少团队把AI测试的第一站放在E2E上结果一周后全在修脚本因为一个小小的选择器变动就能让模型生成的步骤作废。相比之下接口层生成的用例即使有偏差修起来也就是改一个字段名。更重要的一点是接口层生成的用例可以放进校验程序自动过滤。模型生成的用例你不可能全信但你可以校验请求体是不是符合接口定义的必填项状态码是不是符合错误语义。这个“先生成、后校验”的流程是在给后面整个人工智能测试地基打底。没有一批可靠的历史用例后面章节要讲的UI回归分析和缺陷预测都缺了数据源。如果你们接口文档已经沉淀成OpenAPI/Swagger格式直接让模型读JSON就好如果还是零散的Word文档建议先转成统一格式再处理否则提示词里给一批格式不一致的接口定义模型会按自己的理解编造字段后面的校验阶段会非常痛苦。这条是我自己的血泪经验格式不统一的时候不要开始生成。2.2 一份能直接跑的用例生成代码下面这段代码是我工程里保留的骨架。它调用大模型服务把某个接口的路径、方法、参数模板发给模型要求它输出严格JSONimport json from openai import OpenAI # client相关配置走环境变量不要写死在代码里 client OpenAI() def build_prompt(api_spec: dict) - str: poi { 路径: api_spec.get(path), 方法: api_spec.get(method), 参数: api_spec.get(parameters, []), 请求体: api_spec.get(requestBody, {}), 必填项: api_spec.get(required, []), } return f你是资深测试工程师请围绕下面的接口定义生成测试用例。 输出要求 - 只输出JSON数组不输出任何解释文字 - 每个用例包含id、场景、Method、Path、Headers、Body、期望状态码、关键断言 - 至少覆盖正常值、边界值、缺少必填、多传字段、错误类型、鉴权失败 接口定义 {json.dumps(poi, ensure_asciiFalse, indent2)} def call_model(api_spec: dict): resp client.chat.completions.create( modelyour-model, messages[ {role: system, content: 你是测试用例生成助手只返回结构化JSON。}, {role: user, content: build_prompt(api_spec)}, ], temperature0.2, response_format{type: json_object}, ) raw resp.choices[0].message.content return json.loads(raw)逻辑说明构建提示词时先把接口定义序列化成一个JSON对象模型看到的是真实字段名而不是渲染后的文档这样可以降低编造字段的概率。用response_format约束输出必须是JSON同时把temperature调到0.2是为了让模型在同一个接口上多次生成时保持稳定防止相同场景因为文本表达的漂移变成两份“看起来不同”的用例。参数说明temperature不是越低越好0.2左右是一个相对均衡的起点低于0.1用例会变得过于雷同高于0.7会出现大量无效变体。接口定义特别长时需要先截断或按操作拆分否则模型容易遗漏后面的字段。如果你用的是私有化部署的模型请额外检查上下文长度接口文档超过8K字符时建议拆成多条请求而不是让模型强行一口吞下。还有一点容易踩坑模型生成的“期望状态码”不建议直接当成最终结果执行。它只是参考构造请求后要以服务端实际返回为准否则接口一旦有版本差异你会被一份“看起来正确”的期望值带偏。我把这视为黑匣子问题模型不知道真实环境里的历史遗留行为。2.3 参数约束与去重防止模型编造数据模型生成用例最常见的两个毛病是重复和幻觉。同一个“缺少必填参数”的场景可能生成十遍只是换了字段顺序而“多传字段”里可能混入一个并不存在的字段名。因此必须做两道过滤第一道是字段合法性校验拿接口定义里的required和properties列表去核对生成结果第二道是去重用请求体哈希加文本相似度组合。先精确去重再做模糊去重防止模型把参数顺序打乱后重复提交。import json from difflib import SequenceMatcher def normalize_case(case): # 排序body字段避免顺序不同导致无法识别重复 if isinstance(case.get(Body), dict): return json.dumps(case[Body], sort_keysTrue, ensure_asciiFalse) return json.dumps(case, sort_keysTrue, ensure_asciiFalse) def dedup_cases(cases, threshold0.8): 精确匹配相似度匹配threshold越低过滤越狠 seen_bodies [] result [] for c in cases: body_key normalize_case(c) if any(SequenceMatcher(None, body_key, old).ratio() threshold for old in seen_bodies): continue seen_bodies.append(body_key) result.append(c) return result这段去重代码的逻辑是先对请求体里的JSON字段做sorted_keys归一化让{a:1,b:2}和{b:2,a:1}落到同一个文本再用SequenceMatcher计算相似度判断两个用例是不是同一个场景的变体。threshold默认0.8意思是两份请求体文本相似度超过80%就保留第一条。这个阈值需要根据接口字段数量调整字段少的接口可以收到0.7字段多且参数枚举值多的建议放到0.9否则容易把两个真正有差异的边界用例误删。字段合法性校验的逻辑更简单按接口定义里的属性名白名单过一遍不合法的直接丢弃同时记录一条日志方便你观察模型是不是在持续幻觉。到这里AI生成接口用例的基本链路就是定义接口 - 模型生成 - 合法性校验与去重 - 入库。后面要做回归分析时这批用例可以作为数据底座。下一章我们来看看视觉AI是怎么介入UI回归并解决“老用例还在绿、页面样式已经悄悄变了”的经典问题。3. 用视觉AI做UI回归最小截图对比与阈值调优3.1 为什么不用像素diffUI回归如果用传统像素diff最烦的不是diff本身而是“合法的变化”被当成Bug字体渲染导致个别像素偏移、动画帧没有停稳、第三方广告位内容变来变去。这些问题会让全量diff每天产生几百条告警最后测试同学直接不看告警等于回归白做。AI在这里的价值不是替代diff而是给diff加一个“注意力区域”识别出业务核心区块过滤掉已知的动态区域、背景纹理和字体微调。我见过有团队把视觉AI做成训练模型来判断页面是否美观那条路又贵又难解释而且测试同学不敢拍板。其实回归里最有价值的点是异常区域定位不需要模型理解美不美观只需要回答图和图哪里不一样就行。这也是为什么我一直把方案控制在OpenCV加规则的方式而不是动不动就上大模型。规则的方式可解释出问题时你能指出是阈值调太高还是mask画错了。我现在的常见做法是分两步走截图前先固定分辨率、字体、动画时长截图后用OpenCV提取差异区域再用一个面积和位置的过滤逻辑或者叠加一张mask告诉模型哪里不用看。这个过程不需要训练模型但已经能把误报降下来一大半。3.2 截图差异区域识别代码import cv2 import numpy as np def diff_boxes(before_path, after_path, mask_pathNone, threshold30, min_area50): before cv2.imread(before_path, cv2.IMREAD_GRAYSCALE) after cv2.imread(after_path, cv2.IMREAD_GRAYSCALE) if before.shape ! after.shape: # 尺寸不一致直接判失败通常说明页面渲染没有稳定 return [(-1, -1, after.shape[1], after.shape[0])] diff cv2.absdiff(before, after) if mask_path is not None: mask cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) # 把mask区域置0表示这部分变化不参与计算 _, inv_mask cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY_INV) diff cv2.bitwise_and(diff, diff, maskinv_mask) # threshold是像素差阈值min_area是噪声区域过滤阈值 _, thresh cv2.threshold(diff, threshold, 255, cv2.THRESH_BINARY) contours, _ cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) boxes [cv2.boundingRect(c) for c in contours if cv2.contourArea(c) min_area] boxes.sort(keylambda b: b[2] * b[3], reverseTrue) return boxes逻辑说明先把两张截图转成灰度图用absdiff计算每个像素的亮度差得到一张差值图。差值图不直接判断而是先经过mask过滤把已知动态区域的像素置为0再通过threshold把像素差大于threshold的点变成白色最后用findContours把白色区域连成一个一个的矩形框。返回的框按面积从大到小排序排在第一个的就是最明显的视觉变化区域。参数说明threshold30是一个常用起点代表单像素亮度差超过30才认为发生了变化。字体微调造成的抖动通常维持在10到20之间所以30这个值可以吃掉一部分微差。min_area50表示小于50像素的噪点直接忽略这个参数主要用来过滤输入框光标、分割线之类的小物件。如果页面上有大面积背景纹理建议先加mask而不是堆高threshold因为阈值太高会把真正的样式错乱也一起吞掉。这里还要单独提一下base截图的管理。base图跟版本号走比如在base/v1.2.0/目录下存放一套触发diff前检查当前代码版本有没有匹配的base没有就直接跳过不硬截。因为同一套页面在不同分辨率下渲染差异很大base图和测试机分辨率不一致时差异框会铺满整张图告警等于没跑。3.3 忽略区域与阈值调优视觉回归不是一锤子买卖参数需要跟随页面变化持续维护。我一般会做一张“忽略区域清单”把轮播图、时间戳、广告位、评论区的坐标提出来生成mask文件存入测试仓库。UI版本更新之后mask会跟着失效这时候跑一次当前结构下的base截图重新标一下就好。调参时建议这样开始先固定threshold30, min_area50跑一周把误报截图收集起来看是哪一类问题。如果是字体渲染差异加高threshold或把固定字体打进CI镜像如果是动态组件画mask如果是页面布局整体右移那通常不是阈值问题而是截图窗口宽度不稳定需要先固定浏览器窗口尺寸。先解决环境再调参数不要反过来。最容易翻车的一个点是用高分辨率截图跑低分辨率模型。OpenCV处理灰度图时会把高分辨率图原样读入计算量直线上升。对于1280宽度以上的截图建议先resize到宽度800再处理速度会快很多而且差异框的位置可以按比例映射回原图坐标不影响结果。def resize_for_diff(img, target_width800): h, w img.shape[:2] if w target_width: return img scale target_width / w return cv2.resize(img, (target_width, int(h * scale)), interpolationcv2.INTER_AREA)这段resize逻辑会把宽度压到800长宽按比例缩小。INTER_AREA在缩小图像时比默认的线性插值更能保留边缘特征避免缩小后文本区域糊成一片。压缩后算出来的差异框坐标再按scale放大回原图坐标画到原图上给测试人员看就可以了。mask的来源有三种一种是手工在图上圈适合页面元素基本固定的后台系统一种是用元素定位拿到绝对坐标适合有稳定自动化框架的场景还有一种是跑一次模板匹配把已知组件的截图在页面上找出来适合组件复用度高但位置会变的页面。三种方式成本不一样你们至少先用手工坐标撑住等误报变少了再去上自动化。4. 轻量缺陷预测把历史测试数据喂给模型4.1 数据拼装与特征选择缺陷预测是AI测试里听起来最“玄学”的部分因为大家默认缺陷是没法提前预测的。但放到软件测试领域我们不需要预测哪个模块一定出错只需要回答一个问题这次变更的风险是不是偏高如果偏高就多安排一轮人工回归。这个场景对精度要求没那么高反而很适配机器学习。特征选择上我用的特征集不复杂特征类型说明changed_lines数值本次变更代码行数越大风险越高changed_files数值变更文件数衡量影响面changed_modules数值涉及的模块数has_related_test0/1是否携带关联测试用例commit_hour0-23提交时刻用于发现深夜匆忙提交past_defect_rate0-1模块过去30天缺陷密度coverage_estimate0-1本次变更的覆盖率估算值这里没有用复杂的代码语义特征因为大部分CI系统里拿不到干净的调用图硬拼反而产生噪声。数据从代码托管平台API拉取时经常出现字段缺失比如提交时间为空、模块归属不对。缺失率超过20%的特征建议直接去掉否则模型会用假规律填充空白。宁可少用几个字段也不要让缺失值侵蚀训练。注意缺陷预测的目标变量是“这个MR合并后是否引发线上或测试环境失败”不是“测试用例是否失败”。这两个概念容易混。如果目标是后者模型学到的其实只是“哪个用例容易挂”对变更评审没有直接价值。目标定义从一开始就要定对否则后面所有工作都是白做。4.2 一个可执行的缺陷预测脚本import pandas as pd from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import cross_val_score # 历史特征表每一行代表一次代码变更 df pd.read_csv(history_features.csv) feature_cols [ changed_lines, # 变更行数 changed_files, # 变更文件数 changed_modules, # 涉及模块数 has_related_test, # 是否有关联测试用例0或1 commit_hour, # 提交时间的小时数用于捕捉深夜提交风险 past_defect_rate, # 模块过去30天的缺陷率 coverage_estimate, # 覆盖率估算值 ] X df[feature_cols] y df[is_failed] # 该变更是否最终失败 model RandomForestClassifier( n_estimators300, max_depth8, class_weightbalanced, random_state42, ) scores cross_val_score(model, X, y, cv5, scoringrecall) print(5折召回率均值:, round(scores.mean(), 4))逻辑说明这里选择随机森林而不是深度学习原因很直接样本量通常只有几千条特征量不大树模型更容易训练也不会因为特征之间的复杂交互而难以解释。class_weightbalanced可以在正负样本不均衡时自动调整权重让模型不会一边倒地预测“没有缺陷”。参数说明n_estimators300和max_depth8这两个值不是越大越好。树的数量超过300以后精度提升非常有限但训练和推理速度都会明显变慢深度限制在8左右可以防止模型把历史数据里的个别噪声当成规律。scoringrecall是缺陷预测项目里必须看的指标因为漏报一个高风险变更的代价比多报两个误报高得多。建议把precision和F1一起打印不要单看准确率。4.3 如何验证预测是否有用轻量模型很容易在离线验证时看起来“很准”但一上线就露馅。我习惯的做法是做时间回溯验证用前三个月的特征数据做训练用后两周的数据做测试而不是随机划分样本。随机划分会把未来信息泄漏进训练集得到的结果会偏乐观。时间回溯更贴近真实使用方式也是判断“能不能用”的最直接方式。验证指标上比起准确率我更关注“风险命中率”。假设模型把20%的变更标记为高风险那这20%里至少要覆盖80%以上的真实失败变更这个模型才有拦在门禁前供参考的价值。如果达不到那就把阈值调高只输出最高风险的5%变更宁可不报也不要瞎报。如果样本量少于1000条我建议不要直接上模型先用简单规则顶住变更行数超过300且没有关联测试用例的变更一律标记为需要额外回归。规则虽然粗糙但至少不会像小样本训练出来的黑匣子那样让你没法解释结论。样本不足时“排序”比“判定”有用得多。5. AI测试避坑指南模型偷懒、样本偏差与结果不可解释5.1 模型生成的用例相似度过高覆盖率不升反降现象AI生成用例跑完一版用例总数增加了一倍但行覆盖率和分支覆盖率几乎没有变化。原因大模型在提示词的约束下倾向走常见路径长尾分支反复生成同一个场景去重阈值设得偏低导致大量“表面不同、实质相同”的用例被保留下来把覆盖率稀释了。解决把生成式用例改成迭代式生成。先跑一轮代码覆盖率把未覆盖的分支列表回填到提示词里让模型针对未覆盖分支写用例再用实测覆盖率去验证。去重阈值建议从0.85起步字段多的接口可以到0.9不要为了追求“用例多”而牺牲覆盖有效性。5.2 视觉回归误报集中在字体渲染和图片懒加载现象每天告警几十条打开截图看不是标题字号差了1px就是某个图片占位符暴露在页面上。原因截图像素diff对亚像素变化敏感CI环境里的字体没有和设计稿统一图片懒加载导致截图时资源还没渲染完成触发误报。解决在CI镜像里固定字体文件关闭页面动画等待网络事件完成后截图。对图片区域单独画mask不做diff。threshold不要从10起步尽量从30起步先把环境问题压住再降阈值。如果实在无法控制字体环境就先看整体相似度再回到局部差异不要一上来就把两条路径全打开。5.3 缺陷预测在样本不足时看似很准现象离线回测准确率80%但投到MR评审后发现完全没用高风险和低风险变更混在一起。原因样本量只有几百条失败样本占比不足5%模型学到的规律全是“大多数变更不会失败”准确率被负样本拉高。这种准确率不代表预测能力。解决先看混淆矩阵和recall少看准确率。样本不足时只做风险排序不做“是否失败”的二元判断人工复核时取前20%风险分即可。等数据积累到几千条再考虑更复杂的模型。5.4 AI生成测试数据泄漏了开发环境信息现象生成出来的测试数据里出现内网域名、真实用户名测试报告被同步出去后引发信息安全告警。原因模型从代码仓库里的API文档、注释或历史请求样本中学到了敏感信息提示词里粘贴了真实请求体等于把敏感信息直接送进外部模型服务。解决在提示词里使用脱敏后的样例数据接口定义同步过滤掉内部域名生成结果过一层关键词和正则过滤器把内网地址、邮箱、手机号的模式替换成测试专用数据。这条应该作为AI测试上线的第一条红线不要等出事了再补。5.5 模型升级后生成结果风格突变现象之前稳定跑了两个月的用例生成链路某天开始输出格式不一致部分用例校验失败率突然升高。原因模型版本升级后输出分布发生改变模型对同样提示词的行为和之前不一样了。解决在请求参数里固定模型版本不跟随默认升级生成结果不直接入库先做一次有效性校验校验失败率超过阈值时自动暂停生成链路留出时间排查是提示词问题还是模型行为变化。这个机制必须在第一天就加进去否则你很难区分是生成链路坏了还是模型悄悄变了。6. 把AI测试源码收进CI一个最小接入方案与迭代习惯我通常不会把AI测试结果设为硬性门禁因为模型本身有误报硬卡会导致团队绕过规则。更好的方式是把它作为“风险提示”由测试负责人做最终判断。最小接入可以做成一个开关变量import os def should_run_ai_test(): if os.getenv(AI_TEST_ENABLED) ! true: return False return os.getenv(CI_EVENT) in (merge_request, schedule) def main(): if not should_run_ai_test(): print(AI测试未开启跳过) return # 依次执行接口用例生成与校验、UI差异框提取、缺陷风险排序 case_report generate_and_dedup_cases() ui_boxes diff_boxes(base.png, current.png) risk_list predict_risk() upload_report(case_report, ui_boxes, risk_list) if __name__ __main__: main()这段代码只做三件事检测开关和事件类型跑三个AI测试模块把结果上传到CI的产物区。AI_TEST_ENABLED用来灰度切换先在小项目试跑跑通后再推广CI_EVENT限制只在合并请求和定时任务时执行不在每次push都跑避免资源浪费。接入之后的习惯比代码更重要。我会给AI测试结果单独开一个页面让测试人员可以看得到模型输出的“可疑区截图”和“高风险变更列表”同时提供“误报”按钮人工反馈会回流成下一轮训练数据。这样模型才不是黑匣子而是一个不断被校准的过滤器。这条路径不强求一步到位先从一个接口模块、一个UI页面、一个业务模块开始迭代三个月后你就能判断这套源码骨架值不值得继续投入了。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Agent系统四根支柱:会话、工具、MCP与记忆的工程实践

Agent系统四根支柱:会话、工具、MCP与记忆的工程实践

1. 从标题拆解一个Agent系统的四根支柱第一次看到“会话、工具、MCP、记忆”这四个词摆在一起,我的直觉是:这是一个把Agent从“能聊天”推进到“能干活”的完整能力清单。会话解决的是上下文怎么组织,工具解决的是手能伸多长,MCP解…

2026/10/14 21:29:12 阅读更多 →
TensorFlow生产环境实战:从训练到部署的避坑指南

TensorFlow生产环境实战:从训练到部署的避坑指南

说实话,每次一聊到 TensorFlow,总有人会问我一句:“现在还有必要深入学习它吗?社区里到处都在说别的框架更好用。”我在某团队带项目这几年,从最初的图像分类 Demo 到后来的产线级推理服务,TensorFlow 一直…

2026/10/14 21:29:12 阅读更多 →
模型检查实战:有界模型检查与抽象细化全解析

模型检查实战:有界模型检查与抽象细化全解析

“Model checking Part IV”这个系列走到第四篇,默认你已经把基本概念过了一遍:状态空间、时态逻辑、Kripke结构,以及最原始的那套“穷举所有可达状态”的验证思路。可一旦你真的拿它去验证工业级系统,立刻就会撞上三堵墙&#xf…

2026/10/14 21:29:12 阅读更多 →

最新新闻

KNN图像识别入门:从PCA降维到手写数字分类实战

KNN图像识别入门:从PCA降维到手写数字分类实战

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

2026/10/15 1:37:04 阅读更多 →
52pojie 的 IoT 固件分析:熵值会告诉你哪一段藏了东西

52pojie 的 IoT 固件分析:熵值会告诉你哪一段藏了东西

副题:魔术字、香农熵、结构体——拆开一个固件镜像的三把钥匙 摘要:吾爱破解软件调试区里有一篇《IoT 漏洞分析之模拟环境搭建》(6037 回复),同区还有《记一次手机付费充电设备研究》(7196)。这…

2026/10/15 1:37:04 阅读更多 →
双 11 核心链路变异测试大摸底:让关键交易状态机测试坚不可摧

双 11 核心链路变异测试大摸底:让关键交易状态机测试坚不可摧

在电商交易系统中,最核心、也最令架构师夜不能寐的领域内核,永远是有限状态机(Finite State Machine, FSM)。 在双 11 狂风暴雨般的流量洪峰冲击下,一笔交易订单在几毫秒内可能经历极其错综复杂的状态跳转:…

2026/10/15 1:37:04 阅读更多 →
u-boot-2020.07在Exynos4412上的电源时钟内存初始化实战

u-boot-2020.07在Exynos4412上的电源时钟内存初始化实战

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

2026/10/15 1:37:04 阅读更多 →
行业术语同义词图谱挖掘:从非结构化语料到标准化知识库的语义归一

行业术语同义词图谱挖掘:从非结构化语料到标准化知识库的语义归一

在将海量企业内部非结构化语料(如研发设计文档、售后工单、专家经验纪要、行业研报)汇聚到统一知识库并驱动 RAG(检索增强生成)系统时,工程团队往往面临一个巨大的语义鸿沟——“专有名词的极度多样性与非标准性”。 在…

2026/10/15 1:37:04 阅读更多 →
工业机器人坐标系全解析:从原理到标定实操

工业机器人坐标系全解析:从原理到标定实操

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

2026/10/15 1:36:03 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/14 7:53:34 阅读更多 →