[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-prompt-engineering-agents-structured-outputs-zh":3,"article-related-prompt-engineering-agents-structured-outputs-zh":28,"series-ai-agent-f8c44ca5-e1b5-4b51-a7e5-61cdf8fa5ab9":86},{"id":4,"slug":5,"title":6,"content":7,"summary":8,"source":9,"source_url":10,"author":11,"image_url":12,"cover_image":12,"category":13,"language":14,"translated_content":11,"related_article_id":15,"keywords":16,"key_takeaways":11,"views":25,"created_at":26,"published_at":27,"topic_cluster_id":11},"f8c44ca5-e1b5-4b51-a7e5-61cdf8fa5ab9","prompt-engineering-agents-structured-outputs-zh","Agent 與結構化輸出提示詞實戰","\u003Cp>現在的 LLM 很會聊。\u003Ca href=\"https:\u002F\u002Fopenai.com\" target=\"_blank\" rel=\"noopener\">OpenAI\u003C\u002Fa>、\u003Ca href=\"https:\u002F\u002Fwww.anthropic.com\" target=\"_blank\" rel=\"noopener\">Anthropic\u003C\u002Fa> 這類模型，已經能吃下 128k、200k，甚至 1M tokens 的上下文。聽起來很猛，但真的上線後，你會發現它們一樣會亂跑。\u003C\u002Fp>\u003Cp>說白了，提示詞工程到了生產環境，就不是作文比賽。它更像控制系統。你要管推理、記憶、輸出格式，還要管 agent 會不會自己繞圈圈。\u003C\u002Fp>\u003Cp>這篇主題很對味。\u003Ca href=\"https:\u002F\u002Fcodefinity.com\u002Fblog\u002FAdvanced-Prompt-Engineering-for-Agents,-Reasoning-and-Structured-Outputs\" target=\"_blank\" rel=\"noopener\">Codefinity 的文章\u003C\u002Fa>把重點講清楚了。難的不是把 prompt 寫長，而是讓它撐得住工具呼叫、長歷史紀錄，還有機器對機器交接。\u003C\u002Fp>\u003Ch2>Prompt 不是文案，是介面契約\u003C\u002Fh2>\u003Cp>很多團隊一開始都會犯同一個錯。把 prompt 當成「再多講一點」就會變好。實際上，prompt 比較像 API 規格。它定義角色、邊界、輸出形狀，還有出錯時怎麼收斂。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1775164928194-j63i.png\" alt=\"Agent 與結構化輸出提示詞實戰\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>你在 notebook 裡測得很順，不代表進到產品還能活。聊天紀錄一長，指令就被淹掉。工具回傳一亂，模型就開始瞎補。JSON 格式看起來像樣，解析時卻整包炸掉。\u003C\u002Fp>\u003Cp>講白了，這不是模型不聰明。是你沒有把失敗模式先想好。做 LLM 系統，prompt 要先想成合約，再想成指令。\u003C\u002Fp>\u003Cul>\u003Cli>長上下文會稀釋指令權重\u003C\u002Fli>\u003Cli>推理需要明確流程，不是空話\u003C\u002Fli>\u003Cli>結構化輸出要有 schema\u003C\u002Fli>\u003Cli>Agent 要有停止條件\u003C\u002Fli>\u003C\u002Ful>\u003Cp>這裡的核心思路很實用。你要先定義輸入，再定義輸出。中間要有錯誤處理。這很像寫後端 API，只是呼叫方變成模型。\u003C\u002Fp>\u003Cp>如果你做過資料管線，就會懂這種痛。上游一個欄位歪掉，下游整串報錯。\u003Ca href=\"\u002Fnews\u002Fprompt-engineering-explained-without-the-hype-zh\">Prom\u003C\u002Fa>pt 也是一樣。你不把邊界寫清楚，模型就會用自己的方式補洞。\u003C\u002Fp>\u003Ch2>推理要有骨架，不能只靠感覺\u003C\u002Fh2>\u003Cp>推理提示詞最常被提到的，就是 chain-of-thought。2022 年那篇 \u003Ca href=\"https:\u002F\u002Farxiv.org\u002Fabs\u002F2201.11903\" target=\"_blank\" rel=\"noopener\">Chain-of-Thought Prompting Elicits Reasoning in Large Language Models\u003C\u002Fa> 很有名。它證明一件事。模型在多步驟任務上，先想再答，通常比較穩。\u003C\u002Fp>\u003Cp>但「Let's think step by step」不是萬靈丹。這句話對簡單算術有用。可是一到產品環境，就太鬆了。你不能只叫模型想清楚，還要告訴它怎麼想、想完怎麼收、哪些內容不能直接吐給使用者。\u003C\u002Fp>\u003Cp>所以實務上會分成幾種做法。零樣本 CoT、少樣本 CoT、scratchpad 分離、self-consistency。它們不是互斥，而是不同風險等級的工具。\u003C\u002Fp>\u003Cblockquote>“Let’s think step by step.” — \u003Ca href=\"https:\u002F\u002Farxiv.org\u002Fabs\u002F2201.11903\" target=\"_blank\" rel=\"noopener\">Chain-of-Thought Prompting Elicits Reasoning in Large Language Models\u003C\u002Fa>\u003C\u002Fblockquote>\u003Cp>這句話紅，不是因為它神奇。是因為它很直白。它把模型從直接回答，拉到先分解問題。可是如果你把思考過程原封不動丟給使用者，常常會出現自我打架，或是把半成品答案直接吐出來。\u003C\u002Fp>\u003Cp>Self-consistency 就更像工程手法。你不是只問一次，而是抽 3 到 5 次。再看哪個答案出現最多。成本會上升，但在高風險任務上，這筆錢通常比錯答案便宜。\u003C\u002Fp>\u003Cul>\u003Cli>零樣本 CoT 常用「一步一步想」當觸發詞\u003C\u002Fli>\u003Cli>少樣本 CoT 會放範例，通常更穩\u003C\u002Fli>\u003Cli>scratchpad 可把推理和最終輸出分開\u003C\u002Fli>\u003Cli>self-consistency 常抽 3 到 5 次\u003C\u002Fli>\u003C\u002Ful>\u003Cp>我覺得這裡最重要的，不是技巧名稱。是你要知道任務風險。算帳、分類、資料抽取、客服回覆，對推理的要求都不同。不要用同一種 prompt 打天下。\u003C\u002Fp>\u003Cp>如果任務錯一次就很痛，像金流、法務、醫療摘要，那就別省。多做一步驗證。多跑一次 sampling。這種成本，通常比事後補救低很多。\u003C\u002Fp>\u003Ch2>長上下文很大，不代表很穩\u003C\u002Fh2>\u003Cp>現在很多模型都能吃超長上下文。可是容量大，不等於記得牢。研究常提到「lost in the middle」效應。意思是模型對開頭和結尾比較敏感，中間那段容易被忽略。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1775164927479-wtv7.png\" alt=\"Agent 與結構化輸出提示詞實戰\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>這件事很煩。因為很多團隊以為塞進 100k tokens 就萬事 OK。其實不是。你只是把問題從「放不下」變成「放進去卻看不見」。\u003C\u002Fp>\u003Cp>所以 prompt 排版很重要。關鍵指令不要只放最前面。最好在結尾再重複一次。段落標記也很有用。模型需要清楚知道，哪些是規則，哪些是資料，哪些是當前任務。\u003C\u002Fp>\u003Cp>另一個實用招式是漸進摘要。不要每輪都把整段對話重塞。把已完成的內容壓成摘要，只保留最近幾輪完整歷史。這樣比較省 Token，也比較不會把模型搞混。\u003C\u002Fp>\u003Cp>還有一個老問題，現在還是很常見：prompt injection。你從文件、網頁、工具回傳抓到的內容，可能藏了指令。模型如果沒被明確提醒，就可能把那些內容當成你的要求。\u003C\u002Fp>\u003Cul>\u003Cli>關鍵指令要在開頭和結尾都出現\u003C\u002Fli>\u003Cli>文件和工具輸出要用明確分隔符\u003C\u002Fli>\u003Cli>歷史紀錄要做 rolling summary\u003C\u002Fli>\u003Cli>外部內容要標成資料，不是指令\u003C\u002Fli>\u003C\u002Ful>\u003Cp>這裡很像資安問題。你不能假設外部資料是乾淨的。尤其是 \u003Ca href=\"\u002Fnews\u002Fwhat-openrag-does-for-enterprise-ai-zh\">RAG\u003C\u002Fa>、agent、browser tool 這些場景，模型看到的每段文字都可能是風險點。\u003C\u002Fp>\u003Cp>如果你有做過客服知識庫或內部搜尋，就知道這坑很深。資料來源越多，錯誤注入的機會越高。Prompt 不是保護罩，但它至少能把邊界畫清楚。\u003C\u002Fp>\u003Ch2>結構化輸出是合約，不是願望\u003C\u002Fh2>\u003Cp>很多人會直接跟模型說「請回 JSON」。然後就開始祈禱。這種做法很危險。因為 downstream 系統要的是可解析物件，不是「看起來像 JSON」的文字。\u003C\u002Fp>\u003Cp>比較好的方法，是 schema-first。先告訴模型欄位名稱、型別、允許值、空值規則，再讓它生成。這樣模型比較不會自己加欄位，也比較不會跑去寫散文。\u003C\u002Fp>\u003Cp>工具也越來越成熟。像 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdottxt-ai\u002Foutlines\" target=\"_blank\" rel=\"noopener\">Outlines\u003C\u002Fa>、\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Finstructor-ai\u002Finstructor\" target=\"_blank\" rel=\"noopener\">Instructor\u003C\u002Fa>，都在做受限生成。\u003Ca href=\"https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fstructured-outputs\" target=\"_blank\" rel=\"noopener\">OpenAI Structured Outputs\u003C\u002Fa> 也把這件事往 API 層推進。這些做法的共同目標很簡單：不要等輸出錯了才補救，而是直接減少錯輸出的機會。\u003C\u002Fp>\u003Cp>對抽取流程來說，這差很多。你只要遇到一次壞掉的 JSON，整批 ing\u003Ca href=\"\u002Fnews\u002Ffive-ai-infra-frontiers-bessemer-2026-zh\">es\u003C\u002Fa>tion 就可能卡住。那不是「小 bug」。那是排程、重試、告警一起炸。\u003C\u002Fp>\u003Cp>還有一個常被忽略的點，是空值處理。模型很愛亂猜。當欄位不知道時，請明說用 \u003Ccode>null\u003C\u002Fcode>。不要叫它硬填。猜錯的資料，比空值更難清。\u003C\u002Fp>\u003Cul>\u003Cli>Schema-first 先定欄位，再做生成\u003C\u002Fli>\u003Cli>受限生成能降低 parse failure\u003C\u002Fli>\u003Cli>未知值用 \u003Ccode>null\u003C\u002Fcode> 比亂猜安全\u003C\u002Fli>\u003Cli>複雜巢狀結構可分階段生成\u003C\u002Fli>\u003C\u002Ful>\u003Cp>如果要比競品思路，差別也很明顯。純 prompt 派靠文字約束。框架派靠 wrapper 和 validator。API 原生方案則把格式約束下沉到模型介面。後兩者通常更穩，但也更綁平台。\u003C\u002Fp>\u003Cp>所以選法很現實。你如果在乎可攜性，就多用 schema 與後處理。你如果在乎成功率，就看平台原生支援到什麼程度。沒有哪個方案永遠最好，只有哪個比較適合你的風險。\u003C\u002Fp>\u003Ch2>Agent 需要邊界，也需要停損\u003C\u002Fh2>\u003Cp>Agent prompt 跟單輪 prompt 差很多。單輪只要回答一次。Agent 則要面對工具呼叫、部分失敗、目標變動，還有重試循環。這種場景下，prompt 不只是說明書，還是操作規則。\u003C\u002Fp>\u003Cp>系統 prompt 最好先定義三件事。角色是什麼。可以用哪些工具。什麼情況下要停。少了這些，agent 很容易一直重試同一個壞步驟。你看 log 會很想罵人。\u003C\u002Fp>\u003Cp>如果你用過 \u003Ca href=\"https:\u002F\u002Fwww.langchain.com\" target=\"_blank\" rel=\"noopener\">LangChain\u003C\u002Fa> 或 \u003Ca href=\"https:\u002F\u002Fwww.llamaindex.ai\" target=\"_blank\" rel=\"noopener\">LlamaIndex\u003C\u002Fa>，大概懂我在說什麼。工具鏈一長，錯誤就會開始連鎖。沒有 termination logic，agent 會像卡住的客服，永遠說「我再試一次」。\u003C\u002Fp>\u003Cp>比較合理的做法，是定義 done 的條件，限制 retry 次數，還有明確要求每一步只拿目前需要的資料。這樣 agent 才不會為了看起來很忙，亂抓一堆不相關資訊。\u003C\u002Fp>\u003Cp>你可以把常見 prompt 類型分開看。這樣比較不會混用。\u003C\u002Fp>\u003Cul>\u003Cli>單輪 prompt：追求一次輸出\u003C\u002Fli>\u003Cli>推理 prompt：追求多步驗證\u003C\u002Fli>\u003Cli>Agent prompt：追求工具操作與停止\u003C\u002Fli>\u003Cli>結構化輸出 prompt：追求可解析格式\u003C\u002Fli>\u003C\u002Ful>\u003Cp>這個分類很實際。因為很多失敗，不是模型太差，而是你把不同任務混成同一種 prompt。叫它既要推理、又要聊天、又要吐 JSON、還要自己收尾。這種要求，連人都會當機。\u003C\u002Fp>\u003Cp>所以我會建議，先把任務拆乾淨。每一類 prompt 都有自己的目標。不要幻想一份萬用 prompt 可以通吃所有場景。\u003C\u002Fp>\u003Ch2>背後其實是整個產品設計問題\u003C\u002Fh2>\u003Cp>Prompt engineering 會變難，不是因為大家突然不會寫字。是因為 LLM 已經進到產品核心。以前你只要做 demo。現在你要面對資料品質、成本、延遲、解析失敗，還有安全問題。\u003C\u002Fp>\u003Cp>這也解釋了為什麼很多團隊最後會走向流程化。先做分類，再做抽取，再做驗證，再做回寫。每一段都要有清楚的輸入和輸出。這種設計，看起來很土，但通常更穩。\u003C\u002Fp>\u003Cp>本地模型也會遇到同樣問題。像 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fvllm-project\u002Fvllm\" target=\"_blank\" rel=\"noopener\">vLLM\u003C\u002Fa> 這類推理服務，把吞吐量和部署彈性拉高了，但 prompt 的規格感一樣不能少。模型換了，工程問題還在。\u003C\u002Fp>\u003Cp>如果你是開發者，我覺得現在最值得做的，不是再追新 prompt 技巧。是回頭檢查你現有系統。你的 prompt 有沒有明確角色？有沒有輸出 schema？有沒有 stop rule？有沒有把外部資料當成不可信內容？\u003C\u002Fp>\u003Cp>很多時候，答案會很尷尬。因為真正脆弱的地方，往往不是模型，而是你沒寫清楚的那幾行字。\u003C\u002Fp>\u003Ch2>先把一個高價值 prompt 修好\u003C\u002Fh2>\u003Cp>如果只能做一件事，我會先審一個高價值 prompt。看它有沒有推理結構，有沒有上下文策略，有沒有輸出合約，也有沒有停損條件。少一項，都可能在上線後放大成事故。\u003C\u002Fp>\u003Cp>我也會建議團隊，把 prompt 當成版本化資產管理。別只丟在前端字串裡。要能 review，要能測試，要能回滾。這樣才像工程，不像賭博。\u003C\u002Fp>\u003Cp>接下來幾個月，真正拉開差距的，應該不是誰會寫更長的 prompt。而是誰能把 prompt、schema、工具呼叫和驗證流程串成一套穩定系統。你如果現在還在手動祈禱 JSON 不會壞，老實說，是時候補課了。\u003C\u002Fp>","LLM 進到生產環境後，提示詞不再是寫得漂亮就好。這篇拆解推理、長上下文、JSON 合約與 agent 迴圈，講清楚怎麼把 GPT、Claude 和本地模型用得更穩。","codefinity.com","https:\u002F\u002Fcodefinity.com\u002Fblog\u002FAdvanced-Prompt-Engineering-for-Agents,-Reasoning-and-Structured-Outputs",null,"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1775164928194-j63i.png","ai-agent","zh","28a1b97c-06c1-4112-8fb5-a9ff8e58fcd9",[17,18,19,20,21,22,23,24],"prompt engineering","agents","structured outputs","JSON schema","chain of thought","LLM","long context","tool calling",5,"2026-04-02T21:21:45.59991+00:00","2026-04-02T21:21:45.548+00:00",{"tags":29,"relatedLang":45,"relatedPosts":49},[30,32,33,35,37,39,41,43],{"name":17,"slug":31},"prompt-engineering",{"name":18,"slug":18},{"name":24,"slug":34},"tool-calling",{"name":22,"slug":36},"llm",{"name":23,"slug":38},"long-context",{"name":20,"slug":40},"json-schema",{"name":42,"slug":42},"chain-of-thought",{"name":19,"slug":44},"structured-outputs",{"id":15,"slug":46,"title":47,"language":48},"prompt-engineering-agents-structured-outputs-en","Prompt Engineering for Agents and Structured Outputs","en",[50,56,62,68,74,80],{"id":51,"slug":52,"title":53,"cover_image":54,"image_url":54,"created_at":55,"category":13},"0ba5b1a8-82c5-464a-bea5-9a2c8730da74","aws-devops-agent-turns-incident-chaos-into-triage-zh","AWS DevOps Agent 把事故排查變成三步","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780466689960-g1sv.png","2026-06-03T06:03:14.154923+00:00",{"id":57,"slug":58,"title":59,"cover_image":60,"image_url":60,"created_at":61,"category":13},"841eac88-b0f0-4a4c-9e1e-efc3b5c16281","kimi-k26-live-300-agent-workflows-zh","Kimi K2.6 上線：300 代理工作流","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780430574285-hqpn.png","2026-06-02T20:02:24.972179+00:00",{"id":63,"slug":64,"title":65,"cover_image":66,"image_url":66,"created_at":67,"category":13},"f0411957-bcdb-42d9-a267-3e90ae7d9cb1","how-to-take-a-sabbatical-at-openai-zh","怎麼申請 OpenAI sabbatical","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780398216422-8fi7.png","2026-06-02T11:02:25.74372+00:00",{"id":69,"slug":70,"title":71,"cover_image":72,"image_url":72,"created_at":73,"category":13},"37a5e429-4235-439c-9b05-bb377085462c","8-steps-build-production-rag-with-langchain-zh","8 步驟打造可上線的 LangChain RAG","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780178597493-4hz7.png","2026-05-30T22:02:48.14022+00:00",{"id":75,"slug":76,"title":77,"cover_image":78,"image_url":78,"created_at":79,"category":13},"e73c041b-852b-44c3-85aa-0f1e2e5848e3","ai-agents-hit-chaos-mode-claude-code-openclaw-zh","Claude Code＋OpenClaw 讓 AI 代理失控升溫","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780160576178-yqcs.png","2026-05-30T17:02:25.725767+00:00",{"id":81,"slug":82,"title":83,"cover_image":84,"image_url":84,"created_at":85,"category":13},"a708dcdf-cae4-4483-a256-5df230e66543","how-to-use-claude-4-8-models-in-python-zh","怎麼用 Python 呼叫 Claude 4.8","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780009366539-s0pd.png","2026-05-28T23:02:20.794444+00:00",[87,92,97,102,107,112,117,122,127,132],{"id":88,"slug":89,"title":90,"created_at":91},"4ae1e197-1d3d-4233-8733-eafe9cb6438b","claude-now-uses-your-pc-to-finish-tasks-zh","Claude 開始幫你操作電腦","2026-03-26T07:20:48.457387+00:00",{"id":93,"slug":94,"title":95,"created_at":96},"5bede67f-e21c-413d-9ab8-54a3c3d26227","googles-2026-ai-agent-report-decoded-zh","Google 2026 AI Agent 報告解讀","2026-03-26T11:15:22.651956+00:00",{"id":98,"slug":99,"title":100,"created_at":101},"2987d097-563f-46c7-b76f-b558d8ef7c2b","kimi-k25-review-stronger-still-not-legend-zh","Kimi K2.5 評測：更強，但還不是神作","2026-03-27T07:15:55.277513+00:00",{"id":103,"slug":104,"title":105,"created_at":106},"95c9053b-e3f4-4cb5-aace-5c54f4c9e044","claude-code-controls-mac-desktop-zh","Claude Code 也能操控 Mac 了","2026-03-28T03:01:58.58121+00:00",{"id":108,"slug":109,"title":110,"created_at":111},"dc58e153-e3a8-4c06-9b96-1aa64eabbf5f","cloudflare-100x-faster-ai-agent-sandbox-zh","Cloudflare 的 AI 沙箱跑超快","2026-03-28T03:09:44.142236+00:00",{"id":113,"slug":114,"title":115,"created_at":116},"1c8afc56-253f-47a2-979f-1065ff072f2a","openai-backs-isara-agent-swarm-bet-zh","OpenAI 挺 Isara 的 agent swarm …","2026-03-28T03:15:27.513155+00:00",{"id":118,"slug":119,"title":120,"created_at":121},"7379b422-576e-45df-ad5a-d57a0d9dd467","openai-plan-automated-ai-researcher-zh","OpenAI 想做自動化 AI 研究員","2026-03-28T03:17:42.090548+00:00",{"id":123,"slug":124,"title":125,"created_at":126},"48c9889e-86df-450b-a356-e4a4b7c83c5b","harness-engineering-ai-agent-reliability-2026-zh","駕馭工程：從「馬具」到「作業系統」，AI Agent 可靠性的終極密碼","2026-03-31T06:42:53.556721+00:00",{"id":128,"slug":129,"title":130,"created_at":131},"96d8e8c8-1edd-475d-9145-b1e7a1b02b65","mcp-explained-from-prompts-to-production-zh","MCP 怎麼把提示詞變工作流","2026-04-01T09:24:39.321274+00:00",{"id":133,"slug":134,"title":135,"created_at":136},"f2ca7720-b471-4ce5-9336-2a9ac2a876fd","amazon-bedrock-agents-multi-agent-workflows-zh","Amazon Bedrock Agents 進入多代理工作流","2026-04-01T09:30:29.945429+00:00"]