Существует много вариантов доступа к Llama3 и другим открытым моделям через браузер. Но Телеграм намного удобнее и для него есть простое решение как получить безлимитный и бесплатный доступ к диалогу с AI.

Да, всего 20 строк кода и этот бот:

1) по качеству ответов будет соизмерим с ChatGPT-4;
2) будет отвечать очень быстро т.к. подключим мы его через Groq, который в среднем в 10 раз быстрее других аналогичных сервисов;
3) будет поддерживать диалог и запоминать последние сообщения.

Что нужно

  1. Создать Телеграм бота и получить его токен (как это сделать, смотрите инструкции на просторах интернета, например здесь).

  2. Зарегистрироваться на Groq и получить api key (нужен VPN).
    Заходим по этой ссылке, регистрируем аккаунт, генерим ключ. Платежная карта не требуется.

Код

# pip install pyTelegramBotAPI groq
import telebot
from groq import Groq

client = Groq(api_key="GROQ_API_KEY")
bot = telebot.TeleBot("TELEGRAM_BOT_TOKEN")
messages = []

@ bot.message_handler(content_types=['text'])
def get_text_messages(message):
    global messages
    messages.append({"role": 'user', "content": message.text})
    if len(messages) > 6:
        messages = messages[-6:]
    response = client.chat.completions.create(model='llama3-70b-8192', messages=messages, temperature=0)
    bot.send_message(message.from_user.id, response.choices[0].message.content)
    messages.append({"role": 'assistant', "content": response.choices[0].message.content})

while True:
    bot.polling(none_stop=True, interval=0, timeout=0)

Замените в коде GROQ_API_KEY на api ключ полученный в Groq и TELEGRAM_BOT_TOKEN на токен телеграм бота, все должно быть в кавычках. В 13 и 14 строках цифра 6 - это количество последних сообщений, которые запоминает бот.

Ограничения

  1. Бот работает только через VPN, но лучше запустить скрипт на минимальном виртуальном сервере с европейским IP.

  2. Бот не различает пользователей. Эта версия рассчитана на одного пользователя.

  3. Есть ограничения со стороны Groq, но запас такой, что для одного пользователя эти ограничения не имеют значения.

Моя версия бота

Я сделал НашGPT - более продвинутую версию такого бота. Он доступен, им можно пользоваться.

НашGPT прокачен двумя дополнительными функциями. Он умеет искать в интернете и понимает голосовые сообщения.

Поиск в интернете реализован через DuckDuckGo API, а голосовые сообщения распознает Whisper.

Сейчас НашGPT учится работать с документами и картинками...

