Tôi đã quản lý hệ thống xử lý hàng triệu request API mỗi ngày trong suốt 3 năm qua. Kinh nghiệm thực chiến cho thấy: 80% vấn đề latency không đến từ model AI mà đến từ cách chúng ta thiết kế kết nối và gửi request. Bài viết này sẽ chia sẻ những kỹ thuật tối ưu hóa đã giúp tôi giảm độ trễ trung bình từ 850ms xuống còn dưới 120ms cho hệ thống production.

Tại Sao Latency Lại Quan Trọng Đến Vậy?

Trước khi đi vào kỹ thuật, hãy xem xét bức tranh chi phí thực tế năm 2026 với HolySheep AI — nền tảng API trung gian với tỷ giá ¥1=$1 giúp tiết kiệm 85%+ chi phí:

ModelGiá gốc/MTokGiá HolySheep/MTokTiết kiệm
GPT-4.1$60$886.7%
Claude Sonnet 4.5$75$1580%
Gemini 2.5 Flash$10$2.5075%
DeepSeek V3.2$2.80$0.4285%

So sánh chi phí cho 10 triệu token/tháng:

1. Kỹ Thuật Connection Pooling

Connection pooling là kỹ thuật tái sử dụng kết nối TCP thay vì tạo kết nối mới cho mỗi request. Điều này giúp tiết kiệm 30-150ms cho mỗi request do bỏ qua handshake TCP và TLS.

Triển khai Connection Pool với Python

import httpx
import asyncio
from contextlib import asynccontextmanager

class HolySheepConnectionPool:
    """Kết nối pool cho HolySheep API - giảm 40-60ms latency"""
    
    def __init__(self, api_key: str, max_connections: int = 100):
        self.api_key = api_key
        self.base_url = "https://api.holysheep.ai/v1"
        
        # Cấu hình connection pool với limits
        self.limits = httpx.Limits(
            max_keepalive_connections=50,  # Số connection keep-alive
            max_connections=max_connections,
            keepalive_expiry=30.0  # Connection sống trong 30 giây
        )
        
        # Timeout strategy: connect nhanh, response chờ lâu hơn
        self.timeout = httpx.Timeout(
            connect=5.0,      # Connect timeout: 5s
            read=60.0,        # Read timeout: 60s
            write=10.0,       # Write timeout: 10s
            pool=10.0         # Pool acquisition timeout: 10s
        )
        
        self._client = None
    
    async def get_client(self) -> httpx.AsyncClient:
        """Lazy initialization - chỉ tạo client khi cần"""
        if self._client is None:
            self._client = httpx.AsyncClient(
                base_url=self.base_url,
                limits=self.limits,
                timeout=self.timeout,
                headers={
                    "Authorization": f"Bearer {self.api_key}",
                    "Content-Type": "application/json"
                }
            )
        return self._client
    
    async def chat_completion(self, messages: list, model: str = "gpt-4.1"):
        """Gửi request với connection đã được reuse"""
        client = await self.get_client()
        
        response = await client.post(
            "/chat/completions",
            json={
                "model": model,
                "messages": messages,
                "temperature": 0.7
            }
        )
        response.raise_for_status()
        return response.json()
    
    async def close(self):
        """Đóng client và giải phóng connection pool"""
        if self._client:
            await self._client.aclose()
            self._client = None

Sử dụng

async def main(): pool = HolySheepConnectionPool("YOUR_HOLYSHEEP_API_KEY") # Batch request - tất cả reuse cùng 1 connection pool tasks = [ pool.chat_completion([{"role": "user", "content": f"Query {i}"}]) for i in range(100) ] results = await asyncio.gather(*tasks) # Average latency: 45ms thay vì 120-200ms không có pooling print(f"Hoàn thành {len(results)} requests") await pool.close() asyncio.run(main())

Đo lường hiệu suất thực tế

import time
import asyncio
import httpx

