Обновить

Высокоэнтропийный вайбкодинг

Уровень сложностиПростой
Время на прочтение15 мин
Охват и читатели14K
Всего голосов 11: ↑5 и ↓6+1
Комментарии8

Комментарии 8

хотеть закрыть статья конецхотеть

Высочайшая энтропия!

Задача довольно простая - как с использованием минимально возможного набора слов без приставок, суффиксов, окончаний или с их минимумом, а также союзов и других вспомогательных речевых конструкций получить на выходе годный код с 0% ошибок и 90% функционала согласно такому промпт-ТЗ.

Задача понятна. А цель задачи?

И как вы понимаете слово "высокоэнтропийный"?

Высокоэнтропийный - весьма условно, по аналогии с losless сжатием, когда энтропия после архивации возрастает (см спойлер). То есть мы условно вспомогательные элементы размещаем внутрь слова так как они являются избыточными. Целью является эксперимент по определению "векторения" или схожести текста с точки зрения модели. Это непосредственно связано с входным токенизатором и эмбеддером.
Гипотеза. Вероятно, что несмотря на обучение грамматически более-менее разговорным текстам в датасетах, выходная информация в виде кода довольно скудна, по-сути там из слов только for if else do while class.... поэтому, направление вектора может быть задано приближённо, за счёт разницы между семантикой разговорного языка и семантикой языков программирования, который гораздо менее насыщен. Фактически скудная семантика как бы "квантует" фразы, оставляя больше простора для вариаций.
В этом случае контекстное окно можно использовать ещё лучше, при этом остаётся и понятный смысл для человека и надёжная реализация вывода модели.


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

Вайб-калькулятор Шеннон-энтропии

Хотеть Питон открыть аргумент скрипт файл считать 8 бит энтропия Шеннона среднее значение весь файл

import sys
import math
from collections import Counter

def analyze_file(filepath):
    try:
        with open(filepath, 'rb') as f:
            data = f.read()
        
        if not data:
            print("Файл пуст.")
            return

        # Среднее значение (Mean)
        mean_val = sum(data) / len(data)

        # Энтропия Шеннона
        counts = Counter(data)
        file_len = len(data)
        entropy = -sum((count / file_len) * math.log2(count / file_len) 
                       for count in counts.values())

        print(f"Файл: {filepath}")
        print(f"Среднее значение (byte mean): {mean_val:.4f}")
        print(f"Энтропия Шеннона: {entropy:.4f} бит/байт")

    except FileNotFoundError:
        print("Ошибка: Файл не найден.")
    except Exception as e:
        print(f"Произошла ошибка: {e}")

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Использование: python script.py <путь_к_файлу>")
    else:
        analyze_file(sys.argv[1])

Необходимо для чистоты эксперимента взять текстовый файл побольше, около мегабайта, например, на просторах полное собрание стихотворений Пушкина около 712 кБ. В архиве tar.gz 320 кБ
Результат

python3 entropy.py push.txt  
Файл: push.txt
Среднее значение (byte mean): 171.1301
Энтропия Шеннона: 5.1418 бит/байт

Файл: push.tar.gz
Среднее значение (byte mean): 127.2625
Энтропия Шеннона: 7.9972 бит/байт

Видно, что за счёт ASCII кириллицы среднее значение смещено вверх в диапазон символов, после архивации данные выглядят как белый шум со средним значением 128 как 256/2 - двоичная последовательность.




P.S. почему "хотеть" - на hugging face есть весёлые датасеты из разряда "go_emotions", вполне вероятно это помогает заострить внимание на то, что это начало технического задания.

Идея интересная, однако как по мне не достаточно раскрыта в этой статье.

Да, результат есть, но без сравнения с обычным промптингом на разговорной речи не понятен уровень эффективности.

Целью является эксперимент по определению "векторения" или схожести текста с точки зрения модели. Это непосредственно связано с входным токенизатором и эмбеддером.

А тут (в идеале) было бы сравнить так же доступные токенизаторы на открытых моделях и посмотреть, какое влияние оказывает входной промпт для "векторения". Сравнить эффективность одного и того же кода, после одного и другого промпта в численном эквиваленте.

