Phân tích cơ chế hoạt động bên trong OpenAI Codex CLI: vòng lặp agent và chiến lược cache prompt
(openai.com)Tóm tắt:
- Cấu trúc của vòng lặp agent (Agent Loop): Bài viết giải thích chi tiết quy trình tuần hoàn trong đó Codex CLI điều phối đầu vào của người dùng, suy luận mô hình và thực thi công cụ (Tool) để hoàn thành công việc thực tế.
- Cấu trúc prompt và Responses API: Phân tích quá trình các lệnh hệ thống, định nghĩa công cụ và ngữ cảnh môi trường cục bộ được chuyển thành payload JSON của
Responses API, cùng luồng dữ liệu liên quan. - Tối ưu hiệu năng và quản lý trạng thái: Đề cập các chiến lược để tối đa hóa Prompt Caching, kỹ thuật nén hội thoại (Compaction) nhằm vượt qua giới hạn cửa sổ ngữ cảnh, và nguyên tắc thiết kế phi trạng thái (Stateless) phục vụ ZDR (Zero Data Retention).
Tóm tắt chi tiết:
Đội ngũ kỹ thuật của OpenAI đã công bố một bài viết kỹ thuật phân tích chuyên sâu nguyên lý vận hành của “vòng lặp agent (Agent Loop)”, logic cốt lõi của Codex CLI, một agent phần mềm chạy cục bộ. Bài viết mô tả toàn bộ vòng đời từ việc nhận lệnh người dùng, tương tác với mô hình, thực thi công cụ và trả về kết quả dưới góc nhìn kỹ thuật.
1. Vòng lặp agent (The Agent Loop)
Vòng lặp agent là một cấu trúc tuần hoàn nhận đầu vào từ người dùng và tương tác với mô hình cho đến khi hoàn tất tác vụ.
- Quy trình: đầu vào người dùng -> tạo prompt -> suy luận mô hình (Inference) -> (yêu cầu gọi công cụ -> thực thi công cụ -> đính kèm kết quả -> suy luận lại) lặp lại -> phản hồi cuối cùng.
- Lượt (Turn): Quá trình từ lúc người dùng nhập yêu cầu cho đến khi mô hình cuối cùng gửi một tin nhắn cho người dùng (Assistant Message) được gọi là một “lượt”. Trong quá trình này, agent có thể thực hiện hàng trăm lệnh gọi công cụ (ví dụ: chạy
ls, sửa file, v.v.).
2. Suy luận mô hình và Responses API
Codex CLI giao tiếp với mô hình thông qua Responses API. API này có thể được cấu hình tới https://chatgpt.com/backend-api/codex/responses, https://api.openai.com/v1/responses, hoặc localhost (như Ollama).
Xây dựng prompt ban đầu (Building the Initial Prompt)
Prompt không chỉ là văn bản đơn thuần mà là dữ liệu có cấu trúc gồm instructions, tools, input, v.v.
- Instructions: Thông điệp hệ thống hoặc thông điệp nhà phát triển, dùng để định nghĩa hướng dẫn hành vi của mô hình. (ví dụ: tham chiếu file cấu hình
~/.codex/config.toml) - Tools: Danh sách định nghĩa các công cụ mà mô hình có thể sử dụng. Bao gồm thực thi shell, cập nhật kế hoạch (
update_plan), tìm kiếm web, và các công cụ máy chủ MCP (Model Context Protocol) do người dùng tự định nghĩa. - Input: Danh sách dữ liệu thực tế được truyền cho mô hình. Trong đó có thiết lập quyền sandbox, chỉ dẫn theo từng dự án, và ngữ cảnh môi trường (Environment Context) như thư mục làm việc hiện tại (cwd) và loại shell.
Ví dụ payload JSON:
{
"type": "message",
"role": "user",
"content": [
{
"type": "input_text",
"text": "Hãy thêm sơ đồ kiến trúc vào README.md"
}
]
// ... cùng với ngữ cảnh môi trường và thiết lập quyền đã được định nghĩa trước đó sẽ được gửi đi
}
3. Thực thi công cụ và luồng dữ liệu
Khi mô hình yêu cầu gọi công cụ (Function Call), agent sẽ thực thi yêu cầu đó, thêm kết quả vào lịch sử hội thoại rồi gọi lại mô hình.
Ví dụ JSON yêu cầu lại sau khi thực thi công cụ:
[
/* ... các mục đầu vào trước đó ... */
{
"type": "reasoning", // quá trình suy luận của mô hình (CoT)
"summary": [...],
"encrypted_content": "gAAAAABpaDW..." // nội dung suy luận đã được mã hóa
},
{
"type": "function_call",
"name": "shell",
"arguments": "{\"command\":\"cat README.md\",\"workdir\":\"/Users/mbolin/code/codex5\"}",
"call_id": "call_8675309..."
},
{
"type": "function_call_output", // kết quả thực thi công cụ
"call_id": "call_8675309...",
"output": "<p align=\"center\"><code>npm i -g @openai/codex</code>..."
}
]
Điều quan trọng là phải cấu thành sao cho prompt trước đó trở thành tiền tố (Prefix) chính xác của prompt mới. Điều này quyết định hiệu quả của cơ chế cache prompt được nói tới ở phần sau.
4. Các cân nhắc về hiệu năng: caching và ZDR
Khi hội thoại dài hơn, kích thước prompt tăng tuyến tính, làm tăng chi phí và độ trễ.
-
Prompt Caching: Các mô hình OpenAI có thể tái sử dụng kết quả tính toán trước đó để tăng tốc khi phần đầu của prompt khớp nhau (Prefix Match).
-
Tránh cache miss: Nếu danh sách công cụ thay đổi hoặc thiết lập sandbox thay đổi giữa chừng cuộc hội thoại, cache có thể bị phá vỡ. Để ngăn điều này, Codex xử lý thay đổi cấu hình theo cách thêm mới (Append) thông điệp thay vì chỉnh sửa thông điệp cũ.
-
Phi trạng thái (Stateless) và ZDR: Không dùng các tham số như
previous_response_id, mà gửi toàn bộ ngữ cảnh trong mỗi lần gọi. Điều này nhằm tuân thủ chính sách Zero Data Retention (ZDR), tức không lưu dữ liệu trên máy chủ. Bằng cách để client nhậnencrypted_contentcủa phần suy luận rồi gửi lại cho máy chủ, hệ thống có thể khôi phục ngữ cảnh suy luận trước đó mà không cần máy chủ lưu trạng thái.
5. Quản lý cửa sổ ngữ cảnh (Compaction)
Để không vượt quá giới hạn token, Codex sử dụng endpoint /responses/compact để nén lịch sử hội thoại. Đây không phải tóm tắt đơn thuần, mà trả về một danh sách mục đã nén, bao gồm encrypted_content giúp bảo toàn sự hiểu ngầm (Latent understanding) của mô hình và thay thế đầu vào cũ.
2 bình luận
Claude Code đã có trong tài liệu chính thức ngay từ đầu mà…
https://code.claude.com/docs/en/how-claude-code-works