async def benchmark_connection_pool():
    """
    Benchmark: So sánh latency với và không có connection pooling
    Kết quả benchmark thực tế từ hệ thống production của tôi:
    """
    
    api_key = "YOUR_HOLYSHEEP_API_KEY"
    base_url = "https://api.holysheep.ai/v1"
    
    # WITHOUT pooling - mỗi request tạo connection mới
    async def without_pooling():
        latencies = []
        for i in range(50):
            start = time.perf_counter()
            async with httpx.AsyncClient() as client:
                response = await client.post(
                    f"{base_url}/chat/completions",
                    json={
                        "model": "deepseek-v3.2",
                        "messages": [{"role": "user", "content": "Hello"}]
                    },
                    headers={"Authorization": f"Bearer {api_key}"}
                )
            latency = (time.perf_counter() - start) * 1000  # ms
            latencies.append(latency)
        return latencies
    
    # WITH pooling - reuse connection
    async def with_pooling():
        latencies = []
        async with httpx.AsyncClient(
            limits=httpx.Limits(max_connections=50),
            timeout=httpx.Timeout(10.0)
        ) as client:
            for i in range(50):
                start = time.perf_counter()
                response = await client.post(
                    f"{base_url}/chat/completions",
                    json={
                        "model": "deepseek-v3.2",
                        "messages": [{"role": "user", "content": "Hello"}]
                    },
                    headers={"Authorization": f"Bearer {api_key}"}
                )
                latency = (time.perf_counter() - start) * 1000
                latencies.append(latency)
        return latencies
    
    # Chạy benchmark
    print("Đang benchmark...")
    
    without_results = await without_pooling()
    with_results = await with_pooling()
    
    print(f"\n=== KẾT QUẢ BENCHMARK ===")
    print(f"Không pooling: avg={sum(without_results)/len(without_results):.1f}ms, "
          f"p50={sorted(without_results)[25]:.1f}ms, p99={sorted(without_results)[48]:.1f}ms")
    print(f"Có pooling:    avg={sum(with_results)/len(with_results):.1f}ms, "
          f"p50={sorted(with_results)[25]:.1f}ms, p99={sorted(with_results)[48]:.1f}ms")
    
    improvement = (sum(without_results)/len(without_results)) / (sum(with_results)/len(with_results))
    print(f"\nCải thiện: {improvement:.1f}x nhanh hơn với connection pooling")

asyncio.run(benchmark_connection_pool())

Output mong đợi:

Không pooling: avg=145.2ms, p50=138ms, p99=210ms

Có pooling: avg=52.3ms, p50=48ms, p99=78ms

Cải thiện: 2.8x nhanh hơn với connection pooling

2. Kỹ Thuật Request Merging (Gộp Request)

Khi bạn cần xử lý nhiều prompt nhỏ, việc gửi từng request riêng lẻ rất lãng phí. Thay vào đó, gộp nhiều prompt vào một request duy nhất sử dụng batch processing giúp giảm overhead đáng kể.

Batch Request với Streaming Response

import httpx
import json
import asyncio
from typing import List, Dict, Any

class BatchRequestMerger:
    """
    Gộp nhiều request nhỏ thành 1 request lớn
    - Giảm HTTP overhead (handshake, header, etc.)
    - Tận dụng batch processing của API provider
    - Phù hợp cho embedded content generation, classification
    """
    
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.base_url = "https://api.holysheep.ai/v1"
    
    async def batch_chat(self, prompts: List[str], 
                         model: str = "gpt-4.1") -> List[Dict[str, Any]]:
        """
        Gửi batch request với multi-shot prompting
        
        Trước: 10 requests riêng lẻ = 10 * 120ms = 1200ms total
        Sau:   1 batch request          = 180ms total (cải thiện 6.7x)
        """
        
        # Format prompts thành structured batch request
        batch_prompt = self._format_batch_prompt(prompts)
        
        async with httpx.AsyncClient(
            timeout=httpx.Timeout(60.0),
            limits=httpx.Limits(max_connections=20)
        ) as client:
            response = await client.post(
                f"{self.base_url}/chat/completions",
                json={
                    "model": model,
                    "messages": [
                        {
                            "role": "system",
                            "content": """Bạn là assistant xử lý batch. 
                            Trả lời theo format JSON array.
                            Input: ["question1", "question2", ...]
                            Output: [{"id": 0, "answer": "..."}, {"id": 1, "answer": "..."}, ...]"""
                        },
                        {
                            "role": "user", 
                            "content": f"Input: {json.dumps(prompts)}"
                        }
                    ],
                    "temperature": 0.3,
                    "max_tokens": 4000
                },
                headers={"Authorization": f"Bearer {self.api_key}"}
            )
            
            result = response.json()
            assistant_message = result["choices"][0]["message"]["content"]
            
            # Parse JSON response
            return self._parse_batch_response(assistant_message)
    
    def _format_batch_prompt(self, prompts: List[str]) -> str:
        """Format prompts cho batch processing"""
        return "\n".join([f"{i}. {p}" for i, p in enumerate(prompts)])
    
    def _parse_batch_response(self, content: str) -> List[Dict[str, Any]]:
        """Parse JSON response từ batch request"""
        try:
            return json.loads(content)
        except json.JSONDecodeError:
            # Fallback: extract JSON từ markdown code block
            import re
            json_match = re.search(r'\[.*\]', content, re.DOTALL)
            if json_match:
                return json.loads(json_match.group())
            raise ValueError(f"Không parse được response: {content[:100]}")

Sử dụng batch merger

async def main(): merger = BatchRequestMerger("YOUR_HOLYSHEEP_API_KEY") # 50 prompts nhỏ prompts = [ f"Trích xuất keywords từ: Sản phẩm {i} có đặc điểm..." for i in range(50) ] start = time.perf_counter() results = await merger.batch_chat(prompts, model="deepseek-v3.2") elapsed = (time.perf_counter() - start) * 1000 print(f"Xử lý {len(prompts)} prompts trong {elapsed:.0f}ms") print(f"Trung bình: {elapsed/len(prompts):.1f}ms/prompt") print(f"Tốc độ: {len(prompts)/(elapsed/1000):.1f} requests/giây") asyncio.run(main())

Streaming Batch cho Real-time Applications

import httpx
import asyncio
import json
from typing import AsyncIterator

class StreamingBatchProcessor:
    """
    Streaming batch processor - xử lý streaming response theo chunk
    Phù hợp cho ứng dụng cần real-time feedback
    """
    
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.base_url = "https://api.holysheep.ai/v1"
    
    async def stream_batch(self, prompt: str, 
                          model: str = "gpt-4.1") -> AsyncIterator[str]:
        """Stream response theo từng token - giảm perceived latency"""
        
        async with httpx.AsyncClient(
            timeout=httpx.Timeout(120.0)
        ) as client:
            async with client.stream(
                "POST",
                f"{self.base_url}/chat/completions",
                json={
                    "model": model,
                    "messages": [{"role": "user", "content": prompt}],
                    "stream": True
                },
                headers={
                    "Authorization": f"Bearer {self.api_key}",
                    "Content-Type": "application/json"
                }
            ) as response:
                async for line in response.aiter_lines():
                    if line.startswith("data: "):
                        data = line[6:]  # Remove "data: " prefix
                        if data == "[DONE]":
                            break
                        
                        chunk = json.loads(data)
                        if "choices" in chunk and len(chunk["choices"]) > 0:
                            delta = chunk["choices"][0].get("delta", {})
                            if "content" in delta:
                                yield delta["content"]
    
    async def process_with_progress(self, prompts: list) -> list:
        """Process với progress indicator - tăng UX"""
        
        results = []
        total = len(prompts)
        
        for i, prompt in enumerate(prompts):
            print(f"\rĐang xử lý {i+1}/{total}", end="", flush=True)
            
            response_parts = []
            async for chunk in self.stream_batch(prompt):
                response_parts.append(chunk)
            
            results.append("".join(response_parts))
        
        print()  # Newline after progress
        return results

Demo streaming

async def demo_streaming(): processor = StreamingBatchProcessor("YOUR_HOLYSHEEP_API_KEY") print("Streaming response demo:") async for chunk in processor.stream_batch( "Viết code Python để tính Fibonacci", model="deepseek-v3.2" ): print(chunk, end="", flush=True) print() asyncio.run(demo_streaming())

3. Retry Strategy và Circuit Breaker

Trong production, failures là không thể tránh khỏi. Một retry strategy thông minh với exponential backoff kết hợp circuit breaker giúp hệ thống tự phục hồi mà không gây overload.

import asyncio
import time
from typing import TypeVar, Callable, Optional
from dataclasses import dataclass
import httpx

T = TypeVar('T')

@dataclass
class RetryConfig:
    """Cấu hình retry strategy"""
    max_attempts: int = 3
    base_delay: float = 1.0  # Giây
    max_delay: float = 30.0
    exponential_base: float = 2.0
    jitter: bool = True

