news 2026/10/17 4:03:10

用AI编程工具(Claude Code/Codex)高效开发PyQGIS脚本与插件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用AI编程工具(Claude Code/Codex)高效开发PyQGIS脚本与插件

前阵子有位做GIS开发的同学分享了自己用Claude Code、Codex配合QGIS干活的经验,从批量处理矢量数据到生成插件骨架,不是空谈,我照着跑了一遍,也踩了他教程里没写的几个坑。这篇内容就围绕这套工作流展开:AI编程工具怎么接入QGIS的Python环境,日常批量任务怎么让AI帮你生成PyQGIS脚本,以及在插件开发里它们到底能帮到什么程度。如果你正在用QGIS做数据处理、想提升自动化水平,又不想一句一句啃PyQGIS官方文档,这篇应该能帮你省下几周摸索时间。

1. 为什么要用AI编程工具操作QGIS

1.1 QGIS的自动化能力,比你想的强得多

很多老用户用QGIS还是纯鼠标流:加载图层、开Processing工具、点参数、等结果。这套流程没问题,但一旦数据量上来、需求变成“每个月对一百个区县做同一套处理”,纯手工就非常痛苦。QGIS其实从出生那天起就内置了一套完整的Python接口,也就是PyQGIS。官方控制台、Processing算法、插件体系全部建立在它之上。换句话讲,QGIS像是一把功能齐全的瑞士军刀,而PyQGIS是让那些刀片自动弹出来的机关。

我见过不少同行第一次打开QGIS的Python控制台时都是一脸懵:明明界面上的功能都认得,怎么一到代码就不知道从哪下手。这不是Qt和Python能力低,而是PyQGIS的API体系太庞大——图层、要素、几何、坐标系、布局、标注、服务端,每一块都自成体系。日常处理中往往只需要其中二三十个类,但官方文档的检索成本实在高,很多方法名字又臭又长。这就给AI编程工具留出了巨大空间。

1.2 AI编程工具解决的是“从需求到代码”的翻译成本

没用AI之前,写一个PyQGIS脚本的典型路径是:先在QGIS里用鼠标操作一遍,确认参数,再打开文档搜索对应API,把代码一行行拼起来,最后粘回控制台跑,报错了再回去查文档。整个过程少则半小时,多则一下午。

用Claude Code或Codex之后,流程变成:直接把需求用大白话描述给AI,像“把这个多边形图层的字段A按逗号拆成三列,并保留原来的字段”,AI生成脚本后粘贴进QGIS控制台微调即可。我曾经试过一个很无聊的批量任务:给几十个图层统一改字段别名、加字段注释。手写可能要翻四五个类,AI在十几秒内给出完整代码,我只需要检查一下图层名字和对数据做一次小样本验证。

这个“从需求到可运行代码”的翻译过程,恰恰是AI最擅长的事。它不擅长的是帮你理解业务逻辑和空间关系,所以后面我会反复强调:上下文信息给得越足,结果越接近能用。

1.3 Claude Code和Codex怎么选

Claude Code和Codex在定位上非常接近,都是能在项目目录里通过对话生成代码、修改文件、执行命令的编程代理。我两个都实测过一段时间,个人体感是:Claude Code更偏“驻场结对程序员”,它会读你项目里的文件、按你的指示做局部修改,也支持把文档文件、CLAUDE.md作为长期上下文,对QGIS这种需要大量API约定的场景很合适。Codex跟GitHub生态和仓库操作结合得更紧,适合在已有工程里做修补,比如给插件项目加个新功能模块。

不过就生成PyQGIS脚本这件事,两个工具拉不开本质差距。真正决定效果的是你喂给它的上下文够不够。Claude Code喜欢读CLAUDE.md,Codex更吃你当前终端对话里的描述,但二者都需要你把图层名、字段名、坐标系这些细节讲清楚。所以我建议不要纠结选谁,先装一个上手跑通流程,剩下的投入放在怎么写好需求描述上。

