Hướng dẫn toàn diện từ cơ bản đến nâng cao: Text, JSON & Function Calling
Khởi tạo project Python, cài đặt package, lấy và bảo mật API Key.
Hiểu về Roles (System, User, Assistant), gửi request và tinh chỉnh Parameters.
Xử lý dữ liệu định dạng JSON Schema (Structured Outputs) và Function Calling.
Bài tập vận dụng từng phần và Project cuối khóa tổng hợp kiến thức.

1. Khởi tạo môi trường ảo (.venv):
Mở Terminal/CMD tại thư mục project và chạy lệnh:
python -m venv .venv
# Kích hoạt (Windows): .venv\Scripts\activate
# Kích hoạt (Mac/Linux): source .venv/bin/activate
2. Cài đặt các Package cần thiết:
pip install openai python-dotenv pydantic
3. Thiết lập biến môi trường (.env):
Tạo file .env ngang hàng với code và thêm:
OPENAI_API_KEY=sk-proj-xxyyzz...
4. Lưu lại thông tin package đã cài đặt:
# Lưu thông tin package vào requirements.txt
pip freeze > requirements.txt
# Sau này khi deploy hoặc chuyển máy, chỉ cần chạy:
pip install -r requirements.txt
Giải thích chi tiết:
Khi giao tiếp với AI, hội thoại được cấu trúc dưới dạng một danh sách các "tin nhắn" (messages). Mỗi tin nhắn phải thuộc về một trong 3 vai trò sau:
Dùng để thiết lập bối cảnh, nhân cách và các quy tắc cốt lõi cho AI. Thường đặt ở đầu danh sách.
VD: "Bạn là giáo viên Toán chuyên nghiệp."
Câu hỏi hoặc mệnh lệnh xuất phát từ người dùng cuối (chúng ta). AI sẽ đọc và trả lời những yêu cầu này.
VD: "Giải thích cho tôi định lý Pytago là gì?"
Câu trả lời sinh ra từ mô hình AI. Ta có thể tự chèn các tin nhắn này để định hướng AI phản hồi tiếp theo.
VD: "Định lý Pytago phát biểu rằng..."
Đoạn code bên phải minh họa cách tối giản nhất để kết nối tới OpenAI API và nhận về một câu trả lời dạng văn bản.
import os
from openai import OpenAI
from dotenv import load_dotenv
# Load API Key từ file .env
load_dotenv()
# Khởi tạo OpenAI client
client = OpenAI()
# Gửi Request
response = client.responses.create(
model="gpt-5-mini",
instructions="Bạn là trợ lý.",
input=[
{"role": "user", "content": "Xin chào!"}
]
)
# In ra phản hồi (Text)
print(response.output_text)
Khi gọi hàm create(), bạn có thể truyền thêm các tham số để kiểm soát đầu ra của AI:
# Gửi request với các tham số tùy chỉnh
response = client.responses.create(
model="gpt-5.2",
input="Kể một câu chuyện ngắn.",
# Tăng tính sáng tạo của câu chuyện
temperature=0.8,
# Giữ mặc định vì đã chỉnh temperature
top_p=1.0,
# Giới hạn sinh ra khoảng ~350 chữ
max_output_tokens=500
)
print(response.output_text)
Yêu cầu: Viết một chương trình Python chạy trên Terminal cho phép người dùng chat liên tục với AI. Chương trình phải có "bộ nhớ" (nhớ được những câu hỏi và trả lời trước đó). Gõ "exit" để thoát.
Giải thích thuật toán:
import openai
from dotenv import load_dotenv
load_dotenv()
# Khởi tạo bộ nhớ (lịch sử hội thoại)
messages = []
system_prompt = "Bạn là trợ lý AI trả lời ngắn gọn, dễ hiểu."
while True:
user_input = input("Bạn: ")
if user_input.lower() == "exit":
print("Tạm biệt!"); break
# Thêm câu hỏi vào lịch sử
messages.append({"role": "user", "content": user_input})
response = openai.responses.create(
model="gpt-5-mini", input=messages, instructions=system_prompt
)
reply = response.output_text
print("AI: " + reply)
# Quan trọng: Thêm câu trả lời vào lịch sử
messages.append({"role": "assistant", "content": reply})
Trong thực tế, ta thường cần AI trả về dữ liệu có cấu trúc (JSON) thay vì text thuần để dễ dàng xử lý bằng code (ví dụ: lưu vào database).
Cách tiếp cận cơ bản:
response = client.responses.create(
model="gpt-5-mini",
instructions="Bạn là một API. Hãy trả về JSON.",
# Ép kiểu dữ liệu trả về thành JSON Object
text={ "format": { "type": "json_object" } },
input="Cho tôi JSON tên 2 loại trái cây đỏ ."
)
import json
json_str = response.output_text
data = json.loads(json_str)
print(data)
# KQ: {'fruits': ['táo', 'dâu tây']}
Tính năng Structured Outputs đảm bảo 100% AI trả về JSON khớp đúng với cấu trúc (Schema) bạn đã định nghĩa trước.
import openai
from pydantic import BaseModel
from dotenv import load_dotenv
load_dotenv()
# Định nghĩa Schema (Cấu trúc mong muốn)
class UserInfo(BaseModel):
name: str
age: int
# Sử dụng .parse thay vì .create
response = openai.responses.parse(
model="gpt-5-mini",
input="Tôi tên Nam, 25 tuổi.",
text_format=UserInfo, # Gắn schema vào
)
# Nhận object trực tiếp
user = response.output_parsed
print(user.name) # Output: Nam
print(user.age) # Output: 25
AI bị giới hạn bởi dữ liệu quá khứ và không thể tự thao tác với thế giới thực. Function Calling (hay Tool Calling) là cung cấp cho AI danh sách các "công cụ" (hàm Python) để nó tự chọn gọi khi cần thiết.
*Lưu ý: Mô hình KHÔNG tự chạy hàm. Nó chỉ phân tích và trả về "Yêu cầu gọi hàm X với tham số Y". Code Python của bạn mới là nơi thực thi!

Khai báo tools theo JSON Schema với type/name/description/parameters. Nên bật strict: true để mô hình bám schema tốt hơn.
Gửi input của user cùng mảng tools bằng client.responses.create() để mô hình quyết định có gọi hàm hay không.
Duyệt response.output và lấy các item có type="function_call". Trích xuất name, call_id, arguments.
Code Python của bạn chạy hàm thực tế bằng tham số đã parse từ arguments. Lưu ý có thể có nhiều function call trong một lượt.
Đính kèm kết quả theo dạng type="function_call_output" + call_id, rồi gọi model lần nữa để nhận câu trả lời cuối cùng (hoặc thêm tool calls).
# 1) Định nghĩa tool theo schema mới (Responses API)
tools = [{
"type": "function",
"name": "get_weather",
"description": "Lấy thời tiết hiện tại theo địa điểm.",
"strict": True,
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string"}
},
"required": ["location"],
"additionalProperties": False
}
}]
# 2) Request đầu tiên (mô hình chọn có gọi tool hay không)
input_messages = [{"role": "user", "content": "Thời tiết Hà Nội hôm nay thế nào?"}]
response = openai.responses.create(
model="gpt-5-mini", tools=tools, input=input_messages
)
# 3) Xử lý tool calls (có thể 0, 1 hoặc nhiều)
input_messages += response.output
for item in response.output:
if item.type != "function_call":
continue
args = json.loads(item.arguments)
weather = f"{args['location']}: 30 do C, troi nang"
input_messages.append({
"type": "function_call_output",
"call_id": item.call_id,
"output": weather
})
# 4) Gửi kết quả tool để model trả lời tự nhiên
final_response = openai.responses.create(
model="gpt-5-mini", tools=tools, input=input_messages
)
print(final_response.output_text)
Đề bài: Bạn có một văn bản lộn xộn chứa thông tin khách hàng từ CSKH:
"Hôm qua khách Nguyễn Văn A (tuổi 30) gọi điện. Bảo là thích chơi thể thao. Gửi email xác nhận qua nguyenvana@email.com, SDT là 0912345678."
Hãy viết code dùng Pydantic Schema và Structured Outputs để bóc tách thông tin trên thành một Object chuẩn hóa chứa (name, age, email, phone, hobbies) và in kết quả.
BaseModel từ thư viện Pydantic. Cần import thêm thư viện typing (dùng List/Optional) nếu thuộc tính hobbies lưu nhiều sở thích.CustomerInfo(BaseModel). Khai báo kiểu dữ liệu rõ ràng: name: str, age: int, email: str, phone: str, hobbies: list[str].client.responses.parse. Đưa đoạn text CSKH vào phần content của User role. Đừng quên truyền response_format=CustomerInfo.customer = response.output_parsed. Sau đó in ra customer.email.Đề bài: Tạo một hàm Python cơ bản get_weather(location) giả lập việc trả về nhiệt độ mặc định là 30°C và trời nắng.
Khi người dùng nhập câu hỏi "Thời tiết ở Đà Nẵng thế nào?", ứng dụng của bạn phải sử dụng Function Calling để:
1. AI tự động trích xuất tham số "Đà Nẵng".
2. Ứng dụng chạy hàm giả lập đã tạo.
3. Gửi kết quả ngược lại cho API để AI tổng hợp thành một câu trả lời tự nhiên (VD: "Hiện tại Đà Nẵng đang khoảng 30 độ C và trời nắng nhé!").
tools định nghĩa cấu trúc hàm get_weather. Gọi client.responses.create() truyền vào input của user và tham số tools.response.output để lấy function call đầu tiên. Trích xuất thuộc tính arguments (dùng json.loads để parse thành Dictionary) để lấy giá trị biến location. Chạy hàm Python get_weather(location) của bạn để lấy dữ liệu dạng chuỗi.{"type": "function_call_output", "call_id": ..., "output": ...} để trả kết quả cho mô hình.client.responses.create() lần thứ hai với previous_response_id=response.id và mảng input chứa function_call_output. Lúc này AI sẽ tổng hợp và trả lời tự nhiên.Hãy áp dụng toàn bộ kiến thức về API, Roles, JSON Schema và Function Calling để xây dựng hoàn thiện một trong các dự án thực tế sau đây:
Yêu cầu: Xây dựng CLI Chatbot có bộ nhớ và tính cách riêng biệt (VD: Chuyên gia tâm lý, Giáo viên Tiếng Anh).
Gợi ý: Tận dụng System prompt, sử dụng mảng messages để lưu lịch sử hội thoại, tùy chỉnh thông số temperature.
Yêu cầu: Viết script đọc văn bản ghi chú/hóa đơn tự do và trích xuất thành Data chuẩn (Tên món, Giá, Số lượng).
Gợi ý: Ứng dụng Pydantic định nghĩa BaseModel, sử dụng hàm .parse() để lấy Structured Outputs dưới dạng JSON Object.
Yêu cầu: Xây dựng Chatbot có khả năng trả lời chính xác thông tin thời tiết thực tế ở bất kì khu vực nào.
Gợi ý: Áp dụng kỹ thuật Function Calling kết hợp gọi API miễn phí từ bên thứ 3 (như OpenWeatherMap API).
Yêu cầu: Đưa nội dung 1 CV vào, yêu cầu AI phân tích ưu/nhược điểm, cho điểm (1-10) và tư vấn vị trí phù hợp.
Gợi ý: Kết hợp Role (System giả lập HR) và JSON Structured Outputs chứa các fields: score, pros, cons, advice.
Bạn có câu hỏi nào về các Project hoặc OpenAI API không?