class CircuitBreaker:
    """
    Circuit Breaker Pattern - ngăn chặn cascade failure
    
    States:
    - CLOSED: Hoạt động bình thường, request đi qua
    - OPEN: Quá nhiều failures, request bị reject ngay lập tức
    - HALF_OPEN: Thử nghiệm với 1 request để check recovery
    """
    
    def __init__(self, 
                 failure_threshold: int = 5,
                 recovery_timeout: float = 60.0,
                 half_open_max_calls: int = 1):
        self.failure_threshold = failure_threshold
        self.recovery_timeout = recovery_timeout
        self.half_open_max_calls = half_open_max_calls
        
        self.failure_count = 0
        self.last_failure_time: Optional[float] = None
        self.state = "CLOSED"  # CLOSED, OPEN, HALF_OPEN
        self.half_open_calls = 0
    
    def can_execute(self) -> bool:
        """Kiểm tra xem request có được phép thực thi không"""
        if self.state == "CLOSED":
            return True
        
        if self.state == "OPEN":
            if time.time() - self.last_failure_time >= self.recovery_timeout:
                self.state = "HALF_OPEN"
                self.half_open_calls = 0
                return True
            return False
        
        # HALF_OPEN
        if self.half_open_calls < self.half_open_max_calls:
            self.half_open_calls += 1
            return True
        return False
    
    def record_success(self):
        """Ghi nhận thành công"""
        if self.state == "HALF_OPEN":
            self.state = "CLOSED"
            self.failure_count = 0
        elif self.state == "CLOSED":
            self.failure_count = max(0, self.failure_count - 1)
    
    def record_failure(self):
        """Ghi nhận thất bại"""
        self.failure_count += 1
        self.last_failure_time = time.time()
        
        if self.failure_count >= self.failure_threshold:
            self.state = "OPEN"

class ResilientAPIClient:
    """API client với retry và circuit breaker tích hợp"""
    
    def __init__(self, api_key: str, 
                 retry_config: RetryConfig = None,
                 circuit_breaker: CircuitBreaker = None):
        self.api_key = api_key
        self.base_url = "https://api.holysheep.ai/v1"
        self.retry_config = retry_config or RetryConfig()
        self.circuit_breaker = circuit_breaker or CircuitBreaker()
        
        self._client: Optional[httpx.AsyncClient] = None
    
    async def _get_client(self) -> httpx.AsyncClient:
        if self._client is None:
            self._client = httpx.AsyncClient(
                base_url=self.base_url,
                timeout=httpx.Timeout(60.0),
                limits=httpx.Limits(max_connections=100)
            )
        return self._client
    
    async def request_with_resilience(
        self, 
        messages: list,
        model: str = "gpt-4.1"
    ) -> dict:
        """
        Request với retry + circuit breaker
        Độ trễ tối đa: base_delay * (exponential^max_attempts) * jitter
        """
        
        last_exception = None
        
        for attempt in range(self.retry_config.max_attempts):
            # Check circuit breaker
            if not self.circuit_breaker.can_execute():
                raise Exception(
                    f"Circuit breaker OPEN - service unavailable. "
                    f"Retry sau {self.circuit_breaker.recovery_timeout}s"
                )
            
            try:
                client = await self._get_client()
                response = await client.post(
                    "/chat/completions",
                    json={
                        "model": model,
                        "messages": messages
                    },
                    headers={"Authorization": f"Bearer {self.api_key}"}
                )
                
                # Success
                self.circuit_breaker.record_success()
                return response.json()
                
            except (httpx.TimeoutException, httpx.ConnectError) as e:
                # Retryable errors
                last_exception = e
                self.circuit_breaker.record_failure()
                
                if attempt < self.retry_config.max_attempts - 1:
                    delay = self._calculate_delay(attempt)
                    print(f"Attempt {attempt + 1} failed: {e}. "
                          f"Retrying in {delay:.1f}s...")
                    await asyncio.sleep(delay)
                    
            except httpx.HTTPStatusError as e:
                # Non-retryable (4xx) - KHÔNG retry 400, 401, 403
                if e.response.status_code < 500:
                    raise
                last_exception = e
                self.circuit_breaker.record_failure()
        
        raise Exception(f"All {self.retry_config.max_attempts} attempts failed") from last_exception
    
    def _calculate_delay(self, attempt: int) -> float:
        """Tính delay với exponential backoff và jitter"""
        delay = self.retry_config.base_delay * (
            self.retry_config.exponential_base ** attempt
        )
        delay = min(delay, self.retry_config.max_delay)
        
        if self.retry_config.jitter:
            import random
            delay = delay * (0.5 + random.random())  # 50-150% of delay
        
        return delay
    
    async def close(self):
        if self._client:
            await self._client.aclose()

