Fine-Tuning Thực Sự Hoạt Động Như Thế Nào Với Các Mô Hình OpenAI

Chào mừng trở lại với series “AI Engineer Roadmap – Lộ trình học Kỹ sư AI 2025“! Trong những bài viết trước, chúng ta đã cùng nhau khám phá nhiều khía cạnh của thế giới AI hiện đại, từ việc Kỹ Sư AI Là Gì?, phân biệt Kỹ sư AI và Kỹ sư ML, cho đến việc tìm hiểu Tại Sao Nên Bắt Đầu Với Các Mô Hình AI Được Huấn Luyện Trước và những Hạn Chế của chúng. Chúng ta cũng đã làm quen với các mô hình AI hàng đầu, khả năng và độ dài ngữ cảnh của mô hình OpenAI, cách Bắt Đầu Với OpenAI Chat Completions API, và thậm chí cả Nghệ Thuật Viết Prompt Hiệu Quả.

Các mô hình ngôn ngữ lớn (LLMs) được huấn luyện trước như GPT-3.5 hay GPT-4 của OpenAI cực kỳ mạnh mẽ và linh hoạt. Với kỹ thuật prompt engineering (viết prompt), chúng ta có thể định hướng chúng thực hiện vô số tác vụ. Tuy nhiên, đôi khi, dù đã cố gắng tối ưu prompt đến đâu, mô hình vẫn chưa thể đáp ứng chính xác nhu cầu đặc thù của bạn hoặc chưa thể bắt chước giọng văn/phong cách cụ thể mà bạn mong muốn.

Đây chính là lúc kỹ thuật Fine-Tuning phát huy sức mạnh. Fine-tuning cho phép chúng ta lấy một mô hình nền tảng đã được huấn luyện trên lượng dữ liệu khổng lồ và tinh chỉnh nó trên một tập dữ liệu nhỏ hơn, chuyên biệt cho tác vụ hoặc lĩnh vực cụ thể của bạn. Điều này giống như việc bạn đưa một chuyên gia đa năng đi học một khóa đào tạo chuyên sâu về một ngành nghề cụ thể vậy.

Trong bài viết này, chúng ta sẽ đi sâu vào Fine-Tuning với các mô hình OpenAI: nó thực sự là gì, tại sao lại cần nó, khi nào nên sử dụng, và quan trọng nhất, làm thế nào để thực hiện nó từng bước một.

Fine-Tuning Là Gì và Tại Sao Chúng Ta Cần Nó?

Như chúng ta đã thảo luận trong bài viết về Tại Sao Nên Bắt Đầu Với Các Mô Hình AI Được Huấn Luyện Trước, các mô hình này được huấn luyện trên một tập dữ liệu rất lớn và đa dạng, cho phép chúng có khả năng hiểu và tạo ra văn bản về nhiều chủ đề. Tuy nhiên, tính “đa năng” này cũng có những giới hạn, như đã đề cập trong Những Hạn Chế Của Mô Hình AI Được Huấn Luyện Trước:

  • Thiếu kiến thức chuyên sâu: Mô hình có thể không nắm vững các thuật ngữ, khái niệm hoặc ngữ cảnh đặc thù của một lĩnh vực hẹp (ví dụ: y khoa, luật, tài chính).
  • Không thể tuân theo định dạng hoặc hướng dẫn phức tạp: Dù prompt engineering rất hiệu quả, mô hình đôi khi khó tuân thủ các quy tắc định dạng rất chi tiết hoặc các chuỗi hướng dẫn dài, phức tạp một cách nhất quán.
  • Khó bắt chước giọng văn/phong cách cụ thể: Nếu bạn muốn mô hình viết giống hệt giọng văn của thương hiệu bạn, một nhân vật cụ thể, hoặc tuân theo một cấu trúc câu đặc trưng, prompt có thể không đủ.
  • Độ trễ và chi phí cao hơn với prompt dài: Với các tác vụ đòi hỏi nhiều ví dụ trong prompt (few-shot learning), chi phí API và độ trễ có thể tăng lên, như chúng ta đã phân tích trong bài Tokens, Cửa Sổ Ngữ Cảnh và Chi Phí API: Giải Mã.

Fine-tuning giải quyết những vấn đề này bằng cách cập nhật trọng số (weights) của mô hình nền tảng dựa trên tập dữ liệu tùy chỉnh của bạn. Quá trình này giống như việc “dạy thêm” cho mô hình những kiến thức hoặc kỹ năng mà nó còn thiếu, giúp nó trở nên thành thạo hơn trong tác vụ cụ thể đó.

