MaxKonovalov38

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. Он включает:

Для улучшения чатбота можно:

  1. Расширить базу знаний
  2. Добавить обучение на основе диалогов
  3. Улучшить обработку контекста
  4. Добавить поддержку разных языков
  5. Реализовать сохранение истории диалогов