news 2026/9/3 1:04:02

Code as Worlds:智能体用可执行代码构建世界模型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Code as Worlds:智能体用可执行代码构建世界模型

在 Agent 研究和工程实践中,一个正在快速升温的方向是 “Code as Worlds”:智能体不再把对环境的理解只保存在自然语言描述或网络参数里,而是把环境规则写成一段可执行代码。也就是说,Agent 用 Python 函数表示自己学到的东西,通过运行这段代码来做预测、规划行动,并在预测和真实环境反馈不一致时修改代码。这篇文章先解释这个概念解决什么问题,再给出一个可以在本机跑通的最小案例,最后讨论沙箱、反馈设计、常见坑和生产落地要点。

1. 理解可执行世界表征:为什么智能体需要把世界变成代码

1.1 世界表征的演进:从文本描述到可运行模型

传统智能体系统里,对世界的理解通常有两种载体。第一种是自然语言,比如“房间左侧有一堵墙,向右走会进入走廊”。这种描述人类容易读,但机器很难直接执行。第二种是神经网络的隐式表征,比如一个世界模型把观测编码成向量,再通过网络预测下一步状态。这种表征能处理复杂视觉输入,但难以解释,也很难在发现逻辑错误时单独修正某一条规则。

“Code as Worlds” 的核心主张是:把世界表征写成代码。代码同时具备三个属性:

  • 可执行:step(state, action)可以直接跑起来,输出确定性的预测结果。
  • 可检查:规则写在函数体里,哪一行判断错了,人类和 Agent 都能看到。
  • 可修改:如果预测错误,只需要改代码里面的分支或常量,不需要重新训练整个网络。

用一句话概括:自然语言描述世界,代码运行世界。可执行世界表征让 Agent 在真实行动之前,先在一个“由自己维护的迷你模拟器”里推演后果。

1.2 “可执行”解决了哪几个具体问题

第一个问题是规划。Agent 要完成多步任务时,需要判断“如果先做 A 再做 B 会怎样”。如果世界模型是代码,智能体可以在命名的计划阶段直接模拟:执行step五次,看最终状态是否满足目标。这个过程可以反复进行,成本远低于每次真实环境交互。

第二个问题是验证。代码表征是有明确输入输出契约的。给一组(state, action, expected_state),就可以写单测来验证 Agent 是否真的理解了世界。自然语言描述没法自动断言,向量表征很难构造有效单测,代码可以。

第三个问题是可解释和可调试。行为出错时,顺着代码的执行路径就能看到是哪个条件写错了:是边界判断写反了,还是障碍物坐标漏了。这种可追溯性对生产系统非常重要。

需要澄清一个容易混淆的点:Code as Worlds 不等于“Agent 会写代码完成任务”。编码 Agent 工具写代码是为了直接完成任务本身,代码是动作;而这里讨论的是把环境建模成代码,代码是世界模型,Agent 通过这份模型预测环境反馈。边界确实会重叠,比如编码 Agent 先写测试再写实现,本质上也是用测试代码表达对目标行为的可执行理解。理解这个区别有助于后续设计系统。

1.3 适用边界:不是所有环境都适合代码表征

代码表征最适合规则明确、状态可枚举、动作空间确定的环境,比如网格世界、棋类、订单状态机、设备控制逻辑。它不适合底层视觉感知,也不适合无法用显式规则描述的连续物理过程。

对于复杂环境,更合理的设计是分层:底层用神经网络处理视觉感知,上层用可执行世界模型描述业务规则和转移逻辑。Agent 的规划走代码层,感知信息的浓缩走网络层。

注意:代码世界模型是 Agent 对世界的假设,不是世界本身。Agent 说“我理解了规则”并不代表它写出的函数就是真理,必须通过执行结果和真实环境反馈对齐。

2. 落地路径:先在一个可控环境里验证闭环

2.1 不同世界表征方案的对比

在决定是否采用代码作为世界表征之前,先看各类方案的取舍。下表适合作为设计阶段的速查。

表征形式典型形态是否可执行可检查性可修改性典型场景
自然语言文本一段规则说明对话、需求解释
结构化数据JSON、YAML 描述状态和转移表需要额外解释器静态配置、规则较少
向量 / 嵌入LLM 内部隐藏状态检索、隐式知识
可执行代码Python 函数、DSL世界模型、规划验证
完整仿真器游戏引擎、物理模拟器高保真模拟

从表中可以看出,代码方案在“可执行、可检查、可修改”三个维度上最均衡。缺点是需要额外的执行环境和安全沙箱,实现成本比 JSON 高。

2.2 为什么选择网格世界作为第一个实验环境

网格世界是验证“可执行世界表征”的最小环境。它有明确的状态、四个确定性动作、边界和障碍物规则,非常适合做闭环实验。它的优势是:

  • 真实环境可以用十几行代码实现,方便对照。
  • 状态空间足够小,可以全量采样所有动作验证准确率。
  • 规则简单但存在边界条件,能暴露 Agent 常见的理解偏差,比如“撞障碍物时状态不变”和“出界时状态不变”容易被写错。

学习这个最小案例时关注的不是网格世界本身,而是“生成代码、执行预测、对比真实、反馈修正”这套机制。把环境替换成订单状态机、文件系统操作或 API 调用序列后,机制完全一样。

2.3 技术栈和依赖准备

学习环境建议使用 Python 3.10 或更高版本,安装一个 OpenAI 兼容的客户端 SDK。这里不绑定具体模型,假设你有一个可通过base_urlapi_key访问的模型服务。

如果本机没有模型服务,可以用任意兼容 OpenAI 协议的网关或本地推理服务。关键点是模型能输出 Python 函数,并且支持多轮对话。

python -m venv .venv source .venv/bin/activate pip install openai

这里不要安装多余的框架。为了让读者看清机制,示例里只依赖openai和 Python 标准库中的subprocessasttempfile

3. 最小可运行案例:让 Agent 用代码发现环境规则

3.1 项目结构和模块职责

整个示例拆成三个文件,职责清晰,便于扩展。

code_as_worlds/ ├── env.py # 真实环境,Agent 只能通过接口观察 ├── agent.py # 提示词、LLM 调用、代码抽取 └── executor.py # 子进程沙箱、代码执行、反馈构造

真实环境是唯一的事实来源。Agent 的代码模型只是对环境的猜测,必须通过与真实环境对比来修正。

3.2 第一步:定义真实环境

env.py里实现一个 5x5 网格世界。状态是(x, y)元组,(0, 0)是左上角,动作是字符串。

# env.py class GridWorldEnv: def __init__(self, width=5, height=5, obstacles=None): self.width = width self.height = height self.obstacles = set(obstacles or []) self.state = (0, 0) def reset(self): self.state = (0, 0) return self.state def step(self, action): moves = { "up": (0, -1), "down": (0, 1), "left": (-1, 0), "right": (1, 0), } dx, dy = moves[action] nx, ny = self.state[0] + dx, self.state[1] + dy # 超出边界,状态不变 if nx < 0 or nx >= self.width or ny < 0 or ny >= self.height: return self.state, False # 撞上障碍物,状态不变 if (nx, ny) in self.obstacles: return self.state, False self.state = (nx, ny) return self.state, True

这里有两个容易写错的地方。第一,self.state要保持元组类型,否则和模型输出的比较会出现类型不一致。第二,障碍物集合要在初始化时转换一次,避免每次step都重复转换。

3.3 第二步:构造提示词并调用 LLM

agent.py里定义系统提示词。提示词必须把状态格式、动作集合、函数签名、返回格式都交代清楚,否则模型输出的函数很可能不符合调用约定。