Fine-Tuning Khác Gì Với Prompt Engineering?

Đây là một câu hỏi quan trọng mà nhiều kỹ sư AI tương lai đặt ra. Chúng ta đã dành một bài để nói về Nghệ Thuật Viết Prompt Hiệu Quả. Prompt engineering là kỹ thuật “giao tiếp” với mô hình bằng cách cung cấp hướng dẫn, ngữ cảnh, và các ví dụ trong chính input (prompt) gửi tới API. Mô hình sử dụng thông tin này để đưa ra output phù hợp, nhưng trọng số nội tại của nó không thay đổi.

Ngược lại, fine-tuning thực sự thay đổi mô hình ở cấp độ sâu hơn bằng cách huấn luyện nó trên dữ liệu mới. Kết quả là bạn nhận được một phiên bản mới của mô hình nền tảng, được tối ưu hóa cho tác vụ của bạn. Khi sử dụng mô hình đã fine-tune, bạn không cần cung cấp nhiều ngữ cảnh hoặc ví dụ trong prompt nữa, vì kiến thức đó đã được “khắc sâu” vào chính mô hình.

Dưới đây là bảng so sánh nhanh:

Đặc điểm Prompt Engineering Fine-Tuning
Cách thức hoạt động Cung cấp hướng dẫn/ví dụ trong input (prompt) Huấn luyện lại mô hình trên dữ liệu tùy chỉnh
Mô hình có thay đổi không? Không, trọng số mô hình gốc không thay đổi Có, trọng số mô hình được cập nhật, tạo ra một mô hình mới
Yêu cầu dữ liệu Ít hoặc không cần dữ liệu huấn luyện riêng biệt (chủ yếu dựa vào dữ liệu có trong prompt) Cần tập dữ liệu chất lượng cao, có cấu trúc cho tác vụ cụ thể
Thời gian triển khai Nhanh chóng (chỉ cần viết prompt) Mất thời gian chuẩn bị dữ liệu và chạy quá trình huấn luyện
Chi phí Tính theo token input/output. Có thể cao với prompt dài chứa nhiều ví dụ (few-shot). Chi phí chuẩn bị dữ liệu, chi phí huấn luyện (tính theo giờ/epoch và kích thước mô hình), chi phí inferencing (thường rẻ hơn so với dùng prompt dài trên mô hình gốc).
Hiệu suất trên tác vụ chuyên biệt Tốt cho các tác vụ chung hoặc khi cần linh hoạt nhanh chóng. Hiệu quả có thể giảm với tác vụ rất hẹp hoặc phức tạp. Thường vượt trội trên tác vụ/miền dữ liệu mà nó được fine-tune.
Tính linh hoạt Rất linh hoạt, dễ dàng thay đổi prompt cho các tác vụ khác nhau. Kém linh hoạt hơn sau khi fine-tune, mô hình được tối ưu cho một hoặc một vài tác vụ liên quan. Cần fine-tune lại cho tác vụ mới.

Nhìn chung, prompt engineering là điểm khởi đầu tuyệt vời và đủ cho nhiều trường hợp sử dụng. Fine-tuning là bước tiếp theo khi bạn cần hiệu suất cao hơn, độ chính xác tốt hơn, hoặc sự nhất quán trong các tác vụ chuyên biệt mà prompt đơn thuần không thể mang lại.

Các Mô Hình OpenAI Hỗ Trợ Fine-Tuning

OpenAI liên tục cập nhật các mô hình và khả năng của API. Tại thời điểm viết bài này (đầu năm 2024), mô hình phổ biến nhất và khuyến khích sử dụng cho fine-tuning các ứng dụng đàm thoại là gpt-3.5-turbo. Trước đây, các mô hình thuộc dòng “completion” như davinci-002, babbage-002 cũng có thể fine-tune, nhưng gpt-3.5-turbo mang lại hiệu suất tốt hơn đáng kể cho nhiều loại tác vụ, đặc biệt là các tác vụ yêu cầu tương tác theo dạng đối thoại.

Điều quan trọng là kiểm tra tài liệu chính thức của OpenAI API để biết danh sách các mô hình hiện tại hỗ trợ fine-tuning và bất kỳ cập nhật nào về quy trình hoặc khả năng.

Quy Trình Fine-Tuning Với OpenAI API

