<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Levin&#039;s Blog-林壽山的c# .net奇幻旅程</title>
	<atom:link href="https://superlevin.ifengyuan.tw/feed/" rel="self" type="application/rss+xml" />
	<link>https://superlevin.ifengyuan.tw</link>
	<description>大型網站架構．.net 架構師．rabbitMQ．redis．行動開發．APP開發教學．PHP Laravel開發．.net core C# 開發．架構師之路．Delphi開發．資料庫程式．進銷存．餐飲POS系統</description>
	<lastBuildDate>Fri, 16 Oct 2026 09:32:26 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
	<item>
		<title>用 Claude Code Mods 打造你的專屬小幫手</title>
		<link>https://superlevin.ifengyuan.tw/%e7%94%a8-claude-code-mods-%e6%89%93%e9%80%a0%e4%bd%a0%e7%9a%84%e5%b0%88%e5%b1%ac%e5%b0%8f%e5%b9%ab%e6%89%8b/</link>
					<comments>https://superlevin.ifengyuan.tw/%e7%94%a8-claude-code-mods-%e6%89%93%e9%80%a0%e4%bd%a0%e7%9a%84%e5%b0%88%e5%b1%ac%e5%b0%8f%e5%b9%ab%e6%89%8b/#respond</comments>
		
		<dc:creator><![CDATA[林壽山]]></dc:creator>
		<pubDate>Fri, 16 Oct 2026 09:32:26 +0000</pubDate>
				<category><![CDATA[生活雜感]]></category>
		<category><![CDATA[claude code]]></category>
		<category><![CDATA[mods]]></category>
		<guid isPermaLink="false">https://superlevin.ifengyuan.tw/?p=4243</guid>

					<description><![CDATA[先從大同電鍋說起 家裡的大同電鍋，煮好飯會「啪」一聲跳起來。你不用一直盯著它，聽到聲音再去盛飯就好。 用 Cl &#8230; <a href="https://superlevin.ifengyuan.tw/%e7%94%a8-claude-code-mods-%e6%89%93%e9%80%a0%e4%bd%a0%e7%9a%84%e5%b0%88%e5%b1%ac%e5%b0%8f%e5%b9%ab%e6%89%8b/" class="more-link">閱讀全文<span class="screen-reader-text">〈用 Claude Code Mods 打造你的專屬小幫手〉</span></a>]]></description>
										<content:encoded><![CDATA[<h2 data-lfile-container="486d9dd5-ef32-4241-9748-a48c03872c9d" data-pm-slice="1 1 []"><img decoding="async" class="alignnone size-full wp-image-4244" src="http://cdnlevin.yowauction.com//2026/10/飯煮好了！程式也完成了.png" alt="" /></h2>
<h2 id="先從大同電鍋說起" data-lfile-container="486d9dd5-ef32-4241-9748-a48c03872c9d" data-pm-slice="1 1 []">先從大同電鍋說起</h2>
<p>家裡的大同電鍋，煮好飯會「啪」一聲跳起來。你不用一直盯著它，聽到聲音再去盛飯就好。</p>
<p>用 Claude Code 寫程式時，常常也是這種情境：丟一個大任務給 Claude，它要跑個一兩分鐘。你轉頭去回 LINE、倒杯咖啡，結果忘了回來看，它早就做完在等你了。</p>
<p>如果 Claude Code 也能像電鍋一樣「啪」一聲提醒你，是不是很棒？這篇文章就用 Claude Code 新推出的 <strong>mods（模組）</strong> 功能，親手幫它裝上這個「電鍋跳起來」提醒。</p>
<h2 id="mods-是什麼把它想成手機殼">Mods 是什麼？把它想成「手機殼」</h2>
<p>Mod 就是一個小小的 JavaScript 或 TypeScript 檔案，會在你的 Claude Code 工作階段裡執行。就像給手機套個殼、貼個指環支架：手機還是那支手機，但用起來更順手。</p>
<p>它能做的事情主要有三種：</p>
<table>
<colgroup>
<col />
<col />
<col /></colgroup>
<tbody>
<tr>
<th colspan="1" rowspan="1">動作</th>
<th colspan="1" rowspan="1">生活比喻</th>
<th colspan="1" rowspan="1">實際用途</th>
</tr>
<tr>
<td colspan="1" rowspan="1">觀察（Observe）</td>
<td colspan="1" rowspan="1">管理員看監視器，只看不動手</td>
<td colspan="1" rowspan="1">記錄每次檔案修改、每回合結束後讀數據</td>
</tr>
<tr>
<td colspan="1" rowspan="1">改寫（Rewrite）</td>
<td colspan="1" rowspan="1">秘書幫你潤飾信件再寄出</td>
<td colspan="1" rowspan="1">在指令傳下去之前先加工一下</td>
</tr>
<tr>
<td colspan="1" rowspan="1">直接回答（Answer）</td>
<td colspan="1" rowspan="1">門口警衛說「這個不能進」</td>
<td colspan="1" rowspan="1">擋下危險指令，或自己提供一個斜線指令</td>
</tr>
</tbody>
</table>
<p>它的運作方式像工廠的輸送帶：事件（例如「Claude 要執行一個指令」、「一個回合結束了」）會依序經過你的 mod、其他外掛，最後才到 Claude Code 本身。你可以在自己那一站看一眼、改一下，或直接把件抓下來。</p>
<p>Mod 還能畫自己的介面，例如提示列上方的一條資訊帶、右側的面板、或一個彈出的小通知（toast）。需要 Claude Code 2.1.287 以上版本，預設就是開啟的。</p>
<h2 id="動手做電鍋跳起來提醒-mod">動手做：「電鍋跳起來」提醒 mod</h2>
<p>目標很簡單：<strong>Claude 做一件事超過 30 秒，做完時就彈出一個小通知</strong>。太短的任務不吵你，就像煩泡麵不需要開鐘一樣。</p>
<h3 id="懶人做法用說的就好">懶人做法：用說的就好</h3>
<p>你不必先學 API。開啟 <code spellcheck="false">claude</code>，貼上這段話：</p>
<pre spellcheck="false"><code class="language-text">幫我做一個 Claude Code mod，叫做 rice-cooker。
當主要回合花超過 30 秒才完成時，用 toast 彈出提醒：
「<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2668.png" alt="♨" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 飯煮好了！Claude 忙了 N 秒」。
子代理（subagent）的回合不要提醒。</code></pre>
<p>Claude 會問你是否開啟「熱重載（hot reload）」，按允許。這回合結束後 mod 就生效了。之後想改成 60 秒、想換文字，繼續用說的就好。</p>
<h3 id="自己動手看懂背後怎麼運作">自己動手：看懂背後怎麼運作</h3>
<p>想知道 Claude 幫你寫了什麼，或想自己寫，只要四步。</p>
<ol>
<li><strong>建立資料夾</strong>。一個 mod 就是一個普通的外掛（plugin）資料夾：</li>
</ol>
<pre spellcheck="false"><code class="language-text">rice-cooker/
├── .claude-plugin/
│   └── plugin.json
└── hooks/
    ├── hooks.json
    └── rice-cooker.mjs</code></pre>
<p><code spellcheck="false">plugin.json</code> 是外掛的身分證：</p>
<pre spellcheck="false"><code class="language-json">{
  "name": "rice-cooker",
  "version": "0.1.0",
  "description": "長任務完成時，像電鍋一樣提醒你。"
}</code></pre>
<p><code spellcheck="false">hooks.json</code> 告訴 Claude Code 要載入哪個程式檔：</p>
<pre spellcheck="false"><code class="language-json">{ "modules": ["./rice-cooker.mjs"] }</code></pre>
<ol start="2">
<li><strong>寫主程式</strong>。只要監聽「回合結束」這個事件，看花了多久，時間夠長就「啪」一聲：</li>
</ol>
<pre spellcheck="false"><code class="language-javascript">// hooks/rice-cooker.mjs
const LONG_MS = 30_000; // 超過 30 秒才提醒

export function register(on) {
  on("turn.complete", async ($, e, next) =&gt; {
    const result = await next(e);        // 先讓 Claude Code 照常收尾
    if (e.agentId) return result;        // 子代理的回合不理它
    if ((e.durationMs ?? 0) &gt;= LONG_MS) {
      const sec = Math.round(e.durationMs / 1000);
      await $.ui.toast({ text: `<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2668.png" alt="♨" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 飯煮好了！Claude 忙了 ${sec} 秒` });
    }
    return result;
  });
}</code></pre>
<p>這就是前面說的「觀察」：先呼叫 <code spellcheck="false">next(e)</code> 讓事情照常發生，再回頭看一眼結果，完全不干擾 Claude 做事。</p>
<ol start="3">
<li><strong>載入測試</strong>。用這個外掛開一個工作階段：</li>
</ol>
<pre spellcheck="false"><code class="language-shell">claude --plugin-dir ./rice-cooker</code></pre>
<p>資料夾會被監看，每次存檔就自動重載，不用重開。叫 Claude 跑個大一點的任務，例如「幫我整理整個專案的 README」，等它做完就會看到提醒。</p>
<ol start="4">
<li><strong>檢查一下</strong>。<code spellcheck="false">claude plugin validate</code> 會讀你的程式，列出它掛了哪些事件、呼叫了哪些 API：</li>
</ol>
<pre spellcheck="false"><code class="language-shell">claude plugin validate ./rice-cooker</code></pre>
<blockquote><p>小提醒：<code spellcheck="false">$.ui.toast</code> 的參數格式可能隨版本調整。Claude Code 每次載入 mod，都會把你這個版本的型別宣告寫進 <code spellcheck="false">.claude-plugin/types/</code>，以那裡的定義為準。</p></blockquote>
<h2 id="進階玩法與四個好習慣">進階玩法與四個好習慣</h2>
<p>電鍋提醒只是開胃菜。照著同樣的套路，你還可以做這些：</p>
<ul>
<li><strong>油表「剩多少油」</strong>：用 <code spellcheck="false">$.session.usage()</code> 讀出上下文用了多少，在提示列上方畫一條油表。官方範例 Token Weather 就是用「晴、陰、雨、暴風雨」來表示。</li>
<li><strong>牆上的「小心地滑」</strong>：用 <code spellcheck="false">tool.call</code> 攔截 <code spellcheck="false">rm -rf</code>、<code spellcheck="false">git reset --hard</code> 這類危險指令，先問你一句再執行。</li>
<li><strong>團隊家規</strong>：用 <code spellcheck="false">prompt.submit</code> 在每次提問自動附上團隊的程式風格規範。</li>
<li><strong>自訂斜線指令</strong>：用 <code spellcheck="false">$.command.register</code> 加一個 <code spellcheck="false">/午餐</code> 之類的小指令。</li>
</ul>
<p>寫 mod 時，有四個習慣會讓你少踩坑：</p>
<ol>
<li><strong>資料放 <code spellcheck="false">$.state</code>，不放一般變數</strong>。熱重載會重跑一次程式，普通變數會歸零，就像白板被擦掉。</li>
<li><strong>元件屬性在 <code spellcheck="false">e.props</code> 裡</strong>，例如可用寬度 <code spellcheck="false">bodyColumns</code>。</li>
<li><strong>以自動產生的型別為準</strong>，放在 <code spellcheck="false">.claude-plugin/types/</code>，編輯器也能直接提示。</li>
<li><strong>畫不出來就看 log</strong>：用 <code spellcheck="false">claude --debug</code> 開啟，找錯誤訊息。</li>
</ol>
<p>做好了想分享？ mod 就是外掛，放到 GitHub 加上 marketplace 檔案，別人用三行指令就能安裝：</p>
<pre spellcheck="false"><code class="language-text">/plugin marketplace add your-name/my-mods
/plugin install rice-cooker@my-mods
/reload-plugins</code></pre>
<p>反過來安裝別人的 mod 時要小心：mod 跟 Claude Code 有一樣的權限，安裝前先看過程式碼，只裝信任的來源。</p>
<h2 id="結語你想幫-claude-code-加什麼">結語：你想幫 Claude Code 加什麼？</h2>
<p>官方的三個範例，各自來自一個問題：「我的上下文還剩多少？」「這個指令會刪掉什麼？」「Claude 剛剛改了哪裡？」我們的電鍋提醒也一樣，只是「做完了叫我一聲」。</p>
<p>下次用 Claude Code 覺得「要是能…就好了」，就是你的下一個 mod 題目。直接用中文跟 Claude 說，讓它幫你做出來。</p>
<p>參考資料：<a href="https://claude.dev/blog/getting-started-with-claude-code-mods/" target="_blank" rel="noopener noreferrer nofollow">Getting started with Claude Code mods</a>（claude.dev Blog，Addy Osmani，2026 年 10 月 1 日）</p>
]]></content:encoded>
					
					<wfw:commentRss>https://superlevin.ifengyuan.tw/%e7%94%a8-claude-code-mods-%e6%89%93%e9%80%a0%e4%bd%a0%e7%9a%84%e5%b0%88%e5%b1%ac%e5%b0%8f%e5%b9%ab%e6%89%8b/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AI Coding 不只是幫你寫程式！Claude Code 與 Codex CLI 最新更新解析：Agent 更聰明、執行更安全，附 .NET 實戰範例</title>
		<link>https://superlevin.ifengyuan.tw/ai-coding-%e4%b8%8d%e5%8f%aa%e6%98%af%e5%b9%ab%e4%bd%a0%e5%af%ab%e7%a8%8b%e5%bc%8f%ef%bc%81claude-code-%e8%88%87-codex-cli-%e6%9c%80%e6%96%b0%e6%9b%b4%e6%96%b0%e8%a7%a3%e6%9e%90%ef%bc%9aagent/</link>
					<comments>https://superlevin.ifengyuan.tw/ai-coding-%e4%b8%8d%e5%8f%aa%e6%98%af%e5%b9%ab%e4%bd%a0%e5%af%ab%e7%a8%8b%e5%bc%8f%ef%bc%81claude-code-%e8%88%87-codex-cli-%e6%9c%80%e6%96%b0%e6%9b%b4%e6%96%b0%e8%a7%a3%e6%9e%90%ef%bc%9aagent/#respond</comments>
		
		<dc:creator><![CDATA[林壽山]]></dc:creator>
		<pubDate>Fri, 16 Oct 2026 06:24:37 +0000</pubDate>
				<category><![CDATA[AI人工智慧]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[AI AGENT]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Claude Code v2.1.301]]></category>
		<category><![CDATA[Codex CLI v0.163.0]]></category>
		<category><![CDATA[devops]]></category>
		<guid isPermaLink="false">https://superlevin.ifengyuan.tw/?p=4240</guid>

					<description><![CDATA[過去我們使用 AI 寫程式，最常做的事情大概就是問它：「這段 C# 能不能幫我重構一下？」 現在的 AI Co &#8230; <a href="https://superlevin.ifengyuan.tw/ai-coding-%e4%b8%8d%e5%8f%aa%e6%98%af%e5%b9%ab%e4%bd%a0%e5%af%ab%e7%a8%8b%e5%bc%8f%ef%bc%81claude-code-%e8%88%87-codex-cli-%e6%9c%80%e6%96%b0%e6%9b%b4%e6%96%b0%e8%a7%a3%e6%9e%90%ef%bc%9aagent/" class="more-link">閱讀全文<span class="screen-reader-text">〈AI Coding 不只是幫你寫程式！Claude Code 與 Codex CLI 最新更新解析：Agent 更聰明、執行更安全，附 .NET 實戰範例〉</span></a>]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" class="alignnone size-full wp-image-4241" src="http://cdnlevin.yowauction.com//2026/10/ChatGPT-圖像-2026年10月16日-下午02_22_45.jpg" alt="" /></p>
<p>過去我們使用 AI 寫程式，最常做的事情大概就是問它：「這段 C# 能不能幫我重構一下？」</p>
<p>現在的 AI Coding 工具，已經開始負責閱讀整個專案、修改多個檔案、執行測試、操作 Git，甚至與其他 Agent 合作完成一個開發任務。</p>
<p>但企業真正需要的，並不是一個寫程式速度很快的 AI，而是一個<strong>能被控制、能夠追蹤、發生錯誤可以恢復，而且不會隨便把程式碼弄丟的 AI 開發助手。</strong></p>
<p>2026 年 10 月 15 日（UTC），Anthropic 與 OpenAI 分別推出：</p>
<ul>
<li><strong>Claude Code v2.1.301</strong></li>
<li><strong>Codex CLI v0.163.0</strong></li>
</ul>
<p>這兩次更新有一個非常值得關注的共同方向：AI Coding 工具正逐漸從「互動式程式碼助手」，進化成「具有流程控制與安全機制的自主開發代理人」。</p>
<p>以下用實際開發情境，說明這次到底更新了什麼，以及 .NET 工程師該如何應用。</p>
<div>
<hr />
</div>
<h2>一、Claude Code v2.1.301：開始把「執行可靠性」當成重點</h2>
<p>這次 Claude Code 沒有推出什麼令人眼花撩亂的新介面，但其中幾項功能，對長時間執行的 Agent 開發流程相當重要。</p>
<h3>1. Git Worktree 保護：避免 AI 把未推送的程式碼清掉</h3>
<p>如果使用 AI 同時處理多個 Issue，Git Worktree 是非常實用的技術。</p>
<p>例如同一個 ASP.NET Core 專案，需要同時處理：</p>
<ul>
<li>Issue #101：新增訂單查詢 API</li>
<li>Issue #102：修復庫存計算錯誤</li>
<li>Issue #103：重構 JWT 驗證</li>
</ul>
<p>我們不希望三個 Agent 同時修改相同的工作目錄，因此可以利用 Git Worktree 建立彼此隔離的開發環境。</p>
<p>這次 Claude Code 修正了一個重要問題：透過 <code>WorktreeCreate</code> Hook 建立的 Worktree，在結束工作階段時，如果存在未推送的 Commit，先前可能會被直接移除，而沒有經過適當確認。</p>
<p>新版本修正了這個情況。</p>
<p>要注意，這項修正特別針對 Claude Code Hook 所建立的 Worktree，並不是宣稱所有 Git Worktree 操作都會自動備份。</p>
<p><strong>實作範例：建立獨立工作目錄</strong></p>
<p>在 Git Repository 目錄執行：</p>
<pre><code>git worktree add -b feature/order-api ../OrderApi-feature
cd ../OrderApi-feature
claude</code></pre>
<p>接著在 Claude Code 輸入：</p>
<blockquote><p>請分析目前 ASP.NET Core 專案，新增訂單查詢 API，要求：</p>
<ol start="1">
<li>保留現有架構與 Coding Style。</li>
<li>使用 Dependency Injection。</li>
<li>補上必要的 Unit Tests。</li>
<li>修改完成後執行 dotnet test。</li>
<li>提供 Git Diff 摘要。</li>
<li>不要自行 Commit、Push 或刪除 Worktree。</li>
</ol>
</blockquote>
<p>這是一個非常典型的企業開發情境：讓 AI 執行工作，但不把版本控制的最終決策權完全交出去。</p>
<h3>2. Workflow Agent 修正：避免「事情沒做完卻回報完成」</h3>
<p>以前使用多代理人時，有時最麻煩的不是執行失敗，而是 Agent 明明沒有完成指定步驟，卻回報整個任務成功。</p>
<p>Claude Code v2.1.301 修正了一種 Workflow Agent 可能跳過步驟、但執行結果仍被視為成功的狀況。</p>
<p>這對企業自動化尤其重要。</p>
<p>例如，我們安排以下工作：</p>
<p><strong>需求分析 → 程式開發 → 單元測試 → 安全檢查 → 產出報告</strong></p>
<p>如果測試 Agent 跳過測試，卻讓整個流程呈現成功，後續 CI/CD 就可能將未驗證的程式碼交付出去。</p>
<p>這次修正降低了特定情境下發生誤報成功的風險。不過企業仍應自行建立驗收關卡，例如測試 Exit Code、測試報告存在性、Code Review 與必要的人工作業核准。</p>
<h3>3. OpenTelemetry 加強：開始追蹤 Agent 為什麼執行工具</h3>
<p>這是我認為此次非常值得企業關注的功能。</p>
<p>Claude Code 在 OpenTelemetry <code>tool_decision</code> 事件中，新增了：</p>
<table>
<tbody>
<tr>
<th>欄位</th>
<th>作用</th>
</tr>
<tr>
<td><code>classifier_verdict</code></td>
<td>記錄分類器做出的工具存取判斷</td>
</tr>
<tr>
<td><code>permission_mode</code></td>
<td>記錄當時使用的權限模式</td>
</tr>
<tr>
<td><code>classifier_category</code></td>
<td>在啟用詳細工具記錄時，標示命中的內建規則分類</td>
</tr>
</tbody>
</table>
<p>第三個欄位需要設定 <code>OTEL_LOG_TOOL_DETAILS=1</code>，並搭配既有的 OpenTelemetry 匯出設定。</p>
<p>這讓企業可以進一步分析，Agent 的某次工具操作是如何被許可、限制或阻擋。</p>
<p>例如在 PowerShell 啟動 Claude Code 前：</p>
<pre><code>$env:OTEL_LOG_TOOL_DETAILS = "1"
claude</code></pre>
<p>此設定不會單獨啟用完整的 OpenTelemetry 匯出，仍需先依照官方文件完成 Telemetry 設定。</p>
<p>如果企業有 Azure Monitor、OpenTelemetry Collector 或其他監控平台，可以研究如何將 Agent 工具事件與應用程式 Trace 整合。</p>
<p>未來的 AI Agent 管理平台，除了觀察 Token 消耗、Latency 和 Error Rate，也需要知道：<strong>Agent 做了什麼、為什麼被允許執行，以及是否符合權限政策。</strong></p>
<h3>4. 無人值守任務：避免無止境等待使用額度恢復</h3>
<p>新版新增環境變數：</p>
<p>`CLAUDE_CODE_RETRY_WATCHDOG_MAX_USAGE_LIMIT</p>
]]></content:encoded>
					
					<wfw:commentRss>https://superlevin.ifengyuan.tw/ai-coding-%e4%b8%8d%e5%8f%aa%e6%98%af%e5%b9%ab%e4%bd%a0%e5%af%ab%e7%a8%8b%e5%bc%8f%ef%bc%81claude-code-%e8%88%87-codex-cli-%e6%9c%80%e6%96%b0%e6%9b%b4%e6%96%b0%e8%a7%a3%e6%9e%90%ef%bc%9aagent/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>從 C#／.NET 後端到 AI Agent</title>
		<link>https://superlevin.ifengyuan.tw/%e5%be%9e-c%ef%bc%8f-net-%e5%be%8c%e7%ab%af%e5%88%b0-ai-agent/</link>
					<comments>https://superlevin.ifengyuan.tw/%e5%be%9e-c%ef%bc%8f-net-%e5%be%8c%e7%ab%af%e5%88%b0-ai-agent/#respond</comments>
		
		<dc:creator><![CDATA[林壽山]]></dc:creator>
		<pubDate>Wed, 14 Oct 2026 02:01:25 +0000</pubDate>
				<category><![CDATA[AI人工智慧]]></category>
		<category><![CDATA[agent]]></category>
		<category><![CDATA[AI AGENT]]></category>
		<category><![CDATA[代理]]></category>
		<category><![CDATA[助理]]></category>
		<guid isPermaLink="false">https://superlevin.ifengyuan.tw/?p=4237</guid>

					<description><![CDATA[對習慣使用 C#、ASP.NET Core 和 SQL Server 開發企業系統的工程師來說，投入 AI A &#8230; <a href="https://superlevin.ifengyuan.tw/%e5%be%9e-c%ef%bc%8f-net-%e5%be%8c%e7%ab%af%e5%88%b0-ai-agent/" class="more-link">閱讀全文<span class="screen-reader-text">〈從 C#／.NET 後端到 AI Agent〉</span></a>]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" class="alignnone size-full wp-image-4238" src="http://cdnlevin.yowauction.com//2026/10/從-.NET-後端到-AI-Agent.png" alt="" /></p>
<p>對習慣使用 C#、ASP.NET Core 和 SQL Server 開發企業系統的工程師來說，投入 AI Agent 開發時，很容易產生一種錯覺：</p>
<p>「我已經把模型接進 Web API，也能呼叫工具、查詢資料庫，這應該算是一個完整的 Agent 專案了吧？」</p>
<p>但真正開始檢視系統設計，或準備在面試中介紹專案時，就會發現：</p>
<p><strong>「能跑起來」、「值得寫進履歷」和「可以正式上線」，其實是三個不同的門檻。</strong></p>
<p>一個展示用的 Agent，可以在順利的情境下完成任務；一個能展現開發能力的專案，必須說得清楚設計取捨；而一個能上線的系統，還必須面對權限、失敗、成本、監控與維運。</p>
<p>面試官不會只問你用了哪個模型、哪套框架。他更可能追問：</p>
<p>「這個需求為什麼要用 Agent？一般工作流程不行嗎？模型選錯工具怎麼辦？呼叫內部系統時，權限由誰檢查？文件改版後，知識庫怎麼更新？你怎麼證明這次調整真的讓效果變好？」</p>
<p>如果這些問題回答不出來，架構圖上放再多模型、資料庫和 Agent，也很難證明真正的工程能力。</p>
<p>從 .NET 工程師的角度來看，轉向 Agent 開發，不是把過去的後端經驗丟掉，而是把原本擅長的系統設計能力，延伸到一個「包含不確定性」的新環境。</p>
<hr />
<h2>一、先找出值得解決的問題，不要先決定「我要做一個 Agent」</h2>
<p>開始專案之前，我會先問的，不是「要用哪套 Agent 框架」，而是：</p>
<p><strong>「這個系統，究竟要幫誰減少哪一件麻煩的事？」</strong></p>
<p>例如，企業員工申請費用報支時，可能需要先查制度、確認適用條件、檢查附件，再登入內部系統填寫資料。</p>
<p>這時候，可以考慮設計一個報支助理：協助查詢制度、整理申請條件、辨識缺少的資訊，並產生待確認的申請草稿。</p>
<p>但需求不能只寫成「使用 AI 提升報支效率」。還要繼續拆解：使用者最常卡在哪個步驟？哪些資料能取得？哪些判斷有明確規則？哪些操作需要本人確認？完成任務的標準是什麼？</p>
<p>對 .NET 工程師而言，這其實就是熟悉的需求分析與系統分析，只是多了一個必須判斷的問題：</p>
<p><strong>哪些事情適合交給模型理解，哪些事情必須由程式保證？</strong></p>
<p>理解使用者口語描述、整理文件內容，可以考慮交給模型；金額計算、資格判斷、資料驗證與權限控管，則應該由明確的規則與後端服務處理。</p>
<p>如果需求只是搜尋制度並附上來源回答，檢索加上生成可能就已經足夠，不一定需要自主規劃的 Agent。</p>
<p>專案的價值，不在於它被叫做什麼，而在於它是否解決了真實問題。</p>
<h2>二、把 Agent 放進系統架構，而不是讓 Agent 取代系統架構</h2>
<p>一個比較完整的 .NET Agent 專案，不應該只剩下：</p>
<p>「使用者輸入 → 呼叫模型 → 回傳答案。」</p>
<p>我會把它當成一套企業應用來設計。</p>
<p>ASP.NET Core Web API 負責接收請求、驗證身分與提供服務入口；應用服務負責管理任務流程、狀態與業務規則；模型存取層處理模型請求與回應；知識檢索層負責文件搜尋及來源資訊；工具層則透過受控介面，存取既有 ERP、EIP 或其他內部系統。</p>
<p>任務紀錄、操作結果與必要的稽核資料，也必須有適當的保存方式。</p>
<p>以報支助理為例，模型可以提出「需要查詢這位使用者的申請狀態」，但真正執行查詢的，仍然應該是經過授權的 C# 服務。</p>
<p>模型不能因為產生了一個員工編號，就自動取得該員工的資料；也不能因為生成了格式正確的參數，就被視為通過業務驗證。</p>
<p><strong>模型負責提出下一步，系統負責決定這一步能不能做。</strong></p>
<p>這正是後端工程師能發揮優勢的地方。</p>
<p>過去處理的介面、資料庫、權限、交易、例外、日誌與並行問題，並沒有因為加入大語言模型而消失。只是系統裡多了一個可能理解錯、判斷錯，也可能輸出不一致的元件。</p>
<p>因此，更需要清楚的責任邊界，而不是更少。</p>
<h2>三、不是每個流程都需要 Agent，更不是 Agent 越多越厲害</h2>
<p>如果一個流程已經很明確：</p>
<p>「提交申請 → 驗證欄位 → 檢查額度 → 產生單號 → 寫入資料庫。」</p>
<p>那就先把它當成一般業務流程來設計。</p>
<p>這些步驟既然有固定規則，就沒有必要每次都花 Token，請模型重新猜一次下一步要做什麼。</p>
<p>Agent 比較值得介入的地方，是任務路徑無法事先完全確定。例如，使用者只說：「幫我確認這筆出差費用還缺什麼，整理好後讓我送出。」</p>
<p>系統可能需要根據現有資訊，判斷要查哪份制度、讀取哪些申請資料、是否需要追問使用者，以及接下來該呼叫哪個工具。</p>
<p>這時候，模型的理解與動態選擇才有發揮空間。</p>
<p>但即使如此，最終的驗證、核准與寫入，仍然可以維持固定流程。</p>
<p><strong>實務上值得考慮的設計，是讓 Agent 處理不確定的理解與選擇，讓傳統程式處理確定的規則與執行。</strong></p>
<p>多 Agent 也是同樣的道理。</p>
<p>只有當任務真的需要不同專業、不同工具權限或可獨立處理的子任務時，才有理由拆分。否則，只是把一個難除錯的流程，變成好幾個互相傳話、一起難除錯的流程。</p>
<p>架構的成熟度，不取決於 Agent 的數量，而取決於每一個元件是否有存在的必要。</p>
<h2>四、RAG 的重點，不是把文件塞進向量資料庫</h2>
<p>如果履歷上的專案介紹只有：</p>
<p>「使用 Embedding 將文件向量化，搭配向量資料庫實現 RAG 問答。」</p>
<p>這比較像是在描述技術流程，還沒有說明你真正解決了什麼問題。</p>
<p>企業文件不一定乾淨、完整，也不一定只有一個版本。報支制度可能有附件、表格、例外條件，甚至同一項規定在不同年度有不同標準。</p>
<p>因此，RAG 的設計要從資料開始。</p>
<p>文件如何解析？表格中的金額與適用條件能不能保留關聯？切分後的段落是否失去前後文？每個片段能不能追溯到原始文件、章節、版本與生效日期？</p>
<p>接著才是檢索策略：關鍵字與向量搜尋如何搭配？召回多少內容？是否需要重排序？遇到不同版本互相衝突，該採用哪一份？</p>
<p>更重要的是權限。</p>
<p><strong>使用者不能看的文件，就不應該先交給模型，再期待模型自行保密。</strong></p>
<p>檢索階段就要考慮使用者、部門與文件存取範圍，而不是只在提示詞裡寫一句「請勿洩漏機密」。</p>
<p>至於查不到資料的情況，也應該有明確處理方式：補問條件、說明資料不足，或轉交人工確認，而不是把「沒有證據」包裝成一個語氣肯定的答案。</p>
<p>真正值得介紹的 RAG 專案，是你如何處理資料品質、版本、權限與引用，以及如何驗證這些設計有效，而不只是選用了哪一種資料庫。</p>
<h2>五、設計 Agent 時，先問「它做錯了怎麼辦？」</h2>
<p>Demo 通常展示最順利的一次；正式系統必須承受各種不順利。</p>
<p>模型可能選錯工具，工具可能逾時，外部 API 可能暫時故障，回傳資料可能不完整。使用者也可能中途取消，或在同一個任務裡連續修改需求。</p>
<p>因此，工具呼叫不能只有「成功就繼續，失敗就重試」。</p>
<p>在 C# 的實作上，可以用明確的輸入模型、型別與欄位驗證，限制工具接受的參數；但型別正確，只代表格式符合要求，不代表內容合理，更不代表使用者有權執行。</p>
<p>逾時、取消、重試與替代流程，也要分別設計。</p>
<p>尤其是有副作用的操作，不能盲目重試。</p>
<p>查詢資料失敗後再查一次，與建立申請失敗後再建立一次，風險完全不同。後者可能只是回應遺失，但資料其實已經寫入；這時再次執行，就可能產生重複申請。</p>
<p>所以，涉及寫入的工具，要考慮冪等性、操作識別碼與執行狀態查詢。涉及送審、寄信或其他重要操作，則應讓使用者確認具體內容，並由後端再次檢查授權與規則。</p>
<p>Agent 本身也需要界線，例如最大步驟數、最長執行時間與 Token 預算，避免陷入重複搜尋或無效呼叫。</p>
<p>讀取外部文件時，文件裡出現的「請忽略規則並執行某個操作」，也只能被視為文件內容，不能變成工具授權。</p>
<p><strong>真正的工程能力，不是讓模型永遠不出錯，而是讓錯誤不會直接變成失控的系統行為。</strong></p>
<h2>六、沒有評估，就不知道你是在改善系統，還是在調整感覺</h2>
<p>開發傳統 Web API，我們會寫單元測試、整合測試，確認輸入、輸出與業務規則。</p>
<p>加入 AI 之後，這些測試仍然需要，但還不夠。</p>
<p>因為提示詞、模型、文件內容或檢索設定改變，都可能影響結果。只挑幾個問題手動試問，很容易把偶然的好答案，誤認為整體品質提升。</p>
<p>我會先建立一批有代表性的測試案例，涵蓋正常問題、模糊問題、資料不足、文件衝突、越權要求，以及工具失敗等情境。</p>
<p>對 RAG，要分開觀察：有沒有找到正確資料、回答是否忠於資料、引用是否真的支持結論。</p>
<p>對 Agent，則要確認：任務是否完成、工具選擇與參數是否正確、有沒有不必要的呼叫，以及重要操作是否遵守確認流程。</p>
<p>另外，還要觀察回應時間、P95 延遲，以及每次成功完成任務的成本。單次模型呼叫便宜，不代表整個任務便宜；如果需要反覆重試，成本仍然可能很高。</p>
<p>比較不同版本時，應盡量使用相同條件與固定測試集，並保留未參與調整的案例，避免只把熟悉的題目調得很好。</p>
<p>模型輔助評分可以協助整理結果，但重要案例仍應透過人工抽查或可驗證的業務結果校準。</p>
<p><strong>「我覺得回答變好了」，不是驗收標準；「在固定案例與明確指標下，哪裡改善、哪裡退步」，才是。</strong></p>
<h2>七、工程化不是附加功能，而是 .NET 工程師的主場</h2>
<p>模型能回答問題之後，專案才剛開始。</p>
<p>接下來要處理的，是使用者如何登入、任務如何追蹤、服務重啟後如何恢復、設定如何管理，以及發生問題時如何定位原因。</p>
<p>這些事情，看起來沒有多 Agent 那麼醒目，卻決定了系統能不能被真正使用。</p>
<p>在 .NET 專案裡，我會透過依賴注入分離模型存取、檢索與業務工具，避免所有邏輯都塞進同一個 Controller。模型設定與提示詞也需要版本管理，才能知道某一次結果是由哪個版本產生。</p>
<p>長時間任務則要考慮持久化狀態與可靠的背景處理，而不只是把工作丟到背景就結束。任務做到一半服務重啟，究竟要繼續、重做，還是等待人工處理，必須有答案。</p>
<p>監控也不能只記錄「API 成功或失敗」。</p>
<p>一次任務可能包含多次模型呼叫、檢索與工具執行。需要透過一致的追蹤識別碼，把這些步驟串起來，才能知道時間花在哪裡、哪一步失敗，以及成本為何增加。</p>
<p>同時，日誌不能因為方便除錯，就無限制保存完整對話、個資與機密文件；紀錄範圍、遮罩與存取權限，也屬於設計的一部分。</p>
<p>至於 Redis、訊息佇列、Docker 或 Kubernetes，要依需求選擇，而不是為了讓履歷看起來豐富而全部加入。</p>
<p><strong>工程化不是把技術堆滿，而是讓每一個重要行為都能被控制、追蹤、測試與維護。</strong></p>
<h2>八、第一個 .NET Agent 專案，應該怎麼落地？</h2>
<p>我會選擇範圍明確、能取得資料，而且可以定義完成標準的場景，而不是一開始就做「什麼都能處理的企業助理」。</p>
<p>以前面的報支助理為例，第一版可以只完成：</p>
<p><strong>查詢制度、讀取本人申請資料、辨識缺少資訊，以及產生待確認草稿。</strong></p>
<p>先不讓它自動核准，也不開放任意 SQL 或任意系統操作。</p>
<p>接著，把流程拆成確定與不確定兩部分：由模型理解需求、選擇受控工具、整理說明；由 C# 服務處理查詢授權、資料驗證、計算與狀態管理。</p>
<p>完成主要路徑後，不是立刻增加更多 Agent，而是補上資料不足、檢索錯誤、工具逾時、使用者取消與重複提交等情境，再建立評估集與部署方式。</p>
<p>最後，整理能被驗證的成果，包括解決了什麼問題、為什麼採用這個架構、有哪些限制，以及測試結果如何。</p>
<p>對於確實完成上述功能的專案，履歷可以寫成：</p>
<blockquote><p>使用 ASP.NET Core 與 C# 開發企業報支助理，整合制度文件檢索與既有系統 API，提供附來源的制度查詢、申請資訊檢查及草稿產生功能。將工具呼叫限制於授權服務，加入參數驗證、逾時控制與操作確認，並以固定測試集追蹤任務完成率、引用正確性、延遲與成本。</p></blockquote>
<p>這段描述的重點不是名詞多，而是能讓對方看見你做了哪些設計、解決哪些問題，以及如何驗證。</p>
<p>若有改善數據，就附上實際量測結果與測試條件；沒有就不要編造。專案仍在 PoC 階段，也應清楚標示，不要把「設計上可部署」寫成「已正式上線」。</p>
<h2>結語：轉向 Agent，不是離開後端，而是更需要後端思維</h2>
<p>對 C#／.NET 工程師而言，投入 AI Agent 開發，不代表過去累積的技術突然失去價值。</p>
<p>恰恰相反，當模型可以參與判斷、選擇工具，甚至觸發業務操作時，介面設計、授權、資料一致性、錯誤處理與可觀測性，只會變得更重要。</p>
<p>一個值得寫進履歷的 Agent 專案，應該讓你清楚說明：為什麼做、為什麼這樣設計、模型與程式如何分工、失敗時如何處理，以及效果如何評估。</p>
<p>你不一定需要龐大的使用者數，也不一定需要複雜的多 Agent 架構，但必須對系統的行為、限制與結果有足夠理解。</p>
<p><strong>Demo 證明模型在某些條件下做得到；工程化專案則要說明，系統如何穩定完成任务，又如何在做不到時安全停下來。</strong></p>
<p>真正的 Agent 開發，不是替模型接上更多工具，而是把模型的不確定性，轉化成可以被驗證、管理與持續改善的服務。</p>
<p>這也是 .NET 工程師最值得帶進 AI 時代的能力。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://superlevin.ifengyuan.tw/%e5%be%9e-c%ef%bc%8f-net-%e5%be%8c%e7%ab%af%e5%88%b0-ai-agent/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>用 AI 短片，說一點豐原的故事</title>
		<link>https://superlevin.ifengyuan.tw/use-ai-short-say-fengyuan-story/</link>
		
		<dc:creator><![CDATA[林壽山]]></dc:creator>
		<pubDate>Mon, 28 Sep 2026 01:45:57 +0000</pubDate>
				<category><![CDATA[AI人工智慧]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[ai唱歌]]></category>
		<category><![CDATA[文化]]></category>
		<category><![CDATA[歷史]]></category>
		<category><![CDATA[短視頻]]></category>
		<category><![CDATA[豐原]]></category>
		<guid isPermaLink="false">https://superlevin.ifengyuan.tw/?p=4229</guid>

					<description><![CDATA[用 AI 短片，說一點豐原的故事 最近開始嘗試用 AI 工具製作短片，把豐原的地方文化、歷史記憶與生活風景，轉 &#8230; <a href="https://superlevin.ifengyuan.tw/use-ai-short-say-fengyuan-story/" class="more-link">閱讀全文<span class="screen-reader-text">〈用 AI 短片，說一點豐原的故事〉</span></a>]]></description>
										<content:encoded><![CDATA[<p>用 AI 短片，說一點豐原的故事<br />
最近開始嘗試用 AI 工具製作短片，把豐原的地方文化、歷史記憶與生活風景，轉化成歌曲和影像，探索不同的說故事方式。<br />
從熟悉的街道、廟口的熱鬧，到日常生活裡容易被忽略的小細節，都是創作的靈感。透過 AI 協助發想歌詞、生成音樂與畫面，再慢慢整理、調整，讓一段段關於豐原的故事，有機會用更輕鬆、親近的方式被看見與聽見。<br />
製作過程中，最有趣的地方，是思考如何讓作品帶出在地的感覺。一首歌、一段畫面，能不能讓熟悉豐原的人產生共鳴，也讓還不認識這座城市的人，多一點好奇？<br />
涉及歷史的內容，也需要回頭查找資料，分清楚史實與創作想像。AI 能幫忙呈現故事，而故事裡的細節，仍值得花時間理解與確認。<br />
目前還在持續摸索，希望透過這些小小的創作，記錄自己眼中的豐原，也邀請大家一起重新發現家鄉的美。如果你有想聽的豐原故事，或記憶中特別的地方，歡迎留言分享，說不定就會成為下一支短片的靈感！<img decoding="async" class="alignnone size-full wp-image-4230" src="http://cdnlevin.yowauction.com//2026/09/Codex-圖像-2026年9月24日-下午09_39_27.png" alt="" /> <img decoding="async" class="alignnone size-full wp-image-4231" src="http://cdnlevin.yowauction.com//2026/09/Codex-圖像-2026年9月24日-下午11_11_49.png" alt="" /></p>
<p><iframe style="border: none; overflow: hidden;" src="https://www.facebook.com/plugins/video.php?height=476&amp;href=https%3A%2F%2Fwww.facebook.com%2Freel%2F1038962052510149%2F&amp;show_text=false&amp;width=271&amp;t=0" width="271" height="476" frameborder="0" scrolling="no" allowfullscreen="allowfullscreen"></iframe><br />
<iframe style="border: none; overflow: hidden;" src="https://www.facebook.com/plugins/video.php?height=476&amp;href=https%3A%2F%2Fwww.facebook.com%2Freel%2F2886261171741784%2F&amp;show_text=false&amp;width=271&amp;t=0" width="271" height="476" frameborder="0" scrolling="no" allowfullscreen="allowfullscreen"></iframe><br />
<iframe style="border: none; overflow: hidden;" src="https://www.facebook.com/plugins/video.php?height=476&amp;href=https%3A%2F%2Fwww.facebook.com%2Freel%2F2378294446312649%2F&amp;show_text=false&amp;width=267&amp;t=0" width="267" height="476" frameborder="0" scrolling="no" allowfullscreen="allowfullscreen"></iframe><br />
<iframe style="border: none; overflow: hidden;" src="https://www.facebook.com/plugins/video.php?height=476&amp;href=https%3A%2F%2Fwww.facebook.com%2Freel%2F1032043523215177%2F&amp;show_text=false&amp;width=271&amp;t=0" width="271" height="476" frameborder="0" scrolling="no" allowfullscreen="allowfullscreen"></iframe></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Redis 走進 AI 架構：從快取資料，到替 Agent 準備正確的上下文</title>
		<link>https://superlevin.ifengyuan.tw/redis-%e8%b5%b0%e9%80%b2-ai-%e6%9e%b6%e6%a7%8b%ef%bc%9a%e5%be%9e%e5%bf%ab%e5%8f%96%e8%b3%87%e6%96%99%ef%bc%8c%e5%88%b0%e6%9b%bf-agent-%e6%ba%96%e5%82%99%e6%ad%a3%e7%a2%ba%e7%9a%84%e4%b8%8a%e4%b8%8b/</link>
		
		<dc:creator><![CDATA[林壽山]]></dc:creator>
		<pubDate>Mon, 28 Sep 2026 01:38:40 +0000</pubDate>
				<category><![CDATA[AI人工智慧]]></category>
		<guid isPermaLink="false">https://superlevin.ifengyuan.tw/?p=4226</guid>

					<description><![CDATA[做後端開發，談到 Redis，第一個想到的通常是快取：商品資料先放一份、Session 集中管理、熱門查詢少打 &#8230; <a href="https://superlevin.ifengyuan.tw/redis-%e8%b5%b0%e9%80%b2-ai-%e6%9e%b6%e6%a7%8b%ef%bc%9a%e5%be%9e%e5%bf%ab%e5%8f%96%e8%b3%87%e6%96%99%ef%bc%8c%e5%88%b0%e6%9b%bf-agent-%e6%ba%96%e5%82%99%e6%ad%a3%e7%a2%ba%e7%9a%84%e4%b8%8a%e4%b8%8b/" class="more-link">閱讀全文<span class="screen-reader-text">〈Redis 走進 AI 架構：從快取資料，到替 Agent 準備正確的上下文〉</span></a>]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" class="alignnone size-full wp-image-4227" src="http://cdnlevin.yowauction.com//2026/09/redis-ai-cover.png" alt="" /></p>
<p class="md-end-block md-p md-focus"><span class="md-plain md-expand">做後端開發，談到 Redis，第一個想到的通常是快取：商品資料先放一份、Session 集中管理、熱門查詢少打幾次資料庫。</span></p>
<p class="md-end-block md-p"><span class="md-plain">但當系統開始加入 AI 助理，新的問題出現了。</span></p>
<p class="md-end-block md-p"><span class="md-plain">使用者前面才說要查台中門市，下一輪問「那今天還有貨嗎？」系統卻不知道「那」指的是哪一項商品。模型回答得很流暢，查到的卻是昨天的庫存。</span></p>
<p class="md-end-block md-p"><span class="md-plain">站在 .NET 系統架構的角度，我更關心的是：每次呼叫模型之前，應用程式能不能把正確、最新，而且符合權限的資料準備好？</span></p>
<p class="md-end-block md-p"><span class="md-plain">Redis 的 AI 能力，值得從這個問題開始理解。</span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">模型負責理解與生成；應用程式必須負責提供可信的上下文。</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">先釐清：Redis 的 AI 能力有不同層次</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-plain">「Redis 接入 AI」很容易讓人以為，只要升級資料庫，就會自動多出一個懂業務的助理。</span></p>
<p class="md-end-block md-p"><span class="md-plain">實際上，可以分成資料檢索與上層服務來看。Vector Sets 提供原生向量集合操作；Redis Query Engine 則能在 Hash、JSON 資料上建立索引，組合向量、全文與結構化條件。兩者的操作方式與適用情境不同。</span><span class="md-meta-i-c  md-link"><a href="https://redis.io/blog/vector-indexes-in-redis/"><span class="md-plain">Redis 向量索引說明</span></a></span></p>
<p class="md-end-block md-p"><span class="md-plain">Redis Iris 則把 Agent Memory、LangCache、Context Retriever 與 Data Integration 組合成上下文服務，涵蓋記憶、語意快取、受治理的資料存取及資料同步。</span><span class="md-meta-i-c  md-link"><a href="https://redis.io/docs/latest/develop/ai/context-engine/"><span class="md-plain">Redis Iris 官方文件</span></a></span></p>
<p class="md-end-block md-p"><span class="md-plain">選型時，我會分別確認資料庫版本、部署方案及服務需求。支援某個向量命令，並不表示整套 Agent 記憶流程已經完成設定。</span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">用餐飲 POS 來看：三種問題，需要三種資料</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-plain">假設我們正在替連鎖餐飲系統開發 AI 客服。使用者可能問：</span></p>
<figure class="md-table-fig table-figure">
<table class="md-table">
<thead>
<tr class="md-end-block">
<th><span class="td-span"><span class="md-plain">使用者的問題</span></span></th>
<th><span class="td-span"><span class="md-plain">系統需要的資料</span></span></th>
<th><span class="td-span"><span class="md-plain">我會採用的處理方式</span></span></th>
</tr>
</thead>
<tbody>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">「外帶訂單如何取消？」</span></span></td>
<td><span class="td-span"><span class="md-plain">門市適用的取消規則</span></span></td>
<td><span class="td-span"><span class="md-plain">檢索有效版本的政策文件</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">「照我上次的口味推薦」</span></span></td>
<td><span class="td-span"><span class="md-plain">已確認的使用者偏好</span></span></td>
<td><span class="td-span"><span class="md-plain">讀取該使用者的長期記憶</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">「我剛才那筆訂單退款了嗎？」</span></span></td>
<td><span class="td-span"><span class="md-plain">該筆訂單最新狀態</span></span></td>
<td><span class="td-span"><span class="md-plain">驗證身分後查詢訂單服務</span></span></td>
</tr>
</tbody>
</table>
</figure>
<p class="md-end-block md-p"><span class="md-plain">這三題都以自然語言提出，資料來源卻完全不同。</span></p>
<p class="md-end-block md-p"><span class="md-plain">退款規則適合從知識庫找；口味偏好適合從記憶找；退款進度應查詢實際訂單。若把所有問題都丟進同一套向量搜尋，很容易找到「看起來相關、實際上不能作答」的內容。</span></p>
<p class="md-end-block md-p"><span class="md-plain">因此，我會先設計問題分流，再決定 Redis 在各條路徑扮演什麼角色。</span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">向量搜尋：先限定資料範圍，再找語意相近的內容</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-plain">向量可以協助系統找到用詞不同、意思相近的內容。例如「外帶取消」與「撤銷取餐訂單」，不一定包含相同關鍵字，卻可能指向同一份規則。</span></p>
<p class="md-end-block md-p"><span class="md-plain">如果只需要輕量的相似度查詢，可以評估 Vector Sets；若文件還要搭配門市、分類、日期或其他查詢條件，則可以評估 Query Engine。後者提供向量搜尋與 metadata 過濾，向量索引可依需求選擇 FLAT、HNSW 等演算法。</span><span class="md-meta-i-c  md-link"><a href="https://redis.io/docs/latest/develop/ai/search-and-query/vectors/"><span class="md-plain">Redis 向量搜尋文件</span></a></span></p>
<p class="md-end-block md-p"><span class="md-plain">在多租戶系統中，我會讓後端從已驗證的身分取得租戶範圍，把必要的存取限制帶進檢索流程。不能讓使用者輸入一句「查另一家公司的文件」，就改變查詢權限。</span></p>
<p class="md-end-block md-p"><span class="md-plain">資料範圍正確後，才有討論相似度與排序的意義。</span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">Agent 記憶：保存對話，還要管理事實如何更新</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-plain">Redis Agent Memory 區分會話與長期記憶。啟用相關功能後，可以在背景摘要較早的對話，並抽取值得保留的事實與偏好，形成可搜尋的長期記錄。</span><span class="md-meta-i-c  md-link"><a href="https://redis.io/docs/latest/develop/ai/context-engine/agent-memory/overview/"><span class="md-plain">Agent Memory 官方說明</span></a></span></p>
<p class="md-end-block md-p"><span class="md-plain">但「存起來」只是起點。</span></p>
<p class="md-end-block md-p"><span class="md-plain">使用者上個月偏好辣味，今天說最近想吃清淡一點，系統該採用哪一筆？他只是替朋友訂餐，這次選擇又該不該成為本人的長期偏好？</span></p>
<p class="md-end-block md-p"><span class="md-plain">我的設計會讓記憶保留來源、時間與適用對象，並提供更正、刪除與失效機制。對會影響實際交易的資訊，還要有明確的確認程序。</span></p>
<p class="md-end-block md-p"><span class="md-plain">此外，重要條件不能只靠向量搜尋「剛好找到」。應用程式必須明確載入的限制，就應作為固定業務條件處理。</span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">語意快取：相似的問法，未必有相同答案</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-plain">LangCache 的用途，是讓語意相近的請求有機會重用既有回答，減少重複生成。</span><span class="md-meta-i-c  md-link"><a href="https://redis.io/docs/latest/develop/ai/context-engine/"><span class="md-plain">Redis Iris：LangCache</span></a></span></p>
<p class="md-end-block md-p"><span class="md-plain">例如同一門市、同一版本規則下，「外帶怎麼取消？」與「取消外帶的流程是什麼？」可能適合共用答案。</span></p>
<p class="md-end-block md-p"><span class="md-plain">但是「我的退款到了嗎？」與「他的退款到了嗎？」即使語意非常接近，也不能因此共用結果。</span></p>
<p class="md-end-block md-p"><span class="md-plain">我會先定義哪些回答允許快取，再檢查租戶、權限、語言、政策版本與有效期限。即時訂單、庫存與個人交易狀態，則走業務查詢路徑。</span></p>
<p class="md-end-block md-p"><span class="md-plain">衡量成效時，也不只看命中率。</span><span class="md-pair-s "><strong><span class="md-plain">錯誤重用答案的比例、政策更新後的失效速度，以及整體回應延遲，都應一起觀察。</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">放進 ASP.NET Core，責任應該怎麼分？</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-plain">我會把請求入口設計成以下流程：</span></p>
<ol class="ol-list" start="">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">驗證使用者身分，取得租戶、門市與資料存取範圍。</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">判斷問題需要政策文件、個人記憶，還是即時業務資料。</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">對允許重用的問題檢查語意快取，其他問題直接進入檢索或服務查詢。</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">將取得的資料連同來源、時間與必要限制，整理成模型上下文。</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">產生回答；資料不足時，要求補充資訊或說明尚無法確認。</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">依保存政策更新對話、候選記憶及允許快取的答案。</span></p>
</li>
</ol>
<p class="md-end-block md-p"><span class="md-plain">在程式結構上，我會把知識檢索、記憶存取、快取判斷與訂單查詢拆成不同服務介面，讓 Controller 保持簡單，也方便單獨驗證每個環節。</span></p>
<p class="md-end-block md-p"><span class="md-plain">若涉及取消訂單、退款或修改資料，仍由應用服務驗證權限、狀態轉移與重複請求。模型可以協助理解使用者意圖，交易是否成立則必須由業務規則決定。</span></p>
<p class="md-end-block md-p"><span class="md-plain">這樣一來，未來更換模型或檢索服務時，也不必重寫整套訂單邏輯。</span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">導入前，我會先算清楚兩件事</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-plain">第一件是記憶體。</span></p>
<p class="md-end-block md-p"><span class="md-plain">以 1,536 維 FLOAT32 向量為例，單筆純向量資料是 1,536 × 4 = 6,144 bytes；一千萬筆約 61.44 GB，還沒計入索引、文件、metadata、副本與其他開銷。</span></p>
<p class="md-end-block md-p"><span class="md-plain">即使採用更低位元表示，也不能直接把純向量的縮小比例，當成整個 Redis 執行個體的節省比例。容量規劃應以實際資料與查詢品質測試為準。</span></p>
<p class="md-end-block md-p"><span class="md-plain">第二件是資料生命週期。</span></p>
<p class="md-end-block md-p"><span class="md-plain">可重建的快取與需要保存的長期記憶，對淘汰、備份及復原有不同要求。我不會因為都能放進 Redis，就直接讓它們共用相同的容量與淘汰策略。是否拆成不同執行個體，要看資料重要性、負載與故障影響。</span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">我會從一個能驗證的小場景開始</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-plain">第一階段，我會選單一門市的政策問答：整理文件版本，建立檢索，再用一組固定問題檢查答案與來源是否一致。</span></p>
<p class="md-end-block md-p"><span class="md-plain">第二階段，才針對穩定、重複的問法加入語意快取，同時測試「問法相近但答案不同」的反例。</span></p>
<p class="md-end-block md-p"><span class="md-plain">等這些行為可預期後，再加入跨會話偏好與即時訂單工具。每增加一項能力，就驗證它對正確率、延遲與維運成本的影響。</span></p>
<p class="md-end-block md-p"><span class="md-plain">從 .NET 架構師的角度看，Redis 在 AI 時代的價值，是讓我們多了一組管理上下文的工具。真正決定系統品質的，仍是資料來源、權限邊界、更新機制，以及每次回答前的判斷流程。</span></p>
<p class="md-end-block md-p md-focus"><span class="md-pair-s md-expand"><strong><span class="md-plain">讓 AI 記得更多之前，先讓系統知道：哪些資訊值得記住、什麼時候必須更新，以及這一次回答到底能相信哪一份資料。</span></strong></span></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>讓 AI 不只會聊天：透過 CLI 擴充 AI 的實際工作能力</title>
		<link>https://superlevin.ifengyuan.tw/%e8%ae%93-ai-%e4%b8%8d%e5%8f%aa%e6%9c%83%e8%81%8a%e5%a4%a9%ef%bc%9a%e9%80%8f%e9%81%8e-cli-%e6%93%b4%e5%85%85-ai-%e7%9a%84%e5%af%a6%e9%9a%9b%e5%b7%a5%e4%bd%9c%e8%83%bd%e5%8a%9b/</link>
		
		<dc:creator><![CDATA[林壽山]]></dc:creator>
		<pubDate>Mon, 03 Aug 2026 10:25:17 +0000</pubDate>
				<category><![CDATA[AI人工智慧]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[markdown]]></category>
		<guid isPermaLink="false">https://superlevin.ifengyuan.tw/?p=4222</guid>

					<description><![CDATA[生成式 AI 很擅長回答問題、產生程式碼、規劃系統架構與整理技術文件。 但若 AI 只能停留在聊天視窗中，它多 &#8230; <a href="https://superlevin.ifengyuan.tw/%e8%ae%93-ai-%e4%b8%8d%e5%8f%aa%e6%9c%83%e8%81%8a%e5%a4%a9%ef%bc%9a%e9%80%8f%e9%81%8e-cli-%e6%93%b4%e5%85%85-ai-%e7%9a%84%e5%af%a6%e9%9a%9b%e5%b7%a5%e4%bd%9c%e8%83%bd%e5%8a%9b/" class="more-link">閱讀全文<span class="screen-reader-text">〈讓 AI 不只會聊天：透過 CLI 擴充 AI 的實際工作能力〉</span></a>]]></description>
										<content:encoded><![CDATA[<p>生成式 AI 很擅長回答問題、產生程式碼、規劃系統架構與整理技術文件。</p>
<p>但若 AI 只能停留在聊天視窗中，它多半只能告訴你：</p>
<ul>
<li>指令應該怎麼下</li>
<li>程式應該怎麼寫</li>
<li>系統應該怎麼部署</li>
<li>錯誤可能發生在哪裡</li>
</ul>
<p>真正要讓 AI 參與開發、測試、部署與維運，就需要搭配 CLI 工具。</p>
<p>CLI 是 <strong>Command-Line Interface，命令列介面</strong>。透過終端機、PowerShell、Git、Docker、Python、Node.js，以及各種雲端 CLI，AI 才能把「建議」轉換為「可執行的工作流程」。</p>
<p>簡單來說：</p>
<blockquote><p>聊天介面讓 AI 提供答案，CLI 則讓 AI 有機會把答案轉換成實際操作。</p></blockquote>
<p>當開發環境準備完成後，AI 可以協助：</p>
<ul>
<li>建立專案</li>
<li>建立資料夾與程式檔案</li>
<li>安裝開發套件</li>
<li>執行程式</li>
<li>執行測試</li>
<li>分析錯誤</li>
<li>修改程式</li>
<li>操作 Git</li>
<li>建立 Docker 容器</li>
<li>部署雲端服務</li>
<li>操作 Firebase</li>
<li>查詢資料庫</li>
<li>建立 CI/CD</li>
<li>撰寫 PowerShell 自動化腳本</li>
<li>分析系統 Log</li>
<li>重複執行、修正與驗證</li>
</ul>
<p>這也是 AI Coding Agent、AI CLI、Vibe Coding 與 Agentic Development 的核心基礎。</p>
<hr />
<h1 id="-cli-">一、什麼是 CLI？</h1>
<p>CLI 是透過文字指令操作電腦、開發工具與雲端平台的介面。</p>
<p>例如，使用 Git 下載專案：</p>
<pre><code class="lang-powershell">git <span class="hljs-keyword">clone</span> <span class="hljs-title">https</span>://github.com/example/project.git
</code></pre>
<p>使用 Docker 啟動服務：</p>
<pre><code class="lang-powershell">docker compose up <span class="hljs-_">-d</span>
</code></pre>
<p>登入 Azure：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">az login</span>
</code></pre>
<p>部署 Google Cloud Run：</p>
<pre><code class="lang-powershell">gcloud <span class="hljs-keyword">run</span><span class="bash"> deploy</span>
</code></pre>
<p>當 AI 開發工具具備 CLI 操作能力後，通常可以依照以下流程工作：</p>
<ol>
<li>理解使用者需求。</li>
<li>檢查本機開發環境。</li>
<li>建立專案與資料夾。</li>
<li>安裝必要套件。</li>
<li>產生程式碼與設定檔。</li>
<li>執行建置。</li>
<li>執行測試。</li>
<li>分析錯誤訊息。</li>
<li>修改程式。</li>
<li>再次執行與驗證。</li>
<li>建立 Git Commit。</li>
<li>部署到測試或雲端環境。</li>
</ol>
<p>因此，CLI 不只是工程師輸入指令的工具，也是 AI 與作業系統、開發工具及雲端平台之間的重要橋梁。</p>
<hr />
<h1 id="-windows-">二、Windows 本機建議安裝的基礎工具</h1>
<p>若要在 Windows 電腦上使用 AI 搭配 CLI，建議先安裝以下工具。</p>
<hr />
<h2 id="1-windows-terminal">1. Windows Terminal</h2>
<p>Windows Terminal 是 Windows 上的現代化終端機工具。</p>
<p>官方安裝說明：</p>
<p><a href="https://learn.microsoft.com/zh-tw/windows/terminal/install">https://learn.microsoft.com/zh-tw/windows/terminal/install</a></p>
<p>Windows Terminal 可以同時操作：</p>
<ul>
<li>PowerShell</li>
<li>Command Prompt</li>
<li>WSL</li>
<li>SSH</li>
<li>Azure Cloud Shell</li>
<li>各種 CLI 工具</li>
</ul>
<p>Windows Terminal 可視為整個 CLI 開發環境的主要入口。</p>
<p>安裝完成後，可以從開始功能表開啟 Windows Terminal，並在不同分頁中分別執行：</p>
<ul>
<li>PowerShell</li>
<li>Git</li>
<li>Docker</li>
<li>Node.js</li>
<li>Python</li>
<li>Azure CLI</li>
<li>Google Cloud CLI</li>
</ul>
<hr />
<h2 id="2-powershell-7">2. PowerShell 7</h2>
<p>PowerShell 是 Windows 上非常重要的命令列與自動化腳本工具。</p>
<p>官方安裝說明：</p>
<p><a href="https://learn.microsoft.com/zh-tw/powershell/scripting/install/install-powershell-on-windows?view=powershell-7.6">https://learn.microsoft.com/zh-tw/powershell/scripting/install/install-powershell-on-windows?view=powershell-7.6</a></p>
<p>PowerShell 可以用來：</p>
<ul>
<li>管理檔案與資料夾</li>
<li>安裝軟體</li>
<li>呼叫 REST API</li>
<li>控制 Windows Service</li>
<li>控制 IIS</li>
<li>建立部署腳本</li>
<li>建立備份腳本</li>
<li>建立排程工作</li>
<li>檢查網站健康狀態</li>
<li>分析 Log</li>
<li>操作 Git</li>
<li>操作 Docker</li>
<li>操作雲端 CLI</li>
<li>建立 CI/CD 腳本</li>
</ul>
<p>確認 PowerShell 版本：</p>
<pre><code class="lang-powershell">pwsh <span class="hljs-comment">--version</span>
</code></pre>
<p>啟動 PowerShell 7：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">pwsh</span>
</code></pre>
<p>PowerShell 特別適合以下環境：</p>
<ul>
<li>Windows Server</li>
<li>IIS</li>
<li>.NET</li>
<li>SQL Server</li>
<li>Active Directory</li>
<li>企業內部系統</li>
<li>自動部署</li>
<li>自動更新</li>
<li>系統維運</li>
</ul>
<p>例如，AI 可以協助建立一支 PowerShell 腳本，自動完成：</p>
<ol>
<li>下載 GitHub 最新 Release。</li>
<li>解壓縮檔案。</li>
<li>停止 IIS。</li>
<li>備份現有網站。</li>
<li>保留 <code>appsettings.json</code>。</li>
<li>更新程式。</li>
<li>啟動 IIS。</li>
<li>驗證網站狀態。</li>
<li>失敗時自動還原。</li>
</ol>
<hr />
<h2 id="3-git">3. Git</h2>
<p>Git 是目前最重要的分散式版本控制工具之一。</p>
<p>官方網站：</p>
<p><a href="https://git-scm.com/">https://git-scm.com/</a></p>
<p>Windows 使用者通常可以從 Git 官方網站下載 <strong>Git for Windows</strong>。</p>
<p>Git 可以用來管理：</p>
<ul>
<li>程式碼版本</li>
<li>修改紀錄</li>
<li>分支</li>
<li>Commit</li>
<li>Tag</li>
<li>Merge</li>
<li>衝突處理</li>
<li>程式碼還原</li>
<li>遠端 Repository</li>
<li>團隊協作</li>
<li>CI/CD 觸發</li>
<li>Release 版本</li>
</ul>
<p>確認 Git 是否安裝完成：</p>
<pre><code class="lang-powershell">git <span class="hljs-comment">--version</span>
</code></pre>
<p>查看目前 Git 設定：</p>
<pre><code class="lang-powershell">git config <span class="hljs-comment">--list</span>
</code></pre>
<p>設定使用者名稱：</p>
<pre><code class="lang-powershell">git config --global user<span class="hljs-selector-class">.name</span> <span class="hljs-string">"Your Name"</span>
</code></pre>
<p>設定電子郵件：</p>
<pre><code class="lang-powershell"><span class="hljs-selector-tag">git</span> <span class="hljs-selector-tag">config</span> <span class="hljs-selector-tag">--global</span> <span class="hljs-selector-tag">user</span><span class="hljs-selector-class">.email</span> "<span class="hljs-selector-tag">you</span>@<span class="hljs-keyword">example</span>.<span class="hljs-keyword">com</span>"
</code></pre>
<p>查看設定結果：</p>
<pre><code class="lang-powershell">git <span class="hljs-keyword">config</span> --<span class="hljs-keyword">global</span> user<span class="hljs-variable">.name</span>
git <span class="hljs-keyword">config</span> --<span class="hljs-keyword">global</span> user<span class="hljs-variable">.email</span>
</code></pre>
<hr />
<h2 id="git-">Git 的基本工作流程</h2>
<p>Git 最常見的操作流程如下：</p>
<pre><code class="lang-text">工作目錄
→ 暫存區
→ 本機 Repository
→ 遠端 Repository
</code></pre>
<p>查看目前修改狀態：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">git status</span>
</code></pre>
<p>將修改加入暫存區：</p>
<pre><code class="lang-powershell">git <span class="hljs-keyword">add</span><span class="bash"> .</span>
</code></pre>
<p>建立 Commit：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">git</span> commit -m <span class="hljs-string">"feat: add login feature"</span>
</code></pre>
<p>推送到遠端：</p>
<pre><code class="lang-powershell">git <span class="hljs-keyword">push</span>
</code></pre>
<hr />
<h2 id="-git-repository">建立新的 Git Repository</h2>
<p>在目前資料夾初始化 Git：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">git init</span>
</code></pre>
<p>加入所有檔案：</p>
<pre><code class="lang-powershell">git <span class="hljs-keyword">add</span><span class="bash"> .</span>
</code></pre>
<p>建立第一個 Commit：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">git</span> commit -m <span class="hljs-string">"Initial commit"</span>
</code></pre>
<p>設定遠端 Repository：</p>
<pre><code class="lang-powershell">git remote <span class="hljs-built_in">add</span> origin http<span class="hljs-variable">s:</span>//github.<span class="hljs-keyword">com</span>/owner/repository.git
</code></pre>
<p>推送至遠端：</p>
<pre><code class="lang-powershell"><span class="hljs-symbol">git</span> <span class="hljs-keyword">branch </span>-M main
<span class="hljs-symbol">git</span> <span class="hljs-keyword">push </span>-u origin main
</code></pre>
<hr />
<h2 id="-">下載既有專案</h2>
<p>Clone Git Repository：</p>
<pre><code class="lang-powershell">git <span class="hljs-keyword">clone</span> <span class="hljs-title">https</span>://github.com/owner/repository.git
</code></pre>
<p>進入專案：</p>
<pre><code class="lang-powershell"><span class="hljs-built_in">cd</span> repository
</code></pre>
<p>查看目前分支：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">git branch</span>
</code></pre>
<p>取得最新版本：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">git pull</span>
</code></pre>
<hr />
<h2 id="-">建立功能分支</h2>
<p>建立並切換到新分支：</p>
<pre><code class="lang-powershell">git <span class="hljs-keyword">switch</span> -c feature/<span class="hljs-keyword">add</span>-login
</code></pre>
<p>較舊的寫法：</p>
<pre><code class="lang-powershell">git checkout -b feature/<span class="hljs-keyword">add</span><span class="bash">-login</span>
</code></pre>
<p>完成修改後：</p>
<pre><code class="lang-powershell">git <span class="hljs-keyword">add</span><span class="bash"> .
</span>git commit -m <span class="hljs-string">"feat: add login feature"</span>
git push -u origin feature/<span class="hljs-keyword">add</span><span class="bash">-login</span>
</code></pre>
<hr />
<h2 id="-git-">常見 Git 指令</h2>
<p>查看 Commit 紀錄：</p>
<pre><code class="lang-powershell">git <span class="hljs-built_in">log</span>
</code></pre>
<p>以精簡格式查看：</p>
<pre><code class="lang-powershell">git <span class="hljs-built_in">log</span> <span class="hljs-comment">--oneline</span>
</code></pre>
<p>查看程式修改內容：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">git diff</span>
</code></pre>
<p>查看已暫存的修改：</p>
<pre><code class="lang-powershell">git diff <span class="hljs-comment">--staged</span>
</code></pre>
<p>查看遠端 Repository：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">git remote -v</span>
</code></pre>
<p>切換分支：</p>
<pre><code class="lang-powershell">git <span class="hljs-keyword">switch</span> main
</code></pre>
<p>合併分支：</p>
<pre><code class="lang-powershell">git merge feature/<span class="hljs-keyword">add</span><span class="bash">-login</span>
</code></pre>
<p>建立標籤：</p>
<pre><code class="lang-powershell">git <span class="hljs-keyword">tag</span> <span class="hljs-title">v1</span>.<span class="hljs-number">0.0</span>
</code></pre>
<p>推送標籤：</p>
<pre><code class="lang-powershell">git <span class="hljs-keyword">push</span> origin v1<span class="hljs-meta">.0</span><span class="hljs-meta">.0</span>
</code></pre>
<hr />
<h2 id="git-ai-">Git 在 AI 開發中的重要性</h2>
<p>AI 可以快速修改大量程式碼，但修改範圍越大，風險也越高。</p>
<p>因此，在讓 AI 操作專案前，建議先建立 Git Commit：</p>
<pre><code class="lang-powershell">git status
git <span class="hljs-keyword">add</span><span class="bash"> .
</span>git commit -m <span class="hljs-string">"chore: backup before AI changes"</span>
</code></pre>
<p>AI 修改完成後，可以透過以下指令檢查差異：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">git diff</span>
</code></pre>
<p>若修改錯誤，可以使用 Git 還原。</p>
<p>還原單一檔案：</p>
<pre><code class="lang-powershell">git <span class="hljs-keyword">restore</span> <span class="hljs-keyword">path</span>/<span class="hljs-keyword">to</span>/<span class="hljs-keyword">file</span>
</code></pre>
<p>取消暫存：</p>
<pre><code class="lang-powershell">git restore --staged path/<span class="hljs-keyword">to</span>/<span class="hljs-keyword">file</span>
</code></pre>
<p>回到上一個 Commit 前，必須先確認是否會影響尚未保存的修改。</p>
<p>Git 對 AI 開發最大的價值包括：</p>
<ul>
<li>保留 AI 修改前的版本</li>
<li>比較 AI 修改內容</li>
<li>快速找出錯誤</li>
<li>分批提交修改</li>
<li>容易進行程式碼審查</li>
<li>發生問題時可以還原</li>
<li>可與 GitHub、GitLab、CI/CD 整合</li>
</ul>
<hr />
<h2 id="4-docker-desktop">4. Docker Desktop</h2>
<p>Docker 可以將應用程式與其執行環境封裝成容器。</p>
<p>官方下載：</p>
<p><a href="https://www.docker.com/products/docker-desktop/">https://www.docker.com/products/docker-desktop/</a></p>
<p>Docker 適合用來建立：</p>
<ul>
<li>PostgreSQL</li>
<li>MySQL</li>
<li>Redis</li>
<li>RabbitMQ</li>
<li>Nginx</li>
<li>Elasticsearch</li>
<li>Qdrant</li>
<li>Milvus</li>
<li>AI API</li>
<li>Python 執行環境</li>
<li>.NET 執行環境</li>
<li>React 前端</li>
<li>測試環境</li>
<li>微服務架構</li>
</ul>
<p>確認 Docker 是否安裝：</p>
<pre><code class="lang-powershell">docker <span class="hljs-comment">--version</span>
</code></pre>
<p>確認 Docker Compose：</p>
<pre><code class="lang-powershell">docker compose <span class="hljs-built_in">version</span>
</code></pre>
<p>查看執行中的容器：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">docker ps</span>
</code></pre>
<p>查看所有容器：</p>
<pre><code class="lang-powershell">docker ps <span class="hljs-_">-a</span>
</code></pre>
<p>例如，使用 Docker 建立 PostgreSQL：</p>
<pre><code class="lang-powershell">docker run --name postgres-dev `
  -<span class="ruby">e POSTGRES_USER=postgres <span class="hljs-string">`
</span></span>  -<span class="ruby"><span class="hljs-string">e POSTGRES_PASSWORD=YourPassword `</span>
</span>  -<span class="ruby">e POSTGRES_DB=appdb <span class="hljs-string">`
</span></span>  -<span class="ruby"><span class="hljs-string">p 5432:5432 `</span>
</span>  -<span class="ruby">d postgres</span>
</code></pre>
<p>AI 可以協助產生：</p>
<ul>
<li><code>Dockerfile</code></li>
<li><code>docker-compose.yml</code></li>
<li>Volume</li>
<li>Network</li>
<li>Health Check</li>
<li>環境變數</li>
<li>多階段建置</li>
<li>正式環境映像檔</li>
<li>容器啟動腳本</li>
</ul>
<hr />
<h2 id="5-node-js">5. Node.js</h2>
<p>Node.js 是 JavaScript 與 TypeScript 的執行環境。</p>
<p>官方網站：</p>
<p><a href="https://nodejs.org/zh-tw">https://nodejs.org/zh-tw</a></p>
<p>Node.js 常用於：</p>
<ul>
<li>React</li>
<li>Vue</li>
<li>Angular</li>
<li>Next.js</li>
<li>Nuxt</li>
<li>Vite</li>
<li>Three.js</li>
<li>Express</li>
<li>NestJS</li>
<li>MCP Server</li>
<li>AI CLI</li>
<li>自動化工具</li>
<li>前端建置</li>
</ul>
<p>確認 Node.js：</p>
<pre><code class="lang-powershell"><span class="hljs-keyword">node</span> <span class="hljs-title">--version</span>
</code></pre>
<p>確認 npm：</p>
<pre><code class="lang-powershell">npm <span class="hljs-comment">--version</span>
</code></pre>
<p>建立 Vite 專案：</p>
<pre><code class="lang-powershell"><span class="hljs-built_in">npm</span> create vite@latest
</code></pre>
<p>安裝套件：</p>
<pre><code class="lang-powershell">npm <span class="hljs-keyword">install</span>
</code></pre>
<p>啟動開發環境：</p>
<pre><code class="lang-powershell">npm <span class="hljs-keyword">run</span><span class="bash"> dev</span>
</code></pre>
<p>建立正式版本：</p>
<pre><code class="lang-powershell">npm <span class="hljs-keyword">run</span><span class="bash"> build</span>
</code></pre>
<p>AI 可以透過 Node.js CLI 協助：</p>
<ul>
<li>建立 React 專案</li>
<li>安裝 UI 套件</li>
<li>建立 API</li>
<li>建立 Three.js 場景</li>
<li>執行 ESLint</li>
<li>執行測試</li>
<li>建立 Production Build</li>
<li>分析 npm 安裝錯誤</li>
</ul>
<hr />
<h2 id="6-python-anaconda">6. Python 或 Anaconda</h2>
<p>Python 是 AI、機器學習、資料分析、自動化與後端 API 常用的程式語言。</p>
<p>Python 官方下載：</p>
<p><a href="https://www.python.org/downloads/">https://www.python.org/downloads/</a></p>
<p>Anaconda 下載：</p>
<p><a href="https://www.anaconda.com/download">https://www.anaconda.com/download</a></p>
<p>Python 常見用途包括：</p>
<ul>
<li>OpenAI API</li>
<li>Azure OpenAI</li>
<li>RAG</li>
<li>Embedding</li>
<li>向量資料庫</li>
<li>機器學習</li>
<li>深度學習</li>
<li>OCR</li>
<li>Whisper</li>
<li>YOLO</li>
<li>資料分析</li>
<li>Excel 處理</li>
<li>網頁爬蟲</li>
<li>FastAPI</li>
<li>Flask</li>
<li>自動化腳本</li>
</ul>
<p>確認 Python：</p>
<pre><code class="lang-powershell"><span class="hljs-keyword">python</span> --<span class="hljs-keyword">version</span>
</code></pre>
<p>確認 pip：</p>
<pre><code class="lang-powershell">pip <span class="hljs-comment">--version</span>
</code></pre>
<p>建立虛擬環境：</p>
<pre><code class="lang-powershell"><span class="hljs-selector-tag">python</span> <span class="hljs-selector-tag">-m</span> <span class="hljs-selector-tag">venv</span> <span class="hljs-selector-class">.venv</span>
</code></pre>
<p>啟用虛擬環境：</p>
<pre><code class="lang-powershell">.<span class="hljs-symbol">\.</span>venv<span class="hljs-symbol">\S</span>cripts<span class="hljs-symbol">\A</span>ctivate.ps1
</code></pre>
<p>安裝套件：</p>
<pre><code class="lang-powershell">pip <span class="hljs-keyword">install</span> fastapi uvicorn openai
</code></pre>
<p>輸出套件清單：</p>
<pre><code class="lang-powershell"><span class="hljs-selector-tag">pip</span> <span class="hljs-selector-tag">freeze</span> &gt; <span class="hljs-selector-tag">requirements</span><span class="hljs-selector-class">.txt</span>
</code></pre>
<p>安裝專案套件：</p>
<pre><code class="lang-powershell">pip <span class="hljs-keyword">install</span> -r requirements.txt
</code></pre>
<p>Anaconda 則特別適合：</p>
<ul>
<li>Jupyter Notebook</li>
<li>資料科學</li>
<li>AI 模型研究</li>
<li>多 Python 環境管理</li>
<li>機器學習套件管理</li>
<li>教學與實驗環境</li>
</ul>
<hr />
<h1 id="-">三、如果要建立雲端服務</h1>
<p>若希望 AI 協助建立或部署雲端服務，應安裝對應平台的官方 CLI。</p>
<hr />
<h2 id="1-google-cloud-cli">1. Google Cloud CLI</h2>
<p>官方網站：</p>
<p><a href="https://cloud.google.com/cli">https://cloud.google.com/cli</a></p>
<p>Google Cloud CLI 的主要指令為：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">gcloud</span>
</code></pre>
<p>可操作：</p>
<ul>
<li>Cloud Run</li>
<li>Compute Engine</li>
<li>Cloud Storage</li>
<li>Cloud SQL</li>
<li>Google Kubernetes Engine</li>
<li>Artifact Registry</li>
<li>Secret Manager</li>
<li>Cloud Functions</li>
<li>IAM</li>
<li>Service Account</li>
<li>VPC</li>
<li>Load Balancer</li>
</ul>
<p>登入 Google Cloud：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">gcloud auth login</span>
</code></pre>
<p>查看帳號：</p>
<pre><code class="lang-powershell">gcloud auth <span class="hljs-built_in">list</span>
</code></pre>
<p>查看專案：</p>
<pre><code class="lang-powershell">gcloud projects <span class="hljs-built_in">list</span>
</code></pre>
<p>設定預設專案：</p>
<pre><code class="lang-powershell">gcloud config <span class="hljs-keyword">set</span> <span class="hljs-keyword">project</span> YOUR_PROJECT_ID
</code></pre>
<p>查看目前設定：</p>
<pre><code class="lang-powershell">gcloud config <span class="hljs-built_in">list</span>
</code></pre>
<p>設定預設區域：</p>
<pre><code class="lang-powershell">gcloud config <span class="hljs-keyword">set</span> <span class="hljs-built_in">run</span>/region asia-east1
</code></pre>
<p>部署 Cloud Run：</p>
<pre><code class="lang-powershell">gcloud <span class="hljs-keyword">run</span><span class="bash"> deploy</span>
</code></pre>
<p>AI 可以根據需求協助：</p>
<ol>
<li>建立 Google Cloud 專案。</li>
<li>啟用相關 API。</li>
<li>建立 Artifact Registry。</li>
<li>建立 Docker Image。</li>
<li>推送映像檔。</li>
<li>建立 Cloud Run。</li>
<li>設定 Secret Manager。</li>
<li>設定環境變數。</li>
<li>設定自訂網域。</li>
<li>建立自動部署腳本。</li>
</ol>
<hr />
<h2 id="2-firebase-cli">2. Firebase CLI</h2>
<p>官方文件：</p>
<p><a href="https://firebase.google.com/docs/cli?hl=zh-cn">https://firebase.google.com/docs/cli?hl=zh-cn</a></p>
<p>Firebase CLI 通常透過 npm 安裝：</p>
<pre><code class="lang-powershell">npm <span class="hljs-keyword">install</span> -g firebase-tools
</code></pre>
<p>確認版本：</p>
<pre><code class="lang-powershell">firebase <span class="hljs-comment">--version</span>
</code></pre>
<p>登入：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">firebase login</span>
</code></pre>
<p>查看專案：</p>
<pre><code class="lang-powershell">firebase projects:<span class="hljs-built_in">list</span>
</code></pre>
<p>初始化 Firebase：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">firebase init</span>
</code></pre>
<p>切換專案：</p>
<pre><code class="lang-powershell">firebase <span class="hljs-keyword">use</span> PROJECT_ID
</code></pre>
<p>部署：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">firebase deploy</span>
</code></pre>
<p>Firebase CLI 可管理：</p>
<ul>
<li>Firebase Hosting</li>
<li>Firestore</li>
<li>Authentication</li>
<li>Cloud Functions</li>
<li>Storage</li>
<li>Emulator</li>
<li>Remote Config</li>
<li>App Hosting</li>
<li>Security Rules</li>
</ul>
<p>AI 可以協助建立：</p>
<ul>
<li><code>firebase.json</code></li>
<li>Firestore Rules</li>
<li>Storage Rules</li>
<li>Functions 專案</li>
<li>Hosting 設定</li>
<li>Emulator 設定</li>
<li>CI/CD 部署流程</li>
</ul>
<hr />
<h2 id="3-azure-cli">3. Azure CLI</h2>
<p>官方安裝說明：</p>
<p><a href="https://learn.microsoft.com/zh-tw/cli/azure/install-azure-cli?view=azure-cli-latest">https://learn.microsoft.com/zh-tw/cli/azure/install-azure-cli?view=azure-cli-latest</a></p>
<p>Azure CLI 的主要指令為：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">az</span>
</code></pre>
<p>登入 Azure：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">az login</span>
</code></pre>
<p>查看訂閱：</p>
<pre><code class="lang-powershell">az account <span class="hljs-built_in">list</span> <span class="hljs-comment">--output table</span>
</code></pre>
<p>設定訂閱：</p>
<pre><code class="lang-powershell">az account <span class="hljs-keyword">set</span> --subscription <span class="hljs-comment">"訂閱名稱或訂閱 ID"</span>
</code></pre>
<p>建立 Resource Group：</p>
<pre><code class="lang-powershell">az <span class="hljs-keyword">group</span> <span class="hljs-title">create</span> `
  --name DemoResourceGroup `
  --<span class="hljs-keyword">location</span> <span class="hljs-title">eastasia</span>
</code></pre>
<p>Azure CLI 可操作：</p>
<ul>
<li>App Service</li>
<li>Azure Functions</li>
<li>Container Apps</li>
<li>Azure Kubernetes Service</li>
<li>Azure SQL</li>
<li>PostgreSQL Flexible Server</li>
<li>Storage Account</li>
<li>Key Vault</li>
<li>Azure OpenAI</li>
<li>Virtual Machine</li>
<li>Azure Container Registry</li>
<li>Application Insights</li>
<li>Azure Monitor</li>
<li>Service Bus</li>
<li>Redis</li>
</ul>
<p>AI 可以根據需求產生：</p>
<ul>
<li>建立資源腳本</li>
<li>更新部署腳本</li>
<li>環境變數設定</li>
<li>Key Vault 設定</li>
<li>網路安全設定</li>
<li>Application Insights 監控</li>
<li>刪除測試環境腳本</li>
</ul>
<hr />
<h1 id="-">四、資料庫工具</h1>
<p>AI 應用通常需要儲存：</p>
<ul>
<li>使用者資料</li>
<li>系統設定</li>
<li>對話紀錄</li>
<li>文件索引</li>
<li>Embedding</li>
<li>分析結果</li>
<li>操作 Log</li>
<li>任務狀態</li>
<li>權限資料</li>
<li>AI Agent 執行紀錄</li>
</ul>
<p>因此，資料庫也是 AI CLI 開發環境的重要部分。</p>
<hr />
<h2 id="1-postgresql">1. PostgreSQL</h2>
<p>下載網址：</p>
<p><a href="https://www.enterprisedb.com/downloads/postgres-postgresql-downloads">https://www.enterprisedb.com/downloads/postgres-postgresql-downloads</a></p>
<p>PostgreSQL 適合：</p>
<ul>
<li>企業管理系統</li>
<li>SaaS</li>
<li>AI 應用</li>
<li>RAG</li>
<li>JSON 資料</li>
<li>全文檢索</li>
<li>地理資訊</li>
<li>向量搜尋</li>
<li>多租戶系統</li>
</ul>
<p>搭配 <code>pgvector</code> 後，PostgreSQL 也可以儲存與搜尋 Embedding。</p>
<p>確認 PostgreSQL CLI：</p>
<pre><code class="lang-powershell">psql <span class="hljs-comment">--version</span>
</code></pre>
<p>連線本機 PostgreSQL：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">psql -h localhost -U postgres</span>
</code></pre>
<p>指定資料庫：</p>
<pre><code class="lang-powershell">psql -h localhost -U postgres <span class="hljs-_">-d</span> appdb
</code></pre>
<p>建立資料庫：</p>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> ai_demo;
</code></pre>
<p>查看資料庫：</p>
<pre><code class="lang-sql"><span class="hljs-string">\l</span>
</code></pre>
<p>查看資料表：</p>
<pre><code class="lang-sql">\d<span class="hljs-built_in">t</span>
</code></pre>
<p>離開：</p>
<pre><code class="lang-sql"><span class="hljs-string">\q</span>
</code></pre>
<hr />
<h2 id="2-pgadmin">2. pgAdmin</h2>
<p>官方網站：</p>
<p><a href="https://www.pgadmin.org/">https://www.pgadmin.org/</a></p>
<p>pgAdmin 是 PostgreSQL 的圖形化管理工具，可用來：</p>
<ul>
<li>建立資料庫</li>
<li>建立資料表</li>
<li>執行 SQL</li>
<li>管理帳號</li>
<li>管理權限</li>
<li>查看連線</li>
<li>備份</li>
<li>還原</li>
<li>查看效能</li>
</ul>
<p>CLI 適合自動化，pgAdmin 適合視覺化管理，兩者可以搭配使用。</p>
<hr />
<h2 id="3-sqlite">3. SQLite</h2>
<p>官方網站：</p>
<p><a href="https://www.sqlite.org/">https://www.sqlite.org/</a></p>
<p>SQLite 是輕量級嵌入式資料庫，不需要獨立資料庫伺服器。</p>
<p>適合：</p>
<ul>
<li>桌面程式</li>
<li>手機 App</li>
<li>小型系統</li>
<li>單機工具</li>
<li>PoC</li>
<li>快速雛型</li>
<li>開發測試</li>
<li>本機 AI 工具</li>
<li>小型 RAG</li>
</ul>
<p>資料通常儲存在單一檔案中，例如：</p>
<pre><code class="lang-text"><span class="hljs-keyword">app</span>.<span class="hljs-keyword">db</span>
</code></pre>
<p>開啟資料庫：</p>
<pre><code class="lang-powershell">sqlite3 <span class="hljs-keyword">app</span>.<span class="hljs-keyword">db</span>
</code></pre>
<p>查看資料表：</p>
<pre><code class="lang-sql"><span class="hljs-title">.tables</span>
</code></pre>
<p>查看資料表結構：</p>
<pre><code class="lang-sql"><span class="hljs-selector-class">.schema</span> users
</code></pre>
<p>離開 SQLite：</p>
<pre><code class="lang-sql"><span class="hljs-title">.quit</span>
</code></pre>
<hr />
<h2 id="4-db-browser-for-sqlite">4. DB Browser for SQLite</h2>
<p>官方網站：</p>
<p><a href="https://sqlitebrowser.org/">https://sqlitebrowser.org/</a></p>
<p>DB Browser for SQLite 可以透過圖形化介面：</p>
<ul>
<li>開啟 SQLite</li>
<li>查看資料表</li>
<li>編輯資料</li>
<li>執行 SQL</li>
<li>匯入 CSV</li>
<li>匯出 CSV</li>
<li>查看索引</li>
<li>修改資料表結構</li>
</ul>
<p>當 AI 產生 SQLite 專案後，可以使用 DB Browser 驗證資料是否正確。</p>
<hr />
<h1 id="-cli">五、版本控制與遠端平台 CLI</h1>
<p>Git、GitHub CLI 與 GitLab CLI 是不同層級的工具。</p>
<p>可以簡單理解為：</p>
<table>
<thead>
<tr>
<th>工具</th>
<th>主要用途</th>
</tr>
</thead>
<tbody>
<tr>
<td>Git</td>
<td>管理本機與遠端程式碼版本</td>
</tr>
<tr>
<td>GitHub CLI</td>
<td>操作 GitHub 平台功能</td>
</tr>
<tr>
<td>GitLab CLI</td>
<td>操作 GitLab 平台功能</td>
</tr>
</tbody>
</table>
<p>GitHub CLI 與 GitLab CLI 不能取代 Git。</p>
<p>一般情況下，應先安裝 Git，再安裝 GitHub CLI 或 GitLab CLI。</p>
<hr />
<h2 id="1-git">1. Git</h2>
<p>官方網站：</p>
<p><a href="https://git-scm.com/">https://git-scm.com/</a></p>
<p>Git 負責：</p>
<ul>
<li>Clone</li>
<li>Add</li>
<li>Commit</li>
<li>Pull</li>
<li>Push</li>
<li>Branch</li>
<li>Merge</li>
<li>Tag</li>
<li>Diff</li>
<li>Restore</li>
</ul>
<p>例如：</p>
<pre><code class="lang-powershell">git clone https://github.com/owner/repository.git
git switch -c <span class="hljs-built_in">feature</span>/<span class="hljs-built_in">new</span>-page
git add .
git commit -m <span class="hljs-string">"feat: add new page"</span>
git <span class="hljs-built_in">push</span> -u <span class="hljs-built_in">origin</span> <span class="hljs-built_in">feature</span>/<span class="hljs-built_in">new</span>-page
</code></pre>
<hr />
<h2 id="2-github-cli">2. GitHub CLI</h2>
<p>官方網站：</p>
<p><a href="https://cli.github.com/">https://cli.github.com/</a></p>
<p>GitHub CLI 的主要指令是：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">gh</span>
</code></pre>
<p>登入 GitHub：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">gh auth login</span>
</code></pre>
<p>查看登入狀態：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">gh auth status</span>
</code></pre>
<p>建立 Repository：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">gh repo create</span>
</code></pre>
<p>下載 Repository：</p>
<pre><code class="lang-powershell">gh repo <span class="hljs-keyword">clone</span> <span class="hljs-title">owner</span>/repository
</code></pre>
<p>建立 Issue：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">gh issue create</span>
</code></pre>
<p>查看 Issue：</p>
<pre><code class="lang-powershell">gh issue <span class="hljs-built_in">list</span>
</code></pre>
<p>建立 Pull Request：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">gh pr create</span>
</code></pre>
<p>查看 Pull Request：</p>
<pre><code class="lang-powershell">gh <span class="hljs-keyword">pr</span> <span class="hljs-keyword">list</span>
</code></pre>
<p>查看 GitHub Actions：</p>
<pre><code class="lang-powershell">gh <span class="hljs-built_in">run</span> <span class="hljs-built_in">list</span>
</code></pre>
<p>查看執行結果：</p>
<pre><code class="lang-powershell">gh <span class="hljs-keyword">run</span><span class="bash"> view</span>
</code></pre>
<p>查看失敗 Log：</p>
<pre><code class="lang-powershell">gh <span class="hljs-keyword">run</span> <span class="hljs-built_in">view</span> --<span class="hljs-built_in">log</span>-failed
</code></pre>
<p>GitHub CLI 可讓 AI 協助：</p>
<ul>
<li>建立 Repository</li>
<li>建立 Issue</li>
<li>建立 Pull Request</li>
<li>查看 Review</li>
<li>分析 GitHub Actions</li>
<li>下載 Release</li>
<li>建立 Release</li>
<li>管理 Workflow</li>
<li>管理 GitHub 專案</li>
</ul>
<hr />
<h2 id="3-gitlab-cli">3. GitLab CLI</h2>
<p>GitLab CLI 發布頁：</p>
<p><a href="https://gitlab.com/gitlab-org/cli/-/releases">https://gitlab.com/gitlab-org/cli/-/releases</a></p>
<p>GitLab CLI 的主要指令為：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">glab</span>
</code></pre>
<p>登入 GitLab：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">glab auth login</span>
</code></pre>
<p>GitLab CLI 可以連線：</p>
<ul>
<li>GitLab.com</li>
<li>自建 GitLab Server</li>
</ul>
<p>查看 Issue：</p>
<pre><code class="lang-powershell">glab issue <span class="hljs-built_in">list</span>
</code></pre>
<p>建立 Issue：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">glab issue create</span>
</code></pre>
<p>查看 Merge Request：</p>
<pre><code class="lang-powershell">glab mr <span class="hljs-built_in">list</span>
</code></pre>
<p>建立 Merge Request：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">glab mr create</span>
</code></pre>
<p>查看 Pipeline：</p>
<pre><code class="lang-powershell">glab pipeline <span class="hljs-built_in">list</span>
</code></pre>
<p>查看 CI 狀態：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">glab ci status</span>
</code></pre>
<p>GitLab CLI 可讓 AI 協助：</p>
<ul>
<li>建立 Issue</li>
<li>建立 Merge Request</li>
<li>查看 Pipeline</li>
<li>建立 Release</li>
<li>分析 CI/CD</li>
<li>操作自建 GitLab</li>
<li>管理專案工作流程</li>
</ul>
<p>需要注意：</p>
<blockquote><p>GitLab CLI 負責管理 GitLab 平台，真正執行 CI/CD 工作的元件仍是 GitLab Runner。</p></blockquote>
<hr />
<h1 id="-ai-cli-">六、AI 搭配 CLI 可以做哪些事情？</h1>
<hr />
<h2 id="1-">1. 建立網站專案</h2>
<p>提示詞範例：</p>
<pre><code class="lang-text">請使用 Vite 建立 React TypeScript 專案。

需求：
-<span class="ruby"> 使用 React
</span>-<span class="ruby"> 使用 TypeScript
</span>-<span class="ruby"> 使用 Tailwind CSS
</span>-<span class="ruby"> 建立首頁
</span>-<span class="ruby"> 建立登入頁
</span>-<span class="ruby"> 建立後台 Dashboard
</span>-<span class="ruby"> 使用 React Router
</span>-<span class="ruby"> 安裝套件
</span>-<span class="ruby"> 執行 npm run build
</span>-<span class="ruby"> 修正所有建置錯誤</span>
</code></pre>
<p>AI 可以協助執行：</p>
<pre><code class="lang-powershell"><span class="hljs-built_in">npm</span> create vite@latest
<span class="hljs-built_in">npm</span> install
<span class="hljs-built_in">npm</span> install react-router-dom
<span class="hljs-built_in">npm</span> run build
</code></pre>
<p>並建立：</p>
<ul>
<li>React 元件</li>
<li>路由</li>
<li>表單</li>
<li>Dashboard</li>
<li>API Service</li>
<li>CSS</li>
<li>環境變數</li>
</ul>
<hr />
<h2 id="2-python-api">2. 建立 Python API</h2>
<p>提示詞範例：</p>
<pre><code class="lang-text">請建立一個 Python FastAPI 專案。

需求：
-<span class="ruby"> 提供健康檢查 API
</span>-<span class="ruby"> 提供使用者登入 API
</span>-<span class="ruby"> 提供 AI 問答 API
</span>-<span class="ruby"> 使用 SQLite
</span>-<span class="ruby"> 使用 SQLAlchemy
</span>-<span class="ruby"> 建立 requirements.txt
</span>-<span class="ruby"> 建立單元測試
</span>-<span class="ruby"> 啟動後驗證 API</span>
</code></pre>
<p>AI 可以建立：</p>
<pre><code class="lang-text">app/
├─ main<span class="hljs-selector-class">.py</span>
├─ database<span class="hljs-selector-class">.py</span>
├─ models<span class="hljs-selector-class">.py</span>
├─ schemas<span class="hljs-selector-class">.py</span>
├─ services/
├─ routers/
├─ tests/
├─ requirements<span class="hljs-selector-class">.txt</span>
└─ README.md
</code></pre>
<p>並執行：</p>
<pre><code class="lang-powershell">python -m venv <span class="hljs-selector-class">.venv</span>
.\.venv\Scripts\Activate<span class="hljs-selector-class">.ps1</span>
pip install fastapi uvicorn sqlalchemy pytest
uvicorn app<span class="hljs-selector-class">.main</span>:app --reload
pytest
</code></pre>
<hr />
<h2 id="3-docker-">3. 建立 Docker 環境</h2>
<p>提示詞範例：</p>
<pre><code class="lang-text">請將目前 FastAPI 專案容器化。

需求：
-<span class="ruby"> 建立 Dockerfile
</span>-<span class="ruby"> 建立 docker-compose.yml
</span>-<span class="ruby"> 建立 PostgreSQL
</span>-<span class="ruby"> 建立 Redis
</span>-<span class="ruby"> 建立健康檢查
</span>-<span class="ruby"> 使用環境變數
</span>-<span class="ruby"> 啟動後測試 API</span>
</code></pre>
<p>AI 可以執行：</p>
<pre><code class="lang-powershell">docker compose up -d <span class="hljs-comment">--build</span>
</code></pre>
<p>查看容器：</p>
<pre><code class="lang-powershell"><span class="hljs-attribute">docker compose ps</span>
</code></pre>
<p>查看 Log：</p>
<pre><code class="lang-powershell">docker compose logs <span class="hljs-_">-f</span>
</code></pre>
<hr />
<h2 id="4-google-cloud">4. 部署 Google Cloud</h2>
<p>提示詞範例：</p>
<pre><code class="lang-text">我要在 Google Cloud 建立一個網頁服務。

請使用 gcloud CLI 協助規劃與部署。

需求：
-<span class="ruby"> Python FastAPI
</span>-<span class="ruby"> 使用 Docker
</span>-<span class="ruby"> 部署至 Cloud Run
</span>-<span class="ruby"> 區域使用 asia-east1
</span>-<span class="ruby"> 使用 Artifact Registry
</span>-<span class="ruby"> 使用 Secret Manager 儲存 API Key
</span>-<span class="ruby"> 設定環境變數
</span>-<span class="ruby"> 提供部署與刪除腳本
</span>-<span class="ruby"> 建立付費資源前先列出資源清單</span>
</code></pre>
<p>AI 可以依序協助：</p>
<ol>
<li>檢查 gcloud。</li>
<li>登入帳號。</li>
<li>設定 Project。</li>
<li>啟用 API。</li>
<li>建立 Artifact Registry。</li>
<li>建立 Docker Image。</li>
<li>推送 Image。</li>
<li>建立 Secret。</li>
<li>部署 Cloud Run。</li>
<li>驗證服務網址。</li>
</ol>
<hr />
<h2 id="5-azure-">5. 部署 Azure 服務</h2>
<p>提示詞範例：</p>
<pre><code class="lang-text">請使用 Azure CLI 部署一個 .NET Web API。

需求：
-<span class="ruby"> 建立 Resource Group
</span>-<span class="ruby"> 建立 Linux App Service
</span>-<span class="ruby"> 建立 PostgreSQL Flexible Server
</span>-<span class="ruby"> 使用 Key Vault
</span>-<span class="ruby"> 使用 Application Insights
</span>-<span class="ruby"> 設定正式環境變數
</span>-<span class="ruby"> 提供建立、更新與刪除腳本</span>
</code></pre>
<p>AI 可以產生與執行：</p>
<ul>
<li><code>az group create</code></li>
<li><code>az appservice plan create</code></li>
<li><code>az webapp create</code></li>
<li><code>az postgres flexible-server create</code></li>
<li><code>az keyvault create</code></li>
<li><code>az monitor app-insights component create</code></li>
</ul>
<hr />
<h2 id="6-firebase">6. 操作 Firebase</h2>
<p>提示詞範例：</p>
<pre><code class="lang-text">請使用 Firebase CLI 建立一個 React 網站。

需求：
-<span class="ruby"> 使用 Firebase Hosting
</span>-<span class="ruby"> 使用 Firestore
</span>-<span class="ruby"> 使用 Authentication
</span>-<span class="ruby"> 建立 Security Rules
</span>-<span class="ruby"> 建立本機 Emulator
</span>-<span class="ruby"> 建立 GitHub Actions 自動部署</span>
</code></pre>
<p>AI 可以協助執行：</p>
<pre><code class="lang-powershell">firebase login
firebase init
firebase emulators:<span class="hljs-literal">start</span>
firebase deploy
</code></pre>
<hr />
<h2 id="7-git-github">7. 操作 Git 與 GitHub</h2>
<p>提示詞範例：</p>
<pre><code class="lang-text">請檢查目前專案修改內容。

接著：
<span class="hljs-bullet">1. </span>建立 feature/login 分支。
<span class="hljs-bullet">2. </span>將修改分成合理的 Commit。
<span class="hljs-bullet">3. </span>推送到 GitHub。
<span class="hljs-bullet">4. </span>使用 GitHub CLI 建立 Pull Request。
<span class="hljs-bullet">5. </span>在 Pull Request 說明中列出修改內容與測試結果。
</code></pre>
<p>AI 可能執行：</p>
<pre><code class="lang-powershell">git <span class="hljs-built_in">status</span>
git <span class="hljs-built_in">diff</span>
git switch -c <span class="hljs-built_in">feature</span>/login
git add .
git commit -m <span class="hljs-string">"feat: add login feature"</span>
git <span class="hljs-built_in">push</span> -u <span class="hljs-built_in">origin</span> <span class="hljs-built_in">feature</span>/login
gh pr create
</code></pre>
<hr />
<h2 id="8-git-gitlab">8. 操作 Git 與 GitLab</h2>
<p>提示詞範例：</p>
<pre><code class="lang-text">請分析目前修改內容。

接著：
<span class="hljs-bullet">1. </span>建立 feature/report 分支。
<span class="hljs-bullet">2. </span>建立 Commit。
<span class="hljs-bullet">3. </span>推送到公司自建 GitLab。
<span class="hljs-bullet">4. </span>使用 glab 建立 Merge Request。
<span class="hljs-bullet">5. </span>檢查 GitLab Pipeline。
</code></pre>
<p>AI 可能執行：</p>
<pre><code class="lang-powershell">git switch -c <span class="hljs-built_in">feature</span>/report
git add .
git commit -m <span class="hljs-string">"feat: add report module"</span>
git <span class="hljs-built_in">push</span> -u <span class="hljs-built_in">origin</span> <span class="hljs-built_in">feature</span>/report
glab mr create
glab pipeline list
</code></pre>
<hr />
<h2 id="9-windows-iis">9. 自動管理 Windows 與 IIS</h2>
<p>提示詞範例：</p>
<pre><code class="lang-text">請使用 PowerShell 建立網站自動更新腳本。

流程：
<span class="hljs-bullet">1. </span>從 GitHub Release 取得最新版本。
<span class="hljs-bullet">2. </span>下載 ZIP。
<span class="hljs-bullet">3. </span>驗證檔案。
<span class="hljs-bullet">4. </span>解壓縮。
<span class="hljs-bullet">5. </span>停止 IIS App Pool。
<span class="hljs-bullet">6. </span>備份目前網站。
<span class="hljs-bullet">7. </span>保留 appsettings.json。
<span class="hljs-bullet">8. </span>更新其他程式檔案。
<span class="hljs-bullet">9. </span>啟動 IIS App Pool。
<span class="hljs-bullet">10. </span>呼叫健康檢查網址。
<span class="hljs-bullet">11. </span>失敗時還原。
<span class="hljs-bullet">12. </span>將完整過程寫入 Log。
</code></pre>
<p>AI 可以協助：</p>
<ul>
<li>撰寫腳本</li>
<li>執行腳本</li>
<li>分析權限錯誤</li>
<li>驗證 IIS</li>
<li>驗證網址</li>
<li>建立失敗還原機制</li>
</ul>
<hr />
<h1 id="-ai-cli-">七、如何撰寫適合 AI CLI 的提示詞？</h1>
<p>不建議只寫：</p>
<pre><code class="lang-text">幫我建立一個網站。
</code></pre>
<p>這類提示詞過於模糊，AI 很難判斷：</p>
<ul>
<li>使用什麼程式語言</li>
<li>使用什麼框架</li>
<li>是否使用 Docker</li>
<li>是否需要資料庫</li>
<li>是否需要部署</li>
<li>可以操作哪些 CLI</li>
<li>是否可以安裝套件</li>
<li>是否可以修改現有檔案</li>
</ul>
<p>建議至少包含以下內容：</p>
<ol>
<li>目標。</li>
<li>技術架構。</li>
<li>執行環境。</li>
<li>可使用工具。</li>
<li>功能需求。</li>
<li>驗證方式。</li>
<li>權限限制。</li>
<li>安全限制。</li>
<li>部署平台。</li>
<li>最終交付內容。</li>
</ol>
<hr />
<h2 id="-">建議提示詞模板</h2>
<pre><code class="lang-text">你是一位資深軟體架構師、AI 工程師與 DevOps 工程師。

請在目前目錄建立一個可執行的專案。

技術需求：
<span class="hljs-bullet">- </span>前端：React、TypeScript
<span class="hljs-bullet">- </span>後端：Python FastAPI
<span class="hljs-bullet">- </span>資料庫：PostgreSQL
<span class="hljs-bullet">- </span>快取：Redis
<span class="hljs-bullet">- </span>容器：Docker Compose
<span class="hljs-bullet">- </span>雲端：Google Cloud Run
<span class="hljs-bullet">- </span>版本控制：GitHub

可使用工具：
<span class="hljs-bullet">- </span>PowerShell
<span class="hljs-bullet">- </span>Git
<span class="hljs-bullet">- </span>GitHub CLI
<span class="hljs-bullet">- </span>Python CLI
<span class="hljs-bullet">- </span>Node.js CLI
<span class="hljs-bullet">- </span>Docker CLI
<span class="hljs-bullet">- </span>gcloud CLI

執行要求：
<span class="hljs-bullet">1. </span>先檢查所有必要工具是否安裝。
<span class="hljs-bullet">2. </span>查看目前資料夾與既有檔案。
<span class="hljs-bullet">3. </span>不要直接覆蓋重要檔案。
<span class="hljs-bullet">4. </span>建立專案結構。
<span class="hljs-bullet">5. </span>安裝必要套件。
<span class="hljs-bullet">6. </span>建立資料庫設定。
<span class="hljs-bullet">7. </span>建立 Dockerfile 與 docker-compose.yml。
<span class="hljs-bullet">8. </span>建立健康檢查 API。
<span class="hljs-bullet">9. </span>建立單元測試。
<span class="hljs-bullet">10. </span>執行建置與測試。
<span class="hljs-bullet">11. </span>修正所有錯誤。
<span class="hljs-bullet">12. </span>建立 Git 分支與 Commit。
<span class="hljs-bullet">13. </span>提供 Cloud Run 部署腳本。
<span class="hljs-bullet">14. </span>涉及付費資源前，先列出資源與可能費用。
<span class="hljs-bullet">15. </span>不要將密碼、Token 或 API Key 寫入 Git。
</code></pre>
<hr />
<h1 id="-3d-3d-">八、網頁 3D 與程式 3D 工具選擇</h1>
<hr />
<h2 id="-3d-three-js">網頁 3D：Three.js</h2>
<p>Three.js 是基於 WebGL 的 JavaScript 3D 函式庫。</p>
<p>適合：</p>
<ul>
<li>網頁 3D 展示</li>
<li>產品模型展示</li>
<li>3D 模型檢視器</li>
<li>互動式場景</li>
<li>數位孿生介面</li>
<li>WebXR</li>
<li>教學模擬</li>
<li>網頁小遊戲</li>
<li>工業設備視覺化</li>
</ul>
<p>安裝 Three.js：</p>
<pre><code class="lang-powershell">npm <span class="hljs-keyword">install</span> three
</code></pre>
<p>建立 Vite 專案：</p>
<pre><code class="lang-powershell"><span class="hljs-built_in">npm</span> create vite@latest threejs-demo
cd threejs-demo
<span class="hljs-built_in">npm</span> install
<span class="hljs-built_in">npm</span> install three
<span class="hljs-built_in">npm</span> run dev
</code></pre>
<p>Three.js 可以搭配：</p>
<ul>
<li>React Three Fiber</li>
<li>Drei</li>
<li>Vite</li>
<li>Blender</li>
<li>GLTF</li>
<li>GLB</li>
<li>WebXR</li>
<li>Cannon.js</li>
<li>Rapier</li>
</ul>
<p>提示詞範例：</p>
<pre><code class="lang-text">請使用 Vite、TypeScript 與 Three.js 建立 3D 網頁。

需求：
-<span class="ruby"> 建立地板
</span>-<span class="ruby"> 建立環境光
</span>-<span class="ruby"> 建立方向光
</span>-<span class="ruby"> 載入 GLB 模型
</span>-<span class="ruby"> 支援滑鼠旋轉
</span>-<span class="ruby"> 支援模型縮放
</span>-<span class="ruby"> 支援物件點擊
</span>-<span class="ruby"> 顯示物件資訊
</span>-<span class="ruby"> 加入載入進度
</span>-<span class="ruby"> 加入效能統計
</span>-<span class="ruby"> 執行 npm run build 驗證</span>
</code></pre>
<hr />
<h2 id="-unity">程式、遊戲與工業模擬：Unity</h2>
<p>Unity 是跨平台 2D／3D 開發引擎，主要使用 C#。</p>
<p>適合：</p>
<ul>
<li>Windows 3D 程式</li>
<li>手機 App</li>
<li>3D 遊戲</li>
<li>AR</li>
<li>VR</li>
<li>工業模擬</li>
<li>教育訓練</li>
<li>數位孿生</li>
<li>物理模擬</li>
<li>互動式展示</li>
</ul>
<p>Unity 適合需要以下能力的專案：</p>
<ul>
<li>角色控制</li>
<li>動畫系統</li>
<li>物理引擎</li>
<li>碰撞偵測</li>
<li>多平台輸出</li>
<li>VR／AR 裝置</li>
<li>複雜場景管理</li>
<li>手機感測器</li>
<li>工業設備模擬</li>
</ul>
<p>工具選擇參考：</p>
<table>
<thead>
<tr>
<th>使用情境</th>
<th>建議工具</th>
</tr>
</thead>
<tbody>
<tr>
<td>網頁顯示 3D 模型</td>
<td>Three.js</td>
</tr>
<tr>
<td>網頁互動 3D 場景</td>
<td>Three.js</td>
</tr>
<tr>
<td>網頁產品展示</td>
<td>Three.js</td>
</tr>
<tr>
<td>網頁輕量遊戲</td>
<td>Three.js</td>
</tr>
<tr>
<td>Windows 3D 程式</td>
<td>Unity</td>
</tr>
<tr>
<td>手機 3D App</td>
<td>Unity</td>
</tr>
<tr>
<td>AR／VR 應用</td>
<td>Unity</td>
</tr>
<tr>
<td>完整 3D 遊戲</td>
<td>Unity</td>
</tr>
<tr>
<td>工業模擬</td>
<td>Unity</td>
</tr>
<tr>
<td>教育訓練模擬</td>
<td>Unity</td>
</tr>
</tbody>
</table>
<hr />
<h1 id="-">九、安全與權限管理</h1>
<p>AI 能操作 CLI，代表它也可能執行具有破壞性的指令。</p>
<p>因此，必須建立明確的安全界線。</p>
<hr />
<h2 id="1-">1. 不要將密碼寫入提示詞或程式碼</h2>
<p>避免直接提供：</p>
<ul>
<li>密碼</li>
<li>API Key</li>
<li>Access Token</li>
<li>GitHub Token</li>
<li>GitLab Token</li>
<li>資料庫密碼</li>
<li>SSH Private Key</li>
<li>Service Account Key</li>
<li>Azure Client Secret</li>
</ul>
<p>建議使用：</p>
<ul>
<li>環境變數</li>
<li><code>.env</code></li>
<li>User Secrets</li>
<li>Azure Key Vault</li>
<li>Google Secret Manager</li>
<li>GitHub Secrets</li>
<li>GitLab CI/CD Variables</li>
</ul>
<p><code>.gitignore</code> 建議包含：</p>
<pre><code class="lang-gitignore"><span class="hljs-selector-class">.env</span>
<span class="hljs-selector-class">.env</span>.*
*<span class="hljs-selector-class">.key</span>
*<span class="hljs-selector-class">.pem</span>
<span class="hljs-selector-tag">appsettings</span><span class="hljs-selector-class">.Production</span><span class="hljs-selector-class">.json</span>
<span class="hljs-selector-tag">secrets</span><span class="hljs-selector-class">.json</span>
<span class="hljs-selector-tag">service-account</span><span class="hljs-selector-class">.json</span>
</code></pre>
<hr />
<h2 id="2-">2. 執行刪除指令前必須確認</h2>
<p>以下指令可能造成嚴重影響：</p>
<pre><code class="lang-powershell">Remove-Item -Recurse -Force
rm -rf
docker <span class="hljs-keyword">system</span> prune -<span class="hljs-keyword">a</span>
az group <span class="hljs-built_in">delete</span>
gcloud projects <span class="hljs-built_in">delete</span>
git reset <span class="hljs-comment">--hard</span>
git clean -fd
</code></pre>
<p>執行前應先：</p>
<ul>
<li>顯示操作目標</li>
<li>顯示實際路徑</li>
<li>顯示預計刪除內容</li>
<li>建立備份</li>
<li>建立 Git Commit</li>
<li>優先在測試環境操作</li>
<li>避免直接操作正式環境</li>
</ul>
<hr />
<h2 id="3-git-">3. 使用 Git 保護程式碼</h2>
<p>AI 大量修改程式前，先執行：</p>
<pre><code class="lang-powershell">git status
git <span class="hljs-keyword">add</span><span class="bash"> .
</span>git commit -m <span class="hljs-string">"chore: snapshot before AI changes"</span>
</code></pre>
<p>修改完成後檢查：</p>
<pre><code class="lang-powershell">git <span class="hljs-built_in">diff</span>
git <span class="hljs-built_in">status</span>
</code></pre>
<p>這樣可以：</p>
<ul>
<li>查看 AI 改了什麼</li>
<li>找出不合理修改</li>
<li>分批審查</li>
<li>還原錯誤</li>
<li>保留歷史紀錄</li>
</ul>
<hr />
<h2 id="4-">4. 區分不同環境</h2>
<p>建議至少區分：</p>
<pre><code class="lang-text">Development
<span class="hljs-keyword">Testing
</span>Staging
Production
</code></pre>
<p>AI 初期應優先操作：</p>
<ul>
<li>Development</li>
<li>Testing</li>
<li>個人雲端專案</li>
<li>測試用 Resource Group</li>
<li>測試用 Git 分支</li>
<li>測試資料庫</li>
</ul>
<p>避免一開始就讓 AI 取得 Production 最高權限。</p>
<hr />
<h2 id="5-">5. 使用最小權限原則</h2>
<p>AI 使用的帳號、Token 或 Service Account，只應取得必要權限。</p>
<p>例如：</p>
<ul>
<li>部署 Cloud Run 不一定需要 Project Owner</li>
<li>建立 Pull Request 不需要 Repository Admin</li>
<li>查詢資料庫不一定需要 DROP 權限</li>
<li>讀取 Log 不需要系統管理員權限</li>
<li>Firebase 部署不一定需要完整 Google Cloud 管理權限</li>
</ul>
<hr />
<h1 id="-">十、安裝完成後的環境檢查</h1>
<p>可以使用 PowerShell 快速檢查常用工具是否存在：</p>
<pre><code class="lang-powershell"><span class="hljs-variable">$commands</span> = @(
    <span class="hljs-string">"pwsh"</span>,
    <span class="hljs-string">"git"</span>,
    <span class="hljs-string">"docker"</span>,
    <span class="hljs-string">"node"</span>,
    <span class="hljs-string">"npm"</span>,
    <span class="hljs-string">"python"</span>,
    <span class="hljs-string">"pip"</span>,
    <span class="hljs-string">"gcloud"</span>,
    <span class="hljs-string">"firebase"</span>,
    <span class="hljs-string">"az"</span>,
    <span class="hljs-string">"gh"</span>,
    <span class="hljs-string">"glab"</span>,
    <span class="hljs-string">"psql"</span>,
    <span class="hljs-string">"sqlite3"</span>
)

<span class="hljs-keyword">foreach</span> (<span class="hljs-variable">$command</span> <span class="hljs-keyword">in</span> <span class="hljs-variable">$commands</span>) {
    <span class="hljs-variable">$result</span> = <span class="hljs-built_in">Get-Command</span> <span class="hljs-variable">$command</span> -ErrorAction SilentlyContinue

    <span class="hljs-keyword">if</span> (<span class="hljs-variable">$result</span>) {
        <span class="hljs-built_in">Write-Host</span> <span class="hljs-string">"[OK] <span class="hljs-variable">$command</span>"</span> -ForegroundColor Green
    }
    <span class="hljs-keyword">else</span> {
        <span class="hljs-built_in">Write-Host</span> <span class="hljs-string">"[Missing] <span class="hljs-variable">$command</span>"</span> -ForegroundColor Yellow
    }
}
</code></pre>
<p>也可以進一步檢查版本：</p>
<pre><code class="lang-powershell"><span class="hljs-variable">$versionCommands</span> = @{
    <span class="hljs-string">"PowerShell"</span> = <span class="hljs-string">"pwsh --version"</span>
    <span class="hljs-string">"Git"</span>        = <span class="hljs-string">"git --version"</span>
    <span class="hljs-string">"Docker"</span>     = <span class="hljs-string">"docker --version"</span>
    <span class="hljs-string">"Node.js"</span>    = <span class="hljs-string">"node --version"</span>
    <span class="hljs-string">"npm"</span>        = <span class="hljs-string">"npm --version"</span>
    <span class="hljs-string">"Python"</span>     = <span class="hljs-string">"python --version"</span>
    <span class="hljs-string">"pip"</span>        = <span class="hljs-string">"pip --version"</span>
    <span class="hljs-string">"gcloud"</span>     = <span class="hljs-string">"gcloud version"</span>
    <span class="hljs-string">"Firebase"</span>   = <span class="hljs-string">"firebase --version"</span>
    <span class="hljs-string">"Azure CLI"</span>  = <span class="hljs-string">"az version"</span>
    <span class="hljs-string">"GitHub CLI"</span> = <span class="hljs-string">"gh --version"</span>
    <span class="hljs-string">"GitLab CLI"</span> = <span class="hljs-string">"glab --version"</span>
    <span class="hljs-string">"PostgreSQL"</span> = <span class="hljs-string">"psql --version"</span>
    <span class="hljs-string">"SQLite"</span>     = <span class="hljs-string">"sqlite3 --version"</span>
}

<span class="hljs-keyword">foreach</span> (<span class="hljs-variable">$item</span> <span class="hljs-keyword">in</span> <span class="hljs-variable">$versionCommands</span>.GetEnumerator()) {
    <span class="hljs-built_in">Write-Host</span> <span class="hljs-string">"`n=== $(<span class="hljs-variable">$item</span>.Key) ==="</span> -ForegroundColor Cyan

    <span class="hljs-keyword">try</span> {
        <span class="hljs-built_in">Invoke-Expression</span> <span class="hljs-variable">$item</span>.Value
    }
    <span class="hljs-keyword">catch</span> {
        <span class="hljs-built_in">Write-Host</span> <span class="hljs-string">"未安裝或無法執行"</span> -ForegroundColor Yellow
    }
}
</code></pre>
<hr />
<h1 id="-ai-cli-">十一、建議的 AI CLI 基礎工具組合</h1>
<p>初學者可先安裝：</p>
<pre><code class="lang-text">Windows Terminal
<span class="hljs-bullet">+ </span>PowerShell 7
<span class="hljs-bullet">+ </span>Git
<span class="hljs-bullet">+ </span>Node.js
<span class="hljs-bullet">+ </span>Python
<span class="hljs-bullet">+ </span>Docker Desktop
</code></pre>
<p>需要使用 GitHub 時，再安裝：</p>
<pre><code class="lang-text">GitHub <span class="hljs-keyword">CLI</span>
</code></pre>
<p>需要使用 GitLab 時，再安裝：</p>
<pre><code class="lang-text">GitLab <span class="hljs-keyword">CLI</span>
</code></pre>
<p>需要部署 Google Cloud 時，再安裝：</p>
<pre><code class="lang-text">Google Cloud <span class="hljs-keyword">CLI</span>
+ Firebase <span class="hljs-keyword">CLI</span>
</code></pre>
<p>需要部署 Azure 時，再安裝：</p>
<pre><code class="lang-text">Azure <span class="hljs-keyword">CLI</span>
</code></pre>
<p>需要開發資料庫應用時，可安裝：</p>
<pre><code class="lang-text">PostgreSQL
<span class="hljs-bullet">+ </span>pgAdmin
<span class="hljs-bullet">+ </span>SQLite
<span class="hljs-bullet">+ </span>DB Browser for SQLite
</code></pre>
<hr />
<h1 id="-">十二、結論</h1>
<p>AI 能不能真正參與軟體開發，不只取決於模型本身是否聰明，也取決於它能使用哪些工具。</p>
<p>只有聊天能力時，AI 通常可以：</p>
<ul>
<li>提供建議</li>
<li>產生程式碼</li>
<li>解釋錯誤</li>
<li>規劃架構</li>
<li>撰寫指令</li>
</ul>
<p>搭配 CLI 後，AI 則可以進一步協助：</p>
<ul>
<li>建立專案</li>
<li>建立檔案</li>
<li>安裝套件</li>
<li>執行程式</li>
<li>執行測試</li>
<li>修正錯誤</li>
<li>操作 Git</li>
<li>建立分支與 Commit</li>
<li>建立 Pull Request</li>
<li>建立 Merge Request</li>
<li>建立 Docker 容器</li>
<li>操作資料庫</li>
<li>部署雲端</li>
<li>建立 CI/CD</li>
<li>執行系統維運</li>
<li>產生自動化腳本</li>
<li>驗證最終結果</li>
</ul>
<p>其中，Git 是 AI 開發流程中非常重要的安全基礎。</p>
<p>Git 可以讓開發者清楚知道：</p>
<ul>
<li>AI 修改了哪些檔案</li>
<li>AI 修改了哪些程式碼</li>
<li>哪一個版本發生問題</li>
<li>是否需要還原</li>
<li>是否可以進行程式碼審查</li>
</ul>
<p>因此，建議至少準備以下環境：</p>
<pre><code class="lang-text">Windows Terminal
<span class="hljs-bullet">+ </span>PowerShell 7
<span class="hljs-bullet">+ </span>Git
<span class="hljs-bullet">+ </span>Node.js
<span class="hljs-bullet">+ </span>Python
<span class="hljs-bullet">+ </span>Docker
<span class="hljs-bullet">+ </span>GitHub CLI 或 GitLab CLI
<span class="hljs-bullet">+ </span>Azure CLI 或 Google Cloud CLI
</code></pre>
<p>完成安裝後，可以在提示詞中清楚告訴 AI：</p>
<pre><code class="lang-text">你可以使用 PowerShell、Git、Python、Node.js、Docker 與雲端 CLI。

請先檢查目前環境與 Git 狀態，再開始修改。

執行過程中：
<span class="hljs-bullet">1. </span>不要直接覆蓋重要檔案。
<span class="hljs-bullet">2. </span>不要刪除未確認的檔案。
<span class="hljs-bullet">3. </span>修改前先建立 Git 分支。
<span class="hljs-bullet">4. </span>修改後執行建置與測試。
<span class="hljs-bullet">5. </span>顯示完整錯誤訊息。
<span class="hljs-bullet">6. </span>修正後再次驗證。
<span class="hljs-bullet">7. </span>不要將密碼與 Token 寫入 Git。
<span class="hljs-bullet">8. </span>涉及雲端付費資源前，先列出預計建立的資源。
</code></pre>
<p>當 AI、CLI、Git、Docker、程式語言與雲端平台整合後，AI 就不再只是回答技術問題的聊天工具，而是能夠參與規劃、開發、測試、版本控制、部署與維運的工程協作工具。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>SQLite 推新版本~修復資料庫損壞漏洞以及漂亮呈現的QRF（Query Result Formatter）</title>
		<link>https://superlevin.ifengyuan.tw/sqlite-%e6%8e%a8%e6%96%b0%e7%89%88%e6%9c%ac%e4%bf%ae%e5%be%a9%e8%b3%87%e6%96%99%e5%ba%ab%e6%90%8d%e5%a3%9e%e6%bc%8f%e6%b4%9e%e4%bb%a5%e5%8f%8a%e6%bc%82%e4%ba%ae%e5%91%88%e7%8f%be%e7%9a%84qrf%ef%bc%88/</link>
		
		<dc:creator><![CDATA[林壽山]]></dc:creator>
		<pubDate>Mon, 27 Jul 2026 06:05:50 +0000</pubDate>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[qrf]]></category>
		<category><![CDATA[query result ＦＯＲＭＡＴＴＥＲ]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[sqlite]]></category>
		<category><![CDATA[優化]]></category>
		<category><![CDATA[效能]]></category>
		<category><![CDATA[資料庫]]></category>
		<guid isPermaLink="false">https://superlevin.ifengyuan.tw/?p=4216</guid>

					<description><![CDATA[SQLite 是全世界應用最廣泛的嵌入式資料庫引擎，從手機 App、瀏覽器到物聯網裝置都能看到它的身影。202 &#8230; <a href="https://superlevin.ifengyuan.tw/sqlite-%e6%8e%a8%e6%96%b0%e7%89%88%e6%9c%ac%e4%bf%ae%e5%be%a9%e8%b3%87%e6%96%99%e5%ba%ab%e6%90%8d%e5%a3%9e%e6%bc%8f%e6%b4%9e%e4%bb%a5%e5%8f%8a%e6%bc%82%e4%ba%ae%e5%91%88%e7%8f%be%e7%9a%84qrf%ef%bc%88/" class="more-link">閱讀全文<span class="screen-reader-text">〈SQLite 推新版本~修復資料庫損壞漏洞以及漂亮呈現的QRF（Query Result Formatter）〉</span></a>]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" class="alignnone size-full wp-image-4217" src="http://cdnlevin.yowauction.com//2026/07/3cff00ce-4a1a-4fdd-92af-39466fdecb37.png" alt="" /> <img decoding="async" class="alignnone size-medium wp-image-4218" src="http://cdnlevin.yowauction.com//2026/07/a85fd0c2-1558-409c-bb0e-27a7b9c4829f.png" alt="" width="1" height="1" /></p>
<p class="font-claude-response-body break-words whitespace-normal">SQLite 是全世界應用最廣泛的嵌入式資料庫引擎，從手機 App、瀏覽器到物聯網裝置都能看到它的身影。2026 年 7 月 24 日發布的 3.53.4 版本，除了修補前幾個小版本（3.53.1～3.53.3）遺留的問題外，也整合了自 3.53.0 以來累積的多項重要功能。以下用淺顯的方式，把這次更新拆解成幾個重點面向來介紹。</p>
<h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">一、最值得關心的修復：資料庫損壞漏洞</h2>
<p class="font-claude-response-body break-words whitespace-normal">這次更新最關鍵的一項，是修復了與 <strong>WAL（Write-Ahead Log，預寫式日誌）重置</strong>有關的資料庫損壞問題。WAL 是 SQLite 用來提升寫入效能與並行處理能力的機制，一旦這個環節出錯，最壞情況可能導致資料庫檔案損毀。對一般使用者來說，這代表：只要有使用資料庫寫入操作的應用程式，都建議儘快升級到這個版本，以避免潛在的資料遺失風險。</p>
<h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">二、新增QRF（Query Result Formatter）</h2>
<p class="font-claude-response-body break-words whitespace-normal">QRF（Query Result Formatter）是這次版本很有特色的新功能，簡單來說，它能把 SQL 查詢結果自動排版成整齊的表格，方便在文字介面（例如命令列視窗）中閱讀，例如數字會自動靠右對齊、輸出以框線字元組成表格。這對於習慣用命令列工具查資料庫的工程師或維運人員來說，等於是「不用額外工具，資料庫自己就把報表排版好了」。目前互動式命令列（CLI）已預設採用這種新格式，而批次執行（例如寫腳本自動跑 SQL）則仍維持舊格式，避免既有自動化流程被打亂。</p>
<h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">三、SQL 語法更靈活</h2>
<p class="font-claude-response-body break-words whitespace-normal">這次也強化了 SQL 語言本身的能力，重點包括：</p>
<ul class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3">
<li class="font-claude-response-body whitespace-normal break-words pl-2"><strong>ALTER TABLE 更彈性</strong>：現在可以直接新增或移除欄位的 NOT NULL、CHECK 限制條件，不需要像以前一樣重建整張表。</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2"><strong>REINDEX EXPRESSIONS</strong>：可以單獨重建「表達式索引」（例如根據函數運算結果建立的索引），用來修復索引過期失效的問題。</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2"><strong>VACUUM INTO 加強</strong>：備份資料庫時可以透過 URI 參數指定保留空間大小，方便預留未來成長空間。</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">新增了 <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">json_array_insert()</code>、<code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">jsonb_array_insert()</code> 兩個 JSON 處理函數，讓操作 JSON 陣列更方便。</li>
</ul>
<h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">四、查詢效能與規劃器的優化</h2>
<p class="font-claude-response-body break-words whitespace-normal">SQLite 的「查詢規劃器」負責決定一條 SQL 該怎麼執行最有效率，這次做了幾項調整：對於 EXCEPT、INTERSECT、UNION 這類集合運算，一律改用排序合併演算法，官方說明這樣「幾乎總是」比雜湊表快；另外也改善了多表格連接（JOIN）時的順序選擇邏輯，減少不必要的運算。對開發者而言，這些改動通常不需要修改任何程式碼，資料庫會自動跑得更快。</p>
<h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">五、浮點數精度改變 — 需要留意的相容性議題</h2>
<p class="font-claude-response-body break-words whitespace-normal">比較值得注意的是，浮點數與文字互相轉換的精度，預設從過去的 15 位有效數字，提升到 <strong>17 位</strong>。這代表數字顯示可能比以前更精確，但也可能讓某些依賴舊有顯示格式的程式或測試出現差異。如果需要維持舊行為，可以透過 <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">SQLITE_DBCONFIG_FP_DIGITS</code> 設定調整回來。這是一個「預設值改變」型的更新，建議有大量數值運算的系統在升級前先做測試。</p>
<h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">六、命令列工具（CLI）多項細節優化</h2>
<p class="font-claude-response-body break-words whitespace-normal">命令列工具本身也有不少貼心的小改進，例如 <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">.timer</code> 指令可以設定只計時下一句 SQL、<code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">.progress</code> 可以設定逾時自動中斷查詢、<code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">.indexes</code> 指令的搜尋邏輯改為比對索引名稱本身（而非資料表名稱），讓搜尋功能真正符合預期。另外要特別提醒：點指令結尾若有沒加引號的分號，現在會被直接忽略，這是一項<strong>可能造成相容性問題</strong>的改變，若有腳本依賴舊行為，需要特別檢查。</p>
<h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">七、其他技術亮點</h2>
<p class="font-claude-response-body break-words whitespace-normal">新增了多個 C 語言介面函數，方便進階開發者操作字串緩衝區與虛擬表；Session 擴充功能新增了逐項新增變更的介面，方便做資料同步；JavaScript/WASM 版本則新增了 <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">opfs-wl</code> 檔案系統選項，透過瀏覽器的 Web Locks 機制達到更公平的鎖定共享，不過需要較新版本的瀏覽器支援。</p>
<h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">重點總結</h2>
<p class="font-claude-response-body break-words whitespace-normal">如果只想記住三件事：第一，這個版本修了一個可能造成資料庫損壞的漏洞，建議儘快升級；第二，新增的 QRF 讓命令列查詢結果變得更好讀；第三，浮點數精度與分號規則有變動，升級前建議簡單測試一下既有系統是否受影響。</p>
<p class="font-claude-response-body break-words whitespace-normal">需要特別說明的是，官方頁面提到 3.53.4 這個修補版本，主要是為了修正前幾個版本（3.53.1 至 3.53.3）中「主要由人工智慧引起的問題」，詳細細節官方僅指向提交紀錄，並未在頁面上進一步展開說明。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>LINE 開發者的 2026 年中震撼彈：Rate Limit 被腰斬 99.5%、帳號終於能「刪除重來」，還有那個消失的最小化按鈕</title>
		<link>https://superlevin.ifengyuan.tw/line-%e9%96%8b%e7%99%bc%e8%80%85%e7%9a%84-2026-%e5%b9%b4%e4%b8%ad%e9%9c%87%e6%92%bc%e5%bd%88%ef%bc%9arate-limit-%e8%a2%ab%e8%85%b0%e6%96%ac-99-5%e3%80%81%e5%b8%b3%e8%99%9f%e7%b5%82%e6%96%bc%e8%83%bd/</link>
		
		<dc:creator><![CDATA[林壽山]]></dc:creator>
		<pubDate>Mon, 06 Jul 2026 02:28:34 +0000</pubDate>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[Line]]></category>
		<category><![CDATA[LINE LIFF]]></category>
		<category><![CDATA[MINI APP]]></category>
		<category><![CDATA[RICHMENU]]></category>
		<guid isPermaLink="false">https://superlevin.ifengyuan.tw/?p=4212</guid>

					<description><![CDATA[身為一個每天跟 LINE Messaging API、LIFF 混在一起的 .NET 開發者，我必須說 202 &#8230; <a href="https://superlevin.ifengyuan.tw/line-%e9%96%8b%e7%99%bc%e8%80%85%e7%9a%84-2026-%e5%b9%b4%e4%b8%ad%e9%9c%87%e6%92%bc%e5%bd%88%ef%bc%9arate-limit-%e8%a2%ab%e8%85%b0%e6%96%ac-99-5%e3%80%81%e5%b8%b3%e8%99%9f%e7%b5%82%e6%96%bc%e8%83%bd/" class="more-link">閱讀全文<span class="screen-reader-text">〈LINE 開發者的 2026 年中震撼彈：Rate Limit 被腰斬 99.5%、帳號終於能「刪除重來」，還有那個消失的最小化按鈕〉</span></a>]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" class="alignnone size-full wp-image-4213" src="http://cdnlevin.yowauction.com//2026/07/1797431f-3b2f-442b-987d-49ca50d05174.png" alt="" /></p>
<p class="font-claude-response-body break-words whitespace-normal">身為一個每天跟 LINE Messaging API、LIFF 混在一起的 .NET 開發者，我必須說 2026 年這個五月到七月，LINE 官方明顯是把「改版」這件事當成連續劇在更新，一集接一集，還時不時來個「未完待續」。這篇就把這段期間比較有感的更新，一次幫大家整理清楚，順便碎念幾句。</p>
<h3 class="text-text-100 mt-2 -mb-1 text-base font-bold">一、Rich Menu 終於有「數據」可以看了，不用再靠感覺</h3>
<p class="font-claude-response-body break-words whitespace-normal">7 月 1 日這天，Messaging API 新增了兩支端點：取得 rich menu 洞察總覽、取得每日洞察數據。以前如果你的圖文選單是用 Messaging API 建的，你只能默默祈禱使用者有點下去；現在終於可以像用 LINE Official Account Manager 建的選單一樣，看到「顯示次數」跟「點擊次數」了。有趣的是官方特別強調，這兩套數據是<strong>互不相通</strong>的：API 建的選單看不到後台的數據，後台建的選單也看不到 API 的數據。所以如果你們家專案是兩種方式混用，記得數據要分開看，不然老闆問起「圖文選單成效」，你可能要交出兩份報告。</p>
<h3 class="text-text-100 mt-2 -mb-1 text-base font-bold">二、Rate Limit 被砍到只剩 0.5%，這是要逼死誰</h3>
<p class="font-claude-response-body break-words whitespace-normal">這大概是整個五月最有戲劇張力的一則公告。5 月 7 日官方先預告：Get rich menu list 這支端點的速率限制，將從每秒 2000 次，改成每秒 10 次。沒錯，你沒看錯，是從 2000 掉到 10，砍幅超過 99%。然後 5 月 26 日，這件事真的發生了。</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="Code">
<div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right">
<div class="absolute right-0 h-8 px-2 items-center inline-flex z-10">
<div class="relative">
<div class="transition-all opacity-100 scale-100"></div>
<div class="absolute inset-0 flex items-center justify-center">
<div class="transition-all opacity-0 scale-50"></div>
</div>
</div>
</div>
</div>
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code>Get rich menu list
之前：2,000 requests / 秒
之後：   10 requests / 秒</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal">如果你的系統有那種「每次使用者互動就順手查一次 rich menu 清單」的懶惰寫法，這波更新等於直接把你的架構考卷發回來重寫。建議是把清單資料快取起來，別再每次都問 LINE 要清單，畢竟現在問一次的成本，可能比你想像中貴很多。</p>
<h3 class="text-text-100 mt-2 -mb-1 text-base font-bold">三、LINE MINI App 內購：免費試用期結束，該收錢了</h3>
<p class="font-claude-response-body break-words whitespace-normal">LINE MINI App 的應用內購買功能，原本佛心來著開放免費使用到 6 月底，官方在 6 月 5 日先預告、7 月 1 日正式上路：從 7 月 1 日之後的交易開始收取服務費用，費率則是以你申請當下公告的費率為準。同時官方也順手修訂了《LINE 應用內購買服務條款》，主要是把費用計算與請款結算方式講得更清楚。如果你們家產品有掛 MINI App 內購，這波記得回頭檢查一下財務試算，別讓會計部門措手不及。</p>
<h3 class="text-text-100 mt-2 -mb-1 text-base font-bold">四、日本認證 MINI App 可以跟 Business Manager 組織「牽紅線」了</h3>
<p class="font-claude-response-body break-words whitespace-normal">6 月 10 日這則比較偏在地化：日本地區的<strong>已驗證</strong> MINI App，現在可以把 MINI App 頻道連結到 Business Manager 組織，進而跟同組織底下的其他服務（目前支援 LINE 官方帳號）做整合。條件不少，包括地區都要設成日本、服務提供者跟已發布資料的營運公司要一致等等，細節偏繁瑣，但方向很明確：LINE 想把底下這些帳號體系越串越緊，官方也說未來會開放更多整合功能，值得先卡個位。</p>
<h3 class="text-text-100 mt-2 -mb-1 text-base font-bold">五、開發者帳號終於可以「刪除」了，但這是不歸路</h3>
<p class="font-claude-response-body break-words whitespace-normal">6 月 24 日的更新算是補了一個长期缺口：LINE Developers Console 終於支援刪除開發者帳號。不過這裡有個重點要劃起來——<strong>刪除之後不能復原</strong>。而且如果你是某個 Provider 或 Channel 底下唯一的 Admin，刪除前系統會要求你先把權限交接給其他帳號，不然那個服務就等於被鎖死，沒人能再進去改設定。所以與其說這是「刪除帳號」功能，不如說它是一個「離職交接檢查表」，公司內部帳號有異動的話，記得先做好交接再按下去。</p>
<h3 class="text-text-100 mt-2 -mb-1 text-base font-bold">六、LIFF 悄悄升級了兩次，但你可能完全沒感覺</h3>
<p class="font-claude-response-body break-words whitespace-normal">5 月 13 日發布 LIFF v2.29.0，6 月 29 日再發布 v2.29.1，兩次都寫著同一句話：只調整 SDK 內部行為，功能沒有變化。這種更新最適合「设了自動更新就不用管」，如果你是走 CDN edge path（<code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">https://static.line-scdn.net/liff/edge/2/sdk.js</code>），會自動吃到新版；如果是 npm 使用者，記得手動更新一下：</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="bash code">
<div class="text-text-500 font-small p-3.5 pb-0">bash</div>
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-bash"><span class="token token">npm</span> <span class="token token">install</span> @line/liff@2.29.1
<span class="token token"># 或</span>
<span class="token token">yarn</span> <span class="token token">add</span> @line/liff@2.29.1</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal">雖然官方說功能沒變，但內部行為調整這種話，老實講我都會半信半疑地多測一輪回歸測試，你們也是吧？</p>
<h3 class="text-text-100 mt-2 -mb-1 text-base font-bold">七、LIFF 瀏覽器大改版：多分頁圖示退場，換成三顆點點</h3>
<p class="font-claude-response-body break-words whitespace-normal">5 月 19 日這則跟 UI/UX 關係最大：從 LINE 26.7.0 版開始，LIFF 瀏覽器的標頭規格整個翻新。原本那顆代表「多分頁檢視」的按鈕圖示，換成了直式三個點的選單圖示；點下去也不再直接跳去分頁畫面，而是彈出一個下拉選單，裡面塞了全部分頁、重新整理、最小化瀏覽器、分享、加到主畫面、我的最愛、權限設定、關於此服務、回報問題等一長串選項。另外，已驗證 MINI App 原本在標頭上的「最小化」按鈕，現在被收進下拉選單裡，原本的位置換成了「關閉」按鈕。如果你的 MINI App 有針對舊版標頭做過任何客製化引導教學或截圖說明，這波更新後這些素材大概都要重拍一輪了。</p>
<h3 class="text-text-100 mt-2 -mb-1 text-base font-bold">八、五月那場 LIFF/MINI App 事故：一段從 4/27 燒到 5/14 的小插曲</h3>
<p class="font-claude-response-body break-words whitespace-normal">最後提一下背景插曲：4 月 27 日到 5 月 14 日之間，Android 版 LINE 26.6.0 / 26.6.1 有個 bug，導致在特定情境下（LIFF 瀏覽器開著時，用 Intent 或 App Link 又叫出同一個或另一個 LIFF/MINI App）會拿不到使用者 profile、LIFF API 也會怪怪的。官方後來在 5 月 14 日推出修復版 LINE 解決問題，但在那之前也貼心提供了一段暫時解法，用 <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">location.href</code> 做頁面轉跳、並在偵測到類似 <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">invalid_request</code> 的錯誤時手動登出再登入：</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="javascript code">
<div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right">
<div class="absolute right-0 h-8 px-2 items-center inline-flex z-10">
<div class="relative">
<div class="absolute inset-0 flex items-center justify-center">
<div class="transition-all opacity-0 scale-50"></div>
</div>
</div>
</div>
</div>
<div class="text-text-500 font-small p-3.5 pb-0">javascript</div>
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-javascript"><span class="token token">const</span> params <span class="token token">=</span> <span class="token token">new</span> <span class="token token">URLSearchParams</span><span class="token token">(</span><span class="token token dom">location</span><span class="token token">.</span><span class="token token property-access">search</span><span class="token token">)</span>
<span class="token token">const</span> liffState <span class="token token">=</span> params<span class="token token">.</span><span class="token token property-access">get</span><span class="token token">(</span><span class="token token">'liff.state'</span><span class="token token">)</span>
<span class="token token">const</span> redirectUri <span class="token token">=</span> liffState
  <span class="token token">?</span> <span class="token token">new</span> <span class="token token">URL</span><span class="token token">(</span><span class="token token">'.'</span> <span class="token token">+</span> liffState<span class="token token">,</span> <span class="token token dom">location</span><span class="token token">.</span><span class="token token property-access">href</span><span class="token token">)</span><span class="token token">.</span><span class="token token property-access">toString</span><span class="token token">(</span><span class="token token">)</span>
  <span class="token token">:</span> <span class="token token dom">location</span><span class="token token">.</span><span class="token token property-access">href</span>

liff<span class="token token">.</span><span class="token token property-access">login</span><span class="token token">(</span><span class="token token">{</span> redirectUri <span class="token token">}</span><span class="token token">)</span></code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal">這種「先給暫時解法、再補正式修復」的節奏，其實蠻值得學起來——不管是自己開發的服務出包，還是等第三方修 bug，先讓使用者有路可走，永遠比讓他們卡死畫面來得體貼。</p>
<h3 class="text-text-100 mt-2 -mb-1 text-base font-bold">小結：這波更新告訴我們什麼</h3>
<p class="font-claude-response-body break-words whitespace-normal">整體看下來，這兩個月 LINE 平台的更新可以歸納成三個關页字：<strong>限流變嚴、收費上路、體驗微調</strong>。速率限制被砍等於在提醒大家該做快取就要做；MINI App 收費代表商業模式正式進入下一階段；LIFF 的一連串小改版則是提醒我們，前端串接這種東西永遠不能「串完就沒事了」，得定期回去看看官方公告，免得哪天使用者截圖來問你「這個按鈕怎麼不見了」，你才第一次知道有這回事。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Claude code 搭配 OpenRouter 使用免費的claude code (?)</title>
		<link>https://superlevin.ifengyuan.tw/claude-code-%e6%90%ad%e9%85%8d-openrouter-%e4%bd%bf%e7%94%a8%e5%85%8d%e8%b2%bb%e7%9a%84claude-code/</link>
		
		<dc:creator><![CDATA[林壽山]]></dc:creator>
		<pubDate>Sun, 03 May 2026 08:41:31 +0000</pubDate>
				<category><![CDATA[AI人工智慧]]></category>
		<category><![CDATA[程式設計]]></category>
		<category><![CDATA[claude]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[openrouter]]></category>
		<category><![CDATA[免費]]></category>
		<guid isPermaLink="false">https://superlevin.ifengyuan.tw/?p=4208</guid>

					<description><![CDATA[claude code文件 https://code.claude.com/docs/zh-TW/overvi &#8230; <a href="https://superlevin.ifengyuan.tw/claude-code-%e6%90%ad%e9%85%8d-openrouter-%e4%bd%bf%e7%94%a8%e5%85%8d%e8%b2%bb%e7%9a%84claude-code/" class="more-link">閱讀全文<span class="screen-reader-text">〈Claude code 搭配 OpenRouter 使用免費的claude code (?)〉</span></a>]]></description>
										<content:encoded><![CDATA[<h2 class="md-end-block md-heading"><span class="md-plain">claude code文件</span></h2>
<p class="md-end-block md-p"><span class="md-link md-pair-s" spellcheck="false"><a href="https://code.claude.com/docs/zh-TW/overview">https://code.claude.com/docs/zh-TW/overview</a></span></p>
<p class="md-end-block md-p">
<h2 class="md-end-block md-heading"><span class="md-plain">安裝 claude code (命令提示字元)</span></h2>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="cmd" spellcheck="false"><span role="presentation"><span class="cm-identifier">curl</span> <span class="cm-operator">-</span><span class="cm-identifier">fsSL</span> <span class="cm-identifier">https</span><span class="cm-operator">://</span><span class="cm-identifier">claude</span><span class="cm-punctuation">.</span><span class="cm-identifier">ai</span><span class="cm-operator">/</span><span class="cm-identifier">install</span><span class="cm-punctuation">.</span><span class="cm-identifier">cmd</span> <span class="cm-operator">-</span><span class="cm-identifier">o</span> <span class="cm-identifier">install</span><span class="cm-punctuation">.</span><span class="cm-identifier">cmd</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-identifier">install</span><span class="cm-punctuation">.</span><span class="cm-identifier">cmd</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-builtin">del</span> <span class="cm-identifier">install</span><span class="cm-punctuation">.</span><span class="cm-identifier">cmd</span></span></pre>
<p class="md-end-block md-p">
<h2 class="md-end-block md-heading"><span class="md-plain">OpenRouter 註冊</span></h2>
<p class="md-end-block md-p"><span class="md-link md-pair-s" spellcheck="false"><a href="https://openrouter.ai/">https://openrouter.ai/</a></span><span class="md-plain"> 註冊新帳號</span></p>
<p class="md-end-block md-p"><span class="md-plain">OpenRouter 使用在claude code的說明</span></p>
<p class="md-end-block md-p"><span class="md-link md-pair-s" spellcheck="false"><a href="https://openrouter.ai/docs/guides/coding-agents/claude-code-integration">https://openrouter.ai/docs/guides/coding-agents/claude-code-integration</a></span></p>
<p class="md-end-block md-p"><span class="md-plain">.claude/settings.local.json</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" spellcheck="false"><span role="presentation">{</span>
<span role="presentation">  "env": {</span>
<span role="presentation">    "ANTHROPIC_BASE_URL": "https://openrouter.ai/api",</span>
<span role="presentation">    "ANTHROPIC_AUTH_TOKEN": "&lt;your-openrouter-api-key&gt;",</span>
<span role="presentation">    "ANTHROPIC_API_KEY": ""</span>
<span role="presentation">  }</span>
<span role="presentation">}</span></pre>
<p class="md-end-block md-p"><span class="md-plain">加上 </span><span class="md-pair-s"><strong><span class="md-plain">&#8220;ANTHROPIC_MODEL&#8221;:&#8221;openrouter/free&#8221;</span></strong></span><span class="md-plain"> (使用系統分配，或是到model 搜尋免費 free </span><span class="md-link md-pair-s" spellcheck="false"><a href="https://openrouter.ai/models?q=free">https://openrouter.ai/models?q=free</a></span><span class="md-plain">)</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" spellcheck="false"><span role="presentation">{</span>
<span role="presentation">  "env": {</span>
<span role="presentation">    "ANTHROPIC_BASE_URL": "https://openrouter.ai/api",</span>
<span role="presentation">    "ANTHROPIC_AUTH_TOKEN": "&lt;your-openrouter-api-key&gt;",</span>
<span role="presentation">    "ANTHROPIC_API_KEY": "",</span>
<span role="presentation">     "ANTHROPIC_MODEL":"openrouter/free"</span>
<span role="presentation">​</span>
<span role="presentation">  }</span>
<span role="presentation">}</span></pre>
<p class="md-end-block md-p md-focus"><span class="md-plain">開啟 claude code</span></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>自己升級wordpress環境php8.5</title>
		<link>https://superlevin.ifengyuan.tw/%e8%87%aa%e5%b7%b1%e5%8d%87%e7%b4%9awordpress%e7%92%b0%e5%a2%83php8-5/</link>
		
		<dc:creator><![CDATA[林壽山]]></dc:creator>
		<pubDate>Sat, 28 Mar 2026 10:24:28 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[程式設計]]></category>
		<guid isPermaLink="false">https://superlevin.ifengyuan.tw/?p=4201</guid>

					<description><![CDATA[https://github.com/superlevin/hacklog-remote-attachment &#8230; <a href="https://superlevin.ifengyuan.tw/%e8%87%aa%e5%b7%b1%e5%8d%87%e7%b4%9awordpress%e7%92%b0%e5%a2%83php8-5/" class="more-link">閱讀全文<span class="screen-reader-text">〈自己升級wordpress環境php8.5〉</span></a>]]></description>
										<content:encoded><![CDATA[<p><a href="https://github.com/superlevin/hacklog-remote-attachment">https://github.com/superlevin/hacklog-remote-attachment</a></p>
<p data-path-to-node="2">經營一個網站超過十年，就像是看著一個孩子長大一樣，充滿了滿滿的感情與回憶。這十多年來，我的WordPress網站一直忠實地陪伴著我，但也面臨著需要「轉大人」的考驗。</p>
<p data-path-to-node="3">最近，我下定決心要將網站的底層引擎升級到全新的PHP 8.5，希望能讓網站跑得更快、更順暢，給大家更好的體驗。沒想到，過程卻像是在闖關打怪一樣充滿挑戰！其中最大的一個關卡，就是一個叫做hacklog remote attachment的老套件。它就像是一個充滿回憶但也捨不得搬家的老頑固，不管我怎麼嘗試，它就是無法適應新的環境，導致我的升級計畫一直卡關失敗。</p>
<p data-path-to-node="4">正當我感到有些頭痛，差點要舉白旗投降的時候，我想起了現在最厲害的好幫手，也就是人工智慧AI！我轉念一想，何不請AI來當我的專屬工程顧問呢？於是，我帶著這個老套件的難題，和AI進行了一場深度的跨界交流。</p>
<p data-path-to-node="5">沒想到，AI真的超級神！在它的耐心引導與程式碼微調之下，我們居然成功解開了這個老套件的心結，讓它順利跟上了時代的腳步。當畫面上顯示升級成功的那一刻，我真的感動到想從椅子上跳起來歡呼！</p>
<p data-path-to-node="6">這不僅僅是一次系統的升級，更是我親身見證科技帶來無限可能的一刻。遇到困難真的不要氣餒，轉個彎，或許就會發現新的解法。有時候，只要一點點正向的信念，加上善用身邊的新工具，原本看似無解的難題也能迎刃而解！讓我們一起保持開放的心，快樂迎接每一天的挑戰吧！</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
