Pull to refresh

Comments 23

Вот бы такое сделать, но под Windows.

По идее все будет работать и под Windows (ollama есть под windows, а питон он и в Африке...), просто я не проверял :) Плюс можно все развернуть на той же Ubuntu 22.04 под WSL2 в Win10/11

WSL

А вот это было неожиданно)

Ушел проверять.

Такую мелкую ламу дают бесплатно у groq и openrouter, и возможно еще где-нибудь, не искал их специально, они слишком слабые для реального использования.

А какое железо нужно что бы юзать локально что-нибудь условно приличное, Mixtral 8x22B например?

https://ollama.com/library/mixtral

80гб видеопамяти?

Тот же Phi3:14b с 4К контекстом крутится у меня на 4060 с 8 гигами видеопамяти, чуть GPU оффлоада но скорость приличная вывода. Моделек на 8b/14b хватает для большинства задач типа перевода, генерации текстов, аналитики,кода (чат-бот написал же не зная Питона) и т. п. где не нужен большой контекст. Память сейчас хочу нарастить до 32 гигов по идее в GPU offload смогу и 128k попробовать.

Для больших от A6000 достаточно, там квантизацией можно их запихнуть в 48 гигов видеопамяти, а для контекста ОЗУ важно, 96 или 128 гигов желательно. Понятно что на H100 такое приятней всего "гонять".

То что дается бесплатно мелкое все равно не сравнится с движком у себя, так как тут я могу и несколько моделек параллельно и RAG, и даже мультимодальность.

Вот не надо ля ля, мелочь не пригодна для работы, для генерации нигерийских писем разве что.

Ну это лично ваше мнение. Вчера инструкцию изделия китайского машиностроения показывал, как переводить с помощью Phi3:14b - сказали, что уровень приличный, не хуже переводов средне-ценового фриланса. Все зависит от того, для чего вы используете модель - тот же нормальный копирайтинг даже ChatGPT с его 175 миллиардами не осиливает ;)

Это факт а не мнение. У мелких моделей есть проблемы даже с согласованием речи. Я пробовал использовать Phi3 14b для пересказа текстов, у нее же огромное окно 128к. Результат даже хуже чем у mistral 8b с 32к окном, а он звезд с неба не хватает.

Английский или русский? Английский у моделей норм, а вот русского не хватает по данным тренировки похоже. А Яндекс и Сбер модельками не делятся у которых хорошо с родным и могучим :(

И еще раз - все упирается в задачи, которые нужно решать. Скрапинг сайтов с подготовкой каркаса для текста, RAG, адаптация текстов под соцсети, переводы, где вне зависимости от модели скармливать больше 2К за раз не стоит и т.п - да. Ревью несложного кода или аналитика по презентации - тоже подойдут. Техподдержку тоже бота написать можно, там не нужны "мысею по древу" растекаться. Fine-tuning тоже для небольших моделей проще сделать и свою LORA.

Я в своей работе сам использую как Phi3 и Llama3 на своей домашней 4060 локально, так и GigaChat и нейроредактор Яндекса для полировки русских текстов и документации, так как у меня корпоративный VPN не дружит с внешним (привет CISCO :( ) и мне проще локальную модель юзать, чем переключаться для доступа к тому же ChatGPT или Copilot, а потом обратно через 2FA гемороиться.

Русский конечно. Задачи - генерация текста, пересказ, перевод. Писать код не может нормально даже большая часть огромных моделей, тот же Gemini 1.5 pro сильно заметно сливает чатгпт4*. А llama3-70b пишет код заметно хуже чем Gemini 1.5 pro.

Я так подозреваю что писать другие специализированные тексты они тоже не умеют нормально, но тут как с английским - невозможно проверить самому.

Я перевожу уже лет 20 с лишним в обе стороны RU-EN, поэтому английский там нормальный, по крайней мере технический начиная с llama3 уже. Причем тот же markdown llama3 не коверкает. Скажу так - перевод с вычиткой (модели иногда любят слова коверкать, даже ChatGPT) native редактор правит всего 4-5 ошибок на 5000 символов. Это показатель текста носителя языка, у меня иногда русский редактор больше правок вносит. Русский, как я уже выше написал, что надо модельку в которой на эти 8-14 миллиардов параметров, будет столько же русских данных, сколько английских. Может быть все таки Сбер выложит свои, было бы круто. А то только немцы и китайцы дообучают модели :(

Код более-менее Codestral начиная с 14b и CodeLlama с 34b, но последняя лучше на Python (специализированная), чем на остальных. Но коллега использует Codestral на Go и говорит что хорошо помогает. Опять же волшебной кнопки "напиши код" нет, нужно все таки понимать что и для чего пишешь :) Код из текущего примера я получил рабочий итераций через 50 и то, когда дозагрузил в RAG данные по новому API телеграмм.

Codestral 8x22B локально пользую. На CPU. Озушки хватает с запасом, а скорость, скорость вот очень малая. Но я вчера написал одну тестовую задачу с ним, 4 итерации - и код запустился, и отработал без ошибок. И потом запустился еще много тыщ раз. Без ошибок. Мне прям зашло. По скорости - генерирует оно на проце чуть больше одного токена в секунду, среднее время ответа составляет порядка от 5 до15 минут (хронометраж очень приблизительный). С работой чисто на видеокарте это разумеется ни в какие рамки, медленно, печально. Но я этот же функционал когда-то писал за неделю. А тут за пару часов получилось. Это с учетом того, что он ошибается в некоторых местах и надо поправлять.

3060 стоит мертвым грузом, а в ее озу размещается контекст, и всего лишь. Туда можно подгрузить некоторые слои, но на скорость это не влияет.

Ollama 3х70b тоже такая же ситуация. А вот квантизованная ollama 3х7b влезает в видеокарту и там ответы молниеносные. И довольно неплохие. Но 7b. Увы.

3060 с gpu offload можно догрузить, ollama умеет это делать автоматом.

https://ollama.com/library/codestral:22b

тут 13 гигов моделька, будет притормаживать на 8 гигах видеопамяти, но не 1 токен в секунду.

Спасибо большое! С помощью GPT4o переделал этот гайд под Windows, ещё RAG добавил (чтобы файлики читать и по ним вопросы задавать). Работает прилично, хотя и не без усилий. Правда, кажется, что он совсем не грузит GPU (10-20% загрузка на 4060 8GB mobile). Может llama3 - это далеко не предел возможного.

моделей в ollama много, можете поэкспериментировать. llama3:8b она занимает около 5 гигов видеопамяти, для загруза попробуйте phi3:14b ;)

Пока что попробовал Command-R взять, и оно даже влезло, но GPU RAM (8) и RAM (32) - в полку, CPU i9-13900 - 80-85%. Но уже посерьёзнее Llama 3 отвечает, и контекст хранит очень большой. Видимо, нужно таки нормальную видеокарту или несколько для таких экспериментов.

Как ты с RAG сделал? Можешь показать код?

Вот функция для этого (но в целом просто попроси GPT-4 дописать RAG для кода из этой статьи, он допишет):

# Функция для обработки загруженных файлов
async def handle_file(update: Update, context) -> None:
    file = update.message.document

    if not file:
        logging.error("No document found in update.message")
        return

    file_path = await file.get_file()
    
    # Ensure the 'downloads' directory exists
    os.makedirs('downloads', exist_ok=True)
    
    file_name = os.path.join("downloads", file.file_name)
    await file_path.download_to_drive(file_name)

    text = extract_text_from_file(file_name)
    user_id = update.effective_user.id

    if user_id not in user_files:
        user_files[user_id] = []
    user_files[user_id].append(text)

    await update.message.reply_text(f'Файл {file.file_name} загружен и проанализирован.')

    # Получение краткого описания содержания файла
    summary = summarize_text(text)
    await update.message.reply_text(f'Описание файла: {summary}')

    # Сохранение файла в контекст пользователя
    if user_id not in context_memory:
        context_memory[user_id] = []

    context_memory[user_id].append({'role': 'system', 'content': f'Документ содержит: {text}'})

    # Подтверждение использования документа
    await update.message.reply_text('Документ добавлен в контекст. Теперь вы можете задавать вопросы по его содержанию.')

def extract_text_from_file(file_path):
    text = ""
    if file_path.endswith('.pdf'):
        doc = fitz.open(file_path)
        for page in doc:
            text += page.get_text()
    elif file_path.endswith('.docx'):
        doc = DocxDocument(file_path)
        for paragraph in doc.paragraphs:
            text += paragraph.text + "\n"
    elif file_path.endswith('.txt'):
        with open(file_path, 'r', encoding='utf-8') as file:
            text = file.read()
    elif file_path.endswith('.csv'):
        df = pd.read_csv(file_path)
        text = df.to_string()
    elif file_path.endswith('.xlsx'):
        df = pd.read_excel(file_path)
        text = df.to_string()
    # Добавьте обработку других типов файлов, если необходимо
    return text

def summarize_text(text):
    prompt = f"Опиши в одном предложении содержание следующего текста: {text}"
    response = ollama.chat(model='llama3:latest', messages=[{'role': 'user', 'content': prompt}])
    summary = response['message']['content']
    return summary

А где тут RAG. Тут простой запрос который не сработает если текст больше чем окно у модели.

RAG это когда текст больше чем окно. Большой текст разбирают на токены и загоняют в специализированную бд в которой можно искать частичные совпадения с запросом и из них собирать ответ.

Здесь есть и запрос в том числе - он был нужен на этапе отладки, чтобы убедиться, что модель приняла и обработала документ, и может отвечать на вопросы по нему. С несколькими документами не заморачивался, так как не вижу смысла хранить их файлами, а не векторами - в полноценной версии можно будет закодить.

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

RAG это через langchain надо, там код несложный добавляет поиск по векторной базе, а вот базу создать уже чуть сложнее, нужно парсить доки, разбивать на чанки и т.п. Если хватит желания, напишу код, сейчас мучаем в компании RAG через OpenWebUI для полных чайников, но там создается векторная база и ее можно юзать через питон.

А как вычислить размер переданного контекста?

Сколько символов передали начиная с первого промта, столько и контекста ушло. Для английского языка 1 токен - 1 символ. Для русского если не ошибаюсь в llama3 3 токена - символ. При новом запросе прибавляем новые символы ответа на предыдущи и нового запросы - контекст нарастающим итогом считается.

Sign up to leave a comment.