Với sự phát triển của các mô hình LLM như ChatGPT, các công ty đã gấp rút thương mại hóa các ứng dụng deep learning dựa trên ngôn ngữ. Các công ty như Duolingo và Blinkist đang xây dựng các ứng dụng trò chuyện giáo dục, các công ty như Cocounsel đang xây dựng các mô hình phân tích tài liệu và một số, như MedGPT, thậm chí đang xây dựng các mô hình chuyên biệt có thể thực hiện những việc như chẩn đoán y tế. Trong bài viết trước, tôi đã viết về cách ai đó có thể sử dụng ChatGPT và kỹ thuật nhắc nhở để xây dựng một bộ phân tích tài liệu mạnh mẽ.
Để hỗ trợ các ứng dụng LLM dành riêng cho miền và mạnh mẽ hơn, các nhà cung cấp công nghệ đã cung cấp nhiều giải pháp đám mây. Ví dụ: OpenAI, công ty đứng sau ChatGPT, đã cung cấp một API tinh chỉnh đơn giản nhưng mạnh mẽ cho người dùng, cho phép người dùng xây dựng mô hình ngôn ngữ của riêng họ dựa trên công nghệ GPT3. Google, không chịu thua kém, đã tạo ra mô hình văn bản bison của họ, được nhiều người coi là đối thủ cạnh tranh có năng lực với GPT 3 và GPT 3.5, có sẵn để tinh chỉnh thông qua nền tảng Google Cloud. Trong bài viết trước, tôi đã viết về cách sử dụng API tinh chỉnh để tạo LLM chuyên gia về miền.
Những dịch vụ này có thể mạnh mẽ đến mức một công ty đang xem xét đầu tư nghiêm túc vào công nghệ LLM sẽ muốn học cách đào tạo các mô hình của riêng họ từ các công nghệ nguồn mở. So với việc sử dụng các điểm cuối do nhà cung cấp này cung cấp, việc đào tạo mô hình của riêng bạn mang lại những lợi ích sau :
Trong bài viết này, chúng tôi sẽ sử dụng một mô hình LLM nguồn mở phổ biến và có khả năng, huấn luyện nó trên dữ liệu của riêng chúng tôi tương tự như những gì chúng tôi đã làm trong bài viết trước và xác thực kết quả. Mặc dù ví dụ mà chúng tôi đang giải quyết là phi thương mại và dựa trên thông tin công khai, nhưng các kỹ thuật này có thể dễ dàng áp dụng chéo cho các nỗ lực thương mại. Chúng tôi sẽ đi sâu vào các đề xuất cụ thể về những ứng dụng thương mại nào có thể được xây dựng bằng kỹ thuật này trong phần “Mô hình LLM chuyên gia”, nơi chúng tôi xác định vấn đề mà chúng tôi sẽ giải quyết trong bài viết này.
Đối với thử nghiệm hôm nay, chúng tôi sẽ dựa vào Flan-T5 Large, một mô hình ngôn ngữ lớn do Google phát hành. Mặc dù đây không phải là công nghệ làm nền tảng cho Bard nhưng mô hình này được nhiều người coi là có khả năng cạnh tranh với các công nghệ dựa trên GPT. Tuy nhiên, điều ấn tượng ở các mẫu Flan T5 là chúng đạt được kết quả khả quan khi sử dụng ít thông số hơn nhiều so với các mẫu dựa trên GPT. Chẳng hạn, ngay cả phiên bản XL của mẫu cũng chỉ có 3 tỷ thông số, so với GPT3 có 175 tỷ.
Do tính nhỏ gọn này nên việc đào tạo và lưu trữ các mô hình này trên tài sản điện toán đám mây tương đối rẻ. Ngoài ra, dòng mô hình Flan-T5 được phát hành với giấy phép Apache, cho phép sử dụng thương mại, giảm bớt những vấn đề đau đầu về giấy phép tiềm ẩn đi kèm với một số LLM nguồn mở khác. Ví dụ, LLaMa của Facebook vẫn chỉ có sẵn cho mục đích nghiên cứu và phi thương mại.
Để viết bài này, tôi đã thử nghiệm một số loại nhiệm vụ khác nhau để kiểm tra tính hiệu quả của công nghệ. Nhìn chung, Flan-T5, đặc biệt là biến thể XL, dường như có khả năng hiểu ngôn ngữ tự nhiên rất tốt tương tự như một số mẫu GPT trên thị trường. Tuy nhiên, mô hình có phần thiếu sót khi vẽ các kết nối trừu tượng và gặp một số khó khăn khi tạo đầu ra dài. Vì vậy, người ta nên chú ý chọn đúng mô hình cho đúng nhiệm vụ.
Replica là một công ty cung cấp Nền tảng dưới dạng dịch vụ cho phép mọi người thuê GPU để đào tạo và chạy các mô hình AI lớn với mức giá phải chăng. Bộ công cụ quản lý mô hình AI của họ cho phép người dùng tập trung làm việc với dữ liệu thay vì quản lý tài nguyên máy chủ.
Để viết bài viết này, tôi đã thử một số dịch vụ PaaS đào tạo AI bao gồm AWS SageMaker, Google Colab và PaperSpace gradient. Replica cho đến nay là nền tảng dễ bắt đầu nhất và đưa ra mức giá rất cạnh tranh so với các dịch vụ khác được đề cập.
Python là ngôn ngữ chung của kỹ thuật dữ liệu. Hệ sinh thái rộng lớn cho phép các lập trình viên nhanh chóng tiếp thu, phân tích và xử lý dữ liệu. Hầu hết các nền tảng đào tạo AI lớn đều có hỗ trợ tốt nhất cho Python, điều này giúp công việc của chúng tôi dễ dàng hơn nhiều. Nhờ khả năng tích hợp tuyệt vời của Replica, hôm nay chúng tôi sẽ viết tất cả mã của mình bằng Python.
Vì dòng mô hình Flan-T5 hiểu văn bản tốt hơn nhiều so với việc tạo văn bản nên chúng tôi muốn chọn một tác vụ nặng về đầu vào nhưng nhẹ về đầu ra. Bộ phân loại ngôn ngữ tự nhiên là trường hợp sử dụng hoàn hảo cho loại kịch bản này, vì vậy hôm nay chúng ta sẽ xây dựng bộ nhận dạng nhà viết kịch. Cụ thể, chúng tôi sẽ đưa ra các đoạn văn mẫu của William Shakespeare hoặc Anton Chekhov và xem liệu chúng tôi có thể dạy người mẫu xác định nhà viết kịch dựa trên phong cách viết và lựa chọn từ ngữ hay không.
Tất nhiên, vì đây là hướng dẫn công khai nên chúng tôi cố tình chọn một mô hình có dữ liệu công khai và dễ truy cập. Tuy nhiên, điều này có thể dễ dàng được điều chỉnh cho phù hợp với bối cảnh thương mại . Dưới đây là một số ví dụ trong đó trình phân loại ngôn ngữ tự nhiên có thể hữu ích:
Để tạo dữ liệu huấn luyện, chúng ta có thể tải xuống một số vở kịch của Anton Chekhov và William Shakespeare từ Project Gutenberg. Để thiết lập việc nhập dữ liệu, chúng ta có thể chạy tập lệnh Python sau.
import requests import openai import replicate import os import pandas as pd import random texts = { 'chekhov': 'https://www.gutenberg.org/files/7986/7986-0.txt', 'chekhov_2': 'https://www.gutenberg.org/cache/epub/1755/pg1755.txt', 'shakespeare_midsummer': 'https://www.gutenberg.org/cache/epub/1514/pg1514.txt', 'shakespeare_romeo_juliet': 'https://www.gutenberg.org/cache/epub/1112/pg1112.txt', 'shakespeare_macbeth': 'https://www.gutenberg.org/cache/epub/2264/pg2264.txt', 'shakespeare_hamlet': 'https://www.gutenberg.org/cache/epub/2265/pg2265.txt', }
Bây giờ chúng ta tạo thư mục dữ liệu đào tạo và tải xuống các văn bản:
if not os.path.exists('training_text'): os.mkdir('training_text') for name, url in texts.items(): print(name) res = requests.get(url) with open(os.path.join('training_text', '%s.txt' % name), 'w') as fp_write: fp_write.write(res.text)
Bạn sẽ thấy một số kết quả đầu ra như thế này để cho bạn thấy nó đã thành công:
chekhov chekhov_2 shakespeare_midsummer shakespeare_romeo_juliet shakespeare_macbeth Shakespeare_hamlet
Bạn cũng có thể kiểm tra thư mục Training_text để xem các tệp đã được tải xuống đúng cách chưa.
Bây giờ chúng tôi muốn đọc lại các tệp này vào bộ nhớ và chia chúng thành danh sách các dòng. Trong khi thực hiện, chúng tôi sẽ đếm số dòng trong mỗi tệp.
lines_by_file = {} for fn in os.listdir('training_text'): if not fn.endswith('.txt'): continue with open(os.path.join('training_text', fn)) as fp_file: lines_by_file[fn.split('.')[0]] = '\n'.join(fp_file.readlines()) print(fn, len(lines_by_file[fn.split('.')[0]]))
Bạn sẽ thấy đầu ra như dưới đây:
shakespeare_midsummer.txt 120198 shakespeare_romeo_juliet.txt 179726 shakespeare_macbeth.txt 140022 shakespeare_hamlet.txt 204169 chekhov.txt 419063 chekhov_2.txt 148324
Bây giờ đến phần thú vị. Chúng tôi muốn chia các dòng thành dữ liệu đào tạo thực sự. Để làm như vậy, trước tiên chúng tôi xóa 1000 dòng đầu tiên và cuối cùng, được chiếm bởi nội dung giới thiệu, đầu trang và chân trang. Sau đó, chúng ta sẽ lấy văn bản còn lại 50 dòng cùng một lúc. Sau đó, chúng tôi sẽ biến 50 dòng này thành một cặp nhắc nhở và hoàn thành.
train_data = [] for k in lines_by_file: is_chekhov = 'chekhov' in k useful_lines = lines_by_file[k].split('\n')[1000:-1000] prompt_fmt = "Which playwright wrote the following passage? \n ==== \n %s \n ====" for i in range(0, len(useful_lines), 50): training_set = useful_lines[i: i+50] train_data.append({ 'prompt': prompt_fmt % '\n'.join(training_set), 'completion': 'Anton Chekhov' if is_chekhov else 'William Shakespeare' })
Vì vậy, bây giờ chúng ta đã xác định rõ ràng vấn đề - với 50 dòng văn bản từ một vở kịch, hãy xác định xem nhà viết kịch là Anton Chekov hay William Shakespeare. Chúng ta vẫn chưa xong đâu. Chúng tôi cần ghi dữ liệu vào định dạng jsonl (Dòng JSON) để đào tạo và chúng tôi cũng muốn đặt trước một số mẫu cho mục đích thử nghiệm. Chạy đoạn mã sau như vậy:
df = pd.DataFrame(train_data) df_chekhov = df[df['completion'] == 'Anton Chekhov'] df_shakespeare = df[df['completion'] == 'William Shakespeare'] chekhov_test_indices = random.sample(df_chekhov.index.tolist(), 15) shakespeare_test_indices = random.sample(df_shakespeare.index.tolist(), 15) df_chekhov_test = df_chekhov.loc[chekhov_test_indices] df_shakespeare_test = df_shakespeare.loc[shakespeare_test_indices] df_chekhov_train = df_chekhov.loc[[i for i in df_chekhov.index if i not in chekhov_test_indices]] df_shakespeare_train = df_shakespeare.loc[[i for i in df_shakespeare.index if i not in shakespeare_test_indices]] pd.concat([df_chekhov_train, df_shakespeare_train]).to_json('chekhov_shakespeare_train.jsonl', orient='records', lines=True) pd.concat([df_chekhov_test, df_shakespeare_test]).to_json('chekhov_shakespeare_test.jsonl', orient='records', lines=True)
Tất nhiên, nếu bạn muốn sử dụng toàn bộ kho văn bản để huấn luyện, bạn chỉ cần chạy
pd.DataFrame(train_data).to_json('output.jsonl', orient='records', lines=True)
.
Chúng ta cần thực hiện hai việc trước khi có thể thực hiện quá trình đào tạo - trước tiên, chúng ta cần tải dữ liệu đào tạo lên một nơi nào đó có thể truy cập được bằng cách sao chép. Một cách rất dễ dàng để thực hiện việc này là tải tệp lên nhóm đám mây của Google, đặt nhóm và tệp ở chế độ công khai, đồng thời cung cấp url ở định dạng https://storage.googleapis.com/<bucket_name>/<file_name>
.
Tiếp theo, chúng ta cần tạo một đích đến. Để thực hiện việc này, chỉ cần đăng nhập vào Sao chép (bạn có thể thực hiện thông qua Github OAuth) và tạo mô hình mới. Sau khi mô hình được tạo và đặt tên, bạn sẽ có thể đẩy mô hình của mình vào không gian này.
Sau khi mọi thứ đã được thiết lập, bạn có thể bắt đầu khóa đào tạo như sau:
training = replicate.trainings.create( version="[flant5-large location]", input={ "train_data": "[Data Location]", }, destination="[Destination]" ) print(training)
Bạn sẽ thấy một số kết quả cho bạn biết quá trình đào tạo đang bắt đầu. Đợi vài phút và kiểm tra lại phần đào tạo bằng cách chạy đoạn mã sau:
training.reload() print(training)
Bạn cũng có thể theo dõi tiến độ đào tạo trên trang web Replicate. Sau khi quá trình đào tạo hoàn tất, bạn có thể tải lại đối tượng đào tạo để lấy tên đầu ra và tiến hành bước tiếp theo.
Xin lưu ý rằng có những khoảng thời gian tài nguyên GPU khan hiếm và bạn có thể gặp lỗi "đào tạo không thành công". Nếu điều này xảy ra với bạn, chỉ cần đợi vài giờ và thử lại. Thiếu GPU và các nhà cung cấp PaaS cũng không tránh khỏi!
Được rồi! Bây giờ chúng ta đã có mô hình tinh chỉnh, chúng ta cần thử nghiệm nó. Hãy nhớ rằng chúng tôi đã dành 15 đoạn văn của Chekhov và Shakespeare để kiểm tra. Chúng ta có thể sử dụng chúng ở đây như sau:
for _, row in df_chekhov_test.iterrows(): output = replicate.run( training.output["version"], input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('')
Sau một thời gian khởi động ngắn, bạn sẽ thấy kết quả được in ra bàn điều khiển. Mô hình phải cực kỳ chính xác và trả về “Anton Chekhov” mỗi lần. Hãy thử điều này với Shakespeare:
for _, row in df_shakespeare_test.iterrows(): output = replicate.run( training.output["version"], input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('')
Tương tự như ví dụ của Chekhov, bạn sẽ thấy rằng mô hình này có thể nhận dạng Shakespeare mọi lúc.
Để có biện pháp tốt, hãy xem liệu mô hình cơ sở có thể xác định được Shakespeare hay Chekhov hay không:
for _, row in df_shakespeare_test.iterrows(): output = replicate.run( "[base flant5-large location]", input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('') for _, row in df_chekhov_test.iterrows(): output = replicate.run( "[base flant5-large location]", input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('')
Bạn sẽ thấy rằng mô hình cơ sở không thể xác định một cách đáng tin cậy nhà viết kịch cho cùng một đoạn văn. Điều này cho thấy rằng việc tinh chỉnh của chúng tôi đã cung cấp cho mô hình thông tin mới một cách đáng tin cậy và chúng tôi đã xây dựng cho mình một bộ phân loại nhà viết kịch bằng ngôn ngữ tự nhiên!
Trong bài viết hôm nay, chúng tôi đã đào tạo một trình phân loại ngôn ngữ tự nhiên đơn giản dựa trên Flan-T5, một mô hình ngôn ngữ lớn do Google cung cấp. Do kích thước nhỏ gọn và giấy phép cho phép, Flan-T5 có thể được đào tạo và triển khai trên cơ sở hạ tầng tư nhân, điều này khiến nó trở nên khác biệt so với nhiều mẫu phổ biến khác trên thị trường, chẳng hạn như ChatGPT.
Mặc dù ví dụ ngày nay dựa trên dữ liệu công khai và rõ ràng là phi thương mại, bằng chứng về khái niệm này có thể dễ dàng được điều chỉnh cho phù hợp với nhiều ứng dụng thương mại khác như đã nêu ở trên. Nếu bạn có ý tưởng với LLM mà bạn muốn biến thành hiện thực, vui lòng bắt đầu cuộc trò chuyện bằng cách truy cập trang GitHub hoặc LinkedIn của tôi. Ngoài ra, vui lòng đọc các bài viết LLM trước đây của tôi, bao gồm một bài về Xây dựng Trình phân tích tài liệu bằng ChatGPT và Tạo LLM chuyên gia miền bằng API tinh chỉnh của OpenAI .
Chúc bạn hack vui vẻ!