Chuyển đến nội dung chính

第 6 課:代理循環-思想-行動-觀察循環

使用純 Python 從頭開始實現完整的代理循環:ReAct 模式、處理多步驟推理、對話歷史記錄管理、令牌預算和停止條件。

🧠 人工智慧與機器學習 — 第 5 課 第 6 課:代理循環 — 思想-行動-觀察循環

建構 AI 代理:從零到生產

第二部分:函數呼叫和工具使用

亞洲開發網

簡介

這是本系列中最重要的課程 - 您將從頭開始實現完整的代理循環,而不使用任何框架。深入理解這個循環將有助於您在以後使用該框架時更有效地調試和優化代理。


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. 停止條件

代理需要知道何時停止:

  1. LLM自行決定停止(不呼叫其他工具)
  2. 達到最大步數 — 安全網
  3. 超出代幣預算 — 避免意外成本
  4. 錯誤閾值 — 連續出現太多工具故障
  5. 使用者中斷-人機交互

總結

  • 代理迴圈 = while 迴圈呼叫 LLM → 檢查 tool_calls → 執行 → 重複
  • 代幣預算管理防止代理商“瘋狂”
  • 多種安全停止條件
  • 記錄調試的每一步

練習

  1. 使用 5+ 工具實作 SimpleAgent 類 2.添加代幣預算管理 3.新增對話歷史記錄持久化(從檔案儲存/載入)
  2. 測試需要 5 個以上步驟的複雜任務