Hướng dẫn sử dụng LiteLLM trong Python: Chuẩn hóa hơn 100 mô hình AI qua một Interface duy nhất

Python tutorial - IT technology blog
Python tutorial - IT technology blog

So sánh 3 cách tích hợp nhiều LLM vào dự án Python

Nếu từng gọi cùng lúc OpenAI, Claude và Gemini trong một project, chắc hẳn bạn đã nếm trải sự phiền toái khi mỗi bên đòi một kiểu payload. OpenAI nhận messages dạng danh sách dict. Anthropic tách riêng tham số system. Google Gemini lại bắt bọc dữ liệu trong contents và parts.

Đứng trước bài toán multi-model, các team kỹ thuật thường chọn một trong ba hướng đi sau:

  • Approach 1: Dùng trực tiếp SDK chính hãng (openai, anthropic, google-genai). Tự viết wrapper để map input và output qua lại giữa các nhà cung cấp.
  • Approach 2: Dùng Framework cấp cao như LangChain hoặc LlamaIndex. Tận dụng abstraction layer sẵn có để đổi provider bằng cách thay class loader.
  • Approach 3: Dùng LiteLLM (Python Library / Proxy). Giữ nguyên 100% format chuẩn của OpenAI Chat Completion, chỉ việc đổi tên model (ví dụ claude-3-5-sonnet-20240620 hoặc gemini/gemini-1.5-flash).

Mổ xẻ ưu và nhược điểm từng giải pháp

1. Tự viết Wrapper cho SDK chính hãng

Cách này giúp team kiểm soát tường tận từng byte gửi đi và nhận về. Hệ thống không bị phụ thuộc vào bên thứ ba. Bù lại, chi phí bảo trì rất tốn kém.

Cứ mỗi đợt provider ra mắt model mới hoặc đổi schema trả về token usage, code wrapper của bạn lại có nguy cơ vỡ vụn. Việc chuẩn hóa cơ chế streaming và async giữa 3 SDK khác nhau cũng rất dễ sinh bug ngầm.

2. LangChain hoặc LlamaIndex

Hai framework này cực kỳ phù hợp khi bạn xây dựng agent phức tạp, pipeline RAG nhiều bước hay đồ thị luồng xử lý (Graph). Tuy nhiên, nếu bạn chỉ cần gọi API đơn thuần, LangChain lại trở nên quá cồng kềnh.

Hãy thử tưởng tượng hệ thống đang nghẽn và gặp lỗi rate limit 429. Lúc đó, việc trace call stack qua hàng chục lớp wrap dày đặc của LangChain sẽ khiến việc debug tốn hàng giờ đồng hồ.

3. Thư viện LiteLLM

LiteLLM giải quyết đúng một việc cốt lõi: dịch cú pháp của các nhà cung cấp khác (Anthropic, Gemini, Mistral, Cohere, Bedrock, Ollama) về chuẩn completion() của OpenAI. Dữ liệu trả về luôn là response object chuẩn với choices[0].message.content và usage.total_tokens quen thuộc.

Bạn chỉ cần lưu ý nhớ tiền tố vendor (chẳng hạn gemini/ hay bedrock/). Thư viện này release tính năng mới liên tục mỗi tuần, vì vậy bạn nên ghim chặt version cụ thể trong requirements.txt để tránh xung đột.

Khi nào dự án nên chuyển sang LiteLLM?

Giả sử backend của bạn đang chạy ổn định với OpenAI SDK. Bất ngờ, sếp yêu cầu: ‘Thêm cơ chế tự nhảy sang Claude khi OpenAI nghẽn’ hoặc ‘Chuyển bớt tác vụ phân loại sang Gemini 1.5 Flash để cắt giảm 70% tiền API’. Đây chính là lúc LiteLLM phát huy sức mạnh lớn nhất.

Thay vì viết lại prompt parser hay logic parse JSON, bạn chỉ cần thay đổi 1 dòng import và giữ nguyên toàn bộ pipeline xử lý dữ liệu.

Hướng dẫn triển khai LiteLLM chi tiết từ A-Z

Bước 1: Cài đặt thư viện và thiết lập môi trường

Cài đặt gói core LiteLLM cùng python-dotenv qua pip:

pip install litellm python-dotenv

Tạo file .env trong thư mục gốc để lưu các API key:

OPENAI_API_KEY="sk-..."
ANTHROPIC_API_KEY="sk-ant-..."
GEMINI_API_KEY="AIza..."

Bước 2: Gọi đa mô hình qua một hàm duy nhất

Đoạn code dưới đây minh họa cách gọi lần lượt GPT-4o, Claude 3.5 Sonnet và Gemini 1.5 Flash mà không cần thay đổi bất kỳ dòng logic parse kết quả nào:

import os
from dotenv import load_dotenv
from litellm import completion

load_dotenv()

messages = [
    {"role": "system", "content": "Bạn là trợ lý kỹ thuật IT súc tích."},
    {"role": "user", "content": "Giải thích ngắn gọn Docker container là gì trong 2 câu."}
]

# 1. Gọi GPT-4o
res_openai = completion(
    model="gpt-4o",
    messages=messages
)
print("OpenAI:", res_openai.choices[0].message.content)

# 2. Gọi Claude 3.5 Sonnet (LiteLLM tự dịch sang format Anthropic)
res_claude = completion(
    model="claude-3-5-sonnet-20240620",
    messages=messages
)
print("Claude:", res_claude.choices[0].message.content)

# 3. Gọi Google Gemini (Thêm prefix gemini/)
res_gemini = completion(
    model="gemini/gemini-1.5-flash",
    messages=messages
)
print("Gemini:", res_gemini.choices[0].message.content)

Bước 3: Tự động Fallback khi một provider gặp sự cố

Một tính năng cực kỳ hữu ích trên production là tham số fallbacks. Khi model chính chạm hạn mức rate limit (429) hoặc server vendor quá tải (500/503), LiteLLM sẽ tự động chuyển request sang model dự phòng ngay lập tức:

from litellm import completion

try:
    response = completion(
        model="gpt-4o",
        messages=[{"role": "user", "content": "Trích xuất dữ liệu JSON từ text sau..."}],
        fallbacks=["claude-3-5-sonnet-20240620", "gemini/gemini-1.5-flash"],
        timeout=10 # Nếu quá 10s không phản hồi, tự nhảy sang fallback tiếp theo
    )
    print(response.choices[0].message.content)
except Exception as e:
    print(f"Tất cả model trong danh sách dự phòng đều lỗi: {e}")

Bước 4: Streaming dữ liệu theo thời gian thực

Khi build giao diện chat, streaming là yêu cầu bắt buộc để tối ưu chỉ số time-to-first-token (TTFT). Với LiteLLM, cách đọc chunk streaming giống hệt OpenAI client:

response = completion(
    model="claude-3-5-sonnet-20240620",
    messages=[{"role": "user", "content": "Viết script bash backup database MySQL."}] ,
    stream=True
)

for chunk in response:
    content = chunk.choices[0].delta.content or ""
    print(content, end="", flush=True)

Mẹo xử lý khi parse dữ liệu có cấu trúc từ LLM

Nhiều model thường kèm theo câu chào đầu hoặc dấu markdown “`json bọc ngoài dữ liệu. Lập trình viên thường dùng Regex để trích xuất phần JSON mong muốn.

Nếu bạn muốn kiểm tra nhanh biểu thức chính quy mà không muốn mất công chạy lại code, công cụ regex tester tại toolcraft.app/vi/tools/developer/regex-tester cho phép bạn test pattern và highlight kết quả trực tiếp ngay trên trình duyệt.

Sau khi pattern chạy đúng, bạn đưa vào hàm parse trong Python để lấy dữ liệu an toàn mà không lo lỗi cú pháp.

Theo dõi chi phí token theo thời gian thực (Cost Tracking)

Thay vì đợi đến cuối tháng để đăng nhập từng dashboard của OpenAI, Anthropic Console và Google Cloud Console xem hóa đơn, LiteLLM cho phép bạn tính tiền ngay trên từng request:

from litellm import completion, completion_cost

resp = completion(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Viết bài thơ về IT."}]
)

cost = completion_cost(completion_response=resp)
print(f"Token input: {resp.usage.prompt_tokens}")
print(f"Token output: {resp.usage.completion_tokens}")
print(f"Chi phí request này: ${cost:.6f} USD")

Dữ liệu chi phí này có thể ghi thẳng vào database hoặc log hệ thống. Nhờ đó, bạn dễ dàng kiểm soát ngân sách theo từng user hoặc từng feature cụ thể.

Share: