Создание чата с искусственным интеллектом (ИИ) с собственной обучающей моделью — это сложная, но выполнимая задача.
Этапы реализации
-
Подготовка данных для обучения:
- Соберите тематические данные для обучения. Например, CSV-файл с вопросами и ответами.
- Используйте TF-IDF или простые эмбеддинги для поиска наиболее подходящего ответа.
-
Серверная часть на PHP:
- Реализуйте обработку сообщений пользователя и поиск ответа.
- Обучение может быть выполнено с использованием простых алгоритмов, таких как косинусное сходство.
-
Хранение данных:
- Используйте базу данных (например, MySQL) для хранения вопросов и ответов.
- Обработанные векторные представления (эмбеддинги) можно сохранять в файле или базе.
1. Структура данных для обучения
Создайте таблицу MySQL для хранения обучающих данных:
CREATE TABLE chat_data (
id INT AUTO_INCREMENT PRIMARY KEY,
question TEXT NOT NULL,
answer TEXT NOT NULL
);
2. PHP-код для обработки сообщений
<?php
// Подключение к базе данных
$host = 'localhost';
$dbname = 'chat_ai';
$username = 'root';
$password = '';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Ошибка подключения: " . $e->getMessage());
}
// Функция для поиска подходящего ответа
function getResponse($userInput, $pdo) {
// Извлекаем все вопросы и ответы из базы данных
$stmt = $pdo->query("SELECT question, answer FROM chat_data");
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
$bestMatch = null;
$highestSimilarity = 0;
foreach ($data as $item) {
$similarity = calculateSimilarity($userInput, $item['question']);
if ($similarity > $highestSimilarity) {
$highestSimilarity = $similarity;
$bestMatch = $item['answer'];
}
}
return $highestSimilarity > 0.2 ? $bestMatch : "Извините, я не понял ваш вопрос.";
}
// Функция для вычисления схожести (косинусное сходство)
function calculateSimilarity($input, $storedQuestion) {
$inputWords = array_count_values(str_word_count(strtolower($input), 1));
$storedWords = array_count_values(str_word_count(strtolower($storedQuestion), 1));
$commonWords = array_intersect_key($inputWords, $storedWords);
$dotProduct = 0;
$inputMagnitude = 0;
$storedMagnitude = 0;
foreach ($commonWords as $word => $count) {
$dotProduct += $inputWords[$word] * $storedWords[$word];
}
foreach ($inputWords as $count) {
$inputMagnitude += $count ** 2;
}
foreach ($storedWords as $count) {
$storedMagnitude += $count ** 2;
}
if ($inputMagnitude == 0 || $storedMagnitude == 0) {
return 0;
}
return $dotProduct / (sqrt($inputMagnitude) * sqrt($storedMagnitude));
}
// Обработка пользовательского ввода
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$userInput = $_POST['message'];
$response = getResponse($userInput, $pdo);
echo json_encode(['response' => $response]);
}
?>
3. Интерфейс чата (HTML + JavaScript) html Копировать код
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Чат с ИИ</title>
<style>
body { font-family: Arial, sans-serif; margin: 0; padding: 0; }
.chat-container { max-width: 600px; margin: 20px auto; }
.messages { border: 1px solid #ddd; padding: 10px; height: 300px; overflow-y: auto; }
.input-container { display: flex; margin-top: 10px; }
input[type="text"] { flex: 1; padding: 10px; border: 1px solid #ddd; }
button { padding: 10px 15px; border: none; background: #007BFF; color: white; cursor: pointer; }
</style>
</head>
<body>
<div class="chat-container">
<div class="messages" id="messages"></div>
<div class="input-container">
<input type="text" id="userMessage" placeholder="Введите сообщение...">
<button onclick="sendMessage()">Отправить</button>
</div>
</div>
<script>
function sendMessage() {
const userMessage = document.getElementById('userMessage').value;
const messages = document.getElementById('messages');
if (userMessage.trim() === '') return;
messages.innerHTML += `<div><strong>Вы:</strong> ${userMessage}</div>`;
document.getElementById('userMessage').value = '';
fetch('chat.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ message: userMessage })
})
.then(response => response.json())
.then(data => {
messages.innerHTML += `<div><strong>ИИ:</strong> ${data.response}</div>`;
messages.scrollTop = messages.scrollHeight;
});
}
</script>
</body>
</html>
Как обучить свою модель?
- Соберите больше данных:
- Вопросы и ответы на интересующие темы.
- Реализуйте улучшенную обработку текста:
- Удаление стоп-слов.
- Использование синонимов.
Автор: Евгений Морковин
0 комментариев