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

Sandbox do OpenAI lưu trữ: Xây dựng Chuyên viên phân tích tài chính AI an toàn

Tìm hiểu cách xây dựng một chuyên viên phân tích tài chính AI an toàn với sandbox do OpenAI lưu trữ, từ việc tải dữ liệu tài chính lên và chạy phân tích do agent điều phối đến việc tạo và tải xuống báo cáo, biểu đồ và các tệp dữ liệu hỗ trợ.
· 9 phút đọc

Khám phá cùng AI

Các agent AI đã vượt xa việc chỉ tạo văn bản đơn thuần. Giờ đây chúng có thể viết mã, chạy lệnh, làm việc với tệp, sửa lỗi và tự hoàn thành các tác vụ nhiều bước.

Nhưng LLM không phải lúc nào cũng có thể dự đoán được. 

Ngay cả với hướng dẫn rõ ràng, một agent có thể tạo ra lệnh bất ngờ hoặc sửa đổi thứ không được phép. Vì vậy, chạy trực tiếp mã đó trên máy cục bộ hoặc máy chủ ứng dụng của bạn có thể mang lại rủi ro không cần thiết.

Trong hướng dẫn này, tôi sẽ sử dụng sandbox do OpenAI lưu trữ để xây dựng một chuyên viên phân tích tài chính AI an toàn. Chúng ta sẽ tải một bộ dữ liệu tài chính lên, kết nối một agent với môi trường cách ly, để nó thực hiện phân tích và tạo ra các hiện vật tại đó, rồi tải xuống các báo cáo, biểu đồ và tệp dữ liệu kết quả.

Chuyên viên phân tích tài chính chỉ là ví dụ. Mục tiêu chính là hiểu cách cung cấp cho một agent AI một môi trường được kiểm soát, nơi nó có thể chạy mã và làm việc với tệp một cách an toàn.

OpenAI-Hosted Sandbox là gì?

Sandbox là một môi trường cách ly, nơi mã có thể chạy mà không có quyền truy cập không hạn chế vào hệ thống đang lưu trữ ứng dụng của bạn.

Điều này đặc biệt hữu ích cho các agent AI vì hành vi của chúng không hoàn toàn có thể dự đoán. 

Một agent có thể được yêu cầu sửa một tệp nhưng lại tạo ra lệnh ảnh hưởng đến thư mục khác, cài một phụ thuộc ngoài dự kiến hoặc thực thi điều bạn không lường trước.

Thay vì cho phép các lệnh đó chạy trực tiếp trên laptop hay máy chủ của bạn, bạn có thể đặt agent vào một sandbox.

OpenAI cung cấp môi trường sandbox được lưu trữ cho mục đích này. 

Nó cung cấp cho agent một không gian làm việc Linux thực với hệ thống tệp và shell, đồng thời giữ việc thực thi tách biệt khỏi hệ thống cục bộ của bạn.

Bên trong sandbox, agent có thể:

  • Đọc và ghi tệp.
  • Tạo và thực thi script.
  • Chạy lệnh shell.
  • Kiểm tra đầu ra lệnh.
  • Sửa lỗi và chạy lại mã.
  • Tạo báo cáo, bộ dữ liệu, biểu đồ và các hiện vật khác.

Bạn cũng có thể kiểm soát những gì sandbox được truy cập. 

Ví dụ, bạn có thể chỉ tải lên các tệp cần thiết cho một tác vụ và vô hiệu hóa truy cập mạng khi agent không cần thông tin bên ngoài.

Các cách khác nhau để sử dụng OpenAI Sandboxes

OpenAI cung cấp vài cách để chạy agent hoặc mô hình trong các môi trường cách ly. Khác biệt chính là mức độ bạn muốn OpenAI quản lý việc thực thi và quy trình công việc của agent.

1. Shell Tool

Shell tool là lựa chọn đơn giản nhất. Nó cho phép một mô hình chạy các lệnh shell bên trong một container do OpenAI lưu trữ thông qua Responses API.

response = client.responses.create(
    model=MODEL,
    tools=[{
        "type": "shell",
        "environment": {"type": "container_auto"}
    }],
    input="Analyze the files in /mnt/data."
)

Đây là lựa chọn tốt khi bạn chủ yếu cần thực thi mã, xử lý tệp hoặc các tác vụ dòng lệnh.

