NASA 与 IBM 开源“月球基础模型”:让人工智能读懂月球

2026 年 9 月,NASA 与 IBM Research 正式发布 NASA-IBM Lunar Foundation Model(NASA-IBM LFM)。这是一个专门面向月球遥感科学设计的多模态、多分辨率人工智能基础模型。模型权重公开托管于 Hugging Face,微调和推理代码则开放在 GitHub,并采用 Apache 2.0 许可证。 它并不是类似 ChatGPT 的语言模型,也不是一个能够模拟整个月球的“数字月球”。更准确地说,它是一套专门学习月球表面遥感数据的视觉基础模型。 从“识别图片”到“理解月球遥感数据” 几十年来,人类已经通过大量探月任务积累了规模庞大的月球观测数据。 其中最重要的数据来源之一,是 NASA 于 2009 年发射的月球勘测轨道飞行器 Lunar Reconnaissance Orbiter,简称 LRO。经过十多年运行,LRO 已经获得覆盖月球大部分表面的高分辨率影像和多种遥感数据。 但数据越来越多之后,一个新的问题逐渐出现: 如何有效分析如此庞大的月球数据? 如果研究人员希望寻找陨石坑、统计地貌、识别特殊火山结构或者分析极区水冰潜力,传统方法往往需要针对每一个研究任务重新建立算法和训练模型。 NASA 和 IBM 希望改变这种模式。 NASA-IBM Lunar Foundation Model 的思路与近年来人工智能领域的“基础模型”类似:先利用海量数据进行大规模预训练,让模型形成一种对月球表面结构的通用表示能力,然后再针对具体科学问题进行微调。 因此,它并不是一个只会“找陨石坑”的模型,而更像一个可以进一步训练成许多不同月球分析工具的基础平台。 近 200 万组月球数据 …

从 System Prompt 到长期知识架构:一套 AI Agent 的演进实践

近年来,AI Agent 的能力正在快速从“会聊天”演变为“能够长期工作”。 它们开始拥有文件系统、Shell、浏览器、代码执行环境、外部 API、远程主机、数据库、记忆、插件、Skill,甚至能够把任务交给其他 Agent。 这带来了一个比“怎么写好 Prompt”更重要的问题: 当一个 AI Agent 真正开始长期运行时,它应该如何组织自己的知识、规则、上下文、记忆和工具? 如果所有内容最终都堆进一个越来越长的 system prompt,系统很快就会遇到三个问题: 一个更成熟的方向,是把 Agent 看成一个长期运行的软件系统,而不是一段特别长的 Prompt。 本文讨论的正是这种演进过程。 一、研究 System Prompt,真正应该学习什么? 收集 OpenAI、Anthropic、Google、Microsoft、Meta、xAI、Perplexity、Cursor、OpenCode 等不同 Agent 产品的 system prompt、CLI Agent 规则和工作流后,一个很容易出现的误区是: 把优秀句子复制出来,然后拼进自己的 system prompt。 这种方法短期看起来很强,长期却很容易失控。 因为不同公司的 Agent: 真正值得借鉴的,不是某一句具体措辞,而是多个独立系统反复出现的共同架构思想。 当这些产品横向放在一起比较时,会发现很多设计已经开始趋同。 例如: 这说明成熟 Agent 的核心已经不再是一个巨大 Prompt,而是一套分层知识系统。 二、第一原则:Bootstrap 是宪法,不是数据库 Agent 启动时会注入一部分固定上下文。 这部分内容非常宝贵。 …

一次 OpenClaw × Nextcloud Talk 故障排查与完整审计:从 Webhook 401 到迁移残留清理

前言 在一套长期运行的自建 AI Agent 环境中,OpenClaw 通过 Nextcloud Talk 接收消息,并借助 FRP、反向代理和 Webhook 与外部服务通信。 某次系统维护之后,Nextcloud Talk 中的机器人突然停止回复。与此同时,OpenClaw 此前还经历过一次失败的版本升级,因此最初很容易怀疑:是否升级失败破坏了插件、数据库或 Gateway 状态? 最终调查表明: Talk 故障与失败升级没有直接关系。真正原因是 Nextcloud 公网域名迁移后,OpenClaw Talk Channel 中的 baseUrl 仍指向旧地址,导致 Webhook Backend 校验失败并返回 HTTP 401。 在修复 Talk 后,又对整个 OpenClaw 安装实例进行了完整的只读审计,清理了迁移残留、失败升级 candidate 和旧 SQLite snapshot cache,并验证 SQLite、插件、Gateway、FRP、Agent 数据库等核心组件均处于正常状态。 这次排查很适合作为一个复杂自托管系统的故障分析案例: 不要看到异常就立即修复,而应先确定故障边界,建立证据链,最后只修改真正错误的部分。 一、系统架构 为避免暴露真实基础设施信息,本文统一使用占位符。 典型架构如下: …

