Cách Tạo Dữ Liệu để Tinh Chỉnh LLMs
Tinh chỉnh một mô hình ngôn ngữ lớn (LLM) chỉ tốt khi dữ liệu mà nó được huấn luyện tốt. Các bộ dữ liệu chất lượng cao, được cấu trúc tốt quyết định trực tiếp khả năng mô hình tuân theo hướng dẫn, trả lời câu hỏi và hoạt động trong môi trường thực tế.
Hướng dẫn này trình bày toàn bộ quy trình chuẩn bị dữ liệu cho việc tinh chỉnh LLM, từ văn bản thô đến một bộ dữ liệu sẵn sàng cho sản xuất.
Điểm chính
- Dữ liệu chất lượng cao quan trọng hơn số lượng lớn khi tinh chỉnh các LLM. Các bộ dữ liệu sạch, có cấu trúc tốt và phù hợp với nhiệm vụ luôn cho kết quả tốt hơn các bộ dữ liệu lớn và nhiễu.
- Bắt đầu với một mục tiêu rõ ràng trước khi thu thập dữ liệu. Biết được bạn đang điều chỉnh để theo dõi hướng dẫn, chuyên môn lĩnh vực hay hành vi trò chuyện sẽ định hướng mọi quyết định về dữ liệu.
- Các cặp hướng dẫn–phản hồi là nền tảng của việc điều chỉnh tinh vi hiệu quả. Các lời nhắc được viết tốt kèm câu trả lời chính xác, ngắn gọn giúp mô hình học các hành vi mong muốn nhanh hơn.
- Định dạng dữ liệu đúng cách là rất quan trọng. Việc căn chỉnh bộ dữ liệu của bạn với khung đích (JSON, JSONL hoặc định dạng chat) giúp tránh lỗi trong quá trình huấn luyện và cải thiện hiệu quả học tập.
- Đánh giá và lặp lại liên tục là cần thiết. Tinh chỉnh là một quá trình lặp đi lặp lại: theo dõi kết quả, cải thiện dữ liệu và huấn luyện lại để đạt hiệu suất tối ưu.
Hiểu về Yêu cầu Dữ liệu Khi Tinh Chỉnh Mô hình Ngôn ngữ Lớn (LLM)
Dữ liệu tinh chỉnh không phải là văn bản thô được thu thập từ internet. Khác với việc huấn luyện trước, nơi các mô hình học các mẫu ngôn ngữ từ một tập dữ liệu khổng lồ, tinh chỉnh dạy một mô hình cách nó nên hành xử. Mục tiêu là định hình các phản hồi sao cho mô hình tuân theo hướng dẫn, trả lời câu hỏi chính xác và duy trì một nhân cách nhất quán.
Trong thực tế, điều này có nghĩa là biến kiến thức thành các ví dụ có cấu trúc, kết hợp ý định của người dùng với câu trả lời lý tưởng. Mỗi dữ liệu đều rõ ràng cho mô hình thấy một câu trả lời tốt sẽ như thế nào đối với một lời nhắc nhất định. Theo thời gian, mô hình sẽ ghi nhớ các mẫu này và bắt đầu áp dụng chúng cho các đầu vào chưa thấy trước đó.
Hầu hết các quy trình tinh chỉnh hiện đại đều dựa vào dữ liệu kiểu hướng dẫn hoặc dữ liệu kiểu trò chuyện. Bộ dữ liệu kiểu hướng dẫn bao gồm một hướng dẫn, một đầu vào tuỳ chọn, và một đầu ra. Bộ dữ liệu kiểu trò chuyện sử dụng các tin nhắn theo vai trò như hệ thống, người dùng và trợ lý. Cả hai phương pháp đều nhằm cùng một mục đích; việc lựa chọn thường phụ thuộc vào mô hình mục tiêu và khung huấn luyện.
Định dạng dữ liệu cho việc tinh chỉnh LLM
Trước khi tạo hoặc xuất một bộ dữ liệu, điều quan trọng là phải hiểu các định dạng dữ liệu khác nhau được sử dụng cho việc tinh chỉnh LLM. Định dạng mà chúng ta chọn ảnh hưởng trực tiếp đến cách mô hình hiểu các hướng dẫn, học cách diễn đạt trong hội thoại và tổng quát hóa cho việc sử dụng trong thế giới thực. Mặc dù hầu hết các khung huấn luyện hiện đại hỗ trợ nhiều định dạng, mỗi định dạng phục vụ một mục đích hơi khác nhau và phù hợp với các mục tiêu tinh chỉnh khác nhau.
Dưới đây là một vài định dạng dữ liệu được sử dụng phổ biến nhất để tinh chỉnh mô hình.
Định dạng theo phong cách hoàn thành
Bộ dữ liệu kiểu hoàn thành là dạng dữ liệu tinh chỉnh đơn giản và truyền thống nhất. Trong định dạng này, mô hình được hiển thị một gợi ý và được huấn luyện để dự đoán phần tiếp theo. Định dạng này thường được sử dụng trong tinh chỉnh theo kiểu GPT ban đầu và vẫn được nhiều API hỗ trợ.
Một ví dụ theo kiểu hoàn thành thường trông như sau:
{
"prompt": "What is a Linux-Console.net GPU Droplet?
Answer:",
"completion": " A GPU Droplet is a virtual machine on Linux-Console.net that includes NVIDIA GPUs for AI, machine learning, and high-performance computing workloads."
}Trong thiết lập này, mô hình học cách tiếp tục tạo văn bản sau phần gợi ý. Mặc dù cách tiếp cận này đơn giản, nhưng nó có những hạn chế. Vì cấu trúc là ngầm định, mô hình có thể gặp khó khăn với việc thực hiện các chỉ dẫn phức tạp hoặc các cuộc trò chuyện nhiều lượt. Tinh chỉnh theo kiểu hoàn thành phù hợp nhất với các nhiệm vụ có phạm vi hẹp như trả lời ngắn, phân loại hoặc tạo văn bản có kiểm soát.
Định dạng theo phong cách hướng dẫn
Tinh chỉnh theo phong cách hướng dẫn làm cho mục tiêu học tập trở nên rõ ràng bằng cách tách biệt rõ ràng hướng dẫn khỏi kết quả mong đợi. Định dạng này đã trở thành tiêu chuẩn thực tế để điều chỉnh các mô hình ngôn ngữ lớn mã nguồn mở vì nó cải thiện khả năng theo hướng dẫn và giảm sự mơ hồ.
Một ví dụ theo phong cách hướng dẫn thường bao gồm ba trường: một hướng dẫn, một đầu vào tùy chọn và một đầu ra. Hướng dẫn mô tả nhiệm vụ, đầu vào cung cấp bối cảnh bổ sung nếu cần, và đầu ra đại diện cho phản hồi lý tưởng.
{
"instruction": "Explain what a GPU Droplet is in Linux-Console.net",
"input": "",
"output": "A GPU Droplet is a virtual machine provided by Linux-Console.net that comes with NVIDIA GPUs and is designed for AI, machine learning, deep learning, and high-performance computing workloads."
}Định dạng này rất dễ đọc và dễ gỡ lỗi. Điều này cho phép kết hợp các loại nhiệm vụ khác nhau, chẳng hạn như giải thích, tóm tắt và khắc phục sự cố, trong cùng một tập dữ liệu. Dữ liệu theo phong cách hướng dẫn là lý tưởng khi mục tiêu là dạy một mô hình cách thực hiện các lệnh một cách đáng tin cậy và tạo ra các phản hồi nhất quán, chuyên sâu theo từng lĩnh vực.
Định dạng theo kiểu trò chuyện
Các tập dữ liệu kiểu trò chuyện được thiết kế để phản ánh các tương tác thực tế trong hội thoại. Mỗi ví dụ huấn luyện bao gồm một chuỗi các tin nhắn, trong đó mỗi tin nhắn được gắn với một vai trò như hệ thống, người dùng hoặc trợ lý. Định dạng này phù hợp chặt chẽ với cách các mô hình ngôn ngữ lớn dựa trên trò chuyện được sử dụng trong thực tế.
Một ví dụ theo phong cách trò chuyện thường trông như sau:
{
"messages": [
{"role": "system", "content": "You are a helpful Linux-Console.net support assistant."},
{"role": "user", "content": "What is a GPU Droplet?"},
{"role": "assistant", "content": "A GPU Droplet is a virtual machine on Linux-Console.net equipped with NVIDIA GPUs, designed for AI, machine learning, and high-performance computing workloads."}
]
}Tin nhắn hệ thống xác định hành vi và giọng điệu của mô hình, trong khi các tin nhắn của người dùng và trợ lý dạy cách diễn tiến cuộc trò chuyện. Định dạng này đặc biệt hiệu quả cho chatbot, đại diện hỗ trợ khách hàng và các trợ lý nhiều lượt hội thoại.
Tuy nhiên, các bộ dữ liệu kiểu trò chuyện thường dài dòng hơn và hơi phức tạp để biên soạn. Chúng thích hợp nhất khi ứng dụng cuối cùng là hội thoại và phụ thuộc vào ngữ cảnh.
Trước khi quyết định định dạng phù hợp cho việc huấn luyện mô hình, trước tiên chúng ta phải làm rõ nhiệm vụ cụ thể mà chúng ta muốn thực hiện.
Nếu chúng ta đang điều chỉnh một mô hình cho các nhiệm vụ prompt–response đơn giản, dữ liệu kiểu completion có thể là đủ. Đối với hầu hết các trường hợp thích ứng theo miền và thực hiện theo hướng dẫn, các bộ dữ liệu kiểu hướng dẫn cung cấp sự cân bằng tốt nhất giữa tính rõ ràng và linh hoạt. Khi xây dựng các đại lý hội thoại hoặc trợ lý phải duy trì bối cảnh và cá tính, các bộ dữ liệu kiểu chat là lựa chọn tự nhiên nhất. Điều quan trọng nhất là sự nhất quán. Một bộ dữ liệu được cấu trúc tốt, sạch một trong bất kỳ định dạng nào sẽ hoạt động tốt hơn so với một bộ dữ liệu lớn hơn nhưng thiết kế kém.
Nguồn Gốc Dữ Liệu Tinh Chỉnh
Các bộ dữ liệu tinh chỉnh chất lượng cao hầu như luôn được lấy từ các nguồn đáng tin cậy. Những nguồn này bao gồm tài liệu sản phẩm, tài liệu tham khảo API, vé hỗ trợ nội bộ, bài viết trung tâm trợ giúp và các giải thích được tuyển chọn từ chuyên gia. Trong nhiều hệ thống thực tế, các nhóm cũng tạo ra các ví dụ tổng hợp để bao phủ các trường hợp biên hoặc các truy vấn ít đại diện.
Luôn có nhu cầu xác định các nguồn đáng tin cậy phản ánh kiến thức và hành vi mà chúng ta muốn mô hình học. Đối với việc tinh chỉnh theo chuyên môn cụ thể, điều này thường bao gồm tài liệu chính thức, cơ sở tri thức nội bộ, phiếu hỗ trợ, FAQ và các hướng dẫn do chuyên gia viết. Dữ liệu càng gần với các câu hỏi thực tế của người dùng và câu trả lời có thẩm quyền, mô hình được tinh chỉnh sẽ càng hiệu quả. Đôi khi, cũng có thể cần thực hiện việc thu thập dữ liệu web một cách đạo đức để tạo ra dữ liệu đáng tin cậy cho một số chatbot theo chuyên môn cụ thể.
Trong thực tế, nhiều nhóm dựa vào sự kết hợp giữa dữ liệu sở hữu riêng và các tập dữ liệu mở. Các nền tảng như Hugging Face đóng vai trò trung tâm trong quá trình này. Hugging Face lưu trữ hàng ngàn tập dữ liệu công khai có sẵn, bao gồm huấn luyện hướng dẫn, trả lời câu hỏi, tóm tắt và các nhiệm vụ hội thoại. Những tập dữ liệu này có thể được sử dụng trực tiếp, điều chỉnh cho một lĩnh vực mới, hoặc làm mẫu để tạo dữ liệu tùy chỉnh. Hugging Face Datasets cũng cung cấp các tiện ích chuẩn hóa cho việc tải, quản lý phiên bản và phát luồng dữ liệu, giúp việc thu thập và tiền xử lý dữ liệu quy mô lớn trở nên dễ dàng hơn nhiều.
Dữ liệu do LLM tạo và Tạo bộ dữ liệu tổng hợp
Một trong những phương pháp hiện đại trong việc tinh chỉnh LLM là tạo dữ liệu huấn luyện bằng cách sử dụng một mô hình ngôn ngữ lớn hiện có. Phương pháp này, thường được gọi là tạo dữ liệu tổng hợp hoặc dữ liệu do LLM sinh ra, ngày càng trở nên phổ biến vì nó giảm đáng kể thời gian và chi phí cần thiết để xây dựng các bộ dữ liệu chất lượng cao.
Trong quy trình làm việc này, một mô hình cơ bản mạnh được yêu cầu tạo các cặp hướng dẫn–phản hồi, ví dụ câu hỏi–trả lời hoặc các cuộc trò chuyện nhiều lượt dựa trên một sơ đồ được định trước. Các kết quả đầu ra được tạo ra sau đó sẽ được xem xét, lọc và tinh chỉnh trước khi được thêm vào bộ dữ liệu huấn luyện tinh chỉnh. Khi thực hiện cẩn thận, kỹ thuật này có thể tạo ra dữ liệu gần giống với các tương tác thực tế của người dùng.
Dữ liệu do LLM tạo ra đặc biệt hữu ích khi các ví dụ do con người viết còn hạn chế, khi cần bao phủ các trường hợp ngoại lệ, hoặc khi mở rộng một bộ dữ liệu hiện có để cải thiện phạm vi và tính đa dạng. Ví dụ, khi chúng ta xác định một tập hợp nhỏ các sự thật đáng tin cậy từ Linux-Console.net, một LLM có thể tạo ra hàng chục câu hỏi với ngữ nghĩa đa dạng và các câu trả lời chất lượng cao đồng thời duy trì sự nhất quán với kiến thức gốc.
Tuy nhiên, dữ liệu tổng hợp phải được sử dụng một cách thận trọng. Các mô hình có xu hướng củng cố những thiên kiến và kiểu cách diễn đạt của chính chúng, điều này có thể dẫn đến hiện tượng quá khớp hoặc giảm tính đa dạng ngôn ngữ nếu toàn bộ bộ dữ liệu là tổng hợp. Vì lý do này, dữ liệu do LLM tạo ra sẽ phát huy hiệu quả nhất khi được kết hợp với dữ liệu do con người biên tập hoặc từ các nguồn đáng tin cậy. Việc kiểm tra bởi con người, các kiểm tra xác thực tự động và loại bỏ dữ liệu trùng lặp là những bước quan trọng trong quy trình này.
Trong các quy trình sản xuất, các nhóm thường sử dụng phương pháp kết hợp. Dữ liệu do con người viết đảm bảo tính chính xác và giọng điệu, trong khi dữ liệu do LLM tạo ra mở rộng bộ dữ liệu và lấp đầy các khoảng trống. Sự cân bằng này cho phép các nhóm đạt được kết quả tinh chỉnh tốt mà không làm giảm độ chính xác hay độ tin cậy.
Chuẩn Bị Bộ Dữ Liệu Hugging Face cho Việc Tinh Chỉnh Mô Hình Ngôn Ngữ Lớn
Hiện nay, Hugging Face có một số lượng lớn các bộ dữ liệu mã nguồn mở có thể được sử dụng để tạo dữ liệu tinh chỉnh chất lượng cao. Nhiều bộ dữ liệu trong số này đã chứa các cặp hướng dẫn–phản hồi nhưng vẫn cần được định dạng theo một cấu trúc yêu cầu nhất quán trước khi đào tạo.
Ví dụ_1:
from datasets import load_dataset
from itertools import islice
# Load Dolly dataset (non-streaming; small enough)
dataset = load_dataset("databricks/databricks-dolly-15k", split="train")
# Take first 1000 samples
samples = list(islice(dataset, 1000))
print("Dolly sample structure:")
print(samples[0])
# Format for instruction fine-tuning
def format_dolly(example):
instruction = example["instruction"]
context = example.get("context", "")
response = example["response"]
prompt_parts = [
f"### Instruction:\n{instruction}"
]
if context.strip():
prompt_parts.append(f"### Input:\n{context}")
prompt_parts.append(f"### Response:\n{response}")
return {"text": "\n".join(prompt_parts)}
# Apply formatting
formatted_samples = [format_dolly(sample) for sample in samples]Dolly sample structure:
{'instruction': 'When did Virgin Australia start operating?', 'context': "Virgin Australia, the trading name of Virgin Australia Airlines Pty Ltd, is an Australian-based airline. It is the largest airline by fleet size to use the Virgin brand. It commenced services on 31 August 2000 as Virgin Blue, with two aircraft on a single route. It suddenly found itself as a major airline in Australia's domestic market after the collapse of Ansett Australia in September 2001. The airline has since grown to directly serve 32 cities in Australia, from hubs in Brisbane, Melbourne and Sydney.", 'response': 'Virgin Australia commenced services on 31 August 2000 as Virgin Blue, with two aircraft on a single route.', 'category': 'closed_qa'}Ví dụ_2:
from datasets import load_dataset
from itertools import islice
dataset = load_dataset(
"Open-Orca/OpenOrca",
split="train",
streaming=True
)
samples = list(islice(dataset, 1000))
def format_openorca(example):
system = example.get("system_prompt", "You are a helpful assistant.")
question = example["question"]
answer = example["response"]
text = (
f"### System:\n{system}\n"
f"### Instruction:\n{question}\n"
f"### Response:\n{answer}"
)
return {"text": text}
formatted_samples = [format_openorca(s) for s in samples]{ 'text': '### System:\n'
'\n'
'### Instruction:\n'
'You will be given a definition of a task first, then some input '
'of the task.\n'
'This task is about using the specified sentence and converting '
'the sentence to Resource Description Framework (RDF) triplets of '
'the form (subject, predicate object). The RDF triplets generated '
'must be such that the triplets accurately capture the structure '
'and semantics of the input sentence. The input is a sentence and '
'the output is a list of triplets of the form [subject, predicate, '
'object] that capture the relationships present in the sentence. '
'When a sentence has more than 1 RDF triplet possible, the output '
'must contain all of them.\n'
'\n'
"AFC Ajax (amateurs)'s ground is Sportpark De Toekomst where Ajax "
'Youth Academy also play.\n'
'Output:\n'
'### Response:\n'
'[\n'
' ["AFC Ajax (amateurs)", "has ground", "Sportpark De '
'Toekomst"],\n'
' ["Ajax Youth Academy", "plays at", "Sportpark De Toekomst"]\n'
']'}- Đảm bảo cấu trúc prompt nhất quán trên tất cả các mẫu,
- Xử lý các đầu vào tùy chọn một cách gọn gàng,
- Tạo ra một trường
"text"duy nhất hoạt động liền mạch với các bộ phân tích từ, - Tương thích với các quy trình LoRA, QLoRA và tinh chỉnh toàn diện.
Khi đã được định dạng, bộ dữ liệu này có thể được trực tiếp chuyển sang dạng token và đưa vào vòng lặp huấn luyện bằng Hugging Face Trainer, SFTTrainer hoặc mã PyTorch tùy chỉnh. Mẹo:
Luôn kiểm tra một vài mẫu đã được định dạng trước khi huấn luyện. Những sự không nhất quán nhỏ trong định dạng có thể ảnh hưởng đáng kể tới hành vi của mô hình trong quá trình tinh chỉnh.
Tạo Dữ Liệu cho Việc Tinh Chỉnh Mô Hình Ngôn Ngữ Lớn Theo Lĩnh Vực Cụ Thể
Để tinh chỉnh một mô hình ngôn ngữ lớn cho một lĩnh vực cụ thể, chẳng hạn như chăm sóc sức khỏe, pháp lý, tài chính hoặc giáo dục, cần phải thu thập dữ liệu thô.
Phần này trình bày một phương pháp có cấu trúc để tạo dữ liệu tinh chỉnh chất lượng cao, chuyên biệt cho từng lĩnh vực. Xác định Phạm vi Lĩnh vực và Nhiệm vụ Mục tiêu: Bắt đầu bằng cách xác định rõ ràng những gì mô hình nên học và cách nó sẽ được sử dụng. Tinh chỉnh chuyên biệt theo lĩnh vực hiệu quả nhất khi phạm vi hẹp và hướng tới nhiệm vụ cụ thể.
Các câu hỏi chính cần trả lời:
- Mô hình nên chuyên môn hóa trong lĩnh vực kiến thức nào?
- Người dùng sẽ thực hiện những nhiệm vụ gì bằng cách sử dụng mô hình này?
- Các phản hồi nên phản ánh trình độ chuyên môn ở mức nào?
Ví dụ:
- Chăm sóc sức khỏe: tóm tắt ghi chú lâm sàng, giải thích khái niệm y học
- Tài chính: giải thích các chỉ số tài chính, phân tích lợi nhuận
- DevOps: phân tích nhật ký, xử lý sự cố
Một phạm vi được xác định rõ giúp ngăn dữ liệu nhiễu hoặc không liên quan làm giảm hiệu suất của mô hình. Thu thập dữ liệu lĩnh vực chất lượng cao: Bộ dữ liệu theo lĩnh vực nên được lấy từ các tài liệu đáng tin cậy và có thẩm quyền.
Các nguồn dữ liệu phổ biến bao gồm:
- Tài liệu nội bộ và cơ sở tri thức
- Báo cáo chuyên ngành và các ấn phẩm nghiên cứu
- Sổ tay kỹ thuật và tài liệu sản phẩm
- Phiếu hỗ trợ, Câu hỏi thường gặp và tương tác với khách hàng
- Bản chép lại hoặc ghi chú từ các chuyên gia về lĩnh vực
Đảm bảo rằng tất cả việc thu thập dữ liệu tuân thủ các yêu cầu về quyền riêng tư, bảo mật và cấp phép.
Chuyển đổi Nội dung Thô thành các cặp Hướng dẫn–Phản hồi: Văn bản thô trong lĩnh vực phải được chuyển đổi thành các ví dụ học có giám sát để dạy mô hình cách phản hồi các truy vấn chuyên môn cụ thể.
Mỗi mẫu nên đại diện cho một nhiệm vụ thực tế mà mô hình được kỳ vọng thực hiện.
Ví dụ (Tài chính):
- Hướng dẫn: Giải thích EBITDA và vai trò của nó trong việc định giá công ty.
- Phản hồi: EBITDA đại diện cho lợi nhuận trước lãi vay, thuế, khấu hao tài sản cố định và khấu hao tài sản vô hình, và thường được sử dụng để đánh giá hiệu quả hoạt động của một công ty.
Sự chuyển đổi này có thể được thực hiện thủ công, bán tự động với sự hỗ trợ của LLM, hoặc hoàn toàn bằng chương trình kèm theo kiểm tra xác thực. Sử dụng Cấu trúc Gợi ý Nhất quán: Sự nhất quán trong định dạng là rất quan trọng để tinh chỉnh ổn định. Một mẫu gợi ý chuẩn hóa giúp mô hình học các ranh giới của nhiệm vụ và kỳ vọng về phản hồi.
Định dạng điều chỉnh hướng dẫn được khuyến nghị:
### Instruction:
<Task description>
### Input:
<Optional domain context>
### Response:
<Expected output>Cấu trúc này tương thích rộng rãi với các pipeline tinh chỉnh theo kiểu Alpaca, kiểu Dolly và dựa trên LLaMA.
Định dạng dữ liệu miền một cách lập trình: Khi các cặp hướng dẫn–phản hồi đã được xác định, chúng có thể được chuyển đổi thành các mẫu văn bản sẵn sàng cho việc huấn luyện.
def format_domain_example(example):
instruction = example["instruction"]
context = example.get("context", "")
response = example["response"]
sections = [f"### Instruction:\n{instruction}"]
if context.strip():
sections.append(f"### Input:\n{context}")
sections.append(f"### Response:\n{response}")
return {"text": "\n".join(sections)}Trường “text” kết quả có thể được phân tách token trực tiếp và đưa vào các quy trình tinh chỉnh có giám sát. Xác minh Chất lượng Dữ liệu Trước khi Tinh chỉnh: Trước khi bắt đầu huấn luyện, hãy xem xét thủ công một tập mẫu con để đảm bảo dữ liệu là chính xác về mặt thực tế, các hướng dẫn đúng và rõ ràng, và các phản hồi có chất lượng.
Dữ liệu chất lượng kém, ngay cả với số lượng nhỏ, cũng có thể ảnh hưởng đáng kể đến cách một mô hình hoạt động sau khi tinh chỉnh. Để biết thêm thông tin về chủ đề này, bạn có thể tham khảo bài blog chi tiết về LLM Poisoning.
Chọn Chiến Lược Tinh Chỉnh Phù Hợp: Đối với hầu hết các trường hợp sử dụng theo lĩnh vực:
- LoRA/QLoRA cung cấp khả năng thích ứng nhanh chóng và tiết kiệm chi phí
- Tối ưu hóa toàn bộ cung cấp hiệu suất tối đa với chi phí cao hơn
Hầu hết các đội đạt được kết quả tốt khi sử dụng điều chỉnh tinh vi có giám sát dựa trên LoRA với dữ liệu được tuyển chọn kỹ lưỡng. Chúng tôi đã tạo một hướng dẫn từng bước cho thấy cách sử dụng LoRA để tinh chỉnh mô hình với bộ dữ liệu tùy chỉnh. Hãy xem phần tài nguyên để biết thêm thông tin.
Tạo Dữ Liệu Tinh Chỉnh Theo Miền Cụ Thể Thông Qua Thu Thập Dữ Liệu Web
Web scraping là một cách thực tế để thu thập nội dung chuyên môn từ tài liệu công khai, blog hoặc cơ sở tri thức. Sau khi được thu thập, văn bản thô này có thể được chuyển đổi thành các cặp hướng dẫn–phản hồi để tinh chỉnh có giám sát.
Cảnh báo: Luôn đảm bảo rằng trang web cho phép việc thu thập dữ liệu và được thực hiện một cách có đạo đức.
Bước 1: Cài đặt các Thư viện Yêu cầu
Sử dụng pip để cài đặt các thư viện cần thiết.
pip install requests beautifulsoup4Bước 2: Thu thập nội dung bằng Beautiful Soup
Trong ví dụ này, chúng ta lấy tiêu đề và đoạn văn từ một trang tài liệu kỹ thuật.
import requests
from bs4 import BeautifulSoup
def scrape_page(url):
response = requests.get(url, timeout=10)
response.raise_for_status()
soup = BeautifulSoup(response.text, "html.parser")
title = soup.find("h1")
paragraphs = soup.find_all("p")
content = {
"title": title.get_text(strip=True) if title else "",
"paragraphs": [
p.get_text(strip=True)
for p in paragraphs
if len(p.get_text(strip=True)) > 100
]
}
return contentBước 3: Chuyển đổi nội dung thu thập được thành các cặp Hướng dẫn–Phản hồi
Sau khi thu thập dữ liệu, chúng tôi chuyển đổi văn bản thô thành các mẫu huấn luyện phù hợp để điều chỉnh theo hướng dẫn.
def create_instruction_data(scraped_content):
instruction = (
f"Explain the following topic in a clear and concise manner: "
f"{scraped_content['title']}"
)
response = " ".join(scraped_content["paragraphs"])
return {
"instruction": instruction,
"response": response
}Bước 4: Định dạng Dữ liệu để Tinh chỉnh LLM
Cuối cùng, định dạng các cặp hướng dẫn–phản hồi thành một trường nhắc duy nhất.
def format_for_finetuning(example):
text = (
f"### Instruction:\n{example['instruction']}\n\n"
f"### Response:\n{example['response']}"
)
return {"text": text}Bước 5: Ví dụ toàn diện
url = "https://linux-console.net/community/tutorials/deploy-coreflux-mqtt-mongodb
"
scraped = scrape_page(url)
instruction_data = create_instruction_data(scraped)
formatted_sample = format_for_finetuning(instruction_data)
print(formatted_sample["text"][:500])### Instruction:
Explain the following topic in a clear and concise manner: Deploy Coreflux MQTT Broker with MongoDB on Linux-Console.net
### Response:
MQTT brokersare essential for modernIoTinfrastructure andautomationsystems, where the need for a centralized, unified, and fast data hub is the key part for system interoperability and data exchange.Corefluxis a powerful,low codeMQTT broker that expands the traditional MQTT broker to a system that provides advanced features forreal-time dataprocessinTạo Dữ Liệu Tổng Hợp Sử Dụng LLMs (Không Cần API Trả Phí)
Thu thập và chú thích thủ công dữ liệu chuyên ngành thường tốn kém và mất nhiều thời gian. Một phương án thực tiễn là tạo dữ liệu tổng hợp bằng cách sử dụng LLM, trong đó một LLM được dùng để tạo các cặp chỉ dẫn–phản hồi thực tế ở quy mô lớn. Thường thì chúng ta có thể sử dụng khóa API GROQ hoặc bất kỳ dịch vụ trả phí nào khác để dùng LLM tạo dữ liệu tổng hợp, nhưng trong quy trình dữ liệu này, chúng tôi sẽ hướng dẫn cách tạo dữ liệu hỗ trợ khách hàng tổng hợp bằng LLM miễn phí chạy cục bộ từ Hugging Face, không yêu cầu bất kỳ khóa API hay dịch vụ trả phí nào.
Ví dụ: Trình tạo dữ liệu hỗ trợ khách hàng tổng hợp
Ví dụ sau sử dụng thư viện transformers của Hugging Face với một mô hình mã nguồn mở nhẹ (flan-t5-base) để tạo các cặp hướng dẫn–phản hồi cho các tình huống hỗ trợ khách hàng.
Cài đặt các phụ thuộc
pip install transformers torchMã Python: Tạo Dữ liệu Tổng hợp Sử dụng Mô hình Ngôn ngữ Cục bộ
import random
import json
from transformers import pipeline
class FreeSyntheticDataGenerator:
def __init__(self):
# Instruction-tuned model
self.generator = pipeline(
"text2text-generation",
model="google/flan-t5-base"
)
self.templates = {
"order_inquiry": [
"Where is my order #{order_id}?",
"Can you track order #{order_id}?",
"What is the status of order #{order_id}?"
],
"return_request": [
"I want to return my {product}",
"How do I get a refund for {product}?"
],
"technical_support": [
"My {device} is not turning on.",
"I am facing error code {error_code} on {software}"
]
}
self.variables = {
"order_id": ["12345", "67890", "ABC999"],
"product": ["laptop", "phone", "headphones"],
"device": ["laptop", "router", "tablet"],
"software": ["Windows", "Android", "website"],
"error_code": ["404", "E-001"]
}
def generate_examples(self, category, count=5):
dataset = []
for _ in range(count):
instruction = random.choice(self.templates[category])
for var, values in self.variables.items():
instruction = instruction.replace(
f"{{{var}}}", random.choice(values)
)
prompt = f"""
You are a professional customer support agent.
Respond clearly and concisely.
Customer query: {instruction}
"""
response = self.generator(
prompt,
max_length=150,
do_sample=False
)[0]["generated_text"]
dataset.append({
"instruction": instruction,
"output": response.strip(),
"category": category
})
return dataset
if __name__ == "__main__":
generator = FreeSyntheticDataGenerator()
samples = generator.generate_examples("order_inquiry", 3)
print(json.dumps(samples, indent=2))Định Dạng Đầu Ra cho Tinh Chỉnh
Mỗi ví dụ được tạo ra tuân theo định dạng điều chỉnh theo hướng dẫn, phù hợp cho việc tinh chỉnh có giám sát (SFT):
[
{
"instruction": "What is the status of order #12345?",
"output": "Order #12345 has been placed.",
"category": "order_inquiry"
},
{
"instruction": "What is the status of order #12345?",
"output": "Your order is currently being processed and is expected to be delivered within the estimated delivery timeline.",
"category": "order_inquiry"
},
{
"instruction": "Where is my order #12345?",
"output": "Where is your order #12345?",
"category": "order_inquiry"
}
]Bạn cũng có thể thoải mái khám phá các tùy chọn miễn phí khác; tuy nhiên, nếu bạn đang sử dụng các tùy chọn API trả phí, bạn có thể sử dụng chúng để tạo dữ liệu tổng hợp chất lượng (và nhiều hơn thế). Dưới đây là một số ví dụ:
| Nhà cung cấp | Các mô hình chính | Tốt nhất cho | Ghi chú |
|---|---|---|---|
| OpenAI | GPT-4.1, GPT-4.1-Nano, GPT-4.5 | Văn bản chất lượng cao, theo hướng dẫn, mã, đa lượt | Được sử dụng rộng rãi; hệ sinh thái mạnh mẽ |
| Groq | LLaMA 3 (8B/16B) | Suy luận nhanh hơn; các cấp chi phí cố định | Sự kết hợp rất tốt giữa tốc độ và độ chính xác |
| Anthropic | Claude 3 (ví dụ, Claude 3 Opus) | Phản hồi thân thiện, an toàn | Tuyệt vời cho các trợ lý trò chuyện |
| Cohere | Lệnh R | Tạo ra thông tin được tăng cường bằng truy xuất | Tốt cho quy trình làm việc RAG |
| Google Vertex AI | Mô hình Gemini | Hỗ trợ đa phương thức | Tích hợp với các quy trình làm việc của GCP |
Tuy nhiên, các API trả phí đôi khi tốt hơn cho việc tạo dữ liệu tổng hợp vì chúng sử dụng các mô hình lớn được điều chỉnh theo hướng dẫn, được huấn luyện đặc biệt để thực hiện chính xác các yêu cầu và tạo ra các phản hồi có cấu trúc và chất lượng cao.
Không giống như các mô hình miễn phí hoặc cơ bản, các API trả phí hiểu được ý định, hướng dẫn vai trò và yêu cầu định dạng, điều này dẫn đến các kết quả đầu ra mạch lạc, liên quan và nhất quán trên hàng nghìn mẫu. Điều này làm giảm đáng kể các hiện tượng ảo tưởng, lặp lại và nội dung ngoài chủ đề, có nghĩa là dữ liệu được tạo ra cần ít công đoạn dọn dẹp thủ công hơn trước khi có thể sử dụng để tinh chỉnh.
Ngoài ra, các API trả phí tự động xử lý khả năng mở rộng, độ tin cậy và hiệu suất, cho phép các nhóm tạo ra khối lượng lớn dữ liệu tổng hợp một cách nhanh chóng và khiến chúng trở thành lựa chọn hiệu quả và dễ dàng hơn cho các bộ dữ liệu cấp sản xuất.
Tại sao Chất lượng Dữ liệu Quan trọng hơn Khối lượng Dữ liệu
Một trong những sai lầm phổ biến nhất khi tinh chỉnh là ưu tiên kích thước tập dữ liệu hơn chất lượng tập dữ liệu. Lượng lớn các ví dụ ồn, lặp đi lặp lại hoặc mơ hồ có thể thực sự làm giảm hiệu suất của mô hình. Ngược lại, một tập dữ liệu nhỏ hơn với hướng dẫn rõ ràng và câu trả lời chính xác thường cho kết quả tốt hơn nhiều.
Dữ liệu tinh chỉnh chất lượng cao có một vài đặc điểm xác định. Mỗi ví dụ tập trung vào một mục đích duy nhất, câu trả lời đầy đủ nhưng ngắn gọn, giọng điệu nhất quán trên toàn bộ bộ dữ liệu, và không có mâu thuẫn hay thông tin sai lệch. Nên tránh các ví dụ trùng lặp hoặc gần trùng lặp trừ khi việc lặp lại là có chủ đích để củng cố.
Theo nguyên tắc chung, hàng nghìn ví dụ được tuyển chọn kỹ lưỡng thường là đủ cho việc thích ứng theo lĩnh vực và hình thành hành vi. Chúng ta chỉ cần hàng chục nghìn mẫu khi muốn đạt chuyên môn sâu hoặc bao quát một phạm vi nhiệm vụ rất rộng.
Câu hỏi thường gặp
Cần bao nhiêu dữ liệu để tinh chỉnh một mô hình ngôn ngữ lớn (LLM)?
Lượng dữ liệu cần thiết phụ thuộc vào phương pháp tinh chỉnh và nhiệm vụ. Đối với các phương pháp tinh chỉnh hiệu quả về tham số như LoRA hoặc QLoRA, kết quả chất lượng cao thường có thể đạt được với chỉ từ 500 đến 5.000 cặp hướng dẫn–phản hồi. Tinh chỉnh toàn bộ mô hình thường yêu cầu tập dữ liệu lớn hơn nhiều, thường là hàng chục hoặc hàng trăm nghìn ví dụ. Trong hầu hết các trường hợp, chất lượng và sự phù hợp của dữ liệu quan trọng hơn khối lượng đơn thuần.
Tôi có thể tinh chỉnh một mô hình ngôn ngữ lớn (LLM) chỉ bằng dữ liệu tổng hợp không?
Đúng, các mô hình ngôn ngữ lớn (LLM) có thể được tinh chỉnh chỉ bằng dữ liệu tổng hợp, đặc biệt là đối với các nhiệm vụ được xác định rõ ràng như hỗ trợ khách hàng, tóm tắt hoặc hỏi đáp theo lĩnh vực cụ thể. Dữ liệu tổng hợp hoạt động tốt nhất khi được tạo ra bằng các mô hình đã được tinh chỉnh theo hướng dẫn và được kiểm tra qua các kiểm tra tự động cũng như đánh giá của con người. Nhiều hệ thống sản xuất sử dụng kết hợp dữ liệu tổng hợp và dữ liệu thực, nhưng dữ liệu tổng hợp chất lượng cao cũng vẫn có thể mang lại hiệu suất mạnh.
Định dạng dữ liệu nào tốt nhất cho việc tinh chỉnh LLM?
Định dạng được sử dụng phổ biến và khuyến nghị nhất là JSONL (JSON Lines), trong đó mỗi dòng đại diện cho một ví dụ huấn luyện. Đối với điều chỉnh theo hướng dẫn, điều này thường bao gồm các trường như instruction và output. JSONL được Hugging Face, PEFT (LoRA/QLoRA) và hầu hết các pipeline tinh chỉnh hỗ trợ rộng rãi, giúp dễ dàng truyền tải và mở rộng trong quá trình huấn luyện.
Việc chuẩn bị dữ liệu mất bao lâu?
Thời gian chuẩn bị dữ liệu thay đổi tùy thuộc vào kích thước và độ phức tạp của bộ dữ liệu. Đối với các bộ dữ liệu nhỏ đến trung bình (1.000–5.000 mẫu), việc chuẩn bị có thể mất từ vài giờ đến vài ngày, bao gồm cả việc làm sạch và xác thực. Các bộ dữ liệu lớn hoặc chuyên ngành có thể mất vài ngày hoặc vài tuần, đặc biệt nếu có sự tham gia xác thực của con người. Tự động hóa một số phần trong quy trình có thể giảm đáng kể thời gian này.
Bao lâu nên cập nhật dữ liệu tinh chỉnh?
Dữ liệu tinh chỉnh nên được cập nhật mỗi khi lĩnh vực, hành vi người dùng hoặc yêu cầu thay đổi. Đối với các sản phẩm phát triển nhanh hoặc hệ thống hỗ trợ khách hàng, việc cập nhật mỗi vài tuần hoặc vài tháng là điều phổ biến. Việc cập nhật thường xuyên giúp mô hình duy trì độ chính xác, giảm sự lệch hướng và thích ứng với thuật ngữ, chính sách hoặc kỳ vọng mới của người dùng.
Kết luận
Chuẩn bị dữ liệu chất lượng cao là bước quan trọng trong việc tinh chỉnh LLM thành công. Trong khi việc chọn mô hình và kỹ thuật huấn luyện thường nhận được nhiều sự chú ý nhất, chính chất lượng, cấu trúc và độ phù hợp của dữ liệu mới quyết định hiệu quả hoạt động của mô hình sau khi được tinh chỉnh. Một quy trình dữ liệu được thiết kế tốt bao gồm thu thập, làm sạch, xác thực, kiểm tra thiên lệch và đánh giá của con người sẽ đảm bảo mô hình học đúng cách hành vi và tạo ra kết quả đáng tin cậy, phù hợp.
Như bài viết này đã trình bày, việc chuẩn bị dữ liệu không nhất thiết phải chỉ dựa vào các bộ dữ liệu đắt tiền hoặc khó tìm. Dữ liệu tổng hợp được tạo ra bằng các mô hình ngôn ngữ lớn được tinh chỉnh theo hướng dẫn, khi kết hợp với các biện pháp kiểm soát chất lượng thích hợp, có thể là giải pháp hiệu quả và có thể mở rộng cho nhiều trường hợp sử dụng tinh chỉnh. Bằng cách xuất dữ liệu theo các định dạng tiêu chuẩn và liên tục cập nhật khi các yêu cầu thay đổi, các nhóm có thể xây dựng quy trình làm việc tinh chỉnh vừa hiệu quả vừa bền vững cho tương lai. Cuối cùng, việc đầu tư thời gian vào chuẩn bị dữ liệu dẫn đến các mô hình ổn định hơn, khả năng tổng quát tốt hơn và hiệu suất thực tế mạnh mẽ hơn.
Tài liệu tham khảo và nguồn lực
- Tạo bộ dữ liệu của riêng bạn để thử nghiệm tinh chỉnh trên các mô hình GPT
- Chuẩn bị dữ liệu cho việc tinh chỉnh các mô hình ngôn ngữ lớn
- Tối Ưu Hóa Mô Hình Ngôn Ngữ Lớn: Hướng Dẫn Kèm Ví Dụ
- Hiểu về việc đầu độc mô hình ngôn ngữ lớn
Cảm ơn bạn đã học cùng cộng đồng Linux-Console.net.