2. Agents API

Agents API là lựa chọn được quản lý nhiều hơn. OpenAI xử lý cả phiên agent lẫn môi trường được lưu trữ.

stream = client.beta.agents.sessions.create(
    agent={
        "model": MODEL,
        "instructions": "Analyze the data and create a report."
    },
    environment={"type": "openai_hosted"},
    input="Analyze the files in the workspace.",
    stream=True,
)

Hữu ích khi bạn muốn OpenAI quản lý nhiều hơn thời gian chạy của agent và vòng đời sandbox thay cho bạn.

3. SandboxAgent

SandboxAgent là một phần của Agents SDK và được thiết kế cho các agent mà không gian làm việc sandbox là thành phần cốt lõi của ứng dụng.

from agents.sandbox import SandboxAgent
from agents.sandbox.capabilities import Shell

agent = SandboxAgent(
    name="Financial Analyst",
    model=MODEL,
    capabilities=[Shell()],
)

Phù hợp khi bạn cần không gian làm việc, tệp, hiện vật có tính bền và linh hoạt về nhà cung cấp sandbox bạn sử dụng.

4. Agents SDK + ShellTool

Đây là cách tiếp cận chúng ta dùng trong hướng dẫn này.

Chúng ta tự tạo container do OpenAI lưu trữ rồi kết nối agent với môi trường cụ thể đó bằng ShellTool.

sandbox_shell = ShellTool(
    environment={
        "type": "container_reference",
        "container_id": container.id,
    }
)

Chúng tôi chọn cách này vì nó cân bằng tốt giữa đơn giản và kiểm soát. 

OpenAI quản lý hạ tầng sandbox, trong khi chúng ta vẫn kiểm soát container, tệp, truy cập mạng, hướng dẫn cho agent, công cụ và luồng thực thi.

Cách sử dụng sandbox do OpenAI lưu trữ

Hãy cùng khám phá cách dùng sandbox do OpenAI lưu trữ để tạo một agent phân tích tài chính an toàn. 

1. Thiết lập môi trường và dự án

Chúng ta sẽ dùng Jupyter Notebook để thiết lập và kiểm thử quy trình làm việc. 

Notebook sẽ xử lý các tác vụ như cài SDK cần thiết, tải bộ dữ liệu lên, tạo sandbox, khởi chạy agent và tải về các hiện vật cuối cùng.

Tuy nhiên, điểm quan trọng là bản thân việc phân tích tài chính sẽ không chạy trong Jupyter. 

Khi agent kết nối với sandbox của OpenAI, việc thực thi mã, lệnh shell, xác thực, tính toán và tạo hiện vật sẽ diễn ra bên trong môi trường sandbox được lưu trữ.

Hãy coi Jupyter là lớp điều khiển, còn sandbox là môi trường thực thi.

Bắt đầu bằng cách cài OpenAI Python SDK và OpenAI Agents SDK:

%pip install -q -U openai openai-agents

Bạn cũng cần một khóa API OpenAI qua biến môi trường OPENAI_API_KEY.

Trong hướng dẫn này, chúng ta sẽ dùng bộ dữ liệu của một công ty hư cấu lưu tại:

financial_data/northstar_cloud_financial_statements.csv

Tiếp theo, nhập các thư viện cần thiết và định nghĩa mô hình, tệp CSV đầu vào, thư mục đầu ra cục bộ, cùng các tệp chúng ta kỳ vọng agent sẽ tạo ra.

import json
import os
from pathlib import Path

from IPython.display import Markdown, SVG, display


MODEL = os.getenv("OPENAI_MODEL", "gpt-6-luna")

STATEMENT_CSV = Path(
    "financial_data/northstar_cloud_financial_statements.csv"
)

OUTPUT_DIR = Path("financial_analysis_output")
OUTPUT_DIR.mkdir(exist_ok=True)

EXPECTED_ARTIFACTS = [
    "analyze_financials.py",
    "calculated_metrics.csv",
    "unusual_movements.csv",
    "financial_trends.svg",
    "investment_analysis.md",
    "analysis_run.json",
]

assert os.getenv("OPENAI_API_KEY"), \
    "Set OPENAI_API_KEY before continuing."

