Создание локального ИИ
創建於:2025年1月18日
創建於:2025年1月18日
Laying down the groundwork
First, I'll think through the AI scope and target tasks. Then, I'll gather Python tools and frameworks to support local inference and training.
Thought about создание локального ИИ для 6 секунд
Ниже приведён обобщённый план шагов, которые помогут вам разобраться, с чего начать создание собственного «локального» ИИ на Python. Понятие «ИИ» (искусственный интеллект) достаточно широкое, поэтому я постараюсь дать общую структуру, которую потом можно адаптировать под конкретную задачу (компьютерное зрение, обработка текста, чат-бот и т.д.).
Выберите задачу
Определите критерии успеха
Уточните требования к оборудованию
Установка Python 3.8+ (или выше)
Создание виртуального окружения (желательно)
python -m venv myenv source myenv/bin/activate # для Linux/Mac myenv\Scripts\activate # для Windows
Установка необходимых библиотек
numpy
, pandas
, matplotlib
, scipy
.scikit-learn
.tensorflow
или torch
(PyTorch).transformers
(библиотека Hugging Face), sentencepiece
и др.Пример установки:
pip install numpy pandas matplotlib scikit-learn torch torchvision torchaudio transformers
Сбор датасета
Анализ и очистка данных
Разделение на обучающую/валидационную/тестовую выборки
train_test_split
(из sklearn.model_selection
).Если ваша задача не требует глубоких нейронных сетей, можно начать с библиотек scikit-learn
:
from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # Предположим, у вас есть данные X, y X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) model = RandomForestClassifier(n_estimators=100) model.fit(X_train, y_train) predictions = model.predict(X_test) print("Accuracy:", accuracy_score(y_test, predictions))
Для некоторых задач простые алгоритмы (Random Forest, SVM, XGBoost) могут быть очень эффективны и не требуют больших ресурсов.
Если вы хотите работать с нейронными сетями, есть два главных фреймворка:
TensorFlow (Keras)
import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers model = keras.Sequential([ layers.Dense(64, activation='relu', input_shape=(num_features,)), layers.Dense(1, activation='sigmoid') ]) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) model.fit(X_train, y_train, epochs=10, batch_size=32) test_loss, test_acc = model.evaluate(X_test, y_test) print("Test accuracy:", test_acc)
PyTorch
import torch import torch.nn as nn import torch.optim as optim class SimpleNet(nn.Module): def __init__(self, input_dim): super(SimpleNet, self).__init__() self.fc1 = nn.Linear(input_dim, 64) self.fc2 = nn.Linear(64, 1) def forward(self, x): x = torch.relu(self.fc1(x)) x = torch.sigmoid(self.fc2(x)) return x model = SimpleNet(input_dim=num_features) criterion = nn.BCELoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # Обучение for epoch in range(10): for X_batch, y_batch in train_loader: optimizer.zero_grad() outputs = model(X_batch) loss = criterion(outputs, y_batch) loss.backward() optimizer.step()
Для обработки естественного языка (NLP): библиотека Hugging Face Transformers.
Пример (генерация текста с GPT-2):
from transformers import GPT2LMHeadModel, GPT2Tokenizer tokenizer = GPT2Tokenizer.from_pretrained("gpt2") model = GPT2LMHeadModel.from_pretrained("gpt2") input_text = "Hello, I'm a language model," inputs = tokenizer.encode(input_text, return_tensors='pt') outputs = model.generate(inputs, max_length=50, num_return_sequences=1) generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True) print(generated_text)
Можно загрузить любую другую предобученную модель (GPT-2, GPT-Neo, Falcon и т.д.) и использовать локально (учитывая, что у вас достаточно ресурсов).
Для компьютерного зрения: PyTorch или TensorFlow предлагают модели (ResNet, VGG, EfficientNet и т.д.) через torchvision.models
или tf.keras.applications
.
accuracy
, f1_score
, roc_auc
, precision
, recall
и т.п.MAE
, MSE
, R^2
.from fastapi import FastAPI import torch app = FastAPI() # Предположим, что у вас есть модель model @app.post("/predict") def predict(data: dict): # preprocess data # x = ... with torch.no_grad(): prediction = model(x) return {"prediction": prediction.tolist()}
Написать «локальный» ИИ на Python вполне реально, начиная от простых моделей с scikit-learn
и заканчивая большими нейронными сетями на PyTorch/TensorFlow. Важно:
Если вы хотите сделать, к примеру, автономный чат-бот со своей моделью, можно использовать библиотеки вроде Hugging Face Transformers для загрузки и дообучения локальных языковых моделей. Если же у вас простая задача классификации текстов/изображений, достаточно Scikit-learn или более компактных сетей.
Удачи в создании вашего проекта на Python! Если возникнут конкретные вопросы (по выбору архитектуры, по отладке, по данным и т.д.) — задавайте их точечно, это ускорит решение.
Crafting an AI model
I’m thinking about developing a local text-based AI to choose the best words based on loaded text. Fine-tuning or partial training of models like GPT or using the Hugging Face Transformers library seems ideal.
Curating the approach
Considering either a local generative model, like GPT-2 or Llama, or a simpler Markov chain model. Opting for Hugging Face Transformers with a text corpus and fine-tuning a small GPT model.
Charting the course
I’m mapping out steps to prepare and tokenize data, use Hugging Face Transformers for fine-tuning GPT-2, and local implementation details. Including Russian and English examples.
Thought about текстовое ИИ на Python для 5 секунд
Ниже — пошаговый план, как можно создать локальную текстовую модель (упрощённо — «ИИ»), которая будет дополнять текст или предлагать следующие слова (или целые фразы) на основе вашего собственного набора данных (корпуса текстов). Предположим, что ваши тексты — это набор статей, заметок или любая другая текстовая информация, на которой вы хотите обучить модель.
Идея состоит в том, чтобы взять некую языковую модель (которая умеет «генерировать» текст), а затем дообучить её на вашем собственном наборе текстов. Таким образом, модель будет лучше «знать» стиль, лексику и тематику ваших текстов, чем универсальная модель из интернета.
Способов несколько:
Простая вероятностная модель (например, на основе цепей Маркова)
Современная нейросетевая модель (GPT-подобные модели)
Ретривер + готовая модель
Самое «гибкое» и популярное на момент написания — второй вариант (дообучение GPT-подобной модели). Ниже рассмотрим его.
python -m venv myenv source myenv/bin/activate # для Linux/Mac myenv\Scripts\activate # для Windows
transformers
(от Hugging Face) и, возможно, datasets
:
pip install transformers datasets torch
torch
(PyTorch) нужен для запуска моделей.torch
, соответствующую вашей системе с поддержкой CUDA (либо через pip install torch --index-url ...
, либо скачав с сайта PyTorch соответствующий колёсный файл).Допустим, у вас есть тексты в виде наборов .txt
файлов. Нужно объединить их в один датасет или организовать их так, чтобы их можно было удобно «скормить» модели.
my_corpus.txt
, разделяя их, например, пустыми строками.datasets
Пример кода (упрощённый):
import os folder_path = "path_to_your_texts" all_texts = [] for file_name in os.listdir(folder_path): if file_name.endswith(".txt"): with open(os.path.join(folder_path, file_name), "r", encoding="utf-8") as f: text = f.read() all_texts.append(text) # Теперь all_texts — это список строк, каждая строка — содержимое одного файла.
Если вы работаете с русским текстом, обратите внимание на:
Если тексты на английском, тогда проще взять стандартный gpt2
, gpt2-medium
или что-то посвежее вроде EleutherAI/gpt-neo-125M
.
Для начала возьмём что-нибудь не очень большое (чтобы на обычном компьютере можно было поэкспериментировать). В примере пусть будет gpt2
(английская версия), но вы можете сменить на sberbank-ai/rugpt3small_based_on_gpt2
для русского.
Нам нужно превратить тексты в токены, а затем сформировать обучающие образцы (chunks) длиной, скажем, 512 или 1024 токена.
Пример (на английской GPT-2):
from transformers import GPT2Tokenizer MODEL_NAME = "gpt2" # либо "sberbank-ai/rugpt3small_based_on_gpt2" для русского tokenizer = GPT2Tokenizer.from_pretrained(MODEL_NAME, padding_side="left") tokenizer.pad_token = tokenizer.eos_token # У GPT2 нет pad_token, укажем так # Предположим, у нас есть all_texts (список строк)
Теперь создадим один большой текст или сразу разобьём:
# Объединяем все тексты в одну большую строку all_data = "\n".join(all_texts) # Токенизируем tokens = tokenizer(all_data, return_tensors='pt') # Получаем тензоры input_ids = tokens["input_ids"].squeeze() # (числовые идентификаторы токенов)
Однако для обучения нужно разбить длинную последовательность токенов на батчи по 512-1024 и «сдвигать» выход на один токен. Обычно это делают с помощью datasets.Dataset.map(...)
, но можно и вручную.
Пример на базе Hugging Face Datasets (полезнее для более аккуратной подготовки):
from datasets import Dataset dataset = Dataset.from_dict({"text": all_texts}) def tokenize_function(examples): return tokenizer(examples["text"], truncation=True, max_length=1024) tokenized_dataset = dataset.map(tokenize_function, batched=True, num_proc=1) # Датасет с токенизированными данными
После этого часто делают group_texts
— группировку в блоки фиксированной длины. В документации Hugging Face есть готовые примеры скрипта Language Modeling Examples.
Допустим, мы берём GPT-2 и хотим её дообучить. В Hugging Face для этого есть класс Trainer
:
import torch from transformers import GPT2LMHeadModel, Trainer, TrainingArguments MODEL_NAME = "gpt2" # или другой model = GPT2LMHeadModel.from_pretrained(MODEL_NAME) training_args = TrainingArguments( output_dir="my_local_model", overwrite_output_dir=True, num_train_epochs=3, per_device_train_batch_size=2, save_steps=500, logging_steps=100, evaluation_strategy="no", # Или "steps" для валидации ) trainer = Trainer( model=model, args=training_args, train_dataset=tokenized_dataset, # eval_dataset=... (если есть отдельная валидационная выборка) ) trainer.train()
num_train_epochs=3
— количество эпох (цикл по всему датасету). Можно менять.per_device_train_batch_size=2
— размер батча (часто приходится уменьшать, если не хватает GPU-памяти).После окончания обучения модель сохранится в папке my_local_model/
(включая веса, токенизатор, конфигурацию).
После fine-tuning у вас будет папка (например, my_local_model
). Вы можете загрузить её и «просить» сгенерировать текст:
from transformers import GPT2LMHeadModel, GPT2Tokenizer model_path = "my_local_model" tokenizer = GPT2Tokenizer.from_pretrained(model_path) model = GPT2LMHeadModel.from_pretrained(model_path) prompt = "Например, начнём фразу о природе:" inputs = tokenizer(prompt, return_tensors='pt') input_ids = inputs["input_ids"] with torch.no_grad(): # Задаём параметры генерации generated_ids = model.generate( input_ids, max_length=100, num_return_sequences=1, temperature=0.7, top_p=0.9, do_sample=True ) generated_text = tokenizer.decode(generated_ids[0], skip_special_tokens=True) print(generated_text)
Если модель обучена на ваших текстах, стиль и лексика будут ближе к ним.
Важно: для русского текста берите соответствующую модель (например, sberbank-ai/rugpt3small_based_on_gpt2
) и тогда prompt
и тексты, соответственно, будут на русском.
from_pretrained("gpt2")
модель скачивается и кешируется в папку вроде ~/.cache/huggingface/transformers/
.from_pretrained("path/to/local/folder")
.Если ваша задача — просто «подсказать следующее слово» (а не генерировать длинные тексты), можно пользоваться той же моделью через метод model.generate()
, но останавливать генерацию после 1-2 слов, либо самому вычислять логиты:
# Пример "следующее слово" # Получаем распределение вероятностей после prompt outputs = model(**inputs) logits = outputs.logits # (batch_size, seq_len, vocab_size) last_token_logits = logits[:, -1, :] # логиты для последнего сгенерированного токена probs = torch.softmax(last_token_logits, dim=-1) # Находим top k слов top_k = 5 topk_probs, topk_indices = torch.topk(probs, top_k) for i in range(top_k): token_id = topk_indices[0, i].item() prob_val = topk_probs[0, i].item() word = tokenizer.decode([token_id]) print(word, prob_val)
Так модель будет говорить: «Вероятнее всего слово X, затем Y, затем Z и т.д.».
transformers
(Hugging Face).Это базовый каркас. В реальности может понадобиться:
Но в целом, описанный процесс позволит вам «запустить» локальную генеративную модель на основе ваших собственных данных. Это самый прямой путь к тому, чтобы у вас был «ИИ-движок», дополняющий и генерирующий текст в вашем стиле.
Удачи в обучении! Если возникнут уточняющие вопросы по коду, ошибкам или дальнейшему развитию — спрашивайте точечно.