Tích hợp một mô hình ngôn ngữ vào ứng dụng giờ chỉ còn là một lời gọi API. Bài này dùng SDK Python của Anthropic làm ví dụ, nhưng nguyên tắc áp dụng cho hầu hết nhà cung cấp.
Cài đặt và khóa API
pip install anthropic
# .env (nhớ thêm vào .gitignore)
ANTHROPIC_API_KEY=sk-ant-...
Tuyệt đối không viết khóa thẳng trong code. Khóa lộ lên GitHub có thể bị người khác dùng và bạn là người trả tiền.
Lời gọi đầu tiên
import anthropic
from dotenv import load_dotenv
load_dotenv()
client = anthropic.Anthropic() # tự đọc ANTHROPIC_API_KEY
phan_hoi = client.messages.create(
model="claude-opus-5",
max_tokens=1024,
messages=[
{"role": "user", "content": "Tóm tắt lợi ích của Python trong 3 gạch đầu dòng."}
],
)
for khoi in phan_hoi.content:
if khoi.type == "text":
print(khoi.text)
content là danh sách các khối, nên hãy kiểm tra type trước khi đọc text.
System prompt: đặt vai trò
phan_hoi = client.messages.create(
model="claude-opus-5",
max_tokens=1024,
system="Bạn là trợ lý kỹ thuật. Trả lời ngắn gọn bằng tiếng Việt, luôn kèm ví dụ code.",
messages=[{"role": "user", "content": "Cách đọc file JSON?"}],
)
Hội thoại nhiều lượt
lich_su = []
def hoi(cau_hoi):
lich_su.append({"role": "user", "content": cau_hoi})
ph = client.messages.create(
model="claude-opus-5", max_tokens=1024, messages=lich_su
)
tra_loi = "".join(k.text for k in ph.content if k.type == "text")
lich_su.append({"role": "assistant", "content": tra_loi})
return tra_loi
API không tự nhớ — bạn phải gửi lại toàn bộ lịch sử mỗi lượt. Đó cũng là lý do hội thoại dài tốn nhiều token hơn.
Streaming cho phản hồi dài
with client.messages.stream(
model="claude-opus-5",
max_tokens=4096,
messages=[{"role": "user", "content": "Viết bài giới thiệu về asyncio"}],
) as luong:
for doan in luong.text_stream:
print(doan, end="", flush=True)
Với câu trả lời dài, streaming vừa hiển thị ngay cho người dùng vừa tránh lỗi hết thời gian chờ.
Xử lý lỗi
import anthropic
try:
phan_hoi = client.messages.create(...)
except anthropic.RateLimitError:
print("Vượt giới hạn, thử lại sau")
except anthropic.APIStatusError as e:
print("Lỗi API:", e.status_code)
Kiểm soát chi phí
- Bạn trả tiền theo token vào và token ra — kiểm tra
phan_hoi.usageđể biết mỗi lần gọi tốn bao nhiêu. - Cắt bớt lịch sử hội thoại cũ thay vì gửi mãi.
- Đặt
max_tokensvừa đủ với nhu cầu. - Cache kết quả cho các câu hỏi lặp lại (Redis rất hợp cho việc này).
Cuối cùng, hãy luôn coi đầu ra của mô hình là dữ liệu chưa kiểm chứng: không đưa thẳng vào câu lệnh SQL, không eval(), và kiểm tra lại trước khi hiển thị cho người dùng.