assert STATEMENT_CSV.exists(), \
    f"Missing input: {STATEMENT_CSV.resolve()}"

print(f"Model: {MODEL}")
print(
    f"Input: {STATEMENT_CSV} "
    f"({STATEMENT_CSV.stat().st_size:,} bytes)"
)

Đầu ra:

Model: gpt-6-luna
Input: financial_data\northstar_cloud_financial_statements.csv (1,480 bytes)

Các câu lệnh assert cung cấp kiểm tra nhanh trước khi tạo bất kỳ tài nguyên OpenAI nào. Nếu thiếu khóa API hoặc không tìm thấy bộ dữ liệu, notebook sẽ dừng ngay thay vì lỗi ở bước sau.

OUTPUT_DIR là thư mục Jupyter cục bộ nơi chúng ta sẽ lưu các tệp tải xuống từ sandbox. 

EXPECTED_ARTIFACTS lại định nghĩa các tệp chúng ta kỳ vọng agent tạo ra bên trong sandbox.

2. Tải dữ liệu tài chính lên

Trước khi sandbox có thể làm việc với dữ liệu tài chính của chúng ta, trước hết cần tải tệp CSV lên OpenAI.

Jupyter Notebook sẽ xử lý bước này. Nó đọc tệp cục bộ và gửi qua OpenAI Files API.

from openai import OpenAI

client = OpenAI()

with STATEMENT_CSV.open("rb") as handle:
    uploaded_input = client.files.create(
        file=handle,
        purpose="user_data",
    )

print(f"Uploaded raw statements: {uploaded_input.id}")

Đầu ra:

Uploaded raw statements: file-C6Pb6RhZrVPR4Fiq9tZ6Hn

ID tệp của bạn sẽ khác.

ID tệp trả về rất quan trọng vì chúng ta sẽ dùng nó khi tạo sandbox. Thay vì sao chép nội dung CSV vào prompt, ta có thể đính kèm trực tiếp tệp gốc vào môi trường làm việc của agent.

Tại thời điểm này, báo cáo tài chính của Northstar đã được lưu với OpenAI, nhưng agent vẫn chưa có môi trường thực thi.

Chúng ta sẽ tạo môi trường đó tiếp theo.

3. Tạo sandbox do OpenAI lưu trữ

Giờ ta có thể tạo môi trường lưu trữ nơi agent sẽ thực sự tiến hành phân tích tài chính.

Sử dụng Containers API để tạo một sandbox mới và đính kèm tệp CSV đã tải lên bằng ID của nó:

container = client.containers.create(
    name="northstar-financial-analysis",
    file_ids=[uploaded_input.id],
    memory_limit="4g",
    network_policy={"type": "disabled"},
)

print(f"OpenAI sandbox: {container.id}")

Đầu ra:

OpenAI sandbox: cntr_6ab7a1080b4081938d8d08ab67ac963c084798905ec997e9

Sandbox được tạo với 4 GB bộ nhớ, và các báo cáo tài chính đã tải lên sẵn có bên trong từ đầu.

Chúng ta cũng vô hiệu hóa truy cập mạng:

network_policy={"type": "disabled"}

Phân tích tài chính của chúng ta không cần thông tin từ internet, nên không có lý do để cấp quyền truy cập mạng ngoài cho agent. Mọi thứ cần thiết đã nằm trong CSV.

4. Xác định tác vụ của chuyên viên phân tích tài chính

Sandbox cung cấp cho agent một nơi làm việc an toàn, nhưng ta vẫn cần xác định chính xác điều ta muốn nó làm.

Thay vì đưa cho mô hình một hướng dẫn mơ hồ như "phân tích công ty này", chúng ta cung cấp một tác vụ chi tiết mô tả các phép tính, kiểm tra xác thực, các tệp cần tạo và cách agent tự kiểm tra công việc của mình.

