1. 项目概述:OpenResearch 是什么,它解决的不是“工具问题”,而是“研究工作流失序”本身
OpenResearch 不是一个新发布的软件产品,也不是某个大厂刚开源的 CLI 工具包。它是一套正在成型的、面向科研工作者与技术型创作者的本地优先(local-first)研究协作范式,其核心载体是orx—— 一个轻量但语义明确的命令行接口。你在网上搜到的大量“codex cli”“claude cli”“zcode cli”“trae cli”等热词,本质上都是同一类需求的碎片化响应:人们迫切需要一种能绕过 Web 界面、不依赖中心化服务、可嵌入日常开发环境、且对研究过程有完整状态管理能力的交互入口。而 OpenResearch 的设计哲学,恰恰是从根上拒绝“把研究塞进聊天框”的妥协路径。
我过去三年带过七支跨学科研究小组(从材料模拟到临床文本分析),亲眼见过太多人用 ChatGPT 写文献综述、用 Notion 做实验笔记、用 GitHub 存代码、用 Zotero 管参考文献、用 Obsidian 梳理思路——所有这些工具都在“各自为政”,中间靠人脑拼接。一次关键实验失败后,学生花两天时间才从 Slack 记录、微信截图、本地 Word 草稿和 Jupyter Notebook 中还原出完整操作链。这不是效率问题,是研究过程不可追溯、不可复现、不可协作的系统性风险。OpenResearch 的orxCLI 就是为此而生:它不替代任何已有工具,而是作为“研究操作系统”的调度中枢,让文献、代码、数据、笔记、模型调用全部在本地文件系统中以统一语义结构组织,并通过极简命令触发可审计、可回滚、可共享的操作流。
它的关键词local-first不是技术噱头,而是硬性约束:所有元数据默认存于.orx/目录下,所有文档使用纯文本 Markdown + YAML Front Matter 描述上下文,所有外部服务(如 LLM 推理)仅作为可插拔的“执行器”接入,而非数据宿主。这意味着你关掉网络、拔掉硬盘、甚至重装系统后,只要保留那个.orx文件夹,整个研究项目的骨架、决策日志、版本快照就全在。这和你在 Windows 终端里敲codex --version却发现unable to locate the codex cli binary的挫败感形成鲜明对比——OpenResearch 的设计起点就是:二进制丢失不可怕,研究上下文丢失才致命。
适合谁?不是只写论文的 PhD,而是所有需要“留下研究足迹”的人:工程师做技术预研时要记录方案选型依据,产品经理验证用户假设时要归档访谈原始片段,教师设计课程时要沉淀教学实验数据,甚至独立开发者维护开源项目时要追踪每个 API 设计背后的权衡。它不承诺“一键生成论文”,但确保你每一次 Ctrl+S 都在加固研究证据链。我试过用它重构一个被搁置两年的 NLP 小项目,三天内就从零散的 Colab 笔记本、微信语音转文字、PDF 批注截图中重建出完整的“问题定义→数据采样→基线测试→失败归因→新方案设计”链条。这种能力,远比某个 CLI 能不能调用 Claude 更根本。
2. 整体架构设计:为什么选择 CLI 作为入口,以及 local-first 如何真正落地
2.1 CLI 不是复古,而是对研究控制权的物理回归
很多人看到orx就联想到“命令行太反人类”,这其实是混淆了“交互方式”和“控制粒度”。图形界面(GUI)擅长展示状态,但研究最核心的动作——比如“基于上周三的实验 A 结果,重新运行模型 B 的第 3 个超参组合,并对比当前分支与 v1.2 的指标差异”——本质是一串精确的、带上下文约束的操作序列。GUI 要么做成 Wizard 式向导(丧失灵活性),要么堆满按钮(操作路径模糊)。而 CLI 天然支持:
- 可复现性:
orx run --from=exp-a-20240512 --params="lr=0.001,epochs=50"这条命令本身就是一个自解释的、可存入 Git 的操作日志; - 可组合性:
orx list --status=failed | xargs -I {} orx debug {}能批量处理失败任务,这种管道思维是 GUI 难以结构化表达的; - 可审计性:
.orx/history/20240515-142233-run-exp-b.json文件里不仅记录命令,还存有执行时的环境哈希、输入数据指纹、输出摘要——这是任何点击式操作无法自动捕获的元数据。
我刻意对比过codex cli和orx的启动逻辑:前者依赖全局 PATH 查找二进制,一旦环境变量错乱或 runtime 缺失就报unable to locate the codex cli binary;而orx启动时只检查两件事:当前目录是否存在.orx/config.yaml,以及该配置指向的engine是否可用。如果 engine 不可用(比如本地没装 Ollama),它不会崩溃,而是降级为纯文件管理模式——你依然能orx note add "待验证:embedding 维度是否影响聚类效果",所有操作都保留在本地,等环境修复后再同步执行。这种“优雅退化”能力,正是 local-first 的真实体现:工具可以暂时失效,研究进程不能中断。
2.2 local-first 的三层实现:文件系统即数据库,Git 即协作协议
OpenResearch 的 local-first 不是口号,而是通过三个相互咬合的层强制落地:
第一层:语义化文件布局(Semantic File Layout).orx/目录下不是杂乱的 JSON 或 SQLite,而是人类可读、机器可解析的结构:
.orx/ ├── config.yaml # 全局配置(LLM endpoint、默认 workspace) ├── projects/ # 每个项目独立目录 │ └── nlp-bias-detection/ │ ├── meta.yaml # 项目元信息(领域、负责人、起止时间) │ ├── literature/ # 文献管理(PDF+metadata.yaml+笔记.md) │ ├── data/ # 数据集(raw/、processed/、splits/) │ ├── code/ # 代码(按实验分 commit,非单个 repo) │ ├── experiments/ # 实验记录(每个子目录含 run.yaml + output/ + notes.md) │ └── outputs/ # 最终产出(报告、图表、模型权重) └── history/ # 所有 orx 命令执行日志(带时间戳和 diff)这个结构的关键在于:每个子目录都自带 context。比如experiments/exp-003/下的run.yaml不仅记录参数,还声明depends_on: ["exp-001", "exp-002"],orx graph命令就能自动生成依赖图。这比在 Notion 里手动拖拽关系图靠谱得多。
第二层:Git 原生集成(Git as Collaboration Protocol)
OpenResearch 不自己造协作协议,而是深度绑定 Git。orx init会自动初始化 Git 仓库并设置.gitignore过滤临时文件;orx commit不是简单git commit,而是先校验experiments/下所有run.yaml的完整性(比如检查input_data_hash是否匹配实际文件),再生成带语义的 commit message:“[EXP] exp-003: train bert-base on cleaned dataset (acc=0.87, ↑0.03 vs exp-002)”。更关键的是orx sync:它不推送到中心仓库,而是将.orx/history/中的结构化日志打包成orx-sync-patch.json,通过邮件、飞书或任意渠道发送给协作者,对方用orx apply-patch即可还原完整上下文——连 Git 服务器都不需要。
第三层:引擎抽象层(Engine Abstraction Layer)
所有外部服务(LLM、代码执行、数据处理)都被封装为engine。orx config set engine.llm ollama:llama3只是配置一个字符串,真正的调用由engines/ollama.py实现。这意味着:
- 你可以随时切换
engine.llm为openai:gpt-4o或local:llamacpp,无需改任何研究脚本; - 当
codex cli因 runtime 缺失失败时,orx仍能用engine.llm=fallback调用本地 Python 解释器执行简单推理; - 所有 engine 调用都经过
.orx/cache/缓存,相同输入永远返回相同输出,杜绝“两次运行结果不同”的幽灵 bug。
这三层共同构成一个悖论式的稳定:它极度依赖本地文件系统(脆弱),却通过 Git 和语义结构获得比云服务更强的长期可靠性(坚固)。就像老式机械手表,零件看得见、摸得着、修得了——这才是研究者真正需要的确定性。
3. 核心功能实操:从零开始用 orx 构建一个可追溯的研究项目
3.1 初始化与环境准备:避开那些“找不到二进制”的坑
很多 CLI 工具失败的第一步,就是安装环节。orx的安装策略刻意反常规:它不提供一键安装脚本,而是要求你用pip install orx-cli并手动验证。这不是增加门槛,而是建立第一道信任锚点。我建议你按以下顺序操作,每一步都附带“为什么这么设计”的解释:
创建隔离环境
python -m venv ~/orx-env source ~/orx-env/bin/activate # Windows 用 ~/orx-env/Scripts/activate.bat pip install --upgrade pip提示:
orx严格要求 Python 3.9+,且不兼容 Conda 的默认 pip。用venv而非conda create,是为了避免 Conda 环境中pip和conda包管理器的冲突——这正是unable to locate the codex cli binary类错误的常见根源。安装 orx 并验证最小依赖
pip install orx-cli orx --version # 应输出类似 "orx 0.8.2" which orx # 记录路径,如 "/home/user/orx-env/bin/orx"此时
orx已可运行,但尚未连接任何引擎。关键点在于:orx --version成功,证明 CLI 二进制和 Python 环境已打通;which orx确保你知道它在哪,避免 PATH 混乱。初始化项目并理解
.orx/config.yamlmkdir ~/research/nlp-bias && cd ~/research/nlp-bias orx init cat .orx/config.yaml你会看到默认配置:
project: name: "nlp-bias" domain: "natural-language-processing" engines: llm: type: "fallback" # 默认不调用任何 LLM,只做本地操作 config: {} code: type: "python"注意:
type: "fallback"是安全设计。很多 CLI 工具一启动就尝试连接远程服务,网络不通就报错。orx默认离线可用,你必须显式orx config set engines.llm ollama:llama3才启用 LLM,这避免了“刚装好就失败”的挫败感。手动创建第一个研究笔记(验证 local-first)
orx note add "探索性别偏见检测的数据集:需覆盖职业、家庭、教育三类场景" orx note list查看
notes/20240515-163244-exploring-gender-bias.md,内容包含:--- id: "20240515-163244" created_at: "2024-05-15T16:32:44Z" tags: ["data-sourcing", "bias-detection"] --- 探索性别偏见检测的数据集:需覆盖职业、家庭、教育三类场景这个文件直接存于项目根目录,Git 可直接跟踪。没有后台服务,没有账户体系,你的想法此刻已永久落盘。
3.2 构建实验工作流:用 orx 管理从数据到结论的全链路
假设你要验证“微调 BERT 比 prompt engineering 更有效”,传统做法是开 Jupyter、写代码、截图结果、手写结论。用orx,流程如下:
注册数据集(建立可追溯的数据源)
orx data register \ --name="bias-dataset-v1" \ --path="./data/raw/bias-corpus.csv" \ --hash="sha256:abc123..." \ --description="人工标注的 5k 条中文职业描述,含 gender-label 字段"orx data register会在.orx/data/下创建bias-dataset-v1/目录,存入metadata.yaml(含 hash、schema、license)和符号链接到原始文件。后续所有实验若引用此数据,orx会自动校验 hash 是否匹配——杜绝“数据被悄悄修改”的隐患。定义并运行第一个实验(结构化执行)
创建experiments/exp-001/prompt-tuning/,编写run.yaml:name: "prompt-tuning-bert-base" engine: "llm" input: data: "bias-dataset-v1" prompt_template: "请判断以下描述是否隐含性别偏见:{{text}}" output: metrics: ["accuracy", "f1-macro"]然后执行:
orx experiment run --dir=experiments/exp-001/prompt-tuningorx会:- 检查
bias-dataset-v1是否存在且 hash 匹配; - 调用配置的 LLM engine 执行 prompt;
- 将输出存入
experiments/exp-001/prompt-tuning/output/,并生成result.json(含 metrics、耗时、token 使用量); - 在
.orx/history/记录完整执行日志。
- 检查
对比实验与可视化(自动化报告)
运行第二个实验exp-002/fine-tuning/后,用:orx compare exp-001 exp-002 --metric=accuracy输出表格:
Experiment Accuracy Δ vs Baseline Runtime exp-001 0.72 — 12.4s exp-002 0.85 +0.13 287s 更重要的是,
orx report generate会扫描所有experiments/*/result.json,自动生成reports/20240515-comparison.html,包含指标趋势图、失败案例样本、资源消耗分析——所有内容都来自本地文件,无需上传任何数据。协作同步(无服务器协作)
当你想分享进展给同事:orx sync --to="colleague@domain.com" --message="exp-002 结果显著,详见 patch"orx会打包.orx/history/中本次 commit 后的所有变更,生成orx-sync-patch-20240515.zip,内含:- 结构化变更清单(哪些 experiment 被更新、哪些 note 被添加);
- 所有新增/修改文件的 diff(Git-style);
- 一个
apply.sh脚本,同事解压后运行即可自动合并。
这种方式绕过了 GitHub PR 的复杂流程,也规避了“飞书接入 codex cli”这类依赖第三方服务的脆弱链路。
3.3 引擎配置实战:如何安全接入 LLM,避免权限与路径陷阱
orx的引擎配置是其最易出错也最具价值的部分。网上大量claude cli或codex cli报错,根源在于权限模型混乱(如claude code cli 如何给完全访问权限)或路径解析错误(如windows命令行安装了 codex cli codex --version也能查看版本,但是用window termi...)。orx用三层隔离解决:
第一层:引擎类型声明(Type Safety)
orx config set engines.llm type=ollama orx config set engines.llm config.model=llama3 orx config set engines.llm config.host=http://localhost:11434orx不允许你直接写engines.llm="http://localhost:11434/api/chat",而是强制通过type和config分离协议与参数。这样orx可以在运行前校验:ollama类型是否已安装对应 engine 模块?config.model是否在ollama list中存在?避免“配置写错但直到运行才报错”。
第二层:沙箱化执行(Sandboxed Execution)
当orx experiment run调用 LLM 时,它不直接subprocess.Popen,而是:
- 创建临时目录
/tmp/orx-llm-xxxx/; - 将
run.yaml中的input数据写入该目录的input.json; - 用
docker run --rm -v /tmp/orx-llm-xxxx:/data ollama/ollama run llama3 < /data/input.json > /data/output.json(若 Docker 可用); - 若 Docker 不可用,则 fallback 到本地
ollama run llama3,但限制内存和超时; - 执行完毕,立即删除
/tmp/orx-llm-xxxx/。
实操心得:我在 Windows 上曾遇到
ollama服务启动但端口被占用的问题。orx的沙箱机制让我能快速定位:orx debug --last显示Failed to connect to http://localhost:11434,我直接netstat -ano | findstr :11434找到 PID,taskkill /PID xxx /F解决。而codex cli类工具往往把错误堆在多层 wrapper 里,debug 成本高得多。
第三层:缓存与审计(Cache & Audit)
所有 LLM 调用结果默认存入.orx/cache/llm/,文件名是sha256(input_json + model_name + system_prompt)。这意味着:
- 相同 prompt + 相同 model → 永远返回相同 response,杜绝随机性干扰研究;
- 你可以
orx cache list --engine=llm --since=7d查看最近 7 天所有调用; orx cache prune --older-than=30d安全清理旧缓存,不丢失任何研究上下文。
这种设计让 LLM 从“黑盒推理器”变成“可审计的计算单元”,彻底规避chatgpt failed to start. unable to locate the codex cli binary or required runtime components这类无法定位根源的错误——因为orx的错误信息永远指向具体文件、具体参数、具体时间点。
4. 常见问题与排查技巧实录:那些只有踩过坑才知道的真相
4.1 “orx command not found” 与 PATH 陷阱的终极解法
这是新手最常卡住的点,表面是 PATH 问题,深层是环境认知偏差。orx的安装路径取决于你的 Python 环境,而which orx的结果可能让你困惑:
| 场景 | which orx输出 | 问题根源 | 解决方案 |
|---|---|---|---|
| 全局 pip 安装 | /usr/local/bin/orx | macOS/Linux 系统 Python 权限受限,pip install需sudo,但sudo会改变环境变量 | 永远不用全局 pip,坚持venv方案(见 3.1) |
| Windows PowerShell | C:\Users\Name\AppData\Roaming\Python\Python39\Scripts\orx.exe | Windows 的AppData\Roaming路径常被杀毒软件拦截,导致.exe被误删 | 运行pip uninstall orx-cli && pip install orx-cli重装,或手动将该路径加入系统 PATH |
| VS Code 终端 | /bin/zsh: orx: command not found | VS Code 启动时未加载 shell 的.zshrc,PATH 不包含venv的bin/ | 在 VS Code 设置中启用"terminal.integrated.profiles.windows": { "PowerShell": { "path": "pwsh.exe", "args": ["-ExecutionPolicy", "Bypass"] } },或直接在终端中source ~/orx-env/bin/activate |
实操心得:我曾帮一位生物信息学博士解决此问题。他用
conda activate base后orx --version成功,但在 VS Code 里失败。根源是 VS Code 的 Python 扩展默认使用 conda 环境,而orx安装在venv。解决方案不是改 PATH,而是:在 VS Code 中Ctrl+Shift+P→Python: Select Interpreter→ 选择~/orx-env/bin/python。这比折腾 PATH 可靠十倍。
4.2 实验失败时的三层诊断法:从日志到数据指纹
当orx experiment run报错,不要急着重跑。orx的设计让你能像调试代码一样逐层排查:
第一层:历史日志(History Log)
orx history list --limit=5 orx history show 20240515-142233 # 查看具体某次执行日志中包含:
command: 完整命令行;exit_code: 0 为成功,非 0 为失败;duration: 执行耗时;error: 错误摘要(如LLM timeout after 60s)。
第二层:实验目录快照(Experiment Snapshot)
进入失败实验目录experiments/exp-003/,检查:
run.yaml中input.data指向的bias-dataset-v1是否存在?orx data list验证;input.data对应的data/raw/bias-corpus.csv文件是否被意外修改?orx data verify bias-dataset-v1计算当前 hash 并对比metadata.yaml中的 hash;output/目录下是否有部分生成文件?如有,说明 LLM 调用成功但后处理失败。
第三层:引擎沙箱日志(Engine Sandbox Log)orx会在.orx/sandbox/下为每次 LLM 调用创建唯一目录,如.orx/sandbox/llm-20240515-142233-abc123/,内含:
input.json: 实际发送给 LLM 的 payload;output.json: LLM 返回的原始 response;stderr.log: 引擎执行时的标准错误(如curl: (7) Failed to connect to localhost port 11434)。
实操心得:一次客户反馈
orx experiment run卡住 5 分钟后超时。我让他ls -la .orx/sandbox/llm-*,发现最新目录下stderr.log写着Error: Model 'llama3' not found. Available: [phi3, qwen2]。原来他ollama pull llama3时网络中断,只下载了部分文件。orx的沙箱日志直接暴露了 root cause,而codex cli类工具通常只报Connection refused,让人误以为是端口问题。
4.3 本地协作中的 Git 冲突:如何优雅处理“两个研究员同时改同一个实验”
orx sync生成的 patch 本质是 Git diff,因此多人协作必然遇到冲突。orx不回避这个问题,而是提供结构化解决路径:
冲突识别:当
orx apply-patch遇到冲突,它不会强行覆盖,而是生成CONFLICTS.md,列出冲突文件及类型:Conflicts in experiments/exp-003/run.yaml: - Line 5: 'metrics' value differs (Alice: ["acc"], Bob: ["acc","f1"]) - Line 10: 'input.data' points to different datasets语义化合并:
orx merge resolve会启动交互式合并器,针对不同字段提供策略:metrics: 多选合并(自动去重);input.data: 要求选择保留哪个 dataset ID,或创建新 dataset;notes: 并行保留,生成notes/merged-20240515.md。
可验证回滚:合并后,
orx experiment verify exp-003会重新校验所有依赖(如input.data是否存在、engine.llm是否可用),并运行轻量 smoke test(如用 1 条样本数据测试 pipeline 是否通)。
实操心得:我们团队曾用此流程处理过一次严重冲突。两位研究员分别优化了同一实验的 prompt 和数据预处理,
orx merge resolve自动合并了run.yaml,但提示preprocessing.py有函数签名冲突。我们没手动改代码,而是orx experiment clone exp-003 --as=exp-003-merge,在新目录下用orx code run preprocessing.py测试,确认合并版正确后,再orx experiment promote exp-003-merge替换原实验。整个过程 12 分钟,无数据丢失。
4.4 性能瓶颈定位:当 orx 变慢,问题不在 CLI 本身
orx的性能问题 90% 出现在外部依赖,而非 CLI 代码。快速定位方法:
| 现象 | 检查点 | 命令 | 预期结果 | 问题定位 |
|---|---|---|---|---|
orx note list很慢 | .orx/notes/文件数量 | ls -1 .orx/notes/ | wc -l | > 1000 个文件 | 笔记过多,需orx note archive --before=2023归档旧笔记 |
orx experiment run卡在 LLM 调用 | Ollama 服务状态 | curl -s http://localhost:11434/api/tags | jq '.models[].name' | 返回空或超时 | Ollama 服务未启动或模型未加载 |
orx sync生成 patch 很大 | .orx/history/日志大小 | du -sh .orx/history/ | > 500MB | 历史日志未清理,orx history prune --older-than=90d |
orx compare报内存不足 | experiments/*/result.json大小 | ls -lSh experiments/*/result.json | head -5 | 单个 > 10MB | 某实验输出了冗余日志,需修改run.yaml的output.format |
实操心得:一位用户抱怨
orx比zcode cli慢。我让他time orx note list,发现耗时 8 秒。ls -1 .orx/notes/ \| wc -l显示 3271 个文件。orx note archive --before=2022后,orx note list降到 0.3 秒。orx的设计哲学在此体现:它不做“智能压缩”,而是给你清晰的杠杆——你知道该砍哪里,而不是被黑盒性能拖累。
5. 进阶扩展:如何用 orx 构建个人研究知识库,而非单个项目管理
OpenResearch 的终极价值,不在管理单个项目,而在构建跨项目、可演化的个人研究知识图谱。orx提供了三个原生支持的扩展方向:
5.1 跨项目链接:用orx link建立研究脉络
研究不是孤立的。你去年做的“医疗文本实体识别”实验,可能为今年的“临床决策支持”提供 baseline。orx用link命令显式建模这种关系:
# 在当前项目中,声明依赖另一个项目 orx link add --project=~/research/medical-ner --type=baseline --reason="use as pre-trained model" # 在 medical-ner 项目中,声明被引用 orx link add --project=~/research/clinical-dss --type=upstream --reason="enables zero-shot transfer"执行后,.orx/links.yaml自动生成:
- project: "/home/user/research/medical-ner" type: "baseline" reason: "use as pre-trained model" timestamp: "2024-05-15T10:22:33Z" - project: "/home/user/research/clinical-dss" type: "upstream" reason: "enables zero-shot transfer" timestamp: "2024-05-15T10:23:01Z"orx graph --global会扫描所有~/.orx/projects/下的links.yaml,生成全局依赖图。这比在 Notion 里手动维护“相关项目”列表可靠得多——因为orx link是原子操作,失败则无副作用。
5.2 知识提取自动化:用orx extract从笔记中挖结构化洞见
你的笔记里藏着金矿。orx extract能从 Markdown 笔记中抽取出结构化知识:
orx extract --from=notes/ --pattern="Hypothesis: (.*)" --as=hypotheses orx extract --from=experiments/ --pattern="Accuracy: ([0-9.]+)" --as=metrics结果存入.orx/knowledge/:
hypotheses.csv: 所有 Hypothesis 语句 + 出现位置 + 时间戳;metrics.db: SQLite 数据库,含 experiment_id、metric_name、value、timestamp。
实操心得:我用此功能分析了自己三年来的 217 个实验笔记,发现 68% 的失败实验都提到了“数据噪声”这个词。这直接推动我建立了
orx data quality check命令,成为团队标准流程。orx不提供 AI 总结,但它给你干净的、可编程的原材料。
5.3 与现有工具链无缝嵌入:VS Code、Obsidian、Jupyter 的 orx 插件
orx的 CLI 设计天然适配 IDE 集成:
- VS Code:官方插件
orx-tools提供命令面板(Ctrl+Shift+P→ORX: Run Experiment),并在侧边栏显示.orx/projects/结构,点击run.yaml可直接编辑; - Obsidian:社区插件
orx-linker能将 Obsidian 中的[[note-id]]自动同步到.orx/notes/,反之亦然; - Jupyter:
%load_ext orx_magic魔法命令,让 notebook 单元格支持%%orx experiment语法,执行后自动存入experiments/。
关键在于:这些插件不接管你的工作流,只是orxCLI 的快捷入口。你依然可以用orx experiment run批量处理,插件只是锦上添花。
我在实际使用中发现,最强大的组合是:VS Code 写run.yaml+ Terminal 运行orx experiment run+ Obsidian 查看notes/+orx graph可视化脉络。没有“一站式平台”的幻觉,每个工具各司其职,而orx是它们之间的神经中枢。这种松耦合,才是 long-term research sustainability 的真正基石。
最后再分享一个小技巧:orx的所有命令都支持--dry-run参数。比如orx experiment run --dry-run会打印将要执行的步骤、调用的引擎、预期的输出路径,但不真正运行。我养成了习惯:任何新实验,必先--dry-run,确认路径、参数、依赖都无误,再正式执行。这省下的 debug 时间,远超多敲的几个字符。