把临时操作变成可复用能力:为 OpenClaw 设计一个安全的 WordPress 管理 Skill

把临时操作变成可复用能力:为 OpenClaw 设计一个安全的 WordPress 管理 Skill 让 AI Agent 管理 WordPress,看起来只需要“给它一个 API,然后让它发文章”。真正开始长期使用之后,很快会发现事情没有这么简单。 发布文章只是最表层的能力。实际还会遇到分类、标签、草稿、私密文章、Slug、特色图片、批量更新、权限控制、备份、回滚、异常中止等问题。如果这些规则只存在于某一次聊天里,那么下一次任务仍然要重新解释,执行结果也容易漂移。 更可靠的做法,是把已经验证过的规则整理成一个可复用的 Skill。这样,模型负责理解任务,Skill 负责约束行为,底层脚本负责与 WordPress API 交互。 为什么需要 Skill 一次性的提示词适合临时任务,但不适合作为长期运维规范。 例如,同样是“更新一篇文章”,实际可能有完全不同的风险: 修改正文可能意外覆盖原始 HTML; 更新分类时可能把原来的标签一起清空; 重新提交整篇 Post 对象可能改变 Slug、时间或状态; 批量操作时,一篇文章失败可能影响后续数百篇; REST API 中某些统计字段并不能完整反映 private 内容; 分类和标签虽然都属于 taxonomy,但它们的业务语义并不相同。 如果每次都让模型临场决定,很容易出现“技术上能执行,但业务上不应该执行”的情况。 Skill 的价值,就是把这些已经确认的规则固定下来。 一个合适的职责分层 比较稳妥的结构可以分成三层。 第一层是自然语言层。用户只需要描述目标,例如: 将一批文章重新分类,但不要改变正文、Slug 和发布状态。 第二层是 Skill。Skill 明确告诉 Agent: …

Recovering an OpenClaw Installation After a Codex Session Conflict and Interrupted State Migration

A seemingly small OpenClaw error can occasionally expose several layers of state that have accumulated over time: stale Codex session bindings, retired model references, legacy media metadata, database schema migrations, old plugin generations, and outdated systemd service definitions. This article documents one such recovery on an Ubuntu host. All hostnames, …

OpenClaw 终端长回答被截断:原因、现状与正确处理方式

在使用 OpenClaw 的终端界面进行长篇分析时,可能遇到一种比较明显的问题:模型实际上已经生成了完整回答,但终端只显示前半部分,最后出现类似: 与此同时,在 OpenClaw 的网页版或 Control UI 中查看同一个会话时,却可以看到完整内容。 这种现象很容易让人误以为是终端滚动缓存不足、模型提前停止生成、网络中断,或者 token 上限导致输出失败。 实际情况并不是这样。 现象 典型情况如下: 回答并不是在自然段结尾结束,而是在句子中途突然出现: 如果随后打开 OpenClaw 的网页界面,却发现同一条回答仍然完整存在。 这说明问题并不发生在模型生成阶段。 根本原因 经过核对 OpenClaw 的上游 issue、文档以及相关实现后,可以确认: 这是 OpenClaw 客户端显示层的截断问题。 OpenClaw 在向某些非 Control UI 客户端传递聊天消息时,会生成一个用于显示的 message projection,也就是“显示版本”。 这个显示版本存在字符数量限制。 其中一个已知默认值是: 当回答超过这个范围时,OpenClaw 会主动缩短显示内容,并在末尾加入: 因此: 所以这不是终端模拟器本身删掉了内容。 为什么网页版完整,而终端不完整 OpenClaw 后来的设计并不是简单地无限增加每一条消息的传输长度。 更合理的方案是: Control UI 已经能够识别消息是否被截断,并通过完整消息读取接口取得原始内容。 因此网页界面可以提供类似“Show more”的行为。 …

Upgrading OpenClaw Safely: Capability Consent, systemd User Services, Loopback Binding, and FRP Reverse Proxying

Privacy note: All hostnames, usernames, IP addresses, ports, domain names, paths, plugin deployment details, and other potentially identifying information in this article have been replaced with fictional examples. Values such as Orion, Proxy-A, 192.168.50.25, example.net, and port 28473 do not correspond to any real environment. Introduction An OpenClaw upgrade can …

用独立 Context 资料库为 AI Agent 的启动上下文减负

