Pull to refresh

Comments 28

то всем прям мечталось про "человекочитаемый" xml, json вместо бинарного, теперь забоимся об llm

А можно было действительно просто юзать yaml формат, он тоже более компактный для числа токенов по сравнению с json.

Пример из README: вместо обычного JSON с пользователями — строка users[2]{id,name,role}: и две строки 1,Alice,admin и 2,Bob,user. Структура при этом не теряется: объекты, массивы и примитивы остаются теми же, формат — просто «другая запись» того же JSON.

Того же - это какого?

Больше похоже на CSV чем JSON

это мне минус в карму за то, что я указал на ошибку в статье, сгенеренной ИИ?

Астрологи объявили неделю замен JSON.

Пример из README: вместо обычного JSON с пользователями — строка users[2]{id,name,role}: и две строки 1,Alice,admin и 2,Bob,user. Структура при этом не теряется: объекты, массивы и примитивы остаются теми же, формат — просто «другая запись» того же JSON.

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

Для примера - покажите, как выглядят в вашем TOON, например, те же данные, но представленные в JSON как

[{}, {"admin":"Alice"}, {"user":"Bob"}]

Да корячит его, этот конвертор. Я ему [{"1":1},{"2":"1"},[{"1":1},{"2":"1"}]], а в ответ маловменяемое

[3]:
  - "1": 1
  - "2": "1"

Само собой, обратная операция приводит к ошибке "Error: Expected 3 list array items, but got 2".

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

Конвертер корёжит от моего базированного JSON'а

Пример из README: вместо обычного JSON с пользователями — строка users[2]{id,name,role}: и две строки 1,Alice,admin и 2,Bob,user

Что за каша? Неужели нельзя было привести нормальный пример c форматированием? Пока не перешел на гитхаб, ничего не понял из новости.

JSON
{
  "users": [
    { "id": 1, "name": "Alice", "role": "admin" },
    { "id": 2, "name": "Bob", "role": "user" }
  ]
}
TOON
users[2]{id,name,role}:
  1,Alice,admin
  2,Bob,user

Ого, изобрели CSV со строкой заголовка.

На самом деле не совсем, зависит от структуры входного json.
Если бы "команда ТГК «AI for Devs»", которая "эту новость подготовила" не были такими валенками, они привели бы и примеры в тексте, и дали бы ссылку на онлайн демонстрацию:
https://toontools.vercel.app/tools/json-to-toon

Что за велосипед из YAML и CSV? Если хоть один объект в массиве содержит не скалярный атрибут, то это превращается в обычный YAML с явным указанием числа элементов массива. Зачем? В случае массива "плоских" объектов будет CSV опять же с указанием числа элементов. Снова: зачем?

почему бы не использовать саму csv, раз она самая экономная?
добавив/разработав специализированную csv-schema и обучив модели работать с этим форматом.

вдруг кто разбирается в теме.

Ответ можно найти в статье по ссылке: точность нейросети при использовании CSV низкая.

Читаемый-то он может и читаемый, но то, что читается, кто-то же и писать должен или редактировать. Обновлять каждый раз число элементов массива - такое себе. AI на этом тоже будут ломаться на ура. Комментарии даже не додумались добавить, один из самых серьёзных недостатков JSON.

Это всё потому что с 80-х формат "чтения человеком" подразумевает Volkov/Norton Commdander/блокнот в виде "открыть .txt". То есть спецификация полувековой давности уже почти. Мы привыкли работать с самыми примитивными редакторами, так как их сдерживает именно такое описание. Вместо того чтобы приложить усилия именно на сам редактор, который будет поддерживать сказанное по умолчанию и генерить по выходу уже файл с комментами, которые вставляются туда либо как двоичка, либо как текст с тегом как угодно, предлагается опять свистопляска вокруг парсеров CSV, {}, #, @#$@#% как символов-разделителей помимо знаменитых 0x10 и 0x13.

Ох уж эти линейные файлы с алфавитно-цифровым последовательным вводом. В 21-м веке проще уже написать промт:
- write simple spreadsheet editor usind ncurses using python
Получить рабочий вариант что то вроде

Скрытый текст
import curses
import sys

# Data for the spreadsheet (using a 2D list)
sheet_data = [
    ["id", "name", "role"],
    ["1", "Alice", "Admin"],
    ["2", "Bob", "User"],
]

ROWS = len(sheet_data)
COLS = len(sheet_data[0])  # Use the number of columns in the first row
CELL_WIDTH = 12

current_row = 0
current_col = 0


def draw_sheet(stdscr):
    """Draws the current state of the sheet to the screen."""
    stdscr.clear()
    for i in range(ROWS):
        for j in range(COLS):
            content = str(sheet_data[i][j])[:CELL_WIDTH - 1]
            display_str = f"{content:<{CELL_WIDTH - 1}}"

            # Highlight the current cell
            if i == current_row and j == current_col:
                stdscr.attron(curses.A_REVERSE)
                stdscr.addstr(i, j * CELL_WIDTH, display_str)
                stdscr.attroff(curses.A_REVERSE)
            else:
                stdscr.addstr(i, j * CELL_WIDTH, display_str)

    stdscr.addstr(ROWS + 1, 0, "Navigate: Arrow Keys | Edit: Enter Key | Quit: 'q'")
    stdscr.refresh()


