<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>浅梦</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://star031104-github-io.pages.dev/</id>
  <link href="https://star031104-github-io.pages.dev/" rel="alternate"/>
  <link href="https://star031104-github-io.pages.dev/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, 浅梦</rights>
  <subtitle>分享技术与生活</subtitle>
  <title>浅梦的博客</title>
  <updated>2026-05-19T11:08:00.973Z</updated>
  <entry>
    <author>
      <name>浅梦</name>
    </author>
    <category term="开发报告" scheme="https://star031104-github-io.pages.dev/categories/%E5%BC%80%E5%8F%91%E6%8A%A5%E5%91%8A/"/>
    <content>
      <![CDATA[<h1 id="浅梦-AI-助手-Runtime-开发报告：一个本地语音桌面-Agent-的工程化实现"><a href="#浅梦-AI-助手-Runtime-开发报告：一个本地语音桌面-Agent-的工程化实现" class="headerlink" title="浅梦 AI 助手 Runtime 开发报告：一个本地语音桌面 Agent 的工程化实现"></a>浅梦 AI 助手 Runtime 开发报告：一个本地语音桌面 Agent 的工程化实现</h1><h2 id="1-项目概述"><a href="#1-项目概述" class="headerlink" title="1. 项目概述"></a>1. 项目概述</h2><p><code>AI_voice_assistant</code> 是一个面向 Windows 本地环境的个人 AI 助手 Runtime。它并不是一个简单的“语音聊天脚本”，而是一个把本地大语言模型、语音识别、语音合成、桌面上下文、网页搜索、RAG、工具调用、长期记忆和 Skill Package 扩展机制整合到一起的桌面 Agent 框架。</p><p>从整体定位来看，该项目希望实现的是：</p><ul><li>以本地大模型为核心的对话能力；</li><li>通过 FunASR 完成中文语音输入；</li><li>通过 GPT-SoVITS 完成拟人化语音输出；</li><li>通过弹窗、桌宠入口、CLI、WebUI 等方式提供多入口交互；</li><li>通过 Search&#x2F;RAG 机制增强实时信息获取能力；</li><li>通过 Tool Registry 和 Skill Package 实现工具调用与任务扩展；</li><li>通过屏幕观察、浏览器上下文、桌面状态等能力，让助手具备一定的“桌面感知”能力。</li></ul><p>如果用一句话概括：</p><blockquote><p>这是一个本地可部署、支持语音交互、具备桌面上下文感知、可联网检索、可调用工具、可扩展技能包的个人 AI Agent Runtime。</p></blockquote><h2 id="2-技术栈分析"><a href="#2-技术栈分析" class="headerlink" title="2. 技术栈分析"></a>2. 技术栈分析</h2><h3 id="2-1-本地大模型服务"><a href="#2-1-本地大模型服务" class="headerlink" title="2.1 本地大模型服务"></a>2.1 本地大模型服务</h3><p>项目默认使用 OpenAI-compatible API 形式访问本地模型服务。配置文件中主模型地址为：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">llm:</span></span><br><span class="line">  <span class="attr">base_url:</span> <span class="string">&quot;http://127.0.0.1:8000/v1&quot;</span></span><br><span class="line">  <span class="attr">api_key_env:</span> <span class="string">&quot;LOCAL_LLM_API_KEY&quot;</span></span><br><span class="line">  <span class="attr">api_key:</span> <span class="string">&quot;local&quot;</span></span><br><span class="line">  <span class="attr">model:</span> <span class="string">&quot;Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&quot;</span></span><br></pre></td></tr></table></figure><p>这意味着项目本身并不直接加载大模型权重，而是通过本地推理服务访问模型。仓库脚本中主要配套的是 <code>llama.cpp</code> 的 <code>llama-server</code>。</p><p>项目约定了多个模型服务端口：</p><table><thead><tr><th>服务</th><th align="right">默认端口</th><th>作用</th></tr></thead><tbody><tr><td>主对话模型</td><td align="right">8000</td><td>负责普通对话、Agent 推理、工具调用决策</td></tr><tr><td>视觉语言模型</td><td align="right">8001</td><td>负责屏幕截图或视觉内容理解</td></tr><tr><td>Embedding 模型</td><td align="right">8010</td><td>负责 RAG 向量召回</td></tr><tr><td>Reranker 模型</td><td align="right">8011</td><td>负责搜索结果&#x2F;网页片段重排序</td></tr><tr><td>GPT-SoVITS</td><td align="right">9880</td><td>负责文本转语音</td></tr><tr><td>SearXNG</td><td align="right">8080</td><td>负责本地搜索聚合</td></tr></tbody></table><p>这种拆分方式的优点是清晰：每个模型服务负责一种能力，Runtime 只负责调用和编排。缺点是启动成本较高，用户需要同时保证多个本地服务可用。</p><h3 id="2-2-语音输入：FunASR"><a href="#2-2-语音输入：FunASR" class="headerlink" title="2.2 语音输入：FunASR"></a>2.2 语音输入：FunASR</h3><p>语音输入部分位于 <code>app/voice_input</code>，核心包括：</p><ul><li><code>service.py</code>：语音输入服务入口；</li><li><code>voice_input_manager.py</code>：麦克风采集、VAD、声纹验证、流式识别、最终识别的主流程；</li><li><code>asr_engine.py</code>：FunASR 模型封装；</li><li><code>speaker_verifier.py</code>：声纹验证与声纹档案更新；</li><li><code>text_filter.py</code>：过滤误识别文本；</li><li><code>voice_vad.py</code>：语音活动检测；</li><li><code>events.py</code>：语音服务事件结构。</li></ul><p>配置文件 <code>configs/voice_input.yaml</code> 中默认使用：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">stream_model:</span> <span class="string">&quot;paraformer-zh-streaming&quot;</span></span><br><span class="line"><span class="attr">final_model:</span> <span class="string">&quot;paraformer-zh&quot;</span></span><br><span class="line"><span class="attr">punc_model:</span> <span class="string">&quot;ct-punc-c&quot;</span></span><br><span class="line"><span class="attr">vad_model:</span> <span class="string">&quot;fsmn-vad&quot;</span></span><br></pre></td></tr></table></figure><p>项目的语音输入并不是简单地“录音然后识别”，而是包含以下流程：</p><ol><li>从麦克风采集音频；</li><li>进行噪声校准；</li><li>使用 VAD 判断是否有人声；</li><li>进行声纹验证，判断是不是用户本人；</li><li>流式 ASR 输出 partial 文本；</li><li>最终 ASR 输出完整文本；</li><li>把文本交给 Runtime 的 <code>SessionRunner</code>；</li><li>等待模型回答后，通过 TTS 输出语音；</li><li>TTS 播放期间抑制麦克风输入，避免“自说自话”。</li></ol><p>这套设计体现了桌面语音助手需要解决的一个关键问题：<strong>语音输入和语音输出会互相干扰</strong>。如果没有 TTS 抑制机制，助手播放自己的回答时，麦克风可能再次捕获声音，导致系统把自己的语音误认为用户输入。</p><h3 id="2-3-语音输出：GPT-SoVITS"><a href="#2-3-语音输出：GPT-SoVITS" class="headerlink" title="2.3 语音输出：GPT-SoVITS"></a>2.3 语音输出：GPT-SoVITS</h3><p>TTS 客户端位于：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">app/clients/tts.py</span><br><span class="line">app/streaming/tts_streamer.py</span><br><span class="line">app/audio/player.py</span><br><span class="line">app/audio/tts_gate.py</span><br></pre></td></tr></table></figure><p>项目通过 HTTP 调用 GPT-SoVITS 的 <code>/tts</code> 接口，并支持：</p><ul><li>参考音频 <code>ref_audio_path</code>；</li><li>文本分段合成；</li><li>异步合成和分段播放；</li><li>音频缓存；</li><li>播放结束后自动清理输出音频；</li><li>TTS 文本净化，避免把 debug 信息、JSON、代码块直接读出来。</li></ul><p>配置文件中默认：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">tts:</span></span><br><span class="line">  <span class="attr">url:</span> <span class="string">&quot;http://127.0.0.1:9880/tts&quot;</span></span><br><span class="line">  <span class="attr">ref_audio_path:</span> <span class="string">&quot;assets/voices/1.wav&quot;</span></span><br><span class="line">  <span class="attr">async_pipeline:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">segmented_playback:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>从工程设计上看，<code>tts_gate.py</code> 是一个很实用的模块。因为 Agent 的文本回答可能包含引用、工具调试信息、代码、表格、链接等内容，这些内容适合显示，但不适合直接朗读。因此项目将“屏幕显示文本”和“TTS 朗读文本”拆开处理。</p><h3 id="2-4-桌面-UI：Popup、CLI-与-WebUI"><a href="#2-4-桌面-UI：Popup、CLI-与-WebUI" class="headerlink" title="2.4 桌面 UI：Popup、CLI 与 WebUI"></a>2.4 桌面 UI：Popup、CLI 与 WebUI</h3><p>项目提供多个交互入口：</p><table><thead><tr><th>入口</th><th>文件</th><th>说明</th></tr></thead><tbody><tr><td>默认弹窗</td><td><code>main.py</code> → <code>app.popup.launch</code></td><td>默认启动方式，桌面弹窗交互</td></tr><tr><td>CLI</td><td><code>main.py --cli</code> → <code>app.cli.main</code></td><td>命令行交互</td></tr><tr><td>语音服务</td><td><code>main.py --voice</code> → <code>app.voice_input.service.main</code></td><td>独立语音输入服务</td></tr><tr><td>WebUI</td><td><code>webui.py</code> → <code>app.webui.launch</code></td><td>Gradio Web 界面</td></tr><tr><td>桌宠&#x2F;启动器</td><td><code>app/popup/chat_popup.py</code></td><td>与弹窗联动</td></tr></tbody></table><p><code>main.py</code> 是主入口，逻辑非常清晰：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> <span class="string">&quot;--voice&quot;</span> <span class="keyword">in</span> args <span class="keyword">or</span> <span class="string">&quot;voice&quot;</span> <span class="keyword">in</span> args:</span><br><span class="line">    <span class="keyword">from</span> app.voice_input.service <span class="keyword">import</span> main</span><br><span class="line"><span class="keyword">elif</span> <span class="string">&quot;--cli&quot;</span> <span class="keyword">in</span> args <span class="keyword">or</span> <span class="string">&quot;cli&quot;</span> <span class="keyword">in</span> args <span class="keyword">or</span> <span class="string">&quot;-c&quot;</span> <span class="keyword">in</span> args:</span><br><span class="line">    <span class="keyword">from</span> app.cli <span class="keyword">import</span> main</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    <span class="keyword">from</span> app.popup <span class="keyword">import</span> launch</span><br></pre></td></tr></table></figure><p>这说明项目的入口设计采用“单主入口，多模式分发”的方式，降低了用户使用门槛。</p><p><code>app/popup/chat_popup.py</code> 则是桌面端体验的核心文件。它负责：</p><ul><li>创建 Tkinter 弹窗；</li><li>初始化 <code>SessionRunner</code>；</li><li>绑定快捷键；</li><li>启动语音服务子进程；</li><li>读取语音服务 JSONL 事件；</li><li>把最终 ASR 文本送入对话流程；</li><li>显示模型回答；</li><li>处理屏幕观察、桌面上下文、主动提醒等交互。</li></ul><p>WebUI 位于 <code>app/webui/app.py</code>，基于 Gradio Blocks 组织界面，包含 Chat、Memory、RAG、Pending、Runtime、Performance、Config、TTS、Logs、Diagnostics、Tasks、Workflow、Screen 等标签页。这更像是开发调试控制台，而不仅仅是聊天页面。</p><h2 id="3-项目目录结构分析"><a href="#3-项目目录结构分析" class="headerlink" title="3. 项目目录结构分析"></a>3. 项目目录结构分析</h2><p>项目目录可以按功能分为以下几层：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">AI_voice_assistant/</span><br><span class="line">├── main.py                    # 主入口：popup / cli / voice 分发</span><br><span class="line">├── webui.py                   # WebUI 启动入口</span><br><span class="line">├── voice_service.py           # 语音服务独立入口</span><br><span class="line">├── config.yaml                # 主配置，include 多个子配置</span><br><span class="line">├── configs/                   # Agent、RAG、TTS、工具、安全、语音等配置</span><br><span class="line">├── app/</span><br><span class="line">│   ├── agent/                 # Agent 决策、规划、工具调用循环</span><br><span class="line">│   ├── runtime/               # SessionRunner、TTS 状态、pending action</span><br><span class="line">│   ├── tools/                 # 工具注册、工具策略、具体工具实现</span><br><span class="line">│   ├── rag/                   # 网页抓取、chunk、rank、evidence</span><br><span class="line">│   ├── search/                # 搜索计划、深度搜索、查询改写</span><br><span class="line">│   ├── voice_input/           # FunASR、声纹验证、VAD、语音输入服务</span><br><span class="line">│   ├── clients/               # LLM、Embedding、Reranker、TTS 客户端</span><br><span class="line">│   ├── popup/                 # 桌面弹窗</span><br><span class="line">│   ├── webui/                 # Gradio WebUI</span><br><span class="line">│   ├── memory/                # 长期记忆模块</span><br><span class="line">│   ├── skills/                # Skill Package 加载与执行</span><br><span class="line">│   ├── screen/                # 屏幕观察与视觉模型调用</span><br><span class="line">│   ├── desktop_context/       # 桌面上下文获取</span><br><span class="line">│   └── workspace/             # 工作区上下文维护</span><br><span class="line">├── workspace/</span><br><span class="line">│   ├── skills/                # 内置技能包</span><br><span class="line">│   ├── memory/                # USER / PROJECT / TASKS / KNOWLEDGE 等记忆文件</span><br><span class="line">│   └── TOOLS.md               # 工具说明与安全策略说明</span><br><span class="line">├── scripts/                   # 诊断、清理、模型启动、声纹管理脚本</span><br><span class="line">├── data/                      # 缓存、会话、记忆、运行状态</span><br><span class="line">├── logs/                      # 日志</span><br><span class="line">├── profiles/                  # 声纹档案</span><br><span class="line">└── assets/voices/             # TTS 参考音频</span><br></pre></td></tr></table></figure><p>目录结构体现了几个工程特点：</p><ol><li><strong>配置与逻辑分离</strong>：<code>config.yaml</code> 只做主入口配置，具体配置被拆到 <code>configs/</code>。</li><li><strong>Runtime 与 Agent 解耦</strong>：<code>runtime</code> 负责单轮会话生命周期，<code>agent</code> 负责决策和生成。</li><li><strong>工具系统独立</strong>：<code>tools</code> 不直接散落在 Agent 中，而是通过注册表统一管理。</li><li><strong>RAG 与 Search 分层</strong>：<code>search</code> 负责搜索策略，<code>rag</code> 负责网页抓取、chunk、排序和证据组织。</li><li><strong>Skill Package 独立于代码主干</strong>：<code>workspace/skills</code> 中的技能包可以独立增删，不必修改核心代码。</li></ol><h2 id="4-核心运行流程"><a href="#4-核心运行流程" class="headerlink" title="4. 核心运行流程"></a>4. 核心运行流程</h2><h3 id="4-1-总体流程"><a href="#4-1-总体流程" class="headerlink" title="4.1 总体流程"></a>4.1 总体流程</h3><p>可以将项目运行流程抽象为：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">用户输入</span><br><span class="line">  ├── 文本输入：Popup / CLI / WebUI</span><br><span class="line">  └── 语音输入：麦克风 → VAD → 声纹验证 → FunASR</span><br><span class="line">        ↓</span><br><span class="line">SessionRunner.run_user_turn()</span><br><span class="line">        ↓</span><br><span class="line">意图路由 Intent Router</span><br><span class="line">        ↓</span><br><span class="line">┌───────────────────────────────┐</span><br><span class="line">│ 1. Direct Tool Fast Path       │  确定性任务：时间、天气、窗口、简单搜索等</span><br><span class="line">│ 2. Skill Workflow Engine       │  命中技能包时执行工作流</span><br><span class="line">│ 3. LLM Agent Loop              │  复杂任务：规划、工具调用、反思、回答</span><br><span class="line">└───────────────────────────────┘</span><br><span class="line">        ↓</span><br><span class="line">Tool Registry 执行工具 / RAG / Memory / Screen / Desktop</span><br><span class="line">        ↓</span><br><span class="line">Final Renderer 生成显示回答和 TTS 回答</span><br><span class="line">        ↓</span><br><span class="line">Popup / CLI / WebUI 显示</span><br><span class="line">        ↓</span><br><span class="line">GPT-SoVITS 语音播放</span><br></pre></td></tr></table></figure><p>该流程的关键设计是：<strong>所有输入最后都归一到 <code>SessionRunner.run_user_turn()</code></strong>。也就是说，无论用户是打字、语音、WebUI 输入，还是桌面弹窗输入，后续都复用同一套 Runtime。</p><h3 id="4-2-SessionRunner：单轮会话中枢"><a href="#4-2-SessionRunner：单轮会话中枢" class="headerlink" title="4.2 SessionRunner：单轮会话中枢"></a>4.2 SessionRunner：单轮会话中枢</h3><p><code>app/runtime/session_runner.py</code> 是项目的运行中枢。它将一次用户输入封装为一个完整的生命周期：</p><ol><li>检查是否是对 pending action 的确认或取消；</li><li>记录用户输入；</li><li>调用意图路由器判断请求类型；</li><li>根据配置决定是否走 Direct Tool Fast Path；</li><li>检索长期记忆；</li><li>调用 <code>run_agent()</code> 执行 Agent 推理；</li><li>渲染最终回复；</li><li>记录行为记忆；</li><li>更新 workspace 智能上下文；</li><li>写入会话；</li><li>进行记忆门控、分类与存储；</li><li>调度或播放 TTS；</li><li>返回 <code>TurnResult</code>。</li></ol><p><code>TurnResult</code> 中包含：</p><ul><li><code>reply</code>：用于显示的回答；</li><li><code>tts_reply</code>：用于语音播放的回答；</li><li><code>debug</code>：调试信息；</li><li><code>tool_calls</code>：工具调用记录；</li><li><code>rag_evidence</code>：RAG 证据；</li><li><code>memory_updates</code>：记忆更新；</li><li><code>pending_actions</code>：待用户确认的操作；</li><li><code>perf</code>：性能统计；</li><li><code>tts_status</code>：TTS 状态。</li></ul><p>这个结构说明项目已经把“用户看到的内容”“TTS 朗读的内容”“调试信息”“工具执行过程”做了分离，这对于一个长期运行的桌面助手非常重要。</p><h3 id="4-3-Intent-Router：意图识别与快速路径"><a href="#4-3-Intent-Router：意图识别与快速路径" class="headerlink" title="4.3 Intent Router：意图识别与快速路径"></a>4.3 Intent Router：意图识别与快速路径</h3><p><code>app/agent/intent_router.py</code> 负责根据用户输入判断请求类型，例如：</p><ul><li>记忆创建、更新、删除；</li><li>技能管理；</li><li>屏幕观察；</li><li>桌面窗口操作；</li><li>搜索；</li><li>天气；</li><li>系统信息；</li><li>一般聊天。</li></ul><p>对于一些确定性任务，项目会绕过完整的 LLM Agent Loop，直接进入工具快速路径。这样做有两个好处：</p><ol><li>减少大模型调用次数，提高响应速度；</li><li>降低模型误判工具参数的概率。</li></ol><p>例如“现在几点”“查一下天气”“打开观察屏幕”等任务，不一定需要大模型多轮思考，路由器可以直接交给对应工具。</p><h3 id="4-4-Agent-Loop：复杂任务的规划与工具调用"><a href="#4-4-Agent-Loop：复杂任务的规划与工具调用" class="headerlink" title="4.4 Agent Loop：复杂任务的规划与工具调用"></a>4.4 Agent Loop：复杂任务的规划与工具调用</h3><p>复杂任务会进入 <code>app/agent/round_runner.py</code> 中的 <code>run_agent()</code>。其逻辑可以概括为：</p><ol><li>推断当前话题；</li><li>构建上下文；</li><li>再次路由意图；</li><li>判断是否需要 Direct Tool；</li><li>判断是否可以由 Skill Workflow Engine 执行；</li><li>如果任务较复杂，生成动态计划；</li><li>进入 LLM Action Loop；</li><li>解析模型输出的工具调用 JSON；</li><li>调用 Tool Registry 执行工具；</li><li>观察工具结果；</li><li>根据结果反思或重规划；</li><li>生成最终回答。</li></ol><p>它不是简单的一次性 <code>chat_completion</code>，而是一个包含“计划—行动—观察—反思—回答”的 Agent 循环。</p><p>配置文件中也限制了 Agent 的复杂度，例如：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">agent:</span></span><br><span class="line">  <span class="attr">max_steps:</span> <span class="number">4</span></span><br><span class="line">  <span class="attr">max_tool_calls:</span> <span class="number">3</span></span><br><span class="line">  <span class="attr">max_tool_retries:</span> <span class="number">1</span></span><br></pre></td></tr></table></figure><p>这可以避免 Agent 在工具调用中无限循环。</p><h2 id="5-Tool-Registry-与安全策略"><a href="#5-Tool-Registry-与安全策略" class="headerlink" title="5. Tool Registry 与安全策略"></a>5. Tool Registry 与安全策略</h2><h3 id="5-1-工具注册机制"><a href="#5-1-工具注册机制" class="headerlink" title="5.1 工具注册机制"></a>5.1 工具注册机制</h3><p>项目中的工具系统位于 <code>app/tools</code>。核心文件包括：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">app/tools/core/schema.py</span><br><span class="line">app/tools/core/registry.py</span><br><span class="line">app/tools/core/policy.py</span><br><span class="line">app/tools/core/aliases.py</span><br><span class="line">app/tools/defaults.py</span><br><span class="line">configs/tools.yaml</span><br></pre></td></tr></table></figure><p>工具注册大致包含以下信息：</p><ul><li>工具名称；</li><li>工具描述；</li><li>参数 schema；</li><li>执行函数 handler；</li><li>风险等级；</li><li>是否默认启用；</li><li>是否允许模型可见；</li><li>是否需要用户确认；</li><li>超时时间；</li><li>输出长度限制。</li></ul><p><code>ToolRegistry</code> 的职责不仅是“调用工具”，还包括：</p><ul><li>判断工具是否启用；</li><li>判断模型是否可见；</li><li>修复或校验工具参数；</li><li>应用工具别名；</li><li>判断是否需要用户确认；</li><li>处理高风险操作；</li><li>控制工具超时；</li><li>压缩工具结果；</li><li>记录工具调用日志。</li></ul><h3 id="5-2-工具安全策略"><a href="#5-2-工具安全策略" class="headerlink" title="5.2 工具安全策略"></a>5.2 工具安全策略</h3><p><code>configs/tools.yaml</code> 中配置了工具权限。项目将工具分为低风险、中风险、高风险，并对高风险工具要求用户确认。</p><p>例如：</p><ul><li>文件写入、文件编辑、补丁应用需要确认；</li><li>任务删除需要确认；</li><li>命令执行默认禁用；</li><li>消息发送默认禁用；</li><li><code>code_execution</code> 默认禁用；</li><li>屏幕观察需要显式开启；</li><li>私密数据清理脚本独立提供。</li></ul><p><code>app/tools/runtime/runtime_tools.py</code> 中的命令执行工具使用 <code>subprocess.run(..., shell=True)</code>，这本身是高风险设计。但项目通过如下方式降低风险：</p><ol><li>工具默认禁用；</li><li>风险等级为 high；</li><li>默认需要用户确认；</li><li>不在常规模型可见工具中暴露。</li></ol><p>如果二次开发时要启用命令执行，建议进一步加入：</p><ul><li>命令白名单；</li><li>工作目录限制；</li><li>最大输出限制；</li><li>禁止网络敏感命令；</li><li>禁止删除类命令；</li><li>沙箱执行环境；</li><li>对执行命令进行二次确认展示。</li></ul><h2 id="6-Search-与-RAG-机制分析"><a href="#6-Search-与-RAG-机制分析" class="headerlink" title="6. Search 与 RAG 机制分析"></a>6. Search 与 RAG 机制分析</h2><h3 id="6-1-搜索入口"><a href="#6-1-搜索入口" class="headerlink" title="6.1 搜索入口"></a>6.1 搜索入口</h3><p>搜索统一入口位于：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">app/search/engine.py</span><br><span class="line">app/tools/search/__init__.py</span><br></pre></td></tr></table></figure><p>项目没有保留多个分散的搜索工具，而是提供统一 <code>search</code> 工具。这个工具内部支持：</p><ul><li>Query rewriting；</li><li>搜索计划；</li><li>SearXNG；</li><li>DDGS；</li><li>网页抓取；</li><li>文档分块；</li><li>BM25；</li><li>Embedding；</li><li>Reranker；</li><li>证据质量判断；</li><li>二次搜索；</li><li>回答缓存。</li></ul><p>这是该项目比较工程化的部分。它不是把搜索结果 snippet 直接丢给模型，而是尽量构建“可引用、可排序、可判断质量”的证据链。</p><h3 id="6-2-RAG-数据流"><a href="#6-2-RAG-数据流" class="headerlink" title="6.2 RAG 数据流"></a>6.2 RAG 数据流</h3><p>RAG 过程大致如下：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">用户问题</span><br><span class="line">  ↓</span><br><span class="line">查询改写 / 查询包生成</span><br><span class="line">  ↓</span><br><span class="line">SearXNG / DDGS 获取候选 URL</span><br><span class="line">  ↓</span><br><span class="line">网页抓取</span><br><span class="line">  ↓</span><br><span class="line">正文抽取与清洗</span><br><span class="line">  ↓</span><br><span class="line">文本分块</span><br><span class="line">  ↓</span><br><span class="line">BM25 初筛</span><br><span class="line">  ↓</span><br><span class="line">Embedding 向量召回</span><br><span class="line">  ↓</span><br><span class="line">Reranker 重排序</span><br><span class="line">  ↓</span><br><span class="line">证据质量判断</span><br><span class="line">  ↓</span><br><span class="line">必要时二次搜索</span><br><span class="line">  ↓</span><br><span class="line">将证据格式化加入 Prompt</span><br><span class="line">  ↓</span><br><span class="line">模型基于证据生成回答</span><br></pre></td></tr></table></figure><p>其中 <code>app/rag/ranker.py</code> 是排序核心。它会综合：</p><ul><li>BM25 分数；</li><li>Embedding 相似度；</li><li>Reranker 分数；</li><li>来源质量；</li><li>片段质量；</li><li>snippet 惩罚；</li><li>证据多样性。</li></ul><p>最终会给证据分配类似 <code>S1</code>、<code>S2</code> 的来源编号，再交给模型。</p><h3 id="6-3-搜索设计优点"><a href="#6-3-搜索设计优点" class="headerlink" title="6.3 搜索设计优点"></a>6.3 搜索设计优点</h3><p>该搜索系统的优点是：</p><ol><li><strong>层次清晰</strong>：搜索发现 URL，RAG 负责证据加工。</li><li><strong>具备降级能力</strong>：Embedding 或 Reranker 不可用时，可回退到 BM25。</li><li><strong>避免纯 snippet 回答</strong>：通过网页抓取和 chunk 提高证据质量。</li><li><strong>支持二次搜索</strong>：当证据不足时继续补充。</li><li><strong>支持缓存</strong>：降低重复搜索成本。</li></ol><h3 id="6-4-搜索设计不足"><a href="#6-4-搜索设计不足" class="headerlink" title="6.4 搜索设计不足"></a>6.4 搜索设计不足</h3><p>可能的问题包括：</p><ol><li>依赖外部网络和搜索服务，稳定性受环境影响；</li><li>SearXNG、DDGS、Embedding、Reranker 任一服务异常都可能影响效果；</li><li>网页抓取不支持复杂 JS 渲染页面；</li><li>证据质量判断仍可能受模型能力影响；</li><li>缓存策略需要注意过期时间，避免回答过时信息。</li></ol><h2 id="7-Memory-长期记忆模块"><a href="#7-Memory-长期记忆模块" class="headerlink" title="7. Memory 长期记忆模块"></a>7. Memory 长期记忆模块</h2><p>长期记忆模块位于：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">app/memory/</span><br><span class="line">workspace/memory/</span><br><span class="line">data/memory/</span><br></pre></td></tr></table></figure><p>主要文件包括：</p><ul><li><code>manager.py</code>：记忆读写；</li><li><code>classifier.py</code>：记忆分类；</li><li><code>gate.py</code>：记忆写入门控；</li><li><code>conflict_resolver.py</code>：冲突处理；</li><li><code>metadata_generator.py</code>：记忆元数据生成；</li><li><code>memory_router.py</code>：记忆相关意图路由。</li></ul><p>从配置看，项目支持：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">runtime:</span></span><br><span class="line">  <span class="attr">enable_memory:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">memory_update_mode:</span> <span class="string">&quot;agent_gate&quot;</span></span><br></pre></td></tr></table></figure><p>这表示它不会盲目把所有聊天内容写进长期记忆，而是经过门控和分类后再写入。</p><p>工作区中还存在结构化记忆文件：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">workspace/memory/USER.md</span><br><span class="line">workspace/memory/PROJECT.md</span><br><span class="line">workspace/memory/TASKS.md</span><br><span class="line">workspace/memory/KNOWLEDGE.md</span><br></pre></td></tr></table></figure><p>这种设计适合桌面助手长期使用：</p><ul><li><code>USER.md</code> 保存用户偏好；</li><li><code>PROJECT.md</code> 保存当前项目背景；</li><li><code>TASKS.md</code> 保存任务状态；</li><li><code>KNOWLEDGE.md</code> 保存长期知识。</li></ul><p>不过，记忆系统也带来隐私风险。发布博客或开源示例时，应清理 <code>data/memory</code>、<code>workspace/memory</code>、<code>logs</code>、<code>data/sessions</code> 等目录，避免泄露真实聊天内容。</p><h2 id="8-Skill-Package-机制"><a href="#8-Skill-Package-机制" class="headerlink" title="8. Skill Package 机制"></a>8. Skill Package 机制</h2><p>Skill Package 是项目很重要的扩展机制。目录位于：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">workspace/skills/</span><br></pre></td></tr></table></figure><p>本次源码中包含多个内置 Skill，例如：</p><ul><li><code>blog_writer</code>：博客写作；</li><li><code>browser_video</code>：浏览器视频相关；</li><li><code>github_research</code>：GitHub 项目研究；</li><li><code>gptsovits</code>：语音合成相关；</li><li><code>healthcheck</code>：系统健康检查；</li><li><code>local_llm</code>：本地模型；</li><li><code>memory</code>：记忆管理；</li><li><code>model_deployment</code>：模型部署；</li><li><code>openclaw</code>：OpenClaw 集成；</li><li><code>paper_assistant</code>：论文助手；</li><li><code>planning</code>：任务规划；</li><li><code>ppt_master</code>：PPT 生成相关；</li><li><code>project_refactor</code>：项目重构；</li><li><code>rag_search</code>：RAG 搜索；</li><li><code>screen_observer</code>：屏幕观察；</li><li><code>search</code>：搜索；</li><li><code>summarize</code>：总结；</li><li><code>tts</code>：语音输出；</li><li><code>weather</code>：天气；</li><li><code>workspace</code>：工作区管理。</li></ul><p>每个 Skill 一般可以包含：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">SKILL.md</span><br><span class="line">workflow.yaml</span><br><span class="line">scripts/</span><br><span class="line">assets/</span><br></pre></td></tr></table></figure><p><code>app/skills/loader.py</code> 负责读取 Skill 元信息；<code>app/skills/selector.py</code> 负责根据用户意图选择合适 Skill；<code>app/skills/executor.py</code> 负责执行工作流。</p><p>Skill 工作流支持：</p><ul><li>图结构工作流；</li><li>并行工具调用；</li><li>子工作流；</li><li>条件分支；</li><li>运行状态持久化；</li><li>中断后恢复；</li><li>用户确认后继续执行。</li></ul><p>这说明项目并不满足于“LLM 随机决定调用哪个工具”，而是希望通过可配置工作流，把常见任务变成可复用、可维护的技能包。</p><h2 id="9-屏幕观察与桌面上下文"><a href="#9-屏幕观察与桌面上下文" class="headerlink" title="9. 屏幕观察与桌面上下文"></a>9. 屏幕观察与桌面上下文</h2><p>屏幕观察相关代码位于：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">app/screen/</span><br><span class="line">app/desktop_context/</span><br><span class="line">app/browser_context/</span><br></pre></td></tr></table></figure><p>配置文件 <code>configs/screen.yaml</code> 中可以看到：</p><ul><li>屏幕能力默认启用；</li><li>视觉模型 VLM 默认可配置；</li><li>截图缓存位于 <code>data/cache/screen</code>；</li><li>保留最近若干张截图；</li><li>屏幕观察需要显式开启；</li><li>默认不自动保存调试截图；</li><li>敏感文本可做脱敏；</li><li>禁止自动发送消息。</li></ul><p>这部分设计非常重要。桌面 Agent 一旦具备屏幕感知，就可能接触聊天窗口、网页、文件路径、账号信息等敏感内容。因此项目在配置上提供了隐私保护策略：显式启动、限制缓存、脱敏、禁止自动发送消息。</p><p>从功能上看，屏幕模块主要支持：</p><ol><li>截图；</li><li>窗口信息读取；</li><li>屏幕状态缓存；</li><li>调用 VLM 分析屏幕内容；</li><li>主动观察与状态解释。</li></ol><p>这让助手可以回答类似：</p><ul><li>“你看看我现在屏幕上这个报错是什么意思？”</li><li>“帮我总结当前网页内容。”</li><li>“我现在打开的是哪个应用？”</li></ul><p>但实际使用时，需要谨慎控制权限和日志保存。</p><h2 id="10-配置系统设计"><a href="#10-配置系统设计" class="headerlink" title="10. 配置系统设计"></a>10. 配置系统设计</h2><p>项目配置入口为 <code>config.yaml</code>，并通过 <code>include_configs</code> 引入多个子配置：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">include_configs:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">configs/agent.yaml</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">configs/memory.yaml</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">configs/workspace.yaml</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">configs/environment.yaml</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">configs/skills.yaml</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">configs/tts.yaml</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">configs/rag.yaml</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">configs/tools.yaml</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">configs/screen.yaml</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">configs/voice_input.yaml</span></span><br></pre></td></tr></table></figure><p><code>app/config.py</code> 中实现了配置加载逻辑：</p><ol><li>读取主配置；</li><li>读取 <code>include_configs</code>；</li><li>深度合并 include 配置；</li><li>再用主配置覆盖 include 配置；</li><li>创建运行目录；</li><li>提供 <code>get_config()</code>、<code>get_llm_api_key()</code> 等接口。</li></ol><p>这种配置拆分方式的优点是：</p><ul><li>不同能力独立配置，便于维护；</li><li>主配置保留全局覆盖能力；</li><li>适合本地用户按需打开&#x2F;关闭能力；</li><li>便于排查问题。</li></ul><p>潜在问题是：当前 <code>get_llm_api_key()</code> 的逻辑中，内联 <code>api_key</code> 优先于环境变量。对于纯本地模型这没有问题，因为 <code>api_key: local</code> 只是占位；但如果未来接入真实远程 API，更推荐环境变量优先，或者移除配置文件中的明文 key。</p><h2 id="11-部署流程"><a href="#11-部署流程" class="headerlink" title="11. 部署流程"></a>11. 部署流程</h2><p>以下流程适合在博客中作为“复现指南”。</p><h3 id="11-1-环境准备"><a href="#11-1-环境准备" class="headerlink" title="11.1 环境准备"></a>11.1 环境准备</h3><p>推荐环境：</p><ul><li>Windows 10 &#x2F; Windows 11；</li><li>Python 3.10 或 3.11；</li><li>NVIDIA GPU；</li><li>CUDA 可用；</li><li>本地 <code>llama.cpp</code>；</li><li>FunASR &#x2F; ModelScope；</li><li>GPT-SoVITS；</li><li>可选：SearXNG、Embedding 模型、Reranker 模型。</li></ul><h3 id="11-2-获取项目"><a href="#11-2-获取项目" class="headerlink" title="11.2 获取项目"></a>11.2 获取项目</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/star031104/AI_voice_assistant.git</span><br><span class="line"><span class="built_in">cd</span> AI_voice_assistant</span><br></pre></td></tr></table></figure><p>或者直接解压项目压缩包。</p><h3 id="11-3-创建-Python-环境"><a href="#11-3-创建-Python-环境" class="headerlink" title="11.3 创建 Python 环境"></a>11.3 创建 Python 环境</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">conda create -n ai_voice_assistant python=3.10 -y</span><br><span class="line">conda activate ai_voice_assistant</span><br><span class="line">pip install -r requirements.txt</span><br></pre></td></tr></table></figure><p>如果某些音频库在 Windows 下安装失败，可以优先检查：</p><ul><li><code>sounddevice</code>；</li><li><code>pyaudio</code> 或系统音频依赖；</li><li><code>playsound</code>；</li><li><code>torch</code> CUDA 版本；</li><li>ModelScope&#x2F;FunASR 依赖。</li></ul><h3 id="11-4-启动本地大模型服务"><a href="#11-4-启动本地大模型服务" class="headerlink" title="11.4 启动本地大模型服务"></a>11.4 启动本地大模型服务</h3><p>项目提供了 <code>scripts/local_models/</code> 下的 <code>.bat</code> 脚本。使用前需要修改：</p><ul><li><code>llama.cpp</code> 路径；</li><li>GGUF 模型文件路径；</li><li>GPU offload 参数；</li><li>上下文长度；</li><li>线程数；</li><li>host 与 port。</li></ul><p>示例逻辑如下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">llama-server \</span><br><span class="line">  -m path/to/model.gguf \</span><br><span class="line">  --host 127.0.0.1 \</span><br><span class="line">  --port 8000 \</span><br><span class="line">  -c 8192 \</span><br><span class="line">  -t 10 \</span><br><span class="line">  -ngl 99 \</span><br><span class="line">  --jinja</span><br></pre></td></tr></table></figure><p>如果只是个人本机使用，建议优先绑定：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">--host 127.0.0.1</span><br></pre></td></tr></table></figure><p>不要随意使用 <code>0.0.0.0</code>，否则同一局域网内的其他设备可能访问你的模型服务。</p><h3 id="12-5-启动-GPT-SoVITS"><a href="#12-5-启动-GPT-SoVITS" class="headerlink" title="12.5 启动 GPT-SoVITS"></a>12.5 启动 GPT-SoVITS</h3><p>确保 GPT-SoVITS 的 HTTP 服务监听：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:9880/tts</span><br></pre></td></tr></table></figure><p>然后在 <code>configs/tts.yaml</code> 中检查：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">url:</span> <span class="string">&quot;http://127.0.0.1:9880/tts&quot;</span></span><br><span class="line"><span class="attr">ref_audio_path:</span> <span class="string">&quot;assets/voices/1.wav&quot;</span></span><br></pre></td></tr></table></figure><h3 id="11-6-配置搜索与-RAG"><a href="#11-6-配置搜索与-RAG" class="headerlink" title="11.6 配置搜索与 RAG"></a>11.6 配置搜索与 RAG</h3><p>如果要使用搜索&#x2F;RAG，建议启动或配置：</p><ul><li>SearXNG：<code>http://127.0.0.1:8080</code>；</li><li>Embedding 服务：<code>http://127.0.0.1:8010/v1</code>；</li><li>Reranker 服务：<code>http://127.0.0.1:8011/v1</code>。</li></ul><p>如果暂时不启动这些服务，项目仍可部分运行，但搜索质量和 RAG 效果会下降。</p><h3 id="11-7-启动项目"><a href="#11-7-启动项目" class="headerlink" title="11.7 启动项目"></a>11.7 启动项目</h3><p>默认弹窗模式：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python main.py</span><br></pre></td></tr></table></figure><p>CLI 模式：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python main.py --cli</span><br></pre></td></tr></table></figure><p>语音服务模式：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python main.py --voice</span><br></pre></td></tr></table></figure><p>WebUI 模式：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python webui.py</span><br></pre></td></tr></table></figure><h3 id="11-8-运行诊断"><a href="#11-8-运行诊断" class="headerlink" title="11.8 运行诊断"></a>11.8 运行诊断</h3><p>项目提供了多个诊断脚本：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">python scripts/doctor.py</span><br><span class="line">python scripts/check_local_search_stack.py</span><br><span class="line">python scripts/check_tool_policy.py</span><br></pre></td></tr></table></figure><p>建议部署后优先执行这些脚本，检查：</p><ul><li>配置是否正确；</li><li>搜索服务是否可用；</li><li>LLM 端口是否可用；</li><li>工具策略是否符合预期；</li><li>RAG 依赖是否完整。</li></ul><h2 id="12-代码质量评价"><a href="#12-代码质量评价" class="headerlink" title="12. 代码质量评价"></a>12. 代码质量评价</h2><h3 id="12-1-优点"><a href="#12-1-优点" class="headerlink" title="12.1 优点"></a>12.1 优点</h3><h4 id="1-架构拆分较清晰"><a href="#1-架构拆分较清晰" class="headerlink" title="1. 架构拆分较清晰"></a>1. 架构拆分较清晰</h4><p>项目将 Agent、Runtime、Tools、RAG、Voice、TTS、Memory、Skill、Screen 等模块拆开，避免了所有逻辑堆在一个脚本中。</p><h4 id="2-多入口统一到同一-Runtime"><a href="#2-多入口统一到同一-Runtime" class="headerlink" title="2. 多入口统一到同一 Runtime"></a>2. 多入口统一到同一 Runtime</h4><p>Popup、CLI、WebUI、Voice 最终都进入 <code>SessionRunner</code>，这让核心逻辑复用度较高。</p><h4 id="3-工具系统有安全意识"><a href="#3-工具系统有安全意识" class="headerlink" title="3. 工具系统有安全意识"></a>3. 工具系统有安全意识</h4><p>高风险工具不是直接暴露给模型，而是通过策略文件控制，并且需要用户确认。</p><h4 id="4-Search-RAG-设计比较完整"><a href="#4-Search-RAG-设计比较完整" class="headerlink" title="4. Search&#x2F;RAG 设计比较完整"></a>4. Search&#x2F;RAG 设计比较完整</h4><p>具备搜索计划、查询改写、网页抓取、分块、BM25、Embedding、Reranker、证据质量判断和二次搜索，不是简单搜索 API 拼接。</p><h4 id="5-语音链路考虑了真实使用问题"><a href="#5-语音链路考虑了真实使用问题" class="headerlink" title="5. 语音链路考虑了真实使用问题"></a>5. 语音链路考虑了真实使用问题</h4><p>项目考虑了 VAD、声纹验证、TTS 抑制、barge-in、流式 partial、最终识别等问题，这些都是语音助手从 Demo 走向可用所必须解决的问题。</p><h4 id="6-Skill-Package-具备扩展潜力"><a href="#6-Skill-Package-具备扩展潜力" class="headerlink" title="6. Skill Package 具备扩展潜力"></a>6. Skill Package 具备扩展潜力</h4><p>把常见任务封装为技能包，可以减少核心代码膨胀，也便于后续新增“博客写作”“论文助手”“PPT 生成”等能力。</p><h3 id="12-2-不足"><a href="#12-2-不足" class="headerlink" title="12.2 不足"></a>12.2 不足</h3><h4 id="1-部署链路较重"><a href="#1-部署链路较重" class="headerlink" title="1. 部署链路较重"></a>1. 部署链路较重</h4><p>完整运行需要 LLM、VLM、Embedding、Reranker、GPT-SoVITS、SearXNG、FunASR 等多个组件，对新手不友好。</p><h4 id="2-脚本中存在本地硬编码路径"><a href="#2-脚本中存在本地硬编码路径" class="headerlink" title="2. 脚本中存在本地硬编码路径"></a>2. 脚本中存在本地硬编码路径</h4><p><code>scripts/local_models/*.bat</code> 中包含本地模型路径和 llama.cpp 路径。其他用户部署时必须手动修改。</p><h4 id="3-自动化测试不足"><a href="#3-自动化测试不足" class="headerlink" title="3. 自动化测试不足"></a>3. 自动化测试不足</h4><p>本次源码中未发现独立 <code>tests/</code> 测试目录。虽然 <code>compileall</code> 可以通过，但仍建议补充单元测试和集成测试。</p><h4 id="4-命令执行工具需要更严格保护"><a href="#4-命令执行工具需要更严格保护" class="headerlink" title="4. 命令执行工具需要更严格保护"></a>4. 命令执行工具需要更严格保护</h4><p>虽然命令执行工具默认禁用且需要确认，但如果未来启用，建议增加白名单、沙箱、危险命令拦截。</p><h4 id="5-配置文件中的模型名不适合公开演示"><a href="#5-配置文件中的模型名不适合公开演示" class="headerlink" title="5. 配置文件中的模型名不适合公开演示"></a>5. 配置文件中的模型名不适合公开演示</h4><p>默认模型名包含 <code>Uncensored</code> 和 <code>Aggressive</code>，博客发布时建议说明这是本地实验模型，并建议生产或公开演示换成更稳妥的对齐模型。</p><h4 id="6-隐私数据清理必须重视"><a href="#6-隐私数据清理必须重视" class="headerlink" title="6. 隐私数据清理必须重视"></a>6. 隐私数据清理必须重视</h4><p>桌面上下文、屏幕观察、语音输入、聊天日志、长期记忆都可能包含隐私信息。发布项目截图、日志、压缩包前应执行清理。</p><h2 id="13-推荐改进路线"><a href="#13-推荐改进路线" class="headerlink" title="13. 推荐改进路线"></a>13. 推荐改进路线</h2><h3 id="13-1-第一阶段：提升可部署性"><a href="#13-1-第一阶段：提升可部署性" class="headerlink" title="13.1 第一阶段：提升可部署性"></a>13.1 第一阶段：提升可部署性</h3><ul><li>提供 <code>.env.example</code>；</li><li>提供 <code>config.example.yaml</code>；</li><li>将本地硬编码路径改为环境变量；</li><li>提供一键检查脚本；</li><li>将模型服务启动命令改成模板形式；</li><li>README 中增加“最小启动模式”。</li></ul><p>建议最小启动模式只依赖：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Python Runtime + 主 LLM + CLI</span><br></pre></td></tr></table></figure><p>然后再逐步开启：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">TTS → Voice Input → Search/RAG → Screen → Skill Workflow</span><br></pre></td></tr></table></figure><h3 id="13-2-第二阶段：补充测试体系"><a href="#13-2-第二阶段：补充测试体系" class="headerlink" title="13.2 第二阶段：补充测试体系"></a>13.2 第二阶段：补充测试体系</h3><p>建议新增：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">tests/</span><br><span class="line">├── test_config_loader.py</span><br><span class="line">├── test_intent_router.py</span><br><span class="line">├── test_tool_policy.py</span><br><span class="line">├── test_tool_aliases.py</span><br><span class="line">├── test_tts_gate.py</span><br><span class="line">├── test_search_fallback.py</span><br><span class="line">├── test_memory_gate.py</span><br><span class="line">└── test_skill_loader.py</span><br></pre></td></tr></table></figure><p>重点测试：</p><ul><li>配置合并是否正确；</li><li>工具策略优先级是否正确；</li><li>高风险工具是否被拦截；</li><li>TTS 是否过滤 debug 文本；</li><li>搜索依赖缺失时是否能降级；</li><li>Skill 是否能正确加载；</li><li>记忆是否不会误写入。</li></ul><h3 id="13-3-第三阶段：提升安全性"><a href="#13-3-第三阶段：提升安全性" class="headerlink" title="13.3 第三阶段：提升安全性"></a>13.3 第三阶段：提升安全性</h3><p>建议：</p><ul><li>命令执行工具加入命令白名单；</li><li>文件操作限制到 workspace；</li><li>屏幕观察增加醒目状态提示；</li><li>日志默认脱敏；</li><li>远程 API key 必须走环境变量；</li><li>模型服务默认绑定 <code>127.0.0.1</code>；</li><li>提供“隐私清理模式”。</li></ul><h3 id="13-4-第四阶段：优化用户体验"><a href="#13-4-第四阶段：优化用户体验" class="headerlink" title="13.4 第四阶段：优化用户体验"></a>13.4 第四阶段：优化用户体验</h3><p>可以继续改进：</p><ul><li>首次启动向导；</li><li>模型服务状态面板；</li><li>麦克风设备选择 UI；</li><li>声纹注册向导；</li><li>TTS 参考音频管理；</li><li>Skill Package 可视化管理；</li><li>RAG 搜索过程可视化；</li><li>工具确认弹窗优化。</li></ul>]]>
    </content>
    <id>https://star031104-github-io.pages.dev/2026/05/19/%E5%BC%80%E5%8F%91%E6%8A%A5%E5%91%8A-AI%E8%AF%AD%E9%9F%B3%E5%8A%A9%E6%89%8B/</id>
    <link href="https://star031104-github-io.pages.dev/2026/05/19/%E5%BC%80%E5%8F%91%E6%8A%A5%E5%91%8A-AI%E8%AF%AD%E9%9F%B3%E5%8A%A9%E6%89%8B/"/>
    <published>2026-05-18T16:00:00.000Z</published>
    <summary>该项目以本地大语言模型为核心，结合 FunASR 语音识别、GPT-SoVITS 语音合成、Search/RAG、Tool Calling、长期记忆、屏幕观察和 Skill Package 工作流，实现了一个可在 Windows 本地运行的个人 AI Agent Runtime。</summary>
    <title>浅梦 AI 助手 Runtime 开发报告：一个本地语音桌面 Agent 的工程化实现</title>
    <updated>2026-05-19T11:08:00.973Z</updated>
  </entry>
  <entry>
    <author>
      <name>浅梦</name>
    </author>
    <category term="AI工具" scheme="https://star031104-github-io.pages.dev/categories/AI%E5%B7%A5%E5%85%B7/"/>
    <content>
      <![CDATA[<h1 id="PPT-Master"><a href="#PPT-Master" class="headerlink" title="PPT-Master"></a>PPT-Master</h1><h1 id="一、项目介绍"><a href="#一、项目介绍" class="headerlink" title="一、项目介绍"></a>一、项目介绍</h1><p>随着大语言模型的发展，AI 自动生成 PPT 已经成为一种非常热门的应用方向。</p><p>传统 AI PPT 工具虽然可以快速生成内容，但大多数都存在一个问题：</p><h2 id="“生成后无法继续编辑”"><a href="#“生成后无法继续编辑”" class="headerlink" title="“生成后无法继续编辑”"></a>“生成后无法继续编辑”</h2><p>很多工具最终导出的：</p><ul><li>实际上只是截图</li><li>或者整页图片</li><li>无法修改布局</li><li>无法编辑图形</li><li>无法继续二次设计</li></ul><p>而 PPT-Master 最大的特点：</p><p>就是：</p><h1 id="“生成真正可编辑的-PPT”"><a href="#“生成真正可编辑的-PPT”" class="headerlink" title="“生成真正可编辑的 PPT”"></a>“生成真正可编辑的 PPT”</h1><p>项目地址：</p><p><a href="https://github.com/hugohe3/ppt-master">https://github.com/hugohe3/ppt-master</a></p><h1 id="二、PPT-Master-能干什么？"><a href="#二、PPT-Master-能干什么？" class="headerlink" title="二、PPT-Master 能干什么？"></a>二、PPT-Master 能干什么？</h1><p>PPT-Master 本质上：</p><p>是一个：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">LLM + SVG + PowerPoint DrawingML</span><br></pre></td></tr></table></figure><p>组合而成的 AI PPT 自动生成系统。</p><p>它不仅能：</p><ul><li>自动生成 PPT 内容</li><li>自动设计页面布局</li><li>自动生成图表</li><li>自动生成 SVG 页面</li></ul><p>还可以：</p><h1 id="将-SVG-转换为真正可编辑的-PPTX-文件"><a href="#将-SVG-转换为真正可编辑的-PPTX-文件" class="headerlink" title="将 SVG 转换为真正可编辑的 PPTX 文件"></a>将 SVG 转换为真正可编辑的 PPTX 文件</h1><p>最终生成的 PPT：</p><p>支持：</p><ul><li>文本编辑</li><li>图形编辑</li><li>元素拖动</li><li>配色修改</li><li>动画</li><li>转场</li></ul><p>而不是单纯的图片。</p><h1 id="三、项目核心原理"><a href="#三、项目核心原理" class="headerlink" title="三、项目核心原理"></a>三、项目核心原理</h1><p>很多人以为：</p><p>PPT-Master 是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AI → 直接生成 PPT</span><br></pre></td></tr></table></figure><p>实际上并不是。</p><p>真正流程：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">Prompt</span><br><span class="line"> ↓</span><br><span class="line">LLM 生成内容</span><br><span class="line"> ↓</span><br><span class="line">HTML / SVG 页面</span><br><span class="line"> ↓</span><br><span class="line">SVG 渲染</span><br><span class="line"> ↓</span><br><span class="line">svg_to_pptx.py</span><br><span class="line"> ↓</span><br><span class="line">DrawingML</span><br><span class="line"> ↓</span><br><span class="line">PPTX</span><br></pre></td></tr></table></figure><h1 id="四、什么是-SVG？"><a href="#四、什么是-SVG？" class="headerlink" title="四、什么是 SVG？"></a>四、什么是 SVG？</h1><p>SVG：</p><p>全称：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Scalable Vector Graphics</span><br></pre></td></tr></table></figure><p>即：</p><h1 id="矢量图形"><a href="#矢量图形" class="headerlink" title="矢量图形"></a>矢量图形</h1><p>与普通 PNG&#x2F;JPG 最大区别：</p><h2 id="SVG-是“图形描述”"><a href="#SVG-是“图形描述”" class="headerlink" title="SVG 是“图形描述”"></a>SVG 是“图形描述”</h2><p>例如：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">rect</span> <span class="attr">x</span>=<span class="string">&quot;0&quot;</span> <span class="attr">y</span>=<span class="string">&quot;0&quot;</span> <span class="attr">width</span>=<span class="string">&quot;100&quot;</span> <span class="attr">height</span>=<span class="string">&quot;100&quot;</span>/&gt;</span></span><br></pre></td></tr></table></figure><p>表示：</p><p>绘制一个矩形。</p><p>因此：</p><p>SVG：</p><ul><li>可以无限缩放</li><li>不失真</li><li>元素独立</li><li>更适合转换为 PPT 图形</li></ul><h1 id="五、为什么-SVG-非常适合-PPT？"><a href="#五、为什么-SVG-非常适合-PPT？" class="headerlink" title="五、为什么 SVG 非常适合 PPT？"></a>五、为什么 SVG 非常适合 PPT？</h1><p>因为：</p><p>PPT 本质上：</p><p>也是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">矢量图形系统</span><br></pre></td></tr></table></figure><p>所以：</p><p>SVG 与 PowerPoint：</p><p>天然兼容。</p><h1 id="六、什么是-DrawingML？"><a href="#六、什么是-DrawingML？" class="headerlink" title="六、什么是 DrawingML？"></a>六、什么是 DrawingML？</h1><p>这是 PPT-Master 最关键的技术之一。</p><p>DrawingML：</p><p>是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Microsoft Office 的图形描述语言</span><br></pre></td></tr></table></figure><p>即：</p><p>PPT 中：</p><p>所有：</p><ul><li>文字</li><li>图形</li><li>线条</li><li>形状</li></ul><p>本质上：</p><p>都是 DrawingML。</p><h1 id="七、为什么很多-AI-PPT-无法编辑？"><a href="#七、为什么很多-AI-PPT-无法编辑？" class="headerlink" title="七、为什么很多 AI PPT 无法编辑？"></a>七、为什么很多 AI PPT 无法编辑？</h1><p>因为：</p><p>它们：</p><p>实际上：</p><p>只是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">截图 → 放进 PPT</span><br></pre></td></tr></table></figure><p>例如：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">PNG</span><br><span class="line">JPG</span><br><span class="line">Canvas 截图</span><br></pre></td></tr></table></figure><p>所以：</p><p>无法：</p><ul><li>修改单独文字</li><li>修改图形</li><li>修改布局</li></ul><h1 id="八、PPT-Master-为什么能编辑？"><a href="#八、PPT-Master-为什么能编辑？" class="headerlink" title="八、PPT-Master 为什么能编辑？"></a>八、PPT-Master 为什么能编辑？</h1><p>因为：</p><p>它：</p><p>不是插图片。</p><p>而是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SVG → DrawingML → PowerPoint Shape</span><br></pre></td></tr></table></figure><p>因此：</p><p>生成的是：</p><p>真正 Office 原生元素。</p><h1 id="九、项目适合什么场景？"><a href="#九、项目适合什么场景？" class="headerlink" title="九、项目适合什么场景？"></a>九、项目适合什么场景？</h1><p>PPT-Master 非常适合：</p><h2 id="1-学术场景"><a href="#1-学术场景" class="headerlink" title="1. 学术场景"></a>1. 学术场景</h2><p>例如：</p><ul><li>论文汇报</li><li>毕设答辩</li><li>研究生开题</li><li>技术演示</li></ul><h2 id="2-企业场景"><a href="#2-企业场景" class="headerlink" title="2. 企业场景"></a>2. 企业场景</h2><p>例如：</p><ul><li>产品汇报</li><li>周报</li><li>商业演示</li><li>数据分析</li></ul><h2 id="3-AI-Agent-自动办公"><a href="#3-AI-Agent-自动办公" class="headerlink" title="3. AI Agent 自动办公"></a>3. AI Agent 自动办公</h2><p>例如：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">OpenClaw</span><br><span class="line">+</span><br><span class="line">Qwen</span><br><span class="line">+</span><br><span class="line">PPT-Master</span><br></pre></td></tr></table></figure><p>自动：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">读取数据</span><br><span class="line">↓</span><br><span class="line">总结内容</span><br><span class="line">↓</span><br><span class="line">生成 PPT</span><br><span class="line">↓</span><br><span class="line">导出汇报</span><br></pre></td></tr></table></figure><h1 id="十、下载项目"><a href="#十、下载项目" class="headerlink" title="十、下载项目"></a>十、下载项目</h1><h2 id="Git-Clone"><a href="#Git-Clone" class="headerlink" title="Git Clone"></a>Git Clone</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/hugohe3/ppt-master.git</span><br></pre></td></tr></table></figure><h2 id="或下载-ZIP"><a href="#或下载-ZIP" class="headerlink" title="或下载 ZIP"></a>或下载 ZIP</h2><p>GitHub：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Code</span><br><span class="line">↓</span><br><span class="line">Download ZIP</span><br></pre></td></tr></table></figure><h1 id="十一、创建-Conda-环境"><a href="#十一、创建-Conda-环境" class="headerlink" title="十一、创建 Conda 环境"></a>十一、创建 Conda 环境</h1><p>推荐：</p><p>单独创建环境。</p><h2 id="创建环境"><a href="#创建环境" class="headerlink" title="创建环境"></a>创建环境</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda create -n pptmaster python=3.10</span><br></pre></td></tr></table></figure><h2 id="激活环境"><a href="#激活环境" class="headerlink" title="激活环境"></a>激活环境</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda activate pptmaster</span><br></pre></td></tr></table></figure><h1 id="十二、安装项目依赖"><a href="#十二、安装项目依赖" class="headerlink" title="十二、安装项目依赖"></a>十二、安装项目依赖</h1><p>进入项目目录：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> ppt-master</span><br></pre></td></tr></table></figure><p>安装依赖：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install -r requirements.txt</span><br></pre></td></tr></table></figure><h2 id="国内推荐清华源"><a href="#国内推荐清华源" class="headerlink" title="国内推荐清华源"></a>国内推荐清华源</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple</span><br></pre></td></tr></table></figure><h1 id="十三、如何修改-PPT-风格？"><a href="#十三、如何修改-PPT-风格？" class="headerlink" title="十三、如何修改 PPT 风格？"></a>十三、如何修改 PPT 风格？</h1><p>这是很多人最关心的问题。</p><h1 id="方法-1：修改模板"><a href="#方法-1：修改模板" class="headerlink" title="方法 1：修改模板"></a>方法 1：修改模板</h1><p>项目中：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">templates/</span><br></pre></td></tr></table></figure><p>目录：</p><p>控制：</p><ul><li>字体</li><li>配色</li><li>页面布局</li><li>标题样式</li></ul><h1 id="方法-2：Prompt-控制风格"><a href="#方法-2：Prompt-控制风格" class="headerlink" title="方法 2：Prompt 控制风格"></a>方法 2：Prompt 控制风格</h1><p>例如：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">生成科技感学术 PPT：</span><br><span class="line"></span><br><span class="line">要求：</span><br><span class="line">- 深蓝配色</span><br><span class="line">- 极简风格</span><br><span class="line">- 卡片式布局</span><br><span class="line">- 动态感图形</span><br></pre></td></tr></table></figure><h1 id="方法-3：模仿论文风格"><a href="#方法-3：模仿论文风格" class="headerlink" title="方法 3：模仿论文风格"></a>方法 3：模仿论文风格</h1><p>甚至可以：</p><p>上传论文截图。</p><p>让 AI：</p><p>模仿：</p><ul><li>配色</li><li>字体</li><li>图表</li><li>布局</li></ul><h1 id="十四、如何接入-API？"><a href="#十四、如何接入-API？" class="headerlink" title="十四、如何接入 API？"></a>十四、如何接入 API？</h1><p>PPT-Master 本质：</p><p>是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">LLM + SVG + PPT</span><br></pre></td></tr></table></figure><p>因此：</p><p>支持：</p><ul><li>OpenAI</li><li>DeepSeek</li><li>Qwen</li><li>Claude</li><li>Ollama</li><li>llama.cpp</li></ul><h1 id="十五、如何提高生成质量？"><a href="#十五、如何提高生成质量？" class="headerlink" title="十五、如何提高生成质量？"></a>十五、如何提高生成质量？</h1><h1 id="1-使用更强模型"><a href="#1-使用更强模型" class="headerlink" title="1. 使用更强模型"></a>1. 使用更强模型</h1><p>推荐：</p><ul><li>GPT-4.1</li><li>Claude</li><li>Qwen3</li><li>DeepSeek</li></ul><h1 id="2-强化-Prompt"><a href="#2-强化-Prompt" class="headerlink" title="2. 强化 Prompt"></a>2. 强化 Prompt</h1><p>例如：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">生成 Apple 发布会风格 PPT：</span><br><span class="line">- 极简白色背景</span><br><span class="line">- 大标题</span><br><span class="line">- 超大留白</span><br><span class="line">- 动态渐变</span><br></pre></td></tr></table></figure><h1 id="3-使用参考图片"><a href="#3-使用参考图片" class="headerlink" title="3. 使用参考图片"></a>3. 使用参考图片</h1><p>上传：</p><ul><li>PPT</li><li>论文</li><li>UI 截图</li></ul><p>让 AI：</p><p>模仿风格。</p><h1 id="十六、项目最大优点"><a href="#十六、项目最大优点" class="headerlink" title="十六、项目最大优点"></a>十六、项目最大优点</h1><p>最大的优点：</p><h1 id="“真正适合二次编辑”"><a href="#“真正适合二次编辑”" class="headerlink" title="“真正适合二次编辑”"></a>“真正适合二次编辑”</h1><p>这是很多 AI PPT：</p><p>做不到的。</p><h1 id="十七、适合什么人？"><a href="#十七、适合什么人？" class="headerlink" title="十七、适合什么人？"></a>十七、适合什么人？</h1><p>非常适合：</p><ul><li>学生</li><li>毕设</li><li>研究生</li><li>AI 开发者</li><li>企业演示</li><li>自动办公</li></ul><h1 id="十八、未来玩法"><a href="#十八、未来玩法" class="headerlink" title="十八、未来玩法"></a>十八、未来玩法</h1><p>我现在正在尝试：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">OpenClaw</span><br><span class="line">+</span><br><span class="line">Qwen</span><br><span class="line">+</span><br><span class="line">PPT-Master</span><br></pre></td></tr></table></figure><p>实现：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">自动读取内容</span><br><span class="line">↓</span><br><span class="line">自动总结</span><br><span class="line">↓</span><br><span class="line">自动生成 PPT</span><br><span class="line">↓</span><br><span class="line">自动导出</span><br></pre></td></tr></table></figure><h1 id="十九、总结"><a href="#十九、总结" class="headerlink" title="十九、总结"></a>十九、总结</h1><p>PPT-Master 并不是：</p><p>普通 AI PPT 工具。</p><p>它更像：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">AI</span><br><span class="line">+</span><br><span class="line">SVG 渲染系统</span><br><span class="line">+</span><br><span class="line">DrawingML</span><br><span class="line">+</span><br><span class="line">Office 自动化</span><br></pre></td></tr></table></figure><p>构成的一整套：</p><h1 id="AI-自动演示文稿生成系统"><a href="#AI-自动演示文稿生成系统" class="headerlink" title="AI 自动演示文稿生成系统"></a>AI 自动演示文稿生成系统</h1><p>其真正强大的地方：</p><p>不是：</p><p>“一键生成”。</p><p>而是：</p><h1 id="“生成后还能继续编辑”"><a href="#“生成后还能继续编辑”" class="headerlink" title="“生成后还能继续编辑”"></a>“生成后还能继续编辑”</h1><p>这一点：</p><p>对于：</p><ul><li>毕设</li><li>学术汇报</li><li>企业 PPT</li></ul><p>都非常重要。</p><h3 id="PPT-Master-保姆教程，如何在-windows-系统下安装使用及如何配置生图模型"><a href="#PPT-Master-保姆教程，如何在-windows-系统下安装使用及如何配置生图模型" class="headerlink" title="PPT-Master 保姆教程，如何在 windows 系统下安装使用及如何配置生图模型"></a><a href="https://www.bilibili.com/video/BV1g59CB3Esj?vd_source=1ca5bb8c4551fd6e13f5aa490c154a33">PPT-Master 保姆教程，如何在 windows 系统下安装使用及如何配置生图模型</a></h3>]]>
    </content>
    <id>https://star031104-github-io.pages.dev/2026/05/09/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3-PPT-Master/</id>
    <link href="https://star031104-github-io.pages.dev/2026/05/09/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3-PPT-Master/"/>
    <published>2026-05-09T15:30:00.000Z</published>
    <summary>从项目原理、系统架构、SVG 渲染、DrawingML 到 Windows 本地部署，完整解析 PPT-Master 技术实现与运行流程</summary>
    <title>PPT-Master</title>
    <updated>2026-05-09T15:40:37.026Z</updated>
  </entry>
  <entry>
    <author>
      <name>浅梦</name>
    </author>
    <category term="开发报告" scheme="https://star031104-github-io.pages.dev/categories/%E5%BC%80%E5%8F%91%E6%8A%A5%E5%91%8A/"/>
    <content>
      <![CDATA[<h1 id="基于大模型的移动应用合规检测系统开发记录"><a href="#基于大模型的移动应用合规检测系统开发记录" class="headerlink" title="基于大模型的移动应用合规检测系统开发记录"></a>基于大模型的移动应用合规检测系统开发记录</h1><p>最近一直在做一个和“大模型 + RAG + 移动应用隐私合规检测”相关的项目。</p><p>这个项目从最开始的简单想法，到后面慢慢扩展成完整的实验系统，其实经历了很长时间的迭代。</p><p>现在回头看，已经不仅仅只是一个“调用大模型”的脚本了，而是一个包含：</p><ul><li>标准知识库构建</li><li>RAG 检索</li><li>应用分类</li><li>隐私政策分析</li><li>APK 权限分析</li><li>自动报告生成</li><li>实验评估</li><li>消融实验</li></ul><p>的完整研究型项目。</p><h1 id="一、项目最开始的想法"><a href="#一、项目最开始的想法" class="headerlink" title="一、项目最开始的想法"></a>一、项目最开始的想法</h1><p>一开始做这个项目，其实是因为发现：</p><p>现在很多移动应用虽然都有隐私政策，但真正认真阅读的人很少。</p><p>而且很多应用存在：</p><ul><li>权限申请过多</li><li>隐私政策披露不完整</li><li>实际行为和声明不一致</li><li>敏感信息处理不规范</li></ul><p>这些问题。</p><p>于是后面就开始思考：</p><p>能不能利用大模型和 RAG，把国家标准、隐私政策和 APK 权限结合起来，自动做合规分析？</p><p>后来整个项目就慢慢成型了。</p><h1 id="二、项目整体目标"><a href="#二、项目整体目标" class="headerlink" title="二、项目整体目标"></a>二、项目整体目标</h1><p>整个系统主要围绕三个问题展开：</p><h2 id="1-应用分类识别"><a href="#1-应用分类识别" class="headerlink" title="1. 应用分类识别"></a>1. 应用分类识别</h2><p>系统需要先判断：</p><p>一个应用到底属于什么类型。</p><p>这里参考的是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">GB/T 41391-2022</span><br></pre></td></tr></table></figure><p>中的重点应用类别。</p><p>系统会结合：</p><ul><li>应用简介</li><li>隐私政策</li><li>国标定义</li><li>RAG 检索结果</li></ul><p>自动完成分类。</p><h2 id="2-隐私政策合规审查"><a href="#2-隐私政策合规审查" class="headerlink" title="2. 隐私政策合规审查"></a>2. 隐私政策合规审查</h2><p>第二部分是分析隐私政策本身。</p><p>例如：</p><ul><li>是否明确说明收集的数据</li><li>是否说明用途</li><li>是否涉及敏感信息</li><li>是否存在第三方共享</li><li>是否涉及未成年人规则</li></ul><p>然后结合国家标准做合规判断。</p><h2 id="3-APK-权限一致性分析"><a href="#3-APK-权限一致性分析" class="headerlink" title="3. APK 权限一致性分析"></a>3. APK 权限一致性分析</h2><p>这一部分主要是：</p><p>把 APK 权限和隐私政策进行比对。</p><p>例如：</p><ul><li>是否申请了未披露权限</li><li>是否存在超范围申请</li><li>权限和业务是否匹配</li><li>是否属于高风险权限</li></ul><p>这一部分后面做得其实比较复杂。</p><h1 id="三、项目技术路线"><a href="#三、项目技术路线" class="headerlink" title="三、项目技术路线"></a>三、项目技术路线</h1><p>整个系统后面采用的是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">国家标准 → RAG知识库 → 大模型分析 → 自动生成报告</span><br></pre></td></tr></table></figure><p>这样的整体链路。</p><h1 id="四、RAG-知识库构建"><a href="#四、RAG-知识库构建" class="headerlink" title="四、RAG 知识库构建"></a>四、RAG 知识库构建</h1><p>这一部分其实是整个系统最麻烦的部分之一。</p><p>因为国家标准 PDF 本身结构并不好处理。</p><p>所以后面单独做了一整套：</p><ul><li>PDF 渲染</li><li>OCR 解析</li><li>JSON 清洗</li><li>chunk 切分</li><li>embedding 构建</li><li>FAISS 向量化</li></ul><p>流程。</p><h2 id="1-PDF-渲染"><a href="#1-PDF-渲染" class="headerlink" title="1. PDF 渲染"></a>1. PDF 渲染</h2><p>首先把 PDF 渲染成高清图片。</p><p>这样后面的 OCR 才更稳定。</p><h2 id="2-OCR-解析"><a href="#2-OCR-解析" class="headerlink" title="2. OCR 解析"></a>2. OCR 解析</h2><p>后面使用：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">PaddleOCRVL</span><br></pre></td></tr></table></figure><p>做版面解析。</p><p>包括：</p><ul><li>标题</li><li>表格</li><li>附录</li><li>段落结构</li></ul><p>全部提取成结构化内容。</p><h2 id="3-chunk-构建"><a href="#3-chunk-构建" class="headerlink" title="3. chunk 构建"></a>3. chunk 构建</h2><p>这一部分其实调了很久。</p><p>因为：</p><p>chunk 太小会丢上下文。</p><p>chunk 太大又会影响检索精度。</p><p>后面针对：</p><ul><li>权限</li><li>类别</li><li>敏感信息</li><li>附录</li></ul><p>做了强化切分。</p><h2 id="4-向量化"><a href="#4-向量化" class="headerlink" title="4. 向量化"></a>4. 向量化</h2><p>最后把 chunk 写入：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">FAISS</span><br></pre></td></tr></table></figure><p>形成 RAG 检索库。</p><h1 id="五、应用分类模块"><a href="#五、应用分类模块" class="headerlink" title="五、应用分类模块"></a>五、应用分类模块</h1><p>后面单独做了应用分类模块。</p><p>采用的是“两阶段分类”。</p><h2 id="第一阶段"><a href="#第一阶段" class="headerlink" title="第一阶段"></a>第一阶段</h2><p>先判断：</p><p>应用是否属于国标中的重点类别。</p><h2 id="第二阶段"><a href="#第二阶段" class="headerlink" title="第二阶段"></a>第二阶段</h2><p>如果属于重点类别：</p><p>再进一步细分具体类型。</p><p>例如：</p><ul><li>社交</li><li>地图导航</li><li>电商</li><li>工具类</li></ul><p>等等。</p><h1 id="六、多任务合规分析"><a href="#六、多任务合规分析" class="headerlink" title="六、多任务合规分析"></a>六、多任务合规分析</h1><p>后面整个系统核心其实是：</p><p>三类关系分析。</p><h2 id="1-国标-↔-隐私政策"><a href="#1-国标-↔-隐私政策" class="headerlink" title="1. 国标 ↔ 隐私政策"></a>1. 国标 ↔ 隐私政策</h2><p>分析隐私政策是否符合国家标准。</p><p>包括：</p><ul><li>告知义务</li><li>敏感信息</li><li>第三方共享</li><li>用户同意</li><li>未成年人规则</li></ul><p>等控制点。</p><h2 id="2-隐私政策-↔-APK-权限"><a href="#2-隐私政策-↔-APK-权限" class="headerlink" title="2. 隐私政策 ↔ APK 权限"></a>2. 隐私政策 ↔ APK 权限</h2><p>这一部分主要分析：</p><p>权限是否在隐私政策中被披露。</p><p>后面采用的是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">规则召回 + LLM 抽取 + 原文匹配 + LLM 判定</span><br></pre></td></tr></table></figure><p>的混合方案。</p><h2 id="3-国标-↔-APK-权限"><a href="#3-国标-↔-APK-权限" class="headerlink" title="3. 国标 ↔ APK 权限"></a>3. 国标 ↔ APK 权限</h2><p>这一部分会进一步判断：</p><p>某个权限到底：</p><ul><li>是否业务必要</li><li>是否合理</li><li>是否属于高风险权限</li></ul><p>最后给出风险等级。</p><h1 id="七、实验部分"><a href="#七、实验部分" class="headerlink" title="七、实验部分"></a>七、实验部分</h1><p>这个项目后面其实不仅仅是功能实现。</p><p>还做了很多实验。</p><p>包括：</p><ul><li>RAG 检索评估</li><li>分类评估</li><li>报告质量评估</li><li>效率评估</li><li>消融实验</li></ul><p>这一部分对论文帮助非常大。</p><h1 id="八、开发过程中遇到的问题"><a href="#八、开发过程中遇到的问题" class="headerlink" title="八、开发过程中遇到的问题"></a>八、开发过程中遇到的问题</h1><p>其实整个项目踩了很多坑。</p><h2 id="1-OCR-解析稳定性"><a href="#1-OCR-解析稳定性" class="headerlink" title="1. OCR 解析稳定性"></a>1. OCR 解析稳定性</h2><p>不同 PDF 格式差异很大。</p><p>有些：</p><ul><li>表格会错位</li><li>标题层级会丢失</li><li>附录结构很混乱</li></ul><p>后面做了大量清洗。</p><h2 id="2-chunk-切分问题"><a href="#2-chunk-切分问题" class="headerlink" title="2. chunk 切分问题"></a>2. chunk 切分问题</h2><p>最开始直接固定长度切分。</p><p>结果：</p><p>RAG 检索效果很差。</p><p>后面改成：</p><ul><li>语义结构切分</li><li>表格强化</li><li>权限特殊处理</li></ul><p>效果才慢慢稳定。</p><h2 id="3-权限语义映射"><a href="#3-权限语义映射" class="headerlink" title="3. 权限语义映射"></a>3. 权限语义映射</h2><p>这一部分其实很难。</p><p>因为：</p><p>很多权限并不一定能直接映射到某种业务。</p><p>尤其是：</p><ul><li>厂商权限</li><li>第三方 SDK 权限</li></ul><p>后面增加了弱语义推断。</p><h2 id="4-大模型稳定性"><a href="#4-大模型稳定性" class="headerlink" title="4. 大模型稳定性"></a>4. 大模型稳定性</h2><p>不同模型输出风格差异非常明显。</p><p>后面为了保证：</p><ul><li>输出格式稳定</li><li>报告结构统一</li></ul><p>又做了很多 prompt 约束。</p><h1 id="九、目前项目的整体状态"><a href="#九、目前项目的整体状态" class="headerlink" title="九、目前项目的整体状态"></a>九、目前项目的整体状态</h1><p>目前整个系统已经能够完成：</p><ul><li>标准解析</li><li>知识库构建</li><li>RAG 检索</li><li>应用分类</li><li>三类合规分析</li><li>自动生成 Markdown 报告</li><li>实验评估</li></ul><p>已经基本具备完整研究型原型系统的能力。</p><h1 id="十、后续准备继续优化的方向"><a href="#十、后续准备继续优化的方向" class="headerlink" title="十、后续准备继续优化的方向"></a>十、后续准备继续优化的方向</h1><p>后面准备继续完善：</p><h2 id="1-配置系统统一化"><a href="#1-配置系统统一化" class="headerlink" title="1. 配置系统统一化"></a>1. 配置系统统一化</h2><p>目前很多：</p><ul><li>路径</li><li>模型名</li><li>参数</li></ul><p>还写在脚本里。</p><p>后面准备统一：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">config.yaml</span><br></pre></td></tr></table></figure><p>管理。</p><h2 id="2-FastAPI-接口化"><a href="#2-FastAPI-接口化" class="headerlink" title="2. FastAPI 接口化"></a>2. FastAPI 接口化</h2><p>目前主要还是：</p><p>批处理脚本。</p><p>后面准备做：</p><ul><li>FastAPI 后端</li><li>Web 页面</li><li>文件上传</li><li>报告下载</li></ul><p>让整个系统更像真正的平台。</p><h2 id="3-模块进一步解耦"><a href="#3-模块进一步解耦" class="headerlink" title="3. 模块进一步解耦"></a>3. 模块进一步解耦</h2><p>目前部分代码：</p><ul><li>LLM 调用</li><li>IO</li><li>文本清洗</li></ul><p>还有重复逻辑。</p><p>后面准备继续模块化。</p><h1 id="十一、总结"><a href="#十一、总结" class="headerlink" title="十一、总结"></a>十一、总结</h1><p>这个项目其实是目前做过最复杂的一个项目之一。</p><p>从最开始的想法，到后面：</p><ul><li>RAG</li><li>OCR</li><li>向量检索</li><li>权限分析</li><li>Prompt</li><li>消融实验</li></ul>]]>
    </content>
    <id>https://star031104-github-io.pages.dev/2026/05/07/%E5%BC%80%E5%8F%91%E6%8A%A5%E5%91%8A-%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1/</id>
    <link href="https://star031104-github-io.pages.dev/2026/05/07/%E5%BC%80%E5%8F%91%E6%8A%A5%E5%91%8A-%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1/"/>
    <published>2026-05-06T16:00:00.000Z</published>
    <summary>基于大模型、RAG 与 APK 权限分析的移动应用隐私合规检测系统开发记录。</summary>
    <title>基于大模型的移动应用合规检测系统开发记录</title>
    <updated>2026-05-07T16:41:47.205Z</updated>
  </entry>
  <entry>
    <author>
      <name>浅梦</name>
    </author>
    <category term="技术文档" scheme="https://star031104-github-io.pages.dev/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/"/>
    <content>
      <![CDATA[<h1 id="Qwen-本地部署记录"><a href="#Qwen-本地部署记录" class="headerlink" title="Qwen 本地部署记录"></a>Qwen 本地部署记录</h1><p>最近开始正式折腾本地大模型。</p><p>相比直接使用在线 API，本地部署最大的优点其实是：</p><ul><li>隐私可控</li><li>不受网络限制</li><li>响应速度稳定</li><li>可以自由改参数</li><li>能接各种 Agent 系统</li></ul><p>这次主要使用：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Qwen + llama.cpp + RTX4060 Laptop</span><br></pre></td></tr></table></figure><p>进行本地部署。</p><h1 id="一、设备环境"><a href="#一、设备环境" class="headerlink" title="一、设备环境"></a>一、设备环境</h1><p>目前使用的设备：</p><ul><li>Honor MagicBook Pro 16</li><li>RTX 4060 Laptop GPU（8GB）</li><li>Windows 11</li><li>WSL2 Ubuntu 22.04</li></ul><h1 id="二、为什么选择-Qwen"><a href="#二、为什么选择-Qwen" class="headerlink" title="二、为什么选择 Qwen"></a>二、为什么选择 Qwen</h1><p>一开始其实对比过很多模型：</p><ul><li>DeepSeek</li><li>Llama</li><li>Mistral</li><li>Qwen</li></ul><p>最后还是选择了 Qwen。</p><p>主要原因：</p><h2 id="1-中文能力强"><a href="#1-中文能力强" class="headerlink" title="1. 中文能力强"></a>1. 中文能力强</h2><p>Qwen 的中文表现确实很好。</p><p>尤其：</p><ul><li>长文本</li><li>中文逻辑</li><li>技术问题</li></ul><p>明显比很多模型更自然。</p><h2 id="2-本地部署生态成熟"><a href="#2-本地部署生态成熟" class="headerlink" title="2. 本地部署生态成熟"></a>2. 本地部署生态成熟</h2><p>目前：</p><ul><li>GGUF</li><li>llama.cpp</li><li>Ollama</li></ul><p>对 Qwen 支持都很好。</p><p>部署方便很多。</p><h2 id="3-参数规模适合-4060-Laptop"><a href="#3-参数规模适合-4060-Laptop" class="headerlink" title="3. 参数规模适合 4060 Laptop"></a>3. 参数规模适合 4060 Laptop</h2><p>因为只有 8GB 显存。</p><p>所以：</p><ul><li>70B 基本不现实</li><li>32B 边缘可跑</li><li>14B &#x2F; 7B 更舒服</li></ul><p>后面主要使用：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Qwen3.5-27B-Q4_K_M.gguf</span><br></pre></td></tr></table></figure><p>进行测试。</p><h1 id="三、部署-llama-cpp"><a href="#三、部署-llama-cpp" class="headerlink" title="三、部署 llama.cpp"></a>三、部署 llama.cpp</h1><h2 id="1-克隆项目"><a href="#1-克隆项目" class="headerlink" title="1. 克隆项目"></a>1. 克隆项目</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/ggerganov/llama.cpp</span><br><span class="line"><span class="built_in">cd</span> llama.cpp</span><br></pre></td></tr></table></figure><h2 id="2-编译-CUDA-版本"><a href="#2-编译-CUDA-版本" class="headerlink" title="2. 编译 CUDA 版本"></a>2. 编译 CUDA 版本</h2><p>使用：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cmake -B build -DGGML_CUDA=ON</span><br><span class="line">cmake --build build --config Release</span><br></pre></td></tr></table></figure><h1 id="四、踩过的坑"><a href="#四、踩过的坑" class="headerlink" title="四、踩过的坑"></a>四、踩过的坑</h1><h2 id="1-CUDA-找不到"><a href="#1-CUDA-找不到" class="headerlink" title="1. CUDA 找不到"></a>1. CUDA 找不到</h2><p>最开始：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nvcc not found</span><br></pre></td></tr></table></figure><p>后面发现：</p><p>CUDA 没正确配置环境变量。</p><h2 id="2-Visual-Studio-编译问题"><a href="#2-Visual-Studio-编译问题" class="headerlink" title="2. Visual Studio 编译问题"></a>2. Visual Studio 编译问题</h2><p>还遇到：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">No CMAKE_ASM_COMPILER could be found</span><br></pre></td></tr></table></figure><p>后来安装：</p><ul><li>Desktop development with C++</li><li>MSVC</li><li>Windows SDK</li></ul><p>才正常。</p><h1 id="五、模型下载"><a href="#五、模型下载" class="headerlink" title="五、模型下载"></a>五、模型下载</h1><p>模型使用：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Qwen3.5-27B-GGUF</span><br></pre></td></tr></table></figure><p>下载：</p><ul><li>Q4_K_M</li><li>Q5_K_M</li></ul><p>两个量化版本。</p><h1 id="六、启动参数"><a href="#六、启动参数" class="headerlink" title="六、启动参数"></a>六、启动参数</h1><p>目前最常用：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">llama-server ^</span><br><span class="line">-m Qwen3.5-27B-Q4_K_M.gguf ^</span><br><span class="line">-ngl 99 ^</span><br><span class="line">-c 8192 ^</span><br><span class="line">-t 22 ^</span><br><span class="line">--host 0.0.0.0 ^</span><br><span class="line">--port 8000</span><br></pre></td></tr></table></figure><h1 id="七、参数说明"><a href="#七、参数说明" class="headerlink" title="七、参数说明"></a>七、参数说明</h1><h2 id="1-ngl"><a href="#1-ngl" class="headerlink" title="1. ngl"></a>1. ngl</h2><p>GPU 层数。</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">-ngl 99</span><br></pre></td></tr></table></figure><p>代表尽量全部放 GPU。</p><h2 id="2-c"><a href="#2-c" class="headerlink" title="2. c"></a>2. c</h2><p>上下文长度。</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">-c 8192</span><br></pre></td></tr></table></figure><p>代表：</p><p>8K 上下文。</p><h2 id="3-t"><a href="#3-t" class="headerlink" title="3. t"></a>3. t</h2><p>CPU 线程数。</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">-t 22</span><br></pre></td></tr></table></figure><p>对应 CPU 线程数量。</p><h1 id="八、关闭思考模式"><a href="#八、关闭思考模式" class="headerlink" title="八、关闭思考模式"></a>八、关闭思考模式</h1><p>后面发现：</p><p>Qwen 思考模式虽然强。</p><p>但：</p><ul><li>输出慢</li><li>token 消耗大</li><li>有时太啰嗦</li></ul><p>后面默认关闭：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">--chat-template-kwargs <span class="string">&quot;&#123;\&quot;enable_thinking\&quot;:false&#125;&quot;</span></span><br></pre></td></tr></table></figure><h1 id="九、实际体验"><a href="#九、实际体验" class="headerlink" title="九、实际体验"></a>九、实际体验</h1><p>目前：</p><ul><li>日常聊天没问题</li><li>技术问答效果很好</li><li>中文体验优秀</li></ul><p>但：</p><p>27B 在 8GB 显存下：</p><p>还是有一定压力。</p>]]>
    </content>
    <id>https://star031104-github-io.pages.dev/2026/05/07/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3-Qwen%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%E8%AE%B0%E5%BD%95/</id>
    <link href="https://star031104-github-io.pages.dev/2026/05/07/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3-Qwen%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%E8%AE%B0%E5%BD%95/"/>
    <published>2026-05-06T16:00:00.000Z</published>
    <summary>基于 llama.cpp 在 RTX4060 Laptop 上部署 Qwen 本地大模型的完整记录。</summary>
    <title>Qwen 本地部署记录</title>
    <updated>2026-05-07T17:05:44.288Z</updated>
  </entry>
  <entry>
    <author>
      <name>浅梦</name>
    </author>
    <category term="随笔" scheme="https://star031104-github-io.pages.dev/categories/%E9%9A%8F%E7%AC%94/"/>
    <content>
      <![CDATA[<p>今天花了一整天，把自己的个人博客慢慢搭了起来。</p><p>从最开始什么都没有，到现在真正拥有了一个属于自己的网页空间，过程其实比想象中更有意思。</p><p>一开始只是想简单做一个技术博客，用来记录以后学习 AI、本地大模型和开发过程里的内容。后来越改越上头，从 Hexo 到 Butterfly，从背景图到毛玻璃，再到导航栏、图片墙、视频页、随笔页……慢慢发现，自己想做的已经不只是一个“技术博客”。</p><p>更像是一个属于自己的数字空间。</p><p>这里以后不仅会放技术文档，也会记录一些生活里的东西，比如图片、视频、游戏截图、灵感、情绪、碎碎念，甚至可能只是某一天突然很喜欢的一张图。</p><p>今天最大的感受，大概是：</p><p>原来从零把一个网站慢慢搭成自己喜欢的样子，会有一种很强的“归属感”。</p><p>尤其是当背景、颜色、动画和布局一点点变成自己想要的风格的时候，会觉得这个页面真的开始“像自己”了。</p><p>目前博客还有很多地方没完善：</p><ul><li>关于我页面还没完全做好</li><li>图片墙和视频页还在继续调整</li><li>后面还想接 AI 功能</li><li>还想加更多动态效果和内容分类</li></ul><p>但至少现在，它已经不再是默认模板了。</p><p>而是真正开始变成：</p><p>一个属于自己的长期记录空间。</p><p>以后应该会经常在这里更新东西。</p><pre><code></code></pre>]]>
    </content>
    <id>https://star031104-github-io.pages.dev/2026/05/07/%E9%9A%8F%E7%AC%94-%E4%BB%8A%E5%A4%A9%E7%9A%84%E4%B8%80%E7%82%B9%E6%83%B3%E6%B3%95/</id>
    <link href="https://star031104-github-io.pages.dev/2026/05/07/%E9%9A%8F%E7%AC%94-%E4%BB%8A%E5%A4%A9%E7%9A%84%E4%B8%80%E7%82%B9%E6%83%B3%E6%B3%95/"/>
    <published>2026-05-06T16:00:00.000Z</published>
    <summary>
      <![CDATA[<p>今天花了一整天，把自己的个人博客慢慢搭了起来。</p>
<p>从最开始什么都没有，到现在真正拥有了一个属于自己的网页空间，过程其实比想象中更有意思。</p>
<p>一开始只是想简单做一个技术博客，用来记录以后学习 AI、本地大模型和开发过程里的内容。后来越改越上头，从 He]]>
    </summary>
    <title>搭建属于自己的博客</title>
    <updated>2026-05-07T16:56:59.753Z</updated>
  </entry>
  <entry>
    <author>
      <name>浅梦</name>
    </author>
    <category term="技术文档" scheme="https://star031104-github-io.pages.dev/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/"/>
    <content>
      <![CDATA[<h1 id="WSL2-CUDA-配置记录"><a href="#WSL2-CUDA-配置记录" class="headerlink" title="WSL2 CUDA 配置记录"></a>WSL2 CUDA 配置记录</h1><p>最近很多本地 AI 工具都开始依赖：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Linux + CUDA</span><br></pre></td></tr></table></figure><p>环境。</p><p>所以后面开始正式折腾：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Windows + WSL2 + CUDA</span><br></pre></td></tr></table></figure><p>这一套环境。</p><h1 id="一、为什么使用-WSL2"><a href="#一、为什么使用-WSL2" class="headerlink" title="一、为什么使用 WSL2"></a>一、为什么使用 WSL2</h1><p>相比虚拟机：</p><p>WSL2 最大的优点是：</p><ul><li>更轻量</li><li>GPU 支持更好</li><li>Linux 兼容性强</li><li>开发方便</li></ul><p>现在很多：</p><ul><li>OpenClaw</li><li>Docker</li><li>AI Agent</li><li>Python 环境</li></ul><p>都更适合 Linux。</p><h1 id="二、安装-WSL2"><a href="#二、安装-WSL2" class="headerlink" title="二、安装 WSL2"></a>二、安装 WSL2</h1><p>管理员 PowerShell：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wsl <span class="literal">--install</span></span><br></pre></td></tr></table></figure><p>安装完成后：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wsl <span class="literal">-l</span> <span class="literal">-v</span></span><br></pre></td></tr></table></figure><p>查看版本。</p><h1 id="三、安装-Ubuntu"><a href="#三、安装-Ubuntu" class="headerlink" title="三、安装 Ubuntu"></a>三、安装 Ubuntu</h1><p>安装：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Ubuntu 22.04</span><br></pre></td></tr></table></figure><p>作为主要开发环境。</p><h1 id="四、检查-GPU"><a href="#四、检查-GPU" class="headerlink" title="四、检查 GPU"></a>四、检查 GPU</h1><p>进入 WSL：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nvidia-smi</span><br></pre></td></tr></table></figure><p>如果正常：</p><p>会显示 GPU 信息。</p><h1 id="五、安装-CUDA-Toolkit"><a href="#五、安装-CUDA-Toolkit" class="headerlink" title="五、安装 CUDA Toolkit"></a>五、安装 CUDA Toolkit</h1><p>下载：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CUDA Toolkit</span><br></pre></td></tr></table></figure><p>然后安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt install nvidia-cuda-toolkit</span><br></pre></td></tr></table></figure><h1 id="六、Python-环境"><a href="#六、Python-环境" class="headerlink" title="六、Python 环境"></a>六、Python 环境</h1><p>后面主要使用：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda</span><br></pre></td></tr></table></figure><p>管理环境。</p><p>创建：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda create -n llm python=3.11</span><br></pre></td></tr></table></figure><h1 id="七、PyTorch-GPU-测试"><a href="#七、PyTorch-GPU-测试" class="headerlink" title="七、PyTorch GPU 测试"></a>七、PyTorch GPU 测试</h1><p>测试：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> torch</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(torch.cuda.is_available())</span><br></pre></td></tr></table></figure><p>输出：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">True</span><br></pre></td></tr></table></figure><p>说明 CUDA 正常。</p><h1 id="八、遇到的问题"><a href="#八、遇到的问题" class="headerlink" title="八、遇到的问题"></a>八、遇到的问题</h1><h2 id="1-localhost-代理问题"><a href="#1-localhost-代理问题" class="headerlink" title="1. localhost 代理问题"></a>1. localhost 代理问题</h2><p>WSL NAT 模式下：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">localhost 代理不互通</span><br></pre></td></tr></table></figure><p>导致：</p><p>很多工具无法直接走代理。</p><p>后面需要：</p><ul><li>手动设置 IP</li><li>或桥接模式</li></ul><h2 id="2-CUDA-版本不匹配"><a href="#2-CUDA-版本不匹配" class="headerlink" title="2. CUDA 版本不匹配"></a>2. CUDA 版本不匹配</h2><p>有时候：</p><ul><li>驱动版本</li><li>CUDA Toolkit</li><li>PyTorch CUDA</li></ul><p>版本不一致。</p><p>会导致：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CUDA unavailable</span><br></pre></td></tr></table></figure><h1 id="九、实际效果"><a href="#九、实际效果" class="headerlink" title="九、实际效果"></a>九、实际效果</h1><p>配置完成后：</p><p>目前已经能够正常：</p><ul><li>跑 llama.cpp</li><li>跑 PyTorch</li><li>跑 OpenClaw</li><li>使用 GPU 推理</li></ul><p>整体体验比 Windows 原生稳定很多。</p><h1 id="十、总结"><a href="#十、总结" class="headerlink" title="十、总结"></a>十、总结</h1><p>WSL2 现在已经基本成为：</p><p>Windows 本地 AI 开发的核心环境之一。</p><p>尤其：</p><ul><li>CUDA</li><li>Docker</li><li>Python</li><li>Agent</li></ul><p>这一整套生态。</p><p>在 Linux 下体验明显更完整。</p>]]>
    </content>
    <id>https://star031104-github-io.pages.dev/2026/05/07/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3-WSL2%E9%85%8D%E7%BD%AECUDA/</id>
    <link href="https://star031104-github-io.pages.dev/2026/05/07/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3-WSL2%E9%85%8D%E7%BD%AECUDA/"/>
    <published>2026-05-06T16:00:00.000Z</published>
    <summary>Windows + WSL2 下配置 CUDA 与 GPU 加速环境的完整记录。</summary>
    <title>WSL2 CUDA 配置记录</title>
    <updated>2026-05-07T17:05:43.326Z</updated>
  </entry>
</feed>
