diff --git a/Lesson_8/Task_1/.gitignore b/Lesson_8/Task_1/.gitignore new file mode 100644 index 0000000..4a0b530 --- /dev/null +++ b/Lesson_8/Task_1/.gitignore @@ -0,0 +1,74 @@ +# This file is used to ignore files which are generated +# ---------------------------------------------------------------------------- + +*~ +*.autosave +*.a +*.core +*.moc +*.o +*.obj +*.orig +*.rej +*.so +*.so.* +*_pch.h.cpp +*_resource.rc +*.qm +.#* +*.*# +core +!core/ +tags +.DS_Store +.directory +*.debug +Makefile* +*.prl +*.app +moc_*.cpp +ui_*.h +qrc_*.cpp +Thumbs.db +*.res +*.rc +/.qmake.cache +/.qmake.stash + +# qtcreator generated files +*.pro.user* +CMakeLists.txt.user* + +# xemacs temporary files +*.flc + +# Vim temporary files +.*.swp + +# Visual Studio generated files +*.ib_pdb_index +*.idb +*.ilk +*.pdb +*.sln +*.suo +*.vcproj +*vcproj.*.*.user +*.ncb +*.sdf +*.opensdf +*.vcxproj +*vcxproj.* + +# MinGW generated files +*.Debug +*.Release + +# Python byte code +*.pyc + +# Binaries +# -------- +*.dll +*.exe + diff --git a/Lesson_8/Task_1/Task_1.pro b/Lesson_8/Task_1/Task_1.pro new file mode 100644 index 0000000..2152269 --- /dev/null +++ b/Lesson_8/Task_1/Task_1.pro @@ -0,0 +1,24 @@ +QT += core gui network + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +CONFIG += c++17 + +# You can make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + main.cpp \ + llmmathquiz.cpp + +HEADERS += \ + llmmathquiz.h + +FORMS += \ + llmmathquiz.ui + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target diff --git a/Lesson_8/Task_1/llmmathquiz.cpp b/Lesson_8/Task_1/llmmathquiz.cpp new file mode 100644 index 0000000..a5610da --- /dev/null +++ b/Lesson_8/Task_1/llmmathquiz.cpp @@ -0,0 +1,95 @@ +#include "llmmathquiz.h" +#include "ui_llmmathquiz.h" + +LlmMathQuiz::LlmMathQuiz(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::LlmMathQuiz) +{ + ui->setupUi(this); + connect(ui->b_submit, &QPushButton::clicked, this, &LlmMathQuiz::submit); + connect(ui->b_generate, &QPushButton::clicked, this, &LlmMathQuiz::generate); + connect (m_manager, &QNetworkAccessManager::finished, this, &LlmMathQuiz::newAnswer); +} + +LlmMathQuiz::~LlmMathQuiz() +{ + delete ui; +} + +void LlmMathQuiz::submit() +{ + if (ui->e_user->text().isEmpty()) + return; + + ui->e_llm->setText(m_llmAnswer); + ui->b_submit->setEnabled(false); + ui->e_user->setReadOnly(true); + ui->l_opinion->setText("Generating…"); + + sendPrompt("The two following lines will contain two answers. Respond with \"true\" if they are the same, and \"false\" if they are not. Always use lowercase." + + QString("\n") + ui->e_user->text() + + QString("\n") + m_llmAnswer); +} + +void LlmMathQuiz::generate() +{ + if (m_taskReceived) { + ui->l_number->setText(QString::number(ui->l_number->text().toInt() + 1)); + m_taskReceived = false; + } + m_taskReceived = false; + ui->b_generate->setEnabled(false); + ui->e_task->setText("Generating…"); + ui->e_user->clear(); + ui->e_llm->clear(); + ui->l_opinion->setText("Not checked"); + + sendPrompt("Generate a mathematical task and a correct answer for it. Both the task and the answer need to take only one line. Provide the task on the first line, and the answer on the second line."); +} + +void LlmMathQuiz::newAnswer(QNetworkReply *reply) +{ + if (!m_taskReceived) { + if (reply->error() == QNetworkReply::NoError) { + QByteArray textReply = reply->readAll(); + QStringList data = QJsonDocument::fromJson(textReply).object().value("response").toString().split('\n'); + ui->e_task->setText(data[0]); + m_llmAnswer = data[1].isEmpty() ? data[2] : data[1]; + m_taskReceived = true; + ui->b_submit->setEnabled(true); + ui->e_user->setReadOnly(false); + } else { + ui->e_task->setText("Error!"); + ui->b_generate->setEnabled(true); + } + } else { + if (reply->error() == QNetworkReply::NoError) { + QByteArray textReply = reply->readAll(); + QString data = QJsonDocument::fromJson(textReply).object().value("response").toString(); + if (data == "true") { + ui->l_matched->setText(QString::number(ui->l_matched->text().toInt() + 1)); + ui->l_opinion->setText("Match"); + } else if (data == "false") + ui->l_opinion->setText("Mismatch"); + else + ui->l_opinion->setText("Not match nor mismatch"); + ui->b_generate->setEnabled(true); + } else { + ui->e_llm->setText("Error!"); + ui->b_submit->setEnabled(true); + } + } +} + +void LlmMathQuiz::sendPrompt(QString prompt) +{ + QNetworkRequest request(QUrl("http://127.0.0.1:11434/api/generate")); + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); + + QJsonObject json; + json["model"] = "llama3.1:8b"; + json["prompt"] = prompt; + json["stream"] = false; + + m_manager->post(request, QJsonDocument(json).toJson()); +} diff --git a/Lesson_8/Task_1/llmmathquiz.h b/Lesson_8/Task_1/llmmathquiz.h new file mode 100644 index 0000000..6eba648 --- /dev/null +++ b/Lesson_8/Task_1/llmmathquiz.h @@ -0,0 +1,36 @@ +#ifndef LLMMATHQUIZ_H +#define LLMMATHQUIZ_H + +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE +namespace Ui { +class LlmMathQuiz; +} +QT_END_NAMESPACE + +class LlmMathQuiz : public QMainWindow +{ + Q_OBJECT + +public: + LlmMathQuiz(QWidget *parent = nullptr); + ~LlmMathQuiz(); + +private slots: + void submit(); + void generate(); + void newAnswer(QNetworkReply *); + +private: + void sendPrompt(QString); + Ui::LlmMathQuiz *ui; + QNetworkAccessManager *m_manager = new QNetworkAccessManager(); + bool m_taskReceived = false; + QString m_llmAnswer; +}; +#endif // LLMMATHQUIZ_H diff --git a/Lesson_8/Task_1/llmmathquiz.ui b/Lesson_8/Task_1/llmmathquiz.ui new file mode 100644 index 0000000..eb4e943 --- /dev/null +++ b/Lesson_8/Task_1/llmmathquiz.ui @@ -0,0 +1,162 @@ + + + LlmMathQuiz + + + + 0 + 0 + 800 + 600 + + + + LlmMathQuiz + + + + + + + + + Task: + + + + + + + true + + + + + + + + + + + User answer: + + + + + + + true + + + + + + + + + + + LLM answer: + + + + + + + true + + + + + + + + + + + LLM opinion: + + + + + + + Not checked + + + + + + + + + false + + + Submit + + + + + + + true + + + Generate + + + + + + + + + Task # + + + + + + + 1 + + + + + + + + + + + Answers matched: + + + + + + + 0 + + + + + + + + + + + 0 + 0 + 800 + 25 + + + + + + + + diff --git a/Lesson_8/Task_1/main.cpp b/Lesson_8/Task_1/main.cpp new file mode 100644 index 0000000..2227e39 --- /dev/null +++ b/Lesson_8/Task_1/main.cpp @@ -0,0 +1,11 @@ +#include "llmmathquiz.h" + +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + LlmMathQuiz w; + w.show(); + return a.exec(); +} diff --git a/README.md b/README.md index 2238eee..feddffa 100644 --- a/README.md +++ b/README.md @@ -35,3 +35,7 @@ Checked means the task is Done. ### Lesson 6 - [ ] Task 1 + +### Lesson 8 + +- [ ] Task 1