ANALYST_INSTRUCTIONS = """
You are a skeptical senior buy-side financial analyst preparing an investment-committee memo.

Every analytical operation must occur in the hosted shell container under /mnt/data. Do not
estimate results mentally or ask the caller to calculate anything.

Find the uploaded Northstar statement CSV. Write analyze_financials.py using only the Python
standard library and execute it. Validate required columns, numeric values, unique ordered years,
and total_assets = total_liabilities + equity for every row. Calculate revenue growth, gross/
operating/net margins, current and quick ratios, total-liabilities-to-equity, average-balance ROA
and ROE, interest coverage, free cash flow, FCF margin, cash conversion, receivables growth, and
inventory growth. Leave a ratio blank when its denominator makes it undefined.

Flag absolute year-over-year movements of at least 15%, operating-margin moves of at least two
percentage points, and receivables growth exceeding revenue growth by at least ten points. Create
calculated_metrics.csv, unusual_movements.csv, financial_trends.svg, investment_analysis.md, and
analysis_run.json in /mnt/data. The SVG must contain four readable chart panels without external
packages.

The report must cover Executive view, KPI table, Profitability, Liquidity and leverage, Cash flow
and earnings quality, Unusual movements, Bull case, Bear case, Diligence questions, Data
limitations, and Conclusion. Tie receivables, deferred revenue, stock compensation, capex, and
interest expense to evidence; separate facts from hypotheses and cite filenames and years.

analysis_run.json must contain input_filename, row_count, year_range, validation_results,
generated_filenames, and execution_directory='/mnt/data'. validation_results must include
accounting_equation_passed_every_row=true. Run the script, inspect every artifact, independently
recompute at least three 2025 metrics in a second command, and fix discrepancies. Do not finish
until all six required files exist and are non-empty.
"""

Có một lựa chọn thiết kế quan trọng ở đây.

Chúng ta không yêu cầu mô hình suy luận về phân tích tài chính chỉ trong phản hồi của nó. 

Hướng dẫn nêu rõ nó phải viết mã, thực thi mã đó, kiểm tra kết quả, xác minh một số phép tính và sửa các sai lệch.

Chúng ta cũng yêu cầu agent rằng mọi thao tác phân tích phải diễn ra trong /mnt/data bên trong sandbox được lưu trữ.

Điều này mang đến cho agent một quy trình rõ ràng:

Tìm dữ liệu → xác thực → viết script phân tích → chạy → tạo hiện vật → kiểm tra kết quả → xác minh phép tính → sửa lỗi nếu cần.

Như vậy sandbox trở thành môi trường làm việc thực sự chứ không chỉ là nơi lưu trữ tệp tạm thời.

5. Kết nối Agent với Sandbox

Tiếp theo, chúng ta kết nối một agent OpenAI với container đã tạo trước đó.

Chúng ta làm điều này bằng ShellTool.

from agents import Agent, ModelSettings, Runner, ShellTool

sandbox_shell = ShellTool(
    environment={
        "type": "container_reference",
        "container_id": container.id,
    }
)

analyst = Agent(
    name="Sandbox Financial Analyst",
    model=MODEL,
    instructions=ANALYST_INSTRUCTIONS,
    tools=[sandbox_shell],
    model_settings=ModelSettings(tool_choice="required"),
)

Phần quan trọng là:

"type": "container_reference",
"container_id": container.id,

Điều này báo cho ShellTool kết nối agent với sandbox chúng ta đã tạo thay vì tạo hay dùng môi trường thực thi khác.

Chúng ta cũng đặt:

tool_choice="required"

Điều này buộc agent phải sử dụng một công cụ trong quá trình chạy thay vì hoàn thành nhiệm vụ chỉ với phản hồi văn bản thông thường.

Đối với hướng dẫn này, đó chính xác là điều chúng ta muốn. 

Agent không nên chỉ giải thích cách tính các chỉ số tài chính. Nó cần dùng shell, thực thi mã trong sandbox và tạo ra các tệp được yêu cầu.

6. Để agent thực hiện phân tích

Khi bộ dữ liệu đã được tải lên, sandbox đang chạy và agent kết nối qua ShellTool, giờ chúng ta có thể bắt đầu phân tích.

result = await Runner.run(
    analyst,
    "Analyze Northstar entirely inside the sandbox and produce every required artifact.",
    max_turns=30,
)

display(Markdown(result.final_output))

Điều này khởi chạy agent phân tích tài chính và cấp cho nó quyền truy cập vào sandbox chúng ta đã tạo trước đó.

Output of the OpenAI Agent

Đầu ra cuối cùng của agent xác nhận rằng phân tích đã hoàn tất thành công bên trong /mnt/data, bao gồm xác thực dữ liệu, kiểm tra chỉ số và tạo đủ sáu hiện vật bắt buộc.

