<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Posts on AI Pulse</title>
		<link>https://aipulse.lol/posts/</link>
		<description>Recent content in Posts on AI Pulse</description>
		<generator>Hugo</generator>
		<language>zh-CN</language>
		
		
		
		
			<lastBuildDate>Mon, 22 Jun 2026 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://aipulse.lol/posts/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>AI 学习路线图：从会用 Agent 到理解底层原理</title>
				<link>https://aipulse.lol/posts/ai-learning-path/</link>
				<pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate>
				<guid>https://aipulse.lol/posts/ai-learning-path/</guid>
				<description>&lt;h2 id=&#34;先说结论&#34;&gt;先说结论&lt;/h2&gt;&#xA;&lt;p&gt;如果你是有编程经验的工程师，&lt;strong&gt;不要从数学开始&lt;/strong&gt;。那条路适合做研究的人。&lt;/p&gt;&#xA;&lt;p&gt;工程师学 AI 的正确顺序是：&lt;strong&gt;先用爽 → 再理解 → 再动手 → 再追前沿&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;h2 id=&#34;第一层学会用第-1-2-周&#34;&gt;第一层：学会用（第 1-2 周）&lt;/h2&gt;&#xA;&lt;p&gt;这层你已经在了。用 Claude、ChatGPT、Cursor 日常写代码、查文档、debug。&lt;/p&gt;&#xA;&lt;p&gt;但要更进一步——&lt;strong&gt;从&amp;quot;聊天&amp;quot;到&amp;quot;工程化使用&amp;quot;&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;h3 id=&#34;学什么&#34;&gt;学什么&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Prompt 结构化&lt;/strong&gt;：不是 &amp;ldquo;帮我写个函数&amp;rdquo;，而是给角色、给约束、给输出格式&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;System Prompt&lt;/strong&gt;：理解 system / user / assistant 三种消息的区别&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Few-shot prompting&lt;/strong&gt;：给 2-3 个例子，效果远超零样本&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Chain-of-Thought&lt;/strong&gt;：让模型 &amp;ldquo;一步步思考&amp;rdquo;，复杂推理任务的关键技巧&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;实践&#34;&gt;实践&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;任务：用 Claude 的 system prompt 写一个&amp;#34;代码审查员&amp;#34;角色，&#xA;要求它审查你的代码时只关注安全漏洞和性能问题，忽略风格问题。&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;资源&#34;&gt;资源&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview&#34;&gt;Anthropic Prompt Engineering Guide&lt;/a&gt; — 目前最好的提示工程文档&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://platform.openai.com/docs/guides/prompt-engineering&#34;&gt;OpenAI Prompt Engineering&lt;/a&gt; — 互补视角&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;第二层理解原理第-3-6-周&#34;&gt;第二层：理解原理（第 3-6 周）&lt;/h2&gt;&#xA;&lt;p&gt;不需要手推反向传播，但要搞清楚：&lt;/p&gt;&#xA;&lt;h3 id=&#34;21-transformer-怎么工作的&#34;&gt;2.1 Transformer 怎么工作的&lt;/h3&gt;&#xA;&lt;p&gt;注意力机制是当代 AI 的基石。推荐两个资源：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;资源&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;类型&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;时间&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://jalammar.github.io/illustrated-transformer/&#34;&gt;The Illustrated Transformer&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;图文教程&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;30 min&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Karpathy &lt;a href=&#34;https://www.youtube.com/watch?v=kCc8FmEb1nY&#34;&gt;Let&amp;rsquo;s build GPT from scratch&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;视频（写代码）&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2h&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Karpathy 这个视频&lt;strong&gt;必看&lt;/strong&gt;。他带着你从零写一个 GPT，过程中你会理解 tokenization、embedding、self-attention、multi-head attention、生成过程。不需要 GPU，纯 Python 就能跑。&lt;/p&gt;</description>
			</item>
			<item>
				<title>从零到上线：一台 VPS 搭建个人技术博客全记录</title>
				<link>https://aipulse.lol/posts/from-zero-to-blog/</link>
				<pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate>
				<guid>https://aipulse.lol/posts/from-zero-to-blog/</guid>
				<description>&lt;h2 id=&#34;缘起&#34;&gt;缘起&lt;/h2&gt;&#xA;&lt;p&gt;我有一台闲置的 VPS（1 核 1G 内存，19G 硬盘），上面跑着 Hysteria2 代理。某天突发奇想——我能不能在这台机器上搭一个个人技术博客？&lt;/p&gt;&#xA;&lt;p&gt;答案是能。而且做完之后发现整套流程踩了不少坑，值得记录。&lt;/p&gt;&#xA;&lt;h2 id=&#34;起点一台看不见的服务器&#34;&gt;起点：一台&amp;quot;看不见&amp;quot;的服务器&lt;/h2&gt;&#xA;&lt;p&gt;服务器上跑了什么？先 SSH 上去看看：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;AlmaLinux 9.7（RHEL 9 兼容）&#xA;CPU: 2 vCPU AMD EPYC&#xA;内存: 1 GB（可用 750 MB）&#xA;磁盘: 19 GB（剩余 17 GB）&#xA;开放的 TCP 端口: 仅 22（SSH）&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Hysteria2 只占用了 UDP 443，TCP 80 和 TCP 443 都是空闲的——足够跑一个 Web 服务了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;第一版手写-html&#34;&gt;第一版：手写 HTML&lt;/h2&gt;&#xA;&lt;p&gt;装好 Nginx 后，我手写了三件事：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;一个响应式首页&lt;/strong&gt;：暗色模式自动切换、中文排版优化&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;一篇技术文章&lt;/strong&gt;：《Loop Engineering：AI Agent 时代的控制流设计》&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;CSS&lt;/strong&gt;：无外部依赖，CSS 变量驱动主题&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;这一版很快就上线了，&lt;code&gt;http://104.194.92.198/&lt;/code&gt; 已经可以访问。但问题随之而来。&lt;/p&gt;&#xA;&lt;h2 id=&#34;域名与-https&#34;&gt;域名与 HTTPS&lt;/h2&gt;&#xA;&lt;h3 id=&#34;选域名&#34;&gt;选域名&lt;/h3&gt;&#xA;&lt;p&gt;在 Porkbun 买了 &lt;code&gt;aipulse.lol&lt;/code&gt;（¥40/年），A 记录指向服务器 IP。Porkbun 的 DNS 管理界面有点坑——添加 TXT 记录时 Host 留空而不是填 &lt;code&gt;@&lt;/code&gt;。&lt;/p&gt;</description>
			</item>
			<item>
				<title>防止密钥泄露：给 Git 加一个 pre-commit 扫描钩子</title>
				<link>https://aipulse.lol/posts/git-secret-scan/</link>
				<pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate>
				<guid>https://aipulse.lol/posts/git-secret-scan/</guid>
				<description>&lt;h2 id=&#34;问题&#34;&gt;问题&lt;/h2&gt;&#xA;&lt;p&gt;搭博客的过程中，我一直在担心一件事：不小心把 API key、服务器密码、SSH 私钥提交到 GitHub。&lt;/p&gt;&#xA;&lt;p&gt;手动检查不靠谱——凌晨三点改完代码、&lt;code&gt;git add -A &amp;amp;&amp;amp; git commit -m &amp;quot;fix&amp;quot; &amp;amp;&amp;amp; git push&lt;/code&gt;，脑子根本不在线。&lt;/p&gt;&#xA;&lt;p&gt;解决方案：&lt;strong&gt;Git pre-commit hook&lt;/strong&gt;，在每次提交前自动扫描密钥，匹配就阻止。&lt;/p&gt;&#xA;&lt;h2 id=&#34;实现&#34;&gt;实现&lt;/h2&gt;&#xA;&lt;p&gt;在项目根目录创建 &lt;code&gt;.githooks/pre-commit&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set -e&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;STAGED&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;git diff --cached --name-only --diff-filter&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;ACM&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; -z &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$STAGED&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; exit &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 高置信度敏感模式&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PATTERNS&lt;span style=&#34;color:#f92672&#34;&gt;=(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;sk-[A-Za-z0-9]{20,}&amp;#34;&lt;/span&gt;              &lt;span style=&#34;color:#75715e&#34;&gt;# OpenAI/Claude/DeepSeek key&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gh[pousr]_[A-Za-z0-9]{36,}&amp;#34;&lt;/span&gt;       &lt;span style=&#34;color:#75715e&#34;&gt;# GitHub token&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AKIA[0-9A-Z]{16}&amp;#34;&lt;/span&gt;                 &lt;span style=&#34;color:#75715e&#34;&gt;# AWS access key&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;BEGIN (RSA|EC|DSA|OPENSSH) PRIVATE KEY&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 私钥&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;(password|passwd|secret)[[:space:]]*[=:][[:space:]]*[&amp;#39;\&amp;#34;][^&amp;#39;\&amp;#34;]+[&amp;#39;\&amp;#34;]&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 明文密码&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 白名单：不应被扫描的文件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WHITELIST&lt;span style=&#34;color:#f92672&#34;&gt;=(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.githooks/pre-commit&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deploy.example.sh&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FOUND&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; file in $STAGED; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; ! -f &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$file&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 跳白名单&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  skip&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; w in &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;WHITELIST[@]&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$file&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; *&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$w&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;* &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; $skip -eq &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 只扫文本文件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  file &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$file&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; | grep -q &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;text&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; IFS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; read -r line; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; p in &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;PATTERNS[@]&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$line&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; | grep -qE &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$p&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;✗ &lt;/span&gt;$file&lt;span style=&#34;color:#e6db74&#34;&gt;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;line:0:80&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        FOUND&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        break&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt; &amp;lt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$file&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; $FOUND -eq &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;⛔ 提交被阻止：检测到疑似密钥&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;确认安全：git commit --no-verify -m &amp;#39;...&amp;#39;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  exit &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;✅ 密钥检查通过&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启用 hook：&lt;/p&gt;</description>
			</item>
			<item>
				<title>Loop Engineering：AI Agent 时代的控制流设计</title>
				<link>https://aipulse.lol/posts/loop-engineering/</link>
				<pubDate>Sun, 21 Jun 2026 00:00:00 +0000</pubDate>
				<guid>https://aipulse.lol/posts/loop-engineering/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; — 当 AI Agent 不再是&amp;quot;一问一答&amp;quot;的推理函数，而是持续运行的自主实体，控制流设计就从软件工程的边角料变成了核心命题。Loop Engineering 是关于如何在 AI Agent 系统中设计、组合和调度循环的一套工程模式。本文梳理了 loop-until-dry、budget-aware loop、pipeline scheduling 等核心模式，以及它们在实际系统（如 Claude Code）中的应用。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;1-为什么需要-loop-engineering&#34;&gt;1. 为什么需要 Loop Engineering？&lt;/h2&gt;&#xA;&lt;p&gt;传统的 LLM 调用是一次性的：用户输入 prompt，模型返回结果，对话结束。但在 AI Agent 系统中，模型不再是回答一个问题就退出的函数，而是一个持续运行的&lt;strong&gt;自主实体&lt;/strong&gt;。它需要反复调用工具、评估结果、调整策略，直到任务完成——或者预算耗尽。&lt;/p&gt;&#xA;&lt;p&gt;这带来了一个根本性的架构挑战：&lt;strong&gt;如何设计控制流，让 Agent 在不确定的环境中高效、可靠地运行？&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;具体来说，Agent 循环面临三类核心问题：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;终止条件&lt;/strong&gt;：Agent 什么时候应该停下来？怎么判断任务是否真的完成了，而不是卡在死循环里？&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;资源约束&lt;/strong&gt;：每次循环都消耗 tokens（也就是钱和时间），如何在预算内最大化产出？&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;并行调度&lt;/strong&gt;：多个 Agent 或子任务如何编排？什么时候该等，什么时候该流水线？&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Loop Engineering&lt;/strong&gt; 就是回答这些问题的工程实践。它的核心不是某一种具体算法，而是一套&lt;strong&gt;可组合的控制流原语&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;h2 id=&#34;2-核心模式&#34;&gt;2. 核心模式&lt;/h2&gt;&#xA;&lt;h3 id=&#34;21-loop-until-dry穷尽式发现&#34;&gt;2.1 Loop-Until-Dry：穷尽式发现&lt;/h3&gt;&#xA;&lt;p&gt;最常见的一个场景：你需要 Agent 找到代码库中&amp;quot;所有的 bug&amp;quot;。但 bug 的数量是未知的——你不知道该让 Agent 跑多少轮。固定轮次太少（漏报）或太多（浪费）。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Loop-until-dry&lt;/strong&gt; 是答案：不断启动新的发现轮次，直到连续 K 轮没有新发现为止。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;seen&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Set&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;dry&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;dry&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CONVERGENCE_THRESHOLD&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;findings&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;agent&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Find bugs in the codebase.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fresh&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;findings&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;filter&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seen&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;has&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;fresh&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;dry&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;dry&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;fresh&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;forEach&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;seen&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;verify&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;fresh&lt;/span&gt;)  &lt;span style=&#34;color:#75715e&#34;&gt;// 验证新发现&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个模式的关键细节：&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
