Perl AI Чат-бот
Реализация простого AI чатбота на Perl с использованием различных техник обработки естественного языка и машинного обучения.
1. Базовая структура чатбота
1.1 Основной класс чатбота
#!/usr/bin/perl
use strict;
use warnings;
use Text::Levenshtein;
use JSON;
use LWP::UserAgent;
package AIChatbot;
sub new {
my ($class, %args) = @_;
my $self = {
knowledge_base => {},
context => {},
user_agent => LWP::UserAgent->new,
api_key => $args{api_key} // '',
};
bless $self, $class;
$self->load_knowledge_base;
return $self;
}
Базовый класс чатбота с основными атрибутами и методами.
1.2 Загрузка базы знаний
sub load_knowledge_base {
my ($self) = @_;
my $kb_file = 'knowledge_base.json';
if (-e $kb_file) {
open(my $fh, '<', $kb_file) or die "Не могу открыть файл: $!";
my $json_text = do { local $/; readline($fh) };
close($fh);
$self->{knowledge_base} = JSON->new->decode($json_text);
} else {
$self->{knowledge_base} = {
'привет' => ['Здравствуйте! Как я могу вам помочь?', 'Привет! Чем могу быть полезен?'],
'пока' => ['До свидания! Хорошего дня!', 'Пока! Возвращайтесь!'],
'спасибо' => ['Пожалуйста! Обращайтесь!', 'Рад был помочь!'],
};
}
}
Метод загрузки базы знаний из JSON-файла или создание базовой базы знаний.
2. Обработка ввода
2.1 Предобработка текста
sub preprocess_text {
my ($self, $text) = @_;
# Приведение к нижнему регистру
$text = lc($text);
# Удаление специальных символов
$text =~ s/[^\w\s]//g;
# Удаление лишних пробелов
$text =~ s/\s+/ /g;
$text =~ s/^\s+|\s+$//g;
return $text;
}
Метод предобработки входного текста для улучшения распознавания.
2.2 Поиск похожих фраз
sub find_similar_phrase {
my ($self, $input) = @_;
my $best_match;
my $min_distance = 100;
foreach my $phrase (keys %{$self->{knowledge_base}}) {
my $distance = Text::Levenshtein::distance($input, $phrase);
if ($distance < $min_distance) {
$min_distance = $distance;
$best_match = $phrase;
}
}
return $min_distance <= 3 ? $best_match : undef;
}
Метод поиска похожих фраз в базе знаний с использованием расстояния Левенштейна.
3. Генерация ответов
3.1 Локальная генерация ответа
sub generate_local_response {
my ($self, $phrase) = @_;
if (exists $self->{knowledge_base}{$phrase}) {
my $responses = $self->{knowledge_base}{$phrase};
return $responses[int(rand(scalar @$responses))];
}
return "Извините, я не понимаю. Можете переформулировать вопрос?";
}
Метод генерации ответа на основе локальной базы знаний.
3.2 Использование внешнего API
sub generate_api_response {
my ($self, $input) = @_;
my $response = $self->{user_agent}->post(
'https://api.openai.com/v1/chat/completions',
Content_Type => 'application/json',
Authorization => "Bearer $self->{api_key}",
Content => JSON->encode({
model => "gpt-3.5-turbo",
messages => [
{ role => "system", content => "Вы - полезный ассистент." },
{ role => "user", content => $input }
],
temperature => 0.7
})
);
if ($response->is_success) {
my $data = JSON->decode($response->content);
return $data->{choices}[0]->{message}->{content};
}
return "Извините, произошла ошибка при обработке запроса.";
}
Метод генерации ответа с использованием внешнего API (например, OpenAI).
4. Основной цикл работы
4.1 Обработка диалога
sub process_dialog {
my ($self, $input) = @_;
# Предобработка ввода
my $processed_input = $self->preprocess_text($input);
# Поиск похожей фразы
my $similar_phrase = $self->find_similar_phrase($processed_input);
# Генерация ответа
my $response;
if ($similar_phrase) {
$response = $self->generate_local_response($similar_phrase);
} else {
$response = $self->generate_api_response($input);
}
# Обновление контекста
$self->{context}{last_input} = $input;
$self->{context}{last_response} = $response;
return $response;
}
Основной метод обработки диалога, объединяющий все компоненты чатбота.
5. Пример использования
5.1 Запуск чатбота
package main;
my $bot = AIChatbot->new(
api_key => 'your-api-key-here'
);
print "Чатбот запущен. Введите 'выход' для завершения.\n";
while (1) {
print "\nВы: ";
my $input = readline(STDIN);
chomp($input);
last if $input =~ /^выход$/i;
my $response = $bot->process_dialog($input);
print "Бот: $response\n";
}
Пример использования чатбота в интерактивном режиме.
Заключение
Этот чатбот демонстрирует основные принципы создания AI-ассистента на Perl. Он включает:
- Локальную базу знаний с простыми ответами
- Обработку естественного языка
- Поиск похожих фраз
- Интеграцию с внешними API
- Управление контекстом диалога
Для улучшения чатбота можно:
- Расширить базу знаний
- Добавить обучение на основе диалогов
- Улучшить обработку контекста
- Добавить поддержку разных языков
- Реализовать сохранение истории диалогов