# agent.py import os import re SYSTEM_PROMPT = """你是一个会写代码的智能体。你正在观察一个 5x5 网格世界,并通过写 Python 函数来表示你学到的规则。 世界规则: - 状态用 (x, y) 表示,(0, 0) 是左上角。 - 动作只有四种:up、down、left、right。 - 走出边界时,状态保持不变,动作无效。 - 撞到障碍物时,状态保持不变,动作无效。 - 其他情况,状态沿动作方向移动一格。 请输出一个完整的 Python 函数: def step(state, action): # state: (x, y) 元组 # action: 'up' | 'down' | 'left' | 'right' # 返回 (new_state, valid),valid 表示动作是否有效 只输出这个函数,不要输出解释文字。 """ def call_llm(messages, model="deepseek-chat"): """调用 OpenAI 兼容接口。实际项目按自己的网关调整。""" import openai client = openai.OpenAI( api_key=os.environ.get("LLM_API_KEY"), base_url=os.environ.get("LLM_BASE_URL", "https://api.deepseek.com"), ) resp = client.chat.completions.create( model=model, messages=messages, temperature=0.2, max_tokens=1024, ) return resp.choices[0].message.content def extract_code(text): """从模型输出中抽取出 step 函数定义。""" block = re.search(r"```(?:python)?\s*(.*?)```", text, re.S) if block: text = block.group(1) idx = text.find("def step") if idx == -1: return None return text[idx:].strip()

extract_code先尝试解析 markdown 代码块,再退回到直接定位def step。实际项目中模型输出经常夹杂解释文字,这个防御式抽取很必要。

3.4 第三步:在子进程沙箱里执行模型生成的代码

executor.py是整套机制里最关键也最容易出问题的部分。模型生成的代码来自不可信来源,不能直接用exec在当前进程里运行。示例使用子进程加临时目录的方式做基础隔离。

# executor.py import ast import os import subprocess import sys import tempfile def run_prediction(code, state, action, timeout=5): """在子进程中执行模型生成的 step 函数,返回预测结果或错误信息。""" with tempfile.TemporaryDirectory() as tmpdir: mod_path = os.path.join(tmpdir, "wm.py") with open(mod_path, "w", encoding="utf-8") as f: f.write(code) script = ( "import sys\n" f"sys.path.insert(0, {tmpdir!r})\n" "import wm\n" f"print(wm.step({state!r}, {action!r}))\n" ) try: proc = subprocess.run( [sys.executable, "-c", script], capture_output=True, text=True, timeout=timeout, ) except subprocess.TimeoutExpired: return None, "subprocess timeout" if proc.returncode != 0: return None, proc.stderr.strip() try: return ast.literal_eval(proc.stdout.strip()), None except Exception as exc: return None, f"parse error: {exc}"

这里用了ast.literal_eval解析子进程标准输出,而不是eval。因为子进程的输出期望是一个元组字面量,ast.literal_eval只解析字面量,不会执行任意表达式,更安全。

3.5 第四步:对比真实环境并构造反馈

主循环里完成“采样状态 -> 执行真实动作 -> 执行模型代码 -> 比较结果 -> 返回反馈”的闭环。