7. Tải xuống các hiện vật đã tạo

Phân tích đã hoàn tất, nhưng các tệp tạo ra vẫn nằm trong sandbox của OpenAI.

Tiếp theo, chúng ta liệt kê các tệp trong container, kiểm tra mọi hiện vật kỳ vọng đã được tạo và tải chúng về thư mục cục bộ.

remote_files = {
    Path(item.path).name: item
    for item in client.containers.files.list(container.id)
}

missing = [
    name for name in EXPECTED_ARTIFACTS
    if name not in remote_files
]

assert not missing, f"Sandbox did not create: {missing}"

for name in EXPECTED_ARTIFACTS:
    remote = remote_files[name]
    destination = OUTPUT_DIR / name

    client.containers.files.content.retrieve(
        remote.id,
        container_id=container.id,
    ).write_to_file(destination)

    assert destination.stat().st_size > 0, \
        f"Empty artifact: {destination}"

    print(
        f"Downloaded {name}: "
        f"{destination.stat().st_size:,} bytes"
    )

Đầu ra:

Downloaded analyze_financials.py: 22,778 bytes
Downloaded calculated_metrics.csv: 3,740 bytes
Downloaded unusual_movements.csv: 25,405 bytes
Downloaded financial_trends.svg: 13,846 bytes
Downloaded investment_analysis.md: 12,159 bytes
Downloaded analysis_run.json: 1,522 bytes

Lúc này, bạn có thể mở thư mục cục bộ financial_analysis_output và kiểm tra mọi thứ agent đã tạo.

Thư mục chứa script phân tích, các chỉ số đã tính, cờ đánh dấu biến động bất thường, bản ghi nhớ đầu tư đầy đủ, bản kê xác thực và một SVG trực quan hóa các xu hướng tài chính.

Financial analysis report generated by the OpenAI Agent

investment_analysis.md chứa phần phân tích viết chính, bao gồm góc nhìn điều hành, khả năng sinh lời, thanh khoản, đòn bẩy, dòng tiền, biến động bất thường và kịch bản lạc quan/bi quan.

Financial analysis visualization generated by the OpenAI Agent

Bạn cũng có thể mở financial_trends.svg để xem kết quả trực quan. 

Nó cho bạn cái nhìn nhanh về các xu hướng tài chính chính như doanh thu, khả năng sinh lời, biên lợi nhuận và các chỉ số then chốt khác mà không cần đọc toàn bộ báo cáo trước.

Một chi tiết quan trọng là chúng ta không đơn thuần tải về bất kỳ tệp nào agent tạo ra. 

Notebook trước hết so sánh nội dung sandbox với EXPECTED_ARTIFACTS.

Nếu thiếu một trong các tệp bắt buộc, assert sẽ thất bại. Chúng ta cũng kiểm tra mỗi tệp tải về đều không rỗng.

Điều này mang lại một bước xác minh đơn giản trước khi chấp nhận đầu ra của agent.

8. Dọn dẹp sandbox

Sau khi các tệp đã được tải xuống và xác minh, chúng ta không còn cần sandbox tạm thời hoặc tệp nguồn đã tải lên nữa.

Hãy xóa cả hai tài nguyên:

client.containers.delete(container.id)
client.files.delete(uploaded_input.id)

Điều này xóa container được lưu trữ và bộ dữ liệu tài chính đã tải lên sau khi hoàn tất quy trình làm việc.

Dọn dẹp tài nguyên tạm thời là bước cuối cùng tốt, đặc biệt khi bạn thường xuyên tạo sandbox như một phần của quy trình agent.

Tổng kết

Ưu điểm lớn nhất của sandbox do OpenAI lưu trữ là toàn bộ quy trình nằm trong một hệ sinh thái.

Bạn không cần kết nối nhà cung cấp sandbox riêng, cấp phát môi trường đám mây của riêng mình hoặc xây dựng và vận hành hạ tầng container của riêng bạn. 

Bạn có thể tạo sandbox, đính kèm tệp, kiểm soát truy cập mạng, để agent làm việc bên trong, lấy kết quả và xóa môi trường khi hoàn tất, tất cả thông qua nền tảng OpenAI.

