簡介
這是本系列中最重要的課程 - 您將從頭開始實現完整的代理循環,而不使用任何框架。深入理解這個循環將有助於您在以後使用該框架時更有效地調試和優化代理。
1. 代理循環-核心架構
class SimpleAgent:
def __init__(self, model="gpt-4o-mini", max_steps=10):
self.client = OpenAI()
self.model = model
self.max_steps = max_steps
self.tools = ToolRegistry()
self.messages = []
self.cost_tracker = CostTracker()
def run(self, user_input: str) -> str:
self.messages = [
{"role": "system", "content": self.system_prompt},
{"role": "user", "content": user_input}
]
for step in range(self.max_steps):
response = self.client.chat.completions.create(
model=self.model,
messages=self.messages,
tools=self.tools.schemas,
)
message = response.choices[0].message
self.messages.append(message)
self.cost_tracker.track(self.model, response.usage)
# No tool calls → final answer
if not message.tool_calls:
return message.content
# Execute tools
for tool_call in message.tool_calls:
result = self.tools.execute(
tool_call.function.name,
json.loads(tool_call.function.arguments)
)
self.messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": str(result),
})
return "Max steps reached without final answer."
2. 代幣預算管理
def trim_messages(messages, max_tokens=100000):
"""Giữ messages trong budget token."""
# Luôn giữ system prompt và user message gần nhất
essential = [messages[0], messages[-1]]
middle = messages[1:-1]
# Xóa messages cũ nhất nếu vượt budget
while estimate_tokens(essential + middle) > max_tokens and middle:
middle.pop(0)
return [essential[0]] + middle + [essential[1]]
3. 停止條件
代理需要知道何時停止:
- LLM自行決定停止(不呼叫其他工具)
- 達到最大步數 — 安全網
- 超出代幣預算 — 避免意外成本
- 錯誤閾值 — 連續出現太多工具故障
- 使用者中斷-人機交互
總結
- 代理迴圈 = while 迴圈呼叫 LLM → 檢查 tool_calls → 執行 → 重複
- 代幣預算管理防止代理商“瘋狂”
- 多種安全停止條件
- 記錄調試的每一步
練習
- 使用 5+ 工具實作 SimpleAgent 類 2.添加代幣預算管理 3.新增對話歷史記錄持久化(從檔案儲存/載入)
- 測試需要 5 個以上步驟的複雜任務