Что-то у меня прям кучно пошло - буквально 5 последних записей так или иначе об этом. Возможно я бы и раньше все это дело распробовал, но на тот момент когда шумел Чат ГПТ от американцев, остальных слышно было не громко, а я принципиально не хотел пользоваться заблокированными в России сервисами. Зато потом мне на работе подсказали про китайский qwen, потом был deepseek, сейчас есть и российские нейронки, то есть уже выбор больше, хотя и сейчас +- больше на слуху американские заблокированные в России нейронки за которые требуют еще и денег. У меня подход принципиальный, и как показывает мой случай - он все же работает, как минимум готовые проекты работают и выполняют поставленную задачу, и вполне качественно на мой взгляд. Правда недавно убедился что платные не зря продвигают - эти штуку реально умнее. Недавно наткнулся на arena ai - там пользователь задает промпт, и это задание выдается двум анонимным нейросетям, которые предлагают свои решения, пользователь должен выбрать лучшее из двух, и тогда ему откроют названия рейронок которые это дело нагенерировали. И я очень удивился тому что одна нейронка смогла с первого запроса сделать именно то что мне нужно - я сделал промпт очень большой и подробный, после того как потранил несколько дней на создание игры в другой нейросети. В этом запросе постарался учесть все неопределенные нюансы с котороми сталкивался чтобы нейронка могла сразу понять и это получилось, я удивлен. Современные бесплатные версии которыми я пользуюсь на такое не способны пока что, приходится делать десятки итераций и исправлений чтобы получить достойный вариант. В целом меня это не сильно напрягает, но все же лучше меньше времени терять на такое, очевидно, поэтому да, если есть возможность юзать claude-opus-4-6, то делайте конечно, а я пока буду пользоваться китайцами - в целом как я и говорил за большее время они могут выдать не хуже.
Итак, как я и говорил, я решил сделать телеграм бота. Захотелось мне иметь быстрый доступ к некоторым специфичным знаниям и я в свое время проворачивал такой фокус на локальной машине - все нужные знания запихнул в SQLite БД и реализовал поиск с уточнениями в ней. Но то на локальной машине и в локальной сети, а смартфон в руке постоянно - нужен интернет сервис - телеграм бот для этого подходит идеально. Но для проверки захотелось сначала перегнать в БД базу ошибок из документации к приводам Митсубиси. Это была отдельная история.
Документашка в pdf формате, благо с текстом. Распечатал нужные страница через Acrobat в pdf файл - просто тупо уменьшил объем, было 800 а стало 15 страниц. Потом в Акробате нашел опцию экспорта в excel - на каждой странице была таблица с одной ошибкой и описанием ее, всего грубо говоря 2 столбца и 5 строк первый столбец тупо заголовок для текста во втором слобце важный текст. Экспорт прошел немного криво, пришлось повозиться. Я придумал как в полуавтомате перегнать в сводную таблицу: через поиск находишь слово и заменяешь его на такое же слово, но с заливкой ячейки. разные слова разные цвета. Еще как и говорил была проблема с крифизной экспорта - и часть ячеек была в других столбцах - пришлось скриптом объединять их. Причем прикольно придумал что можно записать макрос по объдинению ячеек, а потом повторить его нужное кол-во раз. В общем ячейки подготовлены, и поставил фильтр по цвету - таким образом в соседней ячейке оказались все нужные данные. Например: фильтр по цвету код ошибки - справа список кодов. выделяю все копирую в другую таблицу, называю столбец код ошибки. Дальше фильтр по описанию, справа все описания - копирую так же подряд, ставлю с колонкой код описание и вставляю туда скопированные описания и т.д. В итоге получилась сводная таблица. Долго мучился как перегнать в SQLite БД пробовал через экспорт csv, но так как там было куча переносо все работало очень плохо. А потом в SQLite Studio просто создал таблицу (визуально все довольно просто), а потом нажал там плюсик - добавить 48 строк (столько получилось в сводной таблице с ошибками) и тупо копировать из таблицы excel в таблицу SQLiteStudio. И все таблица готова, теперь нужно писать бота
А вот с написанием бота пришлось повозиться, но то опять же в рамках эксперимента - я придумал большой запрос и решил отправить его 3 нейронкам: qwen, chat.z.ai, deepseek - все три китайцы, все три бесплатны и без особых ограничений - deepseek расстроил сильно - давал ему несколько шансов но никак не заработало, присылал много раз ошибки, начинал заново с уточнениями и все без толку. Поэтому плюнул, и начал работать с z.ai и qwen - в общем первее чатбот запустился на qwen и поэтому продолжил там. Сделал рабочий продукт, относительно норм, но все же требующий кучу улучшений, поэтому я попросил написать промпт по этому проекту чтобы начать заново и протестировать нейронки снова. опять 3 и опять вернулся к 2. В этот раз опять с первого раза ничего не получалось, хотя я уже присылал даже кусок кода на основе которого нужно делать, но все было без толку - сыпалась куча ошибок и кажды раз я понимал что это пиздец какая долгая песня. Поэтому решил взять только один чат и работать с ним, а начать постепенно. Этот чат был z.ai - в нем уже делал что-то похожее по такой же технологии начинать с малого: взял пример из библиотеки и на его основе попросил сделать прогу. В этот раз сделал абсолютно так же: первый запрос:
Ты профессиональный программист. нужно написать телеграм бота на базе Telegram.bot библиотеки версии 22.9.0 вот пример кода который работает:
using Telegram.Bot;
using Telegram.Bot.Polling;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
using Telegram.Bot.Types.ReplyMarkups;
using var cts = new CancellationTokenSource();
var bot = new TelegramBotClient("YOUR_BOT_TOKEN", cancellationToken: cts.Token);
var me = await bot.GetMe();
bot.OnError += OnError;
bot.OnMessage += OnMessage;
bot.OnUpdate += OnUpdate;
Console.WriteLine($"@{me.Username} is running... Press Enter to terminate");
Console.ReadLine();
cts.Cancel(); // stop the bot
// method to handle errors in polling or in your OnMessage/OnUpdate code
async Task OnError(Exception exception, HandleErrorSource source)
{
Console.WriteLine(exception); // just dump the exception to the console
}
// method that handle messages received by the bot:
async Task OnMessage(Message msg, UpdateType type)
{
if (msg.Text == "/start")
{
await bot.SendMessage(msg.Chat, "Welcome! Pick one direction",
replyMarkup: new InlineKeyboardButton[] { "Left", "Right" });
}
}
// method that handle other types of updates received by the bot:
async Task OnUpdate(Update update)
{
if (update is { CallbackQuery: { } query }) // non-null CallbackQuery
{
await bot.AnswerCallbackQuery(query.Id, $"You picked {query.Data}");
await bot.SendMessage(query.Message!.Chat, $"User {query.From} clicked on {query.Data}");
}
}
тебе нужно добавить класс program, main и конфиг чтобы добавить туда токен и другие нужные в будущем конфиги. нужно подключиться к бд SQLite и вернуть пользователю какие таблицы есть там и какие в них столбцы, сколько всего записей. Microsoft.Data.Sqlite --version 10.0.2
специально указываю версии, чтобы работал с новыми, потому что знаю что бывают постоянные проблемы с этим. надо было сразу добавить название приложения и чтобы расписал как его собрать и запустить, но это прислал вторум запросом, он сделал. Была всего одна ошибка при компиляции - и это было здорово - по сути сделал с первого раза. Ошибку исправили, я запустил, дал еще пару замечаний по работе, которые быстро исправили (программа простая, я всегда так делаю сам от простого к сложному и на каждом этапе проверка) - все заработало. И уже следующим запросом я прислал большой промпт на котором тестировал до этого:
пойдет, но на основе всего этого теперь нужно добавить другую логику, скидываю тз. повторяю - берешь все что сейчас работает и добавляешь новые функции. вот ТЗ:
Ты профессиональный программист. Нужно создать телеграм бота SQLiteChatBot на языке C# (dotnet) с технологией long polling, используя последние библиотекси. Бот должен искать отправляемый боту текст в заданной базе данных. Все настройки бота вынести в конфиг: токен, название БД, таблиц, столбцов, названия столбцов для вывода, то какие столбцы будут отображаться в выводе. Предусмотреть подключение нескольких БД с режимом переключения БД из чата. Все данные из БД нужно помещать в массив, под своими уникальными ID на основе которых будут отправляться текст пользователю в чат, по нажатию инлайн кнопки.
Логика такая: пользователь вводит слово или несколько слов или их частей в чат и отправляет боту. Бот ищет в массиве (все базы и все таблицы и все столбцы и строки) первое слово, среди найденных ищет второе, потом третье, сужая таким образом количество найденных данных с (1000 до 50 и потом до 5, например). Результат найденных записей отправляется пользователю в виде нумерованного списка, если найденное количество записей не превышает 10 (настройка в конфиге). Под сообщением добавляются inline кнопки с номерами в соответствии с номерами в списке найденного. При нажатии на кнопку в чат отправляется уже полный текстс записи - (все остальные столбцы из таблицы). Изначально список вхождений формируется по названию одной колонки, либо двух (тоже настройка в конфиге), например в нашем случае это база данных содержащая ошибки приводов митсубиси errors.db, таблица Mitsubishi, колонки: Code; Name; Description; Object; Action - соответственно при поиске превышение тока - он должен выдать сначала сообщение-список: несколько кодов из колонки Code и Name которые в других столбцах содержат эти слова, под списком inline кнопки по клику на которой выдается информация по конкретному коду который был запрошен: это все колонки сразу. Между абзацами добавить пустую строку. Можно проставлять название колонки перед ним, либо сделать в конфиге свои названия для вывод в чат.
Делаем консольное приложение, чтобы просто запустить командой dotnet run. Сделать разделение для пользователей чтобы если баз несколько они могли бы искать параллельно не мешая друг другу, если переключаться между базами. Для этого создать базу для хранения настроек пользователя. Выходящее длинное сообщение разбивать на несколько с задержкой отправки (говорят чтобы не забанил телеграм за спам). Нужно сделать максимально просто, весь код не больше 3 файлов cs чтобы проще было копировать из чата. С минимальными зависимостями.
Ну и дальше работа закипела - после этой строки он сгенерировал код, который собрался без проблем и уже работал поиск и все что нужно, я просто начал делать визуальные улучшения, которые можно было обговрить заранее, например то что таблицы не меняются и должны загружаться единоразово в память:
Все отлично! хочу чтобы кнопки выли в один ряд и по размеру не большие, минимальный размер, символ # оставляем (#1) Пусть в конфиге таблицы будут не Name а TableName, добавил вторую БД и 2 таблицы в ней - поиск выполняется отлично, но из новой базы не присылает документ, хотя присылает детали записи (ID: .....) - подозреваю проблема в ID. что если каждой записи в памяти присваивать свой уникальный id: БД-таблица-id в таблице - в каждой таблице есть своя колонка с Id. таблицы не изменяются никогда, базы не меняются - потому память всегда актуальна
и и еще сделать кнопки не в одну линию а в несколько разбивая по 5 кнопок, в одну линию они оказывается не переносятся сами по себе
Комментариев нет:
Отправить комментарий