<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
    <channel>
            <title>Solinx</title>
            <link>http://www.solinx.cn</link>
        <generator>Halo 1.6.0</generator>
        <lastBuildDate>Mon, 01 Jun 2026 08:19:13 CST</lastBuildDate>
                <item>
                    <title>
                        <![CDATA[Claude Code 动态工作流：让 Agent 像流水线一样协作]]>
                    </title>
                    <link>http://www.solinx.cn/archives/20260600001</link>
                    <description>
                            <![CDATA[<p>Dynamic Workflow(动态工作流) 是 Claude Code 提供的一种<strong>脚本化多 Agent 编排机制</strong>。它允许你用纯 JavaScript 编写一个工作流脚本，定义 Agent 之间的执行顺序、数据传递和控制逻辑，然后由运行时在后台自动执行，同时你的会话保持响应。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/96187c7c5754e54df4a8ff58df199ad5_1780146781487.png" alt="96187c7c5754e54df4a8ff58df199ad5.png" /></p><p>本文将通过：什么是动态工作流、如何使用、基本语法、A股调研工作流等这么几个阶段带你了解熟悉动态工作流。</p><p><strong>普通对话</strong>：一次只能跟一个 Agent 交互，Claude Code 逐轮决定做什么<br /><strong>Dynamic Workflow</strong>：你把编排逻辑写成脚本，运行时执行脚本，中间结果留在脚本变量里，Claude Code 的上下文只持有最终答案</p><p><strong>核心区别在于：谁掌握计划？</strong> 子Agent和 Skills 由 Claude Code 逐轮决定接下来做什么；工作流把计划移入代码，由脚本决定。</p><h2 id="为什么需要它">为什么需要它？</h2><h3 id="子agent和-skills-的局限">子Agent和 Skills 的局限</h3><p>当你让 Claude 用子Agent处理大任务时，它可能会：</p><ul><li>上下文窗口被中间结果填满，忘记前面的分析</li><li>每次运行的编排流程不一致，结果不可重复</li><li>遇到循环逻辑（&quot;找到 bug → 修复 → 再找&quot;）时难以自动迭代</li></ul><pre><code>subagents — Claude 生成的工作者▸ 谁决定：Claude，逐轮 ▸ 中间结果：上下文窗口 ▸ 可重复：工作者定义 ▸ 规模：每轮几个 ▸ 中断：重启轮次工作流 — 运行时执行的脚本▸ 谁决定：**脚本** ▸ 中间结果：**脚本变量** ▸ 可重复：**编排本身** ▸ 规模：数十到数百个Agent ▸ 中断：同一会话可恢复</code></pre><blockquote><p>把计划移入代码，还让工作流可以应用可重复的质量模式——比如让独立Agent在报告之前对彼此的发现进行<strong>对抗性审查</strong>，或从多个角度起草计划并相互权衡，获得比单次通过更可信的结果。</p></blockquote><h2 id="快速上手">快速上手</h2><h3 id="方式一在提示中说workflow">方式一：在提示中说&quot;workflow&quot;</h3><p>在你的提示中包含单词 <code>workflow</code>，Claude Code 就会为任务编写工作流脚本，而不是逐轮处理：</p><pre><code>运行一个 workflow 测试并修复当前应用</code></pre><p>Claude Code 会在你的输入中高亮 <code>workflow</code> 这个词，然后自动编写脚本并启动运行。</p><blockquote><p><strong>小贴士</strong>：如果不小心触发了，按 <code>Alt+W</code> 为此提示忽略它。要完全关闭关键字触发，在 <code>/config</code> 中关闭 &quot;Dynamic workflows&quot;。</p></blockquote><h3 id="方式二使用-ultracode">方式二：使用 Ultracode</h3><p>Ultracode 结合了 <code>xhigh</code> 推理努力与自动工作流编排。启用后，Claude Code 为每个实质性任务自动规划工作流：</p><pre><code>/effort ultracode</code></pre><p>启用后，单个请求可能变成一系列工作流：一个理解代码，一个进行更改，一个验证它。Ultracode 只在当前会话生效，新会话会重置。返回日常工作用 <code>/effort high</code>。</p><h3 id="方式三运行内置工作流">方式三：运行内置工作流</h3><p>Claude Code 内置了 <code>/deep-research</code> 工作流，一行命令启动：</p><pre><code>/deep-research 研究下海南自贸港的优势与机会</code></pre><p>它会自动完成多角度搜索 → 提取声明 → 对抗性验证 → 综合报告的完整研究流程。</p><h3 id="方式四让-claude-直接编写自定义工作流">方式四：让 Claude 直接编写自定义工作流</h3><p>你也可以直接描述工作流任务，让 Claude 编写一个完整的工作流脚本。脚本写好后，工作流在未来会话中从任一位置作为 /<name> 触发运行。</p><h3 id="批准与权限">批准与权限</h3><p>工作流启动前，Claude Code 会显示计划的阶段和选项：</p><ul><li>**Yes, run it **：启动运行</li><li>**Yes, and don’t ask again for <name> in <path> **：启动，并跳过此项目中此工作流的后续提示</li><li>**View raw scrip **：在决定前读取脚本</li><li><strong>否</strong>：取消</li></ul><p>不同权限模式的行为：</p><ul><li><strong>Default / accept edits</strong>：每次运行（除非选了&quot;不再询问&quot;）</li><li><strong>Auto</strong>：仅首次启动，之后记住同意</li><li><strong>Bypass permissions / <code>claude -p</code></strong>：从不提示，立即启动</li></ul><blockquote><p><strong>注意</strong>：工作流中的子Agent始终在 <code>acceptEdits</code> 模式下运行，文件编辑自动批准。Shell 命令和网络请求仍可能提示你。</p></blockquote><h2 id="核心-api-详解">核心 API 详解</h2><p>工作流脚本是一个 JavaScript 文件，必须导出 <code>meta</code> 对象。脚本体内可以直接使用以下全局函数，无需 import。</p><h3 id="meta--工作流元数据"><code>meta</code> —— 工作流元数据</h3><pre><code class="language-javascript">export const meta = {  name: 'code-review',  description: '多维度代码审查工作流',  phases: [    { title: 'Review', detail: '并行审查多个维度' },    { title: 'Verify', detail: '验证每个发现' },  ],}</code></pre><p><code>meta</code> 必须是纯字面量——不能有变量、函数调用或模板插值。</p><h3 id="phasetitle--阶段分组"><code>phase(title)</code> —— 阶段分组</h3><pre><code class="language-javascript">phase('准备')// ... 所有 agent 归入&quot;准备&quot;阶段phase('执行')// ... 所有 agent 归入&quot;执行&quot;阶段</code></pre><p>阶段在进度显示中作为分组框，帮助你一眼看清工作流进展到哪一步。<code>phase()</code> 调用的标题应该和 <code>meta.phases</code> 中的 <code>title</code> 一致。</p><h3 id="agentprompt-opts--生成子-agent"><code>agent(prompt, opts)</code> —— 生成子 Agent</h3><p>这是最核心的函数。每个 <code>agent()</code> 调用会生成一个独立的 Agent 实例：</p><pre><code class="language-javascript">const result = await agent(  '你的任务描述...',  {    label: '显示名称',          // 在进度树中显示    phase: '阶段名',            // 归入哪个阶段    schema: { ... },            // JSON Schema，强制返回结构化数据    model: 'haiku',             // 可选：haiku / sonnet / opus    isolation: 'worktree',      // 可选：在独立 Git 分支中运行    agentType: 'code-reviewer', // 可选：使用自定义 Agent 类型  })</code></pre><p><strong>关键点</strong>：</p><ul><li><code>schema</code> 参数让 Agent 必须返回符合 Schema 的 JSON，运行时自动校验，不需要你手动解析文本</li><li>没有 <code>schema</code> 时，返回 Agent 的最终文本</li><li><code>model</code> 可以为不同阶段路由不同模型，控制成本</li><li><code>isolation: 'worktree'</code> 让 Agent 在独立 Git 分支中工作，适合并行修改文件的场景</li></ul><h3 id="pipelineitems-stages--流水线"><code>pipeline(items, ...stages)</code> —— 流水线</h3><pre><code class="language-javascript">const results = await pipeline(  ['auth.ts', 'db.ts', 'api.ts'],  // 要处理的项目列表  // Stage 1: 实现  (prevResult, file, index) =&gt; agent(`实现 ${file} 的功能`, { phase: 'Implement' }),  // Stage 2: 测试  (prevResult, file, index) =&gt; agent(`为 ${file} 写测试`, { phase: 'Test' }),  // Stage 3: 审查  (prevResult, file, index) =&gt; agent(`审查 ${file} 的代码质量`, { phase: 'Review' }))</code></pre><p><strong>流水线的魔力</strong>：<code>auth.ts</code> 在做测试时，<code>db.ts</code> 可能还在实现。各项目独立推进，总耗时 = 最慢单项的耗时，而不是所有阶段耗时之和。</p><p>这是多阶段工作的<strong>默认选择</strong>。每个阶段回调接收 <code>(prevResult, originalItem, index)</code> 三个参数。</p><h3 id="parallelthunks--并行屏障"><code>parallel(thunks)</code> —— 并行屏障</h3><pre><code class="language-javascript">const [security, perf, style] = await parallel([  () =&gt; agent('安全审查', { phase: 'Review' }),  () =&gt; agent('性能审查', { phase: 'Review' }),  () =&gt; agent('风格审查', { phase: 'Review' }),])// 三个同时跑，全部完成后才继续</code></pre><p><strong>什么时候用 barrier vs pipeline？</strong></p><ul><li><code>parallel</code>：需要<strong>所有结果一起</strong>才能进行下一步（如汇总、去重）</li><li><code>pipeline</code>：各项独立，不需要交叉上下文</li></ul><p>一个失败的 thunk 不会拒绝整个调用——它在结果数组中变为 <code>null</code>，使用前记得 <code>.filter(Boolean)</code>。</p><h3 id="logmessage--进度输出"><code>log(message)</code> —— 进度输出</h3><pre><code class="language-javascript">log(`已完成 ${count}/10 个文件`)</code></pre><p>显示在进度树上方，给用户实时反馈。</p><h3 id="args--调用参数"><code>args</code> —— 调用参数</h3><p>调用者传入的参数在脚本中通过全局变量 <code>args</code> 访问：</p><pre><code class="language-javascript">// 脚本中const feature = args?.feature || 'unknown'// 调用时Workflow({ name: 'feature-impl', args: { feature: '用户认证' } })</code></pre><p>传数组/对象时用实际 JSON 值，不要用 JSON 字符串。</p><h3 id="budget--预算控制"><code>budget</code> —— 预算控制</h3><p>当用户指定了 Token 预算时（如 &quot;+500k&quot;），脚本可以动态调整工作深度：</p><pre><code class="language-javascript">const findings = []while (budget.total &amp;&amp; budget.remaining() &gt; 50_000) {  const result = await agent('深入分析下一个模块', { schema: ANALYSIS_SCHEMA })  findings.push(...result.items)  log(`${findings.length} items, ${Math.round(budget.remaining()/1000)}k remaining`)}</code></pre><p><code>budget.total</code> 为 null 时 <code>remaining()</code> 返回 <code>Infinity</code>，不限制循环。</p><h2 id="实战模式">实战模式</h2><h3 id="模式-1对抗性验证adversarial-verify">模式 1：对抗性验证（Adversarial Verify）</h3><p>防止&quot;看似正确实则错误&quot;的发现存活。每个发现让 N 个独立 Agent 尝试反驳，多数反驳成功则剔除：</p><pre><code class="language-javascript">// 每个发现让 3 个独立 Agent 尝试反驳const votes = await parallel([  () =&gt; agent(`尝试反驳：${claim}。默认 refuted=true 如果不确定。`, { schema: VERDICT }),  () =&gt; agent(`尝试反驳：${claim}。默认 refuted=true 如果不确定。`, { schema: VERDICT }),  () =&gt; agent(`尝试反驳：${claim}。默认 refuted=true 如果不确定。`, { schema: VERDICT }),])// 2/3 以上认为无法反驳，才保留const survives = votes.filter(Boolean).filter(v =&gt; !v.refuted).length &gt;= 2</code></pre><h3 id="模式-2循环直到达标loop-until-dry">模式 2：循环直到达标（Loop-until-dry）</h3><p>适用于不确定需要多少轮的探索性任务：</p><pre><code class="language-javascript">const bugs = []const seen = new Set()let consecutiveEmpty = 0while (consecutiveEmpty &lt; 2) {  const result = await agent('找出代码中的 bug', { schema: BUGS_SCHEMA })  const newBugs = result.bugs.filter(b =&gt; !seen.has(b.id))  if (newBugs.length === 0) {    consecutiveEmpty++  } else {    consecutiveEmpty = 0    bugs.push(...newBugs)    newBugs.forEach(b =&gt; seen.add(b.id))  }  log(`已找到 ${bugs.length} 个 bug`)}return { bugs }</code></pre><h3 id="模式-3多视角评审judge-panel">模式 3：多视角评审（Judge Panel）</h3><p>从不同角度生成方案，再用评委打分：</p><pre><code class="language-javascript">// 三个 Agent 从不同角度提方案const approaches = await parallel([  () =&gt; agent('从 MVP 角度设计方案', { phase: 'Design' }),  () =&gt; agent('从安全性角度设计方案', { phase: 'Design' }),  () =&gt; agent('从用户体验角度设计方案', { phase: 'Design' }),])// 评委打分const scores = await parallel(  approaches.map(a =&gt; () =&gt;    agent(`评估这个方案：${a.summary}`, {      phase: 'Judge',      schema: SCORE_SCHEMA,    })  ))// 选最高分，融合其他方案的优点const winner = approaches[scores.indexOf(Math.max(...scores.map(s =&gt; s.score)))]</code></pre><h3 id="模式-4多维度扫描multi-modal-sweep">模式 4：多维度扫描（Multi-modal Sweep）</h3><p>平行搜索不同维度，每个 Agent 看到不同角度：</p><pre><code class="language-javascript">const DIMENSIONS = [  { key: 'security', prompt: '审查安全性：SQL 注入、XSS、硬编码密钥' },  { key: 'performance', prompt: '审查性能：N+1 查询、内存泄漏、不必要的重渲染' },  { key: 'maintainability', prompt: '审查可维护性：代码重复、过长函数、深层嵌套' },]const reviews = await parallel(  DIMENSIONS.map(d =&gt; () =&gt;    agent(d.prompt, {      label: `review:${d.key}`,      phase: 'Review',      schema: FINDING_SCHEMA,    })  ))</code></pre><h3 id="模式-5流水线处理pipeline-processing">模式 5：流水线处理（Pipeline Processing）</h3><p>多个文件独立经历 实现 → 测试 → 审查 的完整流程：</p><pre><code class="language-javascript">const results = await pipeline(  files,  file =&gt; agent(`实现 ${file}`, { phase: 'Implement' }),  (prev, file) =&gt; agent(`为 ${file} 写测试`, { phase: 'Test' }),  (prev, file) =&gt; agent(`审查 ${file}`, { phase: 'Review' }))</code></pre><h2 id="完整示例bug-修复工作流">完整示例：Bug 修复工作流</h2><pre><code class="language-javascript">export const meta = {  name: 'fix-bugs',  description: '发现并修复代码中的 bug',  phases: [    { title: 'Discover', detail: '发现 bug' },    { title: 'Fix', detail: '修复 bug' },    { title: 'Verify', detail: '验证修复' },  ],}const BUG_SCHEMA = {  type: 'object',  properties: {    bugs: {      type: 'array',      items: {        type: 'object',        properties: {          id: { type: 'string' },          title: { type: 'string' },          file: { type: 'string' },          line: { type: 'number' },          description: { type: 'string' },          fix: { type: 'string' },        },        required: ['id', 'title', 'file', 'description', 'fix'],      },    },  },  required: ['bugs'],}// ── Discover：多角度搜索 bug ──phase('Discover')const searches = await parallel([  () =&gt; agent(    '从错误处理角度找 bug：未捕获的异常、空指针、类型错误',    { label: 'search:error-handling', phase: 'Discover', schema: BUG_SCHEMA }  ),  () =&gt; agent(    '从并发角度找 bug：竞态条件、死锁、资源泄漏',    { label: 'search:concurrency', phase: 'Discover', schema: BUG_SCHEMA }  ),  () =&gt; agent(    '从逻辑角度找 bug：边界条件、off-by-one、错误的条件判断',    { label: 'search:logic', phase: 'Discover', schema: BUG_SCHEMA }  ),])// 去重const seen = new Set()const bugs = searches  .filter(Boolean)  .flatMap(r =&gt; r.bugs)  .filter(b =&gt; {    const key = `${b.file}:${b.line}:${b.title}`    if (seen.has(key)) return false    seen.add(key)    return true  })log(`发现 ${bugs.length} 个唯一 bug`)// ── Fix：逐个修复 ──phase('Fix')const fixes = await pipeline(  bugs,  bug =&gt; agent(    `修复以下 bug：\n` +    `文件: ${bug.file}:${bug.line}\n` +    `问题: ${bug.title}\n` +    `描述: ${bug.description}\n` +    `建议修复方案: ${bug.fix}\n\n` +    `请实现修复，然后运行 pnpm typecheck 验证。`,    { label: `fix:${bug.id}`, phase: 'Fix' }  ))// ── Verify：最终验证 ──phase('Verify')const verification = await agent(  `验证所有 bug 修复：\n` +  `1. 运行 pnpm typecheck\n` +  `2. 运行 pnpm test\n` +  `3. 确认以下文件的修复：${bugs.map(b =&gt; b.file).join(', ')}`,  {    label: 'final-verify',    phase: 'Verify',    schema: {      type: 'object',      properties: {        typecheckPassed: { type: 'boolean' },        testsPassed: { type: 'boolean' },        allFixesVerified: { type: 'boolean' },      },      required: ['typecheckPassed', 'testsPassed', 'allFixesVerified'],    },  })return {  bugsFound: bugs.length,  bugsFixed: fixes.filter(Boolean).length,  verification,}</code></pre><h2 id="完整示例a-股深度调研工作流含网络检索">完整示例：A 股深度调研工作流（含网络检索）</h2><p>下面是一个真实可用的自定义工作流——A 股上市公司深度调研。它展示了 <code>parallel</code> + <code>WebSearch</code>/<code>WebFetch</code> + <code>schema</code> + 对抗性验证在金融场景下的完整应用。</p><blockquote><p>文件路径：<code>.claude/workflows/a-share-research.js</code></p></blockquote><h3 id="调用方式">调用方式</h3><pre><code class="language-javascript">/a-share-research 调研XXX股票</code></pre><h3 id="工作流架构5-阶段含网络检索">工作流架构（5 阶段，含网络检索）</h3><pre><code>标的确认（1个Agent）│  ← WebSearch + WebFetch 确认股票代码、行业、股价    ↓数据采集（5个Agent并行网络检索）⬅ 关键阶段├── 财务数据：搜索财报、ROE、PE/PB → WebFetch 东方财富├── 行情数据：搜索最新股价、技术指标、资金流向├── 新闻公告：搜索最新公告、研报、政策├── 行业数据：搜索行业景气度、竞争对手、市场份额└── 风险信息：搜索质押、监管处罚、大股东增减持    ↓五维并行分析（5个Agent同时跑）│  基于采集数据 + 可补充 WebSearch├── 基本面：财务指标、估值、机构持仓├── 技术面：K线、均线、MACD、资金流向├── 消息面：公告、政策、传闻、催化剂├── 行业对比：竞争格局、护城河、景气度└── 风险评估：财务/监管/治理/黑天鹅    ↓交叉验证（最多11个Agent并行）│  每个验证 Agent 独立执行 WebSearch + WebFetch├── 优先验证：低置信度 + 无来源的发现├── 对高影响力利好：独立搜索反驳└── 对高影响力利空：独立搜索反驳    ↓综合研判（1个Agent汇总）    → 投资评级 + 综合评分 + 核心逻辑 + 风险提示 + 数据来源汇总</code></pre><h3 id="关键设计亮点">关键设计亮点</h3><p><strong>1. 独立数据采集阶段，确保数据有源</strong></p><p>与普通分析工作流最大的区别：在分析之前，先用 5 个 Agent 并行采集原始数据。</p><pre><code class="language-javascript">// 每个采集 Agent 执行 3 次 WebSearch + 多次 WebFetchconst rawDataResults = await parallel(  SEARCH_QUERIES.map(sq =&gt; () =&gt;    agent(      `采集【${sq.key}】维度数据...\n` +      `必须执行：\n` +      sq.queries.map((q, i) =&gt; `${i+1}. WebSearch: &quot;${q}&quot;`).join('\n') +      `\n选择权威页面 WebFetch 获取详细数据...`,      { schema: RAW_DATA_SCHEMA }  // 返回 sources[] + rawDataSummary    )  ))</code></pre><p>每个采集 Agent 返回 <code>{ sources: [{url, title, keyData}], rawDataSummary }</code>，后续分析 Agent 直接基于这些数据工作，而不是凭记忆编造。</p><p><strong>2. Schema 增加数据溯源字段</strong></p><p>每个发现都必须标注来源和时效性：</p><pre><code class="language-javascript">{  findings: [{    title, detail,    sentiment: '利好'|'利空'|'中性',    confidence: '高'|'中'|'低',    source: 'https://...',                          // 必填，数据来源 URL    dataFreshness: '实时'|'近期'|'历史'|'待验证'       // 数据时效  }],  summary, score,  dataQuality: '高'|'中'|'低'                        // 整体数据质量评估}</code></pre><p><strong>3. 交叉验证使用独立网络搜索</strong></p><p>验证 Agent 不是简单地&quot;想想对不对&quot;，而是真正去搜索独立数据源：</p><pre><code class="language-javascript">// 验证 Agent 的 prompt`1. WebSearch: &quot;${stockName} ${finding.title}&quot; — 获取独立信息源 2. WebSearch: &quot;${stockName} 最新 ${finding.dimension}&quot; — 交叉数据 3. WebFetch: 访问东方财富/巨潮资讯等权威页面 4. 对比独立获取的数据与原始发现是否一致`</code></pre><p>验证结果返回 <code>{ isReal, reason, verificationSource }</code>——每条结论都有独立来源背书。</p><p><strong>4. 三类发现优先验证</strong></p><pre><code class="language-javascript">// 1. 存疑发现：低置信度 / 无来源 / 时效待验证const needVerify = allFindings  .filter(f =&gt; f.confidence === '低' || !f.source || f.dataFreshness === '待验证')// 2. 高影响力利好：用怀疑视角验证// 3. 高影响力利空：用乐观视角验证</code></pre><h3 id="运行效果示例">运行效果示例</h3><pre><code>🎯 开始调研：贵州茅台✅ 标的确认：贵州茅台（600519.SH）| 食品饮料 | 来源：东方财富▸ 数据采集  🌐 启动5路并行网络数据采集...  财务数据：5 个来源 | 行情数据：3 个来源 | 新闻公告：4 个来源  行业数据：3 个来源 | 风险信息：2 个来源  ✅ 数据采集完成，共 17 个数据来源▸ 五维分析  基本面评分：8/10 | 数据质量：高 | 6/7 条有明确来源  技术面评分：6/10 | 数据质量：中 | 4/6 条有明确来源  消息面评分：7/10 | 数据质量：高 | 5/5 条有明确来源  行业对比评分：9/10 | 数据质量：中 | 5/6 条有明确来源  风险评估评分：5/10 | 数据质量：中 | 3/5 条有明确来源▸ 交叉验证  待验证：2 条存疑 + 3 条利好 + 2 条利空  ✅ 验证完成：6 条通过，1 条被质疑▸ 综合研判  📊 调研报告：贵州茅台（600519.SH）  综合评级：推荐 | 综合评分：78/100 | 数据来源：17 个  核心逻辑：行业龙头地位稳固，品牌护城河深厚...  主要风险：估值处于历史中高位，消费降级压力...</code></pre><h3 id="如何定制">如何定制</h3><ul><li><strong>增加分析维度</strong>：在 <code>DIMENSIONS</code> 和 <code>SEARCH_QUERIES</code> 数组中添加新项</li><li><strong>改变验证强度</strong>：调整各 <code>.slice(0, N)</code> 的数量</li><li><strong>增加数据源</strong>：在 <code>SEARCH_QUERIES[].fetchUrls</code> 中添加目标页面</li><li><strong>增加行业特定指标</strong>：修改各维度的 prompt 和搜索关键词</li><li><strong>输出 Markdown 报告</strong>：在最终 agent 的 prompt 中要求输出 Markdown</li><li><strong>对接内部数据库</strong>：在数据采集阶段添加 API 调用逻辑</li></ul><hr /><h2 id="内置工作流deep-research">内置工作流：Deep Research</h2><p>Claude Code 内置了 <code>/deep-research</code> 工作流，是体验 Dynamic Workflows 的最快方式。</p><h3 id="一行命令启动">一行命令启动</h3><pre><code>/deep-research Claude Code 最新特性与最佳实践</code></pre><h3 id="它做了什么">它做了什么？</h3><p><code>deep-research</code> 内部包含 5 个阶段：</p><pre><code>▸ Scope        分解研究问题为 5 个搜索角度▸ Search       5 个并行 Agent，每个负责一个角度的 Web 搜索▸ Fetch        去重 URL，抓取 Top 15 源，提取可验证的声明▸ Verify       每条声明 3 个 Agent 独立对抗性验证（2/3 反驳成功则剔除）▸ Synthesize   合并语义重复，按置信度排序，生成引用报告</code></pre><p>运行完成后，报告进入你的会话。它引用每个声明来自的来源，未通过交叉检查的声明已被过滤掉。</p><h3 id="值得了解">值得了解？</h3><p>这个工作流本身就是 Dynamic Workflows 的<strong>教科书级示例</strong>，它展示了本文介绍的几乎所有核心模式：</p><ul><li><strong><code>parallel</code></strong>：Search 阶段 5 个 Agent 同时搜索</li><li><strong><code>pipeline</code></strong>：Fetch 阶段对每个 URL 独立提取声明</li><li><strong>对抗性验证</strong>：Verify 阶段每条声明 3 个 Agent 独立反驳</li><li><strong><code>schema</code></strong>：每个 Agent 都用 JSON Schema 强制结构化输出</li><li><strong><code>log</code></strong>：实时输出进度（&quot;Found 12 unique sources&quot;）</li><li><strong>阶段分组</strong>：5 个 <code>phase()</code> 清晰划分工作流进度</li></ul><hr /><h2 id="管理运行">管理运行</h2><h3 id="查看进度">查看进度</h3><p>工作流在后台运行，会话在 Agent 工作时保持响应。随时运行 <code>/workflows</code> 列出运行中和已完成的工作流：</p><pre><code>/workflows</code></pre><p>进度视图显示每个阶段及其Agent计数、令牌总数和经过的时间。快捷键：</p><ul><li><strong><code>↑</code> / <code>↓</code></strong>：选择一个阶段或Agent</li><li><strong><code>Enter</code> 或 <code>→</code></strong>：深入选定的阶段，读取其提示、工具调用和结果</li><li><strong><code>Esc</code></strong>：返回一个级别</li><li><strong><code>p</code></strong>：暂停或恢复运行</li><li><strong><code>x</code></strong>：停止选定的Agent，或停止整个工作流</li><li><strong><code>r</code></strong>：重启选定的运行中Agent</li><li><strong><code>s</code></strong>：保存运行的脚本为命令</li></ul><h3 id="保存工作流以供重用">保存工作流以供重用</h3><p>当 Claude 为你的重复任务编写了工作流时，可以将脚本保存为命令：</p><ol><li>运行 <code>/workflows</code></li><li>选择你想保留的运行</li><li>按 <code>s</code></li><li>Tab 切换保存位置：<ul><li><code>.claude/workflows/</code>（项目内，团队共享）</li><li><code>~/.claude/workflows/</code>（个人，跨项目可用）</li></ul></li><li>按 Enter 保存</li></ol><p>保存后，工作流在未来会话中作为 <code>/&lt;name&gt;</code> 运行，出现在 <code>/</code> 自动补全中。</p><h3 id="成本控制">成本控制</h3><p>工作流生成许多Agent，单次运行可以比普通对话消耗更多 Token。控制成本的方法：</p><ul><li>在大型运行前检查 <code>/model</code>，确认当前模型</li><li>为不需要最强模型的阶段指定 <code>model: 'haiku'</code></li><li>使用 <code>budget</code> 对象动态控制循环深度</li><li>随时从 <code>/workflows</code> 停止运行，不会丢失已完成的工作</li></ul><h3 id="运行约束">运行约束</h3><ul><li><strong>无中途用户输入</strong>：仅权限提示可以暂停运行</li><li><strong>脚本本身无文件系统/shell 访问</strong>：Agent读写文件和运行命令，脚本只协调Agent</li><li><strong>最多 16 个并发Agent</strong>（CPU核数少会更少）：限制本地资源使用</li><li><strong>每次运行 1,000 个Agent总数</strong>：防止失控循环</li></ul><h3 id="关闭工作流">关闭工作流</h3><p>如果不需要工作流功能：</p><ul><li>在 <code>/config</code> 中切换 &quot;Dynamic workflows&quot; 关闭（会话内持续）</li><li>在 <code>~/.claude/settings.json</code> 中设置 <code>&quot;disableWorkflows&quot;: true</code></li><li>设置环境变量 <code>CLAUDE_CODE_DISABLE_WORKFLOWS=1</code></li></ul><hr /><h2 id="版本与可用性">版本与可用性</h2><ul><li><strong>最低版本</strong>：Claude Code v2.1.154+</li><li><strong>计划要求</strong>：Pro、Max、Team、Enterprise（Pro 需在 <code>/config</code> 中手动启用）</li><li><strong>API 支持</strong>：Anthropic API、Amazon Bedrock、Google Cloud Vertex AI、Microsoft Foundry</li><li><strong>当前状态</strong>：研究预览阶段</li></ul><hr /><h2 id="总结">总结</h2><p>Dynamic Workflows 是 Claude Code 处理复杂任务的利器。它让你能够：</p><ol><li><strong>编排多个 Agent</strong>：定义清晰的执行顺序和依赖关系</li><li><strong>并行处理</strong>：独立任务同时执行，节省时间</li><li><strong>结构化输出</strong>：JSON Schema 保证数据一致性</li><li><strong>流水线模式</strong>：各项目独立推进，最大化吞吐</li><li><strong>断点恢复</strong>：中断后从上次位置继续</li><li><strong>预算控制</strong>：精确控制 Token 消耗</li></ol><p>当你遇到这样的场景：一个复杂任务需要多个 Agent 分工合作，有的并行审查，有的串行依赖，有的需要循环迭代直到达标。Claude Code 的 Dynamic Workflows 可能是你最好的选择</p><p>微信公众号：<a href="https://mp.weixin.qq.com/s/9JgHxT8yqGnUt16k-DneEQ">https://mp.weixin.qq.com/s/9JgHxT8yqGnUt16k-DneEQ</a></p>]]>
                    </description>
                    <pubDate>Mon, 01 Jun 2026 08:19:00 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[Agent 会自己长出技能？聊聊 Hermes 的技能进化机制]]>
                    </title>
                    <link>http://www.solinx.cn/archives/202605070001</link>
                    <description>
                            <![CDATA[<p>Agent 开发的几乎都绕不开一个念头：智能体能不能越用越聪明？具体来说，能不能做到：</p><pre><code>把做过的事自己沉淀下来用户下次不用再把同一套流程教一遍</code></pre><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/%E5%A6%82%E4%BD%95%E8%B6%8A%E6%9D%A5%E8%B6%8A%E8%81%AA%E6%98%8E_1777908821361.png" alt="如何越来越聪明.png" /></p><p>Hermes 对这个问题的处理没有往玄学上飘，也没吹嘘自己在后台偷偷训练新模型。它做得很朴素，也很工程化：每当 Agent 在任务里摸索出一套可以复用的做法，就通过 <code>skill_manage</code> 把这套做法写回本地技能文件。下次遇到类似任务，再把它拿出来继续用、继续改。</p><p>Hermes 的技能进化，不是参数层面的学习，更不是凭空长出什么新能力。它更像是把一次任务里跑通的经验，整理成一份能随时查阅、修改、甚至回滚的操作手册。</p><p>下面顺着这条链路拆开看一看。</p><p><strong>Hermes 里”自动创建技能”的真实路径</strong></p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/%E6%9E%B6%E6%9E%84%E5%9B%BEn_1777908851741.png" alt="架构图n.png" /></p><h2 id="自动创建技能本质是文件写回不是训练">自动创建技能：本质是文件写回，不是训练</h2><p>Hermes 所谓的自动生成技能，本质上是一套工具调用流程，而不是训练流程。</p><p>Agent 并不会把一次任务丢给某个学习器，然后在模型参数里“长”出新能力。它做的是：</p><p><strong>1. 任务进行时，</strong> 提醒模型尽量使用和维护技能；<br /><strong>2. 任务结束后，</strong> 回头审视这次有没有值得复用的流程；<br /><strong>3. 如果有，</strong> 就调用 <code>skill_manage()</code> 创建新技能，或者给旧技能打补丁；<br /><strong>4. 把结果写回本地技能目录，</strong> 让后面的会话可以直接复用。</p><p>所以 Hermes 的“进化”，准确来说是文件层面的经验写回。</p><p>听起来当然没有“模型自我学习”那么高级，但好处很实在：它可控。</p><pre><code> 它学到了什么，你能打开文件直接看。   它写到了哪里，你能精确定位。   它有没有写坏，你可以审查、回滚、再改。   下一次为什么做得更顺，也都有迹可循。</code></pre><h2 id="为什么能进化经验有地可写且支持打补丁">为什么能进化？经验有地可写，且支持打补丁</h2><p>很多 Agent 系统并不是发现不了经验，而是发现之后没地方存储处理。</p><p>这次调通了一套部署流程，下次还得重新琢磨；这次踩过一个环境坑，下次换个会话又踩一遍。问题不是在于“有没有经验”，<strong>如果用户没有主动把本次流程固化为Skills就等于是“经验有没有被系统接住”。</strong></p><p>Hermes 把这件事做成了一条明确的写回路径，<code>skill_manage()</code> 支持的操作包括：</p><pre><code> create：创建一个新技能 patch：给已有技能打补丁 edit：重写 SKILL.md write_file：给技能增加附属文件 remove_file、delete：删除内容</code></pre><p>最值得关注的是打补丁。</p><p>Hermes 不鼓励 Agent 一上来就重写整份技能文档，而是更偏向“补一小段”。这更接近真实的维护习惯：任务里<strong>发现了一个新坑、一个命令差异、一个验证步骤，就把它追加或修正到相应位置。</strong></p><p>这样做有几个实际好处：token 消耗更小，修改范围更窄，更适合持续修补那些从真实任务里冒出来的细节。并且它的打补丁不是死板的字符串替换，底层用了模糊匹配，模型不需要精确记住原文里的每个空格，只要上下文能对上，就有机会把补丁打到正确位置。这就是它能**“边用边修”**的原因。</p><h2 id="自动创建不靠开关而是三层机制叠在一起">自动创建不靠开关，而是三层机制叠在一起</h2><p>Hermes 的技能进化不是靠某个神秘按钮触发的，更像是三层提示和流程叠加出来的结果。</p><p><strong>1. 系统提示词持续提醒</strong>系统提示会反复提醒模型两件事：复杂任务结束后，考虑要不要保存成技能；使用技能时，如果发现过时、缺漏或错误，及时打补丁。这会让模型不只盯着解决眼前问题，也会被引导去思考“有什么值得留下”。</p><p><strong>2. 工具的 schema 告诉它“怎么保存”</strong><code>skill_manage</code> 的 schema description 里有详细的操作规范：什么情况适合创建，什么情况更适合打补丁，什么样的技能才算质量过关，创建和删除前最好确认用户意图。Hermes 不仅告诉模型“你可以保存经验”，还告诉它“别乱写，尽量这样写”。</p><p><strong>3. 后台复盘把“想一想”变成固定流程</strong>真正把这套机制推起来的，是 <code>run_agent.py</code> 里的后台复盘。Hermes 会维护一个技能计数器，当达到阈值，主任务完成后会启动一个后台复盘代理。这个代理不直接跟用户聊天，而是拿着当前会话快照加上复盘提示，专门判断“有没有值得沉淀成技能的非平凡工作流”。有就创建或更新，没有就安静退出。这就把“顺手记一笔”从模型自觉变成了系统级的固定动作。</p><p><strong>后台复盘如何在主任务完成后异步沉淀技能</strong></p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/%E5%A4%8D%E7%9B%98_1777908887714.png" alt="复盘.png" /></p><h2 id="不是自治不裸写半自动背后的边界与安全">不是自治，不“裸写”：半自动背后的边界与安全</h2><p>如果给这套机制一个准确的描述，就是：<strong>提示驱动、阈值触发、后台复盘、文件写回</strong>。它不是完全自治，主要有三个原因。</p><p>首先，是否值得保存仍然要靠模型判断，不会每次任务都产出新技能。其次，创建前确认用户意图更多是软约束，存在于提示和工具描述层，不是硬阻断。再者，它不是一个无限膨胀的知识工厂，重点是留下真正有复用价值的流程。</p><p>更能体现工程成熟度的，是它对写入环节的约束。只要允许 Agent 写文件，真正要关心的就不是“能不能写”，而是“写得稳不稳、边界够不够硬”。</p><p>Hermes 在 <code>skill_manage()</code> 的真实写入阶段做了大量校验：技能名称是否合法，分类是否合法，<code>SKILL.md</code> frontmatter 是否完整，内容大小是否超限，附属文件是否只写到允许的子目录，路径有没有穿越风险。写入后还会经过 <code>skills_guard</code> 安全扫描，不通过就回滚。尤其对 Agent 自己创建的技能，策略并不宽松，某些风险判定可能直接阻断。</p><p><strong>技能写回不是直接落盘，而是带校验和回滚</strong></p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/skill%E6%B2%89%E6%B7%80%E6%B5%81%E7%A8%8B%E5%9B%BE_1777908914612.png" alt="skill沉淀流程图.png" /></p><h2 id="复盘时机后台一次会话重置前再兜底一次">复盘时机：后台一次，会话重置前再兜底一次</h2><p>Hermes 没有在任务中途打断主流程，而是在主任务给出最终回复后，<strong>异步拉起一个轻量 Agent 做复盘</strong>。这个后台 Agent 复用当前模型和上下文快照，却不污染主会话，也不抢注意力。如果创建或更新了技能，前台只给一个很短的摘要提示。好处很直接：当前任务先完成，经验沉淀不干扰主推理，交付和复盘可以并行。</p><p>除了这种后台复盘，Hermes 还有另一道保险。当会话因为<strong>长时间不活跃或定时重置即将被清空，系统会再启动一轮清场复盘</strong>，用一个临时代理回顾整段对话，看看有没有遗漏的记忆或技能值得保存。很多复杂任务当下未必能立刻意识到是一套可复用流程，会话结束前再看一遍，等于给经验沉淀加了一层兜底。</p><p>因此，技能进化实际上有两个出口：主任务后的<strong>后台复盘</strong>和会话重置前的<strong>清场复盘</strong>。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/%E6%9E%B6%E6%9E%84%E5%9B%BE_1777908948542.png" alt="架构图.png" /></p><h2 id="为什么好用工程化学习与可审计的闭环">为什么好用？工程化学习与可审计的闭环</h2><p>一次复杂任务结束后，如果系统能把“什么时候该触发、先做什么后做什么、哪些命令有效、哪些坑已经踩过、最后怎么验证”这些信息留下来，下一次类似任务到来时，Agent 就不需要重新猜测，可以直接沿着上次真实跑通过的流程往前走。重复劳动少了，失败成本低了，而且因为技能是文件，人可以审查、补充、分发，团队协作也更容易。</p><p>所以我更愿意把 Hermes 的技能进化叫作“工程化学习”。它没有神秘感，但非常能落地。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/%E6%80%BB%E7%BB%93_1777908974870.png" alt="总结.png" /></p><p>归结成一句话：<strong>Hermes 让经验以工程资产的形式留下来，而不是散落在一次次对话里</strong>。你也可以说“Hermes 自己长出技能了”，它长出的不是参数能力，而是一份份能打开查看、能继续维护、能打补丁、也能被安全扫描的技能文件。这背后是一条非常清晰的闭环：在任务中发现经验，在任务后判断价值，用工具写回，用安全机制限制风险，在未来会话中再次加载和修补。</p><p>它没有”自治超级智能”那么夸张，却很像真正能落地的软件工程——一个 Agent 变好用，不是因为它声称自己会成长，而是因为它知道经验应当放在哪里，下一次又该怎么拿出来用。</p>]]>
                    </description>
                    <pubDate>Thu, 07 May 2026 11:31:15 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[Hermes Agent 中的两套 Agent Loop]]>
                    </title>
                    <link>http://www.solinx.cn/archives/2026050003</link>
                    <description>
                            <![CDATA[<p>Hermes Agent 源码中，有个地方很难忽略：源码中同时存在两套 Agent Loop。一是 <code>run_agent.py</code> 里的 <code>AIAgent</code>，另一个是 <code>agent_loop.py</code> 里的 <code>HermesAgentLoop</code>。前者代码体量很大，后者明显轻得多。</p><p>深入分析源码就会发现两套 Loop 确实都在做“模型调工具再继续推理”这件事，但服务的运行场景完全不同，控制逻辑也不是一个量级。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1776700639270.png" alt="image.png" /></p><p>先介绍 Agent Loop ，Hermes 里的 Loop，核心就是下面这四步：</p><ol><li>把当前消息发给 LLM</li><li>LLM 返回文本和可选的 tool calls</li><li>如果有工具调用，就执行工具并把结果追加回消息列表</li><li>如果没有工具调用，就认为任务完成，退出循环</li></ol><p>这四步是Agent Loop的基本流程，但这四步之外还包很多逻辑。用户交互要处理流式输出、重试、打断、上下文压缩；训练 rollout 则关心 async、token/logprobs、reward 计算和并发调度。Hermes 没把这些需求硬塞进同一个大循环里，而是直接拆成了两套实现Agent Loop：</p><ul><li>面向用户实时交互的 <code>AIAgent</code></li><li>面向 RL rollout 的 <code>HermesAgentLoop</code></li></ul><p>拆分不是为了拆分而拆分，根本是因为两个场景本来就不是同一个问题。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image-2_1776701087079.png" alt="image2.png" /></p><h2 id="一套用于用户交互一套用于rl训练">一套用于用户交互，一套用于RL训练</h2><p><code>AIAgent</code> 对应的是 CLI、Gateway、Telegram、Discord 这类直接面向人的入口。用户在前台等回复，这条链路不是只追求“能跑通”，还需要把交互过程本身兜住。源码里能直接看到这类需求留下来的痕迹：流式输出、Provider 容错、上下文压缩、用户中断、预算耗尽后的 Grace Call、子 Agent 委派、插件钩子，基本都堆在这条路径上。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image-3_1776700731554.png" alt="image3.png" /></p><p><code>AIAgent</code> 的复杂度，不是来自“调模型”这一步，而是来自调模型失败以后怎么办、用户半路打断怎么办、上下文塞不下了怎么办。也正因为这样，这个循环体才会达到数千行。它已不是一个单纯的推理循环，而是一条完整的交互控制链。</p><p><code>HermesAgentLoop</code> 而完全是另一回事。它不面向用户，而是被 Atropos 调起来做 rollout。这里没有人盯着屏幕，也不需要跨 Provider 兜底。训练场景真正看重的是另外几件事：</p><ul><li>必须是 async，才能并发跑大量 rollout</li><li>必须拿到真实 token、logprobs、masks，供 GRPO 训练使用</li><li>必须把工具执行和 reward 验证放在同一个 sandbox 上下文里</li><li>必须保持循环本身足够轻，避免把交互系统里的复杂分支带进训练路径</li></ul><p>这也是为什么 <code>HermesAgentLoop</code> 看起来简洁很多的原因。主要是负责把一次 rollout 跑完整，并且把训练真正要用的数据带出来。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image-1_1776700678901.png" alt="image1.png" /></p><p>在训练链路，<code>HermesAgentLoop</code> 关键不在“它也会调工具”，而在于它站在一条完整的 RL 数据生产链上。</p><pre><code class="language-text">单次 rollout 生命周期dataset item   │   ▼format_prompt()   │   ▼HermesAgentLoop.run()   │   ├─ server.chat_completion / managed generate   ├─ parse tool calls   ├─ execute tools   └─ 产出 AgentResult + managed_state   │   ▼ToolContext.compute_reward()   │   └─ 在同一个 sandbox 中验证结果，得到 reward   │   ▼ScoredDataItem(tokens, masks, scores)   │   ▼GRPO trainer 更新模型</code></pre><h2 id="为什么不合成一个超级-loop">为什么不合成一个超级 Loop</h2><p>在 <code>AIAgent</code> 这条路径存在很多逻辑：流式处理、空响应恢复、Provider 轮转、上下文压缩，这些逻辑对用户交互很重要，但对 rollout 来说并无多大作用。<code>AIAgent</code> 这套控制流也不适合直接嵌进 Atropos 的异步并发环境；训练真正要的 <code>managed_state</code>、token 级数据和 <code>ToolContext</code>，也不是它天然会产出的东西。</p><p>把 <code>HermesAgentLoop</code> 拿去服务用户也不现实。它没有流式输出，没有那套完整的错误恢复，也没有 Grace Call 和子 Agent 委派。跑 benchmark 或 rollout 没问题，放到产品入口里就太薄了。</p><p>从上面的分析也可以看到这两个Loop的业务流程，完全不一样，强制融合在一起会导致Loop复杂度过高，可靠性降低。</p><h2 id="该复用的不是循环体而是工具调度层">该复用的不是循环体，而是工具调度层</h2><p>Hermes Agent 并没有把两套系统彻底割裂。它复用的是更底层的能力，如 <code>handle_function_call()</code> 这一层的工具调度，以及工具结果预算、持久化这些基础设施。</p><p>复用点不在 Loop 本身，而在工具执行链路。</p><p>这个切分比“有没有统一框架”更重要。Agent 系统里真正容易失控的，往往不是某个工具实现，而是围绕工具调用长出来的控制流：什么时候继续，什么时候停，错误怎么恢复，上下文什么时候压，结果怎么进入训练信号。Hermes 的处理方式很直接：不同场景用不同的 loop policy，能共享的则压到更下面一层去共享。</p><h2 id="写在最后">写在最后</h2><p>很多时候设计 Agent 架构时，天然会想先抽一个“统一循环”。Hermes 这套实现给了一个很实用的反例：只要场景的目标函数已经变了，循环层通常就不该强行共用。</p><p>用户交互系统优化的是体验、鲁棒性和可恢复性；RL rollout 优化的是吞吐、并发和训练信号精度。它们都叫 Agent Loop，但回答的不是同一个工程问题。</p><p>更稳妥的做法，反而是把系统拆成两层：</p><ul><li>上层按场景定义各自的循环控制策略</li><li>下层复用工具调度、结果存储和共享基础设施</li></ul><p>Hermes 的双 Loop 结构，最有参考价值的地方也在这里：它没有执着于“所有能力必须收敛到一个抽象里”，接受业务循环层天然会分叉，把复用点放在了更合适的位置。</p>]]>
                    </description>
                    <pubDate>Sun, 03 May 2026 23:30:28 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[把设备能力接进 OpenClaw：Node 应用的架构与实现]]>
                    </title>
                    <link>http://www.solinx.cn/archives/2026033309</link>
                    <description>
                            <![CDATA[<p>随着大模型的飞快发展 AI 接入、自动化接入、工具接入非常流行，但一旦问题落到“真实设备能力怎么进入系统”时，情况就变得复杂。</p><p>摄像头怎么接？截图怎么做？通知、照片、位置这些能力如何统一暴露？更重要的是，这些能力不是在本地脚本里临时调用一下，而是要进入一个可连接、可调度、可鉴权、可回传结果的系统里。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/openclaw%E8%8A%82%E7%82%B9%E7%95%8C%E9%9D%A2_1774971604124.png" alt="openclaw节点界面.png" /></p><p>它不是一个单纯的客户端，也不是一个只能本地点击使用的小工具。更准确地说，它是 OpenClaw 体系中的设备能力宿主：<strong>运行在具体设备上，以 Node 身份接入 OpenClaw 网关，把本地设备上的真实能力，以标准化接口接进整个系统。</strong></p><p>开源地址：<a href="https://github.com/linxin26/openclaw-nodes">https://github.com/linxin26/openclaw-nodes</a></p><h2 id="一openclaw-里node-能解决什么">一、OpenClaw 里，Node 能解决什么</h2><p>从系统角色来看，OpenClaw 可以理解为三个核心部分：</p><pre><code>Gateway：负责连接、鉴权、路由和控制平面协调Operator：负责发起操作、承载用户交互、消费系统状态Node：负责承载真实设备能力，并执行来自系统的调用请求</code></pre><p>它是客户端又不是，很多人第一反应可能会把它理解成“被控端”或者“远程客户端”。在 OpenClaw 里，Node 的定位不是“一个能被点来点去的客户端”，而是“一个可被系统调度的能力节点”。</p><p>如果只是一个普通客户端，它的重点通常是界面、交互和用户本地操作；但如果它是一个能力节点，它就必须完成一整条系统链路：</p><pre><code>连接 Gateway完成身份建立与鉴权声明自己有哪些能力接收调用请求在本地执行具体能力将结果或错误结构化返回</code></pre><p>只有这几个环节形成闭环，设备能力才算真正进入了 OpenClaw，而不是停留在“本机能跑几个脚本”的阶段。</p><h2 id="二为什么不能只靠脚本拼起来">二、为什么不能只靠脚本拼起来</h2><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/2_1774971798175.png" alt="2.png" /></p><p>在很多设备能力确实可以先靠脚本或平台命令跑通。比如截图、拍照、读取系统信息，这些都不算难。但真正困难的地方，从来不是“把能力调起来”，而是“把能力接进系统”。</p><p>因为一旦进入系统，它面对的问题就会立刻升级：</p><pre><code>系统怎么知道这个节点具备哪些能力？请求如何准确路由到对应能力？输入输出格式是否统一？失败时如何表达错误，而不是只吐出一段日志？掉线、重连、状态变化怎么处理？Windows、macOS、Linux 的差异如何隔离？</code></pre><p>如这些问题没有被抽象清楚，那所谓的“设备接入”，最终就会退化成一堆平台脚本和临时判断，能跑，但很难扩展，更难产品化。</p><p>从工程角度看，OpenClaw Node 的重点并不是“把摄像头调用起来”，而是“把摄像头、截图、通知、照片这些本地能力，以统一协议和统一结构接入 OpenClaw 网关体系”。</p><h2 id="三-node-的核心架构是什么">三、 Node 的核心架构是什么</h2><p>从结构上看，这类应用大致可以拆成四层。</p><h3 id="1-连接层">1. 连接层</h3><p>这一层负责和 OpenClaw Gateway 建立长连接，处理握手、身份校验、在线状态维护，以及断开后的重连恢复。</p><p>它解决的问题是：这个节点如何稳定地进入系统，连接层不稳，后面的能力层再完整，也只是本地孤岛。</p><h3 id="2-能力层">2. 能力层</h3><p>这一层负责把设备能力组织成清晰的能力接口，比如 <code>camera</code>、<code>screen</code>、<code>photos</code>、<code>notifications</code>、<code>location</code> 等。</p><p>重点不是能力做了多少，而是能力边界是否清楚、命令语义是否统一。只有接口定义清楚，上层系统才能稳定调用，下层实现才能逐步演进。</p><h3 id="3-分发层">3. 分发层</h3><p>来自网关的调用请求，不应该直接落到某个平台脚本或系统命令上，而是先进入统一的分发逻辑。</p><p>这一层负责：</p><pre><code>参数校验能力可用性检查路由到具体 handler统一结果结构统一错误模型</code></pre><p>它的价值在于把“协议请求”和“本地执行”隔开，让系统层和设备层各自保持边界。</p><h3 id="4-宿主层">4. 宿主层</h3><p>这部分就是应用本身承担的运行时支撑能力，包括配置管理、日志、状态展示、系统托盘，以及单纯后台应用或是基于GUI 控制面板。</p><p>它可实现为桌面应用形式或者只是以后台应用形式存在。它对来说 Node 是否有界面并不是很重要。但如果现实了GUI可做到节点不只是“后台有个进程在跑”，它还具备：</p><pre><code>可见的可配置的可诊断的可控制的</code></pre><p>换句话说，宿主层并不是协议核心，但它决定了这个 Node 是“后台节点”，还是“桌面应用”。</p><h2 id="四一次能力调用的具体流程">四、一次能力调用的具体流程</h2><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/%E6%B5%81%E7%A8%8B_1774971840648.png" alt="流程.png" /></p><p>用一个具体例子更容易说明问题。假设系统要调用 <code>screen.snapshot</code> 这个能力，整个链路通常会是这样：</p><pre><code>1. Operator 或上层控制端发起截图请求2. Gateway 根据目标节点和能力，把请求路由到对应 Node3. Node 收到请求后，先做参数与状态检查4. 分发层把请求交给 `screen` 对应的 handler5. 本地平台实现执行截图动作6. 结果被整理成统一结构返回给 Gateway7. Gateway 再把结果交回上层调用方8. 同时，Node 本地的 GUI 或日志系统展示这次调用状态</code></pre><p>这个流程真正重要的地方，不是“截图成功了”，而是每一层都只做自己该做的事。</p><p>协议层不需要知道截图到底调用了哪套系统接口；设备能力实现也不需要关心 WebSocket 帧结构；GUI 层更不应该直接承担底层执行逻辑。</p><p>正是这种分层，让 OpenClaw Node 不只是“能跑”，而是“能演进”。</p><h2 id="五桌面-gui-还是后台应用">五、桌面 GUI 还是后台应用</h2><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/%E6%9E%B6%E6%9E%84_1774971863532.png" alt="架构.png" /></p><p>Node 是否需要 GUI，完全取决于它运行在什么样的设备上。在桌面电脑上，宿主层可以呈现为带有系统托盘、配置窗口、状态面板的桌面应用。连接状态、能力开关、日志诊断——这些可视化的能力让节点变得可观察、可控制。但在很多设备上，GUI 既不可能，也不必要。</p><pre><code>网络摄像头：算力只够维持视频流，没有屏幕，也没有人机交互场景路由器/网关设备：嵌入式系统，资源受限，通常只有串口或 Web 管理ESP32/单片机设备：内存以 KB 计，连接本身就是最大的能力消耗服务器/容器环境：无头运行，依赖日志和外部监控系统</code></pre><p>对于这些设备，宿主层退化为更轻量的形态：后台进程、系统服务、甚至固件级常驻程序。它依然承担配置管理、日志输出、状态维护的职责，只是交互方式从&quot;界面点击&quot;变成了&quot;配置文件 + 远程查询&quot;或&quot;硬件指示灯 + 串口日志&quot;。</p><p>无论有没有 GUI，它都要完成同样的系统链路——连接 Gateway、声明能力、接收调用、执行回传。GUI 只是宿主层在特定设备形态下的一种可选表达，而不是 Node 的定义性特征。真正重要的是，宿主层让 Node 从&quot;一段能跑能力的代码&quot;变成&quot;一个可配置、可诊断、可维护的能力宿主&quot;。至于这个宿主以什么形态呈现，应该由设备能力和部署场景决定，而不是架构预设。</p><h2 id="六多平台支持与统一语义">六、多平台支持与统一语义</h2><p>不同设备的底层实现可以天差地别，但对 OpenClaw 暴露出来的能力语义必须保持一致。</p><p>例如：</p><pre><code>`camera.snap` 在不同平台上可能走不同媒体链路`screen.snapshot` 可能依赖不同系统接口`photos` 的来源目录和权限模型也可能不同`notifications`、`location`、`calendar` 在各平台上的支持程度也会有明显差异</code></pre><p>但对于 Gateway 和上层调用者来说，它们最好仍然表现为：</p><pre><code>相同的命令接口相近的输入参数统一的结果结构一致的错误表达方式</code></pre><p>这也是为什么能力实现不能简单散落在脚本里，而要下沉到平台 provider 层，由统一的能力接口和分发逻辑向上收口。</p><p>OpenClaw Node 要解决的，不是“把多端都各写一遍”，而是“在统一协议语义下，把平台差异控制在实现层内部”。</p><h2 id="七这个应用带来了什么">七、这个应用带来了什么</h2><p>如果只把 Node 看成&quot;某个设备上的客户端程序&quot;，它的价值会被明显低估。它真正重要的地方在于：<strong>让物理设备以标准化节点的身份进入 OpenClaw。</strong></p><p>一个跑在 ESP32 上的轻量 Node，和一个运行在服务器上的完整 Node，在 OpenClaw 体系中是平等的能力节点——它们各自声明自己支持的能力，各自响应调用，各自按统一格式回传结果。</p><p>要解决的不是“本机能不能截图”，也不是“能不能做个 GUI”，而是如何把真实设备上的能力，稳定地接进 OpenClaw 网关，放进统一的连接、鉴权、声明、调用和回传链路里。</p><p>Node 的价值不是&quot;多了一个客户端&quot;，而是为 OpenClaw 补上了可运行、可扩展、可跨平台部署的能力宿主——让系统的触角真正延伸到设备层面。</p>]]>
                    </description>
                    <pubDate>Wed, 01 Apr 2026 08:51:41 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[OpenClaw(龙虾)进阶：轻量 Node 跨端控制物理设备，下一代 Agent 雏形？]]>
                    </title>
                    <link>http://www.solinx.cn/archives/2026032100002</link>
                    <description>
                            <![CDATA[<p>目前关于 OpenClaw，大家讨论最多的是工作流和 Skills 怎么写。但对于开发者来说，它还有一个非常实用的工程价值——<strong>节点（Node）服务</strong>。它解决了一个很痛点的问题：怎么优雅地让云端的 Agent 安全、稳定地调用你本地电脑或手机上的硬件能力。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/f151c2b82cba5a4e448b1e49e10797d2_1774106066837.png" alt="f151c2b82cba5a4e448b1e49e10797d2.png" /></p><p>大模型的理解能力越来越强，但还是会出现：<strong>“好的，现在请您打开手机相册，找到那张图片并上传给我。”</strong> AI 被困在了云端的沙盒里，碰不到真实世界的设备。<strong>需要各种MCP、Skills才能去打通这些资源。</strong></p><p>你想让它自动截屏、读个本地通知、或者获取一下当前位置？可以，需要部署MCP、安装Skills。</p><p><strong>OpenClaw 试图通过“网关 + 节点”的架构，把这套脏活累活标准化。</strong> 它的节点服务，给 AI 铺了一条直达真实设备的管线。</p><h2 id="节点服务解决了什么">节点服务，解决了什么？</h2><p>OpenClaw 的节点服务是一个运行在本地的 Agent 侧常驻进程。</p><p>它的运行机制有几个非常实在的工程考量：</p><p><strong>第一，主动反向连接。</strong> 节点主动通过 WebSocket/长链接连到网关。</p><p><strong>第二，显式的能力注册（Capabilities Registry）。</strong> 设备连上网关时，会主动上报：“我是一台安卓机，我支持 <code>camera.snap</code>（拍照）、<code>location.get</code>（获取定位）”。系统不用去瞎猜这台设备能干嘛，网关层面可以直接基于这些注册的能力去做鉴权和路由。</p><p><strong>第三，标准的执行闭环。</strong> 节点收到指令 》调起本地原生 API（比如调起 Android Camera） 》 拿到照片 》 传回网关。它把底层设备 API 包装成了大模型能直接理解的标准化 Tool 调用。</p><p><strong>Agent 最需要的不是各种花哨的 UI，而是这种“稳定、可组合、能返回确切结果”的本地 API、CLI。</strong></p><h2 id="为什么-android-节点很关键">为什么 Android 节点很关键？</h2><p>之前 OpenClaw 有桌面端节点，大家觉得“用 AI 控制电脑执行脚本”挺好用。但 Android 节点的出现，把场景拓宽了。</p><p>因为手机才是我们日常上下文最丰富的地方。</p><p>你的位置、最新收到的短信验证码、刚拍的照片、各种 App 的通知推送，都在手机上。把手机变成一个 Node，意味着你的 Agent 突然有了随身携带的传感器。</p><p>这两类节点有明确的区分：</p><ul><li><strong>桌面节点：</strong> 偏向生产力自动化，比如操作文件、跑脚本、读取屏幕内容。</li><li><strong>Android/IOS 节点：</strong> 偏向个人上下文感知，比如位置流、消息通知、移动摄像头的视觉输入。</li></ul><p>把手机节点化，等于是把移动端的碎片化能力，变成了 Agent 可以随时调用的标准组件。</p><h2 id="架构设计node-与-operator-解耦">架构设计：<code>Node</code> 与 <code>Operator</code> 解耦</h2><p>OpenClaw 架构设计上并没有把客户端做成一个臃肿的“全家桶”，而是严格区分了 <code>Node</code>（节点）和 <code>Operator</code>（操作端）。</p><ul><li><strong>Node（节点）：</strong> 只负责干活。它是一个无头（Headless）服务或者轻量级后台，职责仅仅是声明能力、接收调用、返回结果。</li><li><strong>Operator（操作端）：</strong> 负责控制和交互。用来发号施令、看执行状态、或者做人工审批（Human-in-the-loop）。</li></ul><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1774106295348.png" alt="image.png" /></p><p>这种解耦非常友好。这意味着，如果你想把一个吃灰的树莓派或者旧手机接入 Agent 网络，你只需要跑一个纯粹的 Node 服务就行，不需要带着沉重的 UI 和控制逻辑。权限归权限，执行归执行，这在实际部署中极其重要。</p><h2 id="真正好用的是工作流组合">真正好用的是“工作流组合”</h2><p>单个设备的 API 调用不稀奇，写个 Python 脚本也能搞定。但把这些节点能力标准化并接入 OpenClaw 后，真正的威力在于<strong>编排</strong>。</p><p>你可以很顺畅地写出这样的流：</p><pre><code>1. Agent 收到指令，调用 Android 节点读取最新的一条应用通知。2. LLM 分析通知内容，如果是重要报警，则调用桌面节点在你的电脑屏幕上弹窗。3. 如人不在电脑前（桌面节点无响应），再调用 Android 节点的短信接口发一条消息。</code></pre><p>这类组合一旦跑通，Agent 就不再只是“云端对话机器人”，可以真正能在你的多台设备之间穿梭、执行真实任务的自动化助手。</p><h2 id="节点服务目前还不成熟">节点服务目前还不成熟</h2><p><strong>这套节点服务目前还处于非常早期的阶段。</strong></p><p>目前的 Android 节点，截至目前，官方甚至还没有正式发布可用的 APK 安装包。 核心代码和框架还在高频迭代中。但这应该是未来的一个方向。</p><h2 id="android节点初体验">Android节点初体验</h2><p>虽然目前 Android 节点没正式发版，但在github仓库已经有完整代码，可以自己去拉取编译就可以安装安卓节点体验Openclaw的节点。</p><p>目前的安卓节点连接到Openclaw 网关后可以提供以下一些能力：</p><pre><code> 📍 定位 - 获取当前位置   📸 拍照/录像 - 调用前后摄像头   🚶 运动数据 - 步数、活动状态（需授权权限）   🔔 通知 - 查看通知列表   📱 设备信息 - 电池、存储等状态   📅 日历 - 查看日程事件（需授权）   📞 通话记录 - 查看通话记录（需授权）   📇 联系人 - 搜索联系人（需授权）   📷 相册 - 查看最新照片（需授权）  </code></pre><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/595c128a9f4ec93949f92902c5e4176e_1774106140703.png" alt="595c128a9f4ec93949f92902c5e4176e.png" /></p><h2 id="总结">总结</h2><p>如果把 OpenClaw 的节点服务剥开来看，它就是一套<strong>面向大模型时代的基础设施中间件</strong>。</p><p>把不同操作系统的底层能力做了标准化封装，解决了网络联通和能力注册的问题。对于想要真正把 AI 落地到物理设备上的开发者来说，这套机制提供了一个非常清爽的参考实现。</p><p>未来的 AI 应用，拼的不仅是 Prompt 写得有多好，更要看你的系统能调度多少真实的本地资源。</p><hr />]]>
                    </description>
                    <pubDate>Mon, 23 Mar 2026 07:58:46 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[OpenClaw(龙虾) 进阶：AI Agent团队协同的原理与使用]]>
                    </title>
                    <link>http://www.solinx.cn/archives/202603100000</link>
                    <description>
                            <![CDATA[<p>在构建复杂的 AI Workflow 时，依赖单一的大模型或单一的 Agent，通常难以兼顾不同领域的专业性。上下文一长，AI 就容易“失忆”或“越界”。</p><p>趋势必然是<strong>多 Agent 协同作业（Multi-Agent）</strong>——让负责调度的“老板”、负责写代码的“技术专家”和负责搜集信息的“情报员”各司其职，通过标准的协议进行串联、并联。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/1_1773067761352.png" alt="1.png" /></p><p>上篇文章我们介绍了多Agent的配置与接入，这里将拆解 OpenClaw 的多 Agent 协作机制，将上篇文章所创建的三个Agent，组建成为一支“数字”团队。</p><p>注意，这里使用的是点对点平级的Agent，不是主从/派生Agent。不适合真实公司一个Gateway多用户共用的情况，可能会有数据泄露的情况。</p><h2 id="01--核心协作机制agent-们是如何沟通的">01 | 核心协作机制：Agent 们是如何沟通的？</h2><p>在 OpenClaw 中，Agent 之间的通讯并非黑盒，而是建立在极其严谨的<strong>会话隔离（Session Isolation）与分发机制</strong>之上，从根本上杜绝了信息串扰。</p><ul><li><strong>唯一标识符（agentId）</strong>：定义 Agent 时，必须确保所有的 <code>agentId</code> 都是<strong>小写</strong>（例如：<code>code-agent</code>, <code>news-agent</code>, <code>main</code>），这是系统精准路由请求、建立独立上下文队列的基础。</li><li><strong>指令流转路径</strong>：当你向 Agent X 下达复杂任务时，X 会通过内置工具 <code>sessions_send</code> 唤起专业的 Agent T 协助。Agent T 在自己的“独立沙箱”中完成工作流后将结果返回，最后由 Agent X 汇总交付。</li><li><strong>会话隔离与穿透</strong>：默认情况下，每个 Agent 处于绝对的上下文隔离中，只关注自己的目标。如果调度者需要跨 Agent 查看历史会话，必须通过 <code>sessions_spawn</code> 或 <code>sessions_history</code> 工具显式调用。</li></ul><h2 id="02--权限边界与安全隔离">02 | 权限边界与安全隔离</h2><p>在多 Agent 协作的架构中，越权调用（比如让新闻助理拥有执行 Shell 脚本的权限）可能会带来灾难性的安全风险。OpenClaw 提供了细粒度的能力控制方案（Capability-based permissions）：<img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/2_1773067815884.png" alt="2.png" /></p><p><strong>1. 开启点对点通讯白名单</strong>我们需要明确告知系统，哪些 Agent 允许直接对话。在配置中定义通讯白名单：</p><pre><code class="language-json">&quot;tools&quot;: {  &quot;agentToAgent&quot;: {    &quot;enabled&quot;: true,    &quot;allow&quot;: [&quot;code-agent&quot;, &quot;news-agent&quot;, &quot;main&quot;]  }}</code></pre><p><strong>2. 设定会话可见度（Session Visibility）</strong>为了防止非必要的信息干扰，可以控制 Agent 是否能“偷听”全局对话：</p><pre><code class="language-json">&quot;tools&quot;: {  &quot;sessions&quot;: {    &quot;visibility&quot;: &quot;all&quot;  // agent仅可见自身会话，设置为 &quot;all&quot; 则全局可见  }}</code></pre><p><strong>3. 严格的工具权限控制（Deny 优先原则）</strong>根据岗位职责限制 Agent 能使用的工具。<strong>注意：在 OpenClaw 中，<code>deny</code> 的优先级永远高于 <code>allow</code>。</strong> 例如，“新闻资讯助理”只需要查阅和发送消息，必须明确禁用其系统操作权限：</p><pre><code class="language-json">{  &quot;id&quot;: &quot;news-agent&quot;,  &quot;name&quot;: &quot;新闻资讯助理&quot;,  &quot;tools&quot;: {    &quot;allow&quot;: [&quot;sessions_list&quot;, &quot;sessions_send&quot;, &quot;read&quot;],    &quot;deny&quot;: [&quot;write&quot;, &quot;edit&quot;, &quot;exec&quot;, &quot;apply_patch&quot;, &quot;bash&quot;]   }}</code></pre><h2 id="03--内外兼修的解耦架构身体-与-大脑">03 | 内外兼修的解耦架构：身体 与 大脑</h2><p>OpenClaw 将 Agent 的“物理运行环境”与“灵魂认知记忆”做了彻底的解耦。这种计算与状态分离的设计，使动态扩展多 Agent 变得非常轻量。每个 Agent 实体由两部分核心目录构成：</p><h3 id="-一-agentdir-物理配置层---body">🛠 一、 agentDir (物理配置层 - Body)</h3><p><strong>默认路径：</strong> <code>~/.openclaw/agents/&lt;agentId&gt;/agent/</code>这里是 Agent 的“躯壳”，负责最基础的工程接入与鉴权。</p><ul><li><code>auth-profiles.json</code>：存放各类 API Keys、数据库密码等敏感认证凭证。</li><li><code>models.json</code>：定义该 Agent 调用的基座大模型（例如：主节点用复杂推理模型，子节点用低延迟的快模型）。</li></ul><h3 id="-二-workspace-认知记忆层---brain">🧠 二、 Workspace (认知记忆层 - Brain)</h3><p><strong>默认路径：</strong> <code>~/.openclaw/workspace-&lt;name&gt;/</code>这是 Agent 的核心“大脑”。在这个目录中，通过一系列纯文本的 <code>.md</code> 文件定义了 Agent 的运行时状态：</p><ul><li><strong>身份设定</strong>：<code>SOUL.md</code> (系统提示词、人格特性)、<code>IDENTITY.md</code> (名称、头像)</li><li><strong>行为规范</strong>：<code>AGENTS.md</code> (行为规则、工作流、具体职责、擅长什么)、<code>USER.md</code> (主人的偏好)</li><li><strong>知识与生命周期</strong>：<code>MEMORY.md</code> (长期记忆区)、<code>HEARTBEAT.md</code> (定时主动任务清单)</li></ul><blockquote><p><strong>关注点：</strong> <code>agentDir</code> 决定了“用什么算力和密钥”，而 <code>Workspace</code> 决定了“它是谁、它懂什么、它该和谁协同”。不要在不同的 Agent 之间复用同一个 <code>agentDir</code>，这会导致 Auth 和 Session 严重冲突！</p></blockquote><table><thead><tr><th>文件</th><th>作用</th></tr></thead><tbody><tr><td><strong>AGENTS.md</strong></td><td>agent 的行为规则、工作流、具体职责、擅长什么</td></tr><tr><td><strong>SOUL.md</strong></td><td>agent 的身份人格、性格</td></tr><tr><td><strong>USER.md</strong></td><td>用户偏好、上下文</td></tr><tr><td><strong>IDENTITY.md</strong></td><td>agent 名称、emoji、头像</td></tr><tr><td><strong>TOOLS.md</strong></td><td>本地工具配置（相机、SSH 等）</td></tr><tr><td><strong>HEARTBEAT.md</strong></td><td>定时检查任务清单</td></tr><tr><td><strong>MEMORY.md</strong></td><td>长期记忆</td></tr><tr><td><strong>memory/</strong></td><td>每日笔记文件夹</td></tr><tr><td><strong>skills/</strong></td><td>技能文件夹</td></tr><tr><td><strong>BOOTSTRAP.md</strong></td><td>首次运行引导（执行后删除）</td></tr></tbody></table><hr /><h2 id="04--实战演练组建你的三剑客团队">04 | 实战演练：组建你的三剑客团队</h2><p>让团队无缝协同，最关键的是为每个 Agent 注入专属的灵魂（<code>SOUL.md</code>），并在 <code>AGENTS.md</code> 中写明团队的“路由表”和“协作边界”。</p><p>下面配置一个由“老板、技术专家、情报助理”组成的三人微型团队。</p><h3 id="权限配置">权限配置</h3><p>修改openclaw.json文件，定义允许相互通讯的Agent，设置sessions对话全局可见。visibility：agent 仅可见自身会话，设置为 &quot;all&quot; 则全局可见，可选值:self、tree、agent、all</p><pre><code class="language-json">&quot;tools&quot;: { &quot;agentToAgent&quot;: {   &quot;enabled&quot;: true,   &quot;allow&quot;: [&quot;code-agent&quot;, &quot;news-agent&quot;, &quot;main&quot;] }, &quot;sessions&quot;: {   &quot;visibility&quot;: &quot;all&quot; }}</code></pre><h3 id="角色一main老板--任务调度中枢">角色一：main（老板 / 任务调度中枢）</h3><p><strong>Workspace 路径:</strong> <code>/root/.openclaw/workspace-main/</code></p><p>作为整个工作流的控制节点，<code>main</code> 负责接收你的自然语言需求，并将其拆解分发。</p><p><strong>【注入灵魂：SOUL.md】</strong></p><pre><code># SOUL.md - main我是小飞本，团队领导，负责协调团队任务分发。我的性格：高效、冷静。负责团队协调、任务调度和进度追踪。遇到需要具体执行的任务，请毫不犹豫地分配给对应的专业 Agent。团队通讯录在 AGENTS.md 中。</code></pre><p><strong>【团队通讯录与路由：AGENTS.md】</strong></p><pre><code># AGENTS.md - 团队通讯录与任务调度规则## 团队成员- **newsAgent** (agentId: news-agent) - 职责：行业资讯抓取、信息总结。- **main** (你-agentId: main) - 职责：团队管理、任务分发。- **codeAgent** (agentId: code-agent) - 职责：代码编写与审查、系统架构设计。## 任务调度规则| 任务类型 | 目标 Agent | 调用语法示例 ||---------|----------|---------|| 资讯抓取/总结 | news-agent | `sessions_send(agentId=&quot;news-agent&quot;, task=&quot;...&quot;)` || 代码/技术支持 | code-agent | `sessions_send(agentId=&quot;code-agent&quot;, task=&quot;...&quot;)` |## 工作流约束不要自己写代码或抓取网页！必须通过 `sessions_send` 将专业任务委派给对应的 Agent，并等待其返回结果后再汇报给用户。</code></pre><hr /><h3 id="角色二codeagent底层技术专家">角色二：codeAgent（底层技术专家）</h3><p><strong>Workspace 路径:</strong> <code>/root/.openclaw/workspace-code/</code></p><p><strong>【注入灵魂：SOUL.md】</strong></p><pre><code># SOUL.md - code-agent你是团队的首席技术专家。性格：严谨、极客、专注于最佳实践。职责：代码编写、审查、技术方案设计及 Bug 修复。当你收到代码需求时，必须提供可直接运行、包含清晰注释的代码片段。必要时允许使用本地工具链进行测试。</code></pre><p><strong>【团队通讯录与协作边界：AGENTS.md】</strong></p><pre><code># AGENTS.md - 团队成员与协作边界- **main** (调度中枢/老板) - 你的直接汇报对象。当你完成脚本编写、组件开发或底层架构设计后，请将代码结果、测试覆盖情况和运行日志准确无误地汇报给它。- **codeAgent** (你 - 技术专家) - 负责底层代码实现与 Review。- **newsAgent** (情报助理) - 你不需要主动联系它，除非涉及资讯抓取爬虫的代码维护，或者它主动向你报告工具运行报错。</code></pre><hr /><h3 id="角色三newsagent外部信息触角">角色三：newsAgent（外部信息触角）</h3><p><strong>Workspace 路径:</strong> <code>/root/.openclaw/workspace-news/</code></p><p><strong>【注入灵魂：SOUL.md】</strong></p><pre><code># SOUL.md - news-agent你是团队的情报助理。性格：敏锐、客观、信息处理速度极快。职责：只负责全网行业资讯的抓取、清洗与聚合。你需要过滤噪音，并将冗长的网页文本转化为结构化的简报返回给调度者。</code></pre><p><strong>【团队通讯录与协作边界：AGENTS.md】</strong></p><pre><code># AGENTS.md - 团队成员与协作边界- **main** (调度中枢/老板) - 你的唯一业务汇报对象。请将抓取、清洗并结构化处理好的行业资讯简报（去除广告和冗余噪音）直接发送给它。- **codeAgent** (技术专家) - 你的技术后盾。如果你的资讯抓取脚本失效，或遭遇反爬虫策略导致工具报错，可以通过 `sessions_send` 向它求助，要求它提供修复方案或更新代码。- **newsAgent** (你 - 情报助理) - 专注全网资讯处理与降噪，不参与任何系统级别的代码修改。</code></pre><h2 id="4png"><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/4_1773067866802.png" alt="4.png" /></h2><h2 id="结语">结语</h2><p>** 为不同 Agent 绑定不同的通讯渠道 (Channel Binding)**OpenClaw 支持将不同的 Agent 绑定到不同的通讯软件账号上。例如：你可以将 <code>main</code> 调度者绑定到你的个人 QQ 账号，而将 <code>codeAgent</code> 作为一个专门的机器人绑定到你们团队的 飞书 频道中。通过同一个 Gateway 服务，实现多渠道、多身份的无缝切换。</p><p>多 Agent 的魅力就在于此：<strong>将复杂的长逻辑链条，拆解为多个高内聚、低耦合的专业节点异步协作。</strong></p>]]>
                    </description>
                    <pubDate>Tue, 10 Mar 2026 08:14:33 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[OpenClaw(龙虾) 进阶：多机器人、多 Agent 配置——AI团队协同的前提]]>
                    </title>
                    <link>http://www.solinx.cn/archives/202603090001</link>
                    <description>
                            <![CDATA[<p>默认情况下添加飞书频道绑定一个机器人之后，这时每个机器人对应的是一个Agent。你将该机器人拉到不同的群中他对应的也只是同一个机器人，在<strong>OpenClaw</strong>端背后对应着同一个Agent。</p><p><strong>单机器人多群聊多Agent</strong>：配置多个群聊对应单机器人多个不同Agent，每个Agent之间数据隔离、模型可以不一样，实现群数据隔离。<br /><strong>多机器人多Agent</strong>：添加多个机器人连接到同一个OpenClaw，不同的机器人可以对应不同Agent，Agent之间数据隔离、模型可以不一样。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1772888640222.png" alt="" /></p><h2 id="一多群聊多agent">一、多群聊多Agent</h2><p>多个群组同时往一个机器人发消息时由于它背后对应的是同一个Agent此时如果Agent有在处理任务其他消息会进入队列等待。如果想让同一个机器人在不同的群中扮演不同的角色，对应不同的技能，不同群组之间数据进行隔离能否做到？答案是可以做得到，这就是本章节要介绍的主要内容。</p><p>多群聊单个机器人对应OpenClaw中多个不同的Agent，就能达到上面所说的目标：<strong>不同的技能，不同群组间数据隔离。</strong></p><h2 id="备份openclaw">备份OpenClaw</h2><p>备份是为了避免误操作之后无法回复数据。</p><pre><code> cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak_$(date +%Y%m%d_%H%M%S) ls -l ~/.openclaw/openclaw.json*</code></pre><p>恢复OpenClaw的配置。</p><pre><code> cp ~/.openclaw/openclaw.json.bak_YYYYMMDD_HHMMSS ~/.openclaw/openclaw.json ##openclaw.json.back_YYYYMMDD_HHMMSS为备份时的实际文件名</code></pre><h3 id="1新增-agents">1、新增 Agents</h3><p>使用openclaw agents add 命令可以添加新 Agent，需要把workspace 路径和Agent 的名称换为自己设置的路径和名称：</p><pre><code> openclaw agents add --workspace 工作空间路径 Agent名称   参数说明： • --workspace：独立的工作空间路径，如：/root/.openclaw/workspace-feishu-code •  Agent名称：此名称唯一，也啊AgentId，可为任意名称，推荐见名知意，如：code-agent • --model：需要使用自定义模型，可以添加此参数填写模型 ID，否则使用默认模型</code></pre><p>这里以创建一个Code Agent 为例，命名为code agent，对应的 workspace 设置为/root/.openclaw/workspace-code-agent。</p><pre><code> openclaw agents add --workspace /root/.openclaw/workspace-code-agent code-agent</code></pre><h3 id="2验证-agent">2、验证 Agent</h3><p>查看创建的Agent是否成功。</p><pre><code> openclaw agents list</code></pre><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1772947994943.png" alt="" /></p><h3 id="3飞书群组绑定">3、飞书群组绑定</h3><p>配置飞书群组与Agent的绑定关系，先查看当前是否还有其他绑定数据，现在需要新增一个群组与Agent的绑定关系。查看当前的绑定关系：openclaw config get bindings</p><p>在原来的基础上添加新的绑定关系，如果当前绑定为空，可以在替换 id 为实际的飞书群组会话id后直接执行下面语句。</p><pre><code>openclaw config set --json bindings '[  {    &quot;agentId&quot;: &quot;code-agent&quot;,    &quot;match&quot;: {      &quot;channel&quot;: &quot;feishu&quot;,      &quot;peer&quot;: {        &quot;kind&quot;: &quot;group&quot;,        &quot;id&quot;: &quot;oc_34fdfds3333jkjjjjhhhhbdd222&quot;      }    }  }]'</code></pre><p>对于存在绑定关系的可以先get bindings得到原先关系，在按照下面方法设置新关系。路由的匹配规则：从精确到模糊、从上到下。精确的路由规则尽量放在上面，Default 为兜底规则。<br />执行：config set --json bindings '[ 原绑定, 新飞书群绑定 ]'<br />绑定完后可再次执行：openclaw config get bindings 确认是否绑定正确。</p><h3 id="4群组允许列表">4、群组允许列表</h3><p>默认channels.feishu.groupPolicy是open，允许响应所有群组的消息，可以将其设置为allowlist。只响应经过授权的群组消息。<br />使用 allowlist 策略确保配置在 groupAllowFrom 中的群组才可访问 OpenClaw。</p><pre><code> openclaw config set channels.feishu.groupPolicy allowlist openclaw config set --json channels.feishu.groupAllowFrom '[&quot;oc_34fdfds3333jkjjjjhhhhbdd222&quot;]'</code></pre><p>在非授权群组@机器人时OpenClaw日志如下：</p><pre><code> [feishu] feishu[default]: received message from ou_29474ba1e15f058a10da8b83c037734d in oc_12c8eec3fcb22fc9aa634dfe29fddf2d (group) [feishu] feishu[default]: group oc_12c8eec3fcb22fc9aa634dfe29fddf2d not in groupAllowFrom (groupPolicy=allowlist)</code></pre><h3 id="5重启gateway">5、重启Gateway</h3><pre><code> openclaw gateway restart</code></pre><p>配置完后可看到新的agent。</p><p>同一个机器人在不同的群组中绑定不同Agent，数据按群组隔离。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1772888703152.png" alt="" /></p><h2 id="二多机器人多agent">二、多机器人多Agent</h2><p>上面使用过了 openclaw config 指令完成 OpenClaw 配置的更新，这里直接修改 openclaw.json 文件完成多机器人多Agent的配置。</p><h3 id="1创建工作空间">1、创建工作空间</h3><pre><code> mkdir -p /root/.openclaw/workspace-news-agent</code></pre><p>编辑openclaw.json文件<br />vim /root/.openclaw/openclaw.json在 agents 键的 list 数组中添加一个 Agent，这里新增的 Agent 为 news-agent。</p><pre><code>&quot;list&quot;: [    {      &quot;id&quot;: &quot;main&quot;    },    {      &quot;id&quot;: &quot;code-agent&quot;,      &quot;name&quot;: &quot;code-agent&quot;,      &quot;workspace&quot;: &quot;/root/.openclaw/workspace-feishu-code&quot;,      &quot;agentDir&quot;: &quot;/root/.openclaw/agents/code-agent/agent&quot;    },    {      &quot;id&quot;: &quot;news-agent&quot;,      &quot;name&quot;: &quot;news-agent&quot;,      &quot;workspace&quot;: &quot;/root/.openclaw/workspace-feishu-news&quot;,      &quot;agentDir&quot;: &quot;/root/.openclaw/agents/news-agent/agent&quot;,      &quot;model&quot;: {        &quot;primary&quot;: &quot;minimax-cn/MiniMax-M2.5&quot;      }    }  ]</code></pre><pre><code>id: Agent 唯一标识agentDir: agent目录default: 标记默认 Agent 只有一个可为 trueworkspace: 工作空间路径model.primary:  Agent 使用的模型  </code></pre><p>这里 id 为 main 的为默认主Agent，可以不要此Agent，添加 default 为 true 的key将其他Agent设置为主Agent。</p><h3 id="2配置飞书机器人">2、配置飞书机器人</h3><p>channels.feishu 键中新添加一个机器人：</p><pre><code>&quot;channels&quot;: {   &quot;feishu&quot;: {     &quot;enabled&quot;: true,     &quot;accounts&quot;: {         &quot;main&quot;:{              &quot;appId&quot;: &quot;cli_a911111111111111&quot;,              &quot;appSecret&quot;: &quot;WeiX4e8rjfLR91Uz0N7xTeqffffffffff&quot;         },         &quot;news-agent&quot;:{              &quot;appId&quot;: &quot;cli_a922222222222222&quot;,              &quot;appSecret&quot;: &quot;f9oDvGGhVRjDeAbXjEL1hggggggggggggg&quot;         }     },     &quot;domain&quot;: &quot;feishu&quot;,     &quot;groupPolicy&quot;: &quot;open&quot;,     &quot;dmPolicy&quot;: &quot;open&quot;,     &quot;allowFrom&quot;: [       &quot;*&quot;     ],     &quot;renderMode&quot;: &quot;card&quot;,     &quot;streaming&quot;: true,     &quot;footer&quot;: {       &quot;status&quot;: true,       &quot;elapsed&quot;: true     },     &quot;groupAllowFrom&quot;: [       &quot;oc_12xxxxxxxxxxxxxxxxx&quot;     ]   } }</code></pre><p>每个accounts 的 key（如code-agent）与每个 Agent ID 一一对应。 appId 和 appSecret 为每个飞书机器人的应用凭证。</p><h3 id="3配置绑定路由">3、配置绑定路由</h3><pre><code>&quot;bindings&quot;: [    {           &quot;agentId&quot;: &quot;code-agent&quot;,       &quot;match&quot;: {        &quot;channel&quot;: &quot;feishu&quot;,        &quot;accountId&quot;: &quot;main&quot;,        &quot;peer&quot;: {          &quot;kind&quot;: &quot;group&quot;,          &quot;id&quot;: &quot;oc_12xxxxxxxxxxxxxxxxx&quot;        }      }    },{        &quot;agentId&quot;: &quot;news-agent&quot;,        &quot;match&quot;: {         &quot;channel&quot;: &quot;feishu&quot;,         &quot;accountId&quot;: &quot;news-agent&quot;       }    }  ]</code></pre><p>修改完openclaw.json后执行 openclaw config get bindings 检查绑定对不对。</p><pre><code>match.channel: 固定为 &quot;feishu&quot;match.accountId: 对应飞书机器人的 key 这里是 news-agentagentId:  消息路由到的 Agent</code></pre><p>还可以为每个Agent创建记忆文件，如IDENTITY、SOUL.md、AGENTS.md、MEMORY.md等。</p><h3 id="4重启gateway">4、重启Gateway</h3><pre><code>##重启openclaw gateway restart## 查看状态openclaw gateway status</code></pre><p>重启完之后即可看到新接入的不同Agent的机器人。</p><center><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1772888761581.png" alt="" /></p></center><p>完成上面的配置后OpenClaw同时具备了单机器人多群聊多Agent、多机器人多Agent的能力。</p><h2 id="总结">总结</h2><p>这里使用了两种方式来完成 OpenClaw 多 Agent 的配置。使用命令行完成 Agent 的添加、配置的修改可能对非IT人员来说更简单下，直接修改~/.openclaw/openclaw.json 文件也许对于非码农来说可能难度更高。当然还可以直接使用小龙虾来完成上述模型，如果你用的是比较差的模型，你还是慎重，小龙虾比较容易把自己搞死。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1772888904811.png" alt="" /></p><p><strong>单Agent如果职责过多可能会造成完成任务的质量下降，或记忆混乱。</strong> 为了职责分明，可以在多Agent的基础上让各个Agent之间相互通讯，进行分工协作完成任务。</p>]]>
                    </description>
                    <pubDate>Mon, 09 Mar 2026 08:22:41 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[Claude Code 实战：从 Plan 模式到多 Agent 并行，NewsFlow 升级实录]]>
                    </title>
                    <link>http://www.solinx.cn/archives/20260217002</link>
                    <description>
                            <![CDATA[<p>上篇文章介绍了Vibe Coding编程的基本流程与使用，本篇主要关于如何Vibe Coding对产品进行升级，通过对 NewsFlow 这个新闻聚合应用进行升级来连接AI工具的使用。</p><p>要实现 UX 升级、RSS 集成、智能搜索、视觉创新四大模块，按传统开发节奏至少需要一个月。这次全程使用 Claude Code 作为结对编程伙伴。</p><p>今天分享的不是 AI 代替开发者的神话，而是介绍人机协作的真实工作流——哪些事交给 AI，哪些事需要自己把控，以及如何让 Claude Code 发挥最大价值。</p><h2 id="823d0ac55bb8d053f8feb2052fe547b9png"><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/823d0ac55bb8d053f8feb2052fe547b9_1771254386136.png" alt="823d0ac55bb8d053f8feb2052fe547b9.png" /></h2><h2 id="-claude-code-是什么">🛠️ Claude Code 是什么？</h2><p>简单说，它是 Anthropic 推出的<strong>命令行 AI 编程助手</strong>。</p><ul><li>与 IDE 插件不同，Claude Code 直接在终端运行</li><li>可以读写文件、执行命令、运行测试、启动服务</li><li>支持<strong>多 Agent 并行执行</strong>——可以同时让几个 AI Agent 干不同的活</li><li>有 Plan 模式，可以先让 AI 做完整的技术方案，审核后再动手</li></ul><hr /><h2 id="-四大升级计划总览">📋 四大升级计划总览</h2><table><thead><tr><th>功能模块</th><th>核心交付物</th></tr></thead><tbody><tr><td>UX 升级</td><td>骨架屏、深色模式、无限滚动、已读状态、增量提醒</td></tr><tr><td>RSS 集成</td><td>RSS 解析器、标签云、动态统计、配置系统</td></tr><tr><td>智能搜索</td><td>Fuse.js 搜索、AI 摘要 API、搜索历史</td></tr><tr><td>视觉创新</td><td>词云可视化、AI 晨报、3D 浮动卡片</td></tr></tbody></table><hr /><h2 id="-工作流一plan-模式让-ai-先过脑子">💡 工作流一：Plan 模式，让 AI 先“过脑子”</h2><p><strong>传统开发的痛点</strong>： 我们通常会先写设计文档（Design Doc），但人脑很难记全整个项目的历史代码。可能会出现<strong>文档写得完美，一写代码全废</strong> ——因为忽略了某个角落里的遗留依赖，导致中途必须推倒重来。</p><p><strong>Claude Code 方式</strong>：进入 /plan 模式，AI 实时扫描代码库 → 发现隐蔽依赖 → 生成基于现状的可执行方案，还可以人为调整方案。</p><pre><code>我: /plan 给 NewsFlow 添加动态词云功能Claude Code:📋 Plan Mode正在分析代码库...正在设计实现方案...计划概要:- 使用 d3-cloud 实现词云布局- 后端添加 /api/news/wordcloud 端点- 前端创建 WordCloud 组件- 支持点击筛选、深色主题适配- 预估工作量: 2 天详细步骤 [点击展开]...[批准计划] [修改建议] [取消]</code></pre><p><strong>Plan 模式的价值</strong>：</p><ul><li>开发前做好计划</li><li>AI 读代码库，了解现有架构</li><li>提出的方案遵循现有代码风格</li><li>可以在 AI 写一行代码之前就发现方向性问题</li></ul><hr /><h2 id="-工作流二并行执行效率翻倍">🤝 工作流二：并行执行，效率翻倍</h2><p>Claude Code 可以<strong>多 Agent 并行执行</strong>，目前还升级了 <strong>Agent Teams</strong> 可以让团队成员无缝协同工作。</p><p>比如开发 UX 升级模块时，让三个 Agent 同时工作：</p><pre><code>我: 启动并行任务Agent 1 (后端):正在扩展 /api/news 端点，添加 since 参数...✓ 添加 /api/news/latest 端点✓ 更新 NewsResponse 模型✓ 添加缓存逻辑Agent 2 (前端组件):正在创建 SkeletonLoader 组件...✓ 实现 shimmer 动画✓ 复用 NewsCard 布局结构✓ 添加可配置数量参数Agent 3 (测试):正在编写 E2E 测试...✓ 骨架屏测试✓ 主题切换测试✓ 无限滚动测试All agents completed in parallel ✅</code></pre><p><strong>这相当于同时有三个工程师在干活</strong>，而且它们之间不会产生代码冲突（因为我设置了清晰的依赖关系）。</p><hr /><h2 id="-工作流三ai-写代码我来-code-review">🧩 工作流三：AI 写代码，我来 Code Review</h2><p>Claude Code 生成的代码不是直接提交的，而是进入 Code Review 流程：</p><pre><code>Agent: 代码已生成，正在启动 code-reviewer Agent...code-reviewer:审查文件: frontend/src/components/WordCloud.tsx发现 1 个 CRITICAL 问题:- 词云颜色未适配深色主题发现 2 个 HIGH 优先级问题:- 缺少错误边界处理- 未添加 loading 状态修复建议 [点击应用]</code></pre><p>对于 code-review 出现的问题可以选择：</p><ol><li>让 AI 自动修复</li><li>自己手动修改</li><li>标记为&quot;可接受&quot;</li></ol><p><strong>这种工作流让开发者保持对代码质量的掌控</strong>，AI 是加速器，不是黑盒。</p><hr /><h2 id="-实战案例rss-集成模块">📊 实战案例：RSS 集成模块</h2><p>这是四个模块中最复杂的一个，涉及后端解析、配置系统、前端重构。NewsFlow 需要聚合来自不同源（少数派、36Kr、个人博客）的 RSS，痛点是格式标准不一（RSS 2.0）。</p><p>以前写这种解析器，需要手动去调试每个字段的映射。而 Claude Code 具有**数据归一化（Normalization）**能力，它理解了“聚合阅读器”的业务本质。</p><p>来看看 Claude Code 是怎么完成的。</p><h3 id="phase-1-架构设计plan-模式">Phase 1: 架构设计（Plan 模式）</h3><pre><code>Claude Code 分析结果:当前架构问题:- NewsItem.source 是硬编码字面量类型- 添加新数据源需要修改 7 个文件- 无统一配置管理建议方案:✓ 使用 JSON 配置文件管理数据源✓ feedparser 解析 RSS✓ 渐进式重构，保持向后兼容✓ 分 4 个 Wave 并行执行</code></pre><h3 id="phase-2-并行开发">Phase 2: 并行开发</h3><pre><code>Wave 1 (并行):├── Agent A: 安装 feedparser 依赖├── Agent B: 创建 data_sources.json 配置├── Agent C: 实现 RSS 抓取器└── Agent D: 编写 RSS 单元测试Wave 2 (Wave 1 完成后启动):├── Agent E: 重构数据模型├── Agent F: 重构 API 端点├── Agent G: 编写 API 测试└── Agent H: 更新 config.py</code></pre><h3 id="phase-3-集成测试">Phase 3: 集成测试</h3><pre><code>Agent: 启动集成测试✓ 向后兼容性测试通过✓ 标签筛选功能正常✓ Top 5 统计显示正确✓ 已读变色功能工作E2E 测试报告: 16/16 通过</code></pre><hr /><h2 id="-视觉创新模块词云组件的诞生">🎨 视觉创新模块：词云组件的诞生</h2><p>动态词云是这次升级的&quot;颜值担当&quot;，功能横跨了后端（Python）和前端（React），是检验 AI 全栈能力的试金石。业务流程：后端提取关键词 -&gt; 前端 D3 可视化 -&gt; 点击交互联动。</p><h3 id="phase-1-plan-模式确定方案">Phase 1: Plan 模式确定方案</h3><pre><code>我: /plan 给 NewsFlow 添加动态词云功能Claude Code (planner):━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━# 实现计划：动态热度词云## 技术选型- 词云布局: d3-cloud（本地实现，无需大模型 API）- 中文分词: jieba- 后端 API: GET /api/news/wordcloud- 前端组件: WordCloud.tsx## 实现阶段1. 后端词频统计 API（2h）2. 前端依赖安装（0.5h）3. 词云组件开发（4h）4. 点击筛选交互（2h）5. 错误处理和优化（2h）━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━我: yes，按此计划执行</code></pre><h3 id="phase-2-按计划执行">Phase 2: 按计划执行</h3><pre><code>Agent (执行):━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━正在执行 Phase 1: 后端词频统计 API✓ 添加 GET /api/news/wordcloud 端点✓ 集成 jieba 中文分词✓ 添加 TTLCache 缓存（300秒）✓ 支持 source 和 tags 参数过滤正在执行 Phase 2: 前端依赖✓ 安装 d3-cloud, d3, d3-selection, d3-scale正在执行 Phase 3: 词云组件✓ 创建 WordCloud.tsx（700+ 行）  • 骨架屏加载动画（shimmer effect）  • D3 过渡动画（渐入 + 浮动）  • 错误状态 UI（重试按钮）  • 响应式布局（移动端适配）  • 主题色适配（浅色/深色）正在执行 Phase 4: 点击筛选交互✓ 实现点击词语触发新闻筛选✓ 与现有筛选器集成（AND 逻辑）正在执行 Phase 5: 错误处理和优化✓ 添加错误边界✓ React.memo 优化重渲染✓ 加载状态管理━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</code></pre><h3 id="phase-3-code-review">Phase 3: Code Review</h3><pre><code>code-reviewer Agent:审查文件: frontend/src/components/WordCloud.tsx━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━✓ TypeScript 类型安全✓ React.memo 优化重渲染✓ 错误边界完善✓ 无障碍性标签完整✓ 性能优化✓ 主题色正确适配代码质量: 优秀建议: 无需修改</code></pre><hr /><h2 id="-核心经验总结">🎯 核心经验总结</h2><h3 id="-claude-code-擅长的">✅ Claude Code 擅长的</h3><ol><li><strong>重复性代码</strong> - 数据模型、API 端点、CRUD 操作</li><li><strong>标准化任务</strong> - 单元测试、E2E 测试、配置文件</li><li><strong>并行执行</strong> - 多个独立模块同时开发</li><li><strong>代码审查</strong> - 第一轮筛选，我聚焦于架构和业务逻辑</li></ol><h3 id="-需要人工把控的">⚠️ 需要人工把控的</h3><ol><li><strong>架构决策</strong> - Plan 模式给出方案。开发人员来拍板。是做单体还是微服务？数据怎么流转？</li><li><strong>业务逻辑</strong> - AI 不懂产品，需求必须我明确。</li><li><strong>代码审查</strong> - 最终审核权在人手里，Code Review 成了核心工作。</li><li><strong>调试疑难问题</strong> - AI 能帮忙，需要开发者引导。</li></ol><p><strong>具体、带上下文、有参考</strong>， Claude Code 的输出质量会高很多。</p><hr /><h2 id="结语">结语</h2><p>把AI用好了，Agent就是你的团队成员。AI 不是替代开发者，而是放大开发者的能力。</p><ul><li>开发者花更多时间在<strong>架构设计/审核</strong>和<strong>需求把控</strong>上</li><li>Claude Code 负责<strong>代码实现</strong>和<strong>重复劳动</strong></li><li>Code Review 保持<strong>代码质量</strong>在可控范围内</li></ul>]]>
                    </description>
                    <pubDate>Tue, 17 Feb 2026 09:50:34 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[当AI编程进入「Vibe Coding」模式：从脑洞到MVP产品]]>
                    </title>
                    <link>http://www.solinx.cn/archives/2026021600002</link>
                    <description>
                            <![CDATA[<p>  传统产品开发流程是比较繁琐的，光需求调研就要花不少时间，更别说后面的技术选型、架构设计、代码实现、测试调试、部署运维——每个环节都有大量工作要做。</p><blockquote><p>AI 编程不是简单地理解为 AI 替我们&quot;写完了所有代码&quot;，而是有整套 AI-Native 工作流：以 Claude Code 这类工具为执行引擎，以 Vibe Coding 为协作理念，让 AI 真正参与到软件工程的每个阶段。</p></blockquote><p>  本文将完整记录这一开发流程，通过 NewsFlow 项目的真实案例，展示 AI 如何参与从产品构思到上线的各个环节，以及 AI-Native 工作流是如何运作的。<img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1769933971813.png" alt="image.png" /></p><hr /><h2 id="一开发实录工具与方法">一、开发实录：工具与方法</h2><h3 id="11-核心工具claude-code-的能力边界">1.1 核心工具：Claude Code 的能力边界</h3><p>Claude Code 不是简单的&quot;代码生成器&quot;，而是一个<strong>具备工程能力的 AI 智能体（Agent）</strong>。它通过终端交互环境，能够：</p><p>   <strong>文件操作</strong>：读取、编辑、批量重构代码文件<br />   <strong>命令执行</strong>：运行测试、安装依赖、操作 Git、部署服务<br />   <strong>上下文管理</strong>：通过分析项目结构理解代码库<br />   <strong>子代理（Subagents）</strong>：并行处理多任务，如同时审查代码和检查安全漏洞</p><p>在实践中，Claude Code 扮演的角色随阶段变化：</p><p>  <strong>产品阶段</strong>：需求顾问（头脑风暴、可行性分析）<br />  <strong>设计阶段</strong>：架构师（技术选型、方案设计）<br />  <strong>实现阶段</strong>：全栈工程师（前后端代码实现）<br />  <strong>验证阶段</strong>：测试工程师（调试、优化、写测试）<br />  <strong>交付阶段</strong>：DevOps（部署脚本、本地运维配置）</p><h3 id="12-方法论vibe-coding-的底层支撑">1.2 方法论：Vibe Coding 的底层支撑</h3><p>之所以能实现全流程 AI 协作，依赖于 <strong>Vibe Coding（氛围编程）</strong> 的工作理念——这不是一套严格的流程规范，而是一种<strong>沉浸式的协作心态</strong>：</p><p>  <strong>自然语言驱动</strong>：用&quot;做个深色主题的新闻卡片&quot;代替详细的需求文档<br />  <strong>即时反馈循环</strong>：边聊边做，有疑问当场澄清，确认后立即执行<br />  <strong>上下文连续性</strong>：AI 记住之前的所有决策，不会每次归零重启</p><p>这种理念让 AI 能够真正参与<strong>创造性工作</strong>（如产品构思），而非仅仅是执行指令。</p><hr /><h2 id="二全流程开发实录">二、全流程开发实录</h2><h3 id="阶段一产品构思与技术验证">阶段一：产品构思与技术验证</h3><p><strong>阶段目标</strong>：把模糊的想法变成可执行的方案，验证技术可行性。<strong>AI 协作过程</strong>：</p><p><strong>头脑风暴阶段</strong>：</p><pre><code class="language-text">开发者：我想做个技术新闻聚合站，聚合 IT 之家和界面新闻，要简洁好看。Claude Code: 这个需求很清晰。先澄清几个产品决策：1. 是只展示标题列表，还是要有详情页？2. 内容怎么获取？被动等用户提交，还是主动爬取？3. 更新频率要求？实时还是每日批量？4. 需不需要用户系统（收藏、登录）？开发者：先 MVP，只展示列表，跳转到原文。主动爬取，每日更新一次。不要用户系统，越简单越好。Claude Code: 明白，纯展示型产品。技术上建议：- 前端：Next.js 15 App Router（SEO 好，部署灵活）- 后端：FastAPI（Python，写爬虫方便）- 数据存储：TTLCache 内存缓存（轻量级，适合 MVP）- 部署：跨平台启动脚本 + systemd（本地开发和生产环境）这个方案零成本启动，后期流量大了再优化。需要我现在验证一下 IT 之家的反爬策略吗？</code></pre><p><strong>技术验证</strong>：Claude 直接写了段测试代码验证爬虫可行性，确认可以拿到数据。</p><p><strong>关键产出</strong>：<br />产品需求明确（边界清晰）<br />技术栈确定（Next.js 15 + FastAPI + 内存缓存）<br />项目初始化完成</p><h3 id="阶段二建立-ai-项目记忆">阶段二：建立 AI 项目记忆</h3><p><strong>关键认知</strong>：AI 需要&quot;项目记忆&quot;来理解代码库的上下文，这样才能生成符合项目规范的代码。</p><p><strong>AI 协作过程</strong>：</p><p>当项目骨架创建后，AI 会主动分析项目结构，建立&quot;项目记忆&quot;：</p><pre><code class="language-Javascript">Claude Code: 正在分析项目结构...检测到技术栈：Next.js 15 (App Router), TypeScript, Tailwind CSS, FastAPI前端架构：- App Router 模式（app/page.tsx, app/layout.tsx）- React 本地状态管理（useState，无全局状态库）- 前端 API 代理模式（/api/news → 后端）- 组件组织：src/components/（Header, StatsBar, NewsCard, NewsGrid）后端架构：- FastAPI + uvicorn（全异步）- 爬虫实现：ithome.py（多页分页）+ jiemian.py（24小时滚动）- 数据存储：TTLCache 内存缓存（无持久化）- 中间件：速率限制、请求日志、CORS、GZip- 日志系统：loguru 结构化日志代码质量：- TypeScript 严格模式- ESLint 严格规则- 前端：Jest 已配置但无测试文件- 后端：pytest 已配置，10 个测试文件，覆盖率 7.22%已建立项目记忆，后续所有对话都将基于这些上下文进行。</code></pre><p><strong><code>CLAUDE.md</code> 的作用</strong>：</p><p>  <strong>持久化记忆</strong>：避免每次对话重复项目背景和技术约束<br />  <strong>风格一致性</strong>：AI 生成的代码与现有代码风格统一<br />  <strong>减少无效确认</strong>：既然已知用 Tailwind，就不会再问&quot;用什么 CSS 方案&quot;</p><p><strong>最佳实践</strong>：</p><p>  1. 进入项目第一件事（或技术栈变更后）：运行 <code>/init</code><br />  2. 将 <code>CLAUDE.md</code> 纳入版本控制，团队协作时保持一致<br />  3. 在每次开发会话开始时，让 AI 分析项目结构  4. 确认 AI 理解当前的技术约束和约定  5. 项目架构或技术栈变更后，重新建立项目记忆</p><h3 id="阶段三架构设计与数据建模">阶段三：架构设计与数据建模</h3><p><strong>阶段目标</strong>：完成数据模型设计、API 规范、组件结构。</p><p><strong>AI 协作过程</strong>：</p><p>Claude 根据已建立的上下文，直接生成了完整的架构文档，并<strong>主动考虑了扩展性</strong>：</p><pre><code class="language-Python">Claude Code: 我看到你选择了&quot;每日更新&quot;的策略，建议数据模型这样设计：**数据模型（Pydantic v2）**：class NewsItem(BaseModel):    source: Literal['ithome', 'jiemian']    title: str    url: str    time: str  # YYYY-MM-DD HH:MM:SS    summary: str    category: Optional[str]  # IT之家有，界面新闻无**缓存策略（TTLCache）**：- 缓存键：`ithome_news`, `jiemian_news`, `all_news`- 过期时间：300 秒（5 分钟）- 最大条目数：1000- 特性：TTL 过期、异步锁保护、命中率统计考虑到后期可能加搜索，是否需要将摘要扩展到更长的文本？另外，要不要考虑引入 Redis 替代内存缓存？开发者：暂时不用，MVP 阶段够用了。爬虫逻辑怎么设计？Claude Code: 两个方案：[方案 A] 异步 HTTP 请求：httpx + BeautifulSoup4，简单直接[方案 B] 分布式爬取：Scrapy + Celery + Redis，支持大规模抓取考虑到 MVP 阶段，我推荐方案 A，但代码结构要预留扩展性。比如抽象异步上下文管理器，后期换 Scrapy 只需修改实现。需要我现在生成完整的数据模型和爬虫基类吗？</code></pre><p><strong>关键产出</strong>：  1. Pydantic v2 数据模型（带字段验证）  2. TTLCache 缓存实现（带统计功能）  3. 爬虫抽象类（异步上下文管理器）  4. API 路由规划（RESTful 规范）  5. 前端组件结构（基于 Next.js App Router）</p><h3 id="阶段四核心功能开发">阶段四：核心功能开发</h3><p><strong>阶段目标</strong>：完成数据爬取、前端展示、基础交互。</p><p><strong>AI 协作过程</strong>：</p><p>这是最高强度的编码阶段。Claude Code 展现了<strong>上下文感知生成</strong>的能力——它不再询问技术细节，而是基于项目分析直接生成符合项目规范的代码。</p><hr /><h3 id="场景示例-1newscard-组件开发">场景示例 1：NewsCard 组件开发</h3><pre><code class="language-Javascript">开发者：做新闻卡片组件，深色主题，展示标题、摘要、时间、来源标签。Claude Code: （基于项目分析，已了解 Tailwind 配置和颜色定义）明白，使用 slate-900 作为卡片背景，gray-100 作为文字色。根据项目约定，摘要使用原文 summary，时间用相对时间格式化（2小时前）。来源标签用不同颜色区分：IT 之家用橙色，界面新闻用蓝色。（生成代码...）需要我加上 hover 时的阴影效果吗？另外，点击卡片是新标签页打开还是当前页跳转？</code></pre><hr /><h3 id="场景示例-2爬虫逻辑调试">场景示例 2：爬虫逻辑调试</h3><pre><code class="language-Bash">开发者：IT 之家爬虫报 403 错误。Claude Code: （读取 scrapers/ithome.py）检测到缺少 User-Agent 头。此外，IT 之家有简单的反爬，建议加 1-3 秒随机延时。需要我帮你加上这些，并测试一下吗？开发者：加吧。Claude Code: （修改代码，运行测试）已修复。抓取 10 条测试数据成功。建议把爬取间隔配置化写到 .env 里，方便调整：```bashITHOME_DELAY=1.0ITHOME_TIMEOUT=10</code></pre><hr /><h3 id="场景示例-3批量重构">场景示例 3：批量重构</h3><p>当需求变更（如&quot;缓存 TTL 从 300 秒改到 600 秒&quot;）时：</p><pre><code class="language-Python">开发者：所有地方的缓存 TTL 改成 600 秒。Claude Code: 正在扫描项目...发现 3 处需要修改：1. backend/app/config.py（CACHE_TTL 默认值）2. backend/app/utils/cache.py（__init__ 默认参数）3. backend/.env.example（注释说明）已统一修改为 600 秒，并确保所有引用处同步更新。</code></pre><hr /><h3 id="子代理并行处理">子代理并行处理</h3><p>Agent还可以多任务并行工作，如同时处理前端样式优化和后端性能优化。Claude 创建了子代理：</p><p>  <strong>Subagent A</strong>：优化前端虚拟滚动（处理长列表性能）<br />  <strong>Subagent B</strong>：给 API 加缓存统计接口</p><p>两者并行工作，互不干扰，主会话保持对整体进度的把控。</p><h3 id="阶段五测试与质量保证">阶段五：测试与质量保证</h3><p><strong>阶段目标</strong>：确保功能稳定，修复潜在问题。</p><p><strong>AI 协作过程</strong>：</p><p>传统测试中，开发者需要手动编写测试用例、反复运行、查看日志。而在 AI-Native 流程中，测试是一个<strong>对话式排查</strong>过程。</p><p><strong>场景：性能问题诊断</strong>：</p><pre><code class="language-Python">开发者：新闻列表加载慢，分析一下。Claude Code: （读取前端代码和后端 API 逻辑）发现三个问题：1. API 没做分页，一次性返回所有数据（当前缓存已有 2000+ 条）2. 前端图片没做懒加载，首屏加载 20 张图3. 缓存命中率低，频繁请求后端修复建议：[1] API 加分页（limit/offset），默认 20 条[2] 图片加 loading=&quot;lazy&quot; 属性[3] 调整缓存 TTL 从 300 秒到 600 秒优先级？建议先做分页，影响最大。</code></pre><p><strong>测试现状评估</strong>：</p><pre><code class="language-Javascript">开发者：评估一下当前测试覆盖情况。Claude Code: 正在分析测试基础设施...前端测试：- ✅ Jest 29.7.0 + @testing-library/react 已安装- ✅ jest.config.js 配置正确（jsdom 环境、覆盖率收集）- ❌ 0 个测试文件（*.test.tsx 或 *.spec.tsx 不存在）- ❌ 0% 覆盖率（11 个源文件完全未测试）后端测试：- ✅ pytest 7.4.4 + pytest-asyncio + pytest-cov 已安装- ✅ pyproject.toml 配置完整（测试标记、覆盖率报告）- ⚠️ 10 个测试文件（组织混乱：根目录 6 个，backend/ 3 个，backend/tests/ 2 个）- ❌ 7.22% 覆盖率（仅 models.py 78.57%，其他核心模块 0%）核心问题：1. 完全未遵循 TDD 原则（所有生产代码都没有测试）2. 测试文件组织混乱（未使用 pytest 标准组织）3. 缺少关键测试类型（API 路由、抓取器、缓存、中间件）</code></pre><p><strong>测试补充建议</strong>：</p><pre><code class="language-Javascript">Claude Code: 建议分阶段补充测试：阶段一（紧急）：- 清理测试文件组织（移至 backend/tests/）- 为核心组件添加测试（NewsCard, StatsBar）- 为工具函数添加测试（utils.ts, logger.ts）阶段二（核心）：- 添加 API 路由集成测试（test_routers.py）- 添加抓取器异步测试（test_scrapers.py）- 添加缓存功能测试（test_cache.py）阶段三（全面）：- 添加 E2E 测试（Playwright）- 设置覆盖率目标（80%+）- 配置 CI/CD 自动化测试需要我现在开始补充测试吗？</code></pre><p><strong>安全审查</strong>：通过子代理自动扫描依赖漏洞，发现 lodash 版本过低，提示升级。</p><h3 id="阶段六文档补充">阶段六：文档补充</h3><p><strong>阶段目标</strong>：上线验证，补全文档，准备交接。</p><p><strong>AI 协作过程</strong>：</p><p>   <strong>Smoke Test</strong>：Claude 运行启动脚本，验证主流程通畅<br />   <strong>文档生成</strong>：基于代码结构自动生成项目文档<br />   <strong>API 文档</strong>：使用 FastAPI 自动生成交互式文档（/docs Swagger, /redoc）</p><p><strong>最终交付物</strong>：<br />   ✅ 可访问的网站（已上线）<br />   ✅ 完整代码库（含注释）<br />   ✅ 部署文档（README.md, frontend/README.md, backend/README.md）<br />   ✅ 启动和停止脚本（start.bat/start.sh, stop.bat/stop.sh）<br />   ✅ 环境变量示例（.env.example）<br />   ✅ API 文档（/docs, /redoc）<br />  ⚠️ 测试覆盖：前端 0%，后端 7.22%（需后续补充）</p><hr /><h2 id="三关键经验为什么-ai-能完成全流程">三、关键经验：为什么 AI 能完成全流程？</h2><h3 id="31-上下文连续性是关键">3.1 上下文连续性是关键</h3><p>分析项目结构后，AI 记住了：<br />  <strong>产品定位</strong>：纯展示型，深色主题，每日更新<br />  <strong>技术约束</strong>：Next.js 15 + FastAPI，Tailwind 样式规范<br />  <strong>已做决策</strong>：用内存缓存而非数据库，暂时不做用户系统<br />  <strong>代码风格</strong>：TypeScript 严格模式，ESLint 规则，Pydantic v2 数据验证</p><p>这使得在部署阶段，AI 依然记得最初定的技术栈，不会突然问&quot;要不要换成 Vue&quot;。</p><h3 id="32-自然语言接口降低沟通成本">3.2 自然语言接口降低沟通成本</h3><p>在架构设计阶段，用自然语言对话完成了传统开发中需要长时间评审的技术方案。当 AI 问&quot;要不要引入 Redis 替代内存缓存&quot;时，回复&quot;暂时不用，MVP 阶段够用了&quot;，这种<strong>模糊但高效的沟通</strong>只有在 Vibe Coding 状态下才能实现。</p><h3 id="33-工具链集成实现闭环">3.3 工具链集成实现闭环</h3><p>Claude Code 不仅是&quot;聊天写代码&quot;，它能：</p><pre><code>执行命令：运行测试、部署服务、启动/停止应用读写文件：批量重构、更新配置、生成文档并行处理：子代理让测试和开发同步进行</code></pre><p>这种<strong>REPL（读取-求值-输出-循环）<strong>式的交互，让 AI 能真正参与</strong>工程实践</strong>，而不只代码建议。</p><h3 id="34-诚实地面对局限">3.4 诚实地面对局限</h3><p>AI 协作也不是万能的。在本次开发中，真实地记录了：<br />  ❌ 无数据库持久化（仅内存缓存）<br />  ❌ 测试覆盖不足（前端 0%，后端 7.22%）<br />  ❌ 无 CI/CD 自动化<br />  ❌ 无定时任务配置<br />  ❌ 无分布式缓存</p><p>这些局限不是 AI 的问题，而是项目阶段的自然选择。AI 帮助我们在 MVP 阶段快速上线，同时清晰地记录了改进方向。</p><hr /><h2 id="四避坑指南">四、避坑指南</h2><p>  <strong>正确使用项目分析</strong>：在开发前让 AI 分析项目结构，确保理解技术栈和约定<br />  <strong>关键节点人工确认</strong>：虽然 AI 能独立完成部署，但<strong>生产环境变量修改</strong>等高危操作必须人工确认<br />  <strong>定期清理上下文</strong>：长时间开发后重新分析项目结构，防止早期重要决策（如&quot;不做用户系统&quot;）被遗忘<br />  <strong>保持代码审查</strong>：AI 生成的代码功能可用，但需关注<strong>边界情况处理</strong>（如空值、异常流）<br />  <strong>区分 Vibe 的 Ask 与机械 Ask</strong>：如果感觉像在填表而不是对话，说明需要调整提问方式。Vibe 的 Ask 应该像结对编程时的即时确认，而非面试问卷。<br />  <strong>诚实记录局限</strong>：不要为了&quot;看起来完美&quot;而隐瞒问题。诚实地记录当前状态（无数据库、测试不足），并讨论改进空间。<br />  <strong>TDD 是硬约束</strong>：如果选择 TDD 工作流，必须先写测试再写代码。如果暂时不遵循 TDD，也要明确记录原因。</p><hr /><h2 id="五结语ai-native-开发的未来">五、结语：AI-Native 开发的未来</h2><p>NewsFlow 的开发证明了一件事：<strong>AI 已经能够承担软件工程的全流程工作</strong>，不再是简单的代码补全工具。</p><p>在这个过程中，Claude Code 作为<strong>具备工程执行能力的智能体</strong>，让我们可以用<strong>自然语言</strong>驱动从脑洞到产品的完整链路。而 Vibe Coding 作为一种工作理念，确保了这种协作是流畅、沉浸且高效的。</p><p><strong>一个人 + AI = 产品团队（产品+架构+前后端+测试+运维）</strong>。这不再是比喻，而是已经落地的现实。</p><p>AI 协作可以让我们清楚的知道<strong>当前项目的真实状态：</strong><br />  ✅ 快速实现 MVP，验证产品想法<br />  ✅ 技术栈现代化（Next.js 15 + FastAPI）<br />  ✅ 代码质量高（TypeScript 严格模式、Pydantic v2）<br />  ⚠️ 需要补充测试（TDD 工作流）<br />  ⚠️ 需要引入数据库（持久化）<br />  ⚠️ 需要配置 CI/CD（自动化）</p><p>AI 可以帮我们写代码，还可以帮我们<strong>看清了项目的全貌</strong>，清楚了解做得好的地方和需要改进的地方。这才是 AI-Native 开发的真正价值：不是替代开发者，可以让开发者更快地做出更好的决策。</p>]]>
                    </description>
                    <pubDate>Mon, 16 Feb 2026 08:09:23 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[Agent Skills:给智能体赋予技能——与其“喂”数据，不如教它“查字典”]]>
                    </title>
                    <link>http://www.solinx.cn/archives/202601190000</link>
                    <description>
                            <![CDATA[<p>2025年，Agent相关的概念、协议与标准层出不穷。从年初的 MCP，再到 A2A、A2UI 等，围绕着 Agent 相关而推出的各种标准。随着Agent生态的完善，Agent的门槛可用程度也越来越高。</p><p>Agent也从最开始的使用特定提示词、工具调用到基于MCP、基于工作流、A2A形式的，再到目前基于Skills。</p><p>在2025年一系列标准协议的发布，Agent进化已经进化到极低门槛。在2025年底Anthropic推出了Skills，从这两三月来看各个厂商也加入了Skills的支持，随着各家厂商的跟进Agent将会有更高的可用程度。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1768624882315.png" alt="image.png" /></p><h2 id="skills是什么">Skills是什么</h2><p>使用官方定义：Agent Skills是一种简单、开放的格式，为Agent赋予技能以及专业知识。</p><ul><li>纯提示词的Agent只能够使用大脑(大模型)，去解决自身所具备知识的能力，没有执行脚本的能力。</li><li>使用了工具调用的Agent具备了通过工具去扩充大模型知识边界的能力。</li><li>基于MCP的Agent能够接入所有提供MCP协议的平台、工具等等，使得Agent的能力扩充更加方便。</li><li>基于A2A的Agent，具备了Agent之间互相通讯、调用的能力。</li><li>基于A2UI的Agent，统一了Agent的UI渲染格式。</li></ul><p>Skill不是让Agent“把书背下来”，而是让Agent“学会查字典”。通过渐进式披露，Agent 平时轻装上阵，只有在需要处理特定任务时，才瞬间加载对应的 Skill。</p><h4 id="mcp与skill区别">MCP与Skill区别：</h4><p>MCP是用来统一工具调用的协议。</p><p>Skill可指导Agent如何使用各种工具、各种脚本、完成指定工作流，它把专业知识、工作流融入Agent自身。<br />Skills包含指令、脚本、资源文件夹，Agent可发现并利用Skills来完成指定任务。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1768624900226.png" alt="image.png" /></p><h3 id="每个skill包含什么">每个Skill包含什么</h3><p>每个Skill是一个文件夹。Skill文件夹必须包含一个SKILL.md文件，该文件包含元数据（至少包括name和description）以及告诉智能体如何执行特定任务的指令。Skill还可以包括脚本(scripts)、模板/资源(assets)和参考资料(references)。</p><pre><code> skill-name/ ├── SKILL.md          # 必须: 指令 + 元数据 ├── scripts/          # 可选: 可执行代码 ├── references/       # 可选: 文档 └── assets/           # 可选: 模板, 资源</code></pre><h4 id="skillmd文件">SKILL.md文件</h4><p>每个Skill必须包含一个SKILL.md文件，该文件包含 YAML 前置信息和 Markdown 内容。</p><p>1、前置信息：</p><pre><code> --- name: skill-名称 description: 对这项技能的作用以及何时使用它的描述。 ---</code></pre><p>前置信息除了必须包含的name与description字段外，还可以包括以下可选字段：</p><pre><code> license：许可证名称 compatibility：环境要求,最多500个字符。 metadata:  author: linx  version: 0.1 allowed-tools: 预先允许使用的工具</code></pre><p>2、Markdown内容<br />前置信息后的Markdown正文包含技能说明，没有格式限制。写下任何有助于智能体有效执行任务的内容。</p><p>下面是一个用于PDF转Word的Skill的SKILL.md文件内容：</p><pre><code>---name: pdf-to-worddescription: 将PDF文档转换为Word格式(.docx)。支持文本提取、表格转换和基本格式保留。使用命令行界面进行批量转换或单文件处理。---# PDF转Word转换工具## 快速开始```bash# 单文件转换python scripts/convert.py input.pdf output.docx# 批量转换整个目录python scripts/convert.py --batch input_folder/ output_folder/# 保留原PDF中的图片python scripts/convert.py --keep-images input.pdf output.docx```## 功能说明- **文本转换**：提取PDF中的文本内容并转换为Word格式- **表格处理**：识别并转换PDF中的表格结构- **格式保留**：保留基本的段落格式和字体样式- **批量处理**：支持整个目录的批量转换- **图片保留**：可选保留PDF中的图片元素## 依赖要求- Python 3.8+- pdfplumber（PDF文本提取）- python-docx（Word文档生成）## 安装依赖```bashpip install pdfplumber python-docx```## 使用场景当用户需要：1. 将PDF文档转换为可编辑的Word格式2. 从PDF中提取内容用于后续编辑3. 批量转换多个PDF文件4. 在命令行环境下进行文档格式转换</code></pre><h2 id="skills能做什么">Skills能做什么</h2><p>Skills 的核心在于将抽象的任务转化为可执行的标准化流程（SOP）。它不仅仅是工具的集合，更是“专家经验”的代码化。通过定义不同的 Skills，我们可以让 Agent 在不同领域瞬间变身为“熟练工”。</p><ol><li>自动化媒体运营 (Content Operations)<br />不再需要人工在不同平台间复制粘贴和调整格式。</li></ol><ul><li><p>公众号/社群发布 Skill：能够读取 Markdown 草稿，自动进行排版优化（如添加样式、图片自适应），调用 API 推送到微信公众号后台，甚至自动生成摘要和封面图。</p></li><li><p>小红书/社交媒体矩阵 Skill：根据同一份素材，自动改写成适合小红书（Emoji丰富、语气活泼）、LinkedIn（专业商务）等不同平台的文案，并自动完成发布。</p></li></ul><ol start="2"><li>研发效能提升 (DevOps &amp; Coding)<br />将资深程序员的经验封装给 Agent，处理繁琐的维护工作。</li></ol><ul><li><p>代码重构与审查 Skill：不仅仅是“读代码”，而是加载项目的代码规范（Lint规则），对旧代码进行重构，自动修复常见的 Anti-patterns，并生成重构报告。</p></li><li><p>单元测试生成 Skill：扫描指定模块，根据业务逻辑自动编写覆盖率达标的测试用例，并执行测试脚本验证通过率。</p></li><li><p>环境排查 Skill：当开发环境报错时，自动抓取日志、分析依赖树冲突，并给出修复脚本。</p></li></ul><ol start="3"><li>数据智能分析 (Data Analysis)<br />让 Agent 具备数据分析师的能力，实现从“原始数据”到“决策建议”的闭环。</li></ol><ul><li><p>可视化报表 Skill：用户只需上传一个 Excel 或 CSV，Agent 即可调用 Python 脚本（如 Pandas/Matplotlib）进行数据清洗，分析关键指标，并自动生成趋势图、饼图，最终产出一份带图表的分析报告。</p></li><li><p>舆情/竞品分析 Skill：自动抓取指定关键词的网络信息，进行情感分析和关键词提取，生成日报。</p></li></ul><ol start="4"><li>本地数字管家 (Digital Housekeeping)<br />管理混乱的本地环境，让文件井井有条。</li></ol><ul><li><p>智能文件整理 Skill：自动扫描杂乱的“下载文件夹”，根据文件类型（文档、图片、安装包）或内容关键词，将其移动到归档目录，并重命名为标准化格式（如 2026-01-Invoice-项目A.pdf）。</p></li><li><p>会议纪要整理 Skill：读取长录音或会议速记，自动提取 Action Items（待办事项），同步到 Notion 或 Jira 等项目管理软件中。</p></li></ul><h3 id="agent加载skill机制渐进式披露">Agent加载Skill机制：渐进式披露</h3><p>大模型的上下文窗口是有限制的目前最大的模型上下文也不过100万Tokens，基于大模型的Agent都不掉Context的魔咒，使用了Skills的Agent也不例外。</p><p>官方定义了Skill的加载机制：渐进式披露。<br />大模型上下文越长模型出错的概率就越大，上下文的长度也是有限的，为了避免Context魔咒，Skills定义了其<strong>渐进式披露</strong>的机制。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1768624955902.png" alt="image.png" /></p><p>Skill定义了三级加载机制：</p><p>1、一级：元数据(始终加载)<br />Agent启动时就会加载SKILL.md文档内的元数据name与description字段，约100 tokens。<br />Agent通过识别用户消息与Skills元数据来决定是否需要使用Skill。<br />Agent初始只加载约100 Tokens元数据，也意味着Agent可以包含大量的Skills，不会出现Context魔咒。</p><p>2、二级：指令(触发加载)<br />为整个SKILLS.md文件,Skills触发时就会把整个SKILLS.md加载到Agent上下文，建议SKILL.md少于5000 tokens。</p><p>Agent识别到需要触发Skills时就会将该Skills所属的SKILLS.md文件加载到上下文。</p><p>3、三级：资源(脚本/引用/资源，动态加载)<br />资源包括：脚本代码(Scripts Code)、引用文档、资源、子Skills等。<br />这几类资源只有在触发Skills后Agent加载SKILLS.md文件到上下文，Agent才会根据实际需要加载此类资源(脚本文件不会加载到上下文，只会将脚本执行结果加载到上下文)。</p><p>Skills通过<strong>渐进式披露</strong>，尽可能的控制Context魔咒的出现，但还是无法避免此问题出现，加载过多Skills还是会导致Agent上下文爆炸或Agent准确率下降。</p><h2 id="skills如何使用">Skills如何使用</h2><p>Claude Code对Skills的支持最好，现在越来越多工具也开始支持Skills除了Claude Code外还可以使用Codex、Cursor、opencode、Antigravity等等。<br />将Agent Skills融合到自己开发的Agents中。</p><h3 id="skills安装">Skills安装</h3><h4 id="手动安装">手动安装</h4><p>下载需要的Skills，如anthropics官方提供的Skills(<a href="https://github.com/anthropics/skills">https://github.com/anthropics/skills</a>)，对于Claude Code：</p><pre><code> 全局Skills：C:\Users\XXX\.claude\skills   项目Skills：项目路径\.claude\skills  </code></pre><h3 id="自动安装">自动安装</h3><p>将需要安装的Skills丢给Claude Code让它帮你安装即可。</p><p>安装完成后退出重新登录Claude Code即可，新版本已支持热加载。</p><pre><code> /skills 查看当前所有Skills</code></pre><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1768625007799.png" alt="image.png" /></p><h3 id="skills使用">Skills使用</h3><p>在使用Skills可以通过Skills名称指定使用哪个Skills也可以，让Agents自己去决策需要使用哪个Skills。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1768625052591.png" alt="image.png" /></p><p>1、怎么开发一个法律法规应用，需要先进行头脑风暴，触发了brainstorming SKills(头脑风暴技能)。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1768625065654.png" alt="image.png" /></p><p>2、把文件 @&quot;Attention Is All You Need.pdf&quot; 转为word文件，触发PDF-Word转换Skills。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1768625077451.png" alt="image.png" /></p><p>3、直接输入/<skill-name>即可调用对应技能，例如：/pdf-word-converter 把XXX PDF文件转为Word文件。</p><h2 id="编写一个skills">编写一个Skills</h2><p>一个最简单的Skills只需要在一个符合Skills命名规则的文件夹里创建一个SKILL.md文件，该文件需要包含 YAML 前置信息和 Markdown 内容。将该文件夹移动到C:\Users\xxx.claude\skills\demo-skills目录，重启Claude Code即可。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1768625111892.png" alt="image.png" /></p><h4 id="创建如下目录及文件">创建如下目录及文件：</h4><p>demo-skills/SKILL.md</p><h4 id="skillmd文件内容">SKILL.md文件内容：</h4><pre><code> --- name: demo-skills description: 一个Skills介绍工具。简单描述Agent Skills，以及怎么创建最简单的Skills。适用于介绍Skiils等场景。 --- # Skills介绍工具 用于Agent Skills的简单描述。   ## Skills是什么 Skill可指导Agent如何使用各种工具、各种脚本、完成指定工作流，它把专业知识、工作流融入Agent自身。   ## Skills如何创建 一个最简单的Skills只需要在一个符合Skills命名规则的文件夹里创建一个SKILL.md文件，该文件包含 YAML 前置信息和 Markdown 内容。   ### SKILL.md文件格式   - 前置信息：       ---      name: skill-名称      description: 对这项技能的作用以及何时使用它的描述。      --- - Markdown内容   前置信息后的Markdown正文包含技能说明，没有格式限制。写下任何有助于智能体有效执行任务的内容。   ### 完整SKILL.md文件内容示例      ---      name: pdf-to-word      description: 将PDF文档转换为Word格式(.docx)。支持文本提取、表格转换和基本格式保留。      ---      # PDF转Word转换工具      ## 脚本使用描述      ```bash      python scripts/convert.py input.pdf output.docx      ``` ## 注意事项 - 本技能只做Skills的简单介绍</code></pre><h2 id="skills能带来什么">Skills能带来什么</h2><p>如果说 MCP 搭建了 Agent 连接世界的桥梁，那么 Skills 则赋予了 Agent 真正的职业灵魂。<br />通用大模型什么都懂一点，但落地到具体业务时，往往是“这就触及到我的知识盲区了”。Skill 的出现，是为了解决大模型在垂直场景下的水土不服。</p><p>它不再是简单的“喂语料”，而是让 AI 学会“守规矩”。通过 Skill，我们将业务逻辑固化下来，让 AI 的每一步操作都有章可循。</p><p>这其实也暴露了大多数组织的脆弱性：我们的流程往往过于依赖人的“灵光一现”。Skill 强迫我们把这些隐性知识显性化。未来，衡量一个团队技术底蕴的，或许不是文档库有多厚，而是你们沉淀了多少好用的 Skills。</p><p>参考资料：<a href="https://agentskills.io">https://agentskills.io</a></p>]]>
                    </description>
                    <pubDate>Mon, 19 Jan 2026 08:31:01 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[单GPU运行N个专家模型：Multi-LoRA的低成本实战——从法律专家到代码专家]]>
                    </title>
                    <link>http://www.solinx.cn/archives/202512180000</link>
                    <description>
                            <![CDATA[<p>  对于个人或小公司有部署使用本地大模型的需求，但由于业务需求直接部署一个开源的通用大模型又不满足需求。这时常见的解决方案是使用RAG方案或微调模型方案。微调是使用领域知识训练模型，使模型其具备相应的领域知识能力。微调后模型可独立生成相应的领域知识，无需再通过RAG方案问答时通过上下文提供对应的领域知识。</p><p>  模型私有化部署对显卡资源的消耗比较高，对于一个4B模型BF16部署的资源已经达到9GB(4B×2×10⁹ ×1.2≈9 GB)，对于14B模型最少需要32GB显存需求。就算是部署低精度或量化版模型一个基本可用的14B模型也最少需要16GB左右显存。</p><p>  对于这种规模的显存需求对于个人或小公司来说同时部署N个全量微调的专家模型似乎有点难。如果部署10个微调的领域专家模型需要的资源是N倍的显存资源(10 * 9GB =90GB)， 这已经是超过一张A100的显存资源也超过3张4049(24GB)卡的资源。</p><h2 id="微调">微调</h2><p>  微调除了全参数微调还有参数高效微调（PEFT），通过高效微调LoRA后根据微调的参数规模适配器的大小只有几十MB到几百MB不等。前面文章我们也介绍过LoRA，这边再简单介绍下LoRA的基本原理。LoRA (Low-Rank Adaptation) 是目前最主流的大模型高效微调（PEFT, Parameter-Efficient Fine-Tuning）技术。它的核心思想是：冻结预训练模型的权重，仅在各层中注入可训练的低秩矩阵（Low-Rank Matrices）。<br />    <strong>W = W₀ + ΔW = W₀ + BA</strong><br /><strong>其中：</strong><br />  W₀ 是冻结的预训练权重（维度 d x d）。<br />  B 是 d x r  的矩阵（初始化为 0）。<br />  A 是 r x d 的矩阵（高斯初始化）。<br />  r 是秩（Rank），通常远小于 d（通常取8~128）。<br /><strong>优势：</strong><br />  <strong>显存极低</strong>： 仅需训练不到 1% 的参数。<br />  <strong>不破坏原模型</strong>： 原模型权重不变，LoRA 只是作为一个“外挂”插件。<br />  <strong>便于切换</strong>： 同一个基座模型可以加载不同的 LoRA 权重来适应不同任务（如一个负责写代码，一个负责写小说，一个负责法律知识），无需重新加载大模型。<br />  <strong>成本低</strong>：不仅可以在训练时显著降低显存占用和训练时间，还保持与全量微调相当的效果。<img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1765117036226.png" alt="" /></p><p><strong><center>多微调模型使用对比</center></strong></p><h2 id="专家模型">专家模型</h2><p>  上面介绍了PEFT微调的一种技术LoRA微调原理，本节主要介绍LoRA技术实际应用。通过LoRA微调后会生成LoRA适配器此适配器的大小与微调时训练的参数规模相关通常几十MB到几百MB不等，LoRA适配器不严谨的可称为专家模型。  LoRA适配器通常有两种使用方式：</p><ol><li><strong>静态合并</strong>：LoRA适配器合并到基座模型，基座模型参数改变，不可再分离。</li><li><strong>动态加载</strong>：LoRA适配器单独存储，基座模型参数不变，使用时加载。</li></ol><p>  LoRA 动态加载不只是技术选择，还是应对模型快速迭代的最佳经济策略。  LoRA可解决领域细分的颗粒度问题。不单是不同领域行业知识需要分开微调，单一行业(如法律)内部也存在民事、刑事、合同法、涉外法等等差异巨大的子领域，直接哪这些行业知识去微调去全参数微调一个模型或许也能微调好，但工程难度不小，消耗的资源也不少。</p><p>  打破“基座更新即重练”的成本诅咒，按目前行业的发展每半年一代新模型发布速度，每当基座模型(Base Model)更新又要投入大量的资源去全参数微调更新专家模型，如果使用的是LoRA专家模型，只需基于新基座快速迁移与微调轻量级的适配器（Adapter）。LoRA 将模型的维护升级成本从“指数级”降低到了“线性级”。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1765117145591.png" alt="" /></p><h2 id="工程实践">工程实践</h2><p>  多LoRA架构的核心在于基座共享，插件热拔插。在显存中，我们只保留一份巨大的基座模型权重，而针对不同领域的 LoRA 模块（仅占极小显存）则根据用户请求实时加载或切换。还可以使用基座模型提供通用的知识服务。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1765117175094.png" alt="" /></p><center>多LoRA适配器架构</center><p>  整个多LoRA架构系统像一个现代化的综合医院：</p><ul><li><strong>应用层（挂号处）</strong>： 接收病人（请求）。</li><li><strong>路由层（分诊台）</strong>： 决定病人去哪个科室（选择哪个 LoRA），或者只是去药房买点感冒药（基座直通）。</li><li><strong>显存管理（调度中心）</strong>： 确保医生（LoRA 参数）已经就位。</li><li><strong>推理引擎（诊疗室）</strong>： 医生（LoRA）配合基础医疗设施（基座模型）进行诊断。</li></ul><p><strong>注意上图</strong>中LoRA适配器是旁路（Sidecar）权重，它是挂在基座模型上的，数据流直接进入“基座+LoRA”的组合体。LoRA 和基座是并联计算（或者说数学上的权重相加），而不是串联处理。</p><p>  查看当前大模型推理服务存在多少模型，下面可以看到存在一个基座模型Qwen3，三个LoRA专家模型。</p><pre><code> http://192.168.1.1:13000/v1/models {    &quot;object&quot;: &quot;list&quot;,    &quot;data&quot;: [        {&quot;id&quot;: &quot;../../models/Qwen3-4B&quot;,&quot;object&quot;: &quot;model&quot;,&quot;created&quot;: 1765038561,&quot;owned_by&quot;: &quot;xxx&quot;,&quot;root&quot;: &quot;../../models/Qwen3-4B&quot;,&quot;parent&quot;: null,&quot;max_model_len&quot;: 40960},        {&quot;id&quot;: &quot;law_lora&quot;,&quot;object&quot;: &quot;model&quot;,&quot;created&quot;: 1765038561,&quot;owned_by&quot;: &quot;xxx&quot;,&quot;root&quot;: &quot;../../lora/LoRA-and-MoE/law/law-lora-model-4B-1206&quot;,&quot;parent&quot;: &quot;../../models/Qwen3-4B&quot;,&quot;max_model_len&quot;: null},        {&quot;id&quot;: &quot;starTrek_lora&quot;,&quot;object&quot;: &quot;model&quot;,&quot;created&quot;: 1765038561,&quot;owned_by&quot;: &quot;xxx&quot;,&quot;root&quot;: &quot;../../models/Qwen3Guard-StarTrek-Classification-4B&quot;,&quot;parent&quot;: &quot;../../models/Qwen3-4B&quot;,&quot;max_model_len&quot;: null}        {&quot;id&quot;: &quot;hn_lora&quot;,&quot;object&quot;: &quot;model&quot;,&quot;created&quot;: 1765038561,&quot;owned_by&quot;: &quot;xxx&quot;,&quot;root&quot;: &quot;../../models/hn-lora-Qwen3-4B&quot;,&quot;parent&quot;: &quot;../../models/Qwen3-4B&quot;,&quot;max_model_len&quot;: null}    ]}</code></pre><p>在使用时只需要选择某个LoRA模型或不指定LoRA专家模型，直接使用基座模型；</p><pre><code>response = client.chat.completions.create(    model=&quot;Qwen3-4B&quot;,    messages=[        {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: inference_prompt},    ],    temperature=0,    max_tokens=1024,    #可不使用lora    extra_body={        &quot;lora_path&quot;: &quot;law_lora&quot;,      })</code></pre><p>  现在业内多LoRA部署有多种成熟的方案，多LoRA专家模型部署推理主流方案如下：</p><ul><li>vLLM: 目前最流行的推理框架之一，原生支持 Multi-LoRA serving。它可以在处理请求时动态地为不同请求应用不同的 LoRA 适配器，而无需重新加载基座模型。</li><li>Hugging Face TGI (Text Generation Inference): 提供了对多个 LoRA 适配器的支持。</li><li>LoRAX (LoRA Exchange): 专门为服务数千个 LoRA 模型而设计的推理服务器，优化了 LoRA 的换入换出机制。</li><li>SGLang：原生支持Multi-LoRA serving，请求时动态的为不同应用路由到不同的LoRA适配器。</li><li>LoRAX：号称一个GPU上能部署上百LoRA适配器模型。</li></ul><h2 id="未来">未来</h2><p><strong>未来也未必是未来。</strong><br />  目前除了已经成熟的基于LoRA外挂适配器权重的多专家模型方案外，还有一中学术界还在探索中没那么成熟的MoE-LoRA方案，混合专家融合的LoRA方案。LoRA微调可以理解为训练了N个独立的LoRA(针对不同数据集)，创造了N个专家。</p><ol><li>LoRA A：只用代码数据训练（Code Expert）。</li><li>LoRA B：只用数学数据训练（Math Expert）。</li><li>LoRA C：只用小说数据训练 (Creative Writing Expert)。</li></ol><p>  MoE-LoRA可以理解为把这 N 个 LoRA 塞进一个模型里并使用门控控制。  目前独立LoRA存在一个问题就是需要提前知道任务级或会话级类型。一旦你选定了 LoRA（代码专家），在接下来的生成中，它就无法处理其他领域的知识，不适合复合型任务。</p><p>  而MoE-LoRA则不存在上面问题，模型内部有一个 门控(Gating)，针对每一个 Token（词元） 进行决策，可以瞬间切换LoRA专家，一会使用代码专家 LoRA一会使用文学专家LoRA。模型是一个既懂着又懂那的缝合怪天才。一个句子的生成过程中动态调用不同的能力，这是独立 LoRA 绝对做不到的。有一种专家间的软协同能力。</p>]]>
                    </description>
                    <pubDate>Thu, 18 Dec 2025 08:48:13 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[大模型法律知识评估——Qwen3-0.6B到8B vs LawLLM-7B]]>
                    </title>
                    <link>http://www.solinx.cn/archives/2025111000000</link>
                    <description>
                            <![CDATA[<p>现在无论是数码产品手机、电脑、CPU、GPU等或是<strong>大模型跑分</strong>是一个永恒不变的流程，虽然现在不少厂商针对跑分进行了专门的“优化”，但跑分目前还是相对客观评价一个硬件产品或是软件产品的手段。</p><p>不服？ 来跑个分。</p><p>跑分的专业术语是评测、评估。大模型评估对通用大模型很重要，对垂直模型一样很重要，一个垂直模型在其垂直领域内的能力要比通用模型好才有其存在的意义。如一个7B微调的法律模型如其在法律领域能力还比不上7B的通用模型就没有存在的意义。</p><p>评估微调模型的能力同样需要进行跑分从一个相对客观的角度评估模型是否达到预先设定的目标。</p><p>文章下面先简单介绍大模型评估的一些背景知识，后通过评估Qwen3-0.6B、1.7B、4B、8B以及LawLLM-7B，五个模型中三个为通用模型，一个为基于Qwen2.5-7B经过微调的垂直领域模型。看看不同规模比较新的通用模型能否战胜一个比较老的垂直法律模型。</p><h2 id="大模型评估">大模型评估</h2><p>在大模型领域也比较流行跑分，每次各家厂商发布新模型同时也会公布其在某某榜单的分数，在N个领域基准评估排名是多少。目前行业公认基准评估评测集如下：  <strong>MMLU Pro</strong>通用知识推理多学科专业级理解（数学、物理、历史等）MMLU升级版，题目更复杂，选项从4个增至10个  <strong>GPQA Diamond</strong>高级科学推理物理/化学/生物等研究生级问题&quot;Google-proof&quot;设计，防止搜索直接得答案，极难  <strong>SWE-bench Verified</strong>软件工程解决真实GitHub代码问题人工验证版本，评估工程实践能力而非简单代码补全  <strong>MATH-500</strong>数学推理500道高难度数学竞赛题需复杂推导和计算，测试数学思维  <strong>AIME 2024</strong>数学竞赛美国数学邀请赛真题顶级高中数学竞赛，难度极高  <strong>LiveCodeBench</strong> 代码生成动态更新的算法题与编程任务防数据污染，测试实时编程与算法解决能力</p><p>这六个领域是每个头部大模型厂商新模型必跑的分。还有一些其他数据集如MT-Bench、P2L等。还有针对Agent的评估如：<strong>AgentBench</strong>。</p><h2 id="模型竞技场">模型竞技场</h2><p>比较出名的平台有：LMArena、CompassArena等</p><p>相对于学术领域基准评测比较容易被针对性“优化”，还有一个业内比较权威的模型评测榜单LMArena。模型竞技场排名与针对领域基准数据集的跑分模式完全不一样，基准数据集是公开的如果模型在训练阶段加入了部分数据就可能会影响到他的跑分结果。</p><p><strong>LMArena</strong>这类模型竞技场核心是依靠用于进行打分，用于规模越大活跃度越高其越权威。也是局限性就是收到用户群体偏好的影响。</p><p><strong>LMArena评测机制：</strong><strong>1、双盲对战：</strong> 用户提问，平台随机展示两个匿名模型的回答，用户投票选择更优答案，投票结束后才揭示模型身份<strong>2、Bradley-Terry统计模型：</strong> 将投票率转换为实力得分，控制样本量和匹配次数的偏差<strong>3、动态更新：</strong> 根据用户投票持续更新</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1762667071099.png" alt="image.png" /></p><h2 id="法律领域">法律领域</h2><p>目前针对法律领域的模型评估数据集MMLU/MMLU Pro虽然有覆盖法律学科，但这跟国内的法律还不一样。CMMLU、C-Eval 倒是覆盖了国内法律领域知识，但这类综合性的评估数据集覆盖了几十个学科法律只是其小部分数据集，对法律垂直领域内的知识覆盖面不够。目前国内法律领域的专门评测数据集有：LawBench、LAiW，下面将使用LawBench数据集用于模型的评估。</p><p>LawBench数据集包括20种不同任务，覆盖三个认知水平：<strong>1、法律知识记忆：</strong> 包括法律概念、术语、法条和事实。<strong>2、法律知识理解：</strong> 法律文本中的实体、事件和关系，从而理解法律文本的意义和内涵。<strong>3、法律知识应用：</strong> 能否正确利用其法律知识、对其进行推理从而解决下游应用中的现实法律任务。</p><p>LawBench每类任务包括500个问题，试题类型包括：生成、单选、多选、抽取、回归。五种不同类型的问题。数据集总规模为1W。提供了Zero-Shot(零样本)、One-Shot(单样本)两种类型的数据集。评估的分数计算通常有两种模式。基于规则的评估（Rule-based）：使用确定性规则或脚本自动判断模型输出是否正确。基于LLM Judge的评估（LLM-as-Judge）：使用另一个大语言模型作为&quot;裁判&quot;来评估答案质量。</p><p>下面分别使用Qwen3-0.6B、1.7B、4B、8B以及LawLLM-7B评估本数据集，本次使用的是基于规则的评估。LawLLM-7B为基于Qwen2.5微调的法律垂直领域模型。<br />参数统一为top_k=20,temperature=0.6,top_p=0.95,do_sample=True</p><table><thead><tr><th>认知</th><th>任务</th></tr></thead><tbody><tr><td>法律知识记忆</td><td>法条背诵、知识问答</td></tr><tr><td>法律知识理解</td><td>文件校对、纠纷焦点识别、婚姻纠纷鉴定、问题主题识别、阅读理解</td></tr><tr><td></td><td>命名实体识别、舆情摘要、论点挖掘、事件检测、触发词提取</td></tr><tr><td>法律知识应用</td><td>法条预测(基于事实)、法条预测(基于场景)、罪名预测、刑期预测(无法条内容)</td></tr><tr><td></td><td>刑期预测(给定法条内容)、案例分析、犯罪金额计算、咨询</td></tr></tbody></table><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1762667100681.png" alt="image.png" /></p><h3 id="评测结果分析">评测结果分析</h3><p>本数据集<strong>在19项任务中，13项任务（68%）非思考模式表现更优</strong> ，思考模式仅在6项任务（32%）中效果更好。</p><p><strong>思考模式增益公式：Δ = 8B得分 - 8B-no_think得分</strong><strong>思考模式真正有效的任务（Δ &gt; 2）</strong>| 任务 | Δ值 | 任务类型 | 成功原因 ||------|-----|----------|----------|| <strong>刑事损害赔偿计算</strong> | <strong>+25.2</strong> | 数值推理 | 复杂多步计算需逻辑链支撑 || <strong>触发词提取</strong> | <strong>+12.7</strong> | 事件理解 | 深度语义理解提升事件边界识别 || <strong>基于事实的法条预测</strong> | <strong>+4.5</strong> | 知识推理 | 事实-法条映射需中间推理步骤 || <strong>事件检测</strong> | <strong>+4.4</strong> | 内容理解 | 全局上下文分析减少误检 |</p><h4 id="非思考模式碾压性优势的任务δ---5"><strong>非思考模式碾压性优势的任务（Δ &lt; -5）</strong></h4><table><thead><tr><th>任务</th><th>Δ值</th><th>任务类型</th><th>失败原因</th></tr></thead><tbody><tr><td><strong>案例分析</strong></td><td><strong>-16.4</strong></td><td>生成任务</td><td>过度思考导致生成内容冗余发散</td></tr><tr><td><strong>论点挖掘</strong></td><td><strong>-16.0</strong></td><td>信息抽取</td><td>深度思考引入噪声而非精准定位</td></tr><tr><td><strong>命名实体识别</strong></td><td><strong>-14.9</strong></td><td>抽取任务</td><td>思考模式破坏实体边界快速匹配</td></tr><tr><td><strong>知识问答</strong></td><td><strong>-14.4</strong></td><td>信息检索</td><td>过度推理偏离直接答案</td></tr><tr><td><strong>争议焦点识别</strong></td><td><strong>-9.6</strong></td><td>精确判断</td><td>思考引发发散，损害判断锐度</td></tr><tr><td><strong>刑期预测（有法条）</strong></td><td><strong>-7.5</strong></td><td>数值计算</td><td>思考增加复杂度，数值计算需&quot;直给&quot;</td></tr><tr><td><strong>刑期预测（无法条）</strong></td><td><strong>-5.7</strong></td><td>数值计算</td><td>同上</td></tr></tbody></table><hr /><h3 id="规模效应真实表现">规模效应真实表现</h3><h4 id="强正规模效应任务06b8b提升50"><strong>强正规模效应任务（0.6B→8B提升&gt;50%）</strong></h4><ul><li><strong>基于事实的法条预测</strong>：<strong>+383%</strong>（16.24→78.46）——事实-法律映射能力随参数量爆炸式增长</li><li><strong>罪名预测</strong>：<strong>+95%</strong>（28.00→54.50）——罪名认定依赖复杂特征学习</li><li><strong>知识问答</strong>：<strong>+75%</strong>（29.00→50.80）——知识密度与参数规模强相关</li><li><strong>刑事损害赔偿计算</strong>：<strong>+53%</strong>（61.40→94.00）——数学能力与规模正相关</li></ul><h4 id="规模效应饱和任务4b8b提升5"><strong>规模效应饱和任务（4B→8B提升&lt;5%）</strong></h4><ul><li><strong>事件检测</strong>：+0.1%（73.36→73.29）——4B已达能力上限</li><li><strong>阅读理解</strong>：+5.5%（71.71→75.65）——边际效益递减</li><li><strong>基于场景的法条预测</strong>：+0.4%（30.82→30.93）<strong>——全系列得分停滞，可能是评估分数计算存在缺陷</strong></li></ul><h4 id="异常规下降任务"><strong>异常规下降任务</strong></h4><ul><li><strong>刑期预测（有法条）</strong>：0.6B→8B<strong>持续下降</strong>（80.85→78.96），可能是模型复杂化后&quot;过度解读&quot;法条，还可能是评估分数计算存在缺陷</li></ul><hr /><h3 id="与专业模型lawllm-7b对比">与专业模型（LawLLM-7B）对比</h3><h4 id="qwen3-8b反超标杆的任务"><strong>Qwen3-8B反超标杆的任务</strong></h4><ol><li><strong>刑事损害赔偿计算</strong>：94.0 vs 57.2（<strong>+64%</strong>）——通用模型的数学优势</li><li><strong>争议焦点识别</strong>：8B-no_think 43.4 vs 27.2（<strong>+60%</strong>）——非思考模式+规模效应碾压</li><li><strong>命名实体识别</strong>：8B-no_think 85.2 vs 63.1（<strong>+35%</strong>）——通用架构的抽取能力被低估</li><li><strong>刑期预测</strong>：no_think模式全面领先（86.6/86.5 vs 80.5/79.8）</li></ol><h4 id="lawllm-7b护城河任务"><strong>LawLLM-7B护城河任务</strong></h4><ol><li><strong>案例分析</strong>：74.8 vs 37.8（<strong>+98%</strong>）——法律推理专业化不可替代</li><li><strong>知识问答</strong>：79.0 vs 50.8（<strong>+56%</strong>）——法律知识密度差距</li><li><strong>事件检测</strong>：89.8 vs 73.3（<strong>+23%</strong>）——专业领域特征工程优势</li><li><strong>法条背诵</strong>：26.2 vs 19.3（<strong>+36%</strong>）——专业训练集的记忆优势</li></ol><hr /><h3 id="现象">现象</h3><h4 id="现象1思考模式的双刃剑本质"><strong>现象1：思考模式的&quot;双刃剑&quot;本质</strong></h4><ul><li><strong>适合</strong>：<strong>触发词提取</strong>（+12.7）需深度理解；<strong>刑事赔偿计算</strong>（+25.2）需多步推理</li><li><strong>不适合</strong>：<strong>命名实体识别</strong>（-14.9）需快速匹配；<strong>案例分析</strong>（-16.4）需精准生成</li></ul><h4 id="现象2规模与模式的互斥性"><strong>现象2：规模与模式的互斥性</strong></h4><ul><li><strong>小模型（0.6B）</strong>：思考模式无害（无法深度思考）</li><li><strong>大模型（8B）</strong>：思考模式分化——<strong>推理任务增益 vs 抽取任务受损</strong></li></ul><h4 id="现象3专业模型的偏科现象"><strong>现象3：专业模型的&quot;偏科&quot;现象</strong></h4><ul><li>LawLLM-7B在<strong>案例分析</strong>、<strong>知识问答</strong>领先</li><li>但在<strong>刑事赔偿计算</strong>（57.2 vs 94.0）和<strong>触发词提取</strong>（16.85 vs 58.78）<strong>严重弱于通用模型</strong></li></ul><hr /><h3 id="场景-模型配置决策树"><strong>场景-模型配置决策树</strong></h3><pre><code class="language-plaintext">任务是否需要思考模式？├─ 是 → 启用思考模式│   ├─ 数值计算 → 8B-think（刑事赔偿）│   └─ 法条映射 → 8B-think（基于事实的法条预测）└─ 否 → 禁用思考模式    ├─ 信息抽取 → 8B-no_think（NER、论点挖掘）    ├─ 精确判断 → 8B-no_think（争议焦点、刑期预测）    └─ 内容生成 → 8B-no_think（案例分析、咨询）</code></pre><h3 id="专业模型-vs-通用模型取舍"><strong>专业模型 vs 通用模型取舍</strong></h3><ul><li><strong>优先LawLLM-7B</strong>：法律文书生成、深度法律咨询、知识密集型问答</li><li><strong>优先Qwen3-8B-no_think</strong>：实体抽取、数值计算、快速焦点判断</li></ul><hr /><h2 id="总结">总结</h2><p>专业模型有一定的护城河，在专业领域还保存着优势，但<strong>基座模型</strong>的更新就可能让专业模型丧失一半优势，微调也是需要持续更新迭代的。模型评估也是一个复杂的工程，也可能新模型又在评测数据集上训练了一遍做了“优化”，可能要更加客观评估大模型还是需要<strong>专门定制</strong>的评估数据集。</p><hr />]]>
                    </description>
                    <pubDate>Mon, 10 Nov 2025 08:39:47 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[智能体详解——极简深度研究Agent]]>
                    </title>
                    <link>http://www.solinx.cn/archives/20251001</link>
                    <description>
                            <![CDATA[<p>   <strong>深度研究</strong>是各大AI平台都比较比较常见的智能体，无论是国外的OpenAI、Google或是国内的Kimi、阿里等都提供了此功能。只需要通过输入想要研究探索的主题该智能体就会自动通过网络检索、调用工具等抓取与用户关心的该主题的相关内容，然后输出该主题的报告/文章。<br />   对于<strong>DeepResearch</strong>这种比较常见的智能体是否还有造轮子的意义呢，答案是肯定的。通过造轮子这种常见、流程简单的智能体比较容易跨进学习相关框架、Agent开发的的门槛。这类智能体最关键的还是Search的数据源质量怎样，如果Search得到的<strong>数据质量</strong>不高，再怎样也得不到比较高质量的文章/报告。<br />   本文除了介绍<strong>极简深度研究智能体</strong>的实现外在文章的最后还会开源相关代码。</p><h2 id="智能体结构">智能体结构</h2><center>  <img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1758727573887.png" width="420px" height="560px" alt="描述性文字"></center><p>   本文所述极简深度检索智能体包含五个Agent，生成查询Agent、网络搜索Agent、反思Agent、报告生成Agent。</p><p>   * <strong>生成查询Agent</strong>：根据用户输入的内容提交给大模型，对该原始问题进行查询生成，生成一个或多个多样化的查询。使得在下一步的Agent从能够搜索到更多有用的信息。此Agent生成的是一个或多个查询列表：<br />   {&quot;query_list&quot;:{&quot;query&quot;:[&quot;子查询&quot;],&quot;rationale&quot;:&quot;简要解释这些查询与研究主题的相关性&quot;}}<br />   此Agent的工作：<br />   1、发起模型调用生成子查询<br />   2、根据子查询列表发起N次[网络检索Agent]请求(并发)</p><p>   * <strong>网络检索Agent</strong>：根据[生成查询Agent]所生成的查询列表调用网络工具进行检索，此处的网络检索工具可以是Tavily、博查或搜索引擎或自己开发的工具等。将网络检索到的网络资料提交到大模型，生成关于在 生成查询Agent 阶段所提供问题的研究摘要。<br />   此Agent的工作：<br />   1、根据[生成查询Agent]生成的查询列表发起一次或多次网络检索。<br />   2、针对该[查询列表]生成一份或多份研究摘要。</p><p>   * <strong>反思Agent</strong>：Agent收到[网络检索Agent]所生成的研究摘要是由N个[网络检索Agent]生成的，并分析其所生成的摘要与用户的[原始问题]是否存在知识缺口或还需要深入探索的领域来决定是否已经满足用户[原始问题]的回答，或还需要返回【网络检索Agent】进行进一步的网络检索。<br />   此Agent生成：{           &quot;is_sufficient&quot;: 是否充分,           &quot;knowledge_gap&quot;: 描述缺失或需澄清的信息,           &quot;follow_up_queries&quot;: 针对缺口提出的具体问题,           &quot;research_loop_count&quot;: 当前循环次数,           &quot;number_of_ran_queries&quot;: 子查询个数,   }   此Agent的工作：<br />   1、判断[网络检索Agent]生成的摘要是否存在知识缺口。<br />   2、是则返回[网络检索Agent]，否则进入[报告生成Agent]。</p><p>   * <strong>报告生成Agent</strong>：根据用户[原始问题]以及[网络检索Agent]阶段所生成的摘要，生成最终的研究报告/文章。</p><h2 id="智能体实现">智能体实现</h2><p>   下面是代码为极简深度研究的Agent构建关键代码，创建generate_query、web_research、reflection、finalize_answer节点，以及两条边continue_to_web_research、evaluate_research，用于控制数据的流转。下面是LangGraph的实现代码。</p><pre><code>def _build_graph(self):        # 创建 Agent Graph        builder = StateGraph(OverallState, config_schema=Configuration)        # 定义将在循环中使用的节点        builder.add_node(&quot;generate_query&quot;, generate_query)        builder.add_node(&quot;web_research&quot;, web_research,        retry=RetryPolicy(max_attempts=3))        builder.add_node(&quot;reflection&quot;, reflection)        builder.add_node(&quot;finalize_answer&quot;, finalize_answer)        # 将 generate_query 设置为入口点 即该节点为首个被调用的节点        builder.add_edge(START, &quot;generate_query&quot;)        # 添加条件边，在并行分支中继续执行搜索查询        builder.add_conditional_edges(            &quot;generate_query&quot;, self._continue_to_web_research, [&quot;web_research&quot;]        )        # 连接网络搜索节点到反思节点        builder.add_edge(&quot;web_research&quot;, &quot;reflection&quot;)        # 评估研究结果        builder.add_conditional_edges(            &quot;reflection&quot;, self._evaluate_research, [&quot;web_research&quot;, &quot;finalize_answer&quot;]        )        # 最终确定答案        builder.add_edge(&quot;finalize_answer&quot;, END)        return builder.compile(name=&quot;research-agent&quot;)  </code></pre><p>   <strong>continue_to_web_research</strong>：[生成查询]与[网络搜索]之间的边，根据查询[生成查询]生成子查询并发起N个[网络检索Agent]请求。<br />   <strong>evaluate_research</strong>：[反思Agent]与[网络检索Agent]和[报告生成Agent]之间的边，根据研究循环次数以及子问题的摘要是否充分决定跳转到哪个节点。</p><p>   <strong>网络检索</strong>：这里现在使用的是 Tavily，在Tavily返回数据后再次发起请求获取详细的页面信息，目前看数据质量也不是很好，但也比使用无头浏览器包装一层的的搜索引擎数据质量好不少。</p><h2 id="前端">前端</h2><p>  目前页面只弄了发起Agent的SSE请求，在Agent运行时各Agent节点状态变动时的页面展示以及最后结果输出的展示。</p><center>  <img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1758727614446.png"alt="描述性文字"></center><h2 id="扩展">扩展</h2><p>   目前智能根据网络搜索的结果进行研究报告生成，生成内容的质量取决于搜索结果的质量，可扩展方向包括加入上传文件的检索、网络搜索内容过滤等。</p><p>   这里也只是算是一个全栈的智能体示例，虽然这里用的是LangGraph，但个人并不喜欢LangGraph，框架封装过于复杂。目前各类Agent框架很多用哪个全凭个人喜好，或这不用框架自己实现Agent的封装。<br />   GitHub代码此代码仓库包含了前后端代码。<a href="https://github.com/linxin26/Open-DeepResearch">https://github.com/linxin26/Open-DeepResearch</a><br />文章首发地址：<a href="https://mp.weixin.qq.com/s/Dmx3XBVal7hgiJ7_BP7-5g">https://mp.weixin.qq.com/s/Dmx3XBVal7hgiJ7_BP7-5g</a></p>]]>
                    </description>
                    <pubDate>Wed, 01 Oct 2025 16:51:11 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[详解智能体应用——网课生成Agent]]>
                    </title>
                    <link>http://www.solinx.cn/archives/2025090001</link>
                    <description>
                            <![CDATA[<p>   AI能改变什么，这或许又是一个Agent能带来巨大改变的业务逻辑，网课有多种形式常见的有如视频网课、图文网课。<br />   网络课程从十几二十年前就开始流行，各行各业都有自己的网络课程，从<strong>中小学、职业教育、证书考试、继续教育</strong>等。但网课的制作并不容易，需要耗费大量的人力物力，视频课程还需要专门的录制设备，录制室。图文课程也需要人工将每个课程的<strong>章节</strong>、<strong>习题</strong>等手工录入或导入到<strong>网课系统</strong>。<br />   这里只介绍可交互的图文<strong>网络课程生成</strong>Agent，通过用户上传指定的文本资料，自动生成基于该资料的网课课程。文章的末尾将提供网课智能体所生成的<strong>页面展示</strong>。</p><h2 id="智能体描述">智能体描述</h2><p>   上传课程材料填写课程级别(初级、中级、高级)与课程名称后智能体将能够根据课程材料文本数据自动生成完整的可交互式的网络课程，每个课程都包含多个章节，章节详情可做到根据章节具体内容而生成可视化的交互学习页面。如学习页面包含可交互的组件以及图表。每个章节还会存在多种类型(选择题、判断题、填空题等）的练习题。<br />   智能体工作主要流程：课程材料&gt;课程信息&gt;课程章节生成&gt;章节详情生成&gt;章节习题生成，具体业务流程如下图所示。</p><center>  <img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1756391665170.png" width="420px" height="550px" alt="描述性文字"></center><h2 id="agent结构">Agent结构</h2><h4 id="课程信息agent">课程信息Agent</h4><p>   以课程材料、填写的课程级别等信息为上下文生成生成课程简要描述文本以及课程基本信息。</p><h4 id="课程章节agent">课程章节Agent</h4><p>   以课程材料为上下文生成课程章节，课程章节包括：章节标题、章节描述、学习时长等。</p><h4 id="章节详情agent">章节详情Agent</h4><p>   以课程材料、章节描述信息为上下文生成章节详情，章节内容会根据使用的内容使用文本、可视化图表、交互组件等展示章节内容。</p><h4 id="章节代码检查agent">章节代码检查Agent</h4><p>   检查上个Agent所生成的章节详情页面代码是否包含基本的运行时错误等。</p><h4 id="章节习题agent">章节习题Agent</h4><p>   以章节内容为上下文，生成章节习题，习题包括：题干、问题选项、正确答案、习题解析。</p><center>  <img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1756391734413.png" width="400px" height="500px" alt="描述性文字"></center><h3 id="章节详情agent实现">章节详情Agent实现</h3><p>   在这个网课智能体中，所具有看点的应该是本Agent的实现，网课的可交互页面的学习体验也依赖于此Agent。这个环节也是最有可能出错的。智能体的输入为：课程材料、章节详情、React组件。输出为根据章节内容所适配的可交互React代码。下面代码为输出的React可视化示例：</p><pre><code>() =&gt; {const data = [  { name: '训练集', value: 70 },  { name: '验证集', value: 15 },  { name: '测试集', value: 15 }];return (  &lt;div&gt;    &lt;Recharts.PieChart width={400} height={300}&gt;      &lt;Recharts.Pie        data={data}        cx=&quot;50%&quot;        cy=&quot;50%&quot;        labelLine={true}        label={({ name, percent }) =&gt; `${name}: ${(percent * 100).toFixed(0)}%`}        outerRadius={80}        fill=&quot;#8884d8&quot;        dataKey=&quot;value&quot;      &gt;        {data.map((entry, index) =&gt; (          &lt;Recharts.Cell key={`cell-${index}`} fill={['#4e79a7', '#f28e2c', '#e15759'][index % 3]} /&gt;        ))}      &lt;/Recharts.Pie&gt;      &lt;Recharts.Tooltip /&gt;    &lt;/Recharts.PieChart&gt;    &lt;p className=&quot;text-center mt-4&quot;&gt;测试集、训练集、验证集占整个数据集的比例&lt;/p&gt;  &lt;/div&gt;);}</code></pre><h3 id="提示词如下">提示词如下：</h3><pre><code>你是负责用 React + JSX 创建引人入胜的可视化讲解的智能体。  你的工作流程如下：1. 你将从规划智能体那里收到一个主题及要点列表2. 你需要为用户创建一个吸引人的解释/演示## Output Format&lt;start of your output&gt;() =&gt; {     const [counter,setCounter]=React.useState(0); // by default your code has access to the React object     const increase=()=&gt;{       setCounter(counter+1);     };     return (&lt;&gt;       &lt;button onClick={increase}&gt;+&lt;/button&gt;       &lt;span&gt;{'counter : '+ counter}&lt;/span&gt;       &lt;/&gt;);}&lt;end of your output&gt;重要注意事项请仅输出我指定的组件部分，尤其不要包含：- 代码前后的 ```jsx 标签- &lt;start of your output&gt;&lt;end of your output&gt;- 任何关于代码的解释或包围代码的文字你的代码会被立即解析并展示给用户，因此务必避免语法错误!!----风格指南:- 你的首要任务是通过可视化讲解和交互性防止用户感到无聊。- 在此过程中，尽量把概念讲得越清晰越好。- 使用具体示例。- 不要包含练习题，这tester agent的任务。- 确保组件占满其父容器的 100%。- 不要创建幻灯片，而是做成一整页可连续滚动的页面。## 可用库与插件你将可以访问若干库和插件，下面将为你提供它们的文档:</code></pre><h3 id="效果展示">效果展示</h3><center>  <img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1756391840946.png" width="420px" height="560px" alt="描述性文字"></center><h2 id="扩展">扩展</h2><p>   上面所描述的智能体流程比较简单，还可以进一步完善如引入RAG、试卷、考试等功能，使其达到一个较高的可用度。<br />在加入RAG的支持后，可通过向量检索实现由用户自定义只生成用户所关心的课程材料中某个主题的网络课程。在完成课程生成后和配套生成整个课程的试卷，试卷可以是一套或者N套。扩充章节内容，目前章节没有细分小节或内容不够长，通常大章节都有会几个小知识点。</p><p>   变革才刚刚开始，目前由于模型幻觉、成本等因素智能体现在阶段完全取代网课系统也不现实，加上目前视频生成也不是很成熟，但相信用不了多久的未来无论是图文网课或是视频网课量大量都是由AI Agent自动生成。</p>]]>
                    </description>
                    <pubDate>Wed, 03 Sep 2025 08:37:23 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[详解智能体应用——合同审查Agent]]>
                    </title>
                    <link>http://www.solinx.cn/archives/20250811000001</link>
                    <description>
                            <![CDATA[<p>   <strong>合同审查</strong>是每个公司和个人经常会遇见的，虽然对个人来说有些合同你审查可能并没有卵用，你不得不签。大公司都会法务岗位合同审查这也是法务的主要工作之一。很多小公司并不会存在专门的法务或合作律所，合同也只是大概看下关键条款。对公司而言合同审查至关重要，一旦签了问题合同就可能会对公司带来灾难性影响。<br />  随着大模型普及，相信现在很多小公司人员会直接上传合同文本到某个AI应用如Deepseek或元宝等让它进行合同审查，但这些应用都是通用模型，还有幻觉、提示词等因素它进行的合同审查不一定能够覆盖全面对合同问题全覆盖。[ <strong>并非</strong>所有合同都<strong>能上网</strong>，注意保密合规要求]<br />  审查合同最基本的审查要求是对合同进行合同标准模版与风险条款审查。建设合同审核Agent的难度在于两库两规的建设， <strong>两库两规</strong>分别对应于：风险条款库、标准模板库、行业法规、公司政策规定；两库两规建设需要注意数据合规性爬虫不能沾。</p><p>##架构设计</p><center>  <img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1754809080289.png" alt="描述性文字"></center><p>     各个行业的合同模版，主要有政府部门、行业组织、公司内部指定的合同模版。<br />   <strong>风险条款库：</strong> 覆盖合同常见的风险条款。<br />   <strong>行业法规：</strong> 政府部门、行业组织制定的相关法律法规。<br />   <strong>公司政策：</strong> 公司根据内部自己指定的合同要求、产品要求政策。</p><p>   <strong>合同初审：</strong> 根据标准模版对合同文本进行初审，输出合同初审报告。<br />   <strong>关键要素审核：</strong> 合同双方、标的、金额、有效期、管辖权、违约责任等，输出关键要素审核报告。<br />   <strong>风险评估：</strong> 列出各个条款的风险等级(高、中、低)，输出风险评估报告。<br />   <strong>合规性检查：</strong> 对合同进行行业法规与公司政策的合规检查，输出合规性检查报告。<br />   <strong>合同修改建议：</strong> 最终的合同审核报告。</p><h2 id="agent设计">Agent设计</h2><center>  <img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1754809115423.png" alt="描述性文字"></center><p>  本文所述合同审查Agent整体架构如上图所示。<br />   <strong>合同审核Agent：</strong> 为主Agent本身并不负责任何的合同审核任务，只负责将合同文本传递给其他Agent。<br />   <strong>五个子Agent：</strong> 负责协同完成合同文本的审核任务，各子Agent职责分明，只负责完成自己所规定的任务。<br />   <strong>最终审核报告Agent：</strong> 负责整理其他四个子Agent所完成的审核任务，输出最终的合同文本审核报告；</p><p>  对于完善的Agent应用还需要有合同审查记录、提供合同调整能力、输出调整后合规合同等功能。<br />  本文所述Agent交互比较简单，从较好的用户体验角度出发此Agent的Web UI可设计成实时人机交互的。如实时对文本编辑器的合同文本提交给后端Agent进行合同审核，Agent审核返回合同审核结果，可实时对编辑器内的合同文本体现出问题条款、风险等级等。要实现这个效果需要Agent具有较高的实时性输出。<br />  本文最后提供了农产品采购的问题合同文本，使用本文所开发的合同审查Agent所输出的合同审核报告，仅供参考。</p><h3 id="1问题合同">1、问题合同</h3><pre><code> 合同编号：2025-NCP-001签订地点：微信语音签订时间：2025年8月10日 23:47甲方（供货方）：王老三（微信昵称“田野老王”）身份证号：略地址：某县某镇某村“大概村口第三家”联系电话：微信同号乙方（采购方）：××电子商务有限公司（未加盖公章）法定代表人：李总（签字处空白）地址：以发货地址为准联系电话：客服微信号“XX-Store”鉴于甲方自称拥有大量农副产品，乙方自称需要采购，双方本着“差不多就行”的精神，订立如下合同，并确认均已阅读且看不懂也不问。第一条 标的、数量、价格1.1 标的名称：新鲜农产品（具体品种以发货当天老王地里有的为准）。1.2 数量：大约1000斤左右，可多可少，最终按甲方地磅称重为准（地磅年检过期）。1.3 价格：随行就市，甲方每天在微信群里报一次价，乙方当日未回复“不要”即视为同意。1.4 价格已包含“所有费用”，但如遇油价上涨、天气不好、老王心情差，甲方可临时加5%–20%“辛苦费”。第二条 质量标准2.1 质量等级：目测差不多，新鲜就行，无官方检测报告。2.2 农药残留：甲方承诺“基本不打药”，但如检测超标，双方同意以“农村都这样”为免责理由。2.3 外观缺陷：虫眼、裂果、泥土属正常，乙方不得以此拒收或索赔。第三条 包装方式3.1 包装材料：二手化肥袋、废纸箱或甲方家里现有的编织袋，如需新箱，费用由乙方额外承担。3.2 包装标识：无生产日期、无保质期、无溯源码，仅在外袋上用记号笔写“农产品”三字。第四条 交货时间、地点、方式4.1 交货时间：2025年8月，具体哪天看天气和甲方时间安排。4.2 交货地点：甲方地头；如乙方要求发快递，则默认到付且甲方不保证当天发出。4.3 运输方式：甲方联系“顺路货车”，司机电话保密；运输损耗5%以内属正常，乙方不得异议。4.4 风险转移：货物一旦离开甲方地磅，无论是否装车完毕，风险即转移给乙方。第五条 验收5.1 乙方应在收到货物后5分钟内完成验收，逾期视为合格。5.2 如乙方发现货物腐烂、短斤缺两，必须在收货现场拍照并立即得到司机书面签字确认，否则视为乙方保管不当。5.3 甲方不接受任何退货；乙方坚持退货的，须自行承担来回运费及30%“折腾费”。第六条 结算方式6.1 乙方预付30%“诚意金”到甲方私人微信零钱；剩余货款在甲方发货后48小时内付清，逾期每日加收10%滞纳金。6.2 甲方未发货前可随时涨价或取消订单，诚意金原路退回但不计利息；乙方取消订单则诚意金不予退还。6.3 所有款项仅支持微信红包或现金，不提供发票；如乙方强行索要发票，须自行承担13%税点。第七条 不可抗力7.1 不可抗力包括但不限于：下雨、太阳太大、路不通、老王感冒、村里停电、手机没信号。7.2 发生不可抗力，甲方有权无限期推迟交货且无需通知；乙方不得以此为由解除合同或索赔。第八条 违约责任8.1 任何一方违约，只需在微信群里发一句“不好意思”即可免责。8.2 如乙方拖欠货款，甲方可直接在乙方直播间刷屏“老赖公司”；如甲方未交货，乙方可发一条差评，但不得要求赔偿。第九条 争议解决9.1 合同履行过程中如发生争议，双方同意先找“村里德高望重的王大爷”调解；调解不成的，任一方可向“有关部门”反映，具体部门名称暂不确定。9.2 诉讼管辖：如走法律程序，双方一致同意由甲方所在地镇法庭管辖，且适用法律为“当地惯例”。第十条 其他约定10.1 本合同一式零份，仅以微信聊天记录截图为准，任何打印版本无效。10.2 合同未尽事宜，由甲方单方口头补充，补充内容与本合同具有同等效力。10.3 甲方拥有最终解释权；如条款与国家法律冲突，以甲方理解为准。</code></pre><h3 id="2合同审核报告">2、合同审核报告</h3><pre><code> 一、合同基本信息项目内容合同编号2025-NCP-001合同名称农副产品买卖合同（非正式）签署日期2025年8月10日 23:47签署地点微信语音甲方（供货方）王老三（微信昵称“田野老王”）乙方（采购方）××电子商务有限公司二、合同主要内容概述本合同为农副产品买卖合同，主要内容包括：标的物：新鲜农产品，品种、数量、价格均不明确；质量标准：以“目测差不多”为准，无检测报告；包装方式：使用二手化肥袋等非标准包装；交货安排：交货时间、地点不确定，风险转移点不合理；验收条款：验收时间过短，举证责任分配不公平；付款方式：微信红包支付，预付30%诚意金，滞纳金过高；不可抗力：范围过于宽泛，包括天气、个人身体状况等；违约责任：仅需在微信群道歉即可免责；争议解决：由村里调解或“有关部门”处理，缺乏法律效力；合同形式：无书面签署页，仅以微信聊天记录为准。三、合同中存在的主要问题和风险点1. 合同主体信息不完整问题描述：甲方身份信息不全，乙方未加盖公章，法律效力存疑。风险评估等级：高合规性分析：根据《电子商务法》第10条，平台需核验经营者身份，但本合同未体现甲方合法资质。乙方未加盖公章，违反公司内部签署流程，不符合公司政策中关于合同签署的规范性要求。合规检查结果：不合规2. 标的物约定不明确问题描述：标的品种、数量、价格机制模糊，缺乏约束。风险评估等级：高合规性分析：《农产品质量安全法》第39条规定，农产品上市须附承诺达标合格证，但本合同未体现。公司政策要求透明定价公示，禁止“临时口头加价”，但合同中允许甲方随时涨价。合规检查结果：不合规3. 质量标准缺失问题描述：无检测报告，免责条款违法。风险评估等级：高合规性分析：《农产品质量安全法》第39条要求农产品上市须附承诺达标合格证，合同中未体现。公司政策要求100%批次自检，但合同中未提及检测要求。免责条款“农村都这样”违反《食品安全法》第4条，企业应确保食品安全。合规检查结果：不合规4. 交货安排不合理问题描述：交货时间地点不确定，风险转移点不合理。风险评估等级：中合规性分析：《民法典》第604条规定，标的物毁损、灭失的风险在交付前由出卖人承担，合同中风险转移点设置不合理。公司政策要求损耗先行赔付，但合同中未体现。合规检查结果：不合规5. 验收条款不合理问题描述：验收时间过短，举证责任不公平。风险评估等级：中合规性分析：《民法典》第621条规定，买受人应在合理期限内检验标的物，合同中5分钟验收时间不合理。公司政策要求48小时内完成赔付，但合同中未体现。合规检查结果：不合规6. 付款条款存在法律风险问题描述：诚意金机制不公平，滞纳金过高。风险评估等级：高合规性分析：《民法典》第585条规定，违约金不得超过实际损失的30%，合同中滞纳金每日10%过高。公司政策要求透明定价公示，但合同中未体现。合规检查结果：不合规7. 争议解决条款无效问题描述：争议解决方式无效，管辖条款不明确。风险评估等级：高合规性分析：《民法典》第470条规定，合同应明确争议解决方式，合同中“村里调解”不具备法律效力。公司政策要求适用法律为中华人民共和国法律，但合同中未明确。合规检查结果：不合规8. 合同形式不合规问题描述：合同形式不规范，甲方拥有最终解释权。风险评估等级：中合规性分析：《民法典》第466条规定，合同应采用书面形式，合同中“一式零份”不符合要求。公司政策要求“就高不就低”原则，但合同中甲方拥有最终解释权违反公平原则。合规检查结果：不合规四、审核意见和建议1. 补充并规范合同主体信息建议：要求甲方提供完整身份证号、详细地址及有效联系方式；乙方必须加盖公章，法定代表人签字确认；双方应提供银行账户信息，避免使用微信红包等非正式支付方式。2. 明确合同标的物信息建议：列明具体农产品品种、规格、数量；明确价格调整机制，禁止无理由涨价；使用经年检合格的地磅，或引入第三方计量机构。3. 完善质量标准条款建议：建立明确的质量等级标准；增加农药残留检测要求，提供检测报告；删除“农村都这样”等免责条款。4. 优化交货与运输条款建议：明确交货时间、地点及运输方式；合理分配运输风险，明确损耗责任；禁止将天气、个人身体状况列为不可抗力。5. 修订验收与退货条款建议：延长验收时间至合理期限（如24小时）；允许乙方在合理期限内提出异议；退货条件应公平合理，避免单方加重乙方责任。6. 规范付款与发票条款建议：提供正规发票，删除“强行索要发票需补税”条款；调整滞纳金比例至合理范围（如每日0.05%）；明确预付款退还机制，避免甲方单方取消订单。7. 完善争议解决条款建议：选择有效的仲裁机构或法院管辖；删除“村里调解”等无效条款；明确适用法律为中华人民共和国法律。8. 规范合同形式与签署建议：采用书面合同形式，一式两份，双方各执一份；删除“甲方拥有最终解释权”条款；所有补充条款需以书面形式确认。审核人：合同审核专员审核日期：2025年8月11日</code></pre>]]>
                    </description>
                    <pubDate>Mon, 11 Aug 2025 08:38:13 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[精准与效率：RAG应用PDF文档图文提取OCR策略]]>
                    </title>
                    <link>http://www.solinx.cn/archives/202507230001</link>
                    <description>
                            <![CDATA[<p>  在RAG应用中通常需要对各种文档进行文本提取，如果稳定是纯文本那文档提取会简单很多，但通常文档中会存在各种图片信息，这是就需要使用OCR在提取文档文本信息的同时对图片进行OCR获取图片中的文本内容。本文只介绍PDF文档中OCR技术方案。PDF文档解析目前有不少开源框架亦可支持对PDF中的图片进行OCR，但此类框架通常比较重如<strong>Marker</strong>、<strong>Unstructured</strong>等。<br />  这里只使用PyMuPDF读取PDF文件并根据文档实际情况使用调用OCR进行文本提取，文本提取的质量依赖于<strong>OCR</strong>模型。<strong>PDF</strong>文档解析的速度也依赖于OCR的性能，几百页的PDF文档并不少见。</p><h3 id="1只提取pdf中的位图进行ocr">1、只提取PDF中的位图进行OCR</h3><p>  此方案通过解析PDF提取其内嵌的图片，只对提取的内嵌图片进行OCR，但可能会由于PDF嵌入的图片质量效果不佳或分辨率较低的问题，即使在原PDF中很清晰的图片提取出来后也是模糊不清，导致OCR准确率大大降低。特别是对于存在数学公式的PDF，提取位图进行OCR准确率极低。对图片进行二次处理如 <strong>灰度、放大、二值化、去噪后</strong> OCR效果也不一定很理想。</p><center>  <img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1753193479281.png" alt="描述性文字"></center><p>  上图为PDF中的数学公式，图片为PNG格式，存在一个Alpha 通道，尽管已经分离该透明通道并填充白色背景，但是OCR识别的效果依然不佳，再进行灰度、放大、二值化、去噪后，还是效果不佳。<br />  提取文本、提取图片进行OCR的结果、提取文本、在提取图片OCR，将文本与OCR的结果进行按原顺序作为该页的文本内容。</p><pre><code>[{'save_path': '','data': [{'text': 'p=$26500:(0.905)','confidence': 0.8825955390930176,'text_box_position': [[3, 4], [170, 2], [171, 14], [3, 16]]},{'text': '1.1','confidence': 0.9956590533256531,'text_box_position': [[285, 3], [313, 3], [313, 15], [285, 15]]}]}]</code></pre><h3 id="2整个pdf全页都进行渲染">2、整个PDF全页都进行渲染</h3><p>  将PDF中每一页都进行渲染为高清位图，再对每一页进行OCR。但这将导致计算量飙升，原本800页中只有10%存在图片即需要OCR的只有80页，但这种<strong>简单粗暴</strong>的方式导致OCR计算量直接翻十倍。极端情况下可能及只有一两页文档存在图片，但此方案还是会将整个文档的<strong>每页都提交OCR</strong>，导致PDF解析速度严重缓慢，图片DPI为200-300。</p><h3 id="3只对pdf中的含图页进行渲染">3、只对PDF中的“含图页”进行渲染</h3><p>  在本方案中通过快速扫描PDF定位PDF中哪些页数存在图片，对这些存在图片的当前页进行渲染然后进行OCR。这样将尽可能得平衡OCR的准确率与效率，极大的降低OCR次数，释放更多性能。</p><center>  <img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1753193513327.png" alt="描述性文字" width="450px" height="590px"></center><p>  上图为对存在图片的该页渲染后得到的图片，对该图片直接进行OCR得到的结果比使用方案一对位图处理后OCR的结果还要好：</p><pre><code> {'text': 'p = $26 500 (0.905)m', 'confidence': 0.9309449195861816,'text_box_position': [[738, 2136], [1272, 2121], [1275, 2200], [740, 2215]]},    {'text': '(1.1)', 'confidence': 0.9146772623062134, 'text_box_position': [[1593, 2138], [1706, 2138], [1706, 2204], [1593, 2204]]}</code></pre><p>  在此方案中由于只整页进行OCR可以直接把OCR结果作为提取到的该页文本内容。而按方案一的方式需要对<strong>提取文本、提取图片进行OCR的结果、提取文本、在提取图片OCR</strong>，将文本与OCR的结果进行按原顺序作为该页的文本内容。<br />  本方案的图片肯定会比方案一大很多，但由于OCR的次数是固定一次的，方案一图片可能会小一点但其图片数量比较多其整体性能也不一定会很高。</p><pre><code>import fitz  # PyMuPDF                def get_result(self):    &quot;&quot;&quot;获取pdf文件提取结果    &quot;&quot;&quot;    t0 = time.perf_counter()    self.extract_text()    self.extract_images()    for inx,item in enumerate(self.text_list):        if str(item).startswith('img_'):            if self.ocr_result:                ocr= self.ocr_result.pop(0)                self.text_list[inx]=ocr                logger.info(f&quot;ocr:{self.ocr_result},images:{len(self.images_list)},txt:{len(self.text_list)}&quot;)            elapsed = time.perf_counter() - t0    logger.success(f&quot;全部提取完成，耗时 {elapsed:.2f} 秒&quot;)</code></pre><h3 id="性能对比">性能对比</h3><p>  这里选择了一个使用了**《程序员的数学.pdf》**进行解析提取文档中的文本信息以对比三种方案的性能，整个文档883页这里只解析200页内容用于性能对比。这里渲染出进行OCR的图片大小从500KB到2MB不等。</p><table><thead><tr><th>序号</th><th>方案</th><th>文档页数</th><th>OCR次数(图片数)</th><th>耗时(秒)</th><th>说明</th></tr></thead><tbody><tr><td>1</td><td>位图OCR</td><td>200</td><td>&gt;=200</td><td>-</td><td>根据文档情况OCR次数可能最多(一页包含多张图片)</td></tr><tr><td>2</td><td>每页OCR</td><td>200</td><td>200</td><td>343.43</td><td>不管存不存在图片一律进行图片OCR</td></tr><tr><td>3</td><td>只对图片页OCR</td><td>200</td><td>139</td><td>223.85</td><td>OCR次数最少</td></tr></tbody></table><p>  由于本文所使用的PDF为数学书籍包含比较多的<strong>数学公式、图表</strong>等因此包含了大量图片所以方案三和方案二的区别不是特别明显，但在图片很少的场景下两者就会有巨大的差别。存在<strong>极端情况</strong>PDF是扫描件，全部是图片<strong>方案三</strong> <strong>退化</strong>为<strong>方案二</strong>，但整体看来方案三性能还是会好过方案二。</p>]]>
                    </description>
                    <pubDate>Wed, 23 Jul 2025 08:37:45 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[详解智能体应用——资讯简报智能体]]>
                    </title>
                    <link>http://www.solinx.cn/archives/202507070000</link>
                    <description>
                            <![CDATA[<p>  在智能体爆发的浪潮中，信息的获取与处理效率无论是对企业亦或是个人都是保持竞争力的关键。面对日益分散和爆炸式增长的信息源，常常极易使人沉迷其中，陷入碎片化消耗陷阱，时间萧然流失。本文将深度剖析一个智能体的构建的全自动 AI 资讯简报智能体，从<strong>架构设计、技术实现</strong>和<strong>应用价值</strong>三个层面，揭示如何打造一个可扩展、高效率的智能信息处理智能体。</p><center>  <img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/report_1751629912294.png" alt="描述性文字" width="450px" height="590px"></center><center>精简版简报</center><hr /><h3 id="一-架构设计解构智能体应用"><strong>一、 架构设计：解构智能体应用</strong></h3><p>  本文智能体是一个垂直类智能体。系统的核心并非依赖于一个无所不能的“超级智能体”，而是采用了一种“分而治之”的多智能体协作架构。通过此设计模式尽可能智能体的可靠性、稳定性，并为未来的扩展和维护奠定了坚实基础。</p><center>  <img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1751630029594.png" alt="描述性文字" width="600px" height="490px"></center><center>智能体架构图</center><h4 id="1-核心理念三层分离式工作流"><strong>1. 核心理念：三层分离式工作流</strong></h4><p>  整个系统可以被清晰地划分为三个逻辑层次，构成了一个完整的“采集-处理-整合”智能体流水线：</p><ul><li><p><strong>采集Agent (Collection Agent)</strong>：此层由一个 <code>ParallelAgent</code> 容器和多个并行的“采集智能体”（如 <code>ithome_agent</code>, <code>reddit_agent</code> 等）组成。每个采集智能体专注于一个独立的数据源。</p><ul><li><strong>高并发性</strong>：所有数据源的获取任务同时启动，极大地缩短了总耗时。</li><li><strong>故障隔离</strong>：单个数据源的失败（如网站无法访问）不会影响其他智能体的正常工作，增强了系统的鲁棒性。</li></ul></li><li><p><strong>处理Agent (Processing Agent)</strong>：这一层实际上内嵌于每个采集智能体之中。在获取原始数据后，智能体利用其内置的 LLM 和指令，立即对数据进行独立的预处理，包括<strong>内容摘要、语言翻译、质量筛选</strong>等。</p><ul><li><strong>分布式处理</strong>：将处理压力分散到各个独立的智能体中，避免了中心化的处理瓶颈。</li><li><strong>专业化分工</strong>：每个智能体可以根据其数据源的特性，应用不同的处理规则（例如，Reddit 的内容需要翻译，而中文内容则不需要），实现了精细化控制。</li></ul></li><li><p><strong>整合Agent (Aggregation Agent)</strong>：此层由一个 <code>SequentialAgent</code> 容器中的“整合智能体”（<code>MergerAgent</code>）负责。它作为流水线智能体的最后一环，等待所有采集/处理任务完成后，接收所有中间结果，并执行最终的<strong>分类、格式化和报告生成</strong>。</p><ul><li><strong>关注点分离</strong>：整合智能体只关心最终的呈现逻辑，不关心数据从何而来，实现了业务逻辑的清晰分离。</li><li><strong>统一出口</strong>：所有分散的数据在这里汇集成一个统一、规范的最终产物（HTML报告）。</li></ul></li></ul><h4 id="2-编排模式并行与串行结合"><strong>2. 编排模式：并行与串行结合</strong></h4><p>  系统通过 并行Agent[<code>ParallelAgent</code>] 和 串型Agent<code>SequentialAgent</code> 的组合，实现了对复杂工作流的优雅编排。系统清晰地定义描述了整个业务流程：首先并行执行所有采集任务，然后串行执行整合任务。这种编排方式兼具效率与逻辑的清晰性。</p><hr /><h3 id="二-技术实现剖析核心组件"><strong>二、 技术实现：剖析核心组件</strong></h3><p>  通过多智能体的融合，实现了高效、可靠、灵活的智能体。</p><h4 id="1-核心框架"><strong>1. 核心框架</strong></h4><p>  LangGraph或类似智能体框架是整个系统的基石。此框架非一个简单的 LLM API 封装，其是一个完整的智能体开发框架，负责处理：</p><ul><li><strong>状态管理 (<code>CallbackContext</code>)</strong>：在不同的智能体和执行轮次之间传递数据（如 <code>_time</code> 变量和各智能体的 <code>output_key</code> 结果）。</li><li><strong>智能体编排</strong>：提供 <code>SequentialAgent</code> 和 <code>ParallelAgent</code> 等高阶智能体，让开发者可以像搭积木一样组合复杂的业务逻辑。</li></ul><h4 id="3-工具与服务的解耦mcp-的妙用"><strong>3. 工具与服务的解耦：MCP 的妙用</strong></h4><p>  <code>MCP</code>服务在系统中充当的是数据源的角色，智能体通过请求某个MCP或MCP中的某个Tool获取资讯信息。</p><ul><li>智能体只知道它有一个名为 <code>News</code> 的MCP工具集，并可以调用其中的功能。</li><li>它完全不关心该MCP服务是如何实现资讯抓取的。</li><li><strong>优势</strong>：MCP工具服务可以被独立开发、测试、部署和扩展，甚至可以用完全不同的编程语言实现，极大地提升了系统的模块化程度和可维护性。</li></ul><h4 id="4-提示词工程-prompt-engineering"><strong>4. 提示词工程 (Prompt Engineering)</strong></h4><p>  如果说 Agent框架 是骨架，那么提示词就是灵魂。该项目展示了多种高级提示词技巧：</p><ul><li><strong>角色化指令 (Role-based Instruction)</strong>：每个智能体都被赋予了清晰的身份、目标和行为准则，确保其输出稳定且符合预期。</li><li><strong>动态模板注入 (Dynamic State Injection)</strong>：提示词中的 <code>{_time}</code> 和 <code>{ithomeResult?}</code> 占位符展示了 Agent框架 的状态注入能力。这使得提示词不再是静态文本，而是能与程序运行时状态交互的动态模板。</li><li><strong>提示词即模板 (Prompt as Template, PaT)</strong>：这是最亮眼的一点。整合智能体直接将一个完整的 HTML 结构作为指令的一部分，要求 LLM 将数据填充进去。这种方法将复杂的 UI 生成逻辑完全委托给了 LLM，极大地简化了代码，开发者无需再使用传统的模板引擎（如 Jinja2），展示了 LLM 在内容生成领域的潜力。</li></ul><h4 id="5-自动化调度apscheduler"><strong>5. 自动化调度：APScheduler</strong></h4><p>  <code>APScheduler</code> 的引入，完成了从“手动脚本”到“无人值守自动化服务”的最后一跃。<code>AsyncIOScheduler</code> 与 智能体应用 的无缝集成，确保了智能体服务的调度和自动化。</p><hr /><h3 id="三-应用价值与未来展望"><strong>三、 应用价值与未来展望</strong></h3><p>  目前应用是个人工具类应用智能体或只是一个技术演示智能体，后续可根据需要扩展。</p><h4 id="1-当前应用价值"><strong>1. 当前应用价值</strong></h4><ul><li><strong>企业情报自动化</strong>：可直接应用于市场动态监测、竞品分析、行业新闻聚合等场景，为决策者提供及时、精准的信息支持。</li><li><strong>高度可定制化</strong>：无论是信息源（添加新工具）、处理逻辑（修改提示词），还是输出格式（修改HTML模板），都可以轻松定制，满足不同团队和个人的特定需求。</li></ul><h4 id="2-未来的扩展"><strong>2. 未来的扩展</strong></h4><ul><li><strong>集成内部系统</strong>：除了公开网站，工具集可以扩展为连接企业内部系统，如 gitea、GitLab 、内部OA等，实现内部信息的自动总结与报告。</li><li><strong>增加决策与行动能力</strong>：整合智能体不仅可以生成报告，还可以被赋予更高级的指令，如“分析新闻情绪，如果发现重大负面舆情，则调用 API 发出告警”亦或是“实现公司内部信息的流转”从而实现从“信息处理”到“智能决策与行动”的跨越。</li><li><strong>引入交互式分析</strong>：系统可扩展为一个交互式机器人。用户在收到简报后，可以追问“详细介绍一下关于小米的新闻”，系统会触发特定智能体进行深度信息挖掘，实现人机协同的闭环分析。</li></ul><h3 id="总结"><strong>总结</strong></h3><p>  上文展示了如何构建下一代智能应用及其架构。它通过<strong>并行、串行、多智能体的组合</strong>，诠释了AI工程化的常见模式。本文所述智能体架构可作为后续可扩展、可定制的智能体开发的样板，后续应用开发也将围绕着多智能体的协作与编排而展开。</p>]]>
                    </description>
                    <pubDate>Mon, 07 Jul 2025 08:40:20 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[AI工作流与智能体的人机协作及应用]]>
                    </title>
                    <link>http://www.solinx.cn/archives/202506160000</link>
                    <description>
                            <![CDATA[<p>      AI正改变着各行各业，从内容创作到客户服务、知识问答等AI的应用日益广泛。为了更有效的利用AI，通常需要构建智能体或其初级形式的<strong>workflow</strong>。但在目前阶段无论是智能体亦或许Workflow都无法保证其自动运行能达到100%的可靠性，根源在于大模型存在着下面的一些问题：<strong>幻觉问题、工具调用的可靠性、训练数据未覆盖</strong>等。在引入RAG知识库后也未能够完全杜绝上面所说的问题。<br />      既然AI自动化不能够100%保证可靠性，如果人在某个阶段介入进去是不是就会一定程度上提高其可靠性，这也就是人机协作。通过在Workflow或智能体（Agent）某些阶段要求人为介入进行审核或调整从改变智能体执行流程或改变其内容，将在一定程度上提高其可用性。<br />      下面将通过理论、HITL在<strong>workflow应用模式</strong>以及一个内容生成的应用中介绍<strong>HITL在AI工作流的使用</strong>示例。</p><h3 id="hitl人在环中">HITL(人在环中)</h3><p>       <strong>HITL(Human-in-the-Loop)人在环中</strong> ，将人类引入智能体的关键节点从而达到人机协同的闭环。引入HITL的具体原因如下：<br />       <strong>1、风险控制：</strong> 人作为最终的决策守门员<br />       <strong>2、知识补充校正：</strong> 提供领域知识弥补AI知识盲区<br />       <strong>3、驱动模型迭代进化</strong></p><p>      在不同阶段都可引入HITL，在模型训练阶段可以引入HITL对进行数据标注、校正偏见，在执行阶段通过HITL进行输出审核，在决策阶段通过HITL进行风险控制。<br />      HITL最终能达到的作用包括如下：<br />      <strong>1、抑制幻觉与错误：</strong> 通过专家介入纠正模型幻觉<br />      <strong>2、责任清晰化：</strong> 如医疗诊断书的签署、法律文书的生成都需要人工去做决策<br />      <strong>3、提升信任度：</strong> 流程的关键节点都是有专家参与监督的，而不是完全自动化的</p><h3 id="hitl应用">HITL应用</h3><p>      在这里主要介绍在Workflow中引入HITL对工作流的某些节点输出进行一定程度的干预。HITL在workFLow中的具体实现也会根据业务性质有所不同，这里只简单介绍三种比较简单的HITL应用模式。</p><p>      <strong>1、在关键流程前插入人工决策节点</strong><br />      在关键业务流程执行前插入人工决策节点，由领域专家人员决定是否继续执行后续流程或重新开始执行，适用于高风险操作如金融交易、医疗诊断等场景。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1749995650732.png" alt="" /></p><p>      <strong>2、对关键输出后插入人工审核节点</strong></p><p>      在workflow工作流的某个关键节点后加入人工审核环节，确保结果准确性，适用于内容生成、文档处理、法律文书生成等质量敏感场景。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1749995675642.png" alt="" /></p><p>      <strong>3、在节点输出置信度低于某个阈值时请求人工介入</strong><br />      在workflow工作流中加入置信度检测节点当置信度低于设定阈值时自动请求人工介入，平衡效率与准确性，适用于客服系统、图像识别等AI不确定性较高的场景。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1749995690807.png" alt="" /></p><p>      当然上面只是三个比较简单HITL应用模型，实际场景中应用HITL可能需要详细分析workflow流程才能确定哪个环节需要人工的介入。</p><h3 id="基于hitl的文章生成工作流">基于HITL的文章生成工作流</h3><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1749995719832.png" alt="" /></p><p>      如下的流程图画出了AI辅助文章撰写的全流程，包括主题定义、大纲生成、初稿撰写、人工审核及最终润色优化，其中初稿审核也就是我们本文所说的HITL，也就是人工介入的节点。</p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1749995760677.png" alt="" /><br /><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1749995779943.png" alt="" /></p><p>      这里的文章撰写智能体在用户提供主题后生成大纲、接着编写文章初稿后提示审核或编辑草稿，后再进行风格优化后生成最终文章。这里只在草稿生成后提供了人工介入，只要需要也可以在大纲编写完成后就进行人工介入，对大纲不满意可以打回让模型再生成一次大纲。<br />      也有人会认为人为介入多了这还算是人工智能？在目前阶段有些AI工作流/智能体应用如果你对质量、可靠性要求非常高就很难做到得完全的0介入。按照自动驾驶的分级来看Agent<strong>目前也只是处于L2级别的Agent</strong>，距离L3级别Agent还有相当长一段时间。当前汽车也只是辅助驾驶，也做不到完全0介入，国内无驾驶员的示范运营区后台也有着人工在出现问题时介入。</p>]]>
                    </description>
                    <pubDate>Mon, 16 Jun 2025 08:43:00 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[开发ESP32大模型AI语音助手-从软件到硬件]]>
                    </title>
                    <link>http://www.solinx.cn/archives/2025052600001</link>
                    <description>
                            <![CDATA[<p>      去年底开始基于ESP32开发DIY的各种AI语音智能助手层出不穷，AI智能玩偶也比较火热。目前市面上也都有比较成熟的开发板集成了各种模块麦克风、OLED、功放、摄像头等几乎是开箱即用，普通开发者买了折腾一通总能搞点什么出来，当然对于批量推出市场的使用这种开发板成本比较高，通常比较少人这么用。</p><p>      目前市面上很多此类DIY项目都是服务端基于小智的魔改、小智的设备端固件使用官方开源版本。其ESP32固件使用的是C<ins>开发对于不熟悉C</ins>的人来二次开发改造说难度太大。</p><center><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1748143630447.png"></center><p>      本文所DIY的语音助手设备端使用的是MicroPython、服务端是Python，对于很多开发者来说MicroPython入门没难度。但其性能、稳定性和C++开发的没法比，对于DIY的小玩具这已经基本够了。下面分别介绍整体架构、设备端流程、服务端流程等。</p><h3 id="架构与流程">架构与流程</h3><p>      基于ESP32 (MicroPython) 开发的固件和 Python服务端，最基本的主要组件有：音频采集、VAD检测、ASR识别、大模型、TTS 服务、WebSocket通讯等。下面将给出设备端与服务端的整体架构图以及整个平台的各个阶段完整数据流程，具体如下图所示。</p><center><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1748143651810.png">系统架构图</center>  <center><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1748143675711.png">  <p>数据流描述</center></p><h3 id="服务端">服务端</h3><center><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1748143711319.png">系统架构图</center>   <p>      Python服务端提供WebSocket服务，整个架构基于异步编程模型，层次清晰，模块解耦，具有良好的扩展性和维护性。目前除了大模型没有采用流式输出，其他服务调用均采用流式处理技术，实现了低延迟的实时语音交互体验。</p><center><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1748143735764.png">流程图</center>  <p>      WebSocket服务层作为最上层，负责网络通信和连接管理，在指定端口提供WebSocket服务，支持双向实时通信和消息路由。<br />      业务处理层是核心逻辑层，包含三个关键模块：Connection Handler负责管理每个客户端连接的生命周期；消息处理器实现了文本和二进制消息的解析与路由；异步任务管理器则协调各个AI服务的并发调用。<br />      AI服务集成层整合了四大AI能力：VAD进行语音活动检测；ASR和TTS均采用火山引擎服务，分别负责语音识别和语音合成；LLM使用DeepSeek实现智能对话生成。外部API服务层统一管理第三方服务调用，包括火山引擎API、DeepSeek API和PyTorch Hub。</p><h3 id="设备端">设备端</h3><p>      ESP32-S3硬件层包含INMP441麦克风负责音频采集、MAX98357功放实现音频播放、OLED显示屏提供状态反馈。<br />      驱动层封装了I2S音频接口实现音频数据的读写，异步WebSocket客户端处理网络通信，OLED驱动支持滚动显示功能。<br />      业务层的VoiceRecorder模块管理音频采集流程，使用deque队列缓冲音频数据，消息处理模块负责协议解析和数据路由。<br />      应用层通过异步任务管理器协调各模块运行，主控制逻辑处理系统状态和异常。架构充分考虑了嵌入式系统的资源限制，采用异步编程模型提高了系统效率和响应速度。</p><center><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1748145215894.png">  架构图</center>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ESP32-S3业务流程分为主流程和异步任务两部分并行执行。主流程从系统启动开始，依次完成硬件初始化、建立WebSocket连接、创建异步任务，然后进入事件循环等待任务完成，最后进行异常处理和资源清理。  异步任务&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、WebSocket处理任务负责维护网络连接、接收服务器消息并分发处理；  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、I2S音频读取任务持续从麦克风采集16kHz音频数据并通过WebSocket实时发送。  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;两个任务通过共享的数据队列和WebSocket连接进行协作，形成了完整的音频采集-传输-播放循环。整个流程采用异步并发模式，确保音频采集不会被网络操作阻塞，同时支持自动重连机制保证系统稳定性。  <center><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1748145255935.png">  流程图</center><p>      目前面向个人市场推出此类玩具或助手等最大的难点应该是外观设计与销售渠道，技术实现目前都比较成熟，要推To B靠的就是某些特殊渠道关系了。</p>]]>
                    </description>
                    <pubDate>Mon, 26 May 2025 08:50:30 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[小玩具：ESP32——刷固件与亮屏]]>
                    </title>
                    <link>http://www.solinx.cn/archives/小玩具：ESP32——刷固件与亮屏</link>
                    <description>
                            <![CDATA[<p>      去年开始大模型火爆后也带动了ESP32芯片的爆发出圈带动股票暴涨。各种AI玩具层出不穷。ESP32的低门槛再加上B站UP的带动，光开源的小智AI两月就带动了10万AI设备，当然这和原来的智能音箱如小爱同学比只能算是毛毛雨，而且门槛很低智能音箱厂商发个OTA或新出个版本也就接入大模型了，而且大厂生态更完整，小米智能家居就是国内独一份的存在。<br />      AI玩具或许是个大市场，三五十块钱大部分买了小孩子估计也就玩个半月就吃灰，但市场足够大。还有就是像笔者这样的爱好者折腾个几个月哪天忘了也就吃灰了。</p><h3 id="esp32模组">ESP32模组</h3><p>      CPU 和片上存储器<br />      • 内置 ESP32-S3 系列芯片，Xtensa® 双核 32 位 LX7 微处理器 (支持单精度浮点运算单元)，支持 高达 240 MHz 的时钟频率<br />      • 384 KB ROM<br />      • 512 KB SRAM<br />      • 16 KB RTC SRAM<br />      • 最大 16 MB PSRAM<br />      • GPIO、SPI、LCD、Camera 接口、UART、I2C、I2S等</p><p>      单买新品目前38块左右，从去年底爆火涨价了。你直接买芯片还没法直接用，还需要自己去打板比较麻烦。普通玩家直接买ESP32开发板就好了，目前市面上各种各样的ESP32开发板，或直接买乐鑫的开发板，当然价格自然也不是三十多块。要成本更低还可以使用更低端的芯片。</p><h3 id="烧录">烧录</h3><p>      ESP32烧录固件非常方便直接使用USB将开发板连接到电脑即可通过串口烧录固件。烧录固件有多种方式，除了可以使用官方提供的flash_download_tool与esptool固件烧录工具还可以使用如Thonny、esp-launchpad等第三方烧录工具，这里使用esptool烧录固件。<br />      现在买的很多开发板都内置了小智的固件，这里刷的是MicroPython 固件。</p><pre><code>安装esptoolpip install esptool</code></pre><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1745686669742.png" alt="image.png" /></p><p>      ESP32开发板连接到电脑后在Windows的设备管理器中可以看如下信息，端口(COM和LPT)处可看到连接的串口设备USB-SERIAL CH340(COM4)使用的端口为COM4。此处的端口需要记住，下面刷固件需要用到此端口。</p><p>      下载 ESP32S3 的 MicroPython 固件<br />      <a href="https://micropython.org/download/ESP32_GENERIC_S3/">https://micropython.org/download/ESP32_GENERIC_S3/</a></p><p>      在Linux中端口是这种形式：/dev/ttyUSB或/dev/ttyACM0，这里是windows所以--port 值是 COM4</p><p>      读取ESP32芯片信息，可以看到芯片的PSRAM、频率、支持WIFI、蓝牙、MAC地址等数据。</p><p><code>esptool --chip esp32s3 -p COM4 chip_id</code></p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1745686685149.png" alt="image.png" /></p><pre><code>esptool.py v4.8.1Serial port COM4Connecting.....Chip is ESP32-S3 (QFN56) (revision v0.2)Features: WiFi, BLE, Embedded PSRAM 8MB (AP_3v3)Crystal is 40MHzMAC: d8:3b:da:6e:cb:0cUploading stub...Running stub...Stub running...Warning: ESP32-S3 has no Chip ID. Reading MAC instead.MAC: d8:3b:da:6e:cb:0cHard resetting via RTS pin...</code></pre><p>读取设备SPI flash信息</p><pre><code>esptool --chip esp32s3 --port COM4 flash_idesptool.py v4.8.1Serial port COM4Connecting.....Chip is ESP32-S3 (QFN56) (revision v0.2)Features: WiFi, BLE, Embedded PSRAM 8MB (AP_3v3)Crystal is 40MHzMAC: d8:3b:da:6e:cb:0cUploading stub...Running stub...Stub running...Manufacturer: c8Device: 4018Detected flash size: 16MBFlash type set in eFuse: quad (4 data lines)Flash voltage set by eFuse to 3.3VHard resetting via RTS pin...</code></pre><p>在刷固件前先清除板内原有固件</p><p><code>Esptool --chip esp32s3 --port COM4 erase_flash</code></p><p>如有需要还可先备份固件：read_flash &lt;起始地址&gt; &lt;结束地址或大小&gt; &lt;完整备份文件路径&gt;  ALL:自动检测闪存大小</p><p><code>esptool --chip esp32s3 --port COM3 read_flash 0x0 ALL C:\path\to\backup\firmware_backup.bin</code></p><h3 id="亮屏">亮屏</h3><p>      在<a href="https://github.com/AntonVanke/MicroPython-uFont下载中文字体上传到ESP32中，按SSD1306驱动芯片方法轻松点亮屏幕，需要注意的是scl与sda的接线引脚，以及屏幕的分辨率，分辨率对不上可能会导致显示异常。">https://github.com/AntonVanke/MicroPython-uFont下载中文字体上传到ESP32中，按SSD1306驱动芯片方法轻松点亮屏幕，需要注意的是scl与sda的接线引脚，以及屏幕的分辨率，分辨率对不上可能会导致显示异常。</a></p><p><img src="https://linx-1252778925.cos.ap-chengdu.myqcloud.com/image_1745686709799.png" alt="image.png" /></p><p>      亮屏仅仅是第一步，后续怎么能把ESP32玩出花样才是关键。作为所谓AI物联网神器能做的太多。</p><p>参考资料：<a href="https://docs.espressif.com/projects/esptool/en/latest/esp32s3/esptool/">https://docs.espressif.com/projects/esptool/en/latest/esp32s3/esptool/</a></p>]]>
                    </description>
                    <pubDate>Sun, 27 Apr 2025 08:42:56 CST</pubDate>
                </item>
    </channel>
</rss>