Quy trình fine-tuning với OpenAI API thường bao gồm các bước chính sau:

  1. Chuẩn bị dữ liệu huấn luyện.
  2. Upload dữ liệu lên OpenAI.
  3. Tạo công việc fine-tuning (Create a fine-tuning job).
  4. Theo dõi tiến độ công việc.
  5. Sử dụng mô hình đã fine-tune.

Hãy cùng đi sâu vào từng bước.

Bước 1: Chuẩn bị Dữ liệu Huấn luyện

Đây là bước quan trọng nhất và thường tốn nhiều thời gian nhất. Chất lượng và số lượng dữ liệu của bạn sẽ quyết định phần lớn sự thành công của quá trình fine-tuning. Đối với các mô hình chat như gpt-3.5-turbo, dữ liệu cần tuân thủ định dạng JSON Lines (.jsonl). Mỗi dòng trong file .jsonl là một đối tượng JSON độc lập, biểu diễn một cuộc hội thoại hoặc một cặp input/output mà bạn muốn mô hình học.

Mỗi đối tượng JSON phải có cấu trúc sau cho các mô hình chat:

{"messages": [{"role": "system", "content": "Instruction for the assistant."}, {"role": "user", "content": "User's message."}, {"role": "assistant", "content": "Assistant's response."}]}
{"messages": [{"role": "user", "content": "Another user message."}, {"role": "assistant", "content": "Another assistant response."}]}
{"messages": [{"role": "system", "content": "Specific role for this conversation."}, {"role": "user", "content": "User input example."}, {"role": "assistant", "content": "Desired output example."}]}
  • role: Có thể là system, user, hoặc assistant.
    • system: Thiết lập hành vi ban đầu của trợ lý. Không phải lúc nào cũng bắt buộc nhưng rất hữu ích để định hình phong cách hoặc quy tắc.
    • user: Lời nói/yêu cầu của người dùng.
    • assistant: Phản hồi mong muốn của trợ lý đối với lời nói của người dùng ngay trước đó. Đây chính là “đáp án” mà bạn muốn mô hình học cách tạo ra khi nhận được “câu hỏi” tương ứng từ user.
  • content: Nội dung của lời nói.

Số lượng dữ liệu: OpenAI khuyến nghị nên bắt đầu với ít nhất vài trăm cặp ví dụ chất lượng cao. Đối với các tác vụ phức tạp hơn hoặc cần sự nhất quán cao, bạn có thể cần hàng nghìn ví dụ. Quan trọng là sự đa dạng trong các ví dụ để mô hình có thể tổng quát hóa tốt.

Chất lượng dữ liệu: Dữ liệu phải sạch, chính xác và thể hiện chính xác hành vi hoặc output bạn muốn mô hình tạo ra. Sai sót trong dữ liệu huấn luyện sẽ dẫn đến sai sót trong mô hình đã fine-tune.

Ví dụ về dữ liệu .jsonl cho tác vụ phân loại cảm xúc:

{"messages": [{"role": "user", "content": "Sản phẩm này thật tuyệt vời!"}, {"role": "assistant", "content": "positive"}]}
{"messages": [{"role": "user", "content": "Tôi không hài lòng với dịch vụ."}, {"role": "assistant", "content": "negative"}]}
{"messages": [{"role": "user", "content": "Bài viết này khá bình thường."}, {"role": "assistant", "content": "neutral"}]}
{"messages": [{"role": "user", "content": "Giao hàng quá chậm."}, {"role": "assistant", "content": "negative"}]}
{"messages": [{"role": "user", "content": "Trải nghiệm người dùng rất mượt mà."}, {"role": "assistant", "content": "positive"}]}

Bước 2: Upload Dữ liệu lên OpenAI

Sau khi có file dữ liệu .jsonl, bạn cần upload nó lên nền tảng OpenAI bằng API. Bạn có thể sử dụng thư viện Python của OpenAI:

from openai import OpenAI

client = OpenAI(api_key="YOUR_API_KEY")

try:
    response = client.files.create(
        file=open("your_training_data.jsonl", "rb"),
        purpose="fine-tune"
    )
    file_id = response.id
    print(f"File uploaded successfully with ID: {file_id}")

except Exception as e:
    print(f"Error uploading file: {e}")
    file_id = None

Thay "your_training_data.jsonl" bằng tên file dữ liệu của bạn và "YOUR_API_KEY" bằng API key của bạn.

Bước 3: Tạo Công việc Fine-Tuning

Khi file dữ liệu đã được upload (bạn có file_id), bạn có thể tạo một công việc fine-tuning. Bạn cần chỉ định mô hình nền tảng bạn muốn fine-tune (ví dụ: gpt-3.5-turbo) và ID của file dữ liệu huấn luyện.

if file_id:
    try:
        response = client.fine_tuning.jobs.create(
            training_file=file_id,
            model="gpt-3.5-turbo" # or other supported base model
        )
        job_id = response.id
        print(f"Fine-tuning job created successfully with ID: {job_id}")
        print(f"Status: {response.status}")

    except Exception as e:
        print(f"Error creating fine-tuning job: {e}")
        job_id = None
else:
    print("Cannot create job: File ID is missing.")

API trả về một đối tượng Fine-tuning Job chứa thông tin về trạng thái hiện tại của công việc (queued, running, succeeded, failed).

Bước 4: Theo dõi Tiến độ Công việc

Quá trình fine-tuning có thể mất một khoảng thời gian, từ vài phút đến vài giờ tùy thuộc vào kích thước dữ liệu và độ phức tạp của mô hình. Bạn có thể theo dõi trạng thái của công việc bằng cách lấy thông tin chi tiết về job ID:

if job_id:
    try:
        while True:
            response = client.fine_tuning.jobs.retrieve(job_id)
            print(f"Job ID: {response.id}, Status: {response.status}, Fine-tuned model: {response.fine_tuned_model}")

            if response.status in ["succeeded", "failed", "cancelled"]:
                break
            import time
            time.sleep(60) # Wait for 60 seconds before checking again

        if response.status == "succeeded":
            fine_tuned_model_id = response.fine_tuned_model
            print(f"Fine-tuning completed! Fine-tuned model ID: {fine_tuned_model_id}")
        else:
            print(f"Fine-tuning job finished with status: {response.status}")
            print(f"Error details: {response.error}")

    except Exception as e:
        print(f"Error retrieving job status: {e}")
else:
     print("Cannot retrieve status: Job ID is missing.")

Khi trạng thái chuyển sang succeeded, trường fine_tuned_model sẽ chứa ID của mô hình mới đã được fine-tune. ID này có dạng như ft:gpt-3.5-turbo-0613:org-xxxx:my-custom-model:yyyyyyy.

Bước 5: Sử dụng Mô hình đã Fine-Tune

Sau khi có ID của mô hình đã fine-tune, bạn có thể sử dụng nó giống như cách bạn gọi các mô hình chat completions thông thường, chỉ cần thay đổi tên mô hình:

if fine_tuned_model_id:
    try:
        completion = client.chat.completions.create(
            model=fine_tuned_model_id, # Use your fine-tuned model ID here
            messages=[
                {"role": "system", "content": "Bạn là trợ lý phân loại cảm xúc."},
                {"role": "user", "content": "Tôi rất vui khi nhận được quà!"}
            ]
        )
        print("Fine-tuned model response:")
        print(completion.choices[0].message.content)

    except Exception as e:
        print(f"Error using fine-tuned model: {e}")
else:
    print("Cannot use fine-tuned model: Model ID is missing.")

Như bạn thấy, prompt khi sử dụng mô hình đã fine-tune có thể ngắn gọn hơn nhiều so với việc dùng mô hình gốc với few-shot examples.

Chi Phí Fine-Tuning

Chi phí fine-tuning với OpenAI gồm hai phần chính:

  • Chi phí huấn luyện: Tính dựa trên thời gian huấn luyện và kích thước mô hình. OpenAI tính theo đơn vị epoch (một lần mô hình xem xét toàn bộ dữ liệu huấn luyện) và số lượng token trong tập dữ liệu của bạn. Các mô hình lớn hơn hoặc huấn luyện trên tập dữ liệu lớn hơn sẽ tốn kém hơn.
  • Chi phí sử dụng (Inferencing): Chi phí cho mỗi lần gọi API đến mô hình đã fine-tune. Thông thường, chi phí per token cho mô hình đã fine-tune sẽ cao hơn một chút so với mô hình gốc cùng loại, nhưng bạn có thể tiết kiệm tổng chi phí nhờ prompt ngắn gọn hơn (không cần đưa ví dụ vào prompt).

Bạn cần kiểm tra trang giá của OpenAI API để có thông tin chi phí cập nhật nhất cho từng loại mô hình và tác vụ fine-tuning. Điều quan trọng là ước tính chi phí dựa trên kích thước dữ liệu và số lượng epoch bạn dự định chạy.