def edit_cell(stdscr):
    """Allows user to edit the content of the current cell."""
    global sheet_data

    # Enable echoing characters to the screen during input and show cursor
    curses.echo()
    #stdscr.curs_set(1)

    prompt_y = ROWS + 2

    # Clear the prompt line before displaying new prompt
    stdscr.move(prompt_y, 0)
    stdscr.clrtoeol()

    current_value = str(sheet_data[current_row][current_col])
    stdscr.addstr(prompt_y, 0, f"Enter new value for [{current_value}]: ")

    # Read user input starting after the prompt text
    # The input length is limited to CELL_WIDTH - 1 chars
    input_str = stdscr.getstr(prompt_y, 29, CELL_WIDTH - 1).decode('utf-8')

    if input_str:
        sheet_data[current_row][current_col] = input_str

    curses.noecho()  # Turn off echoing
    #stdscr.curs_set(0)  # Hide cursor

    # Clear the prompt line again after input is done
    stdscr.move(prompt_y, 0)
    stdscr.clrtoeol()


def main(stdscr):
    """Main function to initialize curses and handle input loop."""
    global current_row, current_col

    curses.curs_set(0)  # Hide the cursor initially
    stdscr.keypad(True)  # Enable special keys (arrow keys, Enter key etc.)

    while True:
        draw_sheet(stdscr)
        key = stdscr.getch()

        if key == ord('q'):
            break
        elif key == curses.KEY_UP:
            if current_row > 0:
                current_row -= 1
        elif key == curses.KEY_DOWN:
            if current_row < ROWS - 1:
                current_row += 1
        elif key == curses.KEY_LEFT:
            if current_col > 0:
                current_col -= 1
        elif key == curses.KEY_RIGHT:
            if current_col < COLS - 1:
                current_col += 1
        elif key == curses.KEY_ENTER or key in [10, 13]:  # 10 and 13 are ASCII codes for Enter
            edit_cell(stdscr)


if __name__ == '__main__':
    # curses.wrapper handles initialization and safe termination
    curses.wrapper(main)

Запускать в терминале python3 скрипт (пайчарм не эмулирует в должной мере ncurses)

Ну или более графическое:

Скрытый текст
import sys
from PyQt6.QtWidgets import (
    QApplication, QMainWindow, QTableWidget, QTableWidgetItem,
    QVBoxLayout, QWidget, QHeaderView
)
from PyQt6.QtCore import Qt

class SpreadsheetEditor(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Simple PyQt6 Spreadsheet Editor")
        self.setGeometry(100, 100, 800, 600)

        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        self.layout = QVBoxLayout()
        self.central_widget.setLayout(self.layout)

        self.tableWidget = QTableWidget(10, 5)  # 10 rows, 5 columns
        self.layout.addWidget(self.tableWidget)

        self.init_ui()

    def init_ui(self):
        # Set horizontal headers (column names)
        headers = ["A", "B", "C", "D", "E"]
        self.tableWidget.setHorizontalHeaderLabels(headers)

        # Ensure headers stretch to fill available space
        self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch)

        # Populate with some default data (optional)
        for row in range(10):
            for col in range(5):
                item_text = f"Row {row + 1}, Col {col + 1}"
                # QTableWidgetItem stores the value
                item = QTableWidgetItem(item_text)
                self.tableWidget.setItem(row, col, item)

def main():
    app = QApplication(sys.argv)
    editor = SpreadsheetEditor()
    editor.show()
    sys.exit(app.exec())


if __name__ == "__main__":
    main()

То есть отходить от того что для чтения и редактирования данных нужно под рукой иметь всегда такое что интерпретирует перевод строки и возврат каретки из 60-х годов прошлого века. Настала эпоха кастомных редакторов непосредственно под данные, тогда это и будет HRF. Помимо описания самой разметки (хоть двоичной) существует некая абстрактная спецификация на средство визуализации, редактирования и её хранения, которое затем транслируется в исполняемый Web/system GUI/консоль.

Это самое интересное что за эти 25+ лет если вернуться в любые IDE-шки того времени то что называется найдите пару отличий. Особо ничего не поменялось разве что принципиальный момент - это добавился AI ассистент, и то только в роли быстрого справочника. То есть как была файловая система как средство структурирования так и осталась, как был С для эмбеддеров так и сейчас во главе. То есть значимого прогресса в концептуальной области нет, это следствие обучения этому делу по "классике", йота-экзабайты легаси, требования со стороны коммерции "работает-не трожь" и войти в айти за 21 день, где собственно кроме той самой классики с синтаксическим сахаром больше ничего и нет.

Опять-таки AI заставляют делать не свойственное ему дело - программировать на том на чём это делает человек. Гораздо эффективнее будет даваться некий мета-язык, пусть даже байткод с атрибутами для HRF, но система команд которого уместится грубо говоря в 256 байт. То есть обучение уже будет непосредственно на алгоритмах и вобрать он может в локальную память гораздо больше чтобы можно было ему запускать автоматом тесты и самому себе делать assertions и проверять их, чтобы избежать глюков сетей.

А как с длинными последовательностями в TOON? Например, LLM-native XML практически не даёт путаницы на 50-100к токенов, например данные в формате

<users><user_1 name="Alice" role="admin” /></users>

Будут хорошо читаться и строиться как LLM, так и SLM. В TOON, как и в json довольно большая полисемия, LLM будет по-любому путаться на больших контекстах.

Скрестили json с csv. В чем новость? )))

Sign up to leave a comment.

Other news