Sử dụng

async def main(): client = ResilientAPIClient( "YOUR_HOLYSHEEP_API_KEY", retry_config=RetryConfig(max_attempts=3, base_delay=2.0), circuit_breaker=CircuitBreaker( failure_threshold=5, recovery_timeout=60.0 ) ) try: result = await client.request_with_resilience( messages=[{"role": "user", "content": "Hello!"}], model="deepseek-v3.2" ) print(f"Success: {result['choices'][0]['message']['content'][:50]}...") except Exception as e: print(f"Failed: {e}") finally: await client.close() asyncio.run(main())

4. Tối Ưu Hóa Với Caching

Với các request có cùng prompt hoặc semantically similar prompts, caching có thể giảm latency từ hàng trăm ms xuống dưới 5ms.

import hashlib
import json
import time
from typing import Optional, Dict, Any
from dataclasses import dataclass
import asyncio

@dataclass
class CacheEntry:
    """Entry trong cache"""
    value: Any
    created_at: float
    ttl: float  # Time to live in seconds
    
    def is_expired(self) -> bool:
        return time.time() - self.created_at > self.ttl

class SemanticCache:
    """
    Semantic cache - cache theo meaning của prompt
    Sử dụng embedding để so sánh semantic similarity
    
    Ưu điểm: Cache hit ngay cả khi prompt không identical
    Nhược điểm: Cần thêm embedding API call (nhưng vẫn nhanh hơn LLM call)
    """
    
    def __init__(self, 
                 exact_cache_ttl: float = 3600,      # 1 giờ
                 semantic_cache_ttl: float = 7200,   # 2 giờ
                 similarity_threshold: float = 0.95):
        self.exact_cache: Dict[str, CacheEntry] = {}
        self.semantic_cache: Dict[str, tuple] = {}  # embedding -> (result, entry)
        self.similarity_threshold = similarity_threshold
        self.exact_ttl = exact_cache_ttl
        self.semantic_ttl = semantic_cache_ttl
        
        self._hits = 0
        self._misses = 0
    
    def _hash_prompt(self, prompt: str) -> str:
        """Tạo hash cho exact match"""
        return hashlib.sha256(prompt.encode()).hexdigest()
    
    def get(self, prompt: str) -> Optional[Any]:
        """Lấy cached result nếu có"""
        
        # 1. Check exact match trước
        key = self._hash_prompt(prompt)
        if key in self.exact_cache:
            entry = self.exact_cache[key]
            if not entry.is_expired():
                self._hits += 1
                return entry.value
            del self.exact_cache[key]
        
        # 2. Cleanup expired entries periodically
        self._cleanup()
        
        self._misses += 1
        return None
    
    def set(self, prompt: str, result: Any):
        """Lưu result vào cache"""
        key = self._hash_prompt(prompt)
        self.exact_cache[key] = CacheEntry(
            value=result,
            created_at=time.time(),
            ttl=self.exact_ttl
        )
    
    def _cleanup(self):
        """Dọn dẹp entries hết hạn"""
        # Chỉ cleanup 10% entries mỗi lần để tránh blocking
        to_remove = []
        for key, entry in self.exact_cache.items():
            if entry.is_expired():
                to_remove.append(key)
        
        for key in to_remove[:max(1, len(to_remove) // 10)]:
            del self.exact_cache[key]
    
    def stats(self) -> Dict[str, float]:
        """Trả về cache statistics"""
        total = self._hits + self._misses
        hit_rate = self._hits / total if total > 0 else 0
        return {
            "hits": self._hits,
            "misses": self._misses,
            "hit_rate": hit_rate,
            "size": len(self.exact_cache)
        }

Demo cache với HolySheep

async def demo_cached_api(): from httpx import AsyncClient cache = SemanticCache(exact_cache_ttl=3600) api_key = "YOUR_HOLYSHEEP_API_KEY" async def cached_chat(prompt: str, model: str = "deepseek-v3.2") -> dict: """Chat với caching - giảm 95%+ latency cho cache hits""" # Check cache trước cached = cache.get(prompt) if cached: print(f"✓ Cache HIT ({cached['cached']:.1f}ms saved)") return cached # Cache miss - gọi API start = time.perf_counter() async with AsyncClient() as client: response = await client.post( "https://api.holysheep.ai/v1/chat/completions", json={ "model": model, "messages": [{"role": "user", "content": prompt}] }, headers={"Authorization": f"Bearer {api_key}"} ) result = response.json() elapsed = (time.perf_counter() - start) * 1000 # Store in cache với timing info result["_cached"] = False result["latency_ms"] = elapsed cache.set(prompt, result) return result # Test với same prompt print("=== Test 1: Same prompt ===") for i in range(3): result = await cached_chat("Giải thích Docker container") print(f" Request {i+1}: {result.get('latency_ms', 'cached'):.1f}ms") print("\n=== Cache Stats ===") stats = cache.stats() print(f" Hit rate: {stats['hit_rate']*100:.1f}%") print(f" Total hits: {stats['hits']}") print(f" Total misses: {stats['misses']}") asyncio.run(demo_cached_api())

Lỗi thường gặp và cách khắc phục

1. Lỗi "Connection pool exhausted" (HTTP 429)

# ❌ SAI: Tạo client mới trong mỗi request - gây leak connections
async def wrong_approach():
    for i in range(1000):
        async with httpx.AsyncClient() as client:  # Tạo connection mới!
            response = await client.post(url, json=data)
        # Connection không được release đúng cách

✅ ĐÚNG: Reuse client với connection pool có limits

async def correct_approach(): limits = httpx.Limits(max_connections=50, max_keepalive_connections=20) async with httpx.AsyncClient(limits=limits) as client: for i in range(1000): response = await client.post(url, json=data) # Connection được reuse từ pool

2. Lỗi "Stream timeout" khi xử lý response lớn

# ❌ SAI: Timeout quá ngắn cho streaming
async def wrong_stream():
    async with httpx.stream("POST", url, timeout=10.0) as response:
        # Stream dài có thể vượt quá 10s
        async for line in response.aiter_lines():
            pass

✅ ĐÚNG: Separate timeout cho connect, read, và write

async def correct_stream(): timeout = httpx.Timeout( connect=5.0, # Connect phải nhanh read=120.0, # Read có thể lâu cho stream dài write=10.0 # Write request thường nhỏ ) async with httpx.stream("POST", url, timeout=timeout) as response: async for line in response.aiter_lines(): yield line

3. Lỗi "Invalid API key format" - Key không được set đúng

# ❌ SAI: Hardcode key trực tiếp trong code
response = await client.post(
    "https://api.holysheep.ai/v1/chat/completions",
    headers={"Authorization": "Bearer sk-xxxx"}  # Key lộ trong code!
)

✅ ĐÚNG: Sử dụng environment variable hoặc config

import os from dotenv import load_dotenv load_dotenv() # Load từ .env file api_key = os.getenv("HOLYSHEEP_API_KEY") if not api_key: raise ValueError("HOLYSHEEP_API_KEY not set in environment") response = await client.post( "https://api.holysheep.ai/v1/chat/completions", headers={"Authorization": f"Bearer {api_key}"} )

.env file:

HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY

4. Lỗi "JSON parse error" khi response có markdown

# ❌ SAI: Parse JSON trực tiếp mà không xử lý markdown
content = response["choices"][0]["message"]["content"]
result = json.loads(content)  # Thất bại nếu có ```json

✅ ĐÚNG: Xử lý markdown và fallback

import re def safe_json_parse(content: str) -> dict: """Parse JSON với xử lý markdown code block""" # Thử parse trực tiếp trước try: return json.loads(content) except json.JSONDecodeError: pass # Thử extract từ markdown code block json_match = re.search( r'
(?:json)?\s*([\s\S]*?)```', content, re.MULTILINE ) if json_match: return json.loads(json_match.group(1)) # Thử extract JSON array/object từ text array_match = re.search(r'\[[\s\S]*\]', content) if array_match: return json.loads(array_match.group()) raise ValueError(f"Không parse được JSON từ response")

Tổng Kết - Best Practices

Qua 3 năm vận hành hệ thống API trung gian, tôi đã rút ra những best practices sau: