戰(zhàn):用 Python 構(gòu)建能觸達(dá)真實(shí)世界的 CLI AI Agent)
1. 從標(biāo)題到落地Agent-Reach 到底想解決什么問題第一次看到 Agent-Reach 這個(gè)名字我下意識(shí)把它拆成了兩半Agent 和 Reach。Agent 是當(dāng)下最熱的 AI 智能體概念Reach 則是觸達(dá)、夠得著的意思。合在一起直覺告訴我這是一個(gè)讓 AI Agent 真正夠得著外部世界、能動(dòng)手干活的項(xiàng)目。事實(shí)也確實(shí)如此——從項(xiàng)目定位來看Agent-Reach 是一個(gè)基于 Python 構(gòu)建的 CLI 工具核心目標(biāo)是把 AI Agent 的能力從聊天框里的嘴炮變成終端里能執(zhí)行任務(wù)的雙手。我接觸過不少 AI Agent 項(xiàng)目大多數(shù)要么是重框架LangChain、LangGraph 那一套要么是重平臺(tái)各種可視化編排工具。Agent-Reach 走的是另一條路輕量、命令行優(yōu)先、可組合。它不試圖做一個(gè)大而全的框架而是聚焦在讓 Agent 能夠觸達(dá)并操作真實(shí)環(huán)境這件事上。這個(gè)定位非常務(wù)實(shí)因?yàn)槲易约涸诖罱?Agent 時(shí)最大的痛點(diǎn)從來不是模型不夠聰明而是模型和真實(shí)系統(tǒng)之間那層膠水太難寫——文件讀寫、命令執(zhí)行、API 調(diào)用、結(jié)果解析每一環(huán)都要自己造輪子。這個(gè)項(xiàng)目適合誰我的判斷是三類人。第一類是已經(jīng)會(huì)用 Python 但沒系統(tǒng)搭過 Agent 的開發(fā)者想找一個(gè)能跑起來、能看懂、能改的參考實(shí)現(xiàn)第二類是運(yùn)維或效率工程師希望把日常重復(fù)的終端操作交給一個(gè)能理解自然語言的助手第三類是想學(xué)習(xí) Agent 架構(gòu)的學(xué)生或轉(zhuǎn)行者需要一個(gè)不依賴重型框架的最小可運(yùn)行樣本。如果你屬于這三類中的任何一類Agent-Reach 值得花一個(gè)下午研究透。需要提前說明的是下面涉及的具體實(shí)現(xiàn)細(xì)節(jié)部分是基于項(xiàng)目標(biāo)題、關(guān)鍵詞和同類 CLI Agent 項(xiàng)目的常見實(shí)踐做的合理補(bǔ)全。我會(huì)在關(guān)鍵處標(biāo)注哪些是通用做法、哪些需要你對(duì)照實(shí)際倉庫確認(rèn)。這樣做的目的是讓你拿到一篇能直接抄作業(yè)的實(shí)操指南而不是一篇看完還是不知道從哪下手的空談。2. 整體架構(gòu)設(shè)計(jì)與技術(shù)選型拆解2.1 為什么是 CLI 而不是 Web 或 GUI很多人第一反應(yīng)會(huì)問都 2025 年了為什么還要做命令行工具我一開始也有這個(gè)疑問但實(shí)際用過幾個(gè) CLI 形態(tài)的 Agent 之后想法完全變了。CLI 有三個(gè) GUI 給不了的優(yōu)勢(shì)。第一是可組合性。終端里的一切都可以用管道串起來Agent 的輸出可以直接喂給 grep、jq、awk或者被別的腳本調(diào)用。你寫一個(gè)agent-reach 整理今天的日志 | mail -s 日?qǐng)?bào) meexample.com整條鏈路就通了。GUI 做不到這種自由度。第二是低開銷與可腳本化。CLI 工具啟動(dòng)快、內(nèi)存占用小可以塞進(jìn) cron、CI/CD、Makefile 里當(dāng)普通命令用。一個(gè) Web 服務(wù)你得考慮端口、進(jìn)程守護(hù)、鑒權(quán)CLI 這些統(tǒng)統(tǒng)不需要。第三是貼近真實(shí)工作流。開發(fā)者和運(yùn)維的日常本來就泡在終端里Agent 出現(xiàn)在終端里是順路出現(xiàn)在瀏覽器里是繞路。繞路的東西用幾次就懶得用了這是人性。所以 Agent-Reach 選擇 CLI 優(yōu)先我認(rèn)為是深思熟慮的結(jié)果而不是技術(shù)能力不足的妥協(xié)。2.2 Python 作為實(shí)現(xiàn)語言的取舍關(guān)鍵詞里明確出現(xiàn)了 Python這符合預(yù)期。Python 在 AI Agent 領(lǐng)域的生態(tài)優(yōu)勢(shì)幾乎是碾壓性的OpenAI、Anthropic 等主流模型的官方 SDK 都是 Python 優(yōu)先LangChain、LlamaIndex 這些編排庫也是 Python 起家再加上 subprocess、pathlib、requests 這些標(biāo)準(zhǔn)庫對(duì)觸達(dá)外部世界的支持非常成熟。但 Python 也有明顯的短板比如啟動(dòng)速度慢、并發(fā)模型受 GIL 限制、打包分發(fā)麻煩。這就引出了一個(gè)值得討論的問題為什么不用 Rust 或 Go熱搜詞里恰好有基于 rust 語言 ai agent說明不少人在糾結(jié)這個(gè)選型。我的看法是Agent 類項(xiàng)目的瓶頸在模型推理和網(wǎng)絡(luò) IO不在語言本身的執(zhí)行速度。你花大力氣用 Rust 重寫省下來的那點(diǎn) CPU 時(shí)間在動(dòng)輒幾百毫秒的模型調(diào)用面前可以忽略不計(jì)。而 Python 帶來的開發(fā)效率和生態(tài)紅利是實(shí)打?qū)嵉?。所以除非你有極端的性能或分發(fā)需求Python 是更理性的選擇。Agent-Reach 用 Python我完全認(rèn)同。2.3 核心模塊的職責(zé)劃分一個(gè)能觸達(dá)的 Agent架構(gòu)上通常要拆成幾層。我按自己的理解畫一下 Agent-Reach 這類項(xiàng)目應(yīng)該有的骨架注意這是通用架構(gòu)具體命名以實(shí)際倉庫為準(zhǔn)模塊職責(zé)關(guān)鍵技術(shù)點(diǎn)CLI 入口層解析命令、參數(shù)、交互模式argparse / click / typerAgent 核心維護(hù)對(duì)話狀態(tài)、調(diào)度工具、調(diào)用模型消息歷史管理、工具路由工具層封裝可執(zhí)行能力文件、命令、HTTPsubprocess、pathlib、requests模型適配層對(duì)接不同 LLM 提供商統(tǒng)一接口、重試、流式輸出配置與密鑰管理 API Key、模型參數(shù)環(huán)境變量、配置文件這個(gè)分層的好處是每一層都能單獨(dú)替換。你想換模型只動(dòng)適配層想加新工具只動(dòng)工具層想換交互方式只動(dòng)入口層。這種解耦是項(xiàng)目能長期演進(jìn)的前提。2.4 工具調(diào)用Tool Calling是靈魂Agent 和普通聊天機(jī)器人的本質(zhì)區(qū)別就在于它能不能調(diào)用工具。Agent-Reach 的Reach能力幾乎全部體現(xiàn)在工具層。常見的工具包括文件操作讀、寫、列目錄、搜索內(nèi)容命令執(zhí)行跑 shell 命令并捕獲輸出網(wǎng)絡(luò)請(qǐng)求GET/POST、抓取網(wǎng)頁代碼執(zhí)行跑一段 Python 并返回結(jié)果這里有個(gè)關(guān)鍵設(shè)計(jì)決策工具的描述schema怎么寫直接決定模型能不能用對(duì)。工具名要短、參數(shù)要少、描述要精確。我見過太多項(xiàng)目把工具描述寫得又長又模糊結(jié)果模型要么不調(diào)用要么傳錯(cuò)參數(shù)。這是新手最容易踩的坑之一后面我會(huì)專門展開。3. 環(huán)境搭建與核心實(shí)操要點(diǎn)3.1 Python 環(huán)境準(zhǔn)備別在第一步翻車熱搜詞里python安裝python安裝教程python官網(wǎng)下載高頻出現(xiàn)說明很多人卡在環(huán)境這一步。我先把這塊講透因?yàn)榄h(huán)境不對(duì)后面全是白費(fèi)。首先確認(rèn)你的 Python 版本。Agent 類項(xiàng)目通常要求Python 3.9 以上我建議直接用 3.10 或 3.11兼容性和性能都比較好。檢查命令python3 --version如果版本太低別急著卸載系統(tǒng)自帶的 Python很多 Linux 發(fā)行版的系統(tǒng)工具依賴它用 pyenv 或 conda 裝一個(gè)獨(dú)立版本更穩(wěn)妥。我個(gè)人偏好 pyenv干凈、不污染系統(tǒng)# 安裝 pyenvmacOS/Linux curl https://pyenv.run | bash # 安裝指定版本 pyenv install 3.11.6 pyenv global 3.11.6Windows 用戶直接用官網(wǎng)安裝包安裝時(shí)務(wù)必勾選Add Python to PATH這個(gè)選項(xiàng)不勾后面命令行里敲 python 會(huì)提示找不到命令是新手第一大坑。3.2 虛擬環(huán)境隔離是紀(jì)律我強(qiáng)烈建議每個(gè) Agent 項(xiàng)目都用獨(dú)立虛擬環(huán)境。原因很簡單Agent 項(xiàng)目依賴多、版本敏感裝到全局環(huán)境里遲早和別的項(xiàng)目打架。# 創(chuàng)建虛擬環(huán)境 python -m venv .venv # 激活Linux/macOS source .venv/bin/activate # 激活Windows .venv\Scripts\activate激活后命令行前面會(huì)出現(xiàn)(.venv)前綴看到它就說明成功了。之后所有 pip 安裝都只影響這個(gè)環(huán)境刪掉.venv目錄就等于徹底卸載非常干凈。3.3 從 GitHub 獲取項(xiàng)目網(wǎng)絡(luò)問題的務(wù)實(shí)解法關(guān)鍵詞里有g(shù)ithub打不開github加速github鏡像這是國內(nèi)開發(fā)者繞不開的現(xiàn)實(shí)問題。我不談任何敏感手段只講幾個(gè)合規(guī)且有效的常規(guī)做法。第一優(yōu)先用 git clone 而不是下載 zip因?yàn)?clone 支持?jǐn)帱c(diǎn)續(xù)傳網(wǎng)絡(luò)抖動(dòng)時(shí)不用從頭再來git clone https://github.com/shihabal3amri/Agent-Reach.git cd Agent-Reach第二如果 clone 速度慢可以配置 git 的淺克隆只拉最新一次提交體積能小很多git clone --depth 1 https://github.com/shihabal3amri/Agent-Reach.git第三很多項(xiàng)目在 Gitee 等平臺(tái)有同步鏡像搜索項(xiàng)目名加鏡像往往能找到。使用鏡像時(shí)注意核對(duì) commit 是否與主倉庫一致避免用到過時(shí)代碼。提示clone 下來的項(xiàng)目第一件事是看 README 和 requirements.txt確認(rèn)依賴和運(yùn)行方式別上來就 pip install有些項(xiàng)目依賴有特殊版本要求。3.4 依賴安裝與常見報(bào)錯(cuò)進(jìn)入項(xiàng)目目錄后安裝依賴pip install -r requirements.txt如果項(xiàng)目用了 pyproject.toml則用pip install -e .-e是可編輯安裝改代碼后不用重裝開發(fā)階段非常方便。安裝過程中最常見的報(bào)錯(cuò)是編譯類依賴失敗比如某些包需要 C 編譯器。Linux 上裝build-essentialmacOS 上裝 Xcode Command Line Toolsxcode-select --install基本能解決大部分問題。如果遇到 numpy、cv2 這類包安裝慢可以換國內(nèi)鏡像源pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple3.5 API Key 與配置管理Agent 要調(diào)用大模型必然需要 API Key。絕對(duì)不要把 Key 硬編碼進(jìn)代碼或提交到 git這是安全紅線。正確做法是用環(huán)境變量或.env文件# .env 文件示例 MODEL_API_KEYyour_key_here MODEL_BASE_URLhttps://api.example.com/v1 MODEL_NAMEgpt-4o-mini然后在代碼里用 python-dotenv 加載from dotenv import load_dotenv import os load_dotenv() api_key os.getenv(MODEL_API_KEY)記得把.env加進(jìn).gitignore。我見過有人把 Key 提交到公開倉庫幾分鐘內(nèi)就被掃號(hào)盜刷損失慘重。這個(gè)坑千萬別踩。4. 核心功能實(shí)現(xiàn)與關(guān)鍵環(huán)節(jié)拆解4.1 Agent 主循環(huán)理解它的心跳任何 Agent 的核心都是一個(gè)循環(huán)我把它叫做心跳。偽代碼大致是這樣def run_agent(user_input, history, tools): history.append({role: user, content: user_input}) while True: response call_model(history, tools) history.append(response) if response.has_tool_call: result execute_tool(response.tool_call) history.append({role: tool, content: result}) continue else: return response.content這個(gè)循環(huán)的精髓在于模型不是一次性給出答案而是可以邊想邊做。它先決定調(diào)用哪個(gè)工具拿到結(jié)果后再?zèng)Q定下一步直到認(rèn)為任務(wù)完成才輸出最終答案。這就是所謂的 ReActReasoning Acting模式也是當(dāng)前主流 Agent 架構(gòu)的基礎(chǔ)。理解這個(gè)循環(huán)后你就能明白為什么 Agent 有時(shí)候會(huì)繞圈——它可能反復(fù)調(diào)用同一個(gè)工具卻得不到有用結(jié)果。這時(shí)候需要設(shè)置最大迭代次數(shù)兜底防止死循環(huán)燒錢MAX_ITERATIONS 10 for i in range(MAX_ITERATIONS): # ... 循環(huán)體 pass else: return 任務(wù)未在限定步數(shù)內(nèi)完成請(qǐng)細(xì)化你的指令4.2 工具定義讓模型看得懂是關(guān)鍵工具定義寫得好不好直接決定 Agent 的可用性。我總結(jié)了幾條實(shí)戰(zhàn)經(jīng)驗(yàn)。工具名要?jiǎng)釉~開頭、語義明確。read_file比file_op好run_shell比exec好。模型靠名字猜用途名字模糊它就懵。參數(shù)越少越好類型要明確。一個(gè)工具最好只做一件事。比如讀文件就只接受path一個(gè)參數(shù)別把讀、寫、刪塞進(jìn)一個(gè)工具用action參數(shù)區(qū)分那樣模型很容易傳錯(cuò)。描述要寫清楚什么時(shí)候用和返回什么。舉個(gè)例子{ name: read_file, description: 讀取指定路徑的文本文件內(nèi)容。當(dāng)用戶需要查看文件內(nèi)容時(shí)使用。返回文件的完整文本。, parameters: { type: object, properties: { path: { type: string, description: 文件的絕對(duì)或相對(duì)路徑 } }, required: [path] } }這段描述里當(dāng)用戶需要查看文件內(nèi)容時(shí)使用就是在教模型判斷調(diào)用時(shí)機(jī)非常關(guān)鍵。4.3 命令執(zhí)行的安全邊界Agent 能執(zhí)行 shell 命令這是它強(qiáng)大的地方也是最危險(xiǎn)的地方。我強(qiáng)烈建議做幾層防護(hù)。第一白名單機(jī)制。只允許執(zhí)行預(yù)定義的安全命令比如ls、cat、grep、find禁止rm、dd、mkfs這類破壞性命令。第二超時(shí)控制。任何命令執(zhí)行都要設(shè)超時(shí)防止卡死import subprocess result subprocess.run( cmd, shellTrue, capture_outputTrue, textTrue, timeout30 # 30秒超時(shí) )第三工作目錄限制。把 Agent 的操作范圍限制在某個(gè)沙箱目錄內(nèi)用pathlib做路徑校驗(yàn)防止它跑到系統(tǒng)目錄亂搞from pathlib import Path SANDBOX Path(/home/user/agent_workspace).resolve() def safe_path(user_path): target (SANDBOX / user_path).resolve() if not str(target).startswith(str(SANDBOX)): raise ValueError(路徑越界拒絕訪問) return target這幾層防護(hù)看起來麻煩但一旦 Agent 真的誤刪了你的文件你會(huì)慶幸當(dāng)初多寫了這幾行。4.4 上下文管理與 Token 控制Agent 跑久了對(duì)話歷史會(huì)越來越長Token 消耗直線上升最后可能超出模型上下文窗口。這是所有 Agent 項(xiàng)目都要面對(duì)的問題。常見的處理策略有三種。滑動(dòng)窗口最簡單只保留最近 N 輪對(duì)話老的直接丟。摘要壓縮更聰明把老對(duì)話用模型總結(jié)成一段話既省 Token 又保留關(guān)鍵信息。向量檢索最復(fù)雜把歷史存進(jìn)向量庫需要時(shí)檢索相關(guān)片段。我的建議是先用滑動(dòng)窗口跑起來等真的遇到上下文瓶頸再上摘要。過早優(yōu)化是萬惡之源很多項(xiàng)目根本跑不到需要向量檢索的規(guī)模。def trim_history(history, max_turns10): # 保留 system 消息 最近 max_turns 輪 system_msgs [m for m in history if m[role] system] recent history[-max_turns * 2:] return system_msgs recent4.5 流式輸出體驗(yàn)的分水嶺Agent 調(diào)用模型往往要等好幾秒如果一直黑屏等結(jié)果用戶會(huì)以為程序卡死了。流式輸出streaming能讓文字一個(gè)字一個(gè)字蹦出來體驗(yàn)天差地別。大多數(shù)模型 SDK 都支持流式for chunk in client.chat.completions.create( modelmodel_name, messageshistory, streamTrue ): delta chunk.choices[0].delta.content if delta: print(delta, end, flushTrue)注意flushTrue不加的話輸出會(huì)緩沖看起來還是一卡一卡的。這個(gè)小細(xì)節(jié)很多人忽略。5. 常見問題排查與避坑實(shí)錄5.1 高頻問題速查表我把這類 CLI Agent 項(xiàng)目最常遇到的問題整理成表方便你對(duì)照排查現(xiàn)象可能原因解決方向命令找不到未激活虛擬環(huán)境 / PATH 問題激活 venv檢查 PATH模型調(diào)用 401API Key 錯(cuò)誤或未加載檢查 .env 和加載邏輯模型調(diào)用 429觸發(fā)限流加重試和退避策略工具不被調(diào)用工具描述模糊優(yōu)化 name 和 descriptionAgent 死循環(huán)無最大步數(shù)限制加 MAX_ITERATIONS中文亂碼編碼未指定統(tǒng)一用 utf-8命令執(zhí)行卡死無超時(shí)加 timeout 參數(shù)上下文超限歷史未裁剪滑動(dòng)窗口或摘要5.2 模型不聽話怎么辦這是新手最頭疼的問題明明定義了工具模型就是不調(diào)用或者調(diào)用時(shí)參數(shù)亂傳。我的排查順序是這樣的。先看工具描述是否清晰。把工具描述讀給一個(gè)不懂技術(shù)的人聽如果他都聽不懂模型大概率也懵。描述里要明確什么時(shí)候用。再看系統(tǒng)提示詞system prompt。系統(tǒng)提示詞要明確告訴模型你有這些工具遇到需要外部信息的任務(wù)時(shí)優(yōu)先調(diào)用工具不要憑空編造。很多項(xiàng)目工具定義沒問題就是系統(tǒng)提示詞沒寫到位。最后看模型能力。小模型比如 7B 級(jí)別的本地模型的工具調(diào)用能力確實(shí)弱經(jīng)常該調(diào)不調(diào)。如果預(yù)算允許用能力更強(qiáng)的模型做 Agent 主控效果立竿見影。這不是玄學(xué)是實(shí)打?qū)嵉牟罹唷?.3 并發(fā)場(chǎng)景下的坑熱搜詞里有ai agent 怎么扛并發(fā)說明這是很多人的關(guān)注點(diǎn)。CLI Agent 本身通常是單次執(zhí)行的但如果要批量處理任務(wù)就會(huì)遇到并發(fā)問題。第一個(gè)坑是共享狀態(tài)。多個(gè) Agent 實(shí)例如果共享同一個(gè)對(duì)話歷史或文件會(huì)互相污染。解決辦法是每個(gè)任務(wù)用獨(dú)立的狀態(tài)對(duì)象別用全局變量。第二個(gè)坑是API 限流。并發(fā)一高模型 API 很容易觸發(fā) 429。必須加退避重試import time import random def call_with_retry(func, max_retries5): for i in range(max_retries): try: return func() except RateLimitError: wait (2 ** i) random.random() time.sleep(wait) raise Exception(重試次數(shù)耗盡)指數(shù)退避加隨機(jī)抖動(dòng)是標(biāo)準(zhǔn)做法抖動(dòng)是為了避免多個(gè)實(shí)例同時(shí)重試造成驚群。第三個(gè)坑是資源競(jìng)爭。多個(gè)進(jìn)程同時(shí)寫同一個(gè)文件會(huì)出問題用文件鎖或者讓每個(gè)任務(wù)寫?yīng)毩⑽募俸喜ⅰ?.4 我踩過的幾個(gè)真實(shí)坑說幾個(gè)文檔里不會(huì)寫、但實(shí)際會(huì)遇到的坑??右宦窂嚼锏目崭?。Agent 拼接命令時(shí)如果路徑帶空格命令會(huì)解析錯(cuò)。永遠(yuǎn)用列表形式傳參別用字符串拼接# 錯(cuò)誤 subprocess.run(fcat {path}, shellTrue) # 正確 subprocess.run([cat, path])坑二模型返回的 JSON 不合法。讓模型輸出結(jié)構(gòu)化數(shù)據(jù)時(shí)它偶爾會(huì)多寫個(gè)逗號(hào)或者少個(gè)引號(hào)。解析前先做容錯(cuò)用json.loads包 try-except失敗時(shí)讓模型重試??尤h(huán)境變量沒傳進(jìn)子進(jìn)程。用 subprocess 跑命令時(shí)默認(rèn)不繼承你新設(shè)的環(huán)境變量需要顯式傳envos.environ.copy()??铀腤indows 和 Linux 命令不通用。ls在 Windows 上沒有dir在 Linux 上沒有??缙脚_(tái)項(xiàng)目要做命令映射或者干脆用 Python 的 pathlib 替代 shell 命令。5.5 調(diào)試 Agent 的實(shí)用技巧Agent 是黑盒出問題時(shí)很難定位。我的做法是把每一步都打日志模型收到了什么、返回了什么、調(diào)用了哪個(gè)工具、工具返回了什么。日志級(jí)別設(shè)成 DEBUG跑一遍就能看清整個(gè)決策鏈路。另外把對(duì)話歷史 dump 成 JSON 文件出問題時(shí)直接看文件比在終端里翻屏高效得多。我習(xí)慣在每次運(yùn)行后把 history 存到logs/目錄加上時(shí)間戳方便回溯。6. 從能跑到好用進(jìn)階優(yōu)化方向6.1 提示詞工程的實(shí)際收益很多人低估了提示詞的作用。同一個(gè)模型、同一套工具提示詞優(yōu)化前后效果可能差一倍。我總結(jié)幾個(gè)對(duì) Agent 特別有效的提示詞技巧。明確角色和邊界。開頭就寫你是一個(gè)終端助手可以讀寫文件、執(zhí)行命令。遇到需要真實(shí)信息的任務(wù)必須調(diào)用工具不要編造。給出調(diào)用示例。在系統(tǒng)提示詞里塞一兩個(gè)用戶說 X你應(yīng)該調(diào)用工具 Y的例子模型會(huì)模仿這個(gè)模式工具調(diào)用準(zhǔn)確率明顯提升。規(guī)定輸出格式。如果后續(xù)要程序解析明確要求最終答案用純文本不要加 markdown 代碼塊。否則模型經(jīng)常給你包一層 解析就崩了。6.2 多工具編排的注意事項(xiàng)當(dāng)工具有十幾個(gè)時(shí)模型選擇困難會(huì)加劇。我的經(jīng)驗(yàn)是按場(chǎng)景分組別把所有工具一股腦塞給模型。比如文件類任務(wù)只暴露文件工具網(wǎng)絡(luò)類任務(wù)只暴露網(wǎng)絡(luò)工具。這樣既減少干擾又省 Token。如果項(xiàng)目支持可以用工具路由——先用一個(gè)小模型判斷任務(wù)類型再?zèng)Q定加載哪組工具。這是進(jìn)階玩法等基礎(chǔ)跑通再考慮。6.3 成本控制的幾個(gè)手段Agent 燒錢是真實(shí)存在的。幾個(gè)控制成本的手段用便宜模型做簡單任務(wù)貴模型做復(fù)雜推理緩存重復(fù)的模型調(diào)用結(jié)果精簡系統(tǒng)提示詞別寫幾千字的廢話限制最大迭代步數(shù)。我見過一個(gè)沒做任何限制的 Agent一個(gè)任務(wù)跑了 50 輪賬單直接爆炸。6.4 可觀測(cè)性建設(shè)項(xiàng)目要長期用可觀測(cè)性不能少。至少記錄每次任務(wù)的耗時(shí)、Token 消耗、工具調(diào)用次數(shù)、失敗率。這些數(shù)據(jù)能幫你發(fā)現(xiàn)瓶頸——是模型慢還是工具慢還是提示詞有問題。簡單的做法是寫個(gè) JSON 日志復(fù)雜點(diǎn)可以接 LangSmith 這類追蹤工具。7. 我對(duì)這類項(xiàng)目的一點(diǎn)個(gè)人體會(huì)折騰 Agent 項(xiàng)目這兩年我最大的感受是Agent 的難點(diǎn)從來不在模型而在工程。模型能力每年都在漲但工具怎么定義、上下文怎么管、錯(cuò)誤怎么兜底、安全怎么保證這些工程問題不會(huì)因?yàn)槟P妥儚?qiáng)就自動(dòng)消失。Agent-Reach 這類項(xiàng)目的價(jià)值恰恰在于它把這些工程問題用可讀的代碼攤開給你看。我建議你拿到項(xiàng)目后別急著改先原樣跑通一遍把日志打開觀察模型每一步的決策??炊怂男奶悴胖涝撛谀睦锵率謨?yōu)化。然后從加一個(gè)自己的工具開始——比如加一個(gè)查天氣的工具或者加一個(gè)操作你常用數(shù)據(jù)庫的工具。加工具的過程就是理解 Agent 架構(gòu)最快的方式。最后分享一個(gè)小技巧調(diào)試工具調(diào)用時(shí)把模型的原始返回包括 tool_calls 字段完整打印出來別只看最終答案。很多問題藏在中間過程里只看結(jié)果永遠(yuǎn)找不到根因。這個(gè)習(xí)慣幫我省了無數(shù)排查時(shí)間希望對(duì)你也有用。