Các Thực Tiễn Tốt Nhất (Best Practices)

Để có kết quả fine-tuning tốt nhất, hãy lưu ý:

  • Chất lượng dữ liệu là vua: Đầu tư thời gian và công sức vào việc tạo ra tập dữ liệu sạch, chính xác và đầy đủ.
  • Số lượng dữ liệu phù hợp: Bắt đầu với vài trăm, nhưng sẵn sàng mở rộng lên hàng nghìn nếu cần. Quan trọng là dữ liệu đa dạng, bao phủ các trường hợp khác nhau mà mô hình sẽ gặp phải.
  • Định dạng chuẩn xác: Tuân thủ chặt chẽ định dạng .jsonl và cấu trúc messages mà OpenAI yêu cầu.
  • Giám sát quá trình: Theo dõi các metrics trong quá trình fine-tuning (OpenAI cung cấp các event và metrics thông qua API hoặc Dashboard) để đánh giá hiệu suất và quyết định khi nào nên dừng. Tránh overfitting (mô hình học quá thuộc lòng dữ liệu huấn luyện mà kém hiệu quả trên dữ liệu mới).
  • Kiểm thử kỹ lưỡng: Sau khi fine-tune, kiểm thử mô hình mới trên một tập dữ liệu kiểm thử riêng biệt để đảm bảo nó hoạt động như mong đợi.
  • Chọn mô hình nền tảng phù hợp: Bắt đầu với gpt-3.5-turbo là lựa chọn hợp lý cho nhiều tác vụ chat.

Hạn Chế và Khi Nào Không Nên Fine-Tune

Fine-tuning không phải là giải pháp cho mọi vấn đề. Có những trường hợp prompt engineering hoặc các kỹ thuật khác phù hợp hơn:

  • Dữ liệu quá ít: Nếu bạn chỉ có vài chục ví dụ, fine-tuning có thể không mang lại nhiều lợi ích đáng kể so với prompt engineering với few-shot examples, hoặc thậm chí có thể gây hại (overfitting).
  • Tác vụ quá chung chung: Nếu tác vụ của bạn rất giống với những gì mô hình nền tảng đã được huấn luyện (ví dụ: viết email cơ bản, tóm tắt văn bản phổ thông), prompt engineering thường là đủ.
  • Nhu cầu linh hoạt cao: Nếu bạn liên tục thay đổi yêu cầu hoặc áp dụng mô hình cho nhiều loại tác vụ khác nhau không liên quan chặt chẽ, việc fine-tune đi fine-tune lại sẽ tốn kém và mất thời gian. Prompt engineering linh hoạt hơn trong trường hợp này.
  • Kiến thức cần cập nhật liên tục: Fine-tuning giúp mô hình học kiến thức từ dữ liệu bạn cung cấp tại thời điểm huấn luyện. Nó không cung cấp khả năng truy cập hoặc tìm kiếm thông tin thời gian thực. Đối với các tác vụ cần thông tin cập nhật, kết hợp mô hình với khả năng tìm kiếm hoặc truy xuất dữ liệu (Retrieval Augmented Generation – RAG) có thể là phương pháp tốt hơn.

Kết Luận

Fine-tuning là một kỹ thuật mạnh mẽ trong bộ công cụ của một kỹ sư AI, cho phép chúng ta tùy chỉnh các mô hình ngôn ngữ lớn để đạt hiệu suất cao hơn, chính xác hơn và nhất quán hơn trên các tác vụ chuyên biệt. Bằng cách cung cấp dữ liệu huấn luyện chất lượng cao và tuân thủ quy trình của OpenAI, bạn có thể tạo ra các phiên bản mô hình được tối ưu hóa cho nhu cầu riêng của mình.

Tuy nhiên, fine-tuning đòi hỏi sự đầu tư về thời gian (chuẩn bị dữ liệu) và chi phí. Việc lựa chọn giữa fine-tuning và prompt engineering cần dựa trên phân tích kỹ lưỡng về yêu cầu của tác vụ, lượng dữ liệu sẵn có, ngân sách và mục tiêu hiệu suất.

Trên hành trình trở thành Kỹ sư AI, nắm vững cả prompt engineering và fine-tuning sẽ giúp bạn giải quyết được nhiều bài toán phức tạp hơn. Trong các bài viết tiếp theo của series “AI Engineer Roadmap“, chúng ta sẽ tiếp tục khám phá những kỹ thuật và công cụ quan trọng khác. Hãy cùng chờ đón nhé!

Chỉ mục