<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:version="2.0"><channel><title>Lhx&apos;s Blog</title><description>Lhx的个人网站</description><link>https://lhxzns.pages.dev/</link><language>en</language><item><title>超标量处理器设计 Chapter 1-2 笔记</title><link>https://lhxzns.pages.dev/blog/notebook/2026-03-31-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link><guid isPermaLink="true">https://lhxzns.pages.dev/blog/notebook/2026-03-31-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid><description>涵盖了超标量处理器的基本概念、流水线设计以及Cache的组成和性能优化策略。</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://lhxzns.pages.dev/blog/notebook/2026-03-31-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/&quot;&gt;https://lhxzns.pages.dev/blog/notebook/2026-03-31-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Info from &amp;quot;@/components/mdx/Info.astro&amp;quot;;&lt;/p&gt;
&lt;Info&gt;
  超标量处理器概览和Cache设计的学习笔记，涵盖了超标量处理器的基本概念、流水线设计以及Cache的组成和性能优化策略。
&lt;/Info&gt;

&lt;hr&gt;
&lt;h3&gt;第1章 超标量处理器概览&lt;/h3&gt;
&lt;h4&gt;1.1 为什么需要超标量处理器？&lt;/h4&gt;
&lt;p&gt;传统的处理器架构通常是顺序执行的，这意味着每次只能执行一条指令。虽然这种设计简单且高效，但随着计算任务的复杂性和数据量的增加，单条指令的执行速度变得越来越不能满足需求。因此，超标量处理器应运而生，它能通过并行化来提高性能。超标量架构的核心优势在于它能够在每个时钟周期内执行多条指令，而不仅仅是依赖于单条指令的执行。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如何实现超标量？&lt;/strong&gt;
超标量处理器通过在处理器内部引入多个执行单元（如整数单元、浮点单元等），来实现多指令的并行执行。处理器能够在每个时钟周期内选择多个指令并将它们分配到不同的执行单元中，极大地提高了指令吞吐量。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;超标量的挑战：&lt;/strong&gt;
尽管超标量设计提升了执行并行性，但它也带来了新的挑战，特别是如何高效地管理指令的依赖关系。在传统的流水线设计中，指令是按顺序执行的，因此数据依赖问题较为简单。但在超标量设计中，由于不同的指令可能同时处于不同的执行单元，如何处理指令间的相关性（如数据冒险、控制冒险等）成为了设计中的关键问题。&lt;/p&gt;
&lt;h4&gt;1.2 普通处理器的流水线&lt;/h4&gt;
&lt;h5&gt;1.2.1 流水线概述：&lt;/h5&gt;
&lt;p&gt;流水线技术最早应用于处理器设计，它通过将指令执行分解为多个阶段，使得每个阶段可以并行处理不同的指令部分。在传统的流水线中，指令执行的各个阶段（如取指、解码、执行等）是按顺序进行的。流水线的优点在于它能有效提高指令执行的效率，但当指令之间存在依赖关系时，流水线会遭遇“气泡”（pipeline bubbles），从而降低性能。&lt;/p&gt;
&lt;h5&gt;1.2.2 流水线的划分：&lt;/h5&gt;
&lt;p&gt;一般来说，传统的流水线可以分为五个阶段：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;取指（IF）：&lt;/strong&gt; 从内存中取出指令。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;指令解码（ID）：&lt;/strong&gt; 解码指令，准备相关操作数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;执行（EX）：&lt;/strong&gt; 执行指令（例如，加法运算）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存访问（MEM）：&lt;/strong&gt; 如果指令需要访问内存，则执行读取或写入操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;写回（WB）：&lt;/strong&gt; 将执行结果写回寄存器。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;通过流水线设计，处理器的每个阶段都可以同时工作，从而提高了吞吐量。但当指令之间存在数据依赖时（如后一条指令依赖于前一条指令的结果），流水线会发生阻塞，从而影响性能。&lt;/p&gt;
&lt;h5&gt;1.2.3 指令间的相关性：&lt;/h5&gt;
&lt;p&gt;数据冒险（RAW）、写后写（WAW）、写后读（WAR）等数据依赖是影响流水线效率的主要因素。例如，当一条指令的输出成为下一条指令的输入时，如果这两条指令没有在流水线中同时处理，就会导致流水线停滞。因此，在流水线设计中，如何解决指令间的相关性是至关重要的。&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;1.3 超标量处理器的流水线&lt;/h4&gt;
&lt;h5&gt;1.3.1 顺序执行：&lt;/h5&gt;
&lt;p&gt;顺序执行是指传统流水线中，指令按照顺序一条接一条地执行。这种执行方式比较简单，但当任务变得越来越复杂时，单条指令的执行效率不足以满足高性能的需求。&lt;/p&gt;
&lt;h5&gt;1.3.2 乱序执行：&lt;/h5&gt;
&lt;p&gt;超标量处理器通过引入乱序执行机制，解决了顺序执行中无法有效利用硬件资源的问题。乱序执行指的是指令根据硬件资源的可用性进行调度，而不是按照原定的顺序执行。超标量处理器通过多个执行单元并行处理指令，从而显著提高了指令执行的吞吐量。&lt;/p&gt;
&lt;p&gt;乱序执行的一个重要挑战是如何正确处理指令的依赖性。在超标量架构中，执行顺序可能与程序的顺序不同，因此，处理器必须实时跟踪指令的依赖关系，并确保最终结果符合程序的预期顺序。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;第2章 Cache&lt;/h3&gt;
&lt;h4&gt;2.1 Cache的一般设计&lt;/h4&gt;
&lt;p&gt;Cache 是一种存储器层级的优化设计，它位于主内存和处理器之间，用于存储常用数据或指令，从而加速处理器对数据的访问。Cache 的设计决定了其能否有效减少访问内存的延迟，提高整体性能。&lt;/p&gt;
&lt;h5&gt;2.1.1 Cache的组成方式：&lt;/h5&gt;
&lt;p&gt;Cache通常被组织成若干个行（block）和组（set），每一行存储着数据的一部分。每次访问内存时，Cache 会检查是否已经包含所需数据。如果缓存命中（cache hit），处理器可以直接从Cache读取数据；如果缓存未命中（cache miss），则需要从主内存中加载数据。&lt;/p&gt;
&lt;h5&gt;2.1.2 Cache的写入策略：&lt;/h5&gt;
&lt;p&gt;Cache的写入策略决定了数据如何从处理器写入Cache。常见的写入策略有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;写穿透（Write-through）：&lt;/strong&gt; 每次写操作都会同时更新主内存和Cache。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;写回（Write-back）：&lt;/strong&gt; 写入数据仅在Cache中更新，只有当数据被替换时，才会写回主内存。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;2.1.3 Cache的替换策略：&lt;/h5&gt;
&lt;p&gt;当Cache满时，必须选择一些数据进行替换。常见的替换策略有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LRU（Least Recently Used）：&lt;/strong&gt; 替换最长时间未被访问的数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FIFO（First In, First Out）：&lt;/strong&gt; 替换最早进入Cache的数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;随机替换：&lt;/strong&gt; 随机选择一条Cache行进行替换。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2.2 提高Cache的性能&lt;/h4&gt;
&lt;h5&gt;2.2.1 写缓存：&lt;/h5&gt;
&lt;p&gt;写缓存可以提升写操作的性能。写操作并不会立即写回主存，而是先写入Cache中，待适当时机再将数据写回主内存。这种方法能够减少内存的访问次数，从而提高性能。&lt;/p&gt;
&lt;h5&gt;2.2.2 流水线：&lt;/h5&gt;
&lt;p&gt;通过流水线化Cache的操作，可以并行处理多个内存访问请求，从而提高Cache的访问效率。&lt;/p&gt;
&lt;h5&gt;2.2.3 多级结构：&lt;/h5&gt;
&lt;p&gt;Cache常常采用多级结构（如L1、L2、L3缓存），L1 Cache通常速度最快但容量最小，而L2和L3 Cache则较大但访问速度较慢。通过这种多级缓存的组合，可以在不增加过多硬件开销的情况下，提高访问速度。&lt;/p&gt;
&lt;h5&gt;2.2.4 Victim Cache：&lt;/h5&gt;
&lt;p&gt;Victim Cache 是一个小型的缓存，用于存储那些被从主Cache中驱逐的条目，以便在未来可能会再次被访问时，能够快速获取数据。&lt;/p&gt;
&lt;h5&gt;2.2.5 预取：&lt;/h5&gt;
&lt;p&gt;预取技术通过提前加载数据到Cache中，减少数据访问的延迟。例如，当处理器预判某些数据可能会被访问时，可以提前将这些数据加载到Cache中，从而加快访问速度。&lt;/p&gt;
&lt;h4&gt;2.3 多端口Cache&lt;/h4&gt;
&lt;p&gt;支持多端口同时进行读写操作，使得处理器可以并行访问多个缓存行，从而提高并行性和性能。&lt;/p&gt;
&lt;p&gt;将数据保存在多个缓存副本中，可以在不同的端口之间进行并行访问，减少访问冲突，提高性能。&lt;/p&gt;
&lt;p&gt;Cache被分为多个bank，每个bank可以并行处理数据访问。通过多bank实现的Cache，可以进一步提高数据访问的效率。&lt;/p&gt;
&lt;hr&gt;
</content:encoded><dc:creator>Lhx&apos;s Blog</dc:creator><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Novel 分类测试文章</title><link>https://lhxzns.pages.dev/blog/novel/novel-intro/</link><guid isPermaLink="true">https://lhxzns.pages.dev/blog/novel/novel-intro/</guid><description>Novel 分类下的第一篇测试 MDX 文章。</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://lhxzns.pages.dev/blog/novel/novel-intro/&quot;&gt;https://lhxzns.pages.dev/blog/novel/novel-intro/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;Novel 分类测试文章&lt;/h1&gt;
&lt;p&gt;这是一篇放在 &lt;code&gt;Novel&lt;/code&gt; 分类下的 MDX 文章，用来确认分类页、文章页和内容渲染都已经正常接通。&lt;/p&gt;
&lt;h2&gt;这个分类现在可以放什么&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;小说正文&lt;/li&gt;
&lt;li&gt;短篇故事&lt;/li&gt;
&lt;li&gt;世界观设定&lt;/li&gt;
&lt;li&gt;连载章节&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;一个简单片段&lt;/h2&gt;
&lt;p&gt;夜色落在窗沿，城市的灯像一串尚未说出口的句子。&lt;/p&gt;
&lt;p&gt;而故事，正好从这里开始。&lt;/p&gt;
</content:encoded><dc:creator>Lhx&apos;s Blog</dc:creator><pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Robocup视觉赛队员教学文档</title><link>https://lhxzns.pages.dev/blog/robocup/robocup%E6%95%99%E5%AD%A6%E6%96%87%E6%A1%A3/</link><guid isPermaLink="true">https://lhxzns.pages.dev/blog/robocup/robocup%E6%95%99%E5%AD%A6%E6%96%87%E6%A1%A3/</guid><description>关于使用oriange Pi的教程和一些常用开发命令</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://lhxzns.pages.dev/blog/robocup/robocup%E6%95%99%E5%AD%A6%E6%96%87%E6%A1%A3/&quot;&gt;https://lhxzns.pages.dev/blog/robocup/robocup%E6%95%99%E5%AD%A6%E6%96%87%E6%A1%A3/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Info from &amp;quot;@/components/mdx/Info.astro&amp;quot;;
import Warning from &amp;quot;@/components/mdx/Warning.astro&amp;quot;;&lt;/p&gt;
&lt;Info&gt;
  这是一篇偏实操导向的入门文档，适合第一次接触 OrangePi 和 RoboCup 视觉赛环境的同学。建议按“联网 -&gt; 查 IP -&gt; SSH -&gt; Linux / Conda 基础”的顺序操作。