Вот теперь уже самое сложное, привык к такому вот вайбкодингу. То есть очень кратко и образно описать алгоритм что на английском что на русском. В английском можно редуцировать всё до группы времён simple, на русском глаголы в несовершенном виде, слова без приставок суффиксов и окончаний. Как-то это всё работает даже лучше (субъективно) чем пытаться подробно объяснить что необходимо. Чем больше пытаюсь объяснить подробно - тем больше вылазят глюки. Я специально привёл пример разрыва окна на прототипе функции С. Если в промпте что-то поменять в хвосте, обязательно в main.с сломаются аргументы вызова, он может в функцию вместо 7 аргументов поставить 8, изменить типы данных с float на int. То есть чем более кратко тем лучше. По поводу эмбеддеров можно попробовать. В качестве эмбеддера берём облачный на cloud.ru

Тестируем вектор предложений
  1. Создаём инстанс эмбеддера и настраиваем у провайдера, формируем сервисный аккаунт, назначаем или оставляем пустой роль в организации, получаем API ключ, закидываем на баланс минимальный квант вместо кофе, нам потребуется Embedder baai bge m3

  2. Берём питон-код пустышку отсюда.

  3. Чтобы не светить ключём и преобразовать в эмбеддер пишем следующий промпт

Вайб-настройка эмбеддера от провайдера

Оё-ёй! безопасно ключ не свети тут!
import os from openai import OpenAI api_key = os.environ["API_KEY"] url = "https://foundation-models.api.cloud.ru/v1" client = OpenAI( api_key=api_key, base_url=url ) response = client.chat.completions.create( model="ai-sage/GigaChat3-10B-A1.8B", max_tokens=2500, temperature=0.5, presence_penalty=0, top_p=0.95, messages=[ { "role": "user", "content":"Как написать хороший код?" } ] ) print(response.choices[0].message.content)
это пример обратиться к модели сайт. Преобразовать чтение ключа файл key.txt используй модель равно BAAI/bge-m3. Хотеть тест ембеддер вектор 1024 две строки читай строка1.txt строка2.txt выведи часть вектора 1 и 2 и степень схожести используй эмбеддер апи

В результате имеем код. Разместить ключ в файл key.txt и предложения в строка1.txt и строка2.txt которые необходимо сравнить

import os
from openai import OpenAI
import numpy as np

# 1. Читаем ключ из файла
with open("key.txt", "r") as f:
    api_key = f.read().strip()

# 2. Читаем строки из файлов
with open("строка1.txt", "r", encoding="utf-8") as f:
    text1 = f.read().strip()
with open("строка2.txt", "r", encoding="utf-8") as f:
    text2 = f.read().strip()

url = "https://foundation-models.api.cloud.ru/v1"
client = OpenAI(api_key=api_key, base_url=url)

# 3. Получаем эмбеддинги
def get_embedding(text):
    response = client.embeddings.create(
        model="BAAI/bge-m3",
        input=text,
        encoding_format="float"
    )
    return response.data[0].embedding

vec1 = np.array(get_embedding(text1))
vec2 = np.array(get_embedding(text2))

# 4. Расчет схожести (Cosine Similarity)
similarity = np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))

print(f"Размер вектора: {len(vec1)}")
print(f"Часть вектора 1 (первые 5): {vec1[:5]}")
print(f"Часть вектора 2 (первые 5): {vec2[:5]}")
print(f"Степень схожести: {similarity:.4f}")

Содержимое строка1.txt
Хотеть питон скрипт реализация принтф текстовая строка читай файл

Содержимое строка2.txt
Создай скрипт на Питон который читает файл и выводит на экран текстовую строку с использованием функции printf

Устанавливаем необходимые pip-ы и запускаем ./generate_requirements.sh embcloud.py   Running embcloud.py... Размер вектора: 1024

Часть вектора 1 (первые 5): [-0.0236261  -0.02383822 -0.023057   -0.02170362 -0.0012989 ]

Часть вектора 2 (первые 5): [-0.02825816 -0.008068   -0.01357161 -0.02528192  0.00704397]

Степень схожести: 0.8607

Всё что выше 0.6 полностью пригодно для генерации.

Речекряк

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации