Ось як я створив генератор віршів на основі ШІ.

User is participating in a hackathon to create a chatbot using the agentic AI infrastructure called Groclake.## Історія:

Наразі я беру участь у хакатоні, в якому ми повинні створити чат-бота як частину завдання, використовуючи агентну інфраструктуру штучного інтелекту під назвою Groclake, яку надають організатори.

Ось коротка інформація про Groclake:

Groclake — це інфраструктура агентного штучного інтелекту для автоматизації комерції. Це комплексний набір бібліотек, API, конекторів і сховищ даних, який надає єдиний шлюз для оркестрування складних робочих процесів комерції. Філософія Groclake полягає в тому, щоб допомогти розробникам і будівельникам швидко створювати складні функції для підприємств, використовуючи готові інструменти, що підтримуються штучним інтелектом.
Groclake чудово доповнює агентні робочі процеси, оскільки забезпечує простий шлях від агента до програми, використовуючи одноточкові з’єднання замість точка-точка для виклику інструментів.

Учасники також отримали вступний код, який вони повинні слідувати та зрозуміти, щоб створити свої власні розробки.

pic

Що створювати?

В наші часи ми зазвичай надсилаємо побажання своїм близьким через повідомлення та історії. І на півдорозі до цього ми опиняємося в роздумах: як мені побажати, що написати, хочу бути креативним, але як? І так далі. Тому ось відповідь на всі ці питання — KavyaKreate — створюй свою власну Кав'ю з допомогою ШІ. Кав'я (Kavya) хінді означає вірш, і, як випливає з назви, ця програма генерує вірш за вказівкою користувача, але що ж особливого в цьому, адже навіть ChatGPT може це зробити, правда? KavyaKreate може створювати зображення за мотивами вірша.
Також, ви можете створювати власні картки та надсилати їх своїм друзям, щоб привітати їх.

Як створити:

Отже, ми використали Flask для бекенду, оскільки цей фреймворк дуже простий для створення працездатного, але надійного бекенду.

Підхід до бекенду:

Встановіть необхідні залежності у вашому поточному середовищі Python за допомогою наступних команд:

pip install groclake  
pip install python-dotenv  
pip install flask

Ви також можете використовувати однорядковий підхід для встановлення. Це залежить від вашого стилю програмування.

Наступний крок — отримати свої облікові дані Groclake з їх офіційного сайту. Збережіть ці дані в своєму файлі .env. Тепер створіть файл main.py і імпортуйте наступне

from groclake.modellake import ModelLake  
from dotenv import load_dotenv  
from flask import Flask, request, jsonify

Після імпорту залежностей є кілька завдань, які нам потрібно виконати.
Ось пояснення наступних рядків коду:

load_dotenv() — цей метод завантажує файл .env у ваше середовище

model_lake = ModelLake() — ініціалізація моделі

app = Flask(name) — створення екземпляру Flask додатку

conversation_history = [] — ініціалізація порожньої історії розмови

# Завантаження змінних середовища  
load_dotenv()  

# Ініціалізація екземпляру ModelLake  
model_lake = ModelLake()  

# Ініціалізація Flask додатку  
app = Flask(__name__)  

# Ініціалізація історії розмов (повинна зберігатися між викликами, якщо це потрібно)  
conversation_history = []

Створений кінцевий точка (endpoint) прийматиме введення користувача, оброблятиме його та повертатиме відповідь, згенеровану AI моделлю. Давайте розберемо це крок за кроком, щоб ви могли реалізувати це самостійно.

1. Налаштування кінцевої точки

Перш за все, визначте маршрут у вашому Flask додатку для обробки POST запитів.
Цей маршрут буде відповідати за отримання вводу користувача у форматі JSON.

@app.route("/chat", methods=["POST"])  
def chatbot():  
 try:  
 # Парсинг вхідного JSON запиту  
 data = request.get_json()
# Перевірка, чи є обов'язкове поле 'user_input'  
 if not data or "user_input" not in data:  
 return jsonify({"error": "'user_input' є обов'язковим полем у JSON запиті"}), 400 # Отримання вводу користувача  
 user_input = data["user_input"]

Тут request.get_json() витягує JSON запит з HTTP запиту. Просте перевіряння гарантує, що ключ user_input існує, в іншому випадку повертається відповідь з помилкою.

2. Управління історією розмов

Для забезпечення контекстних відповідей слід зберігати історію розмов. Кожне повідомлення (як від користувача, так і від чат-бота) додається до цієї історії.

# Додавання вводу користувача до історії розмов  
 conversation_history.append({"role": "user", "content": user_input})

3.

Підготовка Payload для AI моделі

Далі потрібно створити payload, який міститиме історію розмови та будь-які необхідні параметри для AI моделі. Наприклад:

# Створення payload для моделі  
 payload = {  
 "messages": conversation_history,  
 "max_tokens": 700, # Налаштуйте ліміт токенів за потребою  
 }

4. Генерація відповіді чат-бота

Припустимо, ви використовуєте AI модель, доступну через model_lake.chat_complete. Ця функція приймає payload і повертає відповідь моделі:

# Отримання відповіді від моделі  
 reply = model_lake.chat_complete(payload=payload)
# Отримання відповіді від асистента  
 bot_reply = reply.get("answer", "Вибачте, я не зміг обробити це.")

Цей код отримує відповідь від моделі або повертає повідомлення про помилку, якщо відповідь недійсна.

5.

Оновлення історії розмови

Збережіть відповідь чат-бота в історії розмови для подальшого контексту:

# Додаємо відповідь асистента до історії розмови  
 conversation_history.append({"role": "assistant", "content": bot_reply})

6. Надсилання відповіді

Нарешті, поверніть відповідь чат-бота у вигляді JSON payload:

# Повертаємо відповідь бота  
 return jsonify({"bot_reply": bot_reply})

7.

Обробка помилок

Огорніть всю логіку в блок try-except для коректної обробки непередбачених помилок:

except Exception as e:  
 # Повертаємо відповідь з помилкою та повідомленням про виключення  
 return jsonify({"error": str(e)}), 500

Остаточний код

Зібравши все разом, повний код виглядатиме так:

@app.route("/chat", methods=["POST"])  
def chatbot():  
 try:  
 data = request.get_json()
if not data or "user_input" not in data:  
 return jsonify({"error": "'user_input' is required in JSON payload"}), 400 user_input = data["user_input"]  
 conversation_history.append({"role": "user", "content": user_input}) payload = {  
 "messages": conversation_history,  
 "max_tokens": 700,  
 } reply = model_lake.chat_complete(payload=payload)  
 bot_reply = reply.get("answer", "Sorry, I couldn't process that.")  
 conversation_history.append({"role": "assistant", "content": bot_reply}) return jsonify({"bot_reply": bot_reply})  
 except Exception as e:  
 return jsonify({"error": str(e)}), 500

Основні моменти, які слід пам'ятати

  • Валідація: Завжди перевіряйте вхідні дані, щоб уникнути непередбачених помилок.
  • Управління станом: Використовуйте історію розмови для того, щоб взаємодія з чат-ботом була більш логічною та послідовною.
  • Обробка помилок: Реалізуйте надійну обробку помилок для забезпечення надійності.

Підхід до фронтенду:

Цей інтерфейс підключається до бекенду для генерації відповідей і включає такі функції, як анімації завантаження та копіювання відповідей у буфер обміну.
Розглянемо це крок за кроком.

1. Імпортування необхідних пакетів

Почнімо з імпорту потрібних пакетів для побудови інтерфейсу користувача та обробки HTTP запитів.

import 'package:flutter/material.dart';  
import 'package:http/http.dart' as http;  
import 'dart:convert';  
import 'package:flutter/services.dart'; // Імпорт для функціональності буфера обміну  
import 'package:loading_indicator/loading_indicator.dart';

Тут http використовується для відправлення HTTP запитів, а loading_indicator надає готову анімацію для відображення процесу завантаження.
Визначте Stateful Widget

Створіть StatefulWidget під назвою ChatBotScreen для керування станом інтерфейсу чату.

class ChatBotScreen extends StatefulWidget {  
 @override  
 _ChatBotScreenState createState() => _ChatBotScreenState();  
}
class _ChatBotScreenState extends State {  
 final TextEditingController _controller = TextEditingController();  
 final List _messages = [];  
 bool _isLoading = false;  
 final String backendUrl = "http://localhost:5000/chat"; // Замініть на URL вашого бекенду

3.

Відправка повідомлень

Визначте функцію _sendMessage для відправки введеного тексту користувачем на бекенд і обробки відповіді чат-бота.

Додайте введене повідомлення користувача

Коли користувач відправляє повідомлення, воно додається до списку повідомлень:

setState(() {  
 _messages.add({"role": "user", "content": userInput});  
 _isLoading = true; // Почати анімацію завантаження  
});  
_controller.clear(); // Очистити текстове поле

Зробіть POST запит

Використовуйте пакет http для відправки введеного тексту на бекенд:

final response = await http.post(  
 Uri.parse(backendUrl),  
 headers: {'Content-Type': 'application/json'},  
 body: json.encode({"user_input": userInput}),  
);

Обробка відповіді

Якщо бекенд відповідає успішно, додайте відповідь бота до списку повідомлень:

if (response.statusCode == 200) {  
 final data = json.decode(response.body);  
 final botReply = data["bot_reply"] ?? "Вибачте, відповіді немає.";  
 setState(() {  
 _messages.add({"role": "assistant", "content": botReply});  
 });  
} else {  
 setState(() {  
 _messages.add({"role": "assistant", "content": "Помилка: ${response.statusCode} - ${response.reasonPhrase}"});  
 });  
}

Обробіть виключення для забезпечення стабільності:

catch (e) {  
 setState(() {  
 _messages.add({"role": "assistant", "content": "Помилка: $e"});  
 });  
}

І наостанок, зупиніть анімацію завантаження:

finally {  
 setState(() {  
 _isLoading = false;  
 });  
}

4.

Копіювання в буфер обміну

Додайте функціональність для копіювання відповіді бота в буфер обміну:

void _copyToClipboard(String botReply) {  
 Clipboard.setData(ClipboardData(text: botReply));  
 ScaffoldMessenger.of(context).showSnackBar(  
 SnackBar(content: Text('Скопійовано в буфер обміну!')),  
 );  
}

5. Побудова інтерфейсу

AppBar

Визначте AppBar з кастомним заголовком:

appBar: AppBar(  
 backgroundColor: Colors.pink,  
 title: Row(  
 children: [  
 Text("KavyaKreate ", style: TextStyle(fontWeight: FontWeight.bold, color: Colors.white)),  
 Text("- Створіть свій Kavya за допомогою AI", style: TextStyle(fontWeight: FontWeight.w400, fontSize: 18, color: Colors.white)),  
 ],  
 ),  
),

Повідомлення чату

Відображайте повідомлення за допомогою ListView.builder, чергуючи повідомлення користувача та бота.
Додати анімацію завантаження, коли відповідь бота ще не надійшла:

Expanded(  
 child: ListView.builder(  
 itemCount: _messages.length + (_isLoading ? 1 : 0),  
 itemBuilder: (context, index) {  
 if (index == _messages.length && _isLoading) {  
 return Align(  
 alignment: Alignment.centerLeft,  
 child: SizedBox(  
 width: 60,  
 child: LoadingIndicator(  
 indicatorType: Indicator.ballPulse,  
 colors: const [Colors.red, Colors.yellow, Colors.green],  
 ),  
 ),  
 );  
 }
final message = _messages[index];  
 final isUser = message["role"] == "user"; return Align(  
 alignment: isUser ? Alignment.centerRight : Alignment.centerLeft,  
 child: Column(  
 crossAxisAlignment: isUser ? CrossAxisAlignment.end : CrossAxisAlignment.start,  
 children: [  
 CircleAvatar(  
 child: Text(isUser ? "👤" : "🤖", style: TextStyle(fontSize: 20)),  
 ),  
 Container(  
 padding: EdgeInsets.all(10),  
 margin: EdgeInsets.symmetric(vertical: 5, horizontal: 10),  
 decoration: BoxDecoration(  
 color: isUser ? Colors.blue[100] : Colors.grey[300],  
 borderRadius: BorderRadius.circular(10),  
 ),  
 child: Text(  
 message["content"] ?? "",  
 style: TextStyle(fontSize: 16),  
 ),  
 ),  
 ],  
 ),  
 );  
 },  
 ),  
),

Поле вводу

Додайте текстове поле вводу та кнопку відправки:

Padding(  
 padding: const EdgeInsets.all(8.0),  
 child: Row(  
 children: [  
 Expanded(  
 child: TextField(  
 controller: _controller,  
 decoration: InputDecoration(  
 hintText: "Почніть з 'Створити вірш...'",  
 border: OutlineInputBorder(),  
 ),  
 ),  
 ),  
 IconButton(  
 icon: Icon(Icons.send),  
 onPressed: () {  
 _sendMessage(_controller.text);  
 },  
 ),  
 ],  
 ),  
),

Основні функції

  • Повідомлення користувача та бота: Відрізняються за відправником.
  • Анімація завантаження: Показує активність під час очікування відповіді бота.
  • Копіювання в буфер обміну: Дозволяє користувачам легко копіювати відповіді бота.

Тестування:

Запустіть сервер і протестуйте додаток! Ось як це виглядає.

pic

Висновок:

Отже, ось як ми створили свій власний генератор віршів за допомогою AI.
В майбутньому ми інтегруємо генератор фону для зображень на базі AI та функціональність розширення для Chrome, щоб додаток можна було інтегрувати і в інші програми. Щодо комерції, цей додаток орієнтований на роздрібну торгівлю подарунками.

Поділіться своїми враженнями про цей додаток у коментарях. Також ставте свої питання щодо цього додатку або технологічного стеку в коментарях. Я обов'язково відповім. Нарешті, продовжуйте експериментувати!

Перекладено з: Here’s How I Created AI Poem Generator

Leave a Reply

Your email address will not be published. Required fields are marked *