2. 实操环境搭建,别卡在第一步

2.1 确认QGIS自带Python环境

搭建环境这件事本身没什么技术含量,但很多人卡在第一步:搞不清自己该在哪里运行AI生成的脚本。QGIS安装包里自带一个专用Python环境,日常使用建议直接在QGIS的Python控制台里跑脚本,省去一堆PYTHONPATH配置。

打开QGIS后,菜单栏找“插件 → Python控制台”,在输入框执行:

import sys print(sys.executable) from qgis.core import QgsApplication print(QgsApplication.prefixPath())

如果你看到输出路径指向某个QGIS安装目录,说明当前控制台用对了解释器,PyQGIS能正常import。这一步的意义在于,AI生成脚本后,它默认假设你在QGIS进程内运行,所以第一步要确保这个进程真的能访问所有QGIS模块。

注意:QGIS控制台和系统Python是两套环境。系统Python里即便安装了qgis包也未必能正常初始化界面,原因在于QGIS的C++底层库依赖和插件路径是绑定的。除非你有明确理由做无界面批处理,否则第一推荐永远是“先用控制台跑通,再考虑外部化”。

2.2 在外部Python里调用PyQGIS的取舍

如果你确实需要在QGIS之外跑批量处理,比如定时任务、服务端脚本,那就得让外部Python找到QGIS的库。Windows下QGIS安装目录的bin文件夹里有python-qgis.bat,正常情况下它会自动设置好环境变量。手动配置的原理很简单:需要把QGIS的bin、python、python\qgis等目录加入PYTHONPATH。

一个常见的Windows示例是:

set PYTHONPATH=C:\Program Files\QGIS 3.28\bin;C:\Program Files\QGIS 3.28\apps\qgis\python;%PYTHONPATH% python my_script.py

Linux和macOS的路径则跟着安装目录走,通常类似:

export PYTHONPATH=/Applications/QGIS.app/Contents/Resources/python python my_script.py

不过我在实际测试里的体会是:外部环境的初始化还有很多坑,比如QGIS版本升级后路径变了、依赖库冲突、插件目录扫描出错。所以我个人更倾向于把AI生成的脚本留在QGIS控制台里执行,只有最终链路稳定后才迁移到外部自动化。

2.3 给Claude Code一份项目说明书

用Claude Code跑QGIS脚本,我建议先在工作目录里写一份CLAUDE.md,相当于给AI的“项目说明书”。这样每次对话时它都能主动读取,不需要你反复粘贴同样的背景。

# QGIS Python开发环境 - 使用 PyQGIS API,不要写 ArcPy。 - 默认坐标系使用 EPSG:4326,除非用户明确指定其他坐标系。 - QGIS表达式中字段名必须使用双引号,例如 "province_name"。 - 处理文件路径时,优先使用绝对路径,不要依赖相对路径。 - 生成代码前,先检查图层是否存在,避免 mapLayersByName 返回空列表。 - 输出到栅格文件时,请优先使用 GDAL 相关算法。

这份说明书的价值不止是约束格式,更关键的是帮AI避开PyQGIS里最容易翻车的几个常识性错误。比如字段名双引号问题,不知道会踩多少次坑。

2.4 Codex接入与用法差异

Codex的接入方式更偏向仓库级操作。在项目目录里打开终端,执行codex进入交互,或者用编辑器插件在文件上下文里对话。它同样能生成补丁、运行lint、执行测试,但和你对话的信息窗口通常更依赖当前打开的文件。

我的建议是,把同样的环境说明写进项目README或者单独放一个提示词文件。比如放在docs/ai-context.md,然后每次把该文件的路径丢给Codex,让它先读再动手。实测下来,这个方法比在对话里重复强调效果好很多。

提示:无论Claude Code还是Codex,都建议把QGIS版本号、PyQt5/PyQt6的版本也写进说明里。版本差异会直接导致import方式不同,AI如果不知道版本,经常会生成PyQt5或PyQt6混用的代码,然后跑起来报错。

3. 核心实操:用AI生成PyQGIS脚本搞定日常GIS任务

3.1 批量给矢量图层加椭球面积字段

很多GIS数据里没有面积字段,或者有但单位不对。最典型的需求是给区县面图层加一个“面积_km2”字段,保留两位小数。如果直接用geometry().area()算,在经纬度坐标系下会得到弧度平方的奇怪数字,所以必须用QgsDistanceArea做椭球面积计算。

给AI的提示词可以直接写:

帮我在QGIS里写一个PyQGIS脚本:读取图层名为“boundary”的面图层, 在属性表新增一个Double类型字段area_km2,保留两位小数。 面积使用WGS84椭球模型计算,单位换算为平方公里。 处理前先检查字段是否已存在。

参考脚本片段:

from qgis.core import ( QgsProject, QgsVectorLayer, QgsField, QgsDistanceArea, edit ) from PyQt5.QtCore import QVariant layer = QgsProject.instance().mapLayersByName("boundary")[0] da = QgsDistanceArea() da.setEllipsoid("WGS84") da.setSourceCrs(layer.crs(), None) new_field = "area_km2" if layer.fields().indexOf(new_field) == -1: layer.dataProvider().addAttributes([QgsField(new_field, QVariant.Double)]) layer.updateFields() with edit(layer): for f in layer.getFeatures(): geom = f.geometry() if geom.isNull() or geom.isEmpty(): continue area_m2 = da.measureArea(geom) layer.changeAttributeValue( f.id(), layer.fields().indexOf(new_field), round(area_m2 / 1e6, 2) )

这个场景很能说明问题:需求描述不难,但AI必须知道“要使用椭球面积而不是几何面积”“要判断字段是否已存在”“要跳过空几何”,否则脚本一到数据上就会出错。

3.2 空间连接:点落区县并回填区县名

第二类高频需求是空间连接。比如有一批POI点,希望知道每个点落在哪个区县,并把区县名称写回点图层的属性表。在Processing里对应的是“按位置连接属性”,AI生成时容易出现一个经典坑:在过滤表达式里把字段名写成单引号字符串。

我拿到的可用脚本大致长这样:

import processing from qgis.core import QgsProject points_layer = QgsProject.instance().mapLayersByName("poi_points")[0] region_layer = QgsProject.instance().mapLayersByName("counties")[0] result = processing.run("qgis:joinattributesbylocation", { "INPUT": points_layer, "JOIN": region_layer, "PREDICATE": [0], # 0 表示 intersects "JOIN_FIELDS_TO_BE_COPIED": ["county_name"], "METHOD": 0, "OUTPUT": "memory:joined" }) joined = result["OUTPUT"] # 如果想把结果写回磁盘 # QgsVectorFileWriter.writeAsVectorFormat( # joined, "/tmp/poi_with_county.shp", "UTF-8", # joined.crs(), "ESRI Shapefile" # )

这个例子里的诀窍是让AI明确列出要拷贝的字段列表。如果不写JOIN_FIELDS_TO_BE_COPIED,输出结果会把右表的所有字段都合并进来,属性表一下变成几十列,后续处理反而麻烦。

注意:空间连接之前,最好先确认两个图层的坐标系一致。如果一个是EPSG:4490、一个是EPSG:3857,处理引擎会自动做转换,但碰到大数据量时性能会明显下降,甚至出现部分要素在转换后相交失败的情况。AI感知不到这些,必须在提示词里主动说明“先检查坐标系”。

3.3 栅格批量裁剪与按掩膜导出

栅格处理是另一个AI能显著提效的领域。常规做法是把栅格整景裁到某个矢量边界范围,传统菜单操作需要先在工具栏里逐个选输入输出。用AI生成Processing脚本后,批量处理几十个栅格就非常轻松。

一个典型提示词:

写一个PyQGIS脚本,读取工作目录下的所有GeoTIFF文件, 用“study_area”图层作为掩膜,裁剪这些栅格, 输出为同目录下out文件夹中的tif文件。 注意输出路径必须存在,坐标系保持与输入一致。

对应的脚本会包含这样的核心片段:

import glob import os import processing from qgis.core import QgsProject, QgsRasterLayer mask_layer = QgsProject.instance().mapLayersByName("study_area")[0] for tif_path in glob.glob("/data/rasters/*.tif"): rlayer = QgsRasterLayer(tif_path, os.path.basename(tif_path)) if not rlayer.isValid(): print(f"跳过无效栅格: {tif_path}") continue out_path = "/data/out/" + os.path.basename(tif_path).replace(".tif", "_clip.tif") params = { "INPUT": rlayer, "MASK": mask_layer, "OUTPUT": out_path, } result = processing.run("gdal:cliprasterbymasklayer", params) print("完成:", result["OUTPUT"])

这里有一个很值得跟大家分享的坑:AI经常会生成相对路径输出,例如out/xxx.tif。QGIS对相对路径在不同操作系统下的理解非常不稳定,默认的工作目录可能是安装目录、也可能上次打开的项目目录,导致文件被写进莫名其妙的文件夹。所以我在提示词里一直强调输出绝对路径。

3.4 批量出图的脚本化

批量出图是QGIS里最繁琐又最值得自动化的环节之一。用菜单操作出一张图可能要一两分钟,但一百张图就要跑两小时,还不能做别的事。PyQGIS里可以用QgsPrintLayout、QgsLayoutExporter来编排和导出布局。

AI在这个场景里特别合适,因为它能快速生成布局初始化的样板代码。一个最小可用的批量出图脚本大概是这个思路:

from qgis.core import ( QgsProject, QgsPrintLayout, QgsLayoutExporter, QgsLayoutItemMap, QgsRectangle ) project = QgsProject.instance() layout = QgsPrintLayout(project) layout.initializeDefaults() layout.setName("批量出图") content = layout.itemById("Map") content.setRect(20, 20, 180, 120) # 设置地图范围 layer = QgsProject.instance().mapLayersByName("boundary")[0] extent = layer.extent() content.setExtent(extent) exporter = QgsLayoutExporter(layout) exporter.exportToImage("/tmp/output.png", QgsLayoutExporter.ImageExportSettings())

实际做一百张图时,通常是在循环里改变地图范围、换标题、改比例尺,再一个个导出。我建议把这个脚本拆成“构建模板布局+循环更新范围+导出”三个小步,分别让AI生成,再手工拼接。分裂任务比一次性生成完整脚本的成功率高得多。

3.5 给AI的需求四要素模板

从上面几个案例可以看出,让AI生成PyQGIS脚本能不能一跑就对,取决于需求描述里是否包含四个要素:

  1. 输入数据:图层名、文件路径、字段名;如果是从磁盘读取,要给绝对路径。
  2. 操作逻辑:裁剪、连接、加字段、出图,越具体越好,最好带上处理算法的名称。
  3. 输出格式:内存图层、shapefile、GeoPackage、tif、png,以及字段精度。
  4. 坐标系与异常处理:EPSG编号、空几何怎么处理、字段已存在时是否跳过。

可以把这四要素直接写在提示词的结尾,例如:

请求:批量计算图层面积。 输入:图层 boundary,字段 area_km2; 操作:用 QgsDistanceArea 计算椭球面积;空几何跳过; 输出:保留两位小数的Double字段,更新原图层; 坐标系:EPSG:4326。

我实测的效果是,只要这四项写清楚,AI生成脚本的返工率能降低一大半。

4. 进阶:让AI帮你搭QGIS插件骨架

4.1 手工搭插件最繁琐的地方在工程结构

QGIS插件开发虽然不算难,但第一次做的人都会被工程结构劝退。一个最简插件也需要同时准备metadata.txt、__init__.py、main.py、resources.qrc、图标和资源文件,少一个QGIS就不认。而且metadata.txt里的字段要求严格,写错一个版本号插件就被标记为“不兼容”。

标准的插件目录结构像这样:

my_plugin/ │ metadata.txt │ __init__.py │ main.py │ resources.qrc │ icon.png

metadata.txt至少要包含:

name=My Plugin qgisMinimumVersion=3.0 description=测试插件 version=0.1 author=Your Name email=you@example.com

__init__.py里需要一个工厂函数:

def classFactory(iface): from .main import MyPlugin return MyPlugin(iface)

这些内容对写过插件的人来说是常识,但对新手而言,即使AI生成,也需要知道每个文件的用途,否则出了问题根本不知道该查哪里。

4.2 给AI的插件级提示词长什么样

让Claude Code或Codex生成整个插件目录,我的建议是不要只说“帮我创建一个插件”,而是给出尽量完整的结构约定。

请生成一个QGIS 3插件,目录名为hello_plugin. 功能:在菜单栏新增“示例插件”,点击弹出消息框显示当前活动图层名。 需要包含以下文件: - metadata.txt,版本0.1,兼容QGIS 3.28 - __init__.py,提供classFactory - main.py,实现initGui和unload,用QAction注册菜单 - resources.qrc,包含一个简单图标资源 不用生成额外资源编译文件。

AI生成的代码里通常会把initGui和unload都写对,但要特别检查两处:一是QAction是否设置了正确的父对象,二是菜单插入位置是否返回了对象引用。否则插件一卸载就抛错。

4.3 AI生成插件后如何装进QGIS

插件目录放哪,是另一个高频错误点。Windows下QGIS默认会扫描%APPDATA%\QGIS\QGIS3\profiles\default\python\plugins,Linux一般在~/.local/share/QGIS/QGIS3/profiles/default/python/plugins。把AI生成的整个文件夹放进去,重启QGIS,再到“插件管理”里勾选。

有个坑值得单独提:如果AI生成的代码里引用了resources_rc.py,但这个文件不存在,QGIS会在加载插件时报“ModuleNotFoundError”。这时需要用QGIS自带解释器编译资源文件:

pyrcc5 -o resources_rc.py resources.qrc

不同QGIS版本的编译器名字可能有差异,新版可能用pyrcc,但思路一致。编译完再重启QGIS。

4.4 插件调试与日志查看

插件不像控制台脚本,报错了不一定弹窗。用QgsMessageLog.logMessage把关键信息写进QGIS日志面板是个好习惯:

from qgis.core import QgsMessageLog, Qgis QgsMessageLog.logMessage("插件加载完成", "MyPlugin", level=Qgis.Info)

然后通过“视图 → 面板 → 日志消息”查看。AI生成代码时,我通常会让它把异常捕获也加进去,这样即使出错也能在日志里看到具体位置,而不是插件直接消失。

提示:插件开发时如果改了代码,不需要每次都重启QGIS。可以安装“Plugin Reloader”这类第三方工具,一键重载插件,调试效率高很多。频率很高的开发者建议提前装好。

5. 常见问题与排查技巧实录

5.1 字段名的双引号问题

现象:AI生成代码里用到"province_name"的地方被写成了'province_name',或者在QGIS表达式过滤器中变成普通字符串,结果运行时报Name 'province_name' is not defined。

原因:在PyQGIS的表达式引擎里,字段引用必须使用双引号,字符串字面量用单引号。AI在纯Python语境里习惯了单引号表示字符串,容易混淆。

解决:在CLAUDE.md或提示词里明确写“QGIS表达式中字段名必须使用双引号”,同时检查AI生成的每一条filter、expression、setFilterExpression调用。

5.2 外部Python环境无法import qgis.core

现象:在系统Python里执行from qgis.core import *报错,找不到模块。

原因:系统的Python解释器与QGIS内置Python不是同一个环境。外部Python没有绑定QGIS安装路径。

解决:先确定运行环境满足bin目录和python目录在路径里。最稳妥的做法是直接用QGIS安装包里的python-qgis.bat或qgis_process来启动脚本,而不是用python xxx.py。

判断代码:

import sys print(sys.executable)

如果输出路径里看不到QGIS相关目录,那就是环境不对。

5.3 空间连接结果全部落空

现象:AI生成的joinattributesbylocation跑完后,属性表全是空值,或者完全没匹配到任何要素。

原因:最常见的是两个图层坐标系不一致,导致实际几何范围错位;还有一种是图层里有空几何,或者掩膜图层边界没盖住目标要素。

解决:跑连接前先打印两个图层的CRS,并且用一小块范围做目视检查;如果坐标系不一致,先执行一次重投影:

processing.run("qgis:reprojectlayer", { "INPUT": layer, "TARGET_CRS": "EPSG:4326", "OUTPUT": "memory:reprojected" })

5.4 插件装上但菜单不出现

现象:插件已在“已安装”列表里勾选,但菜单栏找不到对应入口。

原因:initGui没有正确执行,通常是QAction没有添加到指定菜单,或者类名和metadata.txt里的name不匹配导致类工厂加载失败。

解决:先看“日志消息”面板里有没有红色报错;再检查__init__.py的classFactory是否有导入错误;最后确认main.py里的类名与工厂函数引用一致。

5.5 让AI自己解释错误信息

这里分享一个我测试下来很实用的技巧:AI生成的代码出错时,不要只贴上“报错了”三个字,而是把完整的堆栈信息原样复制给它,问一句“这是什么原因,应该怎么改”。这些编程工具读错误信息的能力远超很多人想象。

我的一次实测里,脚本抛了一个TypeError: argument of type 'NoneType' is not iterable,我看一眼就知道是图层没加载。但把堆栈丢给Claude Code后,它直接精准定位到某一行并提示“这里应该检查地图图层是否为空”,比我自己回忆错误信息对应的代码含义还快。

6. 实操心得与避坑清单总结

6.1 我对这套工作流的总体感受

整套跑下来,我的体感是:AI编程工具在PyQGIS脚本生成上确实能压缩大量时间,尤其是批量遍历、字段操作、Processing调用这些有固定模式的代码。但它不擅长处理地理数据里的隐性约束:坐标系不一致、几何拓扑错误、字段值脏数据。代码有没有跑通是一回事,空间逻辑对不对是另一回事。

所以我不建议把AI生成的结果直接当成最终答案。更合理的姿势是:把一个复杂的批处理任务拆成多个小步骤,每个小步骤让AI生成代码,然后丢到QGIS控制台里跑通,观察输出是否符合GIS逻辑。任务拆得越小,AI的出错率越低,也越好人工校验。

6.2 提示词里附字段信息能省大量返工

把图层字段列表直接粘贴到提示词里,是我试过最有效的提效手段。比如:

图层 boundary 的字段列表: fid, province_name, city_name, area_km2, population 需要新增一个字段 population_density,计算 population / area_km2。

AI有了精确的字段上下文,就不会再臆想出region_name这种不存在的字段。省下的是来回对话纠错的时间。

6.3 哪些场景还是该手写代码

AI虽然强,但有几类工作我仍倾向手写:一是需要遍历几十万要素并做复杂空间计算的任务,手写能明确做内存和索引优化;二是涉及自定义坐标变换公式或依赖外部库的情况,AI很难理解你引用的第三方函数;三是复杂插件里需要精细控制界面布局和信号槽绑定的部分,AI懂得越多,越容易生成“看起来对但一交互就崩”的代码。

反过来,只要任务是标准GIS操作组合,例如裁剪、连接、字段计算、布局导出,完全可以放心交给AI。

6.4 给新手的上手路线建议

如果你之前没写过PyQGIS,建议按这个顺序练:

  1. 在QGIS控制台里手动执行一个“加载图层并打印字段名”的最简脚本,理解图层对象、属性表、输出这三个基本概念。
  2. 找一个自己每周会重复三次以上的鼠标操作,试着让AI生成对应脚本,跑通并核对结果。
  3. 再尝试让AI生成一个带按钮和对话框的最简插件,理解插件生命周期。
  4. 最后再上批量任务、复杂布局这些高难度场景。

把第1步跑通了,后面每一步都会顺很多。因为那些常见的“字段名双引号”“绝对路径”坑,在第1步的小例子里就能发现并形成肌肉记忆。

我在实际测试中最明显的一个感觉是,AI生成脚本的速度快得惊人,但真正决定脚本能不能跑起来的,仍然是GIS基本功——坐标系对不对、字段名有没有写错、图层数据是否有空几何。把这些信息完整告诉AI之后,它确实能帮你省掉大量查文档和试错的时间。如果你也准备上这套工作流,我建议第一件事不是纠结选Claude Code还是Codex,而是找一台装了QGIS的电脑,把一个你最近用鼠标做了十遍的重复操作,试着让AI用PyQGIS写出来。跑通了,你自然就明白它到底能帮你省多少事。

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

链表插入操作从原理到实战:头插、尾插、任意位置与哨兵节点

链表插入操作:从原理到实战的完整拆解如果你学过数据结构,大概率绕不开链表。链表这玩意儿,说难不难,说简单也不简单,尤其插入操作,无论笔试、面试还是实际项目,几乎场场必考。很多人背了代码就…

作者头像 李华
网站建设 2026/10/17 4:01:48

零基础上手 Claude Code:从安装到写出第一个本地脚本

如果你和我一样,属于那种“平时不搞专业开发,但是经常有些小脚本、小工具的念头,想让电脑帮自己干点活”的人,那你一定经历过这种场景:脑子里有个特别清晰的功能,打开编辑器盯着屏幕,却一个字都…

作者头像 李华
网站建设 2026/10/17 4:01:38

Unity游戏上架Steam:Steamworks.NET接入与SteamPipe发布全攻略

把Unity游戏真正挂到Steam商店,我最初以为就是打包一个exe丢到Steam后台点一下上传。真动手才发现,Steamworks这套体系跟大多数人预想的完全不一样,光是SteamPipe、Depot、分支这些术语就能把第一次接触的人绕晕。所以我想把用Steamworks.NET…

作者头像 李华
网站建设 2026/10/17 4:01:25

协同强化学习优化测试Harness调度:从单智能体到QMIX实战

1. 从一次“下午四点半卡顿”说起:Harness为什么需要协同1.1 先明确:这里说的Harness到底是什么Harness 这个词在技术圈里指代比较杂。它可能是 CI 里的测试执行框架,也可能是模型评测里的“评测器具”,还可能是设备联调用的物理夹…

作者头像 李华
网站建设 2026/10/17 4:00:36

EUV光刻机:核心路由器芯片制造的精密设备体系解析

1. 我为什么说光刻机是“路由器制造”的题眼第一次看到“核心路由器加工/制造机床(含EUV极紫外线光刻机)”这个标题时,很多人第一反应是:路由器属于通信设备,光刻机属于半导体制造设备,两个领域怎么会被放在…

作者头像 李华
网站建设 2026/10/17 4:00:14

进一步激发大模型推理能力:提示工程、自洽采样与评估实战

先说个我自己的经历。前阵子我在一组多步数学推理题上反复折腾提示方案,最让我困惑的不是某个模型答不出题,而是同一个模型、同一道题,换个问法就从“一步一步来”变成“直接给结论”,准确率能掉二十个百分点以上。那时候我就意识…

作者头像 李华