# agent.py 追加部分 from env import GridWorldEnv from executor import run_prediction ACTIONS = ["up", "down", "left", "right"] def build_feedback(pred, actual, state, action): if pred is None: return f"在状态 {state} 执行 {action} 时,你的代码执行失败,请修正。" expected_state, expected_valid = actual got_state, got_valid = pred return ( f"在状态 {state} 执行动作 {action} 时:\n" f"真实结果: state={expected_state}, valid={expected_valid}\n" f"你的预测: state={got_state}, valid={got_valid}\n" "请根据差异修正 step 函数。" ) def main(): env = GridWorldEnv(width=5, height=5, obstacles=[(1, 1), (3, 2)]) messages = [ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": "请先生成第一版世界模型代码。"}, ] # 采样一组代表状态:覆盖普通位置、边界附近和障碍物附近 sample_states = [(0, 0), (0, 4), (2, 2), (3, 1), (4, 4)] for round_no in range(6): reply = call_llm(messages) code = extract_code(reply) if code is None: messages.append({"role": "assistant", "content": reply}) messages.append({"role": "user", "content": "输出里没有找到 def step,请重新只输出函数。"}) continue env.reset() errors = 0 total = 0 feedback_lines = [] for state in sample_states: for action in ACTIONS: # 测试用:直接把真实环境状态设置到采样状态 env.state = state actual = env.step(action) pred, err = run_prediction(code, state, action) total += 1 if err or pred != actual: errors += 1 feedback_lines.append(build_feedback(pred, actual, state, action)) acc = (total - errors) / total print(f"[round {round_no}] 模型预测准确率: {acc:.2%} ({total - errors}/{total})") if errors == 0: print("Agent 发现了可执行世界表征,停止训练。") print(code) return feedback = ( f"第 {round_no} 轮预测准确率为 {acc:.2%}。\n" + "\n".join(feedback_lines[:3]) + "\n请重新输出修正后的 step 函数。" ) messages.append({"role": "assistant", "content": reply}) messages.append({"role": "user", "content": feedback}) print("达到最大轮数,未收敛。")

运行方式:

export LLM_API_KEY="你的密钥" export LLM_BASE_URL="https://api.deepseek.com" python agent.py

如果模型第一轮就写对了规则,输出类似:

[round 0] 模型预测准确率: 100.00% (20/20) Agent 发现了可执行世界表征,停止训练。

如果环境规则更复杂,会看到准确率逐轮提升,最后一轮收敛。

4. 关键机制拆解:执行、验证、反馈三要素

4.1 为什么不能在当前进程直接执行 Agent 生成的代码

模型生成的代码可能包含死循环、资源耗尽操作、文件读写、系统调用,甚至恶意代码。直接exec会在宿主进程里运行这些代码,后果不可控。

示例采用两层防线。第一层用临时目录隔离模块,避免污染项目目录。第二层用subprocess启动独立 Python 进程,并通过timeout控制最大执行时间。

但要注意:子进程隔离不等于安全隔离。子进程仍然可以访问宿主机的文件系统、网络和环境变量。生产环境需要更严格的方案,比如 Docker 容器、gVisor、Firecracker 微虚拟机,或者远程代码执行服务。是否引入容器取决于代码来源的可信度。对于完全不可信的模型输出,应该假设它可能尝试读取敏感文件或访问内网。

注意:示例里的沙箱只用于学习和原型验证。真实环境中,请把 Agent 生成代码的执行放到专用沙箱服务里,并且不允许它访问生产网络和密钥。

4.2 反馈信息要结构化,而不是只说“你错了”

反馈循环是否收敛,很大程度上取决于反馈质量。只写“预测结果不对”对模型几乎没有修正价值。好的反馈包含三部分:

  • 触发错误的输入:state=(0,0), action='left'
  • 真实输出:环境返回的(state, valid)
  • 模型输出:Agent 预测的(state, valid)

示例里的build_feedback就是按这个结构构造的。每轮最多保留前三条错误样本,避免上下文过长。

还需要注意一个细节:如果模型代码执行出错,也要把错误信息返回给模型。很多情况下,Agent 不是不知道规则,而是函数签名写错了,比如返回了(valid, state)而不是(state, valid)。把stderr截断后附进反馈,模型能很快修正调用契约。

4.3 采样策略决定验证质量

全量采样网格世界所有状态会得到最准确的评估,但真实场景往往面临组合爆炸。示例里选了 5 个代表性状态:

采样状态覆盖目标
(0, 0)左上角边界
(0, 4)左下角边界
(2, 2)普通内部区域
(3, 1)障碍物附近
(4, 4)右下角边界

每个状态执行四个动作,共 20 次预测。这个样本量足够发现最典型的规则错误,比如“出界处理缺失”“障碍物坐标写错”“动作方向映射错误”。

如果环境规则更复杂,建议按以下原则扩展采样:覆盖所有边界条件、覆盖所有特殊对象邻域、加入随机采样、对关键转移路径做穷举。

4.4 关键参数说明

示例里有几个参数可以直接调整,理解它们的含义比抄代码更重要。

参数示例值作用调小的效果调大的效果
temperature0.2控制模型输出随机性更稳定,但可能陷入同一个错误循环更容易跳出局部错误,但可能越改越乱
max_tokens1024限制生成内容长度可能截断函数定义允许更长的代码,但增加延迟
最大轮数6限制训练循环次数可能没来得及收敛增加耗时,也可能让上下文过长
timeout5 秒单次代码执行超时可能误杀正常代码死循环代码会阻塞更久

对于网格世界这类简单环境,temperature=0.20.4比较合适。复杂模型可以适当调高,但必须配合反馈防抖,比如连续两轮完全相同的结果就不再重新提交相同内容。

4.5 学习环境与生产环境的差异

维度学习环境生产环境
沙箱子进程 + 临时目录容器、微虚拟机、远程执行服务
模型来源一个兼容 API多个模型、版本切换、灰度
反馈日志print 到终端结构化日志、链路追踪
收敛判断本地变量指标上报、告警
代码审批高风险操作需人工审批
成本控制忽略需要 token 计量和配额

生产环境的反馈循环往往不是一次交互闭环,而是要接入任务队列、失败重试、人工审核和审计日志。这些在原型阶段可以暂时不管,设计时心里要有数。

5. 运行验证与结果观察

5.1 怎么判断一次训练真的成功

代码能运行不等于 Agent 发现了世界表征。判断成功的标准是:

  • 在采样状态上预测准确率达到 100%。
  • 对未参与采样的状态和动作组合,也能用代码正确预测。
  • 生成的代码结构稳定,不同轮次之间没有大幅随机波动。
  • 人工审查代码时,能确认边界条件和障碍物判断与真实环境一致。

建议在代码里加一段“留出测试集”逻辑,比如只用sample_states的一部分生成反馈,另一部分做最终验证。这样可以避免 Agent 只是把反馈里的错误样本背下来,而不是真正学到规则。

5.2 失败模式的观察

如果循环达到最大轮数仍未收敛,通常看到三类现象。

第一类是准确率停留在某个固定值。比如一直卡在 80%,说明 Agent 没学到某个特定规则,往往是边界判断。此时要看前三条错误样本,是否集中在同一类转移上。

第二类是代码在语法上不断变化但语义不变。模型每次都在改括号、缩进,却始终忽略障碍物规则。这种情况要降低temperature,并在系统提示词里补充“障碍物为 (1,1) 和 (3,2)”。

第三类是反馈循环越来越长,但每轮准确率没有提升。此时需要人工介入,检查提示词是否把早期观察到的规则冲掉了。常见做法是把历史确认规则单独放在提示词开头。

6. 常见问题排查

6.1 问题现象与处理方案速查

问题现象可能原因检查方式处理建议
生成的代码有语法错误模型输出混入解释文字,或抽取逻辑失效打印模型原始输出,检查extract_code是否截断强化提示词只输出函数;用代码块解析;保存每轮原始输出
代码能运行但预测全部错误调用契约不匹配,比如返回(valid, state)打印一次predactual的原始结果把函数签名和返回顺序写进系统提示词,并在反馈里附错误样例
准确率稳定但不收敛缺少某类规则上下文,或反馈样本不足统计错误分布,看集中在哪个动作或状态增加采样状态,把少量确定性规则写成“已知事实”加入提示词
子进程超时模型生成死循环或超大循环检查 stderr 里的 timeout 标识降低 timeout,在提示词里限制循环次数,或对代码做静态检查
每轮输出不稳定temperature 过高对比两轮代码 diff降低 temperature,限制为 0.2 或更低
上下文过长导致模型忽略早期信息多轮反馈全部堆在 messages 里查看 token 消耗把历史反馈摘要成“已知规则”,只保留最近两轮细节

6.2 排查顺序

遇到任何问题时,按下面的顺序排查,不要直接怀疑模型能力。

  1. 输入是否正确:动作字符串是否一致,状态元组是否和模型代码约定匹配。
  2. 路径和命名:模型生成的模块名、函数名、导入语句是否和调用脚本一致。
  3. 依赖版本:openaiSDK 版本是否支持当前模型接口,base_url是否正确。
  4. 配置是否生效:环境变量LLM_API_KEYLLM_BASE_URL是否真的传入。
  5. 沙箱行为:子进程是否因为权限、依赖缺失、路径问题而失败。
  6. 反馈质量:错误信息是否包含原始输入和输出,是否足够定位差异。
  7. 模型服务本身:是否限流、超时、返回空内容。

6.3 一个典型案例:模型一直漏掉障碍物规则

最常见的现象是:Agent 生成的代码正确处理了边界,但对障碍物视而不见,准确率稳定在 85% 左右。原因是第一版反馈里恰好没有“撞上障碍物”的样本,或者障碍物坐标只出现在一个状态组合里,模型没有足够证据推断障碍物是一组集合而不是一个点。

解决办法有两种。第一是在采样状态里显式加入障碍物邻域,比如(0,1)(1,0)(2,1)(3,3),让反馈必然覆盖障碍物命中场景。第二是在系统提示词里明确写出“环境中存在障碍物”,把障碍物坐标作为待发现信息,而不是完全隐藏在交互数据里。

7. 从玩具环境到真实 Agent 工程

7.1 可执行世界表征在真实项目里的三种形态

第一种是任务规划器中的环境模型。智能体要操作订单系统时,可以把订单状态机写成代码:transition(order, event)。规划时先模拟几条事件序列,找出能到达终态的那条,再真实调用 API。

第二种是测试优先的代码 Agent。Agent 在改代码前先生成一组测试用例,这些测试本身就是对目标行为的可执行表征。随后实现只要满足测试即可。这个模式在 Claude Code、Codex 等编码工具的工作流里越来越常见,本质就是把“对目标世界的理解”落实成可运行断言。

第三种是模拟器集成。在游戏、机器人、运维演练场景里,Agent 维护一份轻量级模拟器,用来评估策略。模拟器可以逐步从代码假设升级到完整仿真,但任何时候都保留代码层,便于快速验证和高频调用。

这些形态的共同点是:世界表征必须能运行、能验证、能修改。这和玩具案例里的机制完全一致,只是环境替换成了真实业务。

7.2 与现有 Agent 框架的关系

当前热门的 Agent 框架,例如 Dify、Coze、LangGraph 等,更多在解决“Agent 如何编排工具、如何管理对话状态、如何调用模型”的问题。Code as Worlds 关注的是另一层:Agent 如何维护对环境的可执行理解。

两者可以结合。框架负责调度和工具调用,应用层维护一份可执行世界模型,Agent 在计划阶段调用这份模型做推演。引入框架时,关键是评估它的状态管理和工具调用机制是否能承载“代码生成 -> 执行 -> 反馈 -> 更新”的循环。很多框架支持自定义工具,可以把run_predictionbuild_feedback封装成工具,由 Agent 自己决定何时调用。

7.3 生产落地检查清单

在设计真实系统之前,建议逐项检查以下清单:

  • 沙箱方案是否隔离了文件系统、网络、环境变量和密钥。
  • 执行超时、内存限制、CPU 配额是否配置。
  • Agent 生成的代码是否有审计日志,原始输出、抽取代码、执行结果是否都可追溯。
  • 是否存在人工审批入口,特别是高风险操作。
  • 采样策略是否覆盖边界条件和特殊对象。
  • 反馈信息是否结构化,错误样本是否截断到模型可处理的长度。
  • 是否设置了轮次上限和 token 预算。
  • 模型输出是否经过语法校验和基础静态检查后再执行。
  • 训练循环和真实业务调用是否隔离,避免验证占用生产资源。
  • 是否保留“回滚上一版本世界模型”的能力。

