Tháng 6/2025, một nhà phát triển AI tại Thâm Quyến đối mặt với bài toán nan giải: quản lý 47 mô hình AI cho một nền tảng thương mại điện tử với ngân sách hạn hẹp. Anh ấy cần tối ưu hóa đồng thời 3 mục tiêu: chi phí thấp nhất, độ trễ dưới 200ms, và độ chính xác trên 92%. Giải pháp của anh ấy? Kết hợp thuật toán di truyền đa mục tiêu (NSGA-II) với LLM (Large Language Model) để tạo ra một hệ thống tự động tối ưu hóa portfolio AI. Bài viết này sẽ hướng dẫn bạn xây dựng hệ thống tương tự.

Tại sao cần kết hợp Genetic Algorithm với LLM?

Trong thực tế, việc tối ưu hóa portfolio AI không chỉ đơn giản là chọn model rẻ nhất. Bạn cần cân bằng giữa:

LLM đóng vai trò như "bộ não phân tích" - đánh giá chất lượng output, gợi ý strategy, và giải thích quyết định tối ưu. Genetic Algorithm cung cấp khả năng tìm kiếm Pareto-optimal frontier hiệu quả.

Kiến trúc hệ thống

Hệ thống bao gồm 4 thành phần chính:

┌─────────────────────────────────────────────────────────────────┐
│                    Portfolio Optimization System                 │
├─────────────────────────────────────────────────────────────────┤
│  ┌──────────────┐    ┌──────────────┐    ┌──────────────┐      │
│  │   NSGA-II    │───▶│     LLM      │───▶│   Selector   │      │
│  │  Optimizer   │    │   Analyzer   │    │    Engine    │      │
│  └──────────────┘    └──────────────┘    └──────────────┘      │
│         │                   │                   │              │
│         ▼                   ▼                   ▼              │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │              Model Performance Database                  │   │
│  └─────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────┘

Triển khai chi tiết với HolySheep AI

Tôi sử dụng HolySheep AI vì chi phí chỉ ¥1=$1 - tiết kiệm 85%+ so với các provider khác, độ trễ dưới 50ms, và hỗ trợ WeChat/Alipay thanh toán dễ dàng.

1. Cấu hình và Import thư viện

import requests
import json
import numpy as np
from dataclasses import dataclass
from typing import List, Dict, Tuple
import random
import time

Cấu hình HolySheep AI - Base URL bắt buộc

BASE_URL = "https://api.holysheep.ai/v1" API_KEY = "YOUR_HOLYSHEEP_API_KEY" # Thay thế bằng API key của bạn @dataclass class ModelConfig: """Cấu hình model AI""" name: str provider: str cost_per_mtok: float # $/1M tokens latency_ms: float accuracy_score: float # 0-1 context_window: int strengths: List[str]

Danh sách models với dữ liệu thực tế 2026

AVAILABLE_MODELS = [ ModelConfig("gpt-4.1", "OpenAI", 8.0, 1200, 0.95, 128000, ["reasoning", "coding", "analysis"]), ModelConfig("claude-sonnet-4.5", "Anthropic", 15.0, 1500, 0.96, 200000, ["writing", "reasoning", "safety"]), ModelConfig("gemini-2.5-flash", "Google", 2.50, 300, 0.92, 1000000, ["fast", "multimodal", "cost-effective"]), ModelConfig("deepseek-v3.2", "DeepSeek", 0.42, 450, 0.89, 64000, ["reasoning", "coding", "budget"]), ] def call_holysheep_api(prompt: str, model: str = "deepseek-v3.2") -> Dict: """Gọi HolySheep AI API - Không bao giờ dùng api.openai.com""" headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } payload = { "model": model, "messages": [{"role": "user", "content": prompt}], "temperature": 0.3, "max_tokens": 500 } start_time = time.time() response = requests.post( f"{BASE_URL}/chat/completions", headers=headers, json=payload, timeout=30 ) latency_ms = (time.time() - start_time) * 1000 if response.status_code == 200: result = response.json() return { "success": True, "content": result["choices"][0]["message"]["content"], "latency": latency_ms, "model": model, "cost": (len(prompt) + len(result["choices"][0]["message"]["content"])) / 1_000_000 * next(m.cost_per_mtok for m in AVAILABLE_MODELS if m.name == model) } else: return { "success": False, "error": response.text, "latency": latency_ms }