&lt;/Info&gt;

&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;RoboCup 3D识别运行在嵌入式计算平台上，而这些平台几乎全部使用 Linux 系统。Linux 的优势在于它提供了稳定的服务器环境、成熟的开发工具链以及完整的网络能力，使得多机器人系统可以在同一套软件框架下运行。&lt;/p&gt;
&lt;p&gt;在我们的 RoboCup3D 项目中，开发板实际上就是一台小型服务器。所有视觉算法、机器人决策程序、深度学习模型推理程序都会运行在这个系统中。因此，成员需要具备基本的 Linux 操作能力，包括远程连接、文件管理、程序编译和调试。&lt;/p&gt;
&lt;p&gt;Linux 与 Windows 的最大区别在于，Linux 更强调命令行操作和远程管理。你并不需要在开发板上接显示器和键盘，而是可以通过自己的电脑远程控制开发板。这也是服务器开发的标准模式。&lt;/p&gt;
&lt;h1&gt;OrangePi&lt;/h1&gt;
&lt;h2&gt;开始之前检查硬件&lt;/h2&gt;
&lt;p&gt;在使用之前确保板子已经正常启动。要确认以下几件事。&lt;/p&gt;
&lt;p&gt;香橙派已经正确接上电源。注意官方手册明确说明，板子上虽然有三个 Type-C 接口，但只有靠近 PWM 风扇接口的那个是 PD 电源口，另外两个不能给开发板供电，接错后会表现为板子不开机或异常启动。&lt;/p&gt;
&lt;h2&gt;连接Wifi&lt;/h2&gt;
&lt;p&gt;在命令行中输入nmtui命令打开wifi连接的界面。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;(base) HwHiAiUser@orangepiaipro-20t:~$ sudo nmtui
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入nmtui命令打开的界面如下所示&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lhxzns.pages.dev/wifi1.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;选择&lt;code&gt;Activate a connect&lt;/code&gt;后回车，然后就能看到所有搜索到的WIFI热点&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lhxzns.pages.dev/wifi2.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;选择想要连接的WIFI热点后再使用Tab键将光标定位到&lt;code&gt;Activate&lt;/code&gt;后回车&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lhxzns.pages.dev/wifi3.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后会弹出输入密码的对话框，在Password内输入对应的密码然后回车就会开始连接WIFI&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lhxzns.pages.dev/wifi4.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;WIFI连接成功后会在已连接的WIFI名称前显示一个“*”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lhxzns.pages.dev/wifi5.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;使用ping命令可以测试wifi网络的连通性，ping命令可以通过Ctrl+C快捷键
来中断运行&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;(base) HwHiAiUser@orangepiaipro-20t:~$ ping www.orangepi.org -I wlan0
PING www.orangepi.org (123.57.147.237) from 10.31.2.93 wlan0: 56(84) bytes of data.
64 bytes from 123.57.147.237 (123.57.147.237): icmp_seq=1 ttl=53 time=47.1 ms
64 bytes from 123.57.147.237 (123.57.147.237): icmp_seq=2 ttl=53 time=44.3 ms
64 bytes from 123.57.147.237 (123.57.147.237): icmp_seq=3 ttl=53 time=45.0 ms
64 bytes from 123.57.147.237 (123.57.147.237): icmp_seq=4 ttl=53 time=71.0 ms
^C--- www.orangepi.org ping statistics--
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 44.377/51.902/71.082/11.119 ms
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;查询ip地址&lt;/h2&gt;
&lt;p&gt;在终端输入如下命令，可以查询当前wifi的ip地址，这条命令的作用是查看当前这台机器所有网络接口的信息。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ip a s wlan 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行结果如下，屏幕会出来很多内容，不需要全部看懂，只需要盯住含有 inet 的那一行。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;(base) HwHiAiUser@orangepiaipro-20t:~$ ip a s wlan0
4: wlan0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc mq state UP
group default qlen 1000
  link/ether 54:f2:9f:7b:ba:36 brd ff:ff:ff:ff:ff:ff
  inet 10.31.2.93/16 brd 10.31.255.255 scope global dynamic noprefixroute wlan0
    valid_lft 43003sec preferred_lft 43003sec
  inet6 fe80::5297:7036:a33c:bb93/64 scope link noprefixroute
    valid_lft forever preferred_lft forever
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;真正重要的是&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;10.31.2.93
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这就是香橙派当前在局域网中的 IPv4 地址。后面的 &lt;code&gt;/16&lt;/code&gt; 不是地址本体，SSH 的时候不要把 &lt;code&gt;/16&lt;/code&gt; 一起带上。除了 &lt;code&gt;ip a&lt;/code&gt;，也可以在图形界面里看地址&lt;/p&gt;
&lt;p&gt;在 Ubuntu 桌面右上角通常有网络图标。点击后进入网络设置，在有线网络或无线网络的详细信息里，通常能看到 IPv4 地址。这个地址和 &lt;code&gt;ip a&lt;/code&gt; 查到的本质上是同一个东西。&lt;/p&gt;
&lt;h1&gt;安装VSCode&lt;/h1&gt;
&lt;p&gt;通过 Ubuntu 自带的火狐浏览器找到熟悉的 &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VSCode&lt;/a&gt; 的官网，并且进行安装。&lt;/p&gt;
&lt;p&gt;选择&lt;code&gt;.deb&lt;/code&gt; 进行下载，下载完毕之后进入下载文件夹，应该可以看到下载的 deb 包，右键在终端中打开，输入：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo dpkg -i code_your_version.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中 &lt;code&gt;code_your_version.deb&lt;/code&gt; 为你的 deb 包的名字，在命令行中可以使用 TAB 进行自动补全，这样你就只需要输入一个 code，之后进行自动补全即可。&lt;/p&gt;
&lt;p&gt;输入密码，其中密码的输入是不可见的，输入之后终端没有反应并非你没有输入，输入之后按下回车即可。&lt;/p&gt;
&lt;p&gt;稍等片刻，等命令行又一次可以输入的时候，在命令行中输入 code，回车，进入 VSCode。&lt;/p&gt;
&lt;h1&gt;SSH&lt;/h1&gt;
&lt;Warning&gt;
  文中提到的默认密码仅适合首次接入或教学场景。实际队伍协作时，建议尽快修改默认密码，并避免把账号口令长期写在公开文档里。
&lt;/Warning&gt;

&lt;p&gt;在这里简短的介绍 SSH 语法，一般来说 SSH 安装在每一个系统中，无需额外的安装，在这里推荐使用 VSCode 的 SSH 插件&lt;/p&gt;
&lt;p&gt;通过在 VSCode 的拓展栏进行搜索，可以很轻易地找到 VSCode 的 SSH 插件：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lhxzns.pages.dev/ssh1.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;启用插件之后，点击左下角的打开远程窗口，选择连接到主机即可：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lhxzns.pages.dev/ssh2.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;输入（下面是示例命令，不要直接照抄）&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ssh username@192.168.1.XXX
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入香橙派账号默认密码&lt;code&gt;Mind@123&lt;/code&gt;。连接成功后打开远程终端，执行并检查是否连接成功&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意，输入密码的时候，屏幕上是不会显示输入的密码的具体内容的，请不要
以为是有什么故障，输入完后直接回车即可&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;成功登录系统后的显示如下图所示&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lhxzns.pages.dev/orange.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;连接成功后建议执行以下命令，确认系统正常。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pwd
whoami
hostname
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pwd&lt;/code&gt;:查看当前路径&lt;/li&gt;
&lt;li&gt;&lt;code&gt;whoami&lt;/code&gt;:查看当前用户&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hostname&lt;/code&gt;:查看主机名&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果这些命令能正常运行，恭喜你，说明 SSH 连接已经成功。&lt;/p&gt;
&lt;h1&gt;Linux&lt;/h1&gt;
&lt;p&gt;使用 SSH 后，我们会进入正式的 Linux 系统中，同时，由于使用 SSH，此时的 Linux 并没有提供图形化界面（这也是 Linux 最原始的形态），因此在本章节中，我们会首先讲解一些基础的 Linux 指令，以便读者可以进行接下来的操作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ls&lt;/code&gt;：可以展示当前目录下的文件内容，其中显示隐藏内容需要使用 &lt;code&gt;ls -a&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd&lt;/code&gt;：用法为 &lt;code&gt;cd folder&lt;/code&gt;，可以前往指定的文件夹中，需要注明的是，.. 为上级目录，如想要前往上级，使用 &lt;code&gt;cd ..&lt;/code&gt;，上级的上级，以此类推 &lt;code&gt;cd ../..&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;文档的编辑操作需要使用 vim，这一技巧具备一定的难度，读者请勿尝试指令 &lt;code&gt;vim filename&lt;/code&gt;，若无法退出，请狂点 &lt;code&gt;esc&lt;/code&gt; 之后依次按下 :, &lt;code&gt;w, q, !, Enter&lt;/code&gt; 以保存并退出，若不希望保存，无需按下 &lt;code&gt;w&lt;/code&gt;。&lt;/p&gt;
&lt;h1&gt;Anaconda&lt;/h1&gt;
&lt;p&gt;由于香橙派已经内置了Anaconda环境，因此读者无需自行安装。在这章，我们会讲解一些常用的&lt;code&gt;Conda&lt;/code&gt;命令和包管理技巧。&lt;/p&gt;
&lt;h2&gt;查看已有环境&lt;/h2&gt;
&lt;p&gt;首先可以查看当前系统中已有的 conda 环境。&lt;/p&gt;
&lt;p&gt;在终端输入：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda env list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda info --envs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行结果类似&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# conda environments:
#
base                  *  /home/root/anaconda3
robocup                  /home/root/anaconda3/envs/robocup
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;激活环境&lt;/h2&gt;
&lt;p&gt;如果需要进入某个环境，可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda activate 环境名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda activate robocup
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进入环境后，终端前面通常会显示环境名称，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;(robocup) root@orangepiaipro-20t
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这说明当前已经进入 &lt;code&gt;robocup&lt;/code&gt; 环境。&lt;/p&gt;
&lt;p&gt;如果想返回默认环境：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda activate base
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda deactivate
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;创建新的环境&lt;/h2&gt;
&lt;p&gt;如果需要为某个项目创建独立环境，可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda create -n 环境名 python=版本
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda create -n vision python=3.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建完成后可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda activate vision
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进入该环境。&lt;/p&gt;
&lt;p&gt;使用独立环境的好处是：不同项目可以使用不同版本的 Python 并且不同项目之间不会产生依赖冲突，此外，将环境隔离会让环境更容易管理。&lt;/p&gt;
&lt;h2&gt;安装 Python 包&lt;/h2&gt;
&lt;p&gt;在 conda 环境中安装 Python 包通常有两种方式。&lt;/p&gt;
&lt;p&gt;第一种：使用 conda 安装&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda install numpy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第二种：使用 pip 安装&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install numpy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一般来说：常见科学计算库推荐使用 &lt;code&gt;conda install&lt;/code&gt;，但是一些 Python 库只能通过 &lt;code&gt;pip install&lt;/code&gt; 安装&lt;/p&gt;
&lt;h2&gt;查看已安装的包&lt;/h2&gt;
&lt;p&gt;查看当前环境已经安装的包：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;会列出所有 Python 库以及对应版本。&lt;/p&gt;
&lt;h2&gt;更新包&lt;/h2&gt;
&lt;p&gt;更新某个 Python 包：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda update 包名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda update numpy
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;导出环境&lt;/h2&gt;
&lt;p&gt;有时需要把当前环境分享给其他队员，可以导出环境配置。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda env export &amp;gt; environment.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;生成的 &lt;code&gt;environment.yml&lt;/code&gt; 文件记录了当前环境的所有依赖。&lt;/p&gt;
&lt;p&gt;其他人可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda env create -f environment.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;快速创建完全相同的环境。&lt;/p&gt;
&lt;h1&gt;Git&lt;/h1&gt;
&lt;p&gt;在一个大型开发项目中，代码通常需要多人协作开发，因此需要使用 &lt;strong&gt;Git&lt;/strong&gt; 进行代码版本管理。Git 可以帮助我们记录代码历史、协作开发以及避免多人修改同一份代码时产生冲突。&lt;/p&gt;
&lt;p&gt;如果没有 Git，团队开发时很容易出现以下问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不知道代码是谁修改的  &lt;/li&gt;
&lt;li&gt;不知道某次修改是否引入了 bug  &lt;/li&gt;
&lt;li&gt;多人修改同一文件产生覆盖  &lt;/li&gt;
&lt;li&gt;无法回退到之前的版本&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此，建议所有队员都通过 Git 管理代码，而不要直接通过文件拷贝的方式共享代码。&lt;/p&gt;
&lt;h2&gt;查看 Git 是否安装&lt;/h2&gt;
&lt;p&gt;在终端输入：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果出现类似输出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git version 2.xx.x
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明 Git 已经安装成功。&lt;/p&gt;
&lt;p&gt;如果没有安装，可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进行安装。&lt;/p&gt;
&lt;h2&gt;克隆代码仓库&lt;/h2&gt;
&lt;p&gt;在开始开发之前，首先需要从远程仓库下载代码。&lt;/p&gt;
&lt;p&gt;例如从 GitHub 或 GitLab 下载项目：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone 仓库地址
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/xxx/robocup-vision.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行完成后，会在当前目录生成一个项目文件夹。&lt;/p&gt;
&lt;p&gt;进入项目目录：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd robocup-vision
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;查看当前代码状态&lt;/h2&gt;
&lt;p&gt;在开发过程中，可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看当前代码状态。&lt;/p&gt;
&lt;p&gt;该命令可以显示：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;哪些文件被修改&lt;/li&gt;
&lt;li&gt;哪些文件还没有加入版本管理&lt;/li&gt;
&lt;li&gt;当前所在的分支&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这是开发过程中最常使用的命令之一。&lt;/p&gt;
&lt;h2&gt;添加文件到版本控制&lt;/h2&gt;
&lt;p&gt;当修改代码后，需要先将修改加入 Git 暂存区。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git add 文件名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git add main.cpp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果想添加当前目录所有修改，可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git add .
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;提交代码&lt;/h2&gt;
&lt;p&gt;添加完成后，需要进行提交。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git commit -m &amp;quot;修改说明&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git commit -m &amp;quot;fix vision detection bug&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里的引号中是对本次修改的简要说明，建议写清楚修改内容。&lt;/p&gt;
&lt;h2&gt;推送代码到远程仓库&lt;/h2&gt;
&lt;p&gt;提交完成后，需要将代码上传到远程仓库：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样其他队员才能看到你的代码更新。&lt;/p&gt;
&lt;h2&gt;更新远程代码&lt;/h2&gt;
&lt;p&gt;如果其他队员已经更新了代码，可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git pull
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;从远程仓库获取最新代码。&lt;/p&gt;
&lt;p&gt;建议每次开发之前先执行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git pull
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以确保本地代码是最新版本。&lt;/p&gt;
&lt;h2&gt;查看代码历史&lt;/h2&gt;
&lt;p&gt;可以使用以下命令查看提交历史：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;该命令可以查看每一次提交的记录，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;提交人&lt;/li&gt;
&lt;li&gt;提交时间&lt;/li&gt;
&lt;li&gt;修改说明&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;常见开发流程&lt;/h2&gt;
&lt;p&gt;在团队开发中，推荐使用以下开发流程：&lt;/p&gt;
&lt;p&gt;首先更新代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git pull
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后进行代码修改。&lt;/p&gt;
&lt;p&gt;修改完成后：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git add .
git commit -m &amp;quot;修改说明&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后上传代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git push
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;建议&lt;/h2&gt;
&lt;p&gt;在团队开发中建议遵守以下几点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;每次提交前写清楚 commit 信息&lt;/li&gt;
&lt;li&gt;每次开发前先执行 &lt;code&gt;git pull&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;不要直接修改主分支的大量代码&lt;/li&gt;
&lt;li&gt;修改较大功能时建议创建新的分支&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;合理使用 Git 可以大大提高团队开发效率，并减少代码冲突。&lt;/p&gt;
&lt;h1&gt;服务器使用礼貌提示&lt;/h1&gt;
&lt;p&gt;由于 RoboCup 视觉开发板通常是多人共同使用的计算资源，因此在使用过程中需要注意一些基本的服务器使用规范，以避免影响其他队员的正常开发。&lt;/p&gt;
&lt;p&gt;服务器资源包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU&lt;/li&gt;
&lt;li&gt;内存&lt;/li&gt;
&lt;li&gt;GPU / NPU&lt;/li&gt;
&lt;li&gt;磁盘空间&lt;/li&gt;
&lt;li&gt;网络带宽&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果使用不当，很容易影响其他人的实验或开发工作。因此在使用服务器时需要遵守一些基本的礼貌和规范。&lt;/p&gt;
&lt;h2&gt;不要长时间占用计算资源&lt;/h2&gt;
&lt;p&gt;在运行深度学习模型、训练程序或其他高计算负载任务时，请注意不要长时间占用服务器资源。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大规模训练任务&lt;/li&gt;
&lt;li&gt;长时间推理任务&lt;/li&gt;
&lt;li&gt;无限循环程序&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果需要运行长时间任务，建议提前与队友沟通。&lt;/p&gt;
&lt;p&gt;可以使用以下命令查看当前运行的程序：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;top
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果系统中安装了 &lt;code&gt;htop&lt;/code&gt;，也可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;htop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;该命令可以更加直观地查看当前 CPU 和内存的使用情况。&lt;/p&gt;
&lt;h2&gt;使用完成后及时关闭程序&lt;/h2&gt;
&lt;p&gt;很多初学者在运行程序后会直接关闭 SSH 窗口，但程序实际上仍然在服务器上运行。&lt;/p&gt;
&lt;p&gt;如果程序已经不再需要运行，应主动结束对应进程。&lt;/p&gt;
&lt;p&gt;可以先查看当前进程：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;top
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;找到对应程序的 &lt;strong&gt;PID（进程ID）&lt;/strong&gt;，然后使用：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kill PID
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kill 12345
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样可以避免程序长期占用服务器资源。&lt;/p&gt;
&lt;h2&gt;不要随意删除或修改他人的文件&lt;/h2&gt;
&lt;p&gt;服务器通常是多人共同使用的环境，因此不要随意删除或修改他人的代码、环境或数据。&lt;/p&gt;
&lt;p&gt;如果需要清理空间，只删除自己目录下的文件。&lt;/p&gt;
&lt;p&gt;一般来说，每个人应该主要在自己的目录中进行开发，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;/home/username/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不要在系统目录或公共目录下随意删除文件。&lt;/p&gt;
&lt;h2&gt;安装软件前尽量确认&lt;/h2&gt;
&lt;p&gt;在服务器上安装软件或 Python 库之前，建议先确认是否会影响现有环境。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不要随意修改系统 Python&lt;/li&gt;
&lt;li&gt;不要随意删除 conda 环境&lt;/li&gt;
&lt;li&gt;不要覆盖公共环境&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果需要安装新的 Python 库，建议在 &lt;strong&gt;自己的 conda 环境&lt;/strong&gt; 中安装，而不是直接安装到系统环境中。&lt;/p&gt;
&lt;h2&gt;不要占满磁盘空间&lt;/h2&gt;
&lt;p&gt;服务器磁盘空间是共享资源，如果大量存储数据或模型，可能会影响其他人的使用。&lt;/p&gt;
&lt;p&gt;可以使用以下命令查看磁盘空间：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;df -h
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果产生大量临时数据（例如日志文件、训练数据、缓存等），建议定期清理。&lt;/p&gt;
&lt;h2&gt;离开服务器前检查程序&lt;/h2&gt;
&lt;p&gt;在关闭 SSH 或 VSCode 连接之前，建议确认自己启动的程序是否仍在运行。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;top
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果程序已经不需要继续运行，请手动结束对应进程。&lt;/p&gt;
&lt;h2&gt;发现异常及时沟通&lt;/h2&gt;
&lt;p&gt;如果发现服务器出现以下情况，应及时通知队友或管理员：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;系统运行明显变慢&lt;/li&gt;
&lt;li&gt;GPU / NPU 长时间被占用&lt;/li&gt;
&lt;li&gt;无法 SSH 登录&lt;/li&gt;
&lt;li&gt;磁盘空间耗尽&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不要自行进行大规模系统修改，以免影响整个开发环境。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;服务器是团队共享资源，合理使用不仅能提高开发效率，也能避免很多不必要的问题。&lt;/p&gt;
&lt;p&gt;简单来说，可以记住以下三点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不乱删&lt;/li&gt;
&lt;li&gt;不乱装&lt;/li&gt;
&lt;li&gt;不长时间占用资源&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><dc:creator>Lhx&apos;s Blog</dc:creator><pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate></item><item><title>程序设计基础期末复习手册</title><link>https://lhxzns.pages.dev/blog/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0%E6%89%8B%E5%86%8C/</link><guid isPermaLink="true">https://lhxzns.pages.dev/blog/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0%E6%89%8B%E5%86%8C/</guid><description>程序设计基础</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://lhxzns.pages.dev/blog/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0%E6%89%8B%E5%86%8C/&quot;&gt;https://lhxzns.pages.dev/blog/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0%E6%89%8B%E5%86%8C/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Info from &amp;quot;@/components/mdx/Info.astro&amp;quot;;&lt;/p&gt;
&lt;Info&gt;
  这篇更适合作为考试前快速翻阅的手册，而不是系统教程。建议按“输入输出 -&gt; 字符串 -&gt; 指针/数组 -&gt; 常见陷阱”的思路查阅。
&lt;/Info&gt;

&lt;h1&gt;C语言期末考试速查手册&lt;/h1&gt;
&lt;h2&gt;一、输入输出技巧&lt;/h2&gt;
&lt;h3&gt;1. 多种输入方式&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 1. 基础输入
int n;
scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);

// 2. 字符串输入（无空格）
char str[20];
scanf(&amp;quot;%s&amp;quot;, str);  // 遇到空格停止

// 3. 字符串输入（含空格）
char str[100];
fgets(str, sizeof(str), stdin);
str[strcspn(str, &amp;quot;\n&amp;quot;)] = &amp;#39;\0&amp;#39;;  // 去掉换行符

// 4. 读取整行直到换行符
char line[100];
scanf(&amp;quot;%[^\n]&amp;quot;, line);  // 读取直到换行符
getchar();  // 吃掉换行符
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 格式化输出&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 控制宽度和对齐
printf(&amp;quot;%-10s %5d\n&amp;quot;, &amp;quot;Name&amp;quot;, 100);  // 左对齐，宽度10
printf(&amp;quot;%10s %5d\n&amp;quot;, &amp;quot;Name&amp;quot;, 100);   // 右对齐，宽度10
printf(&amp;quot;%.2f\n&amp;quot;, 3.14159);           // 保留2位小数
printf(&amp;quot;%05d\n&amp;quot;, 42);                // 补零到5位：00042
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;二、字符串处理&lt;/h2&gt;
&lt;h3&gt;1. 常用函数&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;string.h&amp;gt;

// 长度
int len = strlen(str);

// 复制
strcpy(dest, src);        // 不安全，可能溢出
strncpy(dest, src, n);    // 安全，最多复制n个字符

// 连接
strcat(dest, src);        // 不安全
strncat(dest, src, n);    // 安全

// 比较
int cmp = strcmp(s1, s2);  // 相等返回0，s1&amp;gt;s2返回正数
int cmp = strncmp(s1, s2, n);  // 比较前n个字符

// 查找
char *p = strchr(str, &amp;#39;a&amp;#39;);     // 查找字符第一次出现
char *p = strrchr(str, &amp;#39;a&amp;#39;);    // 查找字符最后一次出现
char *p = strstr(str, &amp;quot;abc&amp;quot;);   // 查找子串
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 字符串分割&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 方法1：strtok
char str[] = &amp;quot;apple,banana,orange&amp;quot;;
char *token = strtok(str, &amp;quot;,&amp;quot;);
while (token != NULL) {
    printf(&amp;quot;%s\n&amp;quot;, token);
    token = strtok(NULL, &amp;quot;,&amp;quot;);
}

// 方法2：sscanf
char data[] = &amp;quot;John 25 85.5&amp;quot;;
char name[20];
int age;
float score;
sscanf(data, &amp;quot;%s %d %f&amp;quot;, name, &amp;amp;age, &amp;amp;score);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 字符串转换&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdlib.h&amp;gt;

// 字符串转数字
int num = atoi(&amp;quot;123&amp;quot;);          // ASCII to integer
long lnum = atol(&amp;quot;123456&amp;quot;);     // ASCII to long
float fnum = atof(&amp;quot;3.14&amp;quot;);      // ASCII to float

// 更安全的转换
int num = strtol(str, NULL, 10);     // 10表示十进制
float fnum = strtof(str, NULL);

// 数字转字符串
char buffer[20];
sprintf(buffer, &amp;quot;%d&amp;quot;, 123);          // 整数转字符串
sprintf(buffer, &amp;quot;%.2f&amp;quot;, 3.14159);    // 浮点数转字符串
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;三、数组操作&lt;/h2&gt;
&lt;h3&gt;1. 一维数组&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 遍历
int arr[10];
for (int i = 0; i &amp;lt; 10; i++) {
    arr[i] = i * 2;
}

// 逆序
void reverse(int arr[], int n) {
    for (int i = 0; i &amp;lt; n / 2; i++) {
        int temp = arr[i];
        arr[i] = arr[n-1-i];
        arr[n-1-i] = temp;
    }
}

// 查找最大最小值
void find_min_max(int arr[], int n, int *min, int *max) {
    *min = *max = arr[0];
    for (int i = 1; i &amp;lt; n; i++) {
        if (arr[i] &amp;lt; *min) *min = arr[i];
        if (arr[i] &amp;gt; *max) *max = arr[i];
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 二维数组&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 遍历
int matrix[3][4];
for (int i = 0; i &amp;lt; 3; i++) {
    for (int j = 0; j &amp;lt; 4; j++) {
        matrix[i][j] = i * 4 + j;
    }
}

// 矩阵转置
void transpose(int src[][N], int dest[][M], int m, int n) {
    for (int i = 0; i &amp;lt; m; i++) {
        for (int j = 0; j &amp;lt; n; j++) {
            dest[j][i] = src[i][j];
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;四、结构体与指针&lt;/h2&gt;
&lt;h3&gt;1. 结构体定义与使用&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 定义
typedef struct {
    char name[20];
    int age;
    float score;
} Student;

// 初始化
Student s1 = {&amp;quot;Alice&amp;quot;, 20, 85.5};
Student s2;
strcpy(s2.name, &amp;quot;Bob&amp;quot;);
s2.age = 21;
s2.score = 90.0;

// 结构体数组
Student class[30];
for (int i = 0; i &amp;lt; 30; i++) {
    scanf(&amp;quot;%s %d %f&amp;quot;, class[i].name, &amp;amp;class[i].age, &amp;amp;class[i].score);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 指针操作&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 基本指针
int a = 10;
int *p = &amp;amp;a;
printf(&amp;quot;%d\n&amp;quot;, *p);  // 输出10

// 指针与数组
int arr[5] = {1,2,3,4,5};
int *ptr = arr;  // ptr指向arr[0]
printf(&amp;quot;%d\n&amp;quot;, *(ptr+2));  // 输出arr[2]=3

// 结构体指针
Student s;
Student *sp = &amp;amp;s;
sp-&amp;gt;age = 20;      // 等价于 (*sp).age = 20
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;五、动态内存管理&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdlib.h&amp;gt;

// 一维数组
int *arr = (int*)malloc(n * sizeof(int));
if (arr == NULL) {
    printf(&amp;quot;内存分配失败\n&amp;quot;);
    exit(1);
}
// 使用...
free(arr);

// 二维数组
int **matrix = (int**)malloc(rows * sizeof(int*));
for (int i = 0; i &amp;lt; rows; i++) {
    matrix[i] = (int*)malloc(cols * sizeof(int));
}
// 使用...
for (int i = 0; i &amp;lt; rows; i++) {
    free(matrix[i]);
}
free(matrix);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;六、常用算法模板&lt;/h2&gt;
&lt;h3&gt;1. 排序算法&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 冒泡排序
void bubble_sort(int arr[], int n) {
    for (int i = 0; i &amp;lt; n-1; i++) {
        for (int j = 0; j &amp;lt; n-1-i; j++) {
            if (arr[j] &amp;gt; arr[j+1]) {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

// 选择排序
void selection_sort(int arr[], int n) {
    for (int i = 0; i &amp;lt; n-1; i++) {
        int min_idx = i;
        for (int j = i+1; j &amp;lt; n; j++) {
            if (arr[j] &amp;lt; arr[min_idx]) {
                min_idx = j;
            }
        }
        int temp = arr[i];
        arr[i] = arr[min_idx];
        arr[min_idx] = temp;
    }
}

// 插入排序
void insertion_sort(int arr[], int n) {
    for (int i = 1; i &amp;lt; n; i++) {
        int key = arr[i];
        int j = i-1;
        while (j &amp;gt;= 0 &amp;amp;&amp;amp; arr[j] &amp;gt; key) {
            arr[j+1] = arr[j];
            j--;
        }
        arr[j+1] = key;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 查找算法&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 顺序查找
int linear_search(int arr[], int n, int target) {
    for (int i = 0; i &amp;lt; n; i++) {
        if (arr[i] == target) {
            return i;
        }
    }
    return -1;
}

// 二分查找（要求数组有序）
int binary_search(int arr[], int n, int target) {
    int left = 0, right = n-1;
    while (left &amp;lt;= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] &amp;lt; target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return -1;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;七、数学计算&lt;/h2&gt;
&lt;h3&gt;1. 常用数学函数&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;math.h&amp;gt;

// 绝对值
int a = abs(-10);          // 整数绝对值
double b = fabs(-3.14);    // 浮点数绝对值

// 幂运算
double result = pow(2, 3);     // 2³ = 8
double sqrt_val = sqrt(16);    // √16 = 4

// 三角函数（参数为弧度）
double sin_val = sin(3.14159/2);   // sin(90°) = 1
double cos_val = cos(0);           // cos(0°) = 1

// 对数
double log_e = log(2.71828);       // 自然对数ln
double log_10 = log10(100);        // 以10为底

// 取整
double ceil_val = ceil(3.14);      // 向上取整 = 4
double floor_val = floor(3.14);    // 向下取整 = 3
double round_val = round(3.5);     // 四舍五入 = 4
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 最大公约数与最小公倍数&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 辗转相除法求最大公约数
int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

// 最小公倍数
int lcm(int a, int b) {
    return a / gcd(a, b) * b;  // 先除后乘防止溢出
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 素数判断&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;math.h&amp;gt;

int is_prime(int n) {
    if (n &amp;lt;= 1) return 0;
    if (n == 2) return 1;
    if (n % 2 == 0) return 0;
    
    for (int i = 3; i &amp;lt;= sqrt(n); i += 2) {
        if (n % i == 0) return 0;
    }
    return 1;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;八、文件操作&lt;/h2&gt;
&lt;h3&gt;1. 基本文件操作&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;

// 打开文件
FILE *fp = fopen(&amp;quot;data.txt&amp;quot;, &amp;quot;r&amp;quot;);  // 模式：r(读), w(写), a(追加)

if (fp == NULL) {
    printf(&amp;quot;打开文件失败\n&amp;quot;);
    return 1;
}

// 读写操作
fprintf(fp, &amp;quot;Hello %d\n&amp;quot;, 123);      // 写入格式化数据
fscanf(fp, &amp;quot;%s %d&amp;quot;, str, &amp;amp;num);      // 读取格式化数据

fputs(&amp;quot;Hello\n&amp;quot;, fp);                // 写入字符串
fgets(buffer, sizeof(buffer), fp);   // 读取一行

char ch = fgetc(fp);                 // 读取一个字符
fputc(&amp;#39;A&amp;#39;, fp);                      // 写入一个字符

// 关闭文件
fclose(fp);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 常用文件操作模式&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模式&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&amp;quot;r&amp;quot;&lt;/td&gt;
&lt;td&gt;只读，文件必须存在&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;w&amp;quot;&lt;/td&gt;
&lt;td&gt;只写，创建新文件/清空原有文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;a&amp;quot;&lt;/td&gt;
&lt;td&gt;追加，在文件末尾添加&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;r+&amp;quot;&lt;/td&gt;
&lt;td&gt;读写，文件必须存在&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;w+&amp;quot;&lt;/td&gt;
&lt;td&gt;读写，创建新文件/清空原有文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;a+&amp;quot;&lt;/td&gt;
&lt;td&gt;读写，在文件末尾添加&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;九、实用技巧&lt;/h2&gt;
&lt;h3&gt;1. 清除输入缓冲区&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 清除所有残留字符
void clear_input_buffer() {
    int c;
    while ((c = getchar()) != &amp;#39;\n&amp;#39; &amp;amp;&amp;amp; c != EOF);
}

// 使用示例
int n;
scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);
clear_input_buffer();  // 清除换行符
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 交换两个数&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 方法1：使用临时变量
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 方法2：不使用临时变量（仅整数）
void swap_xor(int *a, int *b) {
    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 生成随机数&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;time.h&amp;gt;

// 初始化随机种子（只需调用一次）
srand(time(NULL));

// 生成随机数
int random_num = rand();               // 0到RAND_MAX之间
int range_random = rand() % 100;       // 0-99
int min_max_random = 10 + rand() % 91; // 10-100
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;十、常见错误与调试&lt;/h2&gt;
&lt;h3&gt;1. 编译错误&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 错误1：未声明的标识符
printf(&amp;quot;%d\n&amp;quot;, x);  // 如果x未声明

// 错误2：类型不匹配
int *p = 10;        // 应该：int *p = &amp;amp;a;

// 错误3：缺少分号
int a = 10          // 缺少分号
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 运行时错误&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 错误1：数组越界
int arr[5];
arr[5] = 10;  // 越界访问

// 错误2：除零错误
int result = 10 / 0;

// 错误3：使用未初始化指针
int *p;
*p = 10;  // 野指针

// 错误4：内存泄漏
int *p = malloc(100);
// 忘记free(p);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 调试技巧&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 1. 使用printf调试
printf(&amp;quot;调试：a=%d, b=%d\n&amp;quot;, a, b);

// 2. 条件编译调试
#ifdef DEBUG
    printf(&amp;quot;调试信息：x=%d\n&amp;quot;, x);
#endif

// 编译时：gcc -DDEBUG program.c

// 3. 使用assert
#include &amp;lt;assert.h&amp;gt;
assert(x &amp;gt; 0);  // 如果x&amp;lt;=0，程序会终止并报错
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Lhx&apos;s Blog</dc:creator><pubDate>Sun, 07 Dec 2025 00:00:00 GMT</pubDate></item><item><title>Paper Reading Week1</title><link>https://lhxzns.pages.dev/blog/paper-reading/paper-reading-week1/</link><guid isPermaLink="true">https://lhxzns.pages.dev/blog/paper-reading/paper-reading-week1/</guid><description>10/11-10/17</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://lhxzns.pages.dev/blog/paper-reading/paper-reading-week1/&quot;&gt;https://lhxzns.pages.dev/blog/paper-reading/paper-reading-week1/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Info from &amp;quot;@/components/mdx/Info.astro&amp;quot;;&lt;/p&gt;
&lt;Info&gt;
  本周笔记聚焦两条很经典的 Agent 脉络：`Tree of Thoughts` 侧重搜索与回溯，`ReAct` 侧重推理与行动交替。阅读时可以优先对比它们各自解决的“决策瓶颈”。
&lt;/Info&gt;

&lt;h1&gt;论文信息&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://arxiv.org/pdf/2305.10601&quot;&gt;Arxiv ID&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://hjfy.top/arxiv/2305.10601&quot;&gt;幻觉翻译&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Title:&lt;strong&gt;Tree of Thoughts: Deliberate Problem Solving with Large Language Models 树状思维：大型语言模型的深思熟虑问题求解&lt;/strong&gt;&lt;/h2&gt;
&lt;hr&gt;
&lt;h3&gt;&lt;strong&gt;1. Introduction&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;介绍了当前大语言模型（如GPT-4）在推理时仅限于&amp;quot;&lt;strong&gt;从左到右、逐词生成&lt;/strong&gt;&amp;quot;的局限性，并将其类比为人类认知中的“系统1”（快速、自动）。受人类“系统2”（慢速、深思熟虑）和早期人工智能“问题求解即搜索”思想的启发，提出了“&lt;strong&gt;思维树&lt;/strong&gt;”框架，旨在让模型能够进行探索、前瞻和回溯等更复杂的决策过程。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;2. Background&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Input-output (IO) prompting（输入-输出提示）： 最基本的直接生成答案的方法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Chain-of-thought (CoT) prompting（思维链提示）： 通过生成一系列中间推理步骤来连接输入和输出。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Self-consistency with CoT (CoT-SC)（思维链自洽）： 通过采样多条思维链并取多数答案作为最终结果的集成方法。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;3. Tree of Thoughts（ToT）&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/lnscq/picx-images-hosting/raw/master/image.70aq76hmqt.webp&quot; alt=&quot;对比图片&quot;&gt;&lt;/p&gt;
&lt;p&gt;将问题视为对一棵树的搜索，每个节点存储一个状态。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ToT&lt;/strong&gt; 回答四个问题：&lt;/p&gt;
&lt;p&gt;1 &lt;strong&gt;如何将中间过程分解为思维步骤？&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;根据具体问题的性质，将整个问题解决过程分解为多个连贯的中间步骤，每个步骤称为一个“思维”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2 &lt;strong&gt;如何从每个状态生成潜在的思维？&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在树中的每个状态（即当前的部分解决方案）下，生成 k 个可能的后续“思维”。论文提出了两种策略：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;采样： 从思维链提示中独立同分布地采样 k 个思维。适用于思维空间丰富的情况（如生成段落计划）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;提议： 使用一个“提议提示”，让模型在同一个上下文中连续生成 k 个不同的思维。适用于思维空间受限的情况（如生成一个单词或一行方程），以避免重复。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3 &lt;strong&gt;如何启发式地评估状态？&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;不使用传统的搜索算法，而是用&lt;strong&gt;LLM&lt;/strong&gt;对节点状态进行评估打分，好处是比编程的规则更加灵活。考虑&lt;strong&gt;两种策略&lt;/strong&gt;对状态进行评估。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;独立评估&lt;/strong&gt;： 为每个状态 $S$ 独立生成一个标量值（如1-10分）或分类（如“确定/可能/不可能”）。评估基于快速前瞻模拟和常识。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;投票评估&lt;/strong&gt;： 让语言模型在多个状态 $S$ 中进行比较，并投票选出最有可能的一个。这相当于一个“逐步”的自洽性检查。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;4 &lt;strong&gt;使用什么搜索算法？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;广度优先搜索（BFS）&lt;/strong&gt; 每一步维持最多$b$个最有希望的状态。在深度有限的任务中使用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;深度优先搜索（DFS）&lt;/strong&gt; 首先搜索最有希望的状态，直到完成输出或者评估器认为当前$S$无法完成问题。 对该$S$的子节点进行剪枝并回溯到$S$的父节点继续搜索。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;4. Experiment&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;结果部分通过在三个精心设计的任务上的实验，得出了一个核心且一致的结论：Tree of Thoughts (ToT) 框架能够极大地提升大语言模型（GPT-4）在需要进行探索、规划和搜索的复杂任务上的性能，显著优于传统的输入-输出（IO）提示、思维链（CoT）提示以及思维链自洽（CoT-SC）等基线方法。&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;消融实验&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;无剪枝&lt;/li&gt;
&lt;li&gt;无回溯&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
  &lt;summary&gt;快速抓重点&lt;/summary&gt;

  &lt;ul&gt;
    &lt;li&gt;`ToT` 强在显式搜索，适合多步规划和需要试错的问题。&lt;/li&gt;
    &lt;li&gt;`ReAct` 强在与外部环境交互，适合检索、网页操作、决策任务。&lt;/li&gt;
    &lt;li&gt;两者都在补足“直接一次性生成答案”时容易失控的问题。&lt;/li&gt;
  &lt;/ul&gt;
&lt;/details&gt;

&lt;h2&gt;论文信息&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://arxiv.org/pdf/2210.03629&quot;&gt;Arxiv ID&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://hjfy.top/arxiv/2210.03629&quot;&gt;幻觉翻译&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;&lt;strong&gt;Title:ReAct: Synergizing Reasoning and Acting in Language ModelsReAct: 在语言模型中协同推理和行动&lt;/strong&gt;&lt;/h3&gt;
&lt;h2&gt;论文结构&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;1. Introduction&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;当前的大语言模型在解决复杂任务时，其&amp;quot;推理&amp;quot;和&amp;quot;行动&amp;quot;能力是相互割裂的。纯推理方法容易产生事实幻觉且无法获取最新信息，而纯行动方法缺乏战略规划能力，容易在复杂任务中迷失方向。提出了 &lt;strong&gt;ReAct范式&lt;/strong&gt;，通过在大语言模型中交织生成&lt;strong&gt;推理轨迹&lt;/strong&gt;和&lt;strong&gt;任务特定动作&lt;/strong&gt;，创建&amp;quot;推理指导行动，行动辅助推理&amp;quot;的协同机制，使模型能够动态规划、利用外部信息并处理异常。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;2. Background&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Standard prompting（标准提示）&lt;/strong&gt;： 直接生成答案或行动，缺乏显式推理过程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chain-of-Thought (CoT) prompting（思维链提示）&lt;/strong&gt;： 通过生成推理步骤提升模型表现，但是&lt;strong&gt;静态的、封闭的&lt;/strong&gt;，无法与外部环境交互，容易产生&lt;strong&gt;事实幻觉&lt;/strong&gt;和&lt;strong&gt;错误传播&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Act-only prompting（纯行动提示）&lt;/strong&gt;： 能够与环境交互，但缺乏&lt;strong&gt;高层次的语言推理&lt;/strong&gt;来指导行动规划、跟踪进度和处理异常。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;3. ReAct&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/lnscq/picx-images-hosting/raw/master/image.3k8egkob9t.webp&quot; alt=&quot;ReAct对比图&quot;&gt;&lt;/p&gt;
&lt;p&gt;将任务求解视为在推理空间和行动空间中的交替执行过程。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ReAct&lt;/strong&gt; 解决四个关键问题：&lt;/p&gt;
&lt;p&gt;1 &lt;strong&gt;如何融合推理与行动？&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;通过扩展智能体的行动空间至 $\hat{\mathcal{A}} = \mathcal{A} \cup \mathcal{L}$，其中 $\mathcal{A}$ 是外部行动空间（如搜索、点击），$\mathcal{L}$ 是语言（推理）空间。模型可以交替或按需生成&amp;quot;思考&amp;quot;和&amp;quot;行动&amp;quot;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2 &lt;strong&gt;如何设计任务特定的行动空间？&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;根据任务需求设计最小化但足够的行动集：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;知识任务&lt;/strong&gt;：搜索(Search)、查找(Lookup)、完成(Finish)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;决策任务&lt;/strong&gt;：导航(Go to)、拿取(Take)、使用(Use)等环境原生动作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网页任务&lt;/strong&gt;：搜索(Search)、点击(Click)、购买(Buy Now)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3 &lt;strong&gt;如何生成有效的推理轨迹？&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;通过少量示例提示，引导模型生成多种类型的推理：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;任务分解&lt;/strong&gt;：&amp;quot;我需要先搜索X，然后查找Y&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;信息提取&lt;/strong&gt;：&amp;quot;段落中提到成立于1844年&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;进度跟踪&lt;/strong&gt;：&amp;quot;现在生菜已清洗，下一步是放到餐桌&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异常处理&lt;/strong&gt;：&amp;quot;搜索无结果，尝试换关键词&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;常识推理&lt;/strong&gt;：&amp;quot;台灯通常放在桌子或架子上&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;4 &lt;strong&gt;如何平衡推理与行动的密度？&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;根据任务类型动态调整：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;知识密集型任务&lt;/strong&gt;：采用&lt;strong&gt;密集、交替&lt;/strong&gt; 的思考-行动-观察步骤&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;决策制定任务&lt;/strong&gt;：采用&lt;strong&gt;稀疏、按需&lt;/strong&gt;的思考，在关键时刻（如规划、遇到困境时）进行推理&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3&gt;&lt;strong&gt;4. 实验验证&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;通过在四个不同领域的基准测试上的实验，证明了ReAct框架的显著优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;知识推理任务&lt;/strong&gt;（HotpotQA, FEVER）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ReAct优于纯行动方法，展示了推理对行动的指导价值&lt;/li&gt;
&lt;li&gt;与CoT相比，ReAct减少了幻觉，提高了事实准确性&lt;/li&gt;
&lt;li&gt;ReAct + CoT-SC组合达到了最佳性能，结合了内部知识和外部信息&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;交互决策任务&lt;/strong&gt;（ALFWorld, WebShop）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;少量提示&lt;/strong&gt;的ReAct显著超越了需要&lt;strong&gt;大量专家数据&lt;/strong&gt;训练的模仿学习和强化学习方法&lt;/li&gt;
&lt;li&gt;在ALFWorld上绝对成功率提升34%，在WebShop上提升10%&lt;/li&gt;
&lt;li&gt;纯行动基线容易陷入循环或迷失方向，而ReAct能有效规划并跟踪目标&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;strong&gt;消融与分析&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;与Inner Monologue对比&lt;/strong&gt;：ReAct的&lt;strong&gt;主动推理&lt;/strong&gt;优于单纯复述环境反馈&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;错误模式分析&lt;/strong&gt;：ReAct的失败更多源于推理错误或搜索无效，而非事实幻觉&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;人机回环验证&lt;/strong&gt;：人类通过编辑推理轨迹可轻松纠正模型行为，证明了框架的可控性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;5. 核心贡献总结&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;范式创新&lt;/strong&gt;：首次系统性地将推理与行动在LLM中协同，提出统一框架&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通用性强&lt;/strong&gt;：在知识推理和交互决策两大类任务上均表现优异&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实用性突出&lt;/strong&gt;：通过提示方法实现，成本低且易于复现&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可解释性佳&lt;/strong&gt;：生成的推理轨迹提供透明的问题解决过程&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开辟新方向&lt;/strong&gt;：为构建更可靠、可控的AI智能体奠定了基础&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><dc:creator>Lhx&apos;s Blog</dc:creator><pubDate>Mon, 13 Oct 2025 00:00:00 GMT</pubDate></item><item><title>氦闪之后——热核外传（1）</title><link>https://lhxzns.pages.dev/blog/novel/%E7%83%AD%E6%A0%B8%E5%A4%96%E4%BC%A0%E6%B0%A6%E9%97%AA%E4%B9%8B%E5%90%8E/</link><guid isPermaLink="true">https://lhxzns.pages.dev/blog/novel/%E7%83%AD%E6%A0%B8%E5%A4%96%E4%BC%A0%E6%B0%A6%E9%97%AA%E4%B9%8B%E5%90%8E/</guid><description>地球的末日，最后的时刻。</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://lhxzns.pages.dev/blog/novel/%E7%83%AD%E6%A0%B8%E5%A4%96%E4%BC%A0%E6%B0%A6%E9%97%AA%E4%B9%8B%E5%90%8E/&quot;&gt;https://lhxzns.pages.dev/blog/novel/%E7%83%AD%E6%A0%B8%E5%A4%96%E4%BC%A0%E6%B0%A6%E9%97%AA%E4%B9%8B%E5%90%8E/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1 style={{textAlign: &quot;center&quot;}}&gt;氦闪之后&lt;/h1&gt;

&lt;h2 style={{textAlign: &quot;right&quot;}}&gt;——热核外传（1）&lt;/h2&gt;

&lt;p style={{textIndent: &quot;2em&quot;}}&gt;古朴的木屋散发出沧桑的气息，稀稀疏疏拼凑在一起的模板被风雨侵蚀着，乌黑暗淡，一股腐臭的气味蔓延开来。屋外有一层栅栏，米粒大的虫眼随处可见，耷拉着的朽木比比皆是。到处是死气沉沉的样子。&lt;/p&gt;

&lt;p style={{textIndent: &quot;2em&quot;}}&gt;屋内倒显得洁净许多，简朴的陈列透露出悠久历史的味道，平整的书案却令人耳目一新。我向一旁微微侧过头去，透过狭小的木窗却将天边的云彩看得一览无余。夕日欲颓，却无沉鳞竞跃。日落西山，璀璨的光芒似箭般射穿云彩，在天幕中留下难忘的晚霞风光。&lt;/p&gt;

&lt;p style={{textIndent: &quot;2em&quot;}}&gt;就在这时，意外发生了……&lt;/p&gt;

&lt;p style={{textIndent: &quot;2em&quot;}}&gt;昏黄的太阳忽然急剧膨胀起来，逐渐暗淡的光辉也开始剧烈闪烁，照着地上连串的蚂蚁，忽明忽暗，多么诡异的一幕。紧接着，当太阳又一次猛地闪烁，整个天空像核爆后一样如白昼般明亮，我的眼前除了中心的太阳，只剩下了白茫茫的一片，仿佛世界在这一瞬间都化为乌有。我的脑海里忽然浮现出来一个恐怖的词语——&lt;strong&gt;氦闪&lt;/strong&gt;。这是太阳最后一次把光和热洒向地球，它用尽余力再一次把光明带给了地球，可恰恰相反，它这次带来的不是生命与希望，而是毁灭。&lt;/p&gt;

&lt;p style={{textIndent: &quot;2em&quot;}}&gt;在这之后，照耀了地球四十六亿年的母亲，便渐渐隐去了自己的光辉。它裹上了一层血色外衣，看起来格外的狰狞，我知道，地球的母亲正在经历小质量恒星的最后阶段——红巨星。与此同时，母亲以肉眼可见的速度向外膨胀，或许过不了多久，地球这个乳臭未干的顽皮孩子将又一次回到母亲的怀抱，那是人类或许已经不复存在……&lt;/p&gt;

&lt;p style={{textIndent: &quot;2em&quot;}}&gt;随着木门“咯吱”一声被人推开，我才收回怔怔的目光，旋即瞥向门口。林瑶缓缓走了进来，轻声说道：“确认是氦闪了。或许人类的历史就只剩下这短短不到24个小时的时间了——你不出去看看？”&lt;/p&gt;

&lt;p style={{textIndent: &quot;2em&quot;}}&gt;我沉重地叹了一口气，放下笔，微微倾身，站起来，披上满是补丁的大衣，捋一下乱蓬蓬的头发，合上手中的书，用手抚过桌面，每一个动作都显得如此沉重，屋里的气氛是那么压抑。走出木屋前，我才再一次回望这栋生活了十几年的木屋，心中满是凄然。“也许今生今世我再也没法回来了，对吧……”我心想。&lt;/p&gt;

&lt;p style={{textIndent: &quot;2em&quot;}}&gt;走到市内，我便和林瑶道了别，她也赶去看望她土生土长的地方。我径直来到市中心。车水马龙、川流不息的繁荣宁静之景已在恐慌下被车辆、群众纷繁错杂的景象所取代。大批大批的人们冲出家门，在拥挤的街道上四处游荡，高楼大厦内部反倒成了最安静的地方。汽车大都敞开着车门被抛弃在马路上，已无人再留心这些身外之物。&lt;/p&gt;

&lt;p style={{textIndent: &quot;2em&quot;}}&gt;城市的治安成了一团糟。无论贫困潦倒，还是达官显贵，都将在光热降临地球的那万分之一秒内化为灰烬。在这方面，人生倒是最公平的了。人们像饥饿的野狼一般，肆意劫掠，全然不顾自身的形象，不管是蓬头垢面，还是已鲜血淋漓。占地百亩的立体商场，也难逃在一小时之内被劫掠一空的命运。不过并没有人阻止这些行为，没有人在意这些行为。在灾难性的毁灭面前，人类不过是蝼蚁，不过是难以自保的尘埃罢了，道德的约束在人性面前一文不值，不知道“为身死而不受”的孟子眼见此情此景，会作何感想？当载人火箭一支又一支地频繁发射，当抗议的浪潮一波又一波掀起，当此起彼伏的枪声在和平的国度响起，我就明白，世道乱了。&lt;/p&gt;

&lt;p style={{textIndent: &quot;2em&quot;}}&gt;我内心轻蔑那些试图通过火箭逃跑的愚人，11.2！11.2！哈哈哈，11.2千米每秒！那些愚蠢的人们怎敢妄想达到这个速度！达不到的后果，就是在离地球400千米的地方，率先接受太阳的洗礼！更何况，在人生的最后一天，谁又会去自讨苦吃，承受那9个G的过载？&lt;/p&gt;

&lt;p style={{textIndent: &quot;2em&quot;}}&gt;在这个苦难的时代，或许天真无邪的孩子才真正是快乐的天使。路上我看到一家铁匠店，在这个科技年代见到铁匠店着实有些稀奇。我缓缓踱步过去，熏得乌黑的门牌上写着四个金灿灿的斗方大字——白铁加工。我向店里望去，几个摆脱了家长约束的活泼的孩子正围着一个铁匠欢快地叫着闹着，脸上洋溢着满是欢喜的表情，毫无面临死亡的畏惧。我心想，这大概就是童真吧。&lt;/p&gt;

&lt;p style={{textIndent: &quot;2em&quot;}}&gt;走近了去打听，才了解到，原来几位活宝是想请铁匠打几件古代兵器玩玩。铁匠人很好，也不问他们收钱，便熟练地抡起了炼铁的铁锤，认真地打着铁器。不一会，一把又一把小巧玲珑的兵器便大功告成了。威风凛凛的青龙偃月刀、傲气凌人的丈八蛇矛、锋利无比的鱼肠剑，以及孩子们治愈的笑声都好像让我找到了苦难中的慰藉。&lt;/p&gt;

&lt;p style={{textIndent: &quot;2em&quot;}}&gt;我悄悄地离开了铁匠店。&lt;/p&gt;

&lt;p style={{textIndent: &quot;2em&quot;}}&gt;又一次漫无目的地走在大街上，愤怒、无助、凄苦、悲凉霎时间涌上心头，百感交集之下，一滴晶莹的泪珠悄然渗出眼角。这时，街道两旁的电子屏幕都同时亮了起来，一个眼眶微红，话带哭腔的主持人出现在屏幕上。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;广大人类朋友们，你们好。这里是联合国安理会向全球进行的一次国际通报。据最新消息，人类的历史可能只有短短三个小时的剩余了。请大家不要慌张，保持冷静。&lt;/p&gt;
&lt;p&gt;“我们人类是一个优秀的种族，一路走来，人类已不觉拥有了几百万年的历史。从祖先们第一次出现在河流之畔、海洋之滨，到铜的成功冶炼，从各个国家紧密相连、开展丝绸之路，到现在我们休戚与共、共面灾难，人类的历史进程一直是曲折坎坷的，但每经历一次坎坷，人类的力量就更强大一分，这就是历史进步的潮流。&lt;/p&gt;
&lt;p&gt;“在人类的历史上，每一笔都是由人民创造的。我们每个人都是历史的创造者和亲历者。而三个小时后我们要经历的只是人类的又一段历史，也只不过是人类历史的尾声罢了。&lt;/p&gt;
&lt;p&gt;“在这里，我希望大家可以从容地面对死亡，当一件事同时降临在80亿人的身上，那么它将不再可怕。最后，联合国感谢大家一路以来共同的协作、配合，感谢大家最后的聆听，谢谢……&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style={{textIndent: &quot;2em&quot;}}&gt;听到这里，我的眼泪再也止不住了，如瀑布般倾泻而下，当死亡如此临近时，我竟是如此的恐惧。周围哭声一片，悲痛淹没了整个世界。这时，我心急如焚的想要找到林瑶，那个陪伴了我半生的人。或许是心有灵犀一点通，也或许是冥冥之中自有天意，她此时此刻竟就在我的面前……&lt;/p&gt;

&lt;p style={{textIndent: &quot;2em&quot;}}&gt;我们相拥而泣……三小时后……在万分之一秒内……虚空中空余一片尘埃……&lt;/p&gt;

&lt;hr /&gt;

&lt;p style={{textAlign: &quot;right&quot;}}&gt;&lt;em&gt;李昊轩&lt;/em&gt;&lt;br /&gt;&lt;em&gt;2022年12月3日于郑州家中&lt;/em&gt;&lt;/p&gt;</content:encoded><dc:creator>Lhx&apos;s Blog</dc:creator><pubDate>Sat, 03 Dec 2022 00:00:00 GMT</pubDate></item></channel></rss>