随着 AI Agent 使用时间增长,工作区中的规则、主机信息、操作手册、故障记录和长期记忆往往会不断积累。 一开始,所有内容可能只有几个 Markdown 文件。为了让 Agent 每次启动时都能理解环境,这些文件通常会被自动注入上下文。然而,当内容逐渐增加后,一个新的问题随之出现: Agent 每处理一次普通任务,都要重新读取大量与当前任务无关的技术资料。 例如,处理一个简单文件操作时,模型可能同时接收到: 这些资料都很重要,不能删除,但也没有必要在每轮对话中全部注入。 解决这个问题的一种有效方法,是在工作区中建立一个独立的、按需读取的 context/ 资料库。 一、问题不只是某个文件太长 不少 Agent 工作区会包含类似文件: 这些文件通常承担不同职责: 问题在于,详细技术资料往往会逐渐混入这些启动文件。 例如,一个网络问题可能在排查后留下几千字内容,其中包括: 这些内容确实值得长期保存。如果全部留在 TOOLS.md 或 MEMORY.md 中,每次启动都会重复占用上下文。 仅仅把内容从 MEMORY.md 移到 TOOLS.md,并没有真正解决问题。它只是把负担从一个自动注入文件转移到了另一个自动注入文件。 真正需要优化的是: 所有启动文件的总注入量,而不是某一个文件的长度。 二、三层知识结构 更适合长期维护的结构,可以分为三个层级。 1. 启动层 每轮对话都应知道的内容,继续保存在自动注入文件中: 这一层只保存: 启动层应当短、小、稳定。 2. 按需资料层 详细技术资料进入: 这一层保存: 这些文件不应每轮自动注入,而应在任务需要时由 Agent 主动读取。 3. 历史与证据层 …

OpenClaw 三个 Session 同时断线之后:一次树莓派内存回收风暴的无重启救援

一台配备 8GB 内存的树莓派正在运行 OpenClaw,同时有三个 Session 执行任务。系统本身仍能通过 SSH 登录,基础命令也能运行,但三个 Session 突然全部显示 disconnected,网页控制界面几乎失去响应。 过去遇到这种情况,最直接的处理方式往往是强制断电重启。但这一次没有立即重启,而是保留现场、检查进程和内核状态,最终成功让原有 Session 自动恢复,正在执行的任务也没有因为重启而被强制中断。 整个过程展示了一个很典型、也很容易被误判的问题: 系统看起来像“死机”,实际上并没有发生 OOM Kill,而是陷入了由内存软限制、页面回收和低速存储共同造成的内存回收风暴。 一、故障现象 故障出现时,OpenClaw 网页端的三个 Session 同时断线,但操作系统仍然可访问。 系统状态大致如下: OpenClaw 服务仍显示: 进程列表中,大量 openclaw 和 openclaw-hooks 进程处于 D 状态,等待位置包括: 这几个信息非常关键。 D 表示不可中断睡眠,通常意味着进程正在等待块设备、文件系统或内核内存回收操作。进程没有退出,也不代表程序逻辑已经崩溃,只是暂时无法获得需要的资源。 二、首先确认:有没有发生 OOM Kill 面对内存不足,首先需要判断的是: 内核有没有真正杀死 OpenClaw 或 Session 对应的进程? 检查内核日志: 结果没有任何输出。 随后检查 OpenClaw 服务对应 …

AI 代理工作区中自动生成 state 文件的排查记录

背景 某 AI 代理工具的工作区目录中,反复出现一个状态文件。即使手动删除,过一段时间后文件仍会重新生成。 工作区中同时还能看到另一个隐藏目录下的状态文件。经过人工对比,这两个文件内容完全相同。于是问题变成了: 现象 工作区中存在两个状态文件: 其中顶层的 state 文件删除后会再次出现。隐藏目录中的 state 文件一直存在。 两个文件内容相同,JSON 结构也相同,主要记录工作区初始化状态,例如: 这些字段看起来不像用户数据,也不像配置密钥,而是程序用于判断工作区是否完成初始化的运行状态信息。 排查方式 排查过程中保持只读原则,没有删除、移动、修改文件,也没有重启服务。 主要检查方向包括: 排查结果 结果显示,这两个文件都属于工具正常运行会产生的文件,但地位并不完全相同。 顶层的状态文件是当前版本代码中的 canonical 路径,也就是当前主状态文件。 隐藏目录中的状态文件是 legacy 兼容路径,也就是旧路径或兼容路径。当前代码仍然会读取它,并在需要时把里面的状态迁移回顶层的 canonical 文件。 换句话说,这不是两个互相冲突的状态文件,而是同一份工作区状态在新旧路径之间共存。 为什么删除后还会出现 删除顶层状态文件后,如果隐藏目录中的 legacy 状态文件仍然存在,那么下一次工具启动、工作区初始化、代理会话创建或 heartbeat 触发时,程序会重新读取 legacy 状态。 如果程序发现顶层 canonical 状态文件不存在,就会根据 legacy 状态重新生成顶层文件。 因此,文件并不是“神秘复活”,而是程序的兼容迁移逻辑主动恢复了它。 可以理解为: 是否属于异常 从排查结果看,没有明显异常迹象。 两个文件内容一致,权限正常,字段结构正常,也没有发现异常进程或可疑写入行为。顶层文件比隐藏目录中的文件更新,说明当前程序确实更偏向使用顶层 canonical 文件,而隐藏目录中的文件更像历史兼容残留。 这种情况更像是软件版本迁移期间的兼容设计,而不是数据损坏或异常垃圾文件。 …