2. Triển khai NSGA-II Algorithm

class NSGAIIOptimizer:
    """Multi-objective Genetic Algorithm (NSGA-II) cho Portfolio Optimization"""
    
    def __init__(self, models: List[ModelConfig], objectives: List[str]):
        self.models = models
        self.objectives = objectives  # e.g., ["cost", "latency", "accuracy"]
        self.population_size = 50
        self.generations = 100
        self.mutation_rate = 0.1
        self.crossover_rate = 0.8
        
    def create_individual(self) -> List[int]:
        """Tạo cá thể - mỗi cá thể là một portfolio (danh sách model indices)"""
        # Mỗi portfolio chọn ngẫu nhiên 1-3 models
        num_models = random.randint(1, min(3, len(self.models)))
        return random.sample(range(len(self.models)), num_models)
    
    def evaluate(self, individual: List[int]) -> Tuple[float, float, float]:
        """Đánh giá cá thể theo 3 mục tiêu"""
        if not individual:
            return (float('inf'), float('inf'), 0.0)
            
        models_in_portfolio = [self.models[idx] for idx in individual]
        
        # Mục tiêu 1: Chi phí trung bình (minimize)
        avg_cost = np.mean([m.cost_per_mtok for m in models_in_portfolio])
        
        # Mục tiêu 2: Độ trễ trung bình (minimize)  
        avg_latency = np.mean([m.latency_ms for m in models_in_portfolio])
        
        # Mục tiêu 3: Độ chính xác trung bình (maximize)
        avg_accuracy = np.mean([m.accuracy_score for m in models_in_portfolio])
        
        return (avg_cost, avg_latency, avg_accuracy)
    
    def crowding_distance(self, population: List[List[int]], 
                         fronts: List[List[int]]) -> Dict[int, float]:
        """Tính crowding distance cho non-dominated solutions"""
        distances = {i: 0.0 for front in fronts for i in front}
        
        for front in fronts:
            if len(front) <= 2:
                for i in front:
                    distances[i] = float('inf')
                continue
                    
            for obj_idx in range(3):
                sorted_front = sorted(front, 
                    key=lambda x: self.evaluate(population[x])[obj_idx])
                
                distances[sorted_front[0]] = float('inf')
                distances[sorted_front[-1]] = float('inf')
                
                obj_range = (self.evaluate(population[sorted_front[-1]])[obj_idx] -
                            self.evaluate(population[sorted_front[0]])[obj_idx])
                
                if obj_range > 0:
                    for i in range(1, len(sorted_front) - 1):
                        distances[sorted_front[i]] += (
                            self.evaluate(population[sorted_front[i+1]])[obj_idx] -
                            self.evaluate(population[sorted_front[i-1]])[obj_idx]
                        ) / obj_range
        
        return distances
    
    def fast_non_dominated_sort(self, population: List[List[int]]) -> List[List[int]]:
        """Thuật toán Fast Non-dominated Sort"""
        n = len(population)
        domination_count = [0] * n
        dominated_solutions = [[] for _ in range(n)]
        fronts = [[]]
        
        for p in range(n):
            for q in range(n):
                if p == q:
                    continue
                    
                eval_p = self.evaluate(population[p])
                eval_q = self.evaluate(population[q])
                
                # p dominates q nếu p không tệ hơn q ở tất cả objectives
                # và tốt hơn q ở ít nhất 1 objective
                if all(ep <= eq for ep, eq in zip(eval_p, eval_q)) and \
                   any(ep < eq for ep, eq in zip(eval_p, eval_q)):
                    dominated_solutions[p].append(q)
                elif all(eq <= ep for ep, eq in zip(eval_p, eval_q)) and \
                     any(eq < ep for ep, eq in zip(eval_p, eval_q)):
                    domination_count[p] += 1
            
            if domination_count[p] == 0:
                fronts[0].append(p)
        
        i = 0
        while fronts[i]:
            next_front = []
            for p in fronts[i]:
                for q in dominated_solutions[p]:
                    domination_count[q] -= 1
                    if domination_count[q] == 0:
                        next_front.append(q)
            i += 1
            fronts.append(next_front)
        
        return fronts[:-1]
    
    def crossover(self, parent1: List[int], parent2: List[int]) -> List[int]:
        """Hôi quy 2 điểm (Two-point Crossover)"""
        if random.random() < self.crossover_rate:
            size = min(len(parent1), len(parent2))
            pt1, pt2 = sorted(random.sample(range(size), 2))
            
            child1 = parent1[:pt1] + parent2[pt1:pt2] + parent1[pt2:]
            child2 = parent2[:pt1] + parent1[pt1:pt2] + parent2[pt2:]
            
            return list(set(child1))[:3]  # Loại bỏ trùng lặp, tối đa 3 models
        return parent1.copy()
    
    def mutate(self, individual: List[int]) -> List[int]:
        """Đột biến"""
        mutated = individual.copy()
        
        if random.random() < self.mutation_rate:
            mutation_type = random.choice(["add", "remove", "replace"])
            
            if mutation_type == "add" and len(mutated) < 3:
                new_model = random.choice(
                    [i for i in range(len(self.models)) if i not in mutated]
                )
                mutated.append(new_model)
            elif mutation_type == "remove" and len(mutated) > 1:
                mutated.remove(random.choice(mutated))
            elif mutation_type == "replace":
                idx = random.choice(range(len(mutated)))
                available = [i for i in range(len(self.models)) if i not in mutated]
                if available:
                    mutated[idx] = random.choice(available)
        
        return mutated
    
    def optimize(self) -> List[Tuple[List[int], Tuple[float, float, float]]]:
        """Chạy tối ưu hóa NSGA-II"""
        # Khởi tạo population
        population = [self.create_individual() for _ in range(self.population_size)]
        
        for generation in range(self.generations):
            # Tạo offspring
            offspring = []
            for _ in range(self.population_size // 2):
                p1, p2 = random.sample(population, 2)
                child = self.crossover(p1, p2)
                child = self.mutate(child)
                offspring.append(child)
            
            # Kết hợp parent và offspring
            combined = population + offspring
            
            # Fast non-dominated sort
            fronts = self.fast_non_dominated_sort(combined)
            
            # Tính crowding distance
            distances = self.crowding_distance(combined, fronts)
            
            # Chọn下一代
            new_population = []
            for front in fronts:
                if len(new_population) + len(front) <= self.population_size:
                    new_population.extend(sorted(front, 
                        key=lambda x: -distances[x]))
                else:
                    remaining = self.population_size - len(new_population)
                    sorted_front = sorted(front, key=lambda x: -distances[x])
                    new_population.extend(sorted_front[:remaining])
                    break
            
            population = [combined[i] for i in new_population]
            
            if generation % 20 == 0:
                print(f"Generation {generation}: {len(fronts)} Pareto fronts")
        
        # Trả về Pareto optimal solutions
        final_fronts = self.fast_non_dominated_sort(population)
        pareto_solutions = []
        for idx in final_fronts[0]:
            eval_result = self.evaluate(population[idx])
            pareto_solutions.append((population[idx], eval_result))
        
        return pareto_solutions

3. Tích hợp LLM để phân tích và đề xuất

class LLMAnalyzer:
    """LLM Analyzer sử dụng HolySheep AI để phân tích portfolio"""
    
    def __init__(self, api_key: str):
        self.api_key = api_key
        
    def analyze_portfolio(self, portfolio: List[int], 
                         models: List[ModelConfig],
                         task_description: str) -> Dict:
        """Phân tích portfolio và đề xuất cải thiện"""
        
        portfolio_names = [models[idx].name for idx in portfolio]
        models_info = "\n".join([
            f"- {m.name}: cost=${m.cost_per_mtok}/MTok, "
            f"latency={m.latency_ms}ms, accuracy={m.accuracy_score*100}%"
            for m in models
        ])
        
        prompt = f"""Bạn là chuyên gia tối ưu hóa AI Portfolio.

Task: {task_description}

Models được chọn: {', '.join(portfolio_names)}

Danh sách models có sẵn:
{models_info}

Hãy phân tích:
1. Điểm mạnh của portfolio hiện tại
2. Điểm yếu và rủi ro
3. Đề xuất cải thiện cụ thể (thêm/bớt model nào, tại sao)
4. Strategy phân bổ workload tối ưu

Trả lời bằng JSON format:
{{"strengths": [], "weaknesses": [], "recommendations": [], "strategy": ""}}"""

        result = call_holysheep_api(prompt, model="deepseek-v3.2")
        
        if result["success"]:
            try:
                # Parse JSON từ response
                content = result["content"]
                # Tìm JSON trong response
                start = content.find('{')
                end = content.rfind('}') + 1
                if start != -1 and end != 0:
                    analysis = json.loads(content[start:end])
                    analysis["llm_cost"] = result["cost"]
                    analysis["llm_latency"] = result["latency"]
                    return analysis
            except json.JSONDecodeError:
                return {"error": "Failed to parse LLM response", "raw": result["content"]}
        
        return {"error": result.get("error", "Unknown error")}
    
    def generate_optimization_report(self, 
                                     pareto_solutions: List[Tuple[List[int], Tuple]],
                                     models: List[ModelConfig],
                                     budget: float) -> str:
        """Tạo báo cáo tổng hợp với sự trợ giúp của LLM"""
        
        solutions_summary = []
        for i, (portfolio, metrics) in enumerate(pareto_solutions[:5]):
            cost, latency, accuracy = metrics
            names = [models[idx].name for idx in portfolio]
            solutions_summary.append(
                f"Solution {i+1}: {names} - "
                f"Cost: ${cost:.2f}/MTok, Latency: {latency:.0f}ms, "
                f"Accuracy: {accuracy*100:.1f}%"
            )
        
        prompt = f"""Tạo báo cáo tối ưu hóa AI Portfolio với ngân sách ${budget}/tháng.

Các giải pháp Pareto optimal:
{chr(10).join(solutions_summary)}

Hãy:
1. So sánh các giải pháp
2. Đề xuất giải pháp tốt nhất cho từng use case khác nhau
3. Ước tính chi phí hàng tháng cho mỗi giải pháp (giả sử 10M tokens/tháng)
4. Đưa ra khuyến nghị cuối cùng

Viết bằng tiếng Việt, format rõ ràng dễ đọc."""

        result = call_holysheep_api(prompt, model="gemini-2.5-flash")
        
        if result["success"]:
            return result["content"]
        return "Không thể tạo báo cáo"


def main():
    """Chạy demo tối ưu hóa portfolio"""
    
    # Khởi tạo optimizer
    optimizer = NSGAIIOptimizer(
        models=AVAILABLE_MODELS,
        objectives=["cost", "latency", "accuracy"]
    )
    
    print("=" * 60)
    print("AI Portfolio Optimization với NSGA-II + LLM")
    print("=" * 60)
    
    # Chạy NSGA-II
    print("\nĐang chạy NSGA-II Optimization...")
    start_time = time.time()
    pareto_solutions = optimizer.optimize()
    ga_time = time.time() - start_time
    
    print(f"\nHoàn thành sau {ga_time:.2f} giây")
    print(f"Tìm thấy {len(pareto_solutions)} Pareto optimal solutions\n")
    
    # Hiển thị kết quả
    print("Pareto Optimal Solutions:")
    print("-" * 60)
    for i, (portfolio, metrics) in enumerate(p