[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fOr42q0k-4RBy2Y-EeoijfYBzdlNVwqCLnvOh-tXAUkY":3,"$fVpjfkCE32nb1peVHv8kprPj7g6XAquf0rWcrsUaGSGA":51},[4],{"id":5,"type":6,"title":7,"slug":8,"summary":9,"body":10,"coverUrl":11,"productScreenshots":12,"productLinks":13,"authorName":14,"authorUrl":15,"authorSubject":16,"category":17,"tags":22,"sourceLabel":43,"sourceName":43,"sourceUrl":43,"status":44,"seoTitle":43,"seoDescription":43,"canonicalUrl":43,"isFeatured":45,"sno":46,"sortOrder":47,"publishedAt":48,"updatedAt":49,"createdAt":50},"356aa99a-b365-43ef-96ae-f7e5117ec256","article","《我的世界》游戏模组开发指南：用AI构建你的第一个模组","mc-ai-coding","在整理在《我的世界》Java版本模组开发过程中的心得体会，系统性地介绍模组开发全流程","# 一、模组加载器\n《我的世界》模组加载器可分为两大类：\n- Fabric-轻量化，加载快\n- Forge\u002FNeoForge-高度集成，功能丰富\n\n从玩家数量来说，Forge和NeoForge的玩家数量大于Fabric，理论上来说更受欢迎（也可能是因为大部分整合包都选择使用Forge或NeoForge作为模组加载器）。\n## 1.1 Fabric加载器\n### 1.1.1 简介\nFabric加载器作为目前《我的世界》（版本>1.14）的主流加载器之一，模组库数量庞大，玩家数量稳定。部分复杂功能可能需要依赖外部模组。\n### 1.1.2 环境配置\nFabric加载器在配置环境时需要搭配正确版本的Gradle、Fabric Version、Fabric API 和 Fabric Loom。例如：对于Minecraft JE 1.20.1 Fabric版本，一般使用\n- Gradle 8.7\n- Fabric Version 0.18.3\n- Fabric API xxx\n- Fabric Loom 1.6-SNAPSHOT\n> 以上环境配置部分可详细参考[Fabric Wiki](https:\u002F\u002Fwiki.fabricmc.net\u002Fzh_cn:tutorial:setup)\n### 1.1.3 创建项目\n创建新项目时，推荐使用[Fabric官方模组模版生成器](https:\u002F\u002Ffabricmc.net\u002Fdevelop\u002Ftemplate\u002F)，按照需要设置模组信息：\n- Mod Name-模组显示的名称，不影响代码\n- Mod ID-模组标识符，嵌入代码中\n- Package Name-项目内部路径名，一般为“开发者.模组名”，也可以直接使用模组名（开发者可以作为项目“水印”\n> 推荐在Advanced Options中关闭Mojang Mappings\n## 1.2 Forge\u002FNeoForge加载器\n### 1.2.1 简介\nForge和NeoForge加载器作为目前市面上玩家数量最多的加载器，内置多种编程方法工具，在不依赖外部模组的情况下可以实现多种功能。\n### 1.2.2 环境配置\n一般情况下，1.20及以下版本使用Forge加载器，1.21及以上版本使用NeoForge加载器。其在配置时也有一定区别。在1.20\u002F1.21版本，使用Gradle 9.0和对应的Forge\u002FNeoForge版本。在官方网站可以下载完整的模版文件，一般不需要再过多调整。\n### 1.2.3 创建项目\n创建新项目时，推荐使用[Forge官方模组模版生成器](https:\u002F\u002Ffiles.minecraftforge.net\u002Fnet\u002Fminecraftforge\u002Fforge\u002F)\u002F[NeoForge官方模组模版生成器](https:\u002F\u002Fneoforged.net\u002F)。\n# 二、编程环境\n## 2.1 编辑器选择\n一般情况下，推荐使用[IntelliJ IDEA](https:\u002F\u002Fwww.jetbrains.com\u002Fzh-cn\u002Fidea\u002Fdownload\u002F?section=windows)，并安装[MinecraftDev插件](https:\u002F\u002Fplugins.jetbrains.com\u002Fplugin\u002F8327)（也可直接在编辑器设置中的插件市场下载并安装）。\n## 2.2 AI编程配置\n### 2.2.1 TRAE\n初次尝试推荐使用TRAE，在编辑器自带的插件市场即可下载安装，简单注册账号后即可使用。\n### 2.2.2 Claude Code\n对于有复杂需求或大型项目编程的项目，推荐使用Claude Code，同样可在插件市场找到。对于国内环境，推荐使用[火山引擎](https:\u002F\u002Fwww.volcengine.com\u002F)，具体配置操作详见[火山引擎官方指南](https:\u002F\u002Fwww.volcengine.com\u002Fdocs\u002F82379\u002F1928262?lang=zh)。\n## 2.3 环境配置操作\n我们可以粗略地将src文件夹内的文件当作项目文件，将src以外的部分当作环境文件。每当环境文件内容发生变化，都需要刷新Gradle，可点击代码栏右上角的刷新图标快速刷新，此时右下角会出现进度提示，若配置失败，将报错信息交给AI分析。\n# 三、模组项目结构介绍\n## 3.1 Fabric通用结构\n```\n{mod_name}\u002F\n├── build.gradle              # Gradle 构建脚本（依赖声明、任务配置）\n├── gradle.properties         # 版本属性与元数据\n├── settings.gradle           # Gradle 项目设置\n├── gradle\u002F\n│   └── wrapper\u002F              # Gradle Wrapper 配置\n├── src\u002F\n│   ├── main\u002F\n│   │   ├── java\u002F             # Java 源码根目录\n│   │   │   └── com\u002Fexample\u002Fmodid\u002F\n│   │   │       ├── {ModClass}.java          # 主初始化类\n│   │   │       ├── {ModClass}Client.java    # 客户端初始化类（可选）\n│   │   │       ├── item\u002F                    # 物品相关类\n│   │   │       ├── block\u002F                   # 方块相关类\n│   │   │       └── mixin\u002F                   # Mixin 类目录\n│   │   │           └── ExampleMixin.java\n│   │   └── resources\u002F\n│   │       ├── fabric.mod.json              # 模组元数据（必需）\n│   │       ├── {modid}.mixins.json          # Mixin 配置（如使用）\n│   │       └── assets\u002F{modid}\u002F\n│   │           ├── lang\u002F\n│   │           │   ├── en_us.json           # 英文本地化\n│   │           │   └── zh_cn.json           # 中文本地化\n│   │           ├── models\u002F\n│   │           │   ├── item\u002F                # 物品模型定义\n│   │           │   └── block\u002F               # 方块模型定义\n│   │           ├── textures\u002F\n│   │           │   ├── item\u002F                # 物品纹理\n│   │           │   └── block\u002F               # 方块纹理\n│   │           └── blockstates\u002F             # 方块状态定义\n│   └── client\u002Fjava\u002F          # 客户端专用源码（分离架构时）\n├── run\u002F                      # 开发环境运行目录（自动生成）\n└── build\u002F                    # 构建输出目录（自动生成）\n```\n## 3.2 Forge\u002FNeoForge通用结构\n```\n{mod_name}\u002F\n├── build.gradle                    # Gradle 构建脚本\n├── gradle.properties               # 版本属性配置\n├── settings.gradle                 # Gradle 项目设置\n├── gradle\u002F\n│   └── wrapper\u002F                    # Gradle Wrapper 配置\n├── src\u002F\n│   ├── main\u002F\n│   │   ├── java\u002F                   # Java 源码根目录\n│   │   │   └── com\u002Fexample\u002Fmodid\u002F\n│   │   │       ├── {ModClass}.java              # 主入口类（@Mod 注解）\n│   │   │       ├── client\u002F                      # 客户端专用代码\n│   │   │       ├── common\u002F                      # 通用代码（物品、方块等）\n│   │   │       │   ├── item\u002F\n│   │   │       │   ├── block\u002F\n│   │   │       │   └── blockentity\u002F\n│   │   │       └── datagen\u002F                     # 数据生成器（可选）\n│   │   └── resources\u002F\n│   │       ├── META-INF\u002F\n│   │       │   ├── mods.toml                    # Forge 元数据（1.13+）\n│   │       │   ├── neoforge.mods.toml           # NeoForge 元数据（1.20.1+）\n│   │       │   └── accesstransformer.cfg        # 访问转换器配置（可选）\n│   │       ├── pack.mcmeta                      # 资源包元数据\n│   │       ├── assets\u002F\n│   │       │   └── {modid}\u002F\n│   │       │       ├── blockstates\u002F             # 方块状态定义\n│   │       │       ├── lang\u002F                    # 本地化文件\n│   │       │       │   ├── en_us.json\n│   │       │       │   └── zh_cn.json\n│   │       │       ├── models\u002F\n│   │       │       │   ├── block\u002F               # 方块模型\n│   │       │       │   └── item\u002F                # 物品模型\n│   │       │       ├── textures\u002F\n│   │       │       │   ├── block\u002F               # 方块纹理\n│   │       │       │   └── item\u002F                # 物品纹理\n│   │       │       ├── sounds.json              # 音效定义\n│   │       │       └── shaders\u002F                 # 着色器（可选）\n│   │       └── data\u002F\n│   │           └── {modid}\u002F\n│   │               ├── recipes\u002F                 # 配方 JSON\n│   │               ├── loot_tables\u002F             # 战利品表\n│   │               │   └── blocks\u002F\n│   │               ├── tags\u002F                    # 数据标签\n│   │               ├── advancements\u002F            # 进度定义\n│   │               └── structures\u002F              # 结构模板（可选）\n│   ├── client\u002Fjava\u002F                # 客户端专用源码（分离架构）\n│   ├── test\u002Fjava\u002F                  # 测试代码\n│   └── generated\u002F                  # 数据生成输出目录\n├── run\u002F                            # 开发环境运行目录（自动生成）\n└── build\u002F                          # 构建输出目录（自动生成）\n```\n# 四、Vibe Coading\n使用模组模版模组生成器生成模版文件后，在代码编辑器打开模组项目文件夹。\n在侧边栏展开AI编程插件，信任项目，用自然语言描述需求，例如：“帮我构建一个我的世界模组，游戏版本为Java 1.21.1，使用Fabric加载器（详细信息见gradle.properties），我需要xxx。”\n# 五、测试与调试\n在生成所需代码后，在终端控制台输入指令进行测试：\n- 清理缓存\n```\n.\u002Fgradlew clean\n```\n- 构建模组文件\n```\n.\u002Fgradlew build\n```\n- 运行测试客户端\n```\n.\u002Fgradlew runclient\n```\n- 以上指令可组合使用，如：\n```\n.\u002Fgradlew clean build runclient\n```\n> 在控制台中可使用上下方向键切换历史输入指令，无需重复输入\n# 六、模组导出\n在运行.\u002F gradlew build指令后，项目文件中的build\u002Flib文件夹中会出现对应名称的.jar模组文件，即为最终的客户端模组文件。\n# 七、模组上传与分发\n## 7.1 平台选择\n目前主流的模组分发平台有MC百科、Modrinth和Curseforge三大平台，国内分发首选MC百科，Modrinth在国内外的接受程度都较高，Curerforge则主打国外受众。\n## 7.2 分发原则\n在Modrinth和Curseforge上传的模组可被整合为链接内置于整合包中，在玩家下载并导入启动器时从平台下载被链接的模组。\n如果允许整合包制作者随意使用模组，在模组简介务必表明分发原则（即在打包时确保整合包中使用链接而不是内置模组本体）。否则整合包的下载量将不会被计算到模组中。...","https:\u002F\u002Foxqtewbrpuiouqqjrvdv.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fpublic-media\u002F2026-07-16\u002Fca4f2822-9ed5-49d8-b804-bbd92739a9d5.png",[],[],"龙家轩","https:\u002F\u002Fweatheraintbad.com","f39339b1-aaa6-4e86-b0c2-a6e6a21113b5",{"id":18,"name":19,"slug":20,"description":21},"d6750616-07d9-4350-8485-1834c77be3d2","指南","guide","指导建议，仅供参考",[23,27,31,35,39],{"id":24,"name":25,"slug":26},"541aaa1f-7a45-4fd7-b0f4-8798d3cef066","《我的世界》","minecraft",{"id":28,"name":29,"slug":30},"a202d639-99a6-488a-a712-4d4c6ffd7e15","开发","dev",{"id":32,"name":33,"slug":34},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug",{"id":36,"name":37,"slug":38},"144abe77-0dc6-4f66-a176-20bddb1c0bfa","编程","coding",{"id":40,"name":41,"slug":42},"88d2bc27-0e0f-468a-b907-2991cb97b87b","人工智能","ai",null,"published",false,30,0,"2026-02-07T00:00:00.000Z","2026-07-20T12:44:49.447Z","2026-07-16T11:26:54.204Z",[52,76,93],{"id":53,"type":6,"title":54,"slug":55,"summary":56,"body":57,"coverUrl":58,"productScreenshots":59,"productLinks":60,"authorName":61,"authorUrl":62,"authorSubject":16,"category":63,"tags":68,"sourceLabel":43,"sourceName":43,"sourceUrl":43,"status":44,"seoTitle":43,"seoDescription":43,"canonicalUrl":43,"isFeatured":45,"sno":72,"sortOrder":47,"publishedAt":73,"updatedAt":74,"createdAt":75},"ea23e2ef-cc1b-4977-ad38-bf95b363c953","SQLite复兴：从一个文件到边缘数据库","sqlite-libsql-turso-edge-database","SQLite 是没有服务器、就是一个文件的嵌入式数据库，零运维、极低延迟。借助 libSQL \u002F Turso，它正走向「边缘 + 多副本」，让读多写少的应用全球低延迟。","提到数据库，很多人第一反应是「要单独部署一台服务器、要连接、要运维」。但有一类数据库反其道而行——它没有服务器，就是一个文件。它就是 SQLite。你手机里的 App、浏览器、甚至飞机的黑匣子都在用它。\n\n而到 2026 年，借助 libSQL \u002F Turso 这样的项目，SQLite 正从「本地小工具」走向「边缘数据库」。\n\n## 背景：SQLite 到底特别在哪\n\n先说清概念。绝大多数数据库（MySQL、Postgres）是「客户端-服务器」模式：数据库是一个独立进程，你的程序通过网络连接去访问它。SQLite 不一样，它是**嵌入式**的——整个数据库就是磁盘上的一个文件，你的程序直接把它当函数库调用，没有网络、没有单独的服务器进程。\n\n这带来两个好处：**零运维**（不用部署和维护数据库服务器）和**极低延迟**（读写就是本地文件操作，没有网络往返）。代价是它传统上更适合单机、读多写少的场景。\n\n## libSQL 与 Turso：把 SQLite 搬到边缘\n\nSQLite 的短板是「天生单机」。libSQL 是 SQLite 的一个开源分支，Turso 则在它之上提供托管服务，核心思路是：把 SQLite 的「简单」保留下来，同时解决「多地访问」和「可扩展」的问题。\n\n它的杀手锏是「边缘 + 多副本」：把数据库的副本放到全球各地靠近用户的节点，用户读数据时就近读本地副本，延迟极低。这对「读多写少」的应用（内容站、配置、用户资料）特别合适。此外还流行一种「按租户一库」的模式——给每个客户开一个独立的 SQLite 数据库，天然隔离，非常适合多租户 SaaS。\n\n```mermaid\nflowchart TD\n    A[用户请求] --> B{读还是写?}\n    B -->|读| C[就近读边缘副本\u003Cbr\u002F>低延迟]\n    B -->|写| D[写主库]\n    D --> E[异步同步到各边缘副本]\n    E --> C\n```\n\n## 一个最小可运行的例子\n\n在本地，SQLite 用起来就是「打开一个文件」：\n\n```python\nimport sqlite3\ncon = sqlite3.connect(\"app.db\")   # 就是一个文件，没有服务器\ncon.execute(\"CREATE TABLE IF NOT EXISTS note(id INTEGER PRIMARY KEY, text TEXT)\")\ncon.execute(\"INSERT INTO note(text) VALUES (?)\", (\"你好，SQLite\",))\ncon.commit()\nfor row in con.execute(\"SELECT * FROM note\"):\n    print(row)\n```\n\n换成 Turso（libSQL），代码几乎一样，只是把「本地文件」换成「远程边缘数据库的地址 + 令牌」：\n\n```javascript\nimport { createClient } from \"@libsql\u002Fclient\";\n\nconst db = createClient({\n  url: \"libsql:\u002F\u002Fyour-db.turso.io\",   \u002F\u002F 边缘数据库地址\n  authToken: process.env.TURSO_TOKEN, \u002F\u002F 令牌从环境变量读取，切勿写死\n});\n\nawait db.execute(\"SELECT * FROM note\");\n```\n\n注意：令牌等凭证要放环境变量，别硬编码进代码或提交到仓库。\n\n## 取舍与边界\n\n- **写扩展有限**：SQLite\u002FlibSQL 的强项是读，高并发写入不是它的主场——需要海量并发写，仍应考虑 Postgres 等。\n- **同步一致性**：多副本是「最终一致」，写完的数据同步到各边缘节点需要一点时间，强一致场景要留意。\n- **单库体量**：单个 SQLite 文件适合中小体量数据；超大数据集或复杂分析型查询，专用数据库更合适。\n- **它不是万能替代**：把它用在「读多写少、要低延迟、要零运维」的场景，才最能发挥价值。\n\n## 你能马上用起来的收获清单\n\n- 原型、桌面端、移动端、CLI 工具，优先考虑 SQLite——零部署，一个文件搞定。\n- 读多写少、要全球低延迟的 Web 应用，评估 Turso\u002FlibSQL 的边缘副本方案。\n- 多租户 SaaS 可以试试「一租户一库」，天然隔离、备份和迁移都简单。\n- 凭证（authToken）一律走环境变量，别写进代码或提交仓库。\n- 记住它的适用边界：读多写少 + 低延迟 + 零运维时最香，高并发写要另选。","https:\u002F\u002Foxqtewbrpuiouqqjrvdv.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fpublic-media\u002F2026-07-19\u002F611d83bb-2a21-4271-a183-155a89a5bb81.jpg",[],[],"Foundit AI","https:\u002F\u002Ffoundit.cn",{"id":64,"name":65,"slug":66,"description":67},"6179d3b6-dc34-4483-9ded-3cd9f1b37a47","科普","abbreviation","介绍各领域新兴概念",[69,70,71],{"id":32,"name":33,"slug":34},{"id":28,"name":29,"slug":30},{"id":36,"name":37,"slug":38},70,"2026-07-17T00:00:00.000Z","2026-07-19T17:47:27.408Z","2026-07-19T17:10:52.499Z",{"id":77,"type":6,"title":78,"slug":79,"summary":80,"body":81,"coverUrl":82,"productScreenshots":83,"productLinks":84,"authorName":61,"authorUrl":62,"authorSubject":16,"category":85,"tags":86,"sourceLabel":43,"sourceName":43,"sourceUrl":43,"status":44,"seoTitle":43,"seoDescription":43,"canonicalUrl":43,"isFeatured":45,"sno":90,"sortOrder":47,"publishedAt":73,"updatedAt":91,"createdAt":92},"974096b9-8c0e-431e-bab6-8cd58e2af97f","Passkey通行密钥：为什么用指纹登录比密码更安全","passkeys-webauthn-passwordless-login","Passkey 基于 WebAuthn\u002FFIDO，用非对称加密让私钥不出设备、并与域名绑定，从原理上防钓鱼。","你有没有算过自己记了多少个密码？又有多少次因为「忘记密码」而走找回流程？\n\n密码这套用了几十年的登录方式，正在被一种更安全也更省心的机制取代——它叫 Passkey（通行密钥）。用指纹或面容一刷就登录，且从原理上就防钓鱼。\n\n本文讲清它是什么、怎么工作、怎么落地。\n\n## 密码为什么该退休\n\n先说清问题。密码有三个老毛病：容易被猜\u002F被撞库、容易在钓鱼网站被骗走、还要用户自己记。即便加了短信验证码，也挡不住实时钓鱼（攻击者把你输入的验证码即时转发到真网站）。\n\nPasskey 换了个思路。它基于 WebAuthn \u002F FIDO 标准，用的是「非对称加密」——注册时你的设备生成一对钥匙：**私钥**永远留在你的设备里（受指纹\u002F面容\u002FPIN 保护，绝不外传），**公钥**交给网站保存。登录时网站发来一个随机「挑战」，你的设备用私钥签名，网站用公钥验证。整个过程没有任何「秘密」在网络上传输。\n\n## 为什么它天生防钓鱼\n\n这是 Passkey 最关键的优势。每个 Passkey 都和一个具体的网站域名「绑定」。如果你被骗到一个仿冒域名，浏览器根本不会拿出对应的 Passkey——因为域名对不上。也就是说，就算你想上当，技术上也交不出凭证。\n\n```mermaid\nflowchart LR\n    A[注册: 设备生成密钥对] --> B[私钥留设备\u003Cbr\u002F>公钥给网站]\n    B --> C[登录: 网站发随机挑战]\n    C --> D[设备用私钥签名\u003Cbr\u002F>需指纹\u002F面容解锁]\n    D --> E[网站用公钥验证]\n    E --> F((登录成功\u003Cbr\u002F>无秘密上网))\n```\n\n## 一个最小可运行的例子\n\n在网页里，浏览器通过 `navigator.credentials` API 直接对接系统的生物识别。注册和登录各是一次调用：\n\n```javascript\n\u002F\u002F 1) 注册：创建一个 Passkey（options 由你的服务端生成）\nconst cred = await navigator.credentials.create({\n  publicKey: {\n    challenge: serverChallenge,          \u002F\u002F 服务端下发的随机值\n    rp: { name: \"示例站点\", id: \"example.com\" },\n    user: { id: userId, name: \"user@example.com\", displayName: \"小明\" },\n    pubKeyCredParams: [{ type: \"public-key\", alg: -7 }], \u002F\u002F ES256\n    authenticatorSelection: { residentKey: \"required\", userVerification: \"required\" },\n  },\n});\n\u002F\u002F 把 cred 里的公钥等信息发回服务端保存\n\n\u002F\u002F 2) 登录：用已有 Passkey 签名挑战\nconst assertion = await navigator.credentials.get({\n  publicKey: { challenge: serverChallenge, rpId: \"example.com\" },\n});\n\u002F\u002F 把 assertion 发回服务端，用之前存的公钥验证签名\n```\n\n注意：客户端只负责「唤起系统验证 + 拿到签名」，真正的**挑战生成**和**签名验证**必须在服务端完成，且 `challenge` 必须一次性、随机、有时效——这是安全的关键。\n\n## 取舍与边界\n\n- **设备同步与找回**：现代 Passkey 可通过平台账号（如系统钥匙串）在你的设备间同步，换手机不至于全丢；但仍要设计好账号恢复流程，避免用户彻底被锁在外面。\n- **跨生态**：在不同厂商设备\u002F浏览器之间使用时，通常靠「扫码 + 手机」的跨设备流程衔接，体验在持续改善。\n- **过渡期共存**：多数网站会让 Passkey 与密码并存一段时间，逐步引导用户迁移，而不是一刀切。\n- **它保护的是「登录」**：Passkey 解决身份验证，不替代授权、会话管理等其它安全环节。\n\n## Tips\n\n- 新系统做登录，优先支持 Passkey，把密码作为过渡兜底而非唯一选项。\n- 服务端务必保证 `challenge` 随机、一次性、有时效，验证逻辑放服务端。\n- 一定要设计好账号恢复路径（备用邮箱、多设备等），别让用户丢设备就丢账号。\n- 向用户解释「用指纹登录 = 更安全」，降低迁移心理门槛。\n- 记住 Passkey 的核心卖点：私钥不出设备 + 与域名绑定，从原理上防钓鱼。","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1614064641938-3bbee52942c7?w=1200",[],[],{"id":64,"name":65,"slug":66,"description":67},[87,88,89],{"id":36,"name":37,"slug":38},{"id":28,"name":29,"slug":30},{"id":32,"name":33,"slug":34},71,"2026-07-19T17:55:56.818Z","2026-07-19T17:10:50.027Z",{"id":94,"type":6,"title":95,"slug":96,"summary":97,"body":98,"coverUrl":99,"productScreenshots":100,"productLinks":101,"authorName":61,"authorUrl":62,"authorSubject":16,"category":102,"tags":103,"sourceLabel":43,"sourceName":43,"sourceUrl":43,"status":44,"seoTitle":43,"seoDescription":43,"canonicalUrl":43,"isFeatured":45,"sno":107,"sortOrder":47,"publishedAt":108,"updatedAt":109,"createdAt":110},"0e2211d6-a9cc-4151-aec3-ea60ef2575f2","本地大模型部署：用 Ollama 与 llama.cpp 把模型搬进你自己的机器","local-llm-deployment-ollama-llama-cpp","数据敏感、要离线、想省 API 账单？本地部署值得了解。","把大模型搬到你自己的电脑、内网服务器甚至笔记本上跑，不依赖任何云服务——这件事在 2026 年已经相当成熟。无论是数据敏感、要离线、还是想省 API 账单，本地大模型部署都值得每个开发者了解。Ollama 和 llama.cpp 是这条路上最顺手的两件工具。\n\n## 为什么要在本地跑\n\n云端 API 方便，但有三类痛点它躲不开：数据要出网（合规敏感场景直接否决）、每次调用都计费、断网就歇菜。本地部署把模型权重放在你自己的机器上，请求不出内网、零边际成本、永远在线。代价是你要自己搞定硬件和推理环境。\n\n## 两件核心工具\n\n**Ollama**：把「下载模型、起服务、调接口」封装成几条命令，对开发者最友好，自带兼容 OpenAI 的接口。\n**llama.cpp**：用 C++ 实现、支持量化与多后端（CPU\u002FGPU\u002FMetal），是把模型塞进低配机器的底层引擎，很多上层工具（包括 Ollama）都站在它肩上。\n\n```mermaid\nflowchart LR\n    A[模型权重文件] --> B[llama.cpp 推理引擎]\n    B --> C[Ollama 封装服务]\n    C --> D[你的应用 走 OpenAI 兼容接口]\n```\n\n## 一个最小可运行的例子\n\n用 Ollama 跑起一个模型并调用，比想象中简单：\n\n```bash\nollama pull qwen2.5:7b     # 拉取一个 70 亿参数模型\nollama run qwen2.5:7b      # 命令行直接对话\n```\n\n在 Python 里，它可以像调云端一样用：\n\n```python\nfrom ollama import chat\nresp = chat(model=\"qwen2.5:7b\", messages=[\n    {\"role\": \"user\", \"content\": \"用一句话解释什么是向量数据库\"}\n])\nprint(resp[\"message\"][\"content\"])\n```\n\n## 取舍与边界\n\n- **硬件是硬门槛**：7B 模型量化后约 4–5 GB 显存，能跑；70B 级别需要大显存或多卡，笔记本基本没戏。\n- **质量有差距**：本地小模型（7B\u002F14B）在复杂推理上仍明显弱于云端旗舰模型，适合内部工具、草稿、分类等场景。\n- **量化换速度**：用 llama.cpp 的 INT4 量化能在 CPU 上跑起来，但精度会降，关键任务先评测。\n- **并发能力弱**：本地单机吞吐远不及云厂商集群，不适合高并发公网服务。\n\n## Tips\n\n- 想试水，先 `ollama pull` 一个 7B 模型，五分钟跑通对话。\n- 应用层尽量走 OpenAI 兼容接口，本地\u002F云端切换只改 base_url。\n- 数据敏感或要离线，本地部署是合规最优解。\n- 真要上生产高并发，把本地模型定位为「内网辅助」，重活仍交给云端旗舰。\n- 选模型时先想清楚硬件：显存不够就上量化版，别硬刚全精度。\n","https:\u002F\u002Foxqtewbrpuiouqqjrvdv.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fpublic-media\u002F2026-07-20\u002Fbf471546-ff4c-4fee-a01c-8a41157e5a8c.jpg",[],[],{"id":18,"name":19,"slug":20,"description":21},[104,105,106],{"id":32,"name":33,"slug":34},{"id":28,"name":29,"slug":30},{"id":40,"name":41,"slug":42},76,"2026-07-19T00:00:00.000Z","2026-07-20T01:22:41.329Z","2026-07-20T01:11:41.120Z"]