Комментарии (56)


  1. GennPen
    12.05.2024 10:07

    Нужно еще очистку контекста сделать, потому как перезапускать бота чтобы очищать контекст - такое себе.


    1. evg_dc Автор
      12.05.2024 10:07

      очищается в строке messages = messages[-6:]


      1. Tim2211
        12.05.2024 10:07

        А куда вставлять код, что бы бот заработал?


    1. evg_dc Автор
      12.05.2024 10:07
      +1

      да, понял, что имеется ввиду... кнопку надо ставить


  1. abutorin
    12.05.2024 10:07

    Моя проверка чат-ботов:

    Если часть задачи писать текстом, большинство ботов не понимает чего от него хотят.


    1. PeeWeee
      12.05.2024 10:07
      +32

      Вы меня разоблачили - я тоже бот.
      На первый вопрос дал бы ответ 8, а на 2-й 6. Т.к. формально приоритет операций (смеси математического выражения и текста) не определен, а интуитивно числовое выражение, обрамленное текстом, воспринимается как обособленное, т.е. аналог ().


      1. abutorin
        12.05.2024 10:07

        Т.к. идея использования чатботов подразумевает что бот должен частично заменить человека, то и отвечать он должен также как человек. Люди передают информацию в виде речи, текст это способ представление речевых оборотов в виде набора букв, слов и иногда чисел (когда лениво писать числа целиком). Причина разного поведения для этих двух запросов мне понятна. Но для "обычного" человека эти 2 запроса абсолютно идентичны.


        1. thethee
          12.05.2024 10:07
          +1

          Так вы + знаком написали. Напишите текстом, вдруг результат другой будет. Возможно тут проблема с токенизацией и "2+2 умножить на 2", где 2+2 написаны слитно, нейросеть воспринимает иначе чем "2 плюс 2 умножить на 2". Все таки в задаче важно корректно ставить условия и если ожидается что нужно "распарсить" ввод, то он должен быть консистентным. В первом случае и я тоже 2+2 ощутил как обособленную сущность, так что бота винить за неправильный ответ конкретно в этом случае не могу, т.к. сам ошибся в том же месте.

          К тому же 70b это хоть и довольно большой размер для нейросети в open-source, и сейчас считается state of the art, насколько мне известно, но это не самый большой размер для проприетарных сетей, так что вполне вероятно что тесты которые проходят крупные сетки, llama3 не пройдет вообще или еле-еле пройдет. Год-полтора и будет намного лучше, это сейчас самая быстроразвивающаяся сфера, конкретно LLM и работа с ними, и даже open source сети семимильными шагами растут


      1. kilgor-trout
        12.05.2024 10:07

        >Вы меня разоблачили - я тоже бот.

        ну видимо, человек бы сразу спросил, а не втупую считал


        1. MountainGoat
          12.05.2024 10:07
          +17

          Не факт. Небрежно поставленный вопрос подразумевает небрежно посчитанный ответ.


          1. kilgor-trout
            12.05.2024 10:07

            надеюсь ты не программист


            1. PrinceKorwin
              12.05.2024 10:07
              +9

              Основной принцип же - garbage in = garbage out :)


      1. abutorin
        12.05.2024 10:07

        Т.к. формально приоритет операций (смеси математического выражения и текста) не определен

        В от то и дело. Поэтому придуманы скобки. Если в тексте они явно не указаны, то почему бот решил их "придумать" на месте где я их не написал? Ваше объяснение это просто натягивание объяснения. Но для запрос я написал конкретно, никаких скобок не говорил, значит должен был считать без них. В от если бы я написан "сначала 2+2, а потом умножить на 2", тогда скобки следует добавить. А так, приоритет мною указан не был, значит все операции должны выполняться в соответствии с базовым приоритетом.


        1. guliverza
          12.05.2024 10:07
          +1

          А чего вы столько запятых понатыкали в свой текст? Если бы комментарий свой зачитывали бы вслух, разве произносили бы "зпт" или "тчк"? Улавливаете?


          1. abutorin
            12.05.2024 10:07

            Ну для чего нужны запятые понятно. И для отражения интонации в тексте знаки препинания и придуманы. А для установки приоритетов в описании математического выражения уже то же что-то придумали? Вроде математика достаточно строгая наука, правила произношения и записи ни кем не оспариваются. А вы всё пытаетесь доказать что бот отвечает правильно. Я согласен что он отвечает так как его "научили". Моя претензия в том, что без правильного "разговора" с ними считать ответ корректным нельзя. Я уже молчу про то что после получения от него правильного ответа а задачи повторного вопроса "ты уверен?", почти все боты признают "ошибку" и предлагают альтернативный вариант. Такой бот это как блондинка вызубрившая учебник по атомной физики (прошедшую несколько курсов ВойтиВАйТи, кому что ближе), с ней конечно будет интересно в первое время "прыщавым" студентам, но настоящий результат от неё не получить.


            1. PrinceKorwin
              12.05.2024 10:07

              для отражения интонации в тексте знаки препинания и придуманы

              Думается вам про "казнить нельзя помиловать" намекали.


              1. abutorin
                12.05.2024 10:07

                Ну то что при произношении запятой необходимо сделать паузу, вроде всех учили. А вот со скобками как? Ниже уже рассмотрели пример различий в записи 2 + 2 и 2+2, Или про это тоже изволите говорить "это другое"? Для человека все эти формы записи абсолютно равнозначны, правила правописания достаточно чётко регулируют этот вопрос, нет для скобок никаких "интонаций", особых форм представления. Если скобки явно не указаны, их быть не должно.


    1. GennPen
      12.05.2024 10:07
      +3

      А если текстом, то нормально:

      Скорее всего разбивает на блоки, из-за этого "2+2" считает более приоритетным вычислением.


    1. lazbaphilipp
      12.05.2024 10:07
      +2

      2+2 умножить на 2 — действительно 8, если уж на то. Возможно, правильнее было бы написать 2+2, умноженное на 2. Но даже так, без интонационного акцента вариант интерпретации этого текста как (2+2)*2 более предпочтителен.


      1. abutorin
        12.05.2024 10:07

        Да чего тут гадать. Вопрос написанный боту исследовал вдоль и поперёк. Если ему не достаточно информации, либо условия задачи противоречивы, то он должен либо задать уточняющий вопрос, либо предложить оба решения и показать причину такого ответа. А чат бот который предполагается использовать для общения с простыми людьми должен ждать что на входе будет всякий мусор и в этом мусоре ему и нужно уметь разбираться.


        1. Shannon
          12.05.2024 10:07
          +2

          Ну стоит отметить, что модель прекрасно может понимать, что условие задачи плохо заданы или есть несколько решений. Просто у неё не настроен контекст, чтобы в таких случаях уточнять что-либо, а по умолчанию она всегда отвечает сразу какой-то ответ.

          Задаем для llama3 70b q4_K_M контекст:

          Ты помощник, который отвечает на русском и решает любые вопросы. Если тебе что-то не понятно или ты видишь несколько вариантов ответа, то ты сначала уточни, а потом отвечай.

          Ответ:


          1. abutorin
            12.05.2024 10:07

            несомненно, можно придумать "правильный" вопрос и получить правильный ответ. но это работает только на проверке ответов по уже известным вопросам. А если ответ не известен?


            1. Shannon
              12.05.2024 10:07

              несомненно, можно придумать "правильный" вопрос и получить правильный ответ

              я не придумывал "правильный" вопрос, я задал точно такой же как у вас.

              Вы упускаете суть. Пока вы упражняетесь в попытках поймать модель на "глупости", вы пропускаете мимо другой момент - модели могут полностью менять своё поведение при изменении их глобального контекста (то, что в ChatGPT называют Агентами).

              Хотите чтобы модель стояла на своем, уточняла вопросы, была абсолютно уверена, что правильно вас поняла? Для этого не нужна новая модель, не нужно искать какую-то особую модель, всё это можно получить на текущей, просто задав ей роль.

              Назовите её терминалом, и модель будет считать себя linux-терминалом.

              И вот тут уже становится понятно, что важнее как модель понимает и удерживает контекст - чем сильнее модель, тем легче ей дается удерживать многие условия в "голове" и не смешивать их в процессе инференса.

              Приведу пример.

              У меня есть 10 яблок. Я нахожу 3 золотые монеты на дне реки. Река протекает рядом с большим городом, который как-то связан с тем, на что я могу потратить монеты. Я теряю 4 яблока, но получаю золотую монету. На мой путь выбегают три птицы и роняют по 6 яблок. Я играю в онлайн-игру и выигрываю 6 золотых монет, но мне приходится делить их поровну с двумя моими товарищами по команде. Я покупаю яблоки на все имеющиеся у меня монеты. Цена одного яблока составляет 0,5 монеты. Сколько у меня яблок? И где находится река?

              Правильный ответ 36 яблок и 0 монет. ChatGPT-3.5 не способна полноценно отделить монеты и яблоки, и думает, что яблоки, что выпали у птиц, это выпали из вашего кармана и думает, что у вас осталось отрицательное число яблок.

              Но ChatGPT-3.5 отвечает на ваш вопрос "2+2 умножить на 2" как вы и хотите и выдает сходу ответ 6. Только 3.5 не становится от этого более "умной", которая не проваливает "тест".

              Если что, llama3 70b легко решает задачу с яблоками (также как и WizardLM-2, GPT4, Claude3).

              В общем-то мне всё равно кто и как испытывает модели, я лишь хотел показать, что модели это не про угадывание образа мышления, а это гибкий инструмент, который можно настроить, не обучить, а настроить.


        1. bogdart
          12.05.2024 10:07

          Бот ничего не должен, он отвечает как средний человек. Попробуйте среднему человеку написать свою задачу и он ответит восемь без всяких уточнений. Это может быть даже нелогично и математически неправильно, но отличие ИИ от процессора как раз в том, что он не логикой руководствуется. Это как в анекдоте про десять батонов хлеба, столкновение житейской логики и формальной.


  1. alfa41
    12.05.2024 10:07

    Огоромное спасибо за короткую, но информативную статью! Подписался на вас. Можете более подробно расписать как удалось прикрутить DuckDuckGo и голосовые сообщения? Пока не совсем понимаю, как разграничить общение с ИИ и собственно Интернет-поиск. В моих ботах-помощниках это происходит путем анализа ввода через grep. Есть возможность выложить версию кода с полным функционалом?


    1. evg_dc Автор
      12.05.2024 10:07
      +1

      Подробно в следующей статье напишу, а если коротко, то используйте function calling и опрашивайте DuckDuckGo, результат поиска подставляете в системный пропт и снова опрашивате модель, примеров как это сделать очень много.
      Для голосовых сообщений надо где то запускать Whisper или платить внешним провайдерам. В Телеграме забираете голосовое сообщение ввиде аудиофайла, через Whisper делаете текст и дальше все как обычно.


      1. alfa41
        12.05.2024 10:07

        Ок, подожду статью


    1. sixxio
      12.05.2024 10:07
      +2

      Советую глянуть LangChain, там реализовано много фич для работы с агентами.


  1. GennPen
    12.05.2024 10:07

    Если использовать кольцо из ключей с разных аккаунтов, то по IP не забанят? =)


    1. evg_dc Автор
      12.05.2024 10:07

      Забанят.


    1. sixxio
      12.05.2024 10:07

      Конечно же, забанят
      При этом, если кидать относительно много запросов (даже в рамках лимитов), забанят достаточно быстро и все ключи, которые использовались на одном адресе, разом, проверено)

      Но вопрос решается, если использовать кучку прокси-серверов
      Да и Groq особо не требователен к почте, не просит номер телефона и так далее, так что насобирать ключи несложно, а себестоимость околонулевая

      Но ни в коем случае так не делайте, это нарушает условия пользования и вообще некрасиво)


  1. alfa41
    12.05.2024 10:07

    Groq постоянно перескакивает обратно на английский при общении с ним на русском. На просьбу отвечать на русском обещает, но потом быстро забывает. Есть ли опция по типу "set preferable language output = ru"?


    1. evg_dc Автор
      12.05.2024 10:07
      +1

      Groq тут не при чём, это модель решает на каком отвечать. Пишите в системный промпт Always answer in Russian.
      Это всё, что можно сделать. Всё равно будет перескакивать на английский, но меньше.


      1. alfa41
        12.05.2024 10:07

        Спасибо, внес следующее дополнение в код: messages = [{"role": "system", "content": "Always answer in Russian"}]

        Вроде стало более стабильным


        1. TipTop
          12.05.2024 10:07

          Добавил Ваш код к своему инстансу модельки llama3-70b-8192, и теперь она представляется как RuDALL-E


  1. I-like-Portal-2
    12.05.2024 10:07
    +1

    Было бы круто, если бы не только на русском отвечал. Все-таки большая часть датасета из английских текстов, поэтому на нем модель умнее. Можно конечно попросить отвечать на инглише, но тогда ллама на обоих языках напишет, что по инструкции рекомендуется отвечать на русском. Ну и в описании можно было бы добавить что это ллама, а не чатжпт :)

    А так бот отличный и статья понятная, спасибо!


  1. ORENYT
    12.05.2024 10:07

    А можно подключить контекст и настроить Лору бота? Чтобы сделать женщину виртуальную....


  1. sunsexsurf
    12.05.2024 10:07

    некст степ - RAG


  1. leon_shtuet
    12.05.2024 10:07

    лучше запустить скрипт

    А подскажите чайнику, как этот скрипт запускать? Я создал бота, зарегился на Groq. Подставил в код свои данные. Даже на всякий случай запустил у себя на компе

    pip install pyTelegramBotAPI groq 

    И че? Куда этот скрипт присобачить? Заранее спасибо.


    1. BURJUY
      12.05.2024 10:07

      +1 также не смог его запустить.

      root@instance-2024:/home/ubuntu/llama# pip3 install pyTelegramBotAPI

      root@instance-2024:/home/ubuntu/llama# pip install groq

      поставил зависимости, нажал запустить бота root@instance-2024:/home/ubuntu/llama# python3 bot.py

      и все ни привета не ответа, ни на что не отвечает VPS и бот


  1. theurus
    12.05.2024 10:07
    +1

    Для распознавания речи можно использовать бесплатный апи гугла, там ограничение до 1 минуты звука за один запрос, покрывает большую часть запросов а остальное можно отправлять в свой виспер. pip SpeechRecognition

    Для распознавания текста с картинок (скриншотов) - tesseract и результаты его работы встраивать в память, так чтоб можно было попросить исправить ошибки или перевести сразу.

    То есть добавлять в память бота строки типа (юзер попросил распознать текст с картинки, ассистент распознал такой то текст).

    Для гугления надо отдельную команду сделать потому что автоопределение далеко не всегда срабатывает.

    Бесплатное рисование есть на hugging face, там проблема с бесплатными ключами только в агрессивном кешировании, при одинаковом запросе моментально выдает то же самое изображение, надо переписывать запрос каждый раз хоть немного. Можно еще у бинга брать рисование но там попахивает воровством, на любителя.

    Бесплатный img2txt ищу, хоть какой-нибудь приличный, сейчас использую gemini но что с ним будет в будущем неясно, может платным станет.

    Мой бот тут https://t.me/kun4sun_bot работает в основном на бесплатном пока джемини. Исходники открыты на гитхабе, можно смотреть и трогать руками.


    1. abutorin
      12.05.2024 10:07

      джемини лучше проходит тест на 2+2*2:

      В отличии от остальных, даже при проверке на "уверенность" он не растерялся. А выше меня пытались убедить что я не правильно задаю вопрос. Вот этот бот этот тест проходит.


      1. GennPen
        12.05.2024 10:07
        +1

        Попробуйте без контекста сразу ему задать вопрос "сколько будет 2+2 умножить на 2?" (без пробелов между плюсом и цифрами), а то он может учитывать контекст предыдущего вопроса.


        1. abutorin
          12.05.2024 10:07

          снимаю шляпу.

          Ваш лом оказался крепче.

          Hidden text

          Купили как-то суровым сибирским лесорубам японскую бензопилу.
          Собрались в кружок лесорубы, решили ее испытать.
          Завели ее, подсунули ей деревце.
          «Вжик» — сказала японская пила.
          «У, бля...» — сказали лесорубы.
          Подсунули ей деревце потолще. «Вж-ж-жик!» — сказала пила.
          «Ух, бля!» — сказали лесорубы.
          Подсунули ей толстенный кедр. «ВЖ-Ж-Ж-Ж-Ж-Ж-Ж-ЖИК!!!» — сказала пила.
          «Ух ты, бля!!» — сказали лесорубы.
          Подсунули ей железный лом. «КРЯК!» — сказала пила.
          «Ага, бля!!!» — укоризненно сказали суровые сибирские лесорубы! И ушли рубить лес топорами…


          1. GennPen
            12.05.2024 10:07

            Думал на английском изменятся результаты.
            Но, весь фокус оказался в пробелах между цифрами и плюсом. Без пробелов он считает "2+2" одним блоком, поэтому и считает его с повышенным приоритетом.

            Hidden text


          1. GennPen
            12.05.2024 10:07

            В GPT-4o пофиксили эту проблему, отвечает правильно. =))

            Hidden text

            И никак не хочет переубеждаться. =))


            1. theurus
              12.05.2024 10:07

              Помнится однажды клауд уперся рогом и доказывал мне что 1+2 не равно 3, сказал что если моя учительница математики говорит иначе то надо её уволить чтоб детей не портила.


              1. GennPen
                12.05.2024 10:07

                С учительницей по математике тоже не прокатывает. Упорный, зараза. =)


  1. dimnsk
    12.05.2024 10:07

    А почему логотип от ollama ?


    1. evg_dc Автор
      12.05.2024 10:07

      потому, что это Llama


  1. oniliry
    12.05.2024 10:07

    Заинтересовала фитча web_search. Ее надо настраивать или она стоит по дефолту ? И можно ли использовать llama с прокси вместо ВПН ? В плане если ли возможность, как например в g4f передавать прокси с которого будут идти запросы, тем самым не ставя впн на свое устройство ?


    1. evg_dc Автор
      12.05.2024 10:07

      Всё надо настраивать, само не работает.
      С прокси, думаю, получится.


  1. papadulo
    12.05.2024 10:07
    +1

    подскажите, если у тебя есть европейский VPN, то зачем городить этот огород ведь можно бесплатно пользоваться chatgpt-3.5, которого хватает за глаза для обыденных задач?


    1. evg_dc Автор
      12.05.2024 10:07

      можно и не городить


    1. trabl
      12.05.2024 10:07

      Согласен, если есть машинка где-нибудь в AWS например, то помимо VPN можно поднять тот же squid, и использовать отдельный браузер с прокси для chatgpt, так удобнее, не нужно VPN постоянно включать. У меня это так и работает. Mozilla с прокси для chatgpt, Chrome без прокси для всего остального.


  1. jhas7
    12.05.2024 10:07

    Гугл выкатил новую турбо модельку, в бесплатной версии лимиты такие что лламу можно временно закапывать. Окно - 1млн токенов, вывод 8к, качество явно лучше чем у лламы3-70, скорость меньше но оно того стоит.