7.4 扩展方向

从最小案例出发,可以按三个方向扩展。

方向上,把网格世界换成状态机或 API 流程,让 Agent 发现业务系统的工作流规则。这时候世界模型从“环境模拟”变成“业务流程模拟”,更有实际价值。

方向二,引入多智能体。每个 Agent 维护自己的世界模型,通过共享反馈池互相校验。这能暴露单个 Agent 无法发现的盲区。

方向三,加入不确定性和对抗。真实环境往往有随机扰动,比如动作有 10% 概率失败。Agent 的代码模型需要引入概率分支,验证时也要多次采样统计分布。这一步会让反馈设计和收敛判断复杂很多,但也是从玩具走向生产必须跨过的一步。

回头再看开头的判断:可执行世界表征的价值,不在于用代码描述环境,而在于让环境理解变得可运行、可验证、可修正。这种能力是神经网络隐式表征和自然语言描述都难以直接提供的。对正在做 Agent 工程的人来说,最务实的起点就是今天这个最小闭环:生成环境代码,运行它,让它和真实世界对答案。把这一圈跑通,再往业务场景里迁移时,核心机制不会变,变的只是环境定义和沙箱强度。

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

为了更好地理解tidyr包的实际应用,我们来看看一个真实案例

下面的内容摘录自《用R探索医药数据科学》专栏文章的部分内容&#xff08;原文6047字&#xff09;。 2篇2章3节&#xff1a;处理医学类原始数据的重要技巧&#xff0c;R语言中的宽长数据转换&#xff0c;tidyr包的使用指南_r语言 医学公共数据库 变量类型及转换-CSDN博客 在数…

作者头像 李华
网站建设 2026/9/3 0:42:56

四足机器狗室外建图:Mid360与LIO-SAM调试全攻略

用 Mid360 跑 LIO-SAM 给四足机器狗做室外建图&#xff0c;最近问的人很多。这个组合最容易被误解的地方&#xff0c;是大家以为装上驱动、把 LIO-SAM 跑起来&#xff0c;就能复刻网上那种漂亮的彩色点云图。实际上从雷达上电、IP 配置、驱动版本、坐标外参&#xff0c;到机器狗…

作者头像 李华
网站建设 2026/9/3 0:35:04

墨见首发:基于OpenClaw引擎,你的全栈“赛博合伙人”已上线

如今, 在软件开发领域里, AI技术的应用正从技术验证阶段迈向更具实际意义的工程落地进程。与此同时, 开发者对于那些仅仅能够生成基础代码片段的工具, 以及那些逻辑欠缺完整度的静态页面辅助工具, 显著地减少了兴趣。 近日, 国内设计协作“巨头”墨刀, 正式发布了其筹备了很久…

作者头像 李华
网站建设 2026/9/3 0:31:57

8款主流AI论文平台横向实测,本硕博避坑选型手册

前言&#xff1a;AI 写论文乱象频发&#xff0c;实测 8 款工具理清适配边界 每到毕业季&#xff0c;本科生、硕博生都会集中寻找 AI 论文辅助工具&#xff0c;市面各类写作软件层出不穷&#xff0c;但普遍存在几类硬伤&#xff1a;虚假参考文献、无法匹配本校格式、不支持公式代…

作者头像 李华
网站建设 2026/9/3 0:01:38

王者万象棋排位模式后三位扣分规则介绍 万象棋排位扣分怎么算

王者万象棋的排位模式有一套独特的段位和扣分机制。其中王者万象棋排位模式后三位扣分怎么算&#xff0c;是很多玩家在排位上分过程中遇到的问题。王者万象棋排位模式后三位扣分的规则涉及段位保护、组队结算和阶梯式扣分几个方面。这篇攻略就详细拆解&#xff0c;想要获得更好…

作者头像 李华