Điều đó giúp quy trình làm việc dễ quản lý hơn nhiều.

Trong hướng dẫn này, tôi dùng OpenAI Agents SDK với ShellTool vì nó cho tôi cách trực tiếp để kết nối một agent với container hiện có mà vẫn kiểm soát được hướng dẫn, tệp, công cụ và luồng thực thi.

Có những cách khác để xây dựng quy trình tương tự trong hệ sinh thái của OpenAI, bao gồm API agent trực tiếp hơn và các trừu tượng hóa sandbox cấp cao. 

Tuy nhiên, với ví dụ này, Agents SDK mang lại cảm giác cân bằng phù hợp giữa đơn giản và kiểm soát.

Điểm mấu chốt là giờ đây bạn có thể cung cấp cho một agent AI môi trường thực thi thật mà không rời hệ sinh thái OpenAI:

Tạo sandbox → đính kèm dữ liệu → kết nối agent → chạy tác vụ → lấy hiện vật → xóa sandbox.

Với các ứng dụng agent cần chạy mã, thao tác tệp, tạo báo cáo hoặc thực hiện phân tích nhiều bước, đó là một mẫu hình rất hữu ích.

FAQs

Một sandbox do OpenAI lưu trữ duy trì hoạt động trong bao lâu?

Một sandbox do OpenAI lưu trữ sẽ hoạt động cho đến khi bạn chủ động xóa phiên qua API. Nếu để chạy mà không có keep-alive hoặc hoạt động nào, nó sẽ tự động hết hạn và bị xóa sau một giờ không hoạt động. Hiện chưa thể cấu hình thời gian chờ do không hoạt động này.

Những ngôn ngữ lập trình nào được cài sẵn trong sandbox của OpenAI?

Mặc dù Python là lựa chọn tiêu chuẩn cho phân tích dữ liệu, container được lưu trữ bao gồm sẵn một số runtime cài đặt sẵn. Môi trường hỗ trợ nguyên bản Python 3.11, Node.js 22.16, Java 17.0, PHP 8.2, Ruby 3.1 và Go 1.23.

Các tệp tải lên sandbox có được dùng để huấn luyện các mô hình của OpenAI không?

Không. Dữ liệu gửi tới OpenAI API—bao gồm các tệp đính kèm vào Containers API và mã thực thi trong sandbox—là riêng tư. Dữ liệu này không được dùng để huấn luyện hoặc cải thiện các mô hình nền tảng của OpenAI trừ khi bạn chủ động chọn chia sẻ dữ liệu.

Môi trường sandbox có phát sinh chi phí bổ sung ngoài việc sử dụng token API không?

Có, các sandbox được lưu trữ sử dụng tài nguyên tính toán của container, được tính phí riêng so với cách tính phí theo token mô hình tiêu chuẩn. Điều này khiến việc xóa tường minh container và các tệp đính kèm ngay sau khi agent hoàn tất trở thành một thực hành tiết kiệm chi phí quan trọng.

Abid Ali Awan

Tác giả

Abid Ali Awan

Là một nhà khoa học dữ liệu được chứng nhận, tôi đam mê tận dụng công nghệ tiên tiến để tạo ra các ứng dụng học máy đổi mới. Với nền tảng vững chắc về nhận dạng giọng nói, phân tích và báo cáo dữ liệu, MLOps, AI hội thoại và NLP, tôi đã rèn giũa kỹ năng phát triển các hệ thống thông minh có thể tạo ra tác động thực sự. Bên cạnh chuyên môn kỹ thuật, tôi cũng là một người truyền đạt tốt, có khả năng chắt lọc các khái niệm phức tạp thành ngôn ngữ rõ ràng, súc tích. Nhờ đó, tôi trở thành một blogger được nhiều người quan tâm trong lĩnh vực khoa học dữ liệu, chia sẻ góc nhìn và kinh nghiệm với cộng đồng các chuyên gia dữ liệu ngày càng lớn. Hiện tại, tôi tập trung vào sáng tạo và biên tập nội dung, làm việc với các mô hình ngôn ngữ lớn để phát triển nội dung mạnh mẽ và hấp dẫn, giúp doanh nghiệp và cá nhân tận dụng tối đa dữ liệu của mình.

Chủ đề

Liên quan