<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://ricardo-firefly.pages.dev/</id>
  <title type="text">Ricardo 的博客</title>
  <subtitle type="text">Ricardo 的个人博客，记录 Linux、编程与工具的学习笔记：能跑通的命令、踩过的坑，以及当时为什么这么选。</subtitle>
  <updated>2026-10-31T00:00:00.000Z</updated>
  <author><name>Ricardo</name></author>
  <link rel="alternate" href="https://ricardo-firefly.pages.dev/"/>
  <link rel="self" href="https://ricardo-firefly.pages.dev/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v6.16.9</generator>
    <entry>
      <id>https://ricardo-firefly.pages.dev/posts/ai-nagi-setup/</id>
      <title type="text">搭建 AI-Nagi 的过程</title>
      <published>2026-10-31T00:00:00.000Z</published>
      <updated>2026-10-31T00:00:00.000Z</updated>
      <author><name>Ricardo</name></author>
      <link rel="alternate" href="https://ricardo-firefly.pages.dev/posts/ai-nagi-setup/"/>
      <summary type="text">用 NapCat + AstrBot 把一个 QQ 小号变成有性格的 AI，从装工具到调人格的完整记录</summary>
      <content type="html"><![CDATA[<p>作者：晚空秋</p>
<p>在红岩网校看到「卷娘」这个 AI 形象时，第一反应是好奇：它是怎么来的？背后接了什么东西？能不能自己也做一个？</p>
<p>顺着这个问题问下去，发现原理并不神秘——一个 QQ 协议端负责收发消息，一个机器人框架负责接大模型，中间用 WebSocket 连起来。于是就有了下面这个属于我自己的 QQ AI：<strong>Nagi</strong>。</p>
<p>这篇记录整个搭建过程，包括踩过的坑。</p>
<section><h2>一、需要准备什么<a href="#一需要准备什么"><span>#</span></a></h2>

<table><thead><tr><th>组件</th><th>作用</th><th>说明</th></tr></thead><tbody><tr><td><strong>QQ 小号</strong></td><td>给 AI 一个身份</td><td>强烈建议用小号，原因见下</td></tr><tr><td><strong>NapCat</strong></td><td>QQ 协议端</td><td>让程序能像人一样收发 QQ 消息</td></tr><tr><td><strong>AstrBot Launcher</strong></td><td>图形化安装器 + 进程管家</td><td>本身不含 AI 能力，只负责把 AstrBot 装起来、跑起来</td></tr><tr><td><strong>AstrBot</strong></td><td>机器人主体</td><td>接大模型、管人格、装插件</td></tr><tr><td><strong>大模型 API Key</strong></td><td>提供“智能”</td><td><strong>要花钱</strong>，按 token 计费</td></tr></tbody></table><section><h3>关于风险，先说清楚<a href="#关于风险先说清楚"><span>#</span></a></h3><p>NapCat 并不是腾讯官方提供的接口，它的做法是<strong>注入进程接管 QQ 客户端</strong>。这本质上违反了《QQ 软件许可协议》，存在被判定为异常登录、甚至封号的可能。</p><p>所以：<strong>一定用小号</strong>。真被封了也不心疼，主号不要冒险。</p></section><section><h3>关于成本<a href="#关于成本"><span>#</span></a></h3><p>这套东西不是免费的。AI 每回复一次都在消耗 token，你可以理解为「每说一句话都在花钱」。日常聊天花费很小，但如果拉进群、被频繁 @，账单会肉眼可见地涨。</p></section></section>
<section><h2>二、三个部件是怎么连起来的<a href="#二三个部件是怎么连起来的"><span>#</span></a></h2><p>搞清楚这张图，后面每一步都不会迷路：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>QQ 小号 ──扫码登录──&gt; NapCat（协议端）</span></div></div><div><div><div>2</div></div><div><span><span>                          </span></span><span>│</span></div></div><div><div><div>3</div></div><div><span><span>                          </span></span><span>│  WebSocket  ws://127.0.0.1:6199/ws</span></div></div><div><div><div>4</div></div><div><span><span>                          </span></span><span>▼</span></div></div><div><div><div>5</div></div><div><span><span>                     </span></span><span>AstrBot（AI 主体）──HTTPS──&gt; 大模型 API（DeepSeek 等）</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li><strong>NapCat</strong> 负责“听得见、说得出”——把 QQ 的消息转成程序能读的格式，再把回复发回去</li>
<li><strong>AstrBot</strong> 负责“想”——收到消息后调用大模型，决定回什么</li>
<li><strong>6199</strong> 是两者之间的桥，AstrBot 在这头等着，NapCat 主动连过去</li>
</ul></section>
<section><h2>三、开始搭建<a href="#三开始搭建"><span>#</span></a></h2><section><h3>第 1 步：安装所需工具<a href="#第-1-步安装所需工具"><span>#</span></a></h3><p>去 GitHub 下载两个东西：</p><ul>
<li>AstrBot Launcher：<a href="https://github.com/AstrBotDevs/astrbot-launcher/releases" target="_blank">https://github.com/AstrBotDevs/astrbot-launcher/releases</a></li>
<li>NapCat：<a href="https://github.com/NapNeko/NapCatQQ/releases" target="_blank">https://github.com/NapNeko/NapCatQQ/releases</a></li>
</ul><p>NapCat 的安装脚本会自动检测并下载对应版本的 QQ（大约 300 MB），耐心等它跑完。</p><p></p><figure><img src="/images/nagi/step1-napcat-install.png" alt="NapCat 安装程序正在下载 QQ 客户端" /><figcaption>NapCat 安装程序正在下载 QQ 客户端</figcaption></figure><p></p><p><em>NapCat 安装时会自动拉取匹配版本的 QQ，进度条走完就装好了</em></p></section><section><h3>第 2 步：运行 AstrBot，补齐运行组件<a href="#第-2-步运行-astrbot补齐运行组件"><span>#</span></a></h3><p>打开 AstrBot Launcher，先把三个组件装上：<strong>Python</strong>、<strong>Node.js (LTS)</strong>、<strong>uv</strong>。</p><p>注意 uv 选 <strong>v4.28.2</strong> 这个版本，别的版本可能和 Launcher 对不上。</p><p></p><figure><img src="/images/nagi/step2-components.png" alt="AstrBot 组件管理：Python、Node.js、uv 均已下载" /><figcaption>AstrBot 组件管理：Python、Node.js、uv 均已下载</figcaption></figure><p></p><p><em>三个组件都显示“已下载”才继续，缺一个后面都起不来</em></p><p>装完创建实例、启动，Launcher 会给你一组 <strong>WebUI 的账号和密码</strong>。浏览器打开它给的地址，登录进去，先创建一个自己的用户。</p></section><section><h3>第 3 步：NapCat 登录 QQ 小号<a href="#第-3-步napcat-登录-qq-小号"><span>#</span></a></h3><p>NapCat 安装完成后会在 QQ 安装目录里生成 <code>napcat.bat</code>，双击运行，会弹出一个二维码。</p><p>用<strong>小号</strong>扫码登录。这一步成功后，NapCat 就已经能收发这个号的消息了。</p></section><section><h3>第 4 步：在 AstrBot 里创建机器人<a href="#第-4-步在-astrbot-里创建机器人"><span>#</span></a></h3><p>回到 AstrBot 的 WebUI，点“创建机器人”，按下表填：</p>

<table><thead><tr><th>字段</th><th>值</th></tr></thead><tbody><tr><td>消息平台类别</td><td><strong>OneBot v11</strong></td></tr><tr><td>机器人名称</td><td>随意（默认 <code>default</code> 也行）</td></tr><tr><td>启用</td><td>打开</td></tr><tr><td>反向 WebSocket 主机</td><td><code>0.0.0.0</code></td></tr><tr><td>反向 WebSocket 端口</td><td><code>6199</code>（保持不变）</td></tr><tr><td>反向 WebSocket Token</td><td><strong>留空</strong></td></tr></tbody></table><p></p><figure><img src="/images/nagi/step4-create-bot.png" alt="在 AstrBot 中创建 OneBot v11 机器人" /><figcaption>在 AstrBot 中创建 OneBot v11 机器人</figcaption></figure><p></p><p><em>消息平台选 OneBot v11，主机 0.0.0.0，端口 6199，Token 不填</em></p></section><section><h3>第 5 步：在 NapCat 里建立连接<a href="#第-5-步在-napcat-里建立连接"><span>#</span></a></h3><p>NapCat 运行后会给一个 WebUI 地址，浏览器打开，用刚登录的小号进去。找到 <strong>网络配置</strong>：</p><ol>
<li>新建 <strong>WebSocket 客户端</strong></li>
<li>启用打开</li>
<li>URL 改成 <code>ws://127.0.0.1:6199/ws</code></li>
<li>Token 删掉（留空）</li>
<li>心跳间隔、重连间隔都设为 <code>1000</code></li>
<li>保存</li>
</ol><p></p><figure><img src="/images/nagi/step5-napcat-dashboard.png" alt="NapCat 主界面：确认版本与连接状态" /><figcaption>NapCat 主界面：确认版本与连接状态</figcaption></figure><p></p><p><em>NapCat 的概览页，可以看到版本号和运行状态</em></p><p></p><figure><img src="/images/nagi/step5-websocket-client.png" alt="WebSocket 客户端配置：URL、心跳与重连间隔" /><figcaption>WebSocket 客户端配置：URL、心跳与重连间隔</figcaption></figure><p></p><p><em>URL 指向 AstrBot 的 6199，Token 留空，两个间隔都是 1000</em></p></section><section><h3>第 6 步：确认连接成功<a href="#第-6-步确认连接成功"><span>#</span></a></h3><p>回到 AstrBot，打开「数据与日志」，看到这一行就说明通了：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[INFO] aiochttp(OneBot v11) 适配器已连接。</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p></p><figure><img src="/images/nagi/step6-connected.png" alt="AstrBot 日志：适配器已连接" /><figcaption>AstrBot 日志：适配器已连接</figcaption></figure><p></p><p><em>日志里出现「适配器已连接」，说明 NapCat 和 AstrBot 握手成功</em></p></section><section><h3>第 7 步：接入大模型<a href="#第-7-步接入大模型"><span>#</span></a></h3><p>回到 AstrBot 的欢迎页，配置 AI：</p><ol>
<li>选择提供商模型（我用的是 <strong>DeepSeek</strong>）</li>
<li>粘贴 <strong>API 密钥</strong>（获取方法见文末附录）</li>
<li>点“获取模型”</li>
<li>聊天模型选 <strong>flash</strong></li>
<li>保存配置</li>
</ol><p>到这里，主体就已经能跑起来了——给它发条消息试试。</p></section><section><h3>第 8 步：给它一个人格<a href="#第-8-步给它一个人格"><span>#</span></a></h3><p>第一次对话大概率会让你失望：<strong>十分死板，毫无“人样”</strong>，像个问答机器人。</p><p>原因是模型不知道“它是谁”。所以要装人格：</p><p><strong>① 装插件</strong></p><p>在 Launcher 的插件市场安装 <strong>chat_plus</strong>（一个以 AI 读空气为主的群聊增强插件）。</p><p></p><figure><img src="/images/nagi/step8-chat-plus.png" alt="插件市场里安装 chat_plus" /><figcaption>插件市场里安装 chat_plus</figcaption></figure><p></p><p><strong>② 打开分段回复和群聊上下文</strong></p><p>在配置文件的「扩展功能」里：</p><ul>
<li>启用<strong>分段回复</strong>（像真人一样把长回复拆成几条短消息）</li>
<li>启用<strong>群聊上下文感知</strong>（让它知道群里前面聊了什么）</li>
</ul><p></p><figure><img src="/images/nagi/step8-segmented.png" alt="扩展功能：分段回复与群聊上下文" /><figcaption>扩展功能：分段回复与群聊上下文</figcaption></figure><p></p><p><em>分段回复能明显改善“像不像人”的观感，群聊上下文则避免它答非所问</em></p><p><strong>③ 配置图片理解（可选）</strong></p><p>勾选「自动理解图片」，选择一个视觉模型，群友发图它也能看懂。</p><p></p><figure><img src="/images/nagi/step8-image-model.png" alt="图片转述模型配置" /><figcaption>图片转述模型配置</figcaption></figure><p></p><p><strong>④ 写系统提示词</strong></p><p>回到 AstrBot 的「人格设定」，创建新人格：起一个 ID，然后在系统提示词里描述它是谁——名字、性格、说话风格、口头禅、禁忌。</p><p>这一步建议<strong>和豆包之类的 AI 对话来打磨</strong>：先写一版粗糙的，让它帮你提问（“遇到这种情况他会怎么回应？”），再根据回答补细节。</p></section><section><h3>第 9 步：选择人格，收工<a href="#第-9-步选择人格收工"><span>#</span></a></h3><p>最后在配置文件的「AI 配置」里选中刚建的人格，保存。</p><p></p><figure><img src="/images/nagi/step9-chat.png" alt="和 Nagi 的第一次对话" /><figcaption>和 Nagi 的第一次对话</figcaption></figure><p></p><p><em>配好人格之后，回复从“客服腔”变成了有人味的短句</em></p></section></section>
<section><h2>四、踩过的坑<a href="#四踩过的坑"><span>#</span></a></h2>

<table><thead><tr><th>现象</th><th>原因</th><th>解法</th></tr></thead><tbody><tr><td>日志一直没有「适配器已连接」</td><td>端口或 URL 写错</td><td>确认 AstrBot 是 <code>0.0.0.0:6199</code>，NapCat 连 <code>ws://127.0.0.1:6199/ws</code></td></tr><tr><td>扫码后秒掉线</td><td>小号被风控</td><td>换号，或降低发送频率</td></tr><tr><td>回复很慢</td><td>模型选了 pro/长上下文</td><td>换 flash，减少上下文条数</td></tr><tr><td>一口气发一大段</td><td>没开分段回复</td><td>扩展功能里打开分段，间隔 1.5–3.5 秒</td></tr><tr><td>说话不像人</td><td>系统提示词太笼统</td><td>写具体：称呼、语气、句子长度、禁用词</td></tr></tbody></table></section>
<section><h2>五、最后<a href="#五最后"><span>#</span></a></h2><p>从“看到一个 AI 形象觉得好奇”到“自己跑起来一个”，中间其实只有三个部件和一个端口。真正花时间的不是配置，而是<strong>调人格</strong>——同样的模型，提示词写得好不好，观感差距是数量级的。</p><p>Nagi 现在还在慢慢调，等哪天它能在群里自然地接话，这篇就算写完了。</p><hr /><section><h3>附录：获取 DeepSeek API 密钥<a href="#附录获取-deepseek-api-密钥"><span>#</span></a></h3><ol>
<li>打开 <a href="https://www.deepseek.com/" target="_blank">https://www.deepseek.com/</a> ，进入 <strong>API 开放平台</strong></li>
<li>注册并登录，创建账户信息</li>
<li><strong>新用户需要先充值</strong>（最少 10 元），用于抵扣运行时的 token 消耗</li>
<li>进入 <strong>API keys</strong> 页面，点“创建 API key”</li>
<li>复制生成的密钥，粘贴到 AstrBot 的配置里</li>
</ol><p></p><figure><img src="/images/nagi/appendix-deepseek.png" alt="DeepSeek 开放平台首页" /><figcaption>DeepSeek 开放平台首页</figcaption></figure><p></p><blockquote><p>密钥只显示一次，务必当场保存；泄露了就在后台删掉重建。</p></blockquote></section></section>]]></content>
    </entry>
    <entry>
      <id>https://ricardo-firefly.pages.dev/posts/modify-hosts/</id>
      <title type="text">修改hosts快速连接GitHub</title>
      <published>2026-10-31T00:00:00.000Z</published>
      <updated>2026-10-31T00:00:00.000Z</updated>
      <author><name>Ricardo</name></author>
      <link rel="alternate" href="https://ricardo-firefly.pages.dev/posts/modify-hosts/"/>
      <summary type="text">五步搞定：用 ping 拿 IP，改 hosts 绑定域名，解决 GitHub 打不开或加载慢</summary>
      <content type="html"><![CDATA[<p>GitHub 打开慢或者干脆打不开，多半是域名被解析到了一个不可用的 IP。手动把域名绑到一个能通的 IP 上，就能绕过这个问题。</p>
<p>整个过程五步，十分钟内能做完。</p>
<section><h2>第一步：拿到可用的 IP<a href="#第一步拿到可用的-ip"><span>#</span></a></h2><p>打开 cmd 窗口，输入：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ping</span><span> github.com</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>按回车，会看到类似这样的输出：</p><p></p><figure><img src="/images/ping-github.png" alt="ping github.com 的输出，方括号里就是 IP" /><figcaption>ping github.com 的输出，方括号里就是 IP</figcaption></figure><p></p><p>方括号 <code>[]</code> 里那一串数字就是 IP 地址，比如 <code>20.205.243.166</code>。</p><blockquote><p>如果这里显示”请求超时”或”找不到主机”，说明当前网络连 ping 都不通，改 hosts 也没用，得换网络环境或用代理。</p></blockquote></section>
<section><h2>第二步：复制 IP 地址<a href="#第二步复制-ip-地址"><span>#</span></a></h2><p>把方括号里的 IP 复制下来，比如 <code>20.205.243.166</code>。</p><p>只复制 IP 本身，后面的 <code>时间=100ms TTL=109</code> 不要带上。</p></section>
<section><h2>第三步：以管理员身份运行记事本<a href="#第三步以管理员身份运行记事本"><span>#</span></a></h2><p>在任务栏搜索框里输入 <code>记事本</code>，右键选择 <strong>以管理员身份运行</strong>。</p><p>这一步不能省。hosts 是系统文件，普通权限打开会保存失败。</p></section>
<section><h2>第四步：找到 hosts 文件<a href="#第四步找到-hosts-文件"><span>#</span></a></h2><p>在记事本左上角点 <strong>文件 → 打开</strong>，地址栏进入：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>C:\Windows\System32\drivers\etc</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>右下角的文件类型默认是”文本文档”，<strong>改成”所有文件”</strong>，这时才能在列表里看到 <code>hosts</code>。</p><p>选中 <code>hosts</code>，点打开。</p></section>
<section><h2>第五步：粘贴 IP 并保存<a href="#第五步粘贴-ip-并保存"><span>#</span></a></h2><p>把刚才复制的 IP 粘贴到文件<strong>最下方</strong>，格式是「IP + 空格 + 域名」：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>20.205.243.166    github.com</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>注意：</p><ul>
<li>IP 和域名之间用空格或 Tab 隔开，不能用逗号</li>
<li>文件里原有的 <code>127.0.0.1 localhost</code> 那几行不要动</li>
<li>改完点左上角 <strong>文件 → 保存</strong>（或 <code>Ctrl+S</code>）</li>
</ul><p>保存成功，整个流程就完成了。重新打开浏览器访问 GitHub 试试。</p></section>
<section><h2>补充几点<a href="#补充几点"><span>#</span></a></h2><p><strong>1. 需要绑定的不止 github.com</strong></p><p>常用的还有几个，可以一起加：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>140.82.112.3      github.com</span></div></div><div><div><div>2</div></div><div><span>140.82.112.6      api.github.com</span></div></div><div><div><div>3</div></div><div><span>140.82.112.9      codeload.github.com</span></div></div><div><div><div>4</div></div><div><span>185.199.108.133   raw.githubusercontent.com</span></div></div><div><div><div>5</div></div><div><span>185.199.108.133   objects.githubusercontent.com</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>2. 改完没生效，刷新一下 DNS 缓存</strong></p><p>在 cmd 里执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ipconfig</span><span> /flushdns</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后按 <code>Ctrl+F5</code> 强制刷新浏览器。</p><p><strong>3. IP 会变</strong></p><p>GitHub 的 IP 段过一段时间会调整，几个月后如果又变慢了，重复上面五步，重新 ping 一次、换一个新 IP 即可。</p><p><strong>4. ping 不通就别折腾 hosts 了</strong></p><p>如果第一步 ping 就超时，说明是链路层的问题，改 hosts 解决不了，需要走代理或者其他加速方式。</p><hr /><p>一句话总结：<strong>ping 拿 IP → 管理员记事本打开 hosts → 贴到最下面 → 保存 → 刷新 DNS</strong>。</p></section>]]></content>
    </entry>
</feed>
