🎯 Mục tiêu bài học
Bài này hướng dẫn bạn sử dụng APIs của các LLM providers phổ biến nhất: OpenAI, Anthropic, và Google.
Sau bài này, bạn sẽ:
✅ Setup môi trường Python cho GenAI ✅ Sử dụng OpenAI API (GPT-4) ✅ Sử dụng Anthropic API (Claude) ✅ So sánh response quality và cost
🛠️ Setup Môi Trường
1.1 Cài đặt
1# Create virtual environment2python -m venv genai-env3source genai-env/bin/activate # Mac/Linux4genai-env\Scripts\activate # Windows5 6# Install packages7pip install openai anthropic google-generativeai python-dotenv1.2 API Keys
1# .env file (NEVER commit this!)2OPENAI_API_KEY=sk-xxxxxxxxxxxxx3ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxx4GOOGLE_API_KEY=AIzaxxxxxxxxxxxxx1# Load environment variables2import os3from dotenv import load_dotenv45load_dotenv()6openai_key = os.getenv("OPENAI_API_KEY")1.3 API Key Sources
| Provider | Free Tier | Pricing |
|---|---|---|
| OpenAI | $5 credit (new accounts) | GPT-4: ~$0.03/1K input tokens |
| Anthropic | No free tier | Claude 3.5: ~$0.003/1K tokens |
| Gemini free tier | Gemini 1.5: Free up to quota |
Checkpoint
Bạn đã cài đặt môi trường và cấu hình API keys cho các providers chưa?
💻 OpenAI API
2.1 Basic Chat Completion
1from openai import OpenAI23client = OpenAI() # Reads OPENAI_API_KEY from env45response = client.chat.completions.create(6 model="gpt-4-turbo",7 messages=[8 {"role": "system", "content": "Bạn là AI assistant hữu ích."},9 {"role": "user", "content": "Giải thích Machine Learning trong 3 câu."}10 ],11 temperature=0.7,12 max_tokens=50013)1415print(response.choices[0].message.content)16print(f"Tokens used: {response.usage.total_tokens}")2.2 Streaming Response
1stream = client.chat.completions.create(2 model="gpt-4-turbo",3 messages=[{"role": "user", "content": "Viết bài thơ về Hà Nội"}],4 stream=True5)67for chunk in stream:8 content = chunk.choices[0].delta.content9 if content:10 print(content, end="", flush=True)2.3 Multi-turn Conversation
1messages = [2 {"role": "system", "content": "Bạn là Python tutor."}3]45def chat(user_message):6 messages.append({"role": "user", "content": user_message})7 8 response = client.chat.completions.create(9 model="gpt-4-turbo",10 messages=messages,11 temperature=0.712 )13 14 assistant_msg = response.choices[0].message.content15 messages.append({"role": "assistant", "content": assistant_msg})16 return assistant_msg1718# Conversation19print(chat("List là gì trong Python?"))20print(chat("Cho ví dụ với list comprehension"))21print(chat("So sánh list và tuple"))2.4 Parameters Explained
| Parameter | Range | Effect |
|---|---|---|
temperature | 0.0 - 2.0 | Creativity. 0 = deterministic, 1+ = creative |
max_tokens | 1 - 128K | Max output length |
top_p | 0.0 - 1.0 | Nucleus sampling. 0.1 = top 10% tokens |
frequency_penalty | -2.0 - 2.0 | Penalize repeated tokens |
presence_penalty | -2.0 - 2.0 | Encourage new topics |
Checkpoint
Bạn đã thực hành gọi OpenAI API với chat completion và streaming chưa?
💻 Anthropic Claude API
3.1 Basic Usage
1import anthropic23client = anthropic.Anthropic() # Reads ANTHROPIC_API_KEY45message = client.messages.create(6 model="claude-3-5-sonnet-20241022",7 max_tokens=1024,8 system="Bạn là data analyst expert.",9 messages=[10 {"role": "user", "content": "Phân tích xu hướng e-commerce Việt Nam 2026"}11 ]12)1314print(message.content[0].text)15print(f"Input tokens: {message.usage.input_tokens}")16print(f"Output tokens: {message.usage.output_tokens}")3.2 Streaming with Claude
1with client.messages.stream(2 model="claude-3-5-sonnet-20241022",3 max_tokens=1024,4 messages=[{"role": "user", "content": "Viết code Python sort algorithms"}]5) as stream:6 for text in stream.text_stream:7 print(text, end="", flush=True)3.3 Claude đặc biệt ở đâu?
1✅ Long context: 200K tokens (đọc ~500 trang PDF)2✅ Safer responses: Ít hallucination hơn3✅ Better reasoning: Phân tích logic tốt4✅ Document analysis: Tốt nhất cho đọc tài liệuCheckpoint
Bạn đã hiểu những điểm mạnh của Claude và cách sử dụng Anthropic API chưa?
💻 Google Gemini API
4.1 Basic Usage
1import google.generativeai as genai23genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))4model = genai.GenerativeModel("gemini-1.5-pro")56response = model.generate_content("Giải thích Docker trong 5 câu")7print(response.text)4.2 Multi-modal (Text + Image)
1import PIL.Image23model = genai.GenerativeModel("gemini-1.5-pro")4image = PIL.Image.open("chart.png")56response = model.generate_content([7 "Phân tích biểu đồ này và nêu 3 insights chính:",8 image9])10print(response.text)Checkpoint
Bạn đã thử gọi Google Gemini API với text và multimodal input chưa?
📊 So Sánh Providers
5.1 Quick Comparison
| Criteria | GPT-4 | Claude 3.5 | Gemini 1.5 |
|---|---|---|---|
| Code Generation | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| Reasoning | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| Vietnamese | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| Long Context | 128K | 200K | 2M |
| Multimodal | Text+Image | Text+Image | Text+Image+Video |
| Speed | Fast | Fast | Fast |
| Cost | $$$ | $$ | $ (free tier) |
5.2 Chọn model nào?
1🎯 Code & general: GPT-4 hoặc Claude 3.52📚 Document analysis: Claude 3.5 (200K context)3🎬 Multimodal (video): Gemini 1.54💰 Budget: Gemini free tier → GPT-3.5 → Claude Haiku5🔒 Privacy: Self-host Llama 3Checkpoint
Bạn có thể chọn model phù hợp cho từng use case cụ thể không?
🛠️ Error Handling
6.1 Common Errors
1from openai import OpenAI, RateLimitError, APIError23client = OpenAI()45def safe_call(prompt, retries=3):6 for attempt in range(retries):7 try:8 response = client.chat.completions.create(9 model="gpt-4-turbo",10 messages=[{"role": "user", "content": prompt}],11 timeout=3012 )13 return response.choices[0].message.content14 15 except RateLimitError:16 print(f"Rate limited. Waiting {2**attempt}s...")17 import time18 time.sleep(2 ** attempt)19 20 except APIError as e:21 print(f"API error: {e}")22 if attempt == retries - 1:23 raise24 25 return None6.2 Token Counting
1import tiktoken23def count_tokens(text, model="gpt-4"):4 enc = tiktoken.encoding_for_model(model)5 return len(enc.encode(text))67# Example8prompt = "Hãy phân tích dữ liệu sales Q4 2026..."9tokens = count_tokens(prompt)10cost = tokens * 0.03 / 100011print(f"Tokens: {tokens}, Est cost: ${cost:.4f}")Checkpoint
Bạn đã hiểu cách xử lý rate limit errors và đếm tokens chưa?
💻 Hands-on Lab
Lab 1: Multi-Provider Comparison
1# Gửi cùng prompt cho cả 3 providers, so sánh:2prompt = "Viết hàm Python tìm số Fibonacci thứ n. Giải thích time complexity."34# 1. Call OpenAI5# 2. Call Anthropic6# 3. Call Gemini7# 4. Compare: quality, speed, tokens usedLab 2: Build API Wrapper
1class LLMClient:2 def __init__(self, provider="openai"):3 self.provider = provider4 # Initialize correct client5 6 def chat(self, prompt, system=None, **kwargs):7 # Route to correct API8 # Return standardized response9 pass10 11 def stream(self, prompt, system=None, **kwargs):12 # Streaming for all providers13 pass1415# Usage16llm = LLMClient("anthropic")17response = llm.chat("Hello!")Lab 3: Token Budget Manager
Viết class quản lý token budget:
- Set monthly budget ($10)
- Track usage per call
- Alert when 80% budget used
- Block calls when 100% budget
Checkpoint
Bạn đã thực hành xây dựng API Wrapper và Token Budget Manager chưa?
🎯 Tổng kết
📝 Quiz
-
API key nên lưu ở đâu?
- Hardcode trong code
- Commit lên GitHub
- File .env (gitignored)
- Comment trong code
-
Temperature = 0 phù hợp cho task nào?
- Code generation, math
- Creative writing
- Brainstorming
- Poetry
-
Claude 3.5 Sonnet có ưu điểm gì?
- Rẻ nhất
- Long context (200K tokens)
- Nhanh nhất
- Free
-
Rate limit error nên xử lý thế nào?
- Ignore
- Exponential backoff retry
- Gửi lại ngay lập tức
- Đổi API key
Những điểm quan trọng
- OpenAI, Anthropic, Google — 3 providers chính, mỗi cái có strengths riêng
- API keys — NEVER commit, luôn dùng .env
- Streaming — Better UX cho chatbot interfaces
- Error handling — Retry với exponential backoff
- Token counting — Kiểm soát cost
Câu hỏi tự kiểm tra
- Tại sao API key phải được lưu trong file .env và không bao giờ commit lên GitHub?
- So sánh ưu nhược điểm giữa OpenAI, Anthropic Claude và Google Gemini API?
- Streaming response cải thiện trải nghiệm người dùng như thế nào trong chatbot?
- Exponential backoff retry là gì và tại sao nó quan trọng khi xử lý rate limit errors?
🎉 Tuyệt vời! Bạn đã hoàn thành bài học Working with LLM APIs!
Tiếp theo: Chúng ta sẽ học cách iterate, test và optimize prompts cho production!
🚀 Bài tiếp theo
Prompt Optimization & Testing — Cách iterate, test, và optimize prompts cho production!
