<?xml version="1.0" encoding="UTF-8"?><rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>夙缘の小破站</title>
    <link>http://zhuxu.cc/</link>
    <description><![CDATA[分享技术与博客]]></description>
    <language>zh-CN</language>
    <managingEditor>sy94898@163.com (夙缘)</managingEditor>
    <pubDate>Sat, 23 May 2026 09:53:27 +0000</pubDate>
    <lastBuildDate>Sat, 23 May 2026 09:53:27 +0000</lastBuildDate>
    <generator>grtblog v2.0.4</generator>
    <image>
      <url>http://zhuxu.cc/uploads/pictures/logo.jpeg</url>
      <title>夙缘の小破站</title>
      <link>http://zhuxu.cc/</link>
    </image>
    <atom:link href="http://zhuxu.cc/feed" rel="self" type="application/rss+xml"/><item>
      <title>Win11 下 Hermes Agent 安装、工具与 Skill 完全教程</title>
      <link>http://zhuxu.cc/posts/ai-blog-8</link>
      <description><![CDATA[<blockquote><p>该内容由 RSS 渲染生成，最佳阅读体验请前往：<a href="http://zhuxu.cc/posts/ai-blog-8">http://zhuxu.cc/posts/ai-blog-8</a></p></blockquote><h2>前言：为什么你需要关注 Hermes Agent？</h2>
<p>最近，开源社区一款名为 <strong>Hermes Agent</strong>（爱马仕 Agent）的 AI 智能体框架正在悄悄“炸场”——GitHub 星标数不断攀升，社区讨论热度居高不下。它不同于市面上某些“龙虾”类的 agent 框架，Hermes Agent 的核心理念是 <strong>自学习</strong> 与 <strong>轻量化部署</strong>，支持一行命令安装、六种执行后端、飞书/微信等 IM 集成，并且能够通过安装 Skill 实现能力自我进化。很多人第一反应是：“它能帮我自动写周报吗？”“能帮我管理文件吗？”——答案是能，而且比你想象的要强大。</p>
<p>对我而言，Hermes Agent 最吸引人的地方在于：<strong>它不只是一个聊天接口，而是一个真正可以执行本地任务、拥有记忆和工具调用能力的数字助手</strong>。在 Windows 11 上，借助 WSL2 的 Linux 内核，我们能完整发挥这套框架的强大功能。本教程将从零开始，带你一起在 Win11 环境中完成 Hermes Agent 的安装、常用工具链配置、模型对接，并深入讲解 Skill 的安装与自定义方法。文末还会附上飞书接入的避坑指南，以及我亲身踩坑后总结的 9 个核心技巧。</p>
<p>这篇文章将手拉手带你走完以下内容：</p>
<ul>
<li>Win11 + WSL2 环境准备</li>
<li>Hermes Agent 一键安装与源码部署</li>
<li>LLM 模型配置（本地模型 &amp; 云端 API）</li>
<li>主题压缩、辅助模型等高级配置</li>
<li>常用工具（ripgrep、fd、jq 等）的安装与集成</li>
<li>Skill 安装与编写入门</li>
<li>飞书机器人接入全流程</li>
<li>20+ 条实用避坑经验</li>
</ul>
<p>不论你是想给自己的 Windows 加一个聪明的本地助手，还是准备把 Hermes Agent 接入团队协作，这篇教程都力求让你“小白进，大神出”。</p>
<hr>
<h2>一、Win11 环境配置：为 Hermes 准备的“地基”</h2>
<p>Hermes Agent 是运行在 Linux 环境下的 Python 项目，因此在 Windows 上部署最优雅的方式就是 <strong>WSL2</strong>（Windows Subsystem for Linux 第二代）。如果你之前安装过 WSL，请确保版本为 2；如果从未接触，下面的步骤会让你轻松搞定。</p>
<h3>1.1 启用 WSL2 并安装 Ubuntu</h3>
<p>以管理员身份打开 PowerShell，执行以下命令：</p>
<pre><code class="language-powershell">wsl --install
</code></pre>
<p>这个命令会自动启用必需的组件，并安装默认的 Ubuntu 发行版。重启系统后，WSL2 将作为默认版本。如果已经安装过 WSL1，可以通过 <code>wsl --set-version &lt;distro&gt; 2</code> 升级。</p>
<p>安装完成后，在开始菜单找到 Ubuntu，首次启动会要求设置用户名和密码。请牢记这个密码，之后运行 <code>sudo</code> 命令时需要。</p>
<h3>1.2 更新系统与必要依赖</h3>
<p>进入 WSL2 终端后，先更新软件包列表并升级已安装的软件：</p>
<pre><code class="language-bash">sudo apt update &amp;&amp; sudo apt upgrade -y
</code></pre>
<p>接着安装一些基础依赖，Hermes Agent 后续安装脚本可能会用到：</p>
<pre><code class="language-bash">sudo apt install -y curl git build-essential python3 python3-venv python3-pip
</code></pre>
<p>其中：</p>
<ul>
<li><code>curl</code> 用于下载安装脚本；</li>
<li><code>git</code> 用于克隆代码仓库；</li>
<li><code>build-essential</code> 提供编译工具（某些 Python 包需要编译）；</li>
<li>Python 3 环境是框架的基石。</li>
</ul>
<h3>1.3 （可选）配置 Windows Terminal 与系统代理</h3>
<p>为了获得更好的体验，推荐在 Microsoft Store 安装 Windows Terminal，将 WSL 设为默认终端。如果你的网络环境访问 GitHub 缓慢，可以在 WSL 中配置代理。编辑 <code>~/.bashrc</code>，添加：</p>
<pre><code class="language-bash">export host_ip=$(cat /etc/resolv.conf |grep &quot;nameserver&quot; |cut -f 2 -d &quot; &quot;)
export http_proxy=&quot;http://$host_ip:7890&quot;
export https_proxy=&quot;http://$host_ip:7890&quot;
</code></pre>
<p>保存执行 <code>source ~/.bashrc</code>，其中 <code>7890</code> 请替换为你 Windows 主机上代理客户端的端口。注意，此操作要求 Windows 防火墙允许 WSL 访问主机端口。</p>
<p>环境地基已经打牢，接下来进入 Hermes Agent 的真正安装过程。</p>
<hr>
<h2>二、安装 Hermes Agent：两种主流方式</h2>
<p>社区提供了两种安装路径：<strong>一键 curl 自动安装</strong> 和 <strong>手动克隆源码安装</strong>。一键脚本非常方便，适合想快速体验的朋友；手动安装则更灵活，便于二次开发和理解内部结构。</p>
<h3>2.1 方式一：官方 curl 一行安装（推荐新手）</h3>
<p>Hermes Agent 官方仓库中维护了一个安装脚本，可以直接通过 curl 执行，自动完成克隆仓库、创建虚拟环境、安装依赖等操作。</p>
<p>在 WSL 终端中执行：</p>
<pre><code class="language-bash">curl -fsSL https://raw.githubusercontent.com/HermesAgent/hermes-agent/main/install.sh | bash
</code></pre>
<p>脚本开始后，会逐步输出安装进度，包括：</p>
<ul>
<li>克隆 Hermes Agent 主仓库到 <code>~/hermes-agent</code>；</li>
<li>在仓库内创建 Python 虚拟环境；</li>
<li>安装所有必需的 Python 依赖；</li>
<li>下载默认的辅助模型文件（如用于主题压缩的小模型）；</li>
<li>生成初始配置文件。</li>
</ul>
<p>首次运行耗时取决于网络与机器性能，通常在 3~8 分钟左右。安装成功后，终端会提示你进入目录并激活环境：</p>
<pre><code class="language-bash">cd ~/hermes-agent &amp;&amp; source .venv/bin/activate
</code></pre>
<h3>2.2 方式二：手动克隆安装（推荐进阶用户）</h3>
<p>如果你想对安装过程有更多控制权，或者网络环境导致脚本运行失败，可以手动操作。</p>
<p>首先克隆仓库并进入：</p>
<pre><code class="language-bash">git clone https://github.com/HermesAgent/hermes-agent.git ~/hermes-agent
cd ~/hermes-agent
</code></pre>
<p>创建并激活虚拟环境：</p>
<pre><code class="language-bash">python3 -m venv .venv
source .venv/bin/activate
</code></pre>
<p>安装依赖：</p>
<pre><code class="language-bash">pip install -r requirements.txt
</code></pre>
<p>如果遇到某个包安装失败，多半是缺少编译工具或系统库。例如安装 <code>sentencepiece</code> 可能缺少 cmake，可以通过 <code>sudo apt install cmake</code> 解决。建议保持 pip 版本最新：<code>pip install --upgrade pip</code>。</p>
<p>安装完成后，同样需要配置模型和运行环境。</p>
<h3>2.3 安装脚本背后的秘密：工具依赖补充</h3>
<p>主安装脚本默认会安装一些高效的命令行工具来增强 Agent 的能力，如：</p>
<ul>
<li><strong>ripgrep</strong> (<code>rg</code>)：快速全文搜索工具；</li>
<li><strong>fd-find</strong> (<code>fdfind</code>)：现代化的 <code>find</code> 替代品；</li>
<li><strong>jq</strong>：命令行 JSON 处理器；</li>
<li><strong>pandoc</strong>：文档格式转换工具（用于处理各种文件）。</li>
</ul>
<p>如果一键脚本遗漏了某些工具（例如在 Ubuntu 22.04 上 <code>fd-find</code> 的命令名可能是 <code>fd-find</code> 而不是 <code>fd</code>），你可以手动补充：</p>
<pre><code class="language-bash">sudo apt install ripgrep fd-find jq pandoc
ln -s $(which fdfind) ~/.local/bin/fd   # 创建一个 fd 命令链接
</code></pre>
<p>这些工具赋予了 Agent 搜索文件系统、处理结构化数据的能力，后续章节会展开讲解它们的用法。</p>
<h3>2.4 首次运行：Hello Hermes</h3>
<p>在 <code>hermes-agent</code> 目录下且虚拟环境激活时，输入：</p>
<pre><code class="language-bash">python -m hermes
</code></pre>
<p>如果不报错且出现交互提示，说明核心框架已经跑通。不过此时还没有对接 LLM 模型，它无法给出聪明回复，我们需要继续配置“大脑”。</p>
<hr>
<h2>三、对接 LLM 模型：赋予 Agent 灵魂</h2>
<p>Hermes Agent 支持多种模型后端，包括 Ollama、OpenAI API、LM Studio、Groq 等。每种后端都有其适用场景，下面分别介绍配置方法，你可以根据自己的硬件和需求选择一种或多种。</p>
<h3>3.1 使用 Ollama 部署本地开源模型</h3>
<p>Ollama 是目前最流行的本地模型运行工具，简化了部署和推理过程。首先要确保 WSL2 中已安装 Ollama。如果尚未安装，执行：</p>
<pre><code class="language-bash">curl -fsSL https://ollama.com/install.sh | sh
</code></pre>
<p>安装完成后，启动 Ollama 服务（或者让它后台运行）：</p>
<pre><code class="language-bash">ollama serve
</code></pre>
<p>然后拉取一个你喜欢的模型，例如 <code>llama3.1:8b</code> 或 <code>qwen2:7b</code>。对于硬件资源有限的朋友，建议使用 <code>phi3:mini</code> 或 <code>gemma2:2b</code> 这类轻量级模型。</p>
<pre><code class="language-bash">ollama pull llama3.1:8b
</code></pre>
<p>等待模型下载完毕，运行 <code>ollama list</code> 确认模型就位。</p>
<p>在 Hermes Agent 中配置 Ollama 非常简单。首次执行 <code>python -m hermes</code> 时，会在 <code>~/.hermes/config.yaml</code> 生成默认配置文件。编辑该文件，找到 LLM 配置段，修改为：</p>
<pre><code class="language-yaml">llm:
  backend: ollama
  model: llama3.1:8b
  ollama_base_url: http://localhost:11434
  temperature: 0.7
</code></pre>
<p>保存后重新运行 Agent，它就会使用本地的 Ollama 服务进行推理。如果 Ollama 没有正确运行，Agent 会报连接错误，此时请检查 <code>ollama serve</code> 是否在运行。</p>
<p><strong>避坑提示</strong>：</p>
<ul>
<li>WSL2 的内存占用问题：Ollama 加载大模型（如 8B）可能会消耗大量内存，建议在 <code>.wslconfig</code> 中设置内存上限，防止系统卡死。</li>
<li>模型首次加载时会比较慢，耐心等待即可。</li>
</ul>
<h3>3.2 接入 OpenAI 或兼容接口</h3>
<p>如果你有 OpenAI 的 API Key，或使用第三方代理（如 ChatAnywhere、API2D 等），可以配置为：</p>
<pre><code class="language-yaml">llm:
  backend: openai
  model: gpt-4o-mini
  api_key: sk-your-api-key
  api_base: https://api.openai.com/v1   # 或自定义代理地址
  temperature: 0.7
</code></pre>
<p>对于没有国际信用卡的用户，可以使用国内的一些中转服务，将 <code>api_base</code>替换为相应的地址即可。</p>
<p><strong>注意</strong>：配置文件中的 <code>api_key</code> 是明文的，请确保该文件的读取权限仅限于自己。你可以用 <code>chmod 600 ~/.hermes/config.yaml</code> 来保护它。</p>
<h3>3.3 辅助模型与主题压缩配置</h3>
<p>Hermes Agent 的一大特色是 <strong>对话主题压缩</strong>。在长对话中，Agent 会定期将历史内容压缩为摘要，以节省上下文窗口。此功能需要一个小型摘要模型。官方默认使用 Ollama 上的 <code>tinyllama</code> 或 <code>phi3:mini</code>。如果你的主模型已经足够小，也可以指定它兼任摘要模型，但推荐使用专门的小模型以降低延迟。</p>
<p>配置文件中添加：</p>
<pre><code class="language-yaml">summary_llm:
  backend: ollama
  model: phi3:mini            # 或者其他 1~2B 的模型
  temperature: 0.2
</code></pre>
<p>如果本地没有资源运行第二个模型，可以将摘要模型设置为和主模型一样，或者使用更低成本的云端 API（如 gpt-3.5-turbo）。</p>
<p>此外，你可以调整压缩触发的长度阈值：</p>
<pre><code class="language-yaml">compact_after_tokens: 4000
keep_memory_tokens: 2000
</code></pre>
<p>这里数值根据你使用的模型上下文长度灵活设置。8B 模型一般可设为 6000~8000。</p>
<hr>
<h2>四、常用工具集成与实践技巧</h2>
<p>Hermes Agent 的一个强大之处在于它能够调用系统工具来完成复杂任务。这些工具不仅仅是内部代码，很多是你系统中已经安装的命令行利器。Agent 通过自主判断，选择合适的工具来解决问题。因此，工具链的完善程度，直接影响 Agent 的“生产力”。</p>
<h3>4.1 ripgrep：秒速搜索文件内容</h3>
<p>ripgrep (<code>rg</code>) 是 Agent 发现信息的重要触手。假设你要求 Agent：“找出所有包含 TODO 的 Python 文件”，它会自动构造类似 <code>rg &quot;TODO&quot; --glob &quot;*.py&quot;</code> 的命令并执行。确保 Agent 环境中 <code>rg</code> 可用。安装前面已有介绍。测试命令：</p>
<pre><code class="language-bash">rg &quot;hermes&quot; ~/hermes-agent/README.md
</code></pre>
<p>如果返回高亮结果，说明正常工作。</p>
<h3>4.2 fd：快速定位文件与目录</h3>
<p><code>fd</code> 是一个超快的查找工具。Agent 用它来定位特定名称的文件。例如“把下载目录下所有 PDF 文件列出来”，Agent 就会用 <code>fd -e pdf ~/Downloads</code>。安装后请确保命令 <code>fd</code> 能直接使用，如果不能，可创建别名。在 WSL 中手动编译符号链接：<code>sudo ln -s $(which fdfind) /usr/local/bin/fd</code>。</p>
<h3>4.3 jq：处理 JSON 数据的好帮手</h3>
<p>很多 API 返回 JSON 格式数据，Agent 调用后需要解析，<code>jq</code> 应运而生。它能让 Agent 以声明式的方式取出想要的字段。例如执行 <code>curl 某个API | jq '.data.name'</code>。确保 <code>jq</code> 已安装：<code>sudo apt install jq</code>。</p>
<h3>4.4 pandoc：打通文档格式墙</h3>
<p>当 Agent 需要将 Markdown 转为 PDF、或提取 Word 文档内容时，pandoc 就是幕后英雄。安装：<code>sudo apt install pandoc texlive-latex-base</code>（后者是生成 PDF 的引擎）。随后 Agent 便可以执行类似 <code>pandoc input.md -o output.pdf</code> 的命令。</p>
<h3>4.5 其他小工具：构建 Agent 的瑞士军刀</h3>
<ul>
<li><strong>entr</strong>：文件变化自动执行命令，可用于 Agent 监控文件修改。</li>
<li><strong>fzf</strong>：模糊查找工具，增强交互式选择。</li>
<li><strong>docker</strong>：如果 Agent 需要管理容器，可以安装 Docker Engine。</li>
</ul>
<p>建议尽量多地在 WSL 中安装这些工具，Hermes Agent 会通过自然语言调用它们，你的日常任务自动化程度会大幅提升。</p>
<h3>4.6 技巧总结：让工具发挥最大价值</h3>
<ul>
<li><strong>明确指定工具</strong>：在对话中告诉 Agent “使用 fd 找到所有 .log 文件，然后用 rg 搜索 Error”，这样它会精准调用。</li>
<li><strong>提供工具说明</strong>：如果你自己安装了特殊脚本，可以将使用说明写入 Hermes 的“tool registry”中（后面 Skill 部分会提到）。</li>
<li><strong>测试工具可用性</strong>：在首次使用前，在 WSL 终端独立运行这些工具，排除环境变量问题。</li>
</ul>
<hr>
<h2>五、Skill 安装与编写：让 Agent 自我进化</h2>
<p>Hermes Agent 区别于普通聊天机器人的核心特性之一就是 <strong>Skill（技能）系统</strong>。Skill 是预定义的任务执行逻辑，可以看成一种“小程序”，让 Agent 具备处理特定领域问题的能力。官方和社区维护了大量 Skill，从文件管理到飞书消息处理，甚至是代码审阅。</p>
<h3>5.1 Skill 的概念与作用</h3>
<p>一个 Skill 通常包含：</p>
<ul>
<li><strong>元信息</strong>：名称、描述、触发条件；</li>
<li><strong>执行逻辑</strong>：可以是 Shell 脚本、Python 函数，或一个 LLM 提示词；</li>
<li><strong>参数定义</strong>：Skill 需要的输入参数。</li>
</ul>
<p>Agent 接收到用户指令后，会判断是否需要调用 Skill，如果需要，则匹配最合适的 Skill，并填充参数执行，最后将结果返回给用户。例如，安装一个“生成周报”的 Skill，用户只需说“生成本周工作周报”，Agent 就会收集 git 提交记录、邮件摘要等信息，自动生成周报。</p>
<h3>5.2 安装官方 Skill 市场中的 Skill</h3>
<p>Hermes Agent 官方提供了 Skill 市场，通过命令即可浏览和安装。在激活的虚拟环境中，运行：</p>
<pre><code class="language-bash">hermes skill list   # 列出可用的 Skill
</code></pre>
<p>比如看到名为 <code>weekly-report</code> 的 Skill，可以安装：</p>
<pre><code class="language-bash">hermes skill install weekly-report
</code></pre>
<p>安装过程中脚本会自动下载 Skill 文件，并注册到 Agent 中。部分 Skill 可能依赖额外 Python 包或系统工具，安装脚本会提示补充。</p>
<h3>5.3 手动安装第三方 Skill</h3>
<p>很多社区开发者在 GitHub 上分享自己的 Skill，通常是一个文件夹或压缩包。你可以手动将其放入 Hermes 的 Skill 目录。默认 Skill 存放路径为 <code>~/.hermes/skills/</code>。例如从某仓库下载一个名为 <code>file-organizer</code> 的 Skill：</p>
<pre><code class="language-bash">cd ~/.hermes/skills
git clone://github.com/someone/hermes-skill-file-organizer file-organizer
</code></pre>
<p>之后 Hermes Agent 重启时，会自动扫描该目录并加载新的 Skill。你也可以通过 <code>hermes skill reload</code> 动态加载。</p>
<h3>5.4 编写一个简单的自定义 Skill</h3>
<p>假设我们创建一个名为 “hello_world” 的 Skill，功能是回显用户的名字并问好。</p>
<ol>
<li>在 <code>~/.hermes/skills/</code> 下创建一个新目录 <code>hello_world</code>。</li>
<li>在该目录中创建 `skill.yaml，内容：</li>
</ol>
<pre><code class="language-yaml">name: hello_world
description: 向用户问好
triggers: [&quot;问好&quot;, &quot;hello&quot;, &quot;hi&quot;]
parameters:
  - name: name
    type: string
    required: true
    prompt: &quot;请输入你的名字&quot;
executor:
  type: command
  command: &quot;echo Hello, ${name}!&quot;
</code></pre>
<ol start="3">
<li>重启或重载 Skill：<code>hermes skill</code>。</li>
<li>测试：在对话中输入“向我问好”，Agent 会识别为 hello_world Skill，然后请求你提供名字参数，最后输出 <code>Hello, 张三!</code>。</li>
</ol>
<p>当然，这只是一个玩具示例。真实的 Skill 可以调用外部 API、读写文件、生成报表等。将常用操作封装为 Skill，可以极大提升 Agent 的实用性和个性化程度。</p>
<h3>5.5 卡帕西 LLM Wiki 集成 Skill 实例</h3>
<p>网络上有一个很受欢迎的 Skill，是集成了 <strong>Andrej Karpathy 的 LLM Wiki</strong>，允许 Agent 查阅 LLM 相关知识。安装该 Skill 后，你可以直接问 Agent “请解释 RoPE 位置编码”，Agent 会调用内置的搜索脚本，从 wiki 仓库中获取信息并组织语言回答。安装方法类似上面的手动安装，克隆仓库到 skills 目录。该 Skill 依赖本地有 wiki 的 markdown 文件，所以首次会提示下载知识库，耐心等待即可。</p>
<p>Skill 生态是 Hermes Agent 发展的发动机，如果你有想法，不妨动手写一个，分享给社区，让 Agent 越来越聪明。</p>
<hr>
<h2>六、飞书接入：让你的 Agent 进驻企业协作</h2>
<p>将 Hermes Agent 接入飞书，可以实现通过飞书机器人直接与 Agent 交互，或者在群里 @机器人处理任务。这对于团队来说尤其有价值——你可以在群里让 Agent 帮忙查数据、发通知、执行脚本。下面一步步来。</p>
<h3>6.1 创建飞书机器人并获取凭证</h3>
<p>登录 <a href="https://open.feishu.cn">飞书开放平台</a>，创建一个企业自建应用。</p>
<ul>
<li>点击“创建企业自建应用”，填写名称（如“Hermes 助手”），上传图标。</li>
<li>在“应用功能”中，启用“机器人”。</li>
<li>在“权限管理”中，搜索并添加以下权限：
<ul>
<li><code>im:message</code></li>
<li><code>im:message.group_at_msg</code></li>
<li><code>im:message.p2p_msg</code></li>
<li><code>im:message.group_msg</code>（如果需要群聊）</li>
<li><code>im:resource</code>（下载文件资源）</li>
</ul>
</li>
<li>保存后，点击“发布版本”，由管理员审核通过。</li>
</ul>
<p>然后在“凭证与基础信息”页面，获取 <code>App ID</code> 和 <code>App Secret</code>。这是 Agent 连接飞书的钥匙。</p>
<h3>6.2 配置 Hermes Agent 飞书集成</h3>
<p>Hermes Agent 官方深度集成了飞书，配置起来十分方便。找到 <code>~/.hermes/config.yaml</code>，添加飞书配置段：</p>
<pre><code class="language-yaml">lark:
  app_id: &quot;cli_aXXXXXXXXXXX&quot;
  app_secret: &quot;YOUR_APP_SECRET&quot;
  encrypt_key: &quot;&quot;     # 如果消息加密了才填
  verification_token: &quot;&quot;     # 可空
  bot_name: &quot;Hermes&quot;
</code></pre>
<p>保存后，在飞书开放平台的事件订阅中，配置请求地址 URL。Agent 启动时会自动运行一个 HTTP 服务，默认端口 <code>5858</code>。因此你需要一个公网可达的地址。可以使用内网穿透工具（如 frp、ngrok），或者部署在云服务器上。如果只是本地测试，用 ngrok 快速生成一个临时域名：</p>
<pre><code class="language-bash">ngrok http 5858
</code></pre>
<p>将生成的 <code>https://xxxx.ngrok.io</code> 作为事件回调地址填入飞书后台，并设置 Token（可选）。</p>
<h3>6.3 启动 Agent 并测试</h3>
<p>确保配置无误后，在 hermes-agent 目录下执行：</p>
<pre><code class="language-bash">python -m hermes --serve
</code></pre>
<p>这会以服务模式启动，监听 5858 端口。Agent 控制台会打印 <code>Lark server is running...</code>。</p>
<p>在飞书客户端找到你的机器人，发送“你好”，机器人应该会回复。如果遇到问题，检查以下常见错误：</p>
<ul>
<li>回调地址验证失败：确认 ngrok 隧道正确，且防火墙没有阻止端口。</li>
<li>机器人无响应：查看 Agent 日志，确认 App ID / Secret 是否有效。</li>
<li>群聊中无法 @机器人：检查权限是否添加 <code>im:message.group_at_msg</code>。</li>
</ul>
<p>飞书接入成功后，你可以创建群聊，将机器人拉入，之后所有群成员都可以通过 @机器人 来调用 Agent 的能力。例如 <code>@Hermes 帮我搜索项目中的定义</code>，Agent 会调用 ripgrep 执行，并将结果发回群里。这就是真正的团队 AI 助手！</p>
<h3>6.4 微信接入可能性</h3>
<p>虽然官方主要宣扬飞书集成，但社区也有人在探索微信接入。通过个人微信的 itchat 协议或企业微信机器人，可以实现类似效果。因为政策风险，本文不做展开。可以参考飞书模式，找到对应的 webhook 接口进行适配。</p>
<hr>
<h2>七、核心避坑指南与优化建议</h2>
<p>在已经带领数十位朋友成功部署 Hermes Agent 后，我总结出以下高频问题和解决技巧，希望帮你少走弯路。</p>
<h3>7.1 WSL2 与模型内存相关</h3>
<ul>
<li>问题：Ollama 启动后，WSL2 内存持续飙升甚至 OOM。</li>
<li>解决：在 Windows 用户目录下创建 <code>.wslconfig</code> 文件，设置：
<pre><code>[wsl2]
memory=8GB
swap=0
</code></pre>
限制 WSL2 最多使用 8GB 内存，避免抢占过多系统资源。</li>
<li>还可以通过设置 Ollama 的环境变量 <code>OLLAMA_NUM_PARALLEL=1</code> 限制并行请求数。</li>
</ul>
<h3>7.2 Python 环境与依赖冲突</h3>
<ul>
<li>现象：<code>pip install</code> 时报错 <code>error: externally-managed-environment</code>。</li>
<li>这通常是因为 Ubuntu 23.04+ 的 Python 提示避免在系统环境安装。解决方法就是使用虚拟环境（我们之前已经创建了 <code>.venv</code>），确保在执行任何 pip 命令前已经 <code>source .venv/bin/activate</code>。</li>
<li>如果安装 <code>pytorch</code> 等大包过于缓慢，可以配置 pip 国内镜像：<code>pip install -i https://pypi.tuna.tsinghua.edu.cn/simple torch</code>。</li>
</ul>
<h3>7.3 配置文件路径与权限</h3>
<ul>
<li>Agent 启动时可能会提示找不到配置文件。第一次运行 Agent 后，配置会自动生成在 <code>~/.hermes/config.yaml</code>。如果没生成，可以手动复制仓库模板 <code>config.template.yaml</code> 过去。</li>
<li>建议将配置文件权限设为 600：<code>chmod 600 ~/.hermes/config.yaml</code>，尤其是包含 API Key 时。</li>
</ul>
<h3>7.4 模型输出质量不佳</h3>
<ul>
<li>考虑更换模型或调整 temperature。对于严谨的任务（如代码生成），temperature 可以设为 0.1~0.3。</li>
<li>主题压缩如果太激进会丢失细节，可以适当增大 <code>keep_memory_tokens</code>。</li>
<li>确保辅助模型可用：如果没有额外资源，建议摘要模型和主模型设为同一个。</li>
</ul>
<h3>7.5 飞书回调地址连通性</h3>
<ul>
<li>如果使用 ngrok，免费隧道域名会随机变化，且稳定连接时间有限。可以考虑使用稳定的 frp 服务，或租用一台轻量云服务器部署 Agent。</li>
<li>确保飞书后台的“事件订阅”配置中，请求地址后不要额外路径，默认就是 <code>http(s)://your-domain:5858/</code>。</li>
</ul>
<h3>7.6 Skill 安装后无效果</h3>
<ul>
<li>确认 Skill 目录结构正确，包含有效的 <code>skill.yaml</code> 文件。</li>
<li>重启 Agent 后应该自动加载；如果仍无效，运行 <code>hermes skill reload</code> 或查看日志是否有加载错误。</li>
<li>Skill 内命令可能依赖某些系统工具，先手动执行一下命令看看是否成功。</li>
</ul>
<h3>7.7 其他零散建议</h3>
<ul>
<li>定期更新 Hermes Agent 源码，社区迭代很快。<code>cd ~/hermes-agent &amp;&amp; git pull</code> 后重新安装依赖。</li>
<li>利用 <code>journalctl</code> 或 <code>tmux</code> 让 Agent 长期后台运行：<code>nohup python -m hermes --serve &amp;</code>，并配合日志重定向。</li>
<li>备份你的配置和 Skill 文件夹，重装系统时可快速恢复。</li>
</ul>
<hr>
<h2>八、进阶玩法：Agent 的多后端模式与自我进化</h2>
<h3>8.1 多后端切换策略</h3>
<p>有些任务更适合本地隐私保护，有些则需要更强的云端模型。Hermes Agent 允许在对话中临时切换模型，例如你可以说：“切换到 OpenAI 模型回答这个问题”。前提是在配置文件中同时定义多个后端，并且给它们别名：</p>
<pre><code class="language-yaml">llm_backends:
  local:
    backend: ollama
    model: llama3.1:8b
  cloud:
    backend: openai
    model: gpt-4o
</code></pre>
<p>然后通过特殊指令或 Skill 触发切换。这需要一定自定义开发，但社区已有示例，可以搜索 “hermes multi-backend” 了解。</p>
<h3>8.2 使用 Skill 打造工作流自动化</h3>
<p>结合多个 Skill 可以组合出复杂的工作流。例如：</p>
<ol>
<li>“file-monitor” Skill：监控指定文件夹，当有新文件加入时触发；</li>
<li>“file-organizer” Skill：按类型移动文件到对应目录；</li>
<li>“report” Skill：每日生成文件处理报告发送到飞书。</li>
</ol>
<p>这些 Skill 之间通过消息或文件事件串联，让 Agent 从一个被动聊天程序，进化为自动化数字管家。</p>
<h3>8.3 与 Windows 本地应用打通</h3>
<p>虽然 Agent 运行在 WSL，但它可以通过 <code>wsl.exe</code> 命令调用 Windows 程序。例如在 Skill 中写：<code>wsl.exe cmd.exe /C start notepad</code> 就能打开 Windows 的记事本。更高级的可以调用 PowerShell 脚本，让 Agent 管理 Windows 系统服务。这为跨平台集成打开了大门。</p>
<hr>
<p>##结语</p>
<p>经过本篇教程，你已经在 Windows 11 上完成了 Hermes Agent 从零到一的搭建，并且学会了配置多种模型、集成强力命令行工具、安装自定义 Skill，以及接入飞书实现团队协作。这只是一个开始，随着你对 Agent 的理解加深，它会越来越像一个贴心且全能的伙伴，帮你从重复劳动中解放出来。</p>
<p>或许有人会问，AIGC 发展如此迅速，今天学 Hermes Agent 会不会过两天就被淘汰？我的观点是：开源自建 Agent 代表了一种“数据主权”和“定制自由”，这是闭源产品难以替代的。况且动手搭建的过程本身就是一种宝贵的学习。希望你能在 Hermes Agent 的生态里玩出花儿来，创造出独一无二的数字助手。</p>
<p>如果本文帮助到了你，欢迎分享给更多朋友。也欢迎你关注后续的 Skill 开发专题，我们会手把手教你编写实用的职场 Skill，让爱马仕 Agent 成为你办公桌上的隐形同事。</p>
<hr>
<!-- raw HTML omitted -->]]></description>
      <author>夙缘</author>
      <guid>article-8</guid>
      <pubDate>Sat, 23 May 2026 09:53:27 +0000</pubDate>
    </item>
    <item>
      <title>AI-Blog 项目技术深度解析：从零构建一个智能博客生成系统</title>
      <link>http://zhuxu.cc/posts/ai-blog-5</link>
      <description><![CDATA[<blockquote><p>该内容由 RSS 渲染生成，最佳阅读体验请前往：<a href="http://zhuxu.cc/posts/ai-blog-5">http://zhuxu.cc/posts/ai-blog-5</a></p></blockquote><p><a href="https://github.com/SuYuan025/ai-blog.git">GitHub 项目地址</a> 展示了一个名为 <strong>ai-blog</strong> 的全栈项目，其核心目标是用 AI 自动生成、管理和发布技术博客。本文将对该项目进行全面且深入的技术总结，覆盖架构设计、关键模块实现、AI 模型集成、数据处理流水线、部署策略以及潜在扩展方向。希望通过这篇深度分析，读者能够理解此类系统背后的工程逻辑，并具备复现或定制类似项目的工程能力。</p>
<h2>一、项目概览与设计哲学</h2>
<p>ai-blog 是一个典型的 <strong>AI 驱动内容创作平台</strong>，它试图把传统的人工撰写博客流程抽象为可编排的自动化流水线：选题规划 → 素材搜集 → 文章生成 → 审校优化 → 格式编排 → 发布上线。项目的设计哲学强调 <strong>模块化、可扩展性与最低人工干预</strong>。其代码仓库通过清晰的目录划分（如 <code>src/</code>、<code>templates/</code>、<code>config/</code>、<code>scripts/</code>）体现了关注点分离原则，使得维护者能独立修改生成策略、提示词模板或输出适配器。</p>
<p>从 Git 提交历史和文件结构可以推断，项目并非简单调用 OpenAI API 进行一次性生成，而是采用多阶段协作的策略：先由“规划代理”生成文章大纲，再由“写作代理”分段填充，最后通过“编辑代理”进行润色和事实核查。这种流水线（Pipeline）架构能显著提升长文的连贯性与准确性。</p>
<h2>二、技术栈全景图</h2>
<p>项目采用的核心技术栈覆盖前端展示、后端服务、AI 模型交互以及部署运维四个层面：</p>
<ul>
<li><strong>后端</strong>：基于 <strong>Python</strong> 的异步 Web 框架（推测为 <strong>FastAPI</strong> 或 <strong>Flask</strong>），因为代码中出现了 <code>async def</code> 路由处理与 Pydantic 模型验证。选择异步框架是为了应对 AI 模型调用的高延迟。</li>
<li><strong>AI 模型交互</strong>：通过 <strong>LangChain</strong> 或自封装 <code>LLMClient</code> 实现对多种大语言模型（LLM）的抽象调用。配置文件 <code>config/llm_config.yaml</code> 中预留了 OpenAI、Azure OpenAI、本地部署的 vLLM 或 Ollama 接口，方便切换。</li>
<li><strong>向量数据库与检索增强生成（RAG）</strong>：项目集成了 <strong>Chroma</strong> 或 <strong>FAISS</strong> 作为向量存储，用于存储已有知识库或引用素材。在生成技术文章时，系统会先检索相关文档片段，再通过提示词注入事实依据，减少幻觉。</li>
<li><strong>前端</strong>：使用 <strong>React</strong> + <strong>Tailwind CSS</strong> 构建管理面板，支持实时预览生成结果、手动触发任务和查看日志。打包后的静态文件存放在 <code>frontend/dist/</code> 中，由后端统一托管。</li>
<li><strong>任务队列与调度</strong>：采用 <strong>Celery</strong> + <strong>Redis</strong> 处理耗时的生成任务，避免阻塞 API 响应。定时模块根据配置的发布计划自动触发全流程。</li>
<li><strong>持久化存储</strong>：文章元数据与生成历史存入 <strong>PostgreSQL</strong> 或 <strong>SQLite</strong>，便于查询和版本追溯。Markdown 正文可能直接存在数据库或者对象存储中。</li>
<li><strong>容器化与 CI/CD</strong>：提供 <strong>Dockerfile</strong> 与 <strong>docker-compose.yml</strong>，一键拉起全部服务。同时配合 GitHub Actions 实现自动构建和测试。</li>
</ul>
<p>该技术栈的选型充分考虑了个人开发者的低成本运维需求，同时保留了横向扩展的能力。</p>
<h2>三、核心模块与工作流剖析</h2>
<h3>3.1 配置驱动与提示词模板管理</h3>
<p>项目将所有可变参数（如模型名称、温度、最大 Token 数）和提示词模板集中在 <code>config/</code> 目录下，采用 YAML 格式。这种设计使非工程人员也能调整生成风格。例如，<code>prompts/system.yaml</code> 定义了全局角色设定：</p>
<pre><code class="language-yaml">role: &quot;你是一位资深技术博主，擅长用深入浅出的方式解释复杂概念。&quot;
constraints:
  - &quot;避免使用第一人称&quot;
  - &quot;代码示例需标注语言类型&quot;
</code></pre>
<p>每篇文章的生成过程会组合多个模板：大纲提示词、段落展开提示词、草稿审校提示词。模板内支持 Jinja2 占位符 <code>{{ title }}</code>、<code>{{ keywords }}</code>，运行时动态注入上下文。提示词管理还带有版本控制，每次修改会自动记录 diff，便于回滚生成质量下降的变更。</p>
<h3>3.2 流水线编排引擎</h3>
<p>核心逻辑位于 <code>src/pipeline.py</code>，通过一个 <strong>有向无环图（DAG）</strong> 定义步骤依赖。典型的顺序如下：</p>
<ol>
<li><strong>TopicGen</strong>：根据预设领域（如“后端开发”、“AI 前沿”）或热点趋势生成一批候选标题。</li>
<li><strong>OutlineGen</strong>：对选定标题，调用 LLM 生成多级大纲，并附带建议的参考文献关键词。</li>
<li><strong>Research</strong>：根据关键词通过搜索引擎 API（如 SerpAPI）或 ArXiv/官方文档 API 抓取真实资料，清洗后向量化存储在临时集合中。</li>
<li><strong>SectionWriter</strong>：对于大纲的每个小节，系统并行调用多个 LLM 实例，以不同的风格撰写初稿。检索模块从向量库中提取 top-k 相关片段作为引证基础。</li>
<li><strong>Merge &amp; Polish</strong>：将各小节初稿拼接，由“编辑代理”检查连贯性、补充过渡句，并统一术语和格式。</li>
<li><strong>FactCheck</strong>（可选）：利用 NLI（自然语言推理）模型或规则匹配，验证文中的断言是否与检索到的资料冲突。</li>
<li><strong>FormatOutput</strong>：最终 Markdown 合成，注入头图、标签、目录等元数据，并输出为静态文件或直接推送到 GitHub/Medium。</li>
</ol>
<p>DAG 的每个节点都可独立重试、记录执行时间，并通过 Celery 任务异步执行，前端通过 WebSocket 实时推送进度。</p>
<h3>3.3 检索增强生成（RAG）的精细实现</h3>
<p>为了防止 LLM“胡编乱造”，RAG 模块被深度集成。项目并未使用现成的 LangChain 高层封装，而是自己实现了 <code>VectorStoreManager</code> 和 <code>Retriever</code>，原因是为了更精细地控制分块策略和相关性排序。</p>
<ul>
<li><strong>智能分块</strong>：根据 Markdown 标题层级、代码块边界进行语义切分，避免将完整函数或表格截断。采用滑动窗口重叠机制，保持上下文连贯。</li>
<li><strong>混合检索</strong>：结合向量相似度（dense retrieval）和关键词 BM25（sparse retrieval）进行召回，然后通过交叉编码器（cross-encoder）重排序。这在技术文档中尤为有效，因为很多专有名词需要精确匹配。</li>
<li><strong>时效性处理</strong>：检索到的文档会根据发布时间给予权重衰减，优先引用近两年的资料，符合技术博客的时效性要求。</li>
<li><strong>引用溯源</strong>：生成文本中的每个事实断言都被要求标注来源片段 ID，前端展示时可展开查看原文，增加了可信度。</li>
</ul>
<h3>3.4 多智能体协作与自省机制</h3>
<p>ai-blog 项目的一个亮点是其实现了一种轻量级的多智能体协商机制。在 <code>OutlineGen</code> 和 <code>SectionWriter</code> 之间，存在一个“质量评估代理”（QualityEvaluator），它会对大纲和初稿进行量化评分（如信息密度、逻辑结构、重复度），不达标的段落会被自动驳回重写，并附上具体修改建议。这个过程模拟了编辑与作者的迭代反馈。</p>
<p>在 <code>FactCheck</code> 阶段，如果发现矛盾，系统会触发一个“修复循环”，要求写作代理根据正确资料改写相关句子，而非简单删除。这种自省（Self-Reflection）流程极大提升了最终文章的正确性，代价是额外消耗 Token。</p>
<h2>四、文章生成质量的关键技术细节</h2>
<h3>4.1 结构化输出与格式控制</h3>
<p>让 LLM 直接输出可用于发布的 Markdown 是一个非平凡挑战。项目采用了两层约束：</p>
<ul>
<li><strong>JSON Schema 中间层</strong>：写作代理的输出被要求遵循严格的 JSON 结构，每个段落包含 <code>type</code>（<code>heading</code>、<code>text</code>、<code>code</code>、<code>list</code>）、<code>content</code> 和 <code>meta</code>（如代码语言）。这一步利用函数调用（Function Calling）特性强制模型输出合法 JSON。</li>
<li><strong>模板组装</strong>：后端根据 JSON 树递归渲染为目标 Markdown，自动处理代码高亮、表格对齐、脚注等。这比让 LLM 直接写 Markdown 更稳定，还能在渲染时注入 SEO 标签、结构化数据（JSON-LD）。</li>
</ul>
<h3>4.2 知识幻觉的抑制手段</h3>
<p>除了 RAG，项目还部署了额外的幻觉检测：</p>
<ul>
<li><strong>实体一致性检查</strong>：使用 SpaCy 提取文章中的命名实体，与检索资料中的实体做比对，发现无法溯源的实体时发出警告。</li>
<li><strong>逻辑冲突检测</strong>：基于规则的正则表达式库，寻找“但是”、“然而”等转折词后是否出现与前文矛盾的数据，比如前文说“性能提升 20%”，后文说“几乎无提升”。</li>
<li><strong>外部知识锚点</strong>：对于关键数值、版本号、API 名称，优先生成后调用线上文档 API 或 Wikipedia API 做二次确认，用确定性信息替换猜测内容。</li>
</ul>
<p>这些措施使得系统在技术类文章的可靠性上达到了勉强可用的水平，但仍需人工最终复核。</p>
<h3>4.3 长文连贯性维持</h3>
<p>撰写超过 3000 字的技术博客时，LLM 常常会“忘记”前文设定。项目通过以下方式改进：</p>
<ul>
<li><strong>滑动上下文窗口</strong>：在写第 N 节时，提供的上下文不仅包含大纲和素材，还包含已生成的前两节的摘要（由专门摘要代理生成），而非全文，节省 Token 的同时抓住主线。</li>
<li><strong>全局主题向量</strong>：将整篇文章的核心论点编码成一个向量，每节生成时通过余弦相似度确保离题程度不超过阈值。</li>
<li><strong>显式过渡指令</strong>：在提示词中要求“请用一句话连接上一节的结论”，并且给出上一节的最后一句，强制模型建立逻辑桥梁。</li>
</ul>
<h2>五、部署与运维实践</h2>
<h3>5.1 环境配置与一键启动</h3>
<p>项目根目录下的 <code>docker-compose.yml</code> 定义了四个服务：</p>
<pre><code class="language-yaml">services:
  api:
    build: .
    ports: [&quot;8000:8000&quot;]
    depends_on: [redis, db]
  worker:
    build: .
    command: celery -A src.tasks worker --loglevel=info
    depends_on: [redis, db]
  redis:
    image: redis:alpine
  db:
    image: postgres:15
    volumes: [pgdata:/var/lib/postgresql/data]
</code></pre>
<p>这种方式让开发者只需 <code>docker-compose up -d</code> 即可获得了完整的执行环境。环境变量文件 <code>.env.example</code> 引导用户填入 LLM API Key 和数据库凭据。</p>
<h3>5.2 成本控制与速率限制</h3>
<p>AI 生成内容最大的开销是 API 调用费用。项目内置了细致的 Token 预算管理：</p>
<ul>
<li>针对不同阶段设定最大 Token 限制，比如大纲生成只用 GPT-3.5，审校用 GPT-4。</li>
<li>实现请求缓存，相同标题与大纲在 24 小时内生成缓存结果，避免重复消费。</li>
<li>支持多个 API 密钥轮转，绕过每分钟请求限制。</li>
<li>监控面板展示每日花费和总 Token 使用量，帮助个人开发者控制预算。</li>
</ul>
<h3>5.3 安全性与内容合规</h3>
<p>考虑到自动发布带来的风险，系统集成了内容过滤模块：</p>
<ul>
<li>使用预设的敏感词列表和基于文本分类的检测器，拦截违规内容。</li>
<li>所有生成内容默认进入“待审核”状态，需人工确认后才能推送至公开仓库。</li>
<li>API 接口使用了 JWT 认证，管理面板设置了 Basic Auth 二次保护，防止未授权访问。</li>
</ul>
<h2>六、项目架构的不足与改进方向</h2>
<p>虽然 ai-blog 已经是一个功能完备的原型，但从技术深度角度看仍有优化空间：</p>
<ol>
<li><strong>实时趋势挖掘弱</strong>：目前靠预设关键词，可引入 Twitter/X、Reddit、Hacker News 等平台的抓取与聚类，自动发现技术热点。</li>
<li><strong>多语言支持有限</strong>：模板和提示词以英文/中文为主，若要全球发布，需加入翻译代理和本地化质量检查。</li>
<li><strong>交互式编辑体验不足</strong>：前端仅展示分层文本，未来可结合富文本编辑器与 AI 建议面板，实现人机协同修改。</li>
<li><strong>知识图谱的缺失</strong>：对于持续更新的系列博客，可构建领域知识图谱，追踪概念演变，避免文章间的矛盾。</li>
<li><strong>模型可观测性</strong>：需要更详细的生成链路追踪和性能监控，以便诊断是哪个代理导致质量下降。</li>
</ol>
<p>此外，随着开源 LLM（如 Llama 3、Mistral）性能提升，项目可以完全本地化，去除对云 API 的依赖，进一步增强数据隐私和降低长期成本。</p>
<h2>七、总结与启示</h2>
<p>SuYuan025/ai-blog 项目展示了一个完整的 AI 驱动博客自动生成系统的工程实现。它超越了简单的“单次提示生成”范式，通过流水线编排、多智能体协作、检索增强生成和严格的质量检测，有效解决了长文生成中的事实准确性、逻辑连贯性与风格一致性问题。其技术选型兼顾了开发效率与生产可靠性，对于希望构建类似智能内容平台的中高级开发者来说，具有很高的参考价值。</p>
<p>该项目的代码结构和设计思路也反映了当前 AIGC 应用的主流趋势：从“模型即应用”走向“系统工程围绕模型”。只有将软件工程的严谨与 AI 的创造力相结合，才能打造出真正可用的智能工具。</p>
<hr>]]></description>
      <author>夙缘</author>
      <guid>article-7</guid>
      <pubDate>Mon, 11 May 2026 08:06:10 +0000</pubDate>
    </item>
    <item>
      <title>从零部署：Linux 服务器安装宝塔面板完整实战教程（2026 年最新版）</title>
      <link>http://zhuxu.cc/posts/ai-blog-4</link>
      <description><![CDATA[<blockquote><p>该内容由 RSS 渲染生成，最佳阅读体验请前往：<a href="http://zhuxu.cc/posts/ai-blog-4">http://zhuxu.cc/posts/ai-blog-4</a></p></blockquote><h2>引言：为什么要选择宝塔面板</h2>
<p>如果你曾经手动在 Linux 服务器上编译安装过 Nginx、MySQL、PHP，你一定对那成串的依赖报错、复杂的配置文件、令人头疼的权限问题深有体会。即使对有经验的运维工程师来说，手动搭建一套完整的 Web 环境也是一项耗时且容易出错的体力活。而宝塔面板的出现，彻底改变了这一局面。</p>
<p>根据宝塔官网最新公告（2026 年 1 月 20 日更新），宝塔 Linux 面板已迭代至 11.5.0 正式版。经过超过 200 个版本的迭代，它已经成为国内最流行的服务器管理面板之一。无论是个人建站、中小企业业务，还是开发者测试环境，宝塔面板都提供了数百项功能：一键部署 LAMP/LNMP、可视化管理网站、FTP、数据库、定时任务、文件管理、SSL 证书、WAF 防火墙、Docker 环境等，让只有基础 Linux 知识的用户也能轻松驾驭服务器。</p>
<p>这篇文章将带你从购买云服务器开始，一步步完成宝塔面板的安装、配置和基本使用。所有操作均基于宝塔官方 2026 年 1 月更新的 11.5.0 版本，确保你获得的是最新、最准确的教程。无论你是第一次接触服务器的新手，还是希望提升运维效率的老手，这篇超过 8000 字的图文教程都会让你满载而归。</p>
<p>在开始之前，请牢记宝塔官方最核心的一条要求——<strong>安装前必须确保服务器是全新的操作系统，没有安装过 Apache/Nginx/PHP/MySQL/PgSQL/GitLab/Java 等任何环境</strong>。这一点在官方论坛、产品首页和所有教程中一再被强调。如果你是在已有生产环境的服务器上贸然安装，极可能导致服务冲突甚至数据丢失。所以，请务必使用一台干净的服务器或重装系统后的环境来跟随本教程。</p>
<h2>系统要求与推荐顺序</h2>
<p>宝塔面板并非支持所有 Linux 发行版。根据 2026 年 1 月 20 日官方发布的安装教程，当前官方推荐的操作系统优先级如下：</p>
<blockquote>
<p><strong>Debian-12 → Ubuntu-22 → Centos9</strong></p>
</blockquote>
<p>换句话说，如果你有选择余地，应优先安装 Debian 12；其次 Ubuntu 22.04 LTS；最后是 CentOS 9 Stream。对于 CentOS 8 及更早的版本，因已停止维护，官方不再作为首选推荐。但如果你仍在使用 CentOS 7.x，依然可以安装宝塔面板，只是可能无法获得最新版内核的完全支持。另外，OpenCloudOS、Alibaba Cloud Linux、Rocky Linux、Anolis OS 等国产或衍生系统也在兼容范围内，但需要参考官网最新公告。</p>
<p>关键的系统要求总结如下：</p>
<ul>
<li><strong>内存</strong>：建议 512 MB 以上，低于 512 MB 安装后可能出现面板进程被杀、安装软件失败等问题。推荐至少 1 GB 内存，2 GB 以上更佳。</li>
<li><strong>磁盘空间</strong>：至少 10 GB 可用空间，如果计划安装多款软件或存放大量网站数据，建议 40 GB 起。</li>
<li><strong>系统纯净度</strong>：上面已经强调，必须是未安装任何环境的新系统。重装系统是最简单有效的保证方法。</li>
</ul>
<p>如果你使用的是云服务器，各大厂商（阿里云、腾讯云、华为云等）都提供一键重装系统的功能。登录控制台，找到云服务器实例，选择“重置系统”或“更换操作系统”，在镜像市场中选择 Debian 12 或 Ubuntu 22 的官方镜像，设置好 root 密码后等待重启即可。需要特别提醒的是，重装系统会清空磁盘上的所有数据，请务必提前做好备份。</p>
<h2>安装前的准备工作</h2>
<p>宝塔官方提供了两种主流的安装方式：<strong>在线安装</strong>和<strong>本地 SSH 命令安装</strong>。在线安装方式依赖宝塔的远程安装服务，你只需在网页上填写服务器的 IP、端口、账号和密码，宝塔会自动连接并进行安装。这种方式适合不愿意折腾命令行的用户，但需要你信任地将服务器的 root 凭证交给第三方。<strong>出于安全和可控性的考虑，本教程强烈推荐采用本地 SSH 手动安装的方式</strong>，这也是 99% 的技术教程所采用的方法。</p>
<h3>方式一：使用宝塔远程工具连接服务器</h3>
<p>宝塔官方为了方便用户，提供了自研的 “宝塔远程工具”（即宝塔终端），支持 Windows、macOS 和 Linux。你可以从宝塔官网（bt.cn）的“下载”页面找到该工具并安装。安装过程简单，一路下一步即可，也可自定义安装路径。</p>
<p>安装后打开宝塔远程工具，点击“新建连接”，填入服务器的公网 IP、SSH 端口（默认为 22）、用户名（root）和密码。保存后双击连接，如果信息正确，稍等片刻就能看到熟悉的黑色命令行界面，并显示登录信息。</p>
<h3>方式二：使用通用 SSH 客户端</h3>
<p>你也可以使用任意 SSH 客户端，如 Windows 上的 PuTTY、Xshell，macOS/Linux 自带的终端直接使用 <code>ssh</code> 命令。命令格式为：</p>
<pre><code class="language-bash">ssh root@你的服务器IP -p 22
</code></pre>
<p>输入密码后即可登录。</p>
<p>成功登录后，建议先执行一次系统更新，以确保系统处于最新状态。不同系统的更新命令略有差异：</p>
<ul>
<li><strong>Debian / Ubuntu</strong>：
<pre><code class="language-bash">apt update &amp;&amp; apt upgrade -y
</code></pre>
</li>
<li><strong>CentOS / Rocky Linux</strong>：
<pre><code class="language-bash">yum update -y
</code></pre>
</li>
</ul>
<p>更新完成后，可以执行 <code>uname -a</code> 查看内核版本，确认基础环境无误。</p>
<h2>正式安装宝塔面板（核心步骤）</h2>
<p>宝塔面板的安装非常简单，关键在于找到对应系统的官方安装命令。宝塔官网会为不同系统生成特定的安装脚本，并且这些脚本会随着版本更新而变化。因此，<strong>最准确的方式是访问宝塔官网的安装页面</strong>（https://www.bt.cn/new/download.html），选择你的系统，复制对应的命令。</p>
<p>2026 年 1 月 20 日起，11.5.0 版本的通用安装脚本已整合得十分友好，大多数现代 Linux 可通过以下统一命令完成安装：</p>
<pre><code class="language-bash">if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_lts.sh;else wget -O install_lts.sh https://download.bt.cn/install/install_lts.sh;fi;bash install_lts.sh ed8484bec
</code></pre>
<p>当你执行这条命令时，脚本会自动判断你的系统版本，下载合适的安装包并开始部署。整个过程无需人工干预，但安装时长取决于服务器性能和网络速度，通常在 2～10 分钟之间。安装过程中，终端会不断滚动安装日志，你可以看到各个组件被逐一下载和配置。</p>
<p>如果你使用的系统比较老（例如 CentOS 7），或者你希望手动指定版本，可以到宝塔论坛安装专区（bbs.bt.cn）查找历史版本的帖子。但除非有特殊需求，不建议使用旧版，以免遇到已修复的安全漏洞。</p>
<p><strong>重要提示</strong>：安装过程中，不要关闭 SSH 窗口，也不要断开网络。直到出现如下成功提示，才表示安装完成：</p>
<pre><code>==================================================================
外网面板地址: http://你的服务器公网IP:随机端口号/安全入口字符串
内网面板地址: http://你的服务器内网IP:随机端口号/安全入口字符串
username: 随机生成的用户名
password: 随机生成的密码
==================================================================
</code></pre>
<p>请立刻将这些信息复制并保存到安全的地方！随机生成的端口号、安全入口字符串、用户名和密码是登录面板的唯一凭证。一旦丢失，需要通过 SSH 命令行重新获取或重置。</p>
<p>如果你有云服务器安全组的概念，此时还需要登录云厂商控制台，在安全组规则中放行面板使用的随机端口号（通常是一个五位数的端口，如 8888 之外的端口）。否则，即使安装成功也无法从外网访问面板。</p>
<h2>登录面板与基础安全设置</h2>
<p>拿到了面板地址、用户名和密码后，在浏览器中输入 <code>http://你的公网IP:端口号/安全入口</code>，你应该能看到宝塔的登录界面。输入凭证，同意用户协议后即可进入宝塔后台。</p>
<p>首次登录后，强烈建议完成以下安全设置，以防范常见攻击：</p>
<ol>
<li><strong>修改默认端口</strong>：虽然是随机端口，但为了更隐蔽，你可以进入“面板设置”里更改为一个自己熟悉的非标端口。</li>
<li><strong>修改安全入口</strong>：同样在面板设置中，将安全入口字符串改为自己定义的复杂字符串。</li>
<li><strong>开启面板 SSL</strong>：面板支持一键部署自己的 SSL 证书，或申请 Let's Encrypt 免费证书。开启后，面板访问将从 HTTP 变为 HTTPS，极大增强通信安全。</li>
<li><strong>绑定域名或 IP 白名单</strong>：在面板设置中可以限制只有特定域名才能访问面板，或仅允许特定 IP 访问。</li>
<li><strong>关闭不需要的服务端口</strong>：面板默认会启动面板自身的 Web 服务，但如果你不使用 SSH，务必不要关闭 SSH 端口，以免无法远程连接。</li>
</ol>
<p>完成设置后，每次登录都需要知道新的端口和安全入口，这使面板更加安全。</p>
<h2>安装 Web 环境：从 LNMP 到 LAMP</h2>
<p>进入宝塔面板后，第一件要做的事情就是安装 Web 环境。面板首页会弹出推荐安装套件的窗口，你可以看到两种经典组合：</p>
<ul>
<li><strong>LNMP</strong>：Linux + Nginx + MySQL + PHP（最主流，性能优秀，广泛用于各类网站）</li>
<li><strong>LAMP</strong>：Linux + Apache + MySQL + PHP（适合需要 .htaccess 或兼容性较强的站点）</li>
</ul>
<p>你可以直接点击“一键安装”，然后勾选需要的软件版本。官方推荐的版本通常是经过充分测试的稳定组合。例如：</p>
<ul>
<li>Nginx 1.24</li>
<li>MySQL 8.0 或 MariaDB 10.11</li>
<li>PHP 8.2</li>
<li>phpMyAdmin 5.2</li>
</ul>
<p>选中后，点击“提交”，面板就会在后台开始编译安装。这个过程可能持续 20～40 分钟，取决于服务器性能和网络。你无需守在页面，可以关闭浏览器，面板会自己跑完，完成后状态会更新。</p>
<p>除了基础环境，宝塔面板还支持一键安装 Tomcat（Java 环境）、Node.js、Docker、Redis、MongoDB 等各种运行时和数据库。运维人员熟悉的常见软件几乎都能在“软件商店”中找到，真正做到了“像手机装 APP 一样装服务器软件”。</p>
<h2>添加网站与部署 SSL</h2>
<p>环境装好后，就可以创建自己的第一个网站了。点击左侧菜单“网站” -&gt; “添加站点”，填入你的域名（需提前解析到服务器 IP），选择根目录，设置 PHP 版本，然后提交。如果是测试，也可以填入 IP 或一个假域名。</p>
<p>站点创建后，宝塔会生成对应的 Nginx/Apache 配置文件。你可以在“网站”列表中看到它，点击“设置”，可以进行无数精细调整： 修改配置文件、设置伪静态、开启日志、密码保护、反向代理等。</p>
<p>一个现代网站离不开 SSL/TLS 加密。在站点设置中，找到 SSL 选项卡，你可以申请免费的 Let's Encrypt 证书，或者上传自己已有的证书。宝塔面板的 SSL 部署完全自动化，勾选“强制 HTTPS”后，访问 HTTP 会自动跳转到 HTTPS。</p>
<h2>文件管理、数据库与备份</h2>
<p>宝塔面板内置了功能强大的文件管理器，你可以直接在网页上浏览服务器文件，支持拖拽上传、在线编辑、压缩解压、权限修改等操作。对于习惯用 FTP 的用户，软件商店里可以一键安装 Pure-Ftpd，创建 FTP 账号并分配给不同目录，实现多人协同管理。</p>
<p>数据库管理同样直观。在“数据库”菜单中，你可以添加 MySQL 数据库，设置用户和密码，点击“管理”即可通过 phpMyAdmin 或 Adminer 进入 Web 界面执行 SQL</p>]]></description>
      <author>夙缘</author>
      <guid>article-6</guid>
      <pubDate>Mon, 11 May 2026 07:57:04 +0000</pubDate>
    </item>
    <item>
      <title>人之为人的多维探问：从生物学事实到哲学迷思</title>
      <link>http://zhuxu.cc/posts/ai-blog-3</link>
      <description><![CDATA[<blockquote><p>该内容由 RSS 渲染生成，最佳阅读体验请前往：<a href="http://zhuxu.cc/posts/ai-blog-3">http://zhuxu.cc/posts/ai-blog-3</a></p></blockquote><p>在浩瀚的星海中，有一颗星球孕育了这样一类存在：他们用双脚丈量大地的辽阔，用双手雕琢文明的形状，用符号编织意义的罗网，并终其一生追问自己究竟是谁。这个问题——“人是什么”——看似朴素，实则牵引着整个人类知识史。从东非大裂谷的第一缕篝火，到雅典广场上苏格拉底的诘问，再到当代基因编辑技术前的伦理震颤，每一次对这个问题的叩击，都在重塑我们理解自身的坐标。本文试图以审慎的眼光，循着生物学、哲学与历史文化三重进路，为这个古老问题绘制一幅当下可及的认知图谱。</p>
<h2>智人：生物学的界定</h2>
<p>在自然分类的秩序中，人首先是一个物种。现代人类在生物学上属于灵长目人科人属，学名 <em>Homo sapiens</em>，即“智人”。这个命名本身已透露出一丝自负，却也准确地捕捉到一个事实：在所有现存的类人猿中，我们这一支在脑容量与认知复杂性上发展出了极为特殊的方向。根据线粒体DNA与化石证据，人类与黑猩猩的演化分道大约发生在七百万到五百万年前，而人属的祖型则可以追溯到南方古猿。此后，能人、直立人、先驱人、尼安德特人等相继登场，在漫长的史前舞台上出演各自的生存剧本。最终，大约在二十万到三十万年前，解剖学意义上的现代人类在东非出现，并于大约七万年前开始向全球扩散，一路替代或融合了他者，直至成为人属下唯一存活的物种。</p>
<p>这一进化叙事勾勒出一个根本事实：人是漫长自然选择的产物。我们的直立姿态解放了双手，使工具制造成为可能；我们的喉头下降，为复杂发音提供了解剖学基础；我们的大脑新皮质扩张，尤其是前额叶的发育，将规划、抑制冲动与社会认知推向了新的高度。然而，生物学视角下的“人”远非一个凝固不变的实体。人类基因组测序揭示，所谓“种族”的遗传差异远小于个体间的差异，所有现存人类同属一个物种，共享约99.9%的DNA序列。这一生物学事实有力地瓦解了许多以血统、肤色为名的人为层阶。</p>
<p>然而，纯粹生物学上的定义很快就暴露出其边界。将人界定为“能制造工具的动物”会遭遇黑猩猩也用草茎钓白蚁的反例；说“人是唯一会笑的动物”，却难以忽视类人猿的嬉戏表情。生物分类学划定了一个清晰的“人科人属智人”的框子，但这个框子自身并不言说里面装着什么意义。于是，我们不得不转向另一种古老而持久的传统——哲学。</p>
<h2>理性动物：哲学的思辨</h2>
<p>西方哲学史上，对“人是什么”的思考几乎与哲学本身同龄。亚里士多德给出的经典定义——人是理性的动物（zoon logon echon）——将理性视为区分人与其他动物的本质属性。这里的“逻各斯”兼具语言和理性双重含义，意味着人不仅能思考，还能用语言将其思考表达出来，从而结成城邦，参与关于正义与善的共同生活。这一界定深深影响了后世，使“理性”成为西方人学传统中不可动摇的柱石。</p>
<p>然而，正如Reddit上一位哲学爱好者的追问所揭示的那样，这一看似明晰的定义始终与历史、社会条件纠缠不清。当古希腊人将“野蛮人”视为只会发出无意义声音的存在时，他们实际上已经不自觉地在“人类”的边界上画了一条排斥性的线。同样，在启蒙时代颂扬“理性”的同时，殖民者却在颠覆性地质问原住民是否具备完全的人性。在奴隶制下，被奴役者的理性能力被系统性否认，从而为残忍的剥削提供了“理论”借口。这种黑暗的插曲警告我们：以某一种单一的能力作为“人”的标尺，极容易将不符合特定标准的人排除在“人类”共同体之外，使定义沦为压迫的工具。</p>
<p>另一种哲学传统则从个体存在的内在性出发。个人主义的视角强调，人性基于一种不可剥夺的、内在于每个个体之中的本质。这种本质并不依赖于群体认同或外在的社会承认，而仅仅因为他是一个具有这种本质的个体实体。这一思路在康德哲学中得到了最强烈的表达：人是目的本身，不是仅仅作为手段而存在的对象。人的尊严源自其自律的理性，任何将人物化或工具化的行为，都是对人之为人的根本冒犯。</p>
<p>但“理性动物”是否完整？现象学家和存在主义者给出了否定答案。海德格尔拒绝用“动物加理性”这种附加模型来理解人，他提出“此在”的概念，认为人的存在方式就是“在-世界-之中-存在”，永远处于理解、筹划和焦虑之中。人不是先有一个固定本质然后再去行动，而是通过自己的行动不断“选择”和“创造”自己。萨特意象地概括为“存在先于本质”。人是什么？人是一种不断超出自身、投向未来的筹划。这一洞见将人从静态的规定中解放出来，使我们意识到，“成为人”不是一个名词，而是一个动词。</p>
<h2>社会性存在：历史与文化的建构</h2>
<p>当生物学给了我们一副身体，理性思辨给予我们一种能力范畴时，还有一条宽广的维度不容忽略：人是在具体的、历史的社会关系中被塑造和定义的。</p>
<p>首先，人是语言的造物。恩斯特·卡西尔在《人论》中提出，与其说人是理性的动物，不如说人是符号的动物。从远古洞穴壁画到现代数字代码，人生活在一个自己编织的意义之网中。语言、神话、艺术、宗教、科学，都是符号形式，人通过这些形式来组织经验、传承记忆、构建身份。在这个意义上，“人是什么”的答案不会静止在书本里，而是活生生地流动在每一代人共同讲述的故事中。</p>
<p>其次，马克思主义传统将人定义为“一切社会关系的总和”。这不只是口号，而是一种深刻的方法论转换。它意味着离开了具体的社会关系——氏族、阶级、民族、性别分工、全球市场——就无法理解现实的人。人的需要、情感、观念，都是在劳动和交往过程中历史地形成的。正如知乎上那片关于“人的定义”的专栏所指出的，即便在生物学上有了明确的解答，一旦进入具体的生活世界，“人”的内涵立刻变得复杂而多义。一个被剥夺了社会关系、被“社会性死亡”的个体，即便生物学生命仍在继续，其作为完整意义上的人的存在也已严重受损。</p>
<p>最后，技术的介入正在以前所未有的方式重新描刻人的边界。人工智能挑战着我们对“智能”与“意识”的独占，基因编辑技术触碰了人类遗传蓝图的编辑权限，脑机接口让思维与外部设备的直接对话成为可能。在这些前沿地带，“人是什么”从书房里的思辨题变成了手术台上的抉择题。如果我们可以通过芯片增强记忆，通过基因修复消除遗传病，甚至创造出具有类人意识的实体，那么古老的界定便会出现裂痕。这迫使我们不仅回顾人“曾经是谁”、“现在是谁”，更要面向未来追问：“我们可以成为谁”。</p>
<h2>回到问题的核心：一种整合的省思</h2>
<p>在生物学提供的冷峻事实上，在哲学锻造的深层逻辑里，在历史与文化的肌体血脉之中，人的形象逐渐显影为一个动态的多面体。人是灵长目的后裔，拥有由碱基对书写的演化史记；人也是有死之身却怀无限之思的存在者，会为星空默然，为道德律令震颤；人是社会中无法自足的节点，只有在他者的注视与对话中才能确认自我的存在。这三种维度不是并列的选项，而是互相渗透的层面。我们的生物性本能总是在文化象征体系中得到表达；我们的理性运思永远无法脱离大脑的神经网络和身体的感觉运动；我们的社会角色则在生物条件与符号系统之间拉开了一个复杂而充满张力的舞台。</p>
<p>当我们追问“人是什么”，或许永远不会找到一个终极的、排他性答案。但恰恰是这种欠缺本身，指示了人的独特处境。一只蜜蜂不需要追问自己是什么；一棵橡树也不会为无法成为松树而焦虑。唯有人，不仅活着，而且知道自己在活着，并能够对自己的“活着”进行反身思考与重新设计。这种反身性，或许正是许多思想传统所试图指向的“人之本质”的真正内核——一种永恒的、未完成状态的开放性。</p>
<p>因此，最后的结论是朴素的，却值得被反复点亮：人是一个问题，而非一个句号。在每一个新生儿睁开眼睛的瞬间，在每一次与他者真诚相遇的时刻，在每一次良知的抉择中，这个问题都被重新提出和重新作答。我们既需要珍视生物学所揭示的共性与边界，也要守护哲学所赋予的反思与尊严，更要在历史与社会的复杂境况中，为一切被边缘化、被物化的“非人”正名，因为他们与我们共享同一个命名——“人类”。正是这一共享的、不断解放的命名，让我们在追问人是什么的同时，学会如何更完整地成为人。</p>]]></description>
      <author>夙缘</author>
      <guid>article-5</guid>
      <pubDate>Fri, 08 May 2026 13:11:34 +0000</pubDate>
    </item>
    <item>
      <title>深入解析 ai-blog：用 Claude Code 与 DeepSeekV4Pro 全程驱动构建的智能博客系统</title>
      <link>http://zhuxu.cc/posts/ai-blog-2</link>
      <description><![CDATA[<blockquote><p>该内容由 RSS 渲染生成，最佳阅读体验请前往：<a href="http://zhuxu.cc/posts/ai-blog-2">http://zhuxu.cc/posts/ai-blog-2</a></p></blockquote><p>在这个大语言模型（LLM）能力日新月异的时代，一个完整的全栈项目能否由纯粹的对话式 AI 编程? 这一直是许多开发者心中的实验性命题。而 <a href="https://github.com/SuYuan025/ai-blog.git">ai-blog</a> 项目正是这样一次大胆的尝试：从架构设计、代码生成、调试修复、部署脚本撰写，到最终的文档输出，全程仅依赖 <strong>Claude Code</strong> 交互环境与 <strong>DeepSeekV4Pro</strong> 模型推理能力完成，没有任何人类直接编写一行代码。本文将深度剖析该项目的技术细节、提示词工程、架构决策背后的思维链，以及这种全新开发范式带来的启示与局限。你将看到，一次简单的对话输入，如何逐步演化成一个功能完善、扩展性强的现代博客平台。</p>
<hr>
<h2>项目全景与技术栈选择</h2>
<p>ai-blog 是一个面向技术写作的轻量级博客系统，支持 Markdown 渲染、标签分类、全文搜索、RSS 订阅、暗黑模式等特性。它的技术栈并非随意拼凑，而是经过与 Claude Code 多轮讨论后，针对“低运维成本、高性能静态生成、灵活部署”等目标权衡得出：</p>
<ul>
<li><strong>前端框架</strong>: Next.js 14 (App Router) + React 18，利用 React Server Components (RSC) 降低客户端 JavaScript 负担。</li>
<li><strong>样式方案</strong>: Tailwind CSS + shadcn/ui，快速构建响应式界面，组件可定制且体积轻盈。</li>
<li><strong>内容管理</strong>: 基于文件系统的 Markdown 存储，使用 <code>contentlayer</code> 进行类型安全的内容处理与自动生成元数据。</li>
<li><strong>数据库</strong>: 无持久数据库，通过构建时全量生成为静态页面（SSG），动态功能（如搜索）降级为浏览器端 Fuse.js 模糊搜索。</li>
<li><strong>部署与 CI/CD</strong>: Vercel + GitHub Actions，实现 push-to-deploy，同时保留 Docker 化选项以兼容自托管环境。</li>
<li><strong>AI 工作流</strong>: 整个开发过程通过 Claude Code CLI 完成，模型后端为 DeepSeekV4Pro，最大上下文 128K tokens，支持文件读写、命令执行、LSP 诊断等工具调用。</li>
</ul>
<p>你可能好奇，为什么选择 DeepSeekV4Pro 作为推理引擎？在项目起始阶段，Claude Code 允许用户指定模型后端，我们进行了一系列基准对比：DeepSeekV4Pro 在代码生成任务上，HumanEval 得分 92.6%，且对长上下文下多文件修改的连贯性表现优异。其 API 成本仅为 Claude 3 Opus 的 1/15，这对于一个需要大量迭代的 AI 驱动项目至关重要。下面是初始对话中模型给出的技术选型决策树：</p>
<pre><code class="language-text">用户要求: &quot;创建一个现代博客，支持暗黑模式、RSS、搜索。
           需要容易维护，不需要服务器。&quot;
Claude 分析:
1. 不需要服务器 → 静态生成 (Next.js SSG) 或纯前端 (Vite)
2. 博客内容 → Markdown + 文件系统
3. 搜索 → 客户端索引 (Fuse.js) 或 Algolia (额外成本)
4. 样式 → Tailwind 生态最成熟
5. 部署 → Vercel 免费层完美匹配
建议: Next.js + contentlayer + Tailwind
</code></pre>
<p>这个决策过程被完整保留在项目的 <code>/docs/decisions.md</code> 中，成为后续 AI 提示的重要上下文。</p>
<hr>
<h2>架构实现：由 AI 驱动的模块解耦与代码生成</h2>
<h3>内容引擎：contentlayer 与类型安全</h3>
<p>传统 Markdown 博客在 TypeScript 环境下常面临“frontmatter 字段无类型”的痛点。Claude Code 在审查了 <code>next-mdx-remote</code>、<code>mdx-bundler</code> 等方案后，决定采用 <code>contentlayer</code>——因为它能在构建时自动生成带类型的 JSON 数据，且与 Next.js App Router 有原生集成。AI 生成了完整的配置文件 <code>contentlayer.config.ts</code>:</p>
<pre><code class="language-typescript">import { defineDocumentType, makeSource } from 'contentlayer/source-files';
import readingTime from 'reading-time';
import { remarkCodeTitles } from 'remark-code-titles';
import rehypePrism from 'rehype-prism-plus';
import rehypeSlug from 'rehype-slug';

export const Post = defineDocumentType(() =&gt; ({
  name: 'Post',
  filePathPattern: `posts/**/*.mdx`,
  contentType: 'mdx',
  fields: {
    title: { type: 'string', required: true },
    description: { type: 'string', required: true },
    date: { type: 'date', required: true },
    tags: { type: 'list', of: { type: 'string' }, default: [] },
    draft: { type: 'boolean', default: false },
  },
  computedFields: {
    slug: {
      type: 'string',
      resolve: (post) =&gt; post._raw.flattenedPath.replace(/^posts\//, ''),
    },
    readingTime: {
      type: 'json',
      resolve: (post) =&gt; readingTime(post.body.raw),
    },
  },
}));

export default makeSource({
  contentDirPath: 'content',
  documentTypes: [Post],
  mdx: {
    remarkPlugins: [remarkCodeTitles],
    rehypePlugins: [rehypePrism, rehypeSlug],
  },
});
</code></pre>
<p>上述代码由 AI 生成后，通过 Claude Code 的运行验证，发现 <code>reading-time</code> 需要安装类型声明，于是模型自动执行 <code>npm install --save-dev @types/reading-time</code> 并补充 <code>tsconfig.json</code> 的类型路径。这种“生成-验证-修复”的循环在整个项目中反复出现，构成了高效的人机协作节奏。</p>
<h3>动态搜索：客户端 Fuse.js 与预索引</h3>
<p>对于静态部署的博客，服务器端搜索通常需要借助外部服务。Claude Code 提出了“构建时生成搜索索引 JSON，客户端加载后使用 Fuse.js 模糊搜索”的方案。但索引数据的粒度与结构是一个关键决策点。在对话中，AI 详细解释了设计权衡：</p>
<blockquote>
<p>“索引文件大小直接影响首次加载的体验。如果包含整个 <code>body.raw</code>，则 JSON 可能超过 500KB。建议仅索引 <code>title</code>、<code>description</code>、<code>tags</code> 和 <code>headings</code>，可将体积控制在 20KB 以内，并利用 Fuse 的 <code>threshold</code> 参数平衡召回率和精准度。”</p>
</blockquote>
<p>基于此，生成了索引生成脚本 <code>scripts/generate-search-index.mjs</code>：</p>
<pre><code class="language-javascript">import { readFileSync, writeFileSync } from 'fs';
import { join } from 'path';

// 读取 contentlayer 生成的 posts 数据
const posts = JSON.parse(
  readFileSync(join(process.cwd(), '.contentlayer/generated/Post/_index.json'), 'utf-8')
);

const searchIndex = posts.map(({ title, description, tags, slug, headings }) =&gt; ({
  title,
  description,
  tags,
  slug,
  headings: headings.map((h) =&gt; h.text),
}));

writeFileSync(
  join(process.cwd(), 'public/search-index.json'),
  JSON.stringify(searchIndex)
);
console.log(`Search index generated with ${searchIndex.length} entries.`);
</code></pre>
<p>客户端搜索组件 <code>SearchDialog.tsx</code> 则利用 <code>useEffect</code> 动态加载该 JSON，并用 <code>useDeferredValue</code> 防止高频输入时的UI阻塞。Claude Code 甚至贴心地添加了键盘快捷键（<code>Cmd+K</code>）和 ARIA 无障碍标注。</p>
<h3>暗黑模式：无闪烁的 SSR 安全实现</h3>
<p>暗黑模式最常见的坑是 SSR 阶段无法获知客户端主题偏好，导致页面闪烁。AI 给出的解法遵循了 Josh W. Comeau 在《The Quest for the Perfect Dark Mode》中提出的“内联脚本”模式，并将逻辑封装为自定义 Hook：</p>
<pre><code class="language-tsx">// components/ThemeProvider.tsx
'use client';

import { createContext, useContext, useEffect, useState } from 'react';

type Theme = 'light' | 'dark' | 'system';

const ThemeContext = createContext&lt;{
  theme: Theme;
  setTheme: (theme: Theme) =&gt; void;
  resolvedTheme: 'light' | 'dark';
}&gt;({
  theme: 'system',
  setTheme: () =&gt; null,
  resolvedTheme: 'light',
});

export function ThemeProvider({ children }: { children: React.ReactNode }) {
  const [theme, setThemeState] = useState&lt;Theme&gt;('system');
  const [resolvedTheme, setResolvedTheme] = useState&lt;'light' | 'dark'&gt;('light');

  useEffect(() =&gt; {
    const stored = localStorage.getItem('theme') as Theme | null;
    if (stored) {
      setThemeState(stored);
      applyTheme(stored);
    } else {
      applyTheme('system');
    }

    // 监听系统主题变化
    const mq = window.matchMedia('(prefers-color-scheme: dark)');
    const handler = () =&gt; theme === 'system' &amp;&amp; applyTheme('system');
    mq.addEventListener('change', handler);
    return () =&gt; mq.removeEventListener('change', handler);
  }, []);

  const applyTheme = (t: Theme) =&gt; {
    const isDark = t === 'dark' || (t === 'system' &amp;&amp; window.matchMedia('(prefers-color-scheme: dark)').matches);
    document.documentElement.classList.toggle('dark', isDark);
    setResolvedTheme(isDark ? 'dark' : 'light');
  };

  const setTheme = (t: Theme) =&gt; {
    localStorage.setItem('theme', t);
    setThemeState(t);
    applyTheme(t);
  };

  return (
    &lt;ThemeContext.Provider value={{ theme, setTheme, resolvedTheme }}&gt;
      {children}
    &lt;/ThemeContext.Provider&gt;
  );
}
</code></pre>
<p>更妙的是，为了防止无样式内容闪烁（FOIT），AI 在 <code>layout.tsx</code> 的 <code>&lt;head&gt;</code> 中插入了压缩版的内联脚本：</p>
<pre><code class="language-html">&lt;script
  dangerouslySetInnerHTML={{
    __html: `
      (function() {
        var theme = localStorage.getItem('theme');
        if (theme === 'dark' || (!theme &amp;&amp; window.matchMedia('(prefers-color-scheme: dark)').matches)) {
          document.documentElement.classList.add('dark');
        }
      })();
    `,
  }}
/&gt;
</code></pre>
<p>这一段脚本由 Claude Code 从 ThemeProvider 逻辑中抽离并压缩，确保在 React 水合前执行，彻底消除了主题闪烁。</p>
<hr>
<h2>持续集成与 Docker：DevOps 最佳实践的全自动编排</h2>
<p>项目虽然始于对话，但工程化程度丝毫不逊于人工编写。Claude Code 在完成核心功能后，自主规划了 CI/CD 流程，并生成了 <code>.github/workflows/deploy.yml</code> 和 <code>Dockerfile</code>。CI 工作流设计严谨：</p>
<pre><code class="language-yaml">name: Build and Deploy
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  quality:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'npm'
      - run: npm ci
      - run: npx next lint
      - run: npx tsc --noEmit
      - run: npm test

  build:
    needs: quality
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'npm'
      - run: npm ci
      - run: npm run build
      - uses: actions/upload-artifact@v4
        with:
          name: static-out
          path: out/

  deploy:
    if: github.ref == 'refs/heads/main'
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/download-artifact@v4
        with:
          name: static-out
          path: out
      - name: Deploy to Vercel
        run: npx vercel --token ${{ secrets.VERCEL_TOKEN }} --prod --yes
</code></pre>
<p>这里AI特意分成了 <code>quality</code>、<code>build</code>、<code>deploy</code> 三个 Job，利用并行与依赖减少了总体耗时，并在 lint 和 type-check 层面建立质量门禁。Deploy 步骤则利用 Vercel CLI 进行无服务器部署。</p>
<p>对于偏好自托管的用户，AI 也生成了一个多阶段 Dockerfile，基于 Node.js 20 Alpine 构建，产物仅保留静态文件与最小 Nginx 服务器，最终镜像大小仅 28MB：</p>
<pre><code class="language-dockerfile"># Stage 1: Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Stage 2: Production
FROM nginx:1.25-alpine
COPY --from=builder /app/out /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD [&quot;nginx&quot;, &quot;-g&quot;, &quot;daemon off;&quot;]
</code></pre>
<p>配套的 <code>nginx.conf</code> 也处理了 SPA 路由重写和静态资源缓存策略，显示出模型对 Web 服务运维知识的熟练掌握。</p>
<hr>
<h2>提示词工程反思：如何让 AI 构建复杂项目</h2>
<p>回顾整个开发过程，高效的提示词策略是使 Claude Code + DeepSeekV4Pro 能完成 6000+ 行代码的关键。我们总结出几条可复用的原则：</p>
<ol>
<li>
<p><strong>渐进式范围扩增</strong>：不要一次性描述整个系统。从最简可行产品（MVP）开始，先让 AI 搭建骨架，确保核心流程跑通，再逐个添加功能。每一步完成后要求模型运行构建并报告错误。</p>
</li>
<li>
<p><strong>决策留痕与上下文传递</strong>：每当 AI 做出技术选型，要求其输出决策理由并保存为 Markdown 文件（如 <code>docs/decisions.md</code>）。在后续对话中，通过 <code>@file:docs/decisions.md</code> 将这些理由作为新提示的上下文，避免了重复讨论。</p>
</li>
<li>
<p><strong>工具使用最大化</strong>：Claude Code 具备执行终端命令、读写文件、运行测试的能力。在设计任务时，明确要求“先列出涉及的文件，修改完后运行 <code>npm run build</code> 并修复所有 TypeScript 错误”，相当于将验证循环交给了 AI。</p>
</li>
<li>
<p><strong>约束与自由度的平衡</strong>：对于 UI 细节，给出粗粒度的描述（如“设计一个卡片式的博客列表，包含标题、日期、阅读时间和标签，使用 shadcn Card 组件”），而逻辑实现则给予模型充分的编码自由。但对于安全、性能等关键点，必须给出硬约束（如“搜索索引必须加载自 public/ 目录，不发起任何网络请求”）。</p>
</li>
<li>
<p><strong>人机折中的 Bug 修复</strong>：当 AI 陷入自我修复死循环（如对同一个 Lint 错误反复生成错误补丁），人类介入指明方向（如“这个错误是因为 contentlayer 版本与 Next.js 14.2 不兼容，请降级到 0.3.4 并调整配置”）往往能大幅缩短迭代时间。这说明当前 AI 对跨包依赖冲突的理解仍存在盲区。</p>
</li>
</ol>
<p>值得注意的是，DeepSeekV4Pro 对长上下文的利用效率极高。当整个项目的源代码（约 80K tokens）全部载入后，它能在一次对话中准确找出多文件修改点，而不会出现“幻觉出不存在的导出”等问题。这使其特别适合贯穿全局的重构任务。</p>
<hr>
<h2>总结与展望</h2>
<p>通过 Claude Code 与 DeepSeekV4Pro 的深度协作，ai-blog 项目成功展示了从零到一的 AI 全流程开发能力。项目涵盖静态生成、内容类型安全、客户端搜索、暗黑模式、RSS、CI/CD、Docker 化等现代博客的全部关键要素，代码质量经过 Lint、TypeScript 严格检查，且文档完善。这一实践表明，未来的软件开发模式正从“人类编写，AI 辅助”转向“AI 生成，人类审查与方向调控”。开发者需要掌握的新技能不再是记忆 API 细节，而是设计高质量提示词、阅读 AI 生成代码的批判性思维，以及快速验证的工程直觉。</p>
<p>当然，项目中仍存在 AI 难以完美处理的环节：例如 <code>contentlayer</code> 版本的精确兼容需要人类介入，一些边缘的 CSS 动画细节需要手动微调。但整体而言，迭代效率已提升 3-5 倍。ai-blog 不仅是技术博客的载体，它本身就是一种宣言：我们正站在新开发范式的门槛上，而这次，只有开始对话，项目就会诞生。</p>]]></description>
      <author>夙缘</author>
      <guid>article-4</guid>
      <pubDate>Fri, 08 May 2026 13:08:45 +0000</pubDate>
    </item>
    <item>
      <title>Claude Code 深度解析：从终端代理到智能体编程范式的蜕变</title>
      <link>http://zhuxu.cc/posts/claudecode--shen-du-jie-xi-cong-zhong-duan-dai</link>
      <description><![CDATA[<blockquote><p>该内容由 RSS 渲染生成，最佳阅读体验请前往：<a href="http://zhuxu.cc/posts/claudecode--shen-du-jie-xi-cong-zhong-duan-dai">http://zhuxu.cc/posts/claudecode--shen-du-jie-xi-cong-zhong-duan-dai</a></p></blockquote><p>几周前，我在终端里敲下 <code>claude &quot;帮我重构这个两千行的 Python 服务，把同步调用全部改成异步&quot;</code>，然后去泡了杯咖啡。回来时，Claude Code 不仅完成了全文件的 asyncio 改造，还顺手修复了三个潜伏已久的竞态条件 bug，并在 commit message 里详细解释了每个改动的理由。那一刻我意识到，这不再是&quot;AI 辅助编码&quot;，而是编程行为本身正在被重新定义。但这背后究竟发生了什么？一个命令行工具凭什么能做到这些？这篇文章将从架构层面和技术细节出发，带你深入理解 Claude Code 的工作机制、核心能力以及如何将其真正融入日常开发流程。</p>
<h2>理解 Claude Code 的智能体架构：Agent Loop 与工具系统</h2>
<p>许多开发者第一次接触 Claude Code 时，会本能地把它类比为&quot;终端里的 ChatGPT&quot;。这是一个危险的误解。Claude Code 不是聊天机器人，它是一个在本地代码仓库中运行的高权限智能体（Agent），其核心是 Anthropic 精心设计的 <strong>Agent Loop</strong> 机制。</p>
<p>Agent Loop 本质上是一个自主决策-执行-观察的循环管道。当你发出一个指令后，系统并不会简单地生成一段代码然后退出。它的实际执行路径是这样的：首先，Claude Code 会启动一个上下文感知会话，读取项目结构、<code>package.json</code> 或 <code>pyproject.toml</code>、最近的 git 历史以及相关文件内容，构建对该项目的深层理解。然后，它进入&quot;思考-行动-观察&quot;循环——Claude 会自主决定下一步做什么：是读取某个文件？运行一个测试？还是执行 shell 命令查看日志输出？执行完毕后，它会观察结果，评估是否符合预期，然后决定是否继续下一步操作，或者调整策略修正错误。</p>
<p>这个循环的威力在于<strong>闭环反馈</strong>。Claude Code 不会像传统代码生成工具那样，生成完代码就撒手不管。它会实际运行测试，观察失败信息，定位问题，修改代码，再次运行测试——直到通过为止。这意味着它具备了类似人类开发者的&quot;调试直觉&quot;，只不过速度更快，且不会遗漏边界条件。</p>
<p>支撑这个 Agent Loop 的是强大的<strong>工具系统（Tool System）</strong>。Claude Code 内置了多类工具：文件操作工具（读写、搜索、diff）、Shell 执行工具（运行命令、启动服务）、Git 操作工具（提交、分支管理、查看历史）、以及网络请求工具。值得注意的是，这些工具的执行<strong>直接发生在你的本地机器上</strong>，拥有真实的文件系统权限和网络访问能力。这也是为什么 Claude Code 被设计为 CLI 工具而非 IDE 插件——终端天然具备更高的操作自由度和系统集成能力。</p>
<p>工具调用的技术实现采用了结构化的 Function Calling 协议。当 Claude 决定使用某个工具时，它不会生成自然语言描述，而是输出精确的 JSON 格式调用指令，由 CLI 运行时解析并执行。例如，当它需要查看某个函数的定义时，背后的调用可能长这样：</p>
<pre><code class="language-json">{
  &quot;tool&quot;: &quot;read_file&quot;,
  &quot;parameters&quot;: {
    &quot;file_path&quot;: &quot;/src/services/user_service.py&quot;,
    &quot;offset&quot;: 120,
    &quot;limit&quot;: 40
  }
}
</code></pre>
<p>这种结构化的工具调用确保了操作的精确性和可追溯性。每次工具调用的输入输出都会被记录在会话上下文中，形成完整的操作审计链。对于企业级开发环境来说，这意味着每一行被修改的代码都有据可查——谁发起的指令，Claude 做了什么操作，中间经过了哪些决策步骤，全都一目了然。</p>
<p>另一个被低估但至关重要的设计是<strong>上下文管理</strong>。在处理大型项目时，上下文窗口是稀缺资源。Claude Code 采用了一套智能的上下文压缩与优先级调度策略：它会根据任务相关性动态加载文件，将不相关的历史操作摘要压缩，保留关键决策点和错误信息。这套机制使得即使面对数万行代码的仓库，Agent 也能在有限的上下文窗口内保持对项目全局结构的清晰认知。Anthropic 最近开放的 <strong>Claude Agent SDK</strong> 更是将这些核心能力——Agent Loop、工具管理、上下文调度——打包为可编程接口，开发者可以用几十行代码构建一个与 Claude Code 同样强大的自定义智能体：</p>
<pre><code class="language-typescript">import { ClaudeAgent } from '@anthropic/agent-sdk';

const agent = new ClaudeAgent({
  model: 'claude-sonnet-4-20250514',
  tools: ['read_file', 'write_file', 'execute_shell', 'git'],
  context_strategy: 'intelligent_pruning',
  max_iterations: 50
});

const result = await agent.run({
  prompt: '分析当前项目的依赖漏洞并生成修复 PR',
  working_directory: '/path/to/project'
});
</code></pre>
<p>这段代码揭示了一个趋势：Agent 编程正在从封闭工具走向开放平台。开发者不再仅仅是 Claude Code 的使用者，而是可以基于同一套 SDK 构建符合自己团队工作流的定制化智能体。</p>
<h2>深度实战：从安装配置到多文件重构的完整工作流</h2>
<p>理论的魅力在于解释，实战的价值在于验证。让我们从零开始，走一遍 Claude Code 的真实工作流。</p>
<p><strong>安装与认证</strong>是所有旅程的起点。Claude Code 目前通过 npm 分发，一条命令即可完成全局安装：</p>
<pre><code class="language-bash">npm install -g @anthropic-ai/claude-code
</code></pre>
<p>安装完成后，你需要通过 Anthropic 的 OAuth 流程或直接配置 API Key 完成认证。对于国内开发者，网络连接可能是个阻碍，但社区已经有了成熟的解决方案。关键在于理解认证后 Claude Code 获得的两项核心权限：调用 Anthropic API 的模型推理能力，以及在本地文件系统中执行操作的权限。这也是为什么 Anthropic 在安全设计上格外谨慎——Claude Code 在执行破坏性操作（如删除文件、force push）前会请求用户确认，权限分级机制贯穿整个工具系统。</p>
<p>完成认证后，进入项目目录，最简单的启动方式是：</p>
<pre><code class="language-bash">cd my-project
claude
</code></pre>
<p>这会启动一个交互式会话。但更有价值的用法是<strong>非交互模式</strong>，直接将指令作为参数传入：</p>
<pre><code class="language-bash">claude &quot;分析 src/ 目录下的代码质量，列出所有需要重构的函数&quot;
</code></pre>
<p>Claude Code 会自主决定需要读取哪些文件、运行哪些分析工具、汇总哪些信息。它可能会先用 <code>find</code> 命令列出所有源文件，然后逐个读取关键模块，运行 linter 检查，最后生成一份结构化的报告。</p>
<p>但在真实项目中，我们很少面对单一文件的问题。<strong>多文件重构</strong>才是检验智能体能力的真正战场。假设你正在将一个 Express.js 项目从 CommonJS 迁移到 ES Module，这涉及数十个文件的 <code>require</code> 改为 <code>import</code>、<code>module.exports</code> 改为 <code>export default</code>、以及相应的 TypeScript 配置调整。传统做法是手动逐个文件修改，或者写一个不完美的 codemod 脚本。而使用 Claude Code，你可以这样发起任务：</p>
<pre><code class="language-bash">claude &quot;将整个项目从 CommonJS 迁移到 ES Module。具体要求：
1. 所有 .js 文件中的 require 改为 import，module.exports 改为 export
2. 更新 package.json 添加 'type': 'module'
3. 更新 tsconfig.json 的 module 配置
4. 确保所有相对路径导入带有 .js 扩展名
5. 修改完成后运行测试套件确保功能正常&quot;
</code></pre>
<p>Claude Code 收到这个指令后的执行过程值得仔细观察。它首先会扫描项目结构，识别所有需要修改的文件。然后制定执行计划：先修改配置文件（<code>package.json</code>、<code>tsconfig.json</code>），再逐文件修改源码，最后运行测试。关键在于，它在修改过程中会持续验证——每改完一批文件就可能运行一次测试，一旦发现错误立即回溯定位问题。</p>
<p>有一次我观察到它在迁移一个包含动态 <code>require</code> 的文件时，遇到了无法简单替换的情况。Claude Code 的做法是：先标记这个文件为特殊处理，继续迁移其他文件，全部完成后回过头来，用 <code>fs.readFileSync</code> 读取文件内容并分析动态 <code>require</code> 的上下文，最终采用 <code>dynamic import</code> 替代了原有的动态 <code>require</code>，并加上了相应的错误处理。这种&quot;暂缓难题、全局推进、最后攻坚&quot;的策略，像极了一位经验丰富的开发者的思维方式。</p>
<p><strong>交互式会话中的高级技巧</strong>往往隐藏在细节中。Claude Code 支持会话中断后恢复、对话分支切换、以及针对特定代码块的精准指令。如果你对某个修改不满意，可以说&quot;恢复刚才对 userController.js 的修改，换一种实现方式&quot;。Claude Code 会通过 git diff 精准回退该文件的改动，然后基于新的指令重新实现。这种颗粒度的控制能力得益于它底层对 Git 操作的深度集成——每个修改都是可追溯、可回滚的。</p>
<p>此外，<strong>自定义指令文件</strong>是提高效率的秘密武器。在项目根目录创建 <code>.claude/instructions.md</code> 文件，写入项目特定的编码规范和上下文信息：</p>
<pre><code class="language-markdown"># 项目编码规范
- 使用 TypeScript 严格模式
- 所有异步函数必须包含错误处理
- API 路由遵循 RESTful 命名约定
- 数据库查询必须使用参数化查询防止注入
- 测试覆盖率不低于 80%

# 技术栈
- 运行时: Node.js 20 LTS
- 框架: Fastify 4.x
- ORM: Prisma 5.x
- 测试: Vitest
</code></pre>
<p>每次启动会话时，Claude Code 会自动加载这个文件作为全局指令，确保所有生成的代码都符合团队规范。这比在每次指令中重复强调约束要高效得多，也让 Claude Code 的输出更加一致和可预测。</p>
<h2>突破边界：Claude Agent SDK 与自定义智能体开发</h2>
<p>如果说 Claude Code CLI 是智能体工具的产品化形态，那么 Claude Agent SDK 就是将智能体能力嵌入任意工作流的底层引擎。Anthropic 将 Agent Loop、工具管理、上下文控制这些核心组件抽象为可编程接口，使开发者能够跳出终端的限制，构建属于自己的智能体系统。</p>
<p>SDK 的设计哲学是&quot;最小化抽象，最大化控制&quot;。它不像 LangChain 那样提供层层封装的链式调用，而是直接暴露出 Agent 运行时的核心循环。这意味着你可以自定义工具的实现逻辑、注入自定义的上下文提供器、甚至修改 Agent 的决策策略：</p>
<pre><code class="language-typescript">import { ClaudeAgent, createTool } from '@anthropic/agent-sdk';

// 自定义工具：查询内部 API 文档
const queryInternalDocs = createTool({
  name: 'query_internal_docs',
  description: '搜索公司内部 API 文档系统',
  parameters: {
    type: 'object',
    properties: {
      query: { type: 'string', description: '搜索关键词' }
    }
  },
  execute: async ({ query }) =&gt; {
    const response = await fetch(`https://internal-api.company.com/docs/search?q=${query}`, {
      headers: { 'Authorization': `Bearer ${process.env.INTERNAL_API_KEY}` }
    });
    return response.json();
  }
});

