当前位置: 首页 > news >正文

【RL Latest Tech】安全强化学习(Safe RL):理论、方法与应用

        📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉强化学习专栏:

       【强化学习】(26)---《安全强化学习(Safe RL):理论、方法与应用》

安全强化学习(Safe RL):理论、方法与应用

目录

1.引言

2.什么是安全强化学习?

3.关键概念

4.安全强化学习的主要方法

1. 约束强化学习(Constrained Reinforcement Learning)

2. 屏蔽强化学习(Shielded RL)

3. 风险约束策略梯度(Risk-Constrained Policy Gradient)

[Python] Safe RL伪代码

[Notice]  伪代码解释:

5.应用与案例

6.结论


1.引言

        在强化学习(Reinforcement Learning, RL)中,智能体通过与环境的交互来学习一个策略,以最大化长期累积回报。然而,传统的强化学习算法在优化回报时往往不考虑智能体行为的安全性,导致在训练或部署过程中可能出现不安全的行为。**安全强化学习Safe Reinforcement Learning,Safe RL)**正是在此背景下提出的,它旨在在优化回报的同时确保智能体的行为符合某些安全约束。这对于实际应用尤为重要,如自动驾驶、机器人控制、医疗系统等场景中,安全问题至关重要,任何不安全的行为都可能带来严重后果。下图是约束策略优化(Constrained Policy Optimization, CPO)算法图。


2.什么是安全强化学习?

        安全强化学习是强化学习的一个分支,重点在于在学习过程中及部署过程中满足一定的安全约束。这些安全约束可以是物理、伦理或法律层面的限制。例如,自动驾驶汽车的强化学习模型应避免发生碰撞,医疗领域的强化学习模型需要避免对病人健康产生风险。

        在强化学习的传统框架下,智能体学习的是一个最优策略( \pi^* ),该策略通过最大化累积奖励(回报)( G_t = \sum_{k=0}^{\infty} \gamma^k R_{t+k} ) 来优化智能体的行为决策。这里, ( R_t )是时间步( t )的奖励值,( \gamma \in [0, 1] )是折扣因子。然而,安全强化学习不仅仅考虑累积奖励,还需要确保在整个学习过程中智能体的行为是安全的。这就引入了安全约束,用公式表达为:

[ \text{maximize } \mathbb{E} \left[ \sum_{t=0}^{\infty} \gamma^t R_t \right] \quad \text{subject to } \mathbb{P}(s_t \in \mathcal{S}_{unsafe}) = 0, \forall t ]

其中,( \mathcal{S}_{unsafe} ) 是不安全状态的集合。安全强化学习通过在策略优化过程中增加约束条件来保证智能体不会进入不安全的状态。


3.关键概念

1. 安全约束

        在安全强化学习中,**安全约束(Safety Constraints)**是决定智能体行为是否安全的标准。通常,安全约束可以体现在以下几方面:

  • 物理限制:如机器人避免碰撞或超过速度限制。
  • 资源限制:如能量消耗不超过一定阈值。
  • 伦理或法律限制:如自动驾驶汽车遵守交通规则,或医疗系统不能给患者带来过度的健康风险。

        这些约束可以是硬约束(Hard Constraints),即必须严格遵守的约束,也可以是软约束(Soft Constraints),即在一定范围内可以违反但需要付出代价。

2. 风险敏感优化

        在传统强化学习中,优化目标通常是最大化期望回报 ( \mathbb{E}[G_t] )。然而,在安全强化学习中,我们需要**风险敏感(Risk-Sensitive)**的优化目标。具体来说,风险可以用多种方式进行度量,例如:

  • 方差(Variance):衡量回报的不确定性。
  • 在险价值(Value at Risk, VaR):在给定的置信水平下,可能发生的最大损失。
  • 条件在险价值(Conditional Value at Risk, CVaR):考虑了最坏情况下的损失。

通过引入风险度量,安全强化学习可以避免智能体在某些不确定的情况下做出高风险的决策。

[ \text{maximize } \mathbb{E} \left[ \sum_{t=0}^{\infty} \gamma^t R_t \right] \quad \text{subject to } \text{Risk}(G_t) \leq \delta ]

其中,( \delta )是风险的容忍水平。

3. 奖励塑形与惩罚机制

        为了引导智能体学习到安全的行为,奖励塑形(Reward Shaping) 是一种常见的技术。具体做法是,将奖励函数修改为同时考虑回报和安全性的组合:

[ R'(s, a, s') = R(s, a, s') - \lambda \cdot \text{Cost}(s, a, s') ]

其中,( R(s, a, s') )是原始的奖励函数,( \text{Cost}(s, a, s') ) 是智能体在状态 ( s )采取动作( a )后进入状态( s' )时的安全代价,( \lambda )是代价权重。这样,当智能体采取不安全行为时,会受到惩罚,从而促使智能体学习到更安全的策略。


4.安全强化学习的主要方法

        安全强化学习有多种实现方法,以下介绍几种常见的算法及其特点。

1. 约束强化学习(Constrained Reinforcement Learning)

约束强化学习 的目标是在遵守安全约束的前提下最大化回报。其优化问题可以形式化为:

[ \max_{\pi} \mathbb{E}{\pi}\left[ G_t \right] \quad \text{subject to } \mathbb{E}{\pi}\left[ C_t \right] \leq c_{max} ]

其中,( C_t )是时间步( t )的代价函数(如安全成本),( c_{max} )是代价的上限。

常用的算法包括:

  • 约束策略优化(Constrained Policy Optimization, CPO):在策略优化过程中直接处理约束。
  • Lagrangian Relaxation:将约束问题转换为拉格朗日乘子问题,通过优化原问题和约束问题的拉格朗日形式来解决。

2. 屏蔽强化学习(Shielded RL)

        屏蔽强化学习(Shielded Reinforcement Learning) 是一种结合形式化验证和强化学习的技术。通过引入一个“屏蔽器(Shield)”,智能体在采取动作之前,会通过屏蔽器检查该动作是否安全。如果不安全,屏蔽器会拒绝该动作并建议安全的替代动作。

        这种方法尤其适用于高风险环境,如自动驾驶和机器人控制。在屏蔽强化学习中,屏蔽器的设计往往依赖于形式化方法,如线性时序逻辑(Linear Temporal Logic, LTL)等。

3. 风险约束策略梯度(Risk-Constrained Policy Gradient)

        风险约束策略梯度(Risk-Constrained Policy Gradient) 是一种基于策略梯度的安全强化学习方法,特别适用于连续动作空间。其目标是在约束总风险的同时最大化累积回报。具体的优化目标为:

[ \max_{\theta} \mathbb{E}{\pi{\theta}} \left[ G_t \right] \quad \text{subject to } \text{CVaR}_{\alpha}(G_t) \leq \delta ]

其中,( \text{CVaR}_{\alpha} ) 是给定置信水平 ( \alpha )的条件在险价值,( \delta )是风险容忍度。通过策略梯度法,智能体可以逐渐学习到在风险受控下的最优策略。


[Python] Safe RL伪代码

        下面给出了一个典型的安全强化学习(Safe Reinforcement Learning)的Python伪代码。该伪代码展示了如何实现约束强化学习,考虑到安全约束,使用拉格朗日乘子法来解决安全性问题。

        🔥若是下面代码复现困难或者有问题,欢迎评论区留言;需要以整个项目形式的代码,请在评论区留下您的邮箱📌,以便于及时分享给您(私信难以及时回复)。

"""《Safe RL伪代码》时间:2024.10.07作者:不去幼儿园
"""
import numpy as np
import gym# 环境初始化
env = gym.make("YourEnvironment-v0")
state_dim = env.observation_space.shape[0]
action_dim = env.action_space.n# 参数初始化
gamma = 0.99  # 折扣因子
alpha = 0.01  # 学习率
lambda_lr = 0.005  # 拉格朗日乘子的学习率
episodes = 1000
constraint_threshold = 10.0  # 约束上限# 策略网络
class PolicyNetwork:def __init__(self):# 定义网络参数,例如全连接层、激活函数等passdef forward(self, state):# 计算动作概率分布passdef update(self, gradients):# 更新网络参数pass# 拉格朗日乘子初始化
lambda_param = 1.0# 策略网络
policy = PolicyNetwork()# 训练过程
for episode in range(episodes):state = env.reset()done = Falserewards = []costs = []while not done:# 根据策略选择动作action_probs = policy.forward(state)action = np.random.choice(action_dim, p=action_probs)# 执行动作,获取下一个状态、奖励和成本next_state, reward, done, info = env.step(action)cost = info.get('cost', 0)  # 获取成本,成本表示不安全行为的发生程度# 记录奖励和成本rewards.append(reward)costs.append(cost)# 更新状态state = next_state# 计算累积奖励和成本G = sum([gamma ** t * r for t, r in enumerate(rewards)])C = sum([gamma ** t * c for t, c in enumerate(costs)])# 计算拉格朗日损失lagrangian_loss = -G + lambda_param * (C - constraint_threshold)# 计算策略梯度并更新策略网络policy_gradients = compute_gradients(lagrangian_loss)policy.update(policy_gradients)# 更新拉格朗日乘子lambda_param += lambda_lr * (C - constraint_threshold)# 确保拉格朗日乘子非负lambda_param = max(0, lambda_param)# 打印每个episode的进度print(f"Episode {episode + 1}: Reward = {G}, Cost = {C}, Lambda = {lambda_param}")# 伪代码结束# 辅助函数 - 计算策略梯度(伪函数)
def compute_gradients(loss):# 实现策略梯度计算return gradients

[Notice]  伪代码解释:

  1. 环境初始化

    • 使用 gym 库来创建强化学习环境,state_dim 和 action_dim 分别表示状态和动作的维度。
  2. 参数初始化

    • 包括折扣因子 gamma、学习率 alpha、拉格朗日乘子的学习率 lambda_lr 以及约束阈值 constraint_threshold 等。
  3. 策略网络

    • PolicyNetwork 类是一个简单的策略网络,用于预测动作概率分布。
    • 其方法 forward() 计算动作概率,update() 通过策略梯度更新参数。
  4. 训练过程

    • 在每个 episode 中,智能体与环境交互并根据当前策略选择动作。
    • 每次执行动作后,获取下一个状态、奖励、成本,以及是否结束。
    • cost 通过 info 字典获取,表示智能体在当前状态执行动作后产生的安全成本。
  5. 拉格朗日损失

    • 损失函数由累积奖励 ( G ) 和累积成本 ( C ) 构成,使用拉格朗日乘子 ( \lambda ) 来权衡两者。
    • lagrangian_loss 是拉格朗日损失,它平衡奖励与违反安全约束的代价。
  6. 策略更新

    • 通过 compute_gradients() 计算策略梯度,然后调用 policy.update() 更新策略。
  7. 更新拉格朗日乘子

    • 使用拉格朗日乘子法的学习率 ( \lambda_{\text{lr}} ) 来调整乘子值,确保成本在预定阈值内。
    • lambda_param 必须保持为非负。
  • 这个伪代码提供了安全强化学习的一般框架。在实际实现中,可能需要使用神经网络、梯度下降优化器(例如 Adam)、和其他策略评估方法。
  • 由于安全强化学习涉及约束优化,策略的调整需要反复验证是否满足安全条件,因此实际实现中可能会引入更多的调试和验证过程。

5.应用与案例

1. 自动驾驶

        在自动驾驶领域,安全是至关重要的。自动驾驶汽车需要在复杂的交通环境中做出实时决策,确保遵守交通规则,避免碰撞和其他事故。安全强化学习可以帮助自动驾驶系统通过学习来不断优化其决策策略,同时确保在各种场景下都能保持安全。

        通过引入安全约束,如速度限制、车道保持和避障策略,自动驾驶系统可以在确保安全的同时逐步提高驾驶效率。屏蔽强化学习在此类场景中尤为适用,可以在系统做出危险决策前予以纠正。

2. 医疗决策

        在医疗领域,强化学习可以应用于个性化治疗方案的制定。然而,医疗决策涉及患者健康的风险,因此需要特别注意安全问题。安全强化学习可以通过约束不安全行为或决策来避免患者受到潜在的伤害。

        例如,在癌症治疗中,强化学习可以用于优化化疗的剂量和时间表。然而,过高的剂量可能会导致严重的副作用,因此系统需要学习在确保治疗效果的同时最小化不良反应。

3. 机器人控制

        在机器人控制中,安全问题同样重要,特别是在与人类共存的环境中。机器人需要通过学习来理解环境和人类的行为模式,并做出相应的安全决策。

        通过安全强化学习,机器人可以在执行任务时避免危险行为,如避免碰撞、正确处理易碎物品或在紧急情况下采取适当的行动。


6.结论

        安全强化学习作为强化学习的一个重要分支,不仅要优化长期回报,还要确保智能体在学习和部署过程中遵守安全约束。通过引入安全约束、风险敏感优化和奖励塑形等技术,安全强化学习为智能体在复杂和不确定的环境中做出安全且有效的决策提供了重要工具和方法。

参考文献:

Joshua Achiam, David Held, Aviv Tamar, Pieter Abbeel,2017,Constrained Policy Optimization

简介: 这篇论文提出了**约束策略优化(Constrained Policy Optimization, CPO)**算法,该算法旨在通过约束优化的方式训练安全的强化学习智能体。它利用二阶梯度信息来直接处理安全约束,从而确保在学习过程中,策略的改进始终在安全约束内。该方法在许多高风险场景(如机器人控制)中都表现出色。

Safe RL评估环境:

Safety Gym: Environment for Evaluating Safe Reinforcement Learning Agents

简介: 介绍了一个专门用于评估安全强化学习算法的环境框架,称为 Safety Gym。该环境提供了多种任务设置,智能体需要在复杂的物理环境中进行任务,同时保持行为的安全性。Safety Gym 已成为评估安全强化学习算法的标准工具之一。


     文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者关注VX公众号:Rain21321,联系作者。✨

相关文章:

【RL Latest Tech】安全强化学习(Safe RL):理论、方法与应用

📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅…...

大模型qiming面试内容整理-系统设计与架构

在大模型和机器学习相关岗位的面试中,系统设计与架构的考察通常会涉及如何设计一个可扩展、可靠且高效的机器学习系统,特别是在面对大规模数据和复杂模型时。这一部分的考察不仅测试候选人对机器学习和深度学习的理解,还会评估其如何设计实际生产环境中的系统来满足需求。以…...

Mac/Windows端长期破解myBase8方法(无需安装火绒)

提醒 不管哪个端,都需要先退出myBase。 Mac 进入用户根目录/Users/c0ny100,即下边是Macintosh HD > 用户 > [你的用户名]这个界面然后按ShiftCommond.,显示隐藏文件。找到.Mybase8.ini文件 打开.Mybase8.ini文件,删除Fir…...

firewall

firewall 如果系统使用 firewalld 作为防火墙管理工具,可以使用以下命令: 查看防火墙是否运行: systemctl status firewalld查看防火墙的状态(简洁输出): firewall-cmd --state输出示例: r…...

XSS(跨站攻击)

XSS漏洞(跨站脚本) 1.XSS 漏洞简介 ​ XSS又叫CSS(Cross Site Script)跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从…...

Tomcat添加各种响应头 X-Download-Options、Permissions-Policy等

AI越来越火了,我们想要不被淘汰就得主动拥抱。推荐一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。 最近部署的项目被绿盟扫出来很多web漏洞,其中tomcat响应占了很大一部分。下面我们整理一下如何处理。 首先说说常见…...

搭建Tomcat(一)---SocketServerSocket

目录 引入1 引入2--socket 流程 Socket(应用程序之间的通讯保障) 网卡(计算机之间的通讯保障) 端口 端口号 实例 client端 解析 server端 解析 相关方法 问题1:ServerSocket和Socket有什么关系? ServerSocket Soc…...

ubuntu 使用 Times New Roman 字体在 Matplotlib 中绘图并调整字体大小

ubuntu 使用 Times New Roman 字体在 Matplotlib 中绘图并调整字体大小 文章目录 ubuntu 使用 Times New Roman 字体在 Matplotlib 中绘图并调整字体大小1. 安装 Times New Roman 字体验证字体是否安装成功 2. 在 Matplotlib 中加载 Times New Roman 字体3. 在 Matplotlib 中使…...

openGauss开源数据库实战二十三

文章目录 任务二十三 openGauss 参数管理任务目标实施步骤一、启动参数文件及参数类型1.参数值修改后必须重新启动数据库的参数2.参数值修改后只需要reload操作的参数 二、设置数据库级参数三、设置用户级参数四、设置会话级参数五、将参数设置为默认值 任务二十三 openGauss 参…...

MySQL 复合查询(重点)

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 MySQL 复合查询(重点) 收录于专栏[MySQL] 本专栏旨在分享学习MySQL的一点学习笔记,欢迎大家在评论区交流讨论💌 …...

ASP.NET |日常开发中连接Oracle数据库详解

ASP.NET |日常开发中连接Oracle数据库详解 前言一、安装和配置 Oracle 数据访问组件1.1 安装ODP.NET(Oracle Data Provider for.NET):1.2 引用相关程序集: 二、配置连接字符串2.1 连接字符串的基本组成部分&#xff1a…...

java_连接数据库的方法_后端处理_前端调用_打通整体思路

参考:14 尚上优选项目-平台管理端-权限管理模块-开发角色管理接口(上)_哔哩哔哩_bilibili 第一步. 定义数据 在数据库中定义好数据(如role表格),在java后端定义好对应的实体类(Role类&#xf…...

网络安全知识点

第一章 网络安全概述 1.2.1 网络安全概念P4 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或恶意的原因而遭到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不中断。 1.2.3 网络安全的种类P5 (1…...

pyfink1.20版本下实现消费kafka中数据并实时计算

1、环境 JDK版本:1.8.0_412python版本:3.10.6apache-flink版本:1.20.0flink版本:1.20kafka版本:kafka_2.12-3.1.1flink-sql-connector-kafka版本:3.3.0-1.202、执行python-flink脚本 从kafka的demo获取消…...

国产Tomcat东方通(TongWeb):Linux系统部署全攻略

国产Tomcat东方通(TongWeb):Linux系统部署全攻略 国产tomcat东方通tongweb在linux系统上部署全流程 [这里是图片001] 项目地址: https://gitcode.com/Resource-Bundle-Collection/fca68 项目介绍 在当前的软件开发和运维环境中&#xff0c…...

bilstm -crf 的torch官方的教程 不支持 batchsize 。。。。有更效率更高的方案吗

根据您的需求,您正在寻找一个支持批量处理(batch size)的BiLSTM-CRF模型的PyTorch教程。以下是一些资源,它们提供了更高效的解决方案,包括批量处理的支持: 1. **a-PyTorch-Tutorial-to-Sequence-Labeling*…...

Python面试常见问题及答案6

一、基础部分 问题1: 在Python中,如何将字符串转换为整数?如果字符串不是合法的数字字符串会怎样? 答案: 在Python中,可以使用int()函数将字符串转换为整数。如果字符串是合法的数字字符串,转换…...

代码随想录算法训练营第三天 | 链表理论基础 | 203.移除链表元素

感觉上是可以轻松完成的,因为对链接的结构,元素的删除过程心里明镜似的 实际上四处跑气 结构体的初始化好像完全忘掉了,用malloc折腾半天,忘记了用new,真想扇自己嘴巴子到飞起删除后写一个函数,把链表打印…...

1. 机器学习基本知识(5)——练习题(1)

1.7 🐦‍🔥练习题(本章重点回顾与总结) 0.回答格式约定: 对于书本内容的回答,将优先寻找书本内容作为答案进行回答。 书本内容回答完毕后,将对问题进行补充回答,上面分割线作为两个…...

vue 自定义组件image 和 input

本章主要是介绍自定义的组件:WInput:这是一个验证码输入框,自动校验,输入完成回调等;WImage:这是一个图片展示组件,集成了缩放,移动等操作。 目录 一、安装 二、引入组件 三、使用…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

HTTPS证书一年多少钱?

HTTPS证书作为保障网站数据传输安全的重要工具&#xff0c;成为众多网站运营者的必备选择。然而&#xff0c;面对市场上种类繁多的HTTPS证书&#xff0c;其一年费用究竟是多少&#xff0c;又受哪些因素影响呢&#xff1f; 首先&#xff0c;HTTPS证书通常在PinTrust这样的专业平…...

Appium下载安装配置保姆教程(图文详解)

目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...

如何做好一份技术文档?从规划到实践的完整指南

如何做好一份技术文档&#xff1f;从规划到实践的完整指南 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…...