欢迎来到soarli博客，是一个充满魔力的地方！
修复 libcares.so.2: cannot open shared object file 错误
本文由AI辅助撰写，可能存在不准确之处，请读者注意甄别！🚀 引言：那个熟悉的错误如果你在 Linux 环境下编译或安装了自定义版本的软件（比如 curl），你可能满怀期待地运行它，结果却遇到了这个“老朋友”：/usr/local/curl/bin/curl: error while loading shared libraries: libcares.so.2: cannot open shared object file: No such file or directory这个错误信息非常明确：curl 程序在启动时，需要加载一个名为 libcares.so.2 的“共享库”文件，但操作系统的动态链接器（dynamic linker）找不到它。别担心，这个问题很常见，而且通常有几种清晰的解决路径。💡 为什么会发生这个错误？这几乎总是与动态链接有关。共享库 (.so 文件)： 在 Linux 中，.so 文件（Shared Object）是共享库，类似于 Windows 上的 .dll。它们包含可重用的代码，多个程序可以“共享”它们，以节省磁盘空间和内存。libcares.so.2 是什么？ 这是 c-ares 库，一个用于异步 DNS 解析的 C 库。你编译的 curl 依赖它来执行非阻塞的域名查找。“找不到”的真正含义： 这个错误不一定意味着文件不存在，而是意味着动态链接器（ld）没有在它“已知”的标准路径（如 /lib、/usr/lib）中找到它。自定义编译的“陷阱”： 当你手动从源码编译并安装软件到 /usr/local 目录下时（就像错误中的 /usr/local/curl/bin/curl），它所依赖的库（可能也安装在 /usr/local/lib）可能没有被系统的动态链接器所知晓。🛠️ 解决方案：从诊断到修复我们来一步步解决这个问题。第一步：诊断，看看文件在哪里首先，我们得知道 libcares.so.2 这个文件到底在不在你的系统上。sudo find / -name "libcares.so.2"这个命令会告诉你文件的确切位置。根据结果，你有两个主要的分支：A. 如果 find 找到了文件 (例如，在 /usr/local/lib 或 /opt/cares/lib 等路径下)，说明库已安装，只是系统“不知道”去那里找。请看 [解决方案 1] 或 [解决方案 2]。B. 如果 find 什么都没找到，说明这个库文件根本没被安装。请看 [解决方案 3]。解决方案 1：（推荐）更新动态链接器缓存 (ldconfig)这是最“正确”且一劳永逸的方法。我们要做的是告诉系统：“嘿，请你以后也去 /usr/local/lib 这个地方找找库文件。”假设 find 命令告诉你文件在 /usr/local/lib：创建配置文件：在 /etc/ld.so.conf.d/ 目录下创建一个新的 .conf 文件（名字随意，比如 local-libs.conf），内容是库文件所在的目录路径。echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/local-libs.conf注意： 如果你的库在其他非标准路径（如 /opt/myapp/lib），请替换上面命令中的 /usr/local/lib。刷新缓存：运行 ldconfig 命令，它会读取所有配置文件（包括你刚创建的那个），并重建动态链接器的缓存。sudo ldconfig测试：现在再次运行你的 curl 命令，错误应该已经消失了。/usr/local/curl/bin/curl --version解决方案 2：（临时）使用 LD_LIBRARY_PATH这个方法非常适合临时测试或在没有 sudo 权限的环境下使用。它通过一个环境变量告诉当前 shell 在哪里查找库。设置环境变量：（同样，假设库在 /usr/local/lib）export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH这会将 /usr/local/lib 临时添加到库搜索路径的最前面。测试：必须在同一个终端会话中运行你的 curl 命令：/usr/local/curl/bin/curl --version注意： 这个设置只在当前终端有效，关闭终端后就会失效。你可以将其添加到 ~/.bashrc 或 ~/.zshrc 文件中使其（对当前用户）永久生效，但 ldconfig（方案 1）通常是更好的系统级解决方案。解决方案 3：（如果未安装）安装 c-ares 库如果 find 命令什么都没找到，那说明你根本没有安装这个依赖。使用系统的包管理器来安装它：在 RHEL / CentOS / Fedora 上：sudo yum install c-ares # 或者新版本 sudo dnf install c-ares在 Debian / Ubuntu 上：sudo apt-get update sudo apt-get install libc-ares2包管理器在安装后通常会自动运行 ldconfig，所以安装完成后，你的 curl 命令应该就能直接工作了。解决方案 4：（备选）你真的需要自定义 curl 吗？最后，问自己一个问题：你是否必须使用 /usr/local/curl/bin/curl 这个自定义版本？你的系统很可能已经自带了一个稳定且配置完好的 curl（通常在 /usr/bin/curl）。# 运行系统自带的 curl /usr/bin/curl --version # 或者直接运行 curl --version除非你明确需要自定义版本中的某个新功能，否则使用系统自带的版本是避免依赖问题的最简单方法。总结cannot open shared object file 错误是 Linux 使用中不可避免会遇到的问题。它揭示了动态链接的工作原理。下次你再遇到它时，你就知道该怎么做了：Find： 找到库文件。ldconfig：（如果找到）告诉系统去哪找。Install：（如果没找到）安装它。Workaround： 考虑使用系统默认版本。
本文转载自互联网，已在文末注明来源。ubuntu下进入单用户模式可以使用命令sudo init 1由于虚拟机的sudoer配置文件出问题，没办法使用sudo命令，root的密码又不记得，所以研究了一下通过recover模式进入单用户模式中的方法。不多说了，上图：启动系统的时候长按 shift 键，进入grub菜单： 选择ubuntu高级选项，按 e 键 选择recovery模式，按 e 进入 修改里面的linux行 ctrl + x退出，进入单用户模式 注意：在修改完grub配置之后，下次进入recovery模式，显示的内容仍然是未修改前的。如要再次进入单用户模式，需要再次修改。修改完后若要重启，通过reboot, shutdown -r等等均不可行，需要通过vmware使用ctrl + alt + delete来实现。原文地址：ubuntu怎么进入单用户模式 - 迷阳 - 博客园
在 nano 编辑器中保存文件的方法如下：保存文件（写入文件）：按下 Ctrl + O（即按住 Ctrl 键，再按字母 O）。此时底部会提示你输入文件名（如果当前文件已有名称，会自动显示）。直接按 Enter 键确认保存。退出 nano：按下 Ctrl + X。如果文件有未保存的更改，nano 会提示你是否要保存：按 Y 表示“是”，保存并退出；按 N 表示“否”，放弃更改并退出。小贴士：如果你是在新建一个文件，第一次保存时 Ctrl + O 会让你输入文件名。保存不会自动退出，需要单独按 Ctrl + X 退出。例如，编辑一个叫 example.txt 的文件：nano example.txt编辑完成后：Ctrl + O → Enter（保存）Ctrl + X（退出）
typecho 发表文章 遇到 Database Query Error报错的处理方法
本文转载自互联网，已在文末注明来源。进行以下操作时最好备份当前数据库后再操作1、修改数据库配置文件的编码。打开网站根目录数据库配置文件 config.inc.php 将 charset 的值由 utf8改为 utf8mb4/** 定义数据库参数 */ $db = new Typecho_Db('Pdo_Mysql', 'echo_'); $db->addServer(array ( 'host' => 'localhost', 'user' => 'user', 'password' => 'password', 'charset' => 'utf8mb4', //修改这一参数 'port' => '3306', 'database' => 'echo', ), Typecho_Db::READ | Typecho_Db::WRITE); Typecho_Db::set($db);2、修改数据库编码。alter table typecho_comments convert to character set utf8mb4 collate utf8mb4_general_ci; alter table typecho_contents convert to character set utf8mb4 collate utf8mb4_general_ci; alter table typecho_fields convert to character set utf8mb4 collate utf8mb4_general_ci; alter table typecho_metas convert to character set utf8mb4 collate utf8mb4_general_ci; alter table typecho_options convert to character set utf8mb4 collate utf8mb4_general_ci; alter table typecho_relationships convert to character set utf8mb4 collate utf8mb4_general_ci; alter table typecho_users convert to character set utf8mb4 collate utf8mb4_general_ci;原文地址：typecho 发表文章 遇到 Database Query Error报错的处理方法 - LaoKey's Blog
GitLab Docker 版升级指南：从备份到离线更新，解决网络难题
对于许多团队来说，使用 Docker 部署的 GitLab 是代码托管和 DevOps 的核心。保持 GitLab 的版本更新至关重要，这不仅能获取最新的功能，还能及时修复安全漏洞。然而，升级过程，尤其是当服务器网络环境不佳时，常常会遇到挑战。本文将为您提供一份详尽的 GitLab (Docker 版) 升级指南。我们将从标准的在线升级流程开始，然后重点讲解当您遇到 context deadline exceeded 等网络问题时，如何通过手动离线导入镜像的方式完成升级。场景示例：当前版本: gitlab/gitlab-ce:17.11.4-ce.0目标版本: gitlab/gitlab-ce:17.11.7-ce.0核心命令: sudo docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v /home/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:TAGPart 1: 标准在线升级流程在网络通畅的情况下，升级 GitLab 非常直接。核心原理是：停止并删除旧容器，然后使用新版镜像和完全相同的挂载路径启动新容器。 您的所有数据都安全地保存在挂载到主机的卷 (/home/gitlab) 中，因此删除容器本身是无损的。第 1 步：备份（重中之重！）在进行任何操作前，永远要先创建一个完整备份。sudo docker exec -t gitlab gitlab-backup create此命令会在您的数据卷目录 (/home/gitlab/data/backups) 下生成一个 .tar 格式的备份文件。这是您最可靠的“后悔药”。第 2 步：停止并移除旧容器sudo docker stop gitlab sudo docker rm gitlab请放心，只要您的 -v 挂载路径是正确的，此操作不会删除您的任何配置、代码或数据库。第 3 步：拉取新版镜像sudo docker pull gitlab/gitlab-ce:17.11.7-ce.0第 4 步：启动新容器这是最关键的一步。使用您最初的 docker run 命令，只需将末尾的镜像标签更改为新的版本号。sudo docker run -d \ -p 443:443 -p 80:80 -p 222:22 \ --name gitlab \ --restart always \ -v /home/gitlab/config:/etc/gitlab \ -v /home/gitlab/logs:/var/log/gitlab \ -v /home/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:17.11.7-ce.0第 5 步：监控与验证新容器启动后，GitLab 会在后台自动执行升级脚本（如数据库迁移）。这个过程可能需要几分钟。您可以通过以下命令实时查看日志：sudo docker logs -f gitlab当日志输出稳定，并出现服务正常运行的提示时，尝试通过浏览器访问您的 GitLab 实例，确认一切功能正常。Part 2: 解决网络难题 - 离线升级流程如果您在执行 docker pull 时遇到以下错误，说明您的服务器无法顺畅连接到 Docker Hub。Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded别担心，我们可以“曲线救国”，手动将镜像文件传输到服务器。方案 A：手动导入镜像（一次性解决）这个方案分为三步：下载 -> 传输 -> 加载。1. 在网络好的机器上下载并打包镜像您需要一台可以正常访问网络的电脑（Windows, macOS, Linux 均可），并安装了 Docker。首先，启动 Docker Desktop (Windows/macOS 用户)。这是新手最容易忘记的一步，请确保 Docker 引擎正在后台运行。然后，打开终端 (PowerShell, CMD, Terminal) 执行：# 1. 拉取你需要的镜像 docker pull gitlab/gitlab-ce:17.11.7-ce.0 # 2. 将镜像保存为 tar 文件 docker save -o gitlab-ce-17.11.7.tar gitlab/gitlab-ce:17.11.7-ce.0命令执行完毕后，当前目录下会生成一个几 GB 大小的 gitlab-ce-17.11.7.tar 文件。2. 将镜像文件传输到 GitLab 服务器使用 scp 命令或 WinSCP、MobaXterm 等图形化 SFTP 工具，将 .tar 文件上传到您的服务器，例如上传到 /root/ 目录。# 在您的本地电脑上执行 # 将 <服务器IP> 替换为您的实际 IP scp ./gitlab-ce-17.11.7.tar root@<服务器IP>:/root/3. 在 GitLab 服务器上加载镜像登录到您的 GitLab 服务器，执行 docker load 命令。sudo docker load -i /root/gitlab-ce-17.11.7.tar加载完成后，可以执行 sudo docker images 进行验证，您会看到 gitlab/gitlab-ce:17.11.7-ce.0 已经存在于本地镜像列表中。最后，回到 Part 1 的第 4 步，执行 docker run 命令启动新容器即可！方案 B：配置镜像加速器（一劳永逸）如果您需要频繁拉取镜像，配置一个国内的镜像加速器是更高效的解决方案。编辑 Docker 配置文件sudo nano /etc/docker/daemon.json填入加速器地址并保存{ "registry-mirrors": [ "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ] }重启 Docker 服务sudo systemctl daemon-reload sudo systemctl restart docker配置完成后，再执行 docker pull 命令，速度将会有质的飞跃。Part 3: 后续步骤无论您使用哪种方式升级成功，都别忘了做最后的检查和清理工作。全面验证：登录 GitLab，检查项目、仓库、CI/CD 流水线和用户权限是否都正常。清理旧镜像（可选）：待新版本稳定运行一段时间后，可以删除旧的镜像以释放磁盘空间。# 列出所有镜像 sudo docker images # 删除旧版本镜像 sudo docker rmi gitlab/gitlab-ce:17.11.4-ce.0总结升级 Docker 版的 GitLab 本质上是一个简单而安全的过程，其关键在于理解 Docker 的卷挂载机制。即使面对不理想的网络环境，我们也可以通过离线导入镜像的方式轻松应对。希望这篇指南能帮助您顺利完成升级，让您的 GitLab 实例永远保持在最佳状态！🚀
告别系统盘焦虑：将 Docker 数据目录迁移到大容量硬盘的终极指南
本篇暂未验证，理论应该可行的！在现代服务器运维中，Docker 已经成为不可或缺的工具。但随之而来的一个甜蜜烦恼是：Docker 实在是太“能吃”了！镜像（Images）、卷（Volumes）、容器的可写层（Writable Layers），尤其是我们常常忽略的日志（Logs），都会默认堆积在 /var/lib/docker 目录下。对于使用高速但容量有限的 SSD 作为系统盘的服务器而言，这无异于一颗定时炸弹。当系统盘被占满时，整个系统的性能都会受到影响，甚至可能导致服务中断。那么，如何从根源上解决这个问题呢？答案就是：将整个 Docker 的“家”——数据根目录（data-root）——迁移到一块容量更大的数据盘（如机械硬盘 HDD）上。这篇博客将为你提供一个安全、详细、分步式的操作指南。迁移前的准备工作 (Prerequisites)在开始操作前，请确保你已经准备好以下条件：一台安装了 Docker 的 Linux 服务器。一块已经挂载好的大容量硬盘。在本教程中，我们假设你已经将其挂载到某个路径，我们将使用 /home/docker-data 作为 Docker 的新家。你可以根据自己的情况替换为 /mnt/data/docker 等其他路径。Sudo 或 Root 权限。一个维护窗口。本次操作需要短暂地停止 Docker 服务，所有容器将会停止运行。请务必在一个业务低峰期进行。迁移五步法：安全、高效地为 Docker 搬家我们将严格遵循“停服 -> 迁移 -> 改配置 -> 验证 -> 清理”的流程，并加入安全备份步骤，确保万无一失。第 1 步：停止 Docker 服务这是整个流程中最关键的第一步。必须在迁移文件前完全停止 Docker，以防止任何数据读写导致文件损坏或数据不一致。# 停止 Docker 服务 sudo systemctl stop docker.service # 同时停止 Docker 的 socket 监听 sudo systemctl stop docker.socket执行后，可以通过 systemctl status docker 确认 Docker 已经处于 inactive (dead) 状态。第 2 步：配置 Docker 的新家接下来，我们需要告诉 Docker，下次启动时应该去哪里寻找它的文件。这通过修改 Docker 的守护进程配置文件 daemon.json 来实现。打开（或创建）配置文件：sudo nano /etc/docker/daemon.json添加 data-root 配置：在文件中输入以下内容。如果你之前有其他配置（比如我们之前设置的日志轮转），请确保将 "data-root" 作为一个新的键值对添加进去，并保证整个文件是合法的 JSON 格式。{ "data-root": "/home/docker-data" }提示：如果已有其他配置，它可能看起来像这样：{ "data-root": "/home/docker-data", "log-driver": "json-file", "log-opts": { "max-size": "1g", "max-file": "10" } }第 3 步：执行迁移现在，我们将 /var/lib/docker 目录下的所有内容原封不动地搬到新家 /home/docker-data。在这里，我们强烈推荐使用 rsync 命令，而不是 cp 或 mv。为什么是 rsync？因为它能完美地保留所有文件的权限、所有权、时间戳等元数据，这对于 Docker 的正常运行至关重要。# 使用 rsync 进行归档式、带进度的迁移 # -a: 归档模式，等于 -rlptgoD，能保留所有文件属性 # -P: 显示进度（progress）并支持断点续传（partial） sudo rsync -aP /var/lib/docker/ /home/docker-data/根据你的数据量大小，这个过程可能需要几分钟到数小时不等，请耐心等待。第 4 步：启动并验证数据迁移完成后，激动人心的时刻到了。我们先不急着删除旧数据，而是先启动 Docker，验证它能否在新家正常工作。为了安全起见，先将旧目录重命名作为备份：sudo mv /var/lib/docker /var/lib/docker.old这一步是我们的“后悔药”。如果 Docker 启动失败，我们只需删除新配置，并将这个目录改回原名即可恢复。启动 Docker 服务：sudo systemctl start docker进行验证：验证一：检查 Docker 根目录。这是决定性的证据。docker info | grep "Docker Root Dir" 你应该看到如下输出，确认路径已经更改： Docker Root Dir: /home/docker-data验证二：检查容器和镜像。docker ps -a docker images 如果你能看到之前所有的容器和镜像都安然无恙，那么恭喜你，迁移已成功！ 第 5 步：清理战场在确认 Docker 在新目录运行稳定、所有容器都正常工作后，我们就可以放心地删除旧的数据备份，将宝贵的系统盘空间释放出来了。🚨 最终警告：请在完成所有验证、并观察一段时间（例如一天）确保服务稳定后再执行此步骤。此操作不可逆！sudo rm -rf /var/lib/docker.old结语通过以上五个步骤，我们成功地将 Docker 的整个数据目录迁移到了大容量硬盘上。这不仅一劳永逸地解决了系统盘的空间焦虑问题，还通过将频繁的I/O操作转移出去，间接减少了对系统盘 SSD 的磨损。这是一个简单但回报极高的最佳实践，强烈推荐给所有在生产环境中使用 Docker 的开发者和运维工程师。
今天我想分享一个前几天遇到的真实案例：一个平平无奇的 Docker 容器，在几天之内悄无声息地“吃”掉了我服务器 66GB 的硬盘空间。如果你也遇到了类似 /var/lib/docker 目录异常庞大的问题，希望这篇文章能帮你快速定位并解决问题。案发现场：一切的开始 🕵️‍♂️故事的开头很简单，我通过 docker run 命令在服务器上部署了一个 GitLab-CE 社区版容器。命令如下：sudo docker run -d \ -p 443:443 -p 80:80 -p 222:22 \ --name gitlab \ --restart always \ -v /home/gitlab/config:/etc/gitlab \ -v /home/gitlab/logs:/var/log/gitlab \ -v /home/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:17.11.4-ce.0我明明已经将 GitLab 的三个核心数据目录 config, logs, data 都通过 -v 参数挂载到了机械盘的 /home/gitlab 目录下。然而，几天后，我收到了磁盘空间告警。使用 du 命令检查后，结果令我震惊：root@gbfwq:~# du -h --max-depth=1 /var/lib/docker ... 66G /var/lib/docker/containers 7.6G /var/lib/docker/overlay2 73G /var/lib/docker/var/lib/docker/containers 目录竟然占用了 66GB！这不科学，我的数据不是应该都在机械盘上吗？一场“硬盘空间失踪案”的侦破就此展开。侦破之路：一波三折的排查第一条线索：容器内部文件？我的第一反应是：是不是 GitLab 在容器内部的其他未挂载目录中写入了大量文件？我立刻 exec 进入容器内部进行调查：# 进入容器 docker exec -it gitlab bash # 在容器内检查根目录大小 root@69784fa27abc:/# du -h --max-depth=1 / ... 3.6G /opt 4.4G /var ... 8.2G /奇怪的事情发生了，容器内部所有目录加起来的总大小也才 8.2G，与宿主机上显示的 66G 相差甚远。这条线索断了。第二条线索：“幽灵文件”？熟悉 Linux 的朋友可能知道，如果一个进程打开了一个文件，然后这个文件被删除了，但进程的句柄（handle）没有关闭，那么文件的磁盘空间是不会被释放的。这种文件 du 是统计不到的，我称之为“幽灵文件”。最简单的验证方法就是重启容器，因为重启会杀死并重建所有进程，自然会释放所有文件句柄。docker restart gitlab然而，重启后再次检查，66G 的空间纹丝不动。这条线索也断了。峰回路转：find 命令立大功！之前的排查都陷入了僵局。我决定回到宿主机，不再去猜测，而是直接寻找那个“大家伙”。我决定使用 find 命令，在 /var/lib/docker/containers 目录里找出所有大于 1GB 的文件。sudo find /var/lib/docker/containers -type f -size +1G -exec ls -lh {} \;几秒钟后，真相浮出水面：-rw-r----- 1 root root 66G Oct 18 18:37 /var/lib/docker/containers/697.../697...-json.log破案了！ 元凶就是这个藏在容器目录深处的 -json.log 文件。这是 Docker 默认的容器日志文件。真相大白与解决方案问题的根源Docker 默认会捕获容器主进程的所有标准输出（stdout）和标准错误（stderr），并以 JSON 格式存储在一个日志文件中。关键在于，Docker 默认对这个日志文件的大小和数量没有任何限制！GitLab 是一个复杂的应用，内部有 Nginx、PostgreSQL、Redis、Puma 等多个服务，它们会持续不断地输出运行日志。日积月累，这个日志文件就长成了一个 66GB 的庞然大物。解决方案（分两步走）第 1 步：紧急止血 - 立即释放空间首先，我们需要把这个巨大的日志文件清空，把被占用的空间立刻拿回来。使用 truncate 命令是最高效的方式。🚨 警告：此操作会清空该容器的所有历史日志，请确认没有影响后再执行。# 将下面的长路径替换为你自己 find 命令找到的路径 sudo truncate -s 0 /var/lib/docker/containers/697.../697...-json.log执行完毕，66GB 的空间瞬间就回来了！第 2 步：根治问题 - 配置日志轮转为了防止未来再次发生同样的问题，我们必须给 Docker 的日志系统立个规矩。这通过配置 Docker 的守护进程文件 daemon.json 来实现。编辑或创建配置文件sudo nano /etc/docker/daemon.json写入日志轮转配置假设我们给日志的预算是 10GB，可以设置为 10 个 1GB 的文件。{ "log-driver": "json-file", "log-opts": { "max-size": "1g", "max-file": "10" } }"max-size": "1g"：设置单个日志文件的最大体积为 1GB。"max-file": "10"：设置最多保留 10 个日志文件。当超过数量时，最旧的会被删除。重启 Docker 服务使配置生效sudo systemctl restart docker重要提示：这个配置只对未来新产生的日志生效，它不会自动清理已经存在的旧文件。这就是为什么我们必须先手动执行第一步的 truncate 操作。最佳实践：迁移整个 Docker 目录如果你想从根本上为你的系统盘（通常是SSD）减负，最佳实践是将整个 Docker 的数据目录（包括镜像、容器、日志等）都迁移到机械盘。这同样通过修改 daemon.json 文件实现，增加一个 "data-root" 参数即可。{ "data-root": "/home/docker-data", "log-driver": "json-file", "log-opts": { "max-size": "1g", "max-file": "10" } }具体迁移步骤包括：停止Docker -> 修改配置 -> rsync 迁移数据 -> 重启Docker -> 删除旧数据。这里就不再赘述。总结这次“硬盘失踪案”给了我们一个深刻的教训：永远不要忽略对 Docker 容器日志的管理。对于任何生产环境或长期运行的容器，配置日志轮转 (log-opts) 都应该是一个标准操作。希望我的这次排查经历能帮你少走弯路！
从宕机到扩容：ESXi中Ubuntu虚拟机“磁盘已满”实战救援全记录
前言：恐慌的开端“周末的早晨，告警邮件如期而至。” —— 这恐怕是每个运维工程师的噩梦。当我尝试启动一台重要的 GitLab 虚拟机（运行在 ESXi 上的 Ubuntu Server）时，屏幕上滚动着熟悉的启动日志，最后却无情地停在了一行红色的 [FAILED] 上：[FAILED] Failed to start Create Volatile Files and Directories. see 'systemctl status systemd-tmpfiles-setup.service' for details. ... [FAILED] Failed to start Network Name Resolution. ...系统无法正常启动，服务全面中断。这就是我们今天故事的开始：一次由磁盘空间耗尽引发的“血案”，以及一次从紧急救援到彻底根治的全过程记录。Part 1：紧急救援 - 在只读的世界里杀出一条血路systemd-tmpfiles-setup.service 失败通常指向一个根本原因：根分区 (/) 被 100% 占满了。系统连创建临时文件的空间都没有，后续所有服务自然接连崩溃。我们的首要目标是进入系统，清理出哪怕只有几百MB的空间，让系统能成功启动。进入恢复模式：重启虚拟机，在 GRUB 菜单选择 "Advanced options for Ubuntu"，然后进入 "Recovery mode"。获取读写权限的 Shell：在恢复菜单中，选择 root (Drop to root shell prompt)。此时你会进入一个命令行，但注意，文件系统默认是只读 (read-only) 的。必须执行以下命令，将其重新挂载为可读写，否则任何删除操作都会失败：mount -o remount,rw /定位并清理空间：现在，我们可以开始“瘦身”了。确认病因：df -h 果不其然，根分区 / 的 Use% 显示为 100%。分析元凶：通过 du -h --max-depth=1 /var | sort -rh 逐层分析，我们很快定位到 /var/lib/docker (47G) 和 /var/lib/snapd (3.9G) 是两大元凶。安全清理：清理 Docker：Docker 提供了安全清理的命令，它只会删除未被使用的资源，不会影响正在运行的服务。# 清理所有未使用的容器、网络、镜像和构建缓存 docker system prune - **清理 Snap**：Snap 会保留旧版本的包，非常占用空间。以下脚本可以安全地删除所有被禁用的旧版本： snap list --all | awk '/disabled/{print $1, $3}' | while read snapname revision; do snap remove "$snapname" --revision="$revision"; done经过这两步，我们成功释放了数GB的空间。此时，执行 reboot，虚拟机终于正常启动了！Part 2：防患未然 - 在扩容前备份一切系统虽然恢复了，但治标不治本。为了彻底解决问题，我们决定扩容磁盘。但在进行这种“高危操作”之前，备份是雷打不动的铁律。幸运的是，这台 GitLab 是通过 Docker 数据卷部署的，所有数据都映射在主机的 /mnt/gitlabdata 目录下。我们使用 tar 命令进行打包，但有一个技巧：必须将生成的备份包自身从打包范围中排除，否则会陷入无限循环。# -C 参数先切换到目标目录，避免打包时带有绝对路径 # --exclude 参数排除了备份文件自身 sudo tar --exclude='gitlab-backup-*.tar.gz' \ -czvf /mnt/gitlabdata/gitlab-backup-$(date +%F).tar.gz \ -C /mnt/gitlabdata .执行完毕后，一个以日期命名、包含所有数据的完整备份包静静地躺在了 /mnt/gitlabdata 目录中。我们心中大定。Part 3：核心操作 - 扩容硬盘并让系统识别扩容分为两步：在 ESXi 层面扩大虚拟磁盘，然后在 Ubuntu 系统内部让分区和文件系统识别到新空间。1. ESXi层面：搞定“快照”拦路虎关机并尝试扩容：我们先关闭虚拟机，在 ESXi 的“编辑设置”中尝试将硬盘从 60GB 改为 160GB。遭遇报错：“设备‘3’的操作无效”。这是一个经典错误，99% 的原因是虚拟机存在快照。ESXi 不允许在有快照的情况下修改虚拟磁盘的结构。解决：右键虚拟机 -> 快照 -> 快照管理器，点击 “全部删除”。注意，这里的“删除”实际上是将快照数据合并回主磁盘，会保留所有数据。等待合并任务完成后，我们再次编辑设置，成功将硬盘容量扩展到了 160GB。2. Ubuntu系统层面：从分区到文件系统这是最关键也最容易出错的一步。第一道坎：找对设备名教程常以 /dev/vda 为例，但我们的系统识别为 /dev/sda。永远不要盲从教程，lsblk 命令才是你的真相之源。lsblk # NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT # sda 8:0 0 160G 0 disk # └─sda1 8:1 0 60G 0 part /输出清晰地告诉我们：硬盘是 /dev/sda，需要操作的分区是 /dev/sda1。第二步：扩展分区 (parted)parted 是一个强大的分区工具，它的操作对象是整块硬盘。sudo parted /dev/sda进入 (parted) 交互模式后，我们执行 resizepart 命令。(parted) resizepart Partition number? 1 End? [64.4GB]? 100%输入分区号 1，并将结束位置设为 100%，这是一个绝佳的技巧，能自动将分区扩展到磁盘的全部可用空间。完成后输入 quit 退出。第三步：扩展文件系统 (resize2fs)分区边界虽然扩大了，但分区内部的文件系统（你可以理解为货架）还停留在旧的大小。resize2fs 的作用就是通知文件系统去铺满整个分区。它的操作对象是分区。sudo resize2fs /dev/sda1命令瞬间执行完毕。最后验证df -h输出结果中，/dev/sda1 的 Size 一栏赫然显示着 157G。至此，扩容大功告成！总结这次从宕机到扩容的经历，再次印证了几个系统管理的基本原则：监控是生命线：主动的磁盘空间监控能避免 99% 的此类事故。理解工具而非死记命令：知道 lsblk 比记住 /dev/sda 重要得多；理解“硬盘vs分区”的区别，才能正确使用 parted 和 resize2fs。快照是双刃剑：快照是备份和恢复的利器，但也是日常运维（如扩容）的“拦路虎”。要养成定期清理、合并快照的习惯。备份，备份，还是备份：在任何高危操作前，一个可靠的备份是你敢于点击“确认”按钮的最大底气。希望这次的实战记录，能为遇到类似问题的朋友提供一份清晰的行动指南。
本文转载自互联网，已在文末注明来源。第一节：Prompt定义及基本框架一、 什么是Prompt大模型 prompt 指在大语言模型应用中，用于 “提示” 模型唤起特定能力以解决实际问题的提问方式。早期它被称作 “输入形式” 或 “输入模板”，后来 “prompt”（提示）这一叫法因契合大语言模型语境，能准确体现其在调用模型能力方面的关键作用，成为公认术语。大模型多数核心能力在预训练阶段形成，prompt 就像钥匙，引导模型从预训练积累的海量信息中，精准唤起如理解复杂文本、总结信息、生成内容、逻辑推理等能力，满足用户实际需求。它并非把模型当作单纯知识库，而是高效调用其能力，实现类似人类运用智能解决复杂问题的效果，是 prompt 工程的核心，对用好大语言模型意义重大。二、 撰写Prompt的基本框架1、Prompt包含的要素● 指令：想要模型执行的特定任务或指令。● 上下文：包含外部信息或额外的上下文信息，引导语言模型更好地响应。● 输入数据：用户输入的内容或问题。● 输出指示：指定输出的类型或格式。2、Prompt五大框架2.1 RTF框架RTF框架是一个非常简单通用的Prompt提示框架，我们和任意大模型对话场景下都可以使用该规范进行改进输出。● R-Role角色：指定大模型担当固定角色程序员、数据分析师、讲解员、记者等等● T-Task任务: 任务，告诉大模型需要为我们做的事情● F-Format格式：大模型最终结果的返回格式比如：表格、、英文等等主要优点：● 简单、方便。● 指定Role角色，可以让大模型在当前的角色范围内回答知识，这在一些特定的领域中非常有效。● 指定Role角色也能让工程上检索知识能够确定边界范围，配合元数据所发挥的威力会更强。● 如果结合RAG知识内容检索，那么上下文回答的内容会让用户感觉更加是顺畅。2.2 思考链模式通过这种模式来逐步改善大模型的推理能力，非常适合一些复杂的任务处理。例如：● 分析型或者逻辑推理型的任务● 决策● 解决问题比如程序员根据错误日志找而要使用这种模式，只需要在末尾添加”让我们逐步思考”即可。例如：# 数据源（与指令区分） user_datasource = """XXX……""" prompt1 = """分析一下在人工客服服务场景下，'''{user_datasource}'''中客户有哪些诉求。用一句话概括。""" prompt2 = """分析一下在人工客服服务场景下，'''{user_datasource}'''中客户有哪些诉求。用一句话概括。让我们逐步思考。""" # 模型输出结果 output1：在人工客服服务场景下，客户主要诉求为：微信账号存在安全风险导致无法添加好友、单点拦截、下载安装微信出现问题等，寻求客服协助解决问题。 output2：在人工客服服务场景下，客户主要诉求为：微信账号存在安全风险导致无法添加好友，以及因违规行为被限制登录，客户希望客服能够尽快处理这些问题。 # 分析结果 output1中的”单点拦截”并不是用户的诉求，而output2显然更加正确Python复制2.3 RISEN框架● R-Role:大模型扮演的角色● I-Instructions: 指示命令，和Task-任务差不多● S-Steps: 步骤● E-End Goal: 最终目标● N-Narrowing: 缩小范围约束条件，和RTF框架中的Format有异曲同工之妙，一个是格式的约束，而这里的约束可以是任意方面，比如回答的内容特定领域、字数限制等等方面该框架主要适合：● 撰写具有特定约束的任务例如博客文章● 有明确指导方针的任务（例如商业计划）2.4 RODES框架● R-Role: 角色● O - Objective: 目标● D - Details: 详细的细节● E - Examples: 示例● S - Sense Check: 感官检查2.5 密度链模式密度链模式Prompt是Salesforce、麻省理工学院和哥伦比亚大学的研究人员推出的一种新提示，它非常的高效，使用递归来创建越来越好的输出的提示，与普通提示生成的 GPT-4 摘要相比，它生成的摘要更加密集且更适合人们理解。适合：● 总结● 改进您最喜欢的提示● 通过递归生成可用的长格式内容感兴趣的同学可以自己检索一下第二节：打造高效Prompt的两大核心原则在Prompt工程领域，掌握精妙的撰写策略是释放语言模型强大潜力的关键。本节将深入探讨prompt撰写的两大核心策略，为您揭示如何通过优化指令，引导模型生成更贴合需求、更具质量的输出。一、原则一：编写明确和具体的指令为了让模型精准理解我们的意图，编写清晰、明确且具体的指令至关重要。这不仅能避免模型产生误解，还能显著提升输出结果的相关性和准确性。策略1：使用分隔符清晰界定输入部分在构建prompt时，使用分隔符将特定文本部分与提示的其他部分清晰隔开，能有效避免提示词冲突。任何能让模型识别出单独部分的符号都可作为分隔符，常见的包括：● 章节标题：通过不同层级的标题区分不同内容模块。● 三重双引号：""" ，在代码编写中常用于包裹较长的文本字符串。● 三重单引号：''' ，功能与三重双引号类似，适用于不同的语法环境。● 三重破折号：--- ，在文本中起到明显的分隔作用。● 角括号：<> ，常被用于标记特定元素。● XML标签：，利用结构化的标签形式区分不同内容。示例1：假设我们需要对一段产品描述进行总结，可通过如下方式使用分隔符： product_description = f"""这是一款全新的智能手表，具备心率监测、睡眠追踪等健康功能，还支持多种运动模式记录，拥有高清显示屏和长达7天的续航能力。""" prompt = f"""请总结以下产品描述：'''{product_description}'''""" 示例2：如果要让模型对一段用户评论进行情感分析，示例如下： user_comment = f"""这款手机的拍照效果真的太棒了，色彩还原度高，夜景模式也很出色，唯一不足的是电池续航有点短。""" prompt = f"""分析以下用户评论的情感倾向：''' {user_comment}''' """Python复制这种方式能够确保模型明确区分指令和待处理文本，避免因指令混淆而产生错误输出。策略2：要求结构化输出为了便于后续对模型输出进行解析和处理，我们可以要求模型以特定的结构化格式输出，如HTML或JSON。这种方式能极大提高数据处理的效率，尤其是在Python编程环境中，结构化输出可直接读入字典或列表中，方便进一步的分析与操作。示例 1：要求模型以 JSON 格式输出。prompt = "请以json格式列出每个nodeType所体现的用户诉求、客服方案。每一个json-value不超过20个字" # 数据源（与指令区分） user_datasource = """XXX……""" # 模型输出 { "IVR": { "用户诉求": "微信使用问题求助", "客服方案": "引导正常使用或自助处理" }, "ASYNC": { "用户诉求": "账号封禁等相关申诉", "客服方案": "按规则处理或引导自助" }, "AI": { "用户诉求": "支付相关问题咨询", "客服方案": "要求用户详细描述问题" } }Python复制示例2：以HTML格式输出一个简单的书籍。prompt = "请以HTML格式列出三本你推荐的科幻小说及其作者。" # 模型输出 《三体》 - 刘慈欣 《基地》 - 艾萨克·阿西莫夫 《银河帝国：机器人五部曲》 - 艾萨克·阿西莫夫 Python复制策略3：要求模型检查条件是否满足在面对复杂任务时，如果在一些假设条件，而这些条件并非总是成立，那么我们需要引导模型首先对这些假设进行检查。若条件不满足，模型应明确指示并停止继续执行任务，以避免无效计算和错误结果。同时，考虑潜在的边缘情况，并为模型设定相应的处理规则，能够有效减少意外错误，确保模型输出的稳定性和可靠性。示例：假设我们要求模型计算一个数学表达式，但前提是表达式所有都为正数。 expression = "5 + 3 - (-2)" prompt = f"""首先检查表达式 '{expression}' 中的所有数字是否都为正数。如果是，请计算该表达式的值；如果不是，请输出'表达式中存在非正数，无法计算'。"""Python复制模型输出表达式中存在非正数，无法计算策略4：Few-shot prompting（少样本提示）在要求模型执，提供成功完成任务的示例，能够帮助模型更好地理解任务要求和期望输出的格式。通过这些示例，模型可以学习到任务的模式和规律，从而在处理实际输入时生成更符合预期的结果。少样本提示尤其适用于处理一些复杂或具有特定格式要求的任务，能够显著提升模型的表现。示例：要求模型按照特定格式将中文词汇翻译成英文并造句。prompt = """ 示例1： 中文词汇：苹果 翻译：apple 造句：I like to eat apples.Python复制示例2：中文词汇：学校 翻译：school 造句：I go to school every day. 中文词汇：图书馆 翻译： 造句： """ # 模型输出 翻译：library 造句：I often read books in the library.Python复制二、原则二：给予模型充足的思考时间当模型因急于得出结论而出现推理错误时，我们需要通过优化式，为模型提供更清晰的推理路径，引导其进行更深入、全面的思考。策略1：明确完成任务所需的步骤为模型详细指定完成任务所需遵循的步骤，能够帮助模型有条不推理和计算。通过这种方式，模型可以更清晰地理解任务的逻辑结构，避免因思路混乱而产生错误。例如，要求模型按照特定格式输出，能够引导其在处理过程中注重信息的组织和呈现方式。示例：要求模型分析一首古诗，格式为“诗歌主题 - 主要意象 - 表达情感”。poem = "床前明月光，疑是地上霜。举头望明月，低头思故乡。" prompt = f"""请按照“诗歌主题 - 主要意象 - 表达情感”的格式分析这首诗：{poem}""" # 模型输出 思乡之情 - 明月 - 对故乡的深切思念 ### 策略2：引导模型在得出结论前充分思考方案 明确指示模型在得出最终结论前，先进行充分的推理和分析，往往能获得更优的结果。这种方式能够促使模型深入挖掘问题的本质，综合考虑各种因素，从而避免因片面或仓促的判断而导致的错误。Python复制示例：问模型“如何提高公司的员工满意度”。prompt = "在回答如何提高公司的员工满意度之前，请先思考至少三个方面的因素，然后综合这些因素给出全面的建议。" # 模型输出 首先，从薪酬福利方面，可适当提高薪资水平、完善福利体系，如增加带薪休假天数等；其次，从职业发展角度，为员工提供更多培训机会和晋升通道；再者，从工作环境来看，营造舒适、和谐的办公氛围，加强团队建设活动。综合这些方面，提高公司员工满意度可以从优化薪酬福利、提供职业发展机会以及改善工作环境等措施入手。Python复制三、模型的局限性与应对策略尽管语言模型在大量数据的训练下展现出强大的能力，但它们并非完美无缺。其中，“幻觉”现象是模型面个重要挑战。模型“幻觉”即使模型在训练过程中接触了海量知识，但它并不能完美记住所有信息，也难以精准把握自身知识的边界。这就导致在面对晦涩主题的问题时，模型可能会编造出看似合理但实际上错误的内容，这就是所谓的“幻觉”。解决幻觉的一种策略为了有效应对幻觉问题，我们可以要求模型在回答问题前，首先从给定文本中寻找相关引用，并依据这些引用来构建答这种方式，模型的回答将基于可靠的信息来源，而非凭空臆测，从而大大提高回答的准确性和可信度。同时，这种方法还能够实现答案的可追溯性，便于对模型输出进行验证和审查。示例：给定一段关于历史事件的文本，要求模型回答相关问题。text = """1861年，美国爆发了南北战争，这场战争是美国历史上的重要转折点，它主要围绕奴隶制的存废问题展开，北方主张废除奴隶制，南方则坚持保留。最终北方取得了胜利，为美国的工业化发展铺平了道路。""" prompt = f"""请从上述文本中找出相关信息，回答南北战争主要围绕什么问题展开？""" # 模型输出 南北战争主要围绕奴隶制的存废问题展开，北方主张废除奴隶制，南方则坚持保留。Python复制第三节：Prompt技术剖析与应用在深入探索 prompt 技术的征程中，我们将逐一解析多种关键技术，助力您精准把握其核心要点与应用场景，切实提升应用能力。一、零样本提示（Zero-Shot Prompting）零样本提示是一种让模型在没有特定任务示例展示的情况下直接处理任务的技术。其原理在于模型经过大量数据训练和指令调整后，自身具备了一定的通用知识和任务理解能力。例如：prompt = "判断此文本的情感倾向为积极、消极或中性：这部电影情节紧凑，特效惊人。情感：" # 模型会依据自身预训练知识对这个提示进行处理并输出结果Python复制模型能依据自身预训练知识输出“积极”。然而，由于缺乏具体示例引导，对于复杂任务，其效果可能受限。二、少样本提示（Few-Shot Prompting）少样本提示在零样本提示效果不佳时发挥作用。它通过为模型提供少量任务示例，帮助模型学习任务模式和规律。例如：prompt = """“whatpu”是坦桑尼亚的一种小型毛茸茸的动物。一个使用 whatpu 这个词的句子的例子是：我们在非洲旅行时看到了这些非常可爱的whatpus。“farduddle”是指快速跳上跳下。一个使用 farduddle 这个词的句子的例子是：""" # 模型会根据前面的示例学习并生成新的句子Python复制通过提供如上述新词汇造句的示例，模型能够模仿示例的结构和逻辑生成新的内容。不过在复杂推理任务中，仍需进一步优化。三、思维链提示（Chain-of-Thought Prompting）思维链提示旨在为模型提供清晰的推理步骤引导，从而显著提升其在复杂推理任务中的表现。它通过在提示中展示详细的推理过程，让模型学习如何逐步分析和解决问题。比如：prompt = """Roger 有 5 个网球，他又买了 2 罐网球，每罐有 3 个球，他现在共有多少球？ Roger 一开始有 5 个球。 2 罐网球，每罐 3 个，共 6 个球。 5 + 6 = 11。 答案是 11。""" # 模型按照提示中的推理步骤进行计算和回答Python复制此技术可与少样本提示结合，增强效果，尤其适用于算术、常识推理等任务，帮助模型更有条理地处理问题。四、自我一致性（Self-Consistency）自我一致性技术主要用于优化思维链提示中的推理路径选择。其核心思想是通过提供多个少样本推理示例，让模型从多样的推理结果中筛选出最一致的答案，增强模型在算术和常识推理任务中的可靠性。比如：prompt = """Q：林中有 15 棵树。林业工人今天将在林中种树。完成后，将有 21 棵树。林业工人今天种了多少棵树？ A：我们从 15 棵树开始。后来我们有 21 棵树。差异必须是他们种树的数量。因此，他们必须种了 21 - 15 = 6 棵树。答案是 6。 Q：停车场有 3 辆汽车，又来了 2 辆汽车，停车场有多少辆汽车？ A：停车场已经有 3 辆汽车。又来了 2 辆。现在有 3 + 2 = 5 辆汽车。答案是 5。 Q：当我 6 岁时，我的妹妹是我的一半年龄。现在我 70 岁了，我的妹妹多大？ A：""" # 模型会参考前面的推理示例对最后一个问题进行回答，并从多个可能的回答中选择最一致的答案Python复制五、生成知识提示（Generated Knowledge Prompting）生成知识提示主要用于解决模型在处理需要额外知识的任务时出现的局限性。它的操作方式是先让模型生成与任务相关的知识，再整合这些知识得出准确答案。比如：prompt = """输入：高尔夫球的一部分是试图获得比其他人更高的得分。 知识：高尔夫球的目标是以最少的杆数打完一组洞。一轮高尔夫球比赛通常包括 18 个洞。每个洞在标准高尔夫球场上一轮只打一次。每个杆计为一分，总杆数用于确定比赛的获胜者。 解释和答案：""" # 模型根据生成的知识对问题进行回答Python复制像这样先生成相关知识，再整合知识得出准确答案“不是，高尔夫球的目标是以最少杆数完成比赛，而非追求更高得分”，有效提升模型在常识推理任务的准确性。六、链式提示（Prompt Chaining）链式提示是将复杂任务拆解为多个子任务，通过逐个子任务生成提示并传递结果的方式来实现复杂任务的有序处理。以文档问答为例：# 第一个提示用于提取相关引文 prompt1 = """你是一个很有帮助的助手。你的任务是根据文档回答问题。第一步是从文档中提取与问题相关的引文，由####分隔。请使用<quotes></quotes>输出引文列表。如果没有找到相关引文，请回应“未找到相关引文！”。#### {{文档}} ####""" # 假设这里有一个文档变量 doc，将其代入提示中进行处理 # 处理后得到引文列表，假设为 quotes_list # 第二个提示根据引文和文档生成回答 prompt2 = """根据从文档中提取的相关引文（由<quotes></quotes>分隔）和原始文档（由####分隔），请构建对问题的回答。请确保答案准确、语气友好且有帮助。#### {{文档}} #### <quotes>{quotes_list}</quotes>""" # 模型根据第二个提示生成最终回答Python复制这种方式提高了任务处理的准确性与可靠性，使得模型能够逐步深入地处理复杂问题。七、思维树（ToT）思维树框架是为了帮助模型应对复杂的探索性任务而设计的。它通过维护一棵思维树，让模型在解决问题时能够生成和评估中间思维步骤，并结合搜索算法进行系统性探索。示例如下：# 假设给定数字为 4、9、10、13 prompt = """输入: 4 9 10 13 4 + 9 = 13 (left 10 13 13) 10 - 4 = 6 (left 6 9 13) 13 - 6 = 7 13 - 9 = 4 4 + 6 = 10 (left 7 9 4 * 6 = 24 (left 4 6) 评估是否能得到 24: sure """ # 模型按照思维树的步骤进行推理和计算，并根据评估结果继续搜索或得出答案Python复制八、检索增强生成（RAG）检索增强生成（RAG）技术将信息检索与文本生成相结合，专门用于处理知识密集型任务。它通过检索相关文档来为模型提供额外的知识支持，从而缓解模型的“幻觉”问题。例如：# 假设这里有一个检索函数 retrieve_documents 和一个生成答案的函数 generate_answer question = "谁是首次登上月球的人？" documents = retrieve_documents(question) prompt = "根据以下文档回答问题：" + str(documents) + " 问题是：" + question answer = generate_answer(prompt) # 最终得到的 answer 即为模型结合检索结果生成的答案Python复制这有效确保答案基于可靠知识源，在自然问题、事实验证等基准测试中表现卓越。九、自动推理并使用工具（ART）自动推理并使用工具（ART）技术使模型能够自动生成包含推理步骤的程序，并在需要时调用外部工具。例如：prompt = """计算 16 个苹果平均分给 4 个人，每人几个，再加上 3 是多少？ 请生成解决这个问题的程序步骤。""" # 模型会生成类似下面的程序步骤 # result = (16 / 4) + 3 # 然后可以在代码中执行这个程序步骤得到最终答案Python复制在 BigBench 和 MMLU 基准测试中，ART 在多种任务上表现突出，显著超越少样本提示和自动 CoT 等方法，提升了模型解决问题的能力和效率。十、自动提示工程师（APE）自动提示工程师（APE）技术能够自动生成和筛选任务指令。它通过利用大型语言模型生成指令候选项，再依据评估分数选择最佳指令，从而提升提示生成的效率与效果。比如：# 假设这里有一个生成指令候选项的函数 generate_candidates 和一个选择最佳指令的函数 select_best_instruction article = "这里是一篇新闻文章的内容" candidates = generate_candidates(article) prompt = select_best_instruction(candidates) + " " + article # 模型根据最终的 prompt 生成文章总结Python复制例如总结新闻文章时，它先利用大型语言模型生成如“提取文章关键人物、事件和时间”“概括文章主要内容并突出重点”等指令候选项，再依据评估分数选择最佳指令，指导模型生成高质量总结。十一、Active-PromptActive-Prompt 技术主要用于解决思维链示例有效性的问题。它通过先查询模型生成多个答案，计算不确定度后挑选最不确定的问题由人类注释示例，再用新示例推断其他问题，从而优化模型对不同任务的适应性。比如：# 假设这里有一个查询模型生成答案的函数 query_model 和一个计算不确定度的函数 calculate_uncertainty prompt = "对以下文本进行分类：这是一篇科技类文章。" answers = query_model(prompt, num_answers=5) # 生成 5 个答案 uncertainty = calculate_uncertainty(answers) if uncertainty > threshold: # 如果不确定度大于设定阈值 # 选择最不确定的问题由人类注释示例，然后更新提示并重新查询模型 new_prompt = update_prompt_with_annotated_example(prompt) final_answer = query_model(new_prompt) else: final_answer = select_most_consistent_answer(answers) # 最终得到的 final_answer 即为经过 Active-Prompt 处理后的答案Python复制通过这种方式，能够提高模型在文本分类等任务中的准确性。十二、方向性刺激提示（Directional Stimulus Prompting）方向性刺激提示通过训练策略 LM 生成引导提示，增强对模型生成结果的掌控力。例如文本摘要任务：article = "这里是一篇文章的内容" prompt = "请根据文章内容生成一个引导提示，重点关注文章的主要事件和结果。" # 策略 LM 会根据这个提示生成如“重点提取文章中事件的主体、发生的时间和最终结果”的引导提示 # 然后可以将这个引导提示用于后续的文本摘要任务中Python复制在文本摘要任务中，策略 LM 依据文章主题、关键信息等生成引导提示，指导模型生成符合需求的摘要，提升摘要质量。十三、PAL（程序辅助语言模型）PAL（程序辅助语言模型）技术让模型生成程序来解决问题，借助编程运行时提升解决复杂问题的能力。以日期计算问题为例：question = "今天是 2023 年 2 月 27 日，我出生于 25 年前，我的出生日期是多少？" prompt = """ import datetime from dateutil.relativedelta import relativedelta # Q: 2015 年在 36 小时后到来。从今天起一周后的日期是多少（格式为 MM/DD/YYYY）？ # 如果 2015 年在 36 小时后到来，那么今天是 36 小时前。 today = datetime(2015, 1, 1) - relativedelta(hours=36) # 从今天起一周后， one_week_from_today = today + relativedelta(weeks=1) # 格式化后的答案 one_week_from_today.strftime('%m/%d/%Y') # Q: 今天是 2023 年 2 月 27 日，我出生于 25 年前，我的出生日期是多少？ """ # 模型会生成类似下面的代码 # today = datetime(2023, 2 27) # born = today - relativedelta(years=25) # born.strftime('%m/%d/%Y') # 然后可以在代码中执行模型生成的代码得到最终答案Python复制十四、ReAct 框架ReAct 框架使模型交错生成推理轨迹和操作，提升答案的可靠性与可解释性。以回答问题为例：question = "除苹果遥控器外，哪些设备可控制其设计交互的程序？" prompt = """问题：除苹果遥控器外，哪些设备可控制其设计交互的程序？ 思考 1：我需要搜索苹果遥控器相关程序及可替代控制设备。 操作 1：搜索 [苹果遥控器 可替代控制设备] 观察 1：搜索结果为…… 思考 2：根据搜索结果，分析哪些设备符合要求。 操作 2：筛选 [符合要求的设备] 观察 2：筛选结果为…… 思考 3：整理最终答案。 操作 3：整理 [最终答案] """ # 模型会按照提示中的推理轨迹和操作步骤进行处理，并最终得出答案Python复制在知识密集型和决策任务中表现良好，通过与外部环境交互获取信息来辅助推理。十五、自我反思（Reflexion）自我反思框架包含参与者、评估者和自我反思三个模型，旨在帮助模型从错误中学习并提升性能。模拟编程任务的示例如下：# 假设这里有参与者模型 actor、评估者模型 evaluator 和自我反思模型 reflexion code = "这里是一段初始代码" # 参与者模型生成尝试解决问题的代码和动作 result = actor(code) # 评估者模型评价输出 score = evaluator(result) # 自我反思模型根据评价结果生成改进建议 reflection = reflexion(score, result) # 将改进建议应用到下一次的代码生成中，实现自我学习和提升Python复制如代码出现语法错误，自我反思模型会提示可能错误原因及修正方向，帮助模型快速学习。附录一、术语表Prompt：在大语言模型应用中，用于“提示”模型唤起特定能力以解决实际问题的提问方式，是prompt工程的核心。RTF框架：Role - Task - Format框架，通过指定角色、任务和格式规范大模型输出，简单通用。思考链模式：在提示末尾添加“让我们逐步思考”，引导大模型逐步分析复杂任务，改善推理能力。RISEN框架：包含角色、指示命令、步骤、最终目标和缩小范围（约束条件），适合特定约束或明确指导方针的任务。RODES框架：涵盖角色、目标、详细细节、示例和感官检查的提示框架。密度链模式：利用递归创建更好输出的提示，生成的摘要更密集且适合理解，适用于总结等任务。少样本提示（Few - shot prompting）：为模型提供少量任务示例，帮助其学习任务模式和规律，提升在复杂或特定格式任务中的表现。零样本提示（Zero - Shot Prompting）：模型在无特定任务示例展示下，依靠自身预训练知识和任务理解能力直接处理任务。思维链提示（Chain - of - Thought Prompting）：为模型展示详细推理过程，提升其在复杂推理任务中的表现，可与少样本提示结合。自我一致性（Self - Consistency）：通过提供多个少样本推理示例，让模型筛选最一致答案，增强在算术和常识推理任务中的可靠性。生成知识提示（Generated Knowledge Prompting）：先让模型生成与任务相关知识，再整合知识得出准确答案，解决模型处理需额外知识任务的局限性。链式提示（Prompt Chaining）：将复杂任务拆分为多个子任务，逐个子任务生成提示并传递结果，提高任务处理准确性与可靠性。思维树（ToT）：通过维护思维树，让模型生成和评估中间思维步骤，结合搜索算法应对复杂探索性任务。检索增强生成（RAG）：将信息检索与文本生成结合，检索相关文档为模型提供知识支持，缓解“幻觉”问题。自动推理并使用工具（ART）：使模型自动生成包含推理步骤的程序，并在需要时调用外部工具，提升解决问题能力和效率。自动提示工程师（APE）：利用大型语言模型生成指令候选项，依据评估分数选择最佳指令，提升提示生成效率与效果。Active - Prompt：先查询模型生成多个答案，计算不确定度后挑选最不确定问题由人类注释示例，优化模型对不同任务的适应性。方向性刺激提示（Directional Stimulus Prompting）：训练策略LM生成引导提示，增强对模型生成结果的掌控力，提升文本摘要等任务的质量。PAL（程序辅助语言模型）：让模型生成程序来解决问题，借助编程运行时提升解决复杂问题的能力。ReAct框架：使模型交错生成推理轨迹和操作，提升答案的可靠性与可解释性，在知识密集型和决策任务中表现良好。自我反思（Reflexion）：包含参与者、评估者和自我反思三个模型，帮助模型从错误中学习并提升性能。二、常见问题解答1.如何选择合适的Prompt框架？根据任务类型和需求选择。如简单对话场景可选用RTF框架；复杂分析任务可考虑思考链模式或RISEN框架；对输出格式有严格要求的，可在RTF、RISEN框架中关注格式或约束条件设定；进行总结类任务，密度链模式可能更合适。2.为什么模型会出现“幻觉”现象？模型虽经大量数据训练，但无法完美记住所有知识，也难以精准把握知识边界，面对复杂或生疏主题问题时，就可能编造看似合理但错误的内容。3.如何利用少样本提示提升模型性能？提供与任务相关、格式规范的成功示例，示例要涵盖任务的关键要素和模式，让模型学习示例中的规律和逻辑，从而在处理实际输入时生成更符合预期的结果。尤其适用于复杂任务或对输出格式有特定要求的情况。4.链式提示在实际应用中有哪些优势？将复杂任务拆解为子任务，使模型处理过程更清晰、有序，逐步深入解决问题，提高了任务处理的准确性与可靠性，避免模型在处理复杂问题时因任务过于复杂而出现混乱或错误。原文地址：大模型Prompt技巧全解析 - Anoyer - 三流痞子
本文转载自互联网，已在文末注明来源。文档描述本文记录了一些技术教程及前沿科技相关信息建议在 PC 端打开博客文章，可显示目录（TOC）01. 大语言模型卷国产主流 LLM：DeepSeek、Kimi、腾讯元宝、豆包、通义千问、天工AI、智谱清言、文心一言国外主流 LLM：Microsoft Copilot、ChatGPT、Claude、Gemini、Grok、Llama [CN]免魔法使用 ChatGPT：RawChat、SharedChat、ChatK [G] [O]支持多个 AI 模型的平台：Poe、Vercel、Coze、在问耕读：收集免费使用 ChatGPT-4o、Gemini Pro 等 AI 服务的列表更多替代方案见：[1] [2] [3] [4]DeepSeek 免费 API：火山方舟、阿里云百炼、魔塔社区、SiliconFlow、Serverless APICursor：集成了 LLM 的类 vscode 的 AI 辅助编程助手 [免费续杯]，同类的 Trae 简洁易懂好上手AI 写作助手：帮助用户组织写作风格提示词，并通过 LLM 生成高质量内容02. 图像处理AI集Gemini 2.0 Flash：上传图片，输入指令，让 AI 帮你 PS2.1 开箱即用可以直接上手的在线 or 离线生成式 AI 工具Recraft：通过文本描述生成位图（Raster）与矢量图（Vector），可上传图像自定义风格；同时支持生成式填充、去除/改变背景、区域消除、图形拼接等IOPaint：擦除、修改/替换、添加新对象、图形补全（外画）等，可离线使用Clipdrop：Stable Diffusion 旗下工具，支持文字生成图像、生成式填充、图像补全、背景移除、对象消除、草图转真实图等Microsoft Designer：支持以文生图、去除背景、消除对象、改变图像风格等Adobe Firefly：文字生成图像、生成式填充、生成矢量图、重新着色等 [去水印]Image-fx：Google 的以文生图模型2.2 以文生图获取 AI 模型整合包：@秋葉aaaki、@万能君的软件库结合手绘内容以文生图：Dynamic、ImgPilot、Drawfast （基于LCM模型）Flux.1：Stable Diffusion 原始团队推出的文生图模型套件（效果远超 SD 3 及 MJ v6）[1] [2]Fooocus：AI 画图工具，结合了 Stable Diffusion 和 Midjourney 的优点，开箱即用Invoke AI：用于 Stable Diffusion 等模型的AI绘画可视化工具 [52]2.3 P图的 AIAI 抠图模型：U2-Net、飞桨、ReplaceAnything、Background Remover、PBRem Tool、Transparent BackgroundIOPaint：全能图像工具箱，支持图像消除、对象替换、文字绘制和图像扩展等 [52]AnyText：在图像中修改或生成高度融合的文本DeepMosaics：自动去除图像和视频中的马赛克，同时支持添加马赛克Edit Anything：编辑和生成图像中的任何内容LiYing：证件照后期自动处理程序，可以完成人体、人脸自动识别，角度自动纠正，自动更换任意背景色，任意尺寸证件照自动裁切，并自动排版HivisionIDPhotos：轻量级证件照AI，支持抠图、生成不同尺寸的标准证件照、六寸排版照、美颜、智能换正装Text Behind Image：在图像主体背后添加文本2.4 大厂专区腾讯ARC（Applied Research Center）GFPGAN：老照片人脸修复、着色PhotoMaker：基于上传的人像生成各种风格的逼真照片T2I-Adapter：基于手绘内容与文本描述生成图片03. 音视频模型区3.1 直接上手国内团队自研打造的文生视频、文生图大模型：即梦、可灵、通义万象、腾讯混元文生视频Pi：用英文母语者的口音与你聊天的 AI （练习英语听力）MagicMirror：一键 AI 换脸、发型、穿搭3.2 视频换脸视频AI换脸：DeepFaceLab[中文论坛]、DeepFaceLive、RopeDeep-Live-Cam：只需要一张图片就可以将视频中的人脸实时（直播可用）替换成目标人脸AniTalker：通过音频和静态人像生成逼真的说话视频 [MyVoiceYourFace]SadTalker-Video-Lip-Sync：为视频人像生成流畅、真实、自然的唇形3.3 音声合成DiffSinger：堪比真人的歌声合成模型 [AI本兮]AI音色克隆：GPT-SoVITS [介绍]、RVC-WebUI、AI歌曲生成：Suno[Bark]、Uido、Stable Audio、Sonauto 、网易天音、海绵音乐Reecho睿声®：在数秒内克隆任意声音、创建与真人无异的文本配音、或是仅通过文本描述来生成任意音效AnyVoice：超真实的文本转语音(TTS)，配备即时声音克隆技术，免费无限下载3.4 剪辑后期Subtitle Hub：影视字幕工具一站式导航平台Video subtitle extractor：将视频中硬字幕提取为外挂字幕文件 .srt 的工具视频翻译和配音工具：AI 视频翻译、配音、字幕生成等一站式处理Video subtitle master：批量为视频生成字幕，并可将字幕翻译成其它语言YouDub：融合了语音识别、大型语言模型翻译，以及 AI 声音克隆技术，提供与原视频相似的中文配音，旨在将 YouTube 和其他平台上的高质量视频翻译和配音成中文版本VideoLingo：一站式视频翻译本地化配音工具，旨在生成 Netflix 级别的高质量字幕，还能加上高质量的配音KrillinAI：基于 AI 大模型的视频翻译和配音工具,支持配音克隆ProPainter：移除视频中的对象、移除视频水印并填充被遮盖部分Video subtitle remover：无损分辨率将视频中的硬字幕去除，生成去除字幕后的文件04. 优秀开源游戏4.1 棋类引擎Leela：安装即玩的围棋软件，新手友好型围棋 AISabaki：可以搭载 Leela Zero 等多种支持 GTP 协议的围棋 AI 引擎的围棋 GUI 软件BadukMegapack：傻瓜式安装多种开源围棋 AI 软件Banksia GUI：国际象棋 GUI 软件,内置强大的支持 UCI 协议的国际象棋 AI 引擎 StockfishPikafish：棋力最强的象棋引擎，基于最新的 NNUE 神经网络，永久免费开源Andriod 阿Q围棋 Lite、象棋巫师、棋路-中国象棋4.2 其他游戏Unciv：“文明5”的低配版像素游戏 <100MBHabitica：完成你的待办事项后，会升级解锁更多游戏玩法CorsixTH：Theme Hospital 游戏的开源复刻版05. 实用开源工具原则上，现在的手机选择 arm64-v8a 版本架构；虚拟机选择 x86_64 或 x86 架构；一些比较旧的手机，选择armeabi-v7a [1] [2]5.1 功能软件自动跳过APP开屏广告：李跳跳、Android-Touch-Helper、GKD [订阅规则]、SKIP、TapClick12306 抢票专用：py12306 购票助手、分流抢票广告滚蛋：删除 Win11 各处广告的小工具，OFGB 的汉化版WeChatExtension-ForMac：Mac 微信功能拓展/微信插件/微信小助手Wx-Dump-4J：支持导出微信各类记录(聊天记录，联系人，群聊等)，并提供全面的数据整合与分析解决方案 [MemoTrace] [wechatDataBackup]EasySpide：无代码可视化设计和执行爬虫任务的软件Pintree：将浏览器书签转换成一个美观且易用的导航页面RTranslator：开源、免费且离线的 Android 实时翻译应用程序GoGoGo：基于 Android 调试 API + 百度地图实现的虚拟定位工具HackBrowserData：解密和导出浏览器数据（密码、历史记录、Cookies、书签、信用卡、下载历史、localStorage 和扩展）FadCam：支持在锁屏、后台或使用其他应用时持续录制视频OP Auto Clicker：鼠标自动点击工具，同时支持 PC 与 AndroidMyKeymap：一款基于 AutoHotkey 的键盘映射工具 [1]5.2 娱乐软件Android本地音乐播放器：椒盐音乐、Retro Music Player、MetroAndroid本地视频播放器：VLC、Kodi、NOVA、MPVLegado/阅读：安卓端最好的网络小说阅读器，支持自定义书源[1] [2] [3] [4]内置多个动漫源的追番 APP：Anime、纯纯看番播放全网免费音乐：LX Music [1] [2]-TG [3]、NOS 五音助手 [1]、MusicFree [1] [2]京墨：中华文化宝典 APP，诗（词）文（名句）、汉字、成语、词语、歇后语、绕口令、传统节日、传统色、节气、人物等06. 第三方客户端解锁本地会员权限，如去广告、离线下载等YouTube Music：ViMusic、InnerTune、Musify、SimpMusic、SpMpYouTube：RV YT、LibreTube、NewPipe、YouTube ReVancedBiliBili：PiliPlus、PiliPala、哔哩喵、TV BV、TV BBLLSpotify：Spotube、BlockTheSpot、SpotX patcher、xManagerPixiv：PixEz Flutter、Shaft、PixevalTikTok 免拔卡安卓版本、Hydrogen-知乎极简版、贴吧 Lite [TG]网易云音乐：YesPlayMusic、SPlayer、bujuan、Music You拷贝漫画：Copymanga、CopyMangaJava、kobi、PasteMangaX07. 语音文字转换Alibaba FunAudioLLM：CosyVoice-语音生成 [整合包]、SenseVoice-语音识别7.1 文字转语音开箱即用：TTSMaker、Text to Speech、AudioTextHub、TTS Online、淘金阁、Balabolka、智影TTS-Vue：调用微软官方语音合成接口进行文字转语音 [1]Fish Speech：基于原神/崩坏星穹铁道/BlueArchive角色的，支持中/日/英三语合成ChatTTS：专为 LLM 助手等对话场景设计的文本转语音模型 [webUI]EmotiVoice：支持中英文双语，包含2000多种不同的音色，以及特色的情感合成功能EasyVoice：完全免费，一键生成语音和字幕、小说一键转为有声书电子书转有声读物ebook2audiobook：使用 Calibre、ffmpeg、XTTSv2、Fairseq 等将电子书转有声读物，支持声音克隆和 1124 种语言Android MultiTTS：离线朗读配音软件 [语音包合集] [入门教程] [国内网盘]7.2 语音转文字开箱即用：Whisper、飞书妙记、剪映、通议听悟、音视频取文本工具（带时间轴）FunASR：阿里达摩院的语音识别工具包，结合了语音端点检测、语音识别、标点预测、时间戳预测、说话人区分等模型 [CapsWriter]zh_recogn：将音频或视频中的中文语音识别并导出为 srt 字幕，基于魔塔社区 Paraformer 模型AsrTools：智能语音转字幕文本工具，内置大厂 ASR 服务，无需 GPU 和繁琐的本地配置，小白也能轻松使用08. GitHub收集盒Github热门榜、标星榜、用户榜、中文榜、英文榜8.1 人工智能国内外大模型综合性多维度中文能力评测榜单：CLiB、SuperCLUE开源大模型食用指南：围绕开源大模型、针对国内初学者、基于 Linux 平台的中国宝宝专属大模型教程Open Source Team：国内顶尖团队的开源项目地址列表收集与人工智能相关的实用程序：Awesome AI Tools [2]、AI Product HomeAiMonneyHunter：这是一个 AI 副业赚钱资讯信息的大合集Awesome LLM resourses：全世界最好的LLM资料总结（数据处理、模型训练、模型部署、o1 模型、小语言模型、视觉语言模型）Awesome LLMs In China：全面收集有明确来源的中国大模型情况，包括机构、来源信息和分类等Awesome Chinese LLM：收集和梳理中文 LLM 相关的开源模型、应用、数据集及教程等资料Awesome Virtual Try-on：与虚拟试穿相关的研究论文、项目、代码、数据集、研讨会等的精选列表Awesome Generative AI Guide：生成式 AI 研究论文、访谈材料、教程、笔记等更新的综合中心Awesome 0pen GPT：GPT 相关开源项目合集精选8.2 应用软件TVapk：收集各大 AndroidTV 的 apk 应用，可免费看 VIP 和国外电影电视绝版游戏保护工程：收录 DOS 游戏，红白机，SFC/MD 等主机游戏机Awesome Mac：收集各种好用的 Mac 软件，包括但不限于开源、免费软件Awesome macOS OS Apps：适用于 macOS 的出色开源应用程序列表Best App：免费及付费的 iOS/macOS App 作品推荐列表Awesome Bilibili Extra：收集一些让我们在使用 B 站时更加方便的浏览器扩展/脚本/程序Awesome Privacy：专注于隐私和安全的软件和服务商的精选列表Awesome Free Apps：免费的 PC 和 移动端应用收集Wotaku：为二次元用户打造的开源索引平台，汇集了软件、网站、工具等资源8.3 其他收集Awesome OSINT：开源情报（OSINT）收集工具和信息来源的精选列表中国独立开发者项目列表：聚合所有中国独立开发者的项目国内开源镜像站点汇总：分企业站、教育站等收录中文独立博客的项目，提供 RSS 订阅地址：中文博客琅琊榜、中文独立博客列表ChineseBQB：中文表情包博物馆，相关在线搜图斗图工具404StarLink：推荐优质、有意义、有趣、坚持维护的安全领域开源项目Public API Lists：用于软件和 Web 开发的免费 API 的集合列表Awesome Terminals：收集各类终端模拟器，还整理了各类 shellProxy-client-collection：各平台代理软件收集处09. 技术极客论坛BL List：各大手机厂商的 Bootloader 解锁、内核开源、保修政策对比系统封装重装系统：远景论坛、无忧启动、小鱼儿yr系统技术开发交流社区：鱼C工作室、菜鸟技术教程、看雪论坛、V2EX、LINUX DO、批处理之家网络安全杀软讨论：精睿论坛、卡饭论坛最新动态想要及时查看 DMUCD 的更新内容请移步 小红书原文地址：科技最前沿 - DMUCD