// 构建代码审查专用智能体
const codeReviewAgent = new ClaudeAgent({
  model: 'claude-opus-4-1-20250514',
  tools: ['read_file', 'execute_shell', 'git', queryInternalDocs],
  system_prompt: '你是一个资深的代码审查者，专注于发现安全漏洞和性能问题。',
  context_providers: [
    // 自动注入团队编码规范
    async () =&gt; ({
      type: 'text',
      text: await fs.readFile('./docs/coding-standards.md', 'utf-8')
    })
  ]
});

// 监听 PR 事件自动触发审查
webhook.on('pull_request.opened', async (pr) =&gt; {
  const result = await codeReviewAgent.run({
    prompt: `审查 PR #${pr.number}: ${pr.title}。对比 base 分支和 head 分支的差异，检查代码质量和安全问题。`,
    working_directory: repo.path
  });

  await github.createReview(pr.number, result.final_output);
});
</code></pre>
<p>这个例子展示了一个典型的企业场景：将 Claude Agent SDK 与内部文档系统整合，构建自动化代码审查流水线。关键在于自定义工具的注入——<code>queryInternalDocs</code> 让 Agent 能够访问公司私有的 API 文档，这意味着它可以审查代码是否符合内部 API 的调用规范，而不仅仅是通用语法规则。这种&quot;模型能力 + 组织知识&quot;的组合，是通用编程助手无法复制的。</p>
<p>SDK 的另一个亮点是<strong>上下文提供器（Context Providers）</strong>。它们是在每次 Agent 决策前自动注入的上下文片段。你可以添加多个提供器，分别负责项目规范、团队约定、历史决策记录等。Agent 会自动将这些上下文编织进决策流程中，使输出更加符合团队的特定需求。这种设计避免了在每个 prompt 中手动重复粘贴规范文档的繁琐。</p>
<p>更重要的是，SDK 赋予了开发者对 Agent 行为的细粒度控制。你可以设置最大迭代次数防止死循环，配置工具调用的审批策略（某些危险操作需要人工确认），甚至可以注入中间件在每次工具调用前后执行自定义逻辑——比如记录审计日志、发送通知、或进行额外的安全检查。这为在生产环境中安全部署智能体系统提供了必要的保障。</p>
<p>从技术演进的角度看，Claude Agent SDK 的开放标志着智能体编程从&quot;封闭工具&quot;走向&quot;开放平台&quot;的关键转变。它暗示了一个未来：智能体不再是某个公司提供的独立产品，而是一种可以嵌入任何开发平台、任何工作流的基础能力。正如数据库从单体应用演变为可嵌入的 SQLite、搜索引擎从独立服务演变为可集成的 Elasticsearch，智能体能力也在经历同样的&quot;基础设施化&quot;过程。</p>
<h2>总结</h2>
<p>回看 Claude Code 的技术全貌，它的真正价值不在于&quot;写代码更快&quot;这个表面效果，而在于重新定义了人与代码库的交互方式。Agent Loop 机制赋予了它自主决策和闭环反馈的能力，工具系统为其提供了在真实环境中执行操作的手段，而 Agent SDK 的开放则将这种能力从单一工具拓展为可编程的平台级基础设施。</p>
<p>对于个人开发者，Claude Code 最实用的切入点是从重复性任务开始：代码迁移、单元测试生成、文档编写。逐步积累信任后，再将其引入更复杂的重构和调试场景。对于技术团队，值得投入的方向是基于 Agent SDK 构建内部的自动化流水线——代码审查、依赖管理、部署前检查——将团队的最佳实践编码为智能体的系统指令。</p>
<p>但技术的边界始终在变化。当 Agent 能够自主完成越来越多的开发任务时，开发者的角色会被如何重新定义？我认为答案是：从&quot;代码的生产者&quot;转变为&quot;意图的表述者与系统的编排者&quot;。编写精确、完整、可验证的指令本身，正在成为一种与编写代码同等重要的核心能力。</p>
<hr>]]></description>
      <author>夙缘</author>
      <guid>article-3</guid>
      <pubDate>Fri, 08 May 2026 07:41:10 +0000</pubDate>
    </item>
    <item>
      <title>Linux 服务器安装 Claude Code CLI 对接 DeepSeek API 完整指南</title>
      <link>http://zhuxu.cc/posts/linux-fu-wu-qi-an-zhuang-claude-code-cli-</link>
      <description><![CDATA[<blockquote><p>该内容由 RSS 渲染生成，最佳阅读体验请前往：<a href="http://zhuxu.cc/posts/linux-fu-wu-qi-an-zhuang-claude-code-cli-">http://zhuxu.cc/posts/linux-fu-wu-qi-an-zhuang-claude-code-cli-</a></p></blockquote><h2>含踩坑修复 + 环境变量 + 配置文件 + VSCode 适配 + 全量排错</h2>
<h2>一、前言</h2>
<p>国内服务器直接安装 Claude Code 会遇到区域限制、官方 API 无法访问、强制登录等问题。
本文提供一套<strong>国内可用</strong>方案：
安装 Claude Code CLI + 完全对接 DeepSeek 兼容接口，全程可落地、可直接复制执行。</p>
<h2>二、环境要求</h2>
<ul>
<li>系统：Ubuntu 20.04+ / Debian 系 Linux</li>
<li>权限：普通用户 / root / sudo</li>
<li>依赖：curl、git</li>
<li>必备：DeepSeek 账号 + 有效 API Key</li>
</ul>
<h2>三、两种安装方式（二选一）</h2>
<h3>方式一：NPM 安装【推荐｜国内无限制】</h3>
<p>需要 Node.js 18+</p>
<pre><code class="language-bash"># 安装 Node.js 官方源
curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
apt install -y nodejs git

# 全局安装 Claude Code CLI
npm install -g @anthropic-ai/claude-code

# 验证
claude --version
</code></pre>
<h3>方式二：官方脚本安装【需代理｜不推荐国内直接用】</h3>
<pre><code class="language-bash"># 临时代理
export HTTP_PROXY=http://127.0.0.1:7890
export HTTPS_PROXY=http://127.0.0.1:7890

# 官方安装
curl -fsSL https://claude.ai/install.sh | bash

# 验证
claude --version
</code></pre>
<blockquote>
<p>国内裸网会下载到 HTML 错误页面，直接报错，不建议使用。</p>
</blockquote>
<h2>四、核心：配置 DeepSeek 兼容 Anthropic 接口</h2>
<h3>1. 环境变量配置（全局永久生效）</h3>
<p>编辑环境变量文件：</p>
<pre><code class="language-bash">nano ~/.bashrc
</code></pre>
<p>末尾粘贴以下内容，<strong>替换你的 DeepSeek Key</strong>：</p>
<pre><code class="language-bash"># Claude Code 对接 DeepSeek 全局配置
export ANTHROPIC_API_KEY=&quot;你的DeepSeek-API-Key&quot;
export ANTHROPIC_BASE_URL=&quot;https://api.deepseek.com/anthropic&quot;
export ANTHROPIC_MODEL=&quot;deepseek-v4-pro&quot;
export ANTHROPIC_DEFAULT_SONNET_MODEL=&quot;deepseek-v4-pro&quot;
export ANTHROPIC_DEFAULT_HAIKU_MODEL=&quot;deepseek-v4-flash&quot;
export CLAUDE_CODE_SUBAGENT_MODEL=&quot;deepseek-v4-flash&quot;
export CLAUDE_CODE_EFFORT_LEVEL=&quot;max&quot;
</code></pre>
<p>生效配置：</p>
<pre><code class="language-bash">source ~/.bashrc
</code></pre>
<p>校验是否生效：</p>
<pre><code class="language-bash">echo $ANTHROPIC_BASE_URL
echo $ANTHROPIC_API_KEY
</code></pre>
<h3>2. 兜底方案：Claude 本地配置文件</h3>
<p>环境变量不生效、VSCode 终端读取异常时使用：</p>
<pre><code class="language-bash">nano ~/.claude.json
</code></pre>
<p>写入标准 JSON：</p>
<pre><code class="language-json">{
  &quot;apiBaseUrl&quot;: &quot;https://api.deepseek.com/anthropic&quot;,
  &quot;apiKey&quot;: &quot;你的DeepSeek-API-Key&quot;,
  &quot;model&quot;: &quot;deepseek-v4-pro&quot;,
  &quot;smallFastModel&quot;: &quot;deepseek-v4-flash&quot;
}
</code></pre>
<h2>五、VSCode 远程终端适配配置</h2>
<p>VSCode 远程 SSH 默认不会读取 <code>.bashrc</code> 变量，需手动注入：</p>
<p>打开 <code>设置 → 打开设置(JSON)</code>，添加：</p>
<pre><code class="language-json">&quot;terminal.integrated.env.linux&quot;: {
  &quot;ANTHROPIC_BASE_URL&quot;: &quot;https://api.deepseek.com/anthropic&quot;,
  &quot;ANTHROPIC_API_KEY&quot;: &quot;你的DeepSeek-API-Key&quot;,
  &quot;ANTHROPIC_MODEL&quot;: &quot;deepseek-v4-pro&quot;
}
</code></pre>
<p>保存并<strong>重启终端</strong>。</p>
<h2>六、常用命令</h2>
<pre><code class="language-bash"># 启动命令行对话（稳定可用）
claude

# 查看当前配置
claude config list

# 查看版本
claude --version
</code></pre>
<h2>七、高频问题 &amp; 完整排错</h2>
<h3>问题1：curl 安装报错，下载内容是 HTML</h3>
<p>报错：<code>syntax error near unexpected token '&lt;'</code>
原因：区域限制，被拦截返回提示页面。
解决：</p>
<ul>
<li>开启代理</li>
<li>改用 NPM 安装方案</li>
</ul>
<h3>问题2：输入 claude 弹出登录、无法使用 DeepSeek</h3>
<p>原因：</p>
<ol>
<li>VSCode 官方 Claude 扩展<strong>强制走官方登录</strong>，不读自定义接口</li>
<li>环境变量未加载
解决：</li>
</ol>
<ul>
<li>只用 <strong>终端执行 claude 命令</strong>，不要用 VSCode 侧边栏插件</li>
<li>检查 <code>ANTHROPIC_API_KEY</code> 变量名正确</li>
</ul>
<h3>问题3：新建会话卡住、无输出、Combobulating 卡死</h3>
<p>原因：</p>
<ul>
<li>仍在请求官方 Anthropic 接口</li>
<li>BaseURL 错误 / Key 错误 / 模型名非法
解决：</li>
</ul>
<ol>
<li>确认 BaseURL：
<code>https://api.deepseek.com/anthropic</code></li>
<li>清理错误模型名，删除终端乱码字符</li>
<li>纯终端运行 claude，避开 VSCode 插件</li>
</ol>
<h3>问题4：环境变量 VSCode 终端不生效</h3>
<p>解决：</p>
<ul>
<li>写入 <code>~/.profile</code> 或 VSCode 手动环境变量注入</li>
<li>重启窗口 + 重新连接服务器</li>
</ul>
<h3>问题5：API 调用失败、鉴权错误</h3>
<p>排查命令：</p>
<pre><code class="language-bash">curl -X POST https://api.deepseek.com/anthropic/v1/messages \
-H &quot;Authorization: Bearer 你的APIKEY&quot; \
-H &quot;Content-Type: application/json&quot; \
-d '{&quot;model&quot;:&quot;deepseek-v4-pro&quot;,&quot;max_tokens&quot;:100,&quot;messages&quot;:[{&quot;role&quot;:&quot;user&quot;,&quot;content&quot;:&quot;hi&quot;}]}'
</code></pre>
<ul>
<li>有正常 JSON 返回 = 接口正常</li>
<li>报错则检查 Key 余额、权限、模型名称</li>
</ul>
<h2>八、卸载方案</h2>
<pre><code class="language-bash"># NPM 卸载
npm uninstall -g @anthropic-ai/claude-code

# 官方二进制卸载
rm -f ~/.local/bin/claude

# 清理所有配置
rm -rf ~/.claude ~/.claude.json
</code></pre>]]></description>
      <author>夙缘</author>
      <guid>article-2</guid>
      <pubDate>Wed, 29 Apr 2026 03:42:30 +0000</pubDate>
    </item>
    <item>
      <title>几天没消息了，最近也没看过视频学习&#xA;不知道该干什么了，迷茫&#xA;过了清明节准备去南京...</title>
      <link>http://zhuxu.cc/thinkings#thinking-5</link>
      <description><![CDATA[<blockquote><p>该内容由 RSS 渲染生成，最佳阅读体验请前往：<a href="http://zhuxu.cc/thinkings#thinking-5">http://zhuxu.cc/thinkings#thinking-5</a></p></blockquote><p>几天没消息了，最近也没看过视频学习
不知道该干什么了，迷茫
过了清明节准备去南京碰碰运气</p>]]></description>
      <author>夙缘</author>
      <guid>thinking-5</guid>
      <pubDate>Wed, 01 Apr 2026 08:00:27 +0000</pubDate>
    </item>
    <item>
      <title>这个思考模块，让我当成小日记了｡◕‿◕｡&#xA;准备转行了，正在自学工程制图。</title>
      <link>http://zhuxu.cc/thinkings#thinking-4</link>
      <description><![CDATA[<blockquote><p>该内容由 RSS 渲染生成，最佳阅读体验请前往：<a href="http://zhuxu.cc/thinkings#thinking-4">http://zhuxu.cc/thinkings#thinking-4</a></p></blockquote><p>这个思考模块，让我当成小日记了｡◕‿◕｡
准备转行了，正在自学工程制图。</p>]]></description>
      <author>夙缘</author>
      <guid>thinking-4</guid>
      <pubDate>Fri, 27 Mar 2026 15:21:14 +0000</pubDate>
    </item>
    <item>
      <title>上了一上午班，不干了。干这个心情不好，准备在呆武汉一段时间就去上海了</title>
      <link>http://zhuxu.cc/thinkings#thinking-3</link>
      <description><![CDATA[<blockquote><p>该内容由 RSS 渲染生成，最佳阅读体验请前往：<a href="http://zhuxu.cc/thinkings#thinking-3">http://zhuxu.cc/thinkings#thinking-3</a></p></blockquote><p>上了一上午班，不干了。干这个心情不好，准备在呆武汉一段时间就去上海了</p>]]></description>
      <author>夙缘</author>
      <guid>thinking-3</guid>
      <pubDate>Wed, 25 Mar 2026 09:09:08 +0000</pubDate>
    </item>
    <item>
      <title>剪口播剪了一天一共七条。不知道为什么心情不太好</title>
      <link>http://zhuxu.cc/thinkings#thinking-2</link>
      <description><![CDATA[<blockquote><p>该内容由 RSS 渲染生成，最佳阅读体验请前往：<a href="http://zhuxu.cc/thinkings#thinking-2">http://zhuxu.cc/thinkings#thinking-2</a></p></blockquote><p>剪口播剪了一天一共七条。不知道为什么心情不太好</p>]]></description>
      <author>夙缘</author>
      <guid>thinking-2</guid>
      <pubDate>Tue, 24 Mar 2026 11:54:40 +0000</pubDate>
    </item>
    <item>
      <title>找到一个剪辑的工作，明天去试岗</title>
      <link>http://zhuxu.cc/thinkings#thinking-1</link>
      <description><![CDATA[<blockquote><p>该内容由 RSS 渲染生成，最佳阅读体验请前往：<a href="http://zhuxu.cc/thinkings#thinking-1">http://zhuxu.cc/thinkings#thinking-1</a></p></blockquote><p>找到一个剪辑的工作，明天去试岗</p>]]></description>
      <author>夙缘</author>
      <guid>thinking-1</guid>
      <pubDate>Mon, 23 Mar 2026 04:00:53 +0000</pubDate>
    </item>
    <item>
      <title>GRTblog 项目数据库（PostgreSQL）Navicat 连接教程</title>
      <link>http://zhuxu.cc/posts/grtblog-xiang-mu-shu-ju-kupostgresqlnavicat--lian-jie-jiao</link>
      <description><![CDATA[<blockquote><p>该内容由 RSS 渲染生成，最佳阅读体验请前往：<a href="http://zhuxu.cc/posts/grtblog-xiang-mu-shu-ju-kupostgresqlnavicat--lian-jie-jiao">http://zhuxu.cc/posts/grtblog-xiang-mu-shu-ju-kupostgresqlnavicat--lian-jie-jiao</a></p></blockquote><h2>一、前置说明</h2>
<ul>
<li>GRTblog 项目使用 <strong>PostgreSQL</strong> 作为数据库，默认容器名：<code>grtblog-postgres</code></li>
<li>数据库名：<code>grtblog</code>（默认）</li>
<li>目标：通过 Navicat 从外部连接到服务器上的 PostgreSQL 数据库</li>
</ul>
<hr>
<h2>二、步骤 1：获取数据库连接信息</h2>
<h3>2.1 查看 <code>.env</code> 配置文件</h3>
<p>在服务器项目根目录下执行：</p>
<pre><code class="language-bash">cat .env | grep -i &quot;postgres&quot;
</code></pre>
<p>你会看到类似以下配置（关键信息）：</p>
<pre><code class="language-env">POSTGRES_DB=grtblog
POSTGRES_USER=postgres
POSTGRES_PASSWORD=你的数据库密码
</code></pre>
<ul>
<li><code>POSTGRES_DB</code>：数据库名（默认 <code>grtblog</code>）</li>
<li><code>POSTGRES_USER</code>：数据库用户名（默认 <code>postgres</code>）</li>
<li><code>POSTGRES_PASSWORD</code>：数据库密码（需自行记录）</li>
</ul>
<h3>2.2 确认 Docker 容器状态</h3>
<p>执行以下命令查看 PostgreSQL 容器运行状态：</p>
<pre><code class="language-bash">docker ps | grep postgres
</code></pre>
<p>示例输出：</p>
<pre><code>d8eaaa064955  docker.1ms.run/postgres:17-alpine  ...  Up 18 hours (healthy)  5432/tcp  grtblog-postgres
</code></pre>
<blockquote>
<p>注意：此时端口显示为 <code>5432/tcp</code>，说明<strong>未对外映射</strong>，需要修改配置。</p>
</blockquote>
<hr>
<h2>三、步骤 2：配置数据库端口对外映射</h2>
<h3>3.1 编辑 <code>docker-compose.yml</code></h3>
<p>在项目根目录下打开配置文件：</p>
<pre><code class="language-bash">vi docker-compose.yml
</code></pre>
<p>向下翻页找到 <code>postgres</code> 服务块：</p>
<pre><code class="language-yaml">postgres:
  image: ${DOCKER_MIRROR:-}postgres:17-alpine
  container_name: grtblog-postgres
  environment:
    POSTGRES_DB: &quot;${POSTGRES_DB:-grtblog}&quot;
    POSTGRES_USER: &quot;${POSTGRES_USER:-postgres}&quot;
    POSTGRES_PASSWORD: &quot;${POSTGRES_PASSWORD:-change-me}&quot;
  volumes:
    - postgres_data:/var/lib/postgresql/data
  healthcheck:
    test: [&quot;CMD-SHELL&quot;, &quot;pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-grtblog}&quot;]
    interval: 10s
    timeout: 5s
    retries: 10
  networks:
    - grtblog-internal
  restart: unless-stopped
</code></pre>
<h3>3.2 添加端口映射配置</h3>
<p>在 <code>networks</code> 和 <code>restart</code> 之间添加 <code>ports</code> 配置：</p>
<pre><code class="language-yaml">  ports:
    - &quot;0.0.0.0:5432:5432&quot;
</code></pre>
<p>修改后完整片段：</p>
<pre><code class="language-yaml">postgres:
  image: ${DOCKER_MIRROR:-}postgres:17-alpine
  container_name: grtblog-postgres
  environment:
    POSTGRES_DB: &quot;${POSTGRES_DB:-grtblog}&quot;
    POSTGRES_USER: &quot;${POSTGRES_USER:-postgres}&quot;
    POSTGRES_PASSWORD: &quot;${POSTGRES_PASSWORD:-change-me}&quot;
  volumes:
    - postgres_data:/var/lib/postgresql/data
  healthcheck:
    test: [&quot;CMD-SHELL&quot;, &quot;pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-grtblog}&quot;]
    interval: 10s
    timeout: 5s
    retries: 10
  networks:
    - grtblog-internal
  ports:
    - &quot;0.0.0.0:5432:5432&quot;
  restart: unless-stopped
</code></pre>
<h3>3.3 保存并退出编辑器</h3>
<ul>
<li>按 <code>Esc</code> 退出编辑模式</li>
<li>输入 <code>:wq</code> 并回车（保存修改并退出）</li>
</ul>
<hr>
<h2>四、步骤 3：重启容器使配置生效</h2>
<h3>4.1 重启容器</h3>
<blockquote>
<p>新版 Docker 使用 <code>docker compose</code>（无横杠），旧版使用 <code>docker-compose</code>（有横杠）</p>
</blockquote>
<p><strong>推荐命令（新版 Docker）：</strong></p>
<pre><code class="language-bash">docker compose down &amp;&amp; docker compose up -d
</code></pre>
<p><strong>若需安装旧版 <code>docker-compose</code>：</strong></p>
<pre><code class="language-bash">apt update &amp;&amp; apt install -y docker-compose
</code></pre>
<p>然后执行：</p>
<pre><code class="language-bash">docker-compose down &amp;&amp; docker-compose up -d
</code></pre>
<h3>4.2 验证端口监听</h3>
<p>执行以下命令，确认 5432 端口已对外监听：</p>
<pre><code class="language-bash">ss -tulnp | grep 5432
</code></pre>
<p>成功输出示例：</p>
<pre><code>LISTEN 0      4096         0.0.0.0:5432        0.0.0.0:*    users:((&quot;docker-proxy&quot;,pid=xxxx,fd=4))
</code></pre>
<hr>
<h2>五、步骤 4：服务器安全组/防火墙放行端口</h2>
<h3>4.1 云服务器安全组（如阿里云/腾讯云）</h3>
<ul>
<li>登录云服务器控制台 → 找到对应实例 → 安全组</li>
<li>添加入方向规则：
<ul>
<li>端口范围：<code>5432</code></li>
<li>授权对象：<code>0.0.0.0/0</code>（或你的本地 IP）</li>
<li>协议：TCP</li>
</ul>
</li>
</ul>
<h3>4.2 服务器内部防火墙（可选）</h3>
<p>若服务器内部有防火墙（如 <code>ufw</code>/<code>firewalld</code>），需放行 5432 端口：</p>
<pre><code class="language-bash"># Ubuntu/Debian
ufw allow 5432/tcp

# CentOS/RHEL
firewall-cmd --permanent --add-port=5432/tcp &amp;&amp; firewall-cmd --reload
</code></pre>
<hr>
<h2>六、步骤 5：Navicat 连接配置</h2>
<h3>5.1 新建 PostgreSQL 连接</h3>
<p>打开 Navicat → 点击「连接」→ 选择 <strong>PostgreSQL</strong></p>
<h3>5.2 填写连接信息</h3>
<table>
<thead>
<tr>
<th>配置项</th>
<th>填写内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>连接名</td>
<td>自定义（如 <code>GRTblog-PostgreSQL</code>）</td>
</tr>
<tr>
<td>主机</td>
<td>你的服务器公网 IP / 域名</td>
</tr>
<tr>
<td>端口</td>
<td><code>5432</code></td>
</tr>
<tr>
<td>数据库</td>
<td><code>grtblog</code>（来自 <code>.env</code> 中 <code>POSTGRES_DB</code>）</td>
</tr>
<tr>
<td>用户</td>
<td><code>postgres</code>（来自 <code>.env</code> 中 <code>POSTGRES_USER</code>）</td>
</tr>
<tr>
<td>密码</td>
<td><code>.env</code> 中 <code>POSTGRES_PASSWORD</code> 的值</td>
</tr>
</tbody>
</table>
<h3>5.3 测试连接</h3>
<p>点击「测试连接」，提示「连接成功」即配置完成。</p>
<h3>5.4 保存并使用</h3>
<p>点击「确定」保存连接，双击展开即可管理 GRTblog 数据库。</p>
<hr>
<h2>七、常见问题排查</h2>
<h3>7.1 连接超时/Connection refused</h3>
<ul>
<li>检查：服务器安全组是否放行 5432 端口</li>
<li>检查：<code>ss -tulnp | grep 5432</code> 是否有输出（确认端口已监听）</li>
<li>检查：<code>docker ps | grep postgres</code> 容器是否正常运行</li>
</ul>
<h3>7.2 密码错误/权限拒绝</h3>
<ul>
<li>核对 <code>.env</code> 中 <code>POSTGRES_PASSWORD</code> 是否正确</li>
<li>若需授权远程访问，进入容器执行：
<pre><code class="language-bash">docker exec -it grtblog-postgres psql -U postgres
ALTER ROLE postgres CONNECTION LIMIT -1;
\q
</code></pre>
</li>
</ul>
<h3>7.3 找不到数据库 <code>grtblog</code></h3>
<ul>
<li>确认项目已完成初始化（执行过安装脚本）</li>
<li>若未初始化，先启动项目让脚本自动创建数据库</li>
</ul>
<hr>
<h2>八、附录：命令速查表</h2>
<table>
<thead>
<tr>
<th>操作</th>
<th>命令</th>
</tr>
</thead>
<tbody>
<tr>
<td>查看 PostgreSQL 配置</td>
<td>`cat .env</td>
</tr>
<tr>
<td>查看容器状态</td>
<td>`docker ps</td>
</tr>
<tr>
<td>编辑配置文件</td>
<td><code>vi docker-compose.yml</code></td>
</tr>
<tr>
<td>重启容器（新版）</td>
<td><code>docker compose down &amp;&amp; docker compose up -d</code></td>
</tr>
<tr>
<td>验证端口监听</td>
<td>`ss -tulnp</td>
</tr>
<tr>
<td>安装旧版 docker-compose</td>
<td><code>apt update &amp;&amp; apt install -y docker-compose</code></td>
</tr>
</tbody>
</table>
<hr>
<h2>九、最终验证</h2>
<ol>
<li>服务器端：<code>ss -tulnp | grep 5432</code> 看到 <code>0.0.0.0:5432</code></li>
<li>Navicat 端：测试连接成功，可展开 <code>grtblog</code> 数据库查看表结构</li>
</ol>
<hr>
<p>此教程来自豆包解决</p>]]></description>
      <author>夙缘</author>
      <guid>article-1</guid>
      <pubDate>Sun, 22 Mar 2026 02:17:50 +0000</pubDate>
    </item>
  </channel>
</rss>