Executando verificação de segurança...
9

MOON - Metadata Oriented Object Notation

Eu estava vendo essa conversa sobre TOON nesses dias, e achei o formato um CSV piorado, sem tipagem em com péssima capacidade de aninhamento. Mas achei legal pensar em alternativas de formato de dados para envio e consumo, então surgi com a ideia do MOON, ou Metadata Oriented Object Notation.

Basicamente a minha ideia foi pensar em uma forma de separar estrutura e dado dentro de uma mesma mensagem. Basicamente você fornece ao recebedor da informação os dados e a forma como so dados devem ser compreendido. Por isso Metadata Oriented, pois a mensagem tem dados e dados sobre os dados.

Minha ideia é simplesmente de usar o que já temos em POO, ou seja, a divisão entre a declaração da classe e o ato de instanciar o objeto. Por isso, deve existir a declaração das entidades que compõem os dados, começando com o operador # (tipo um import em C e C++) e terminando com o ;.

Por exemplo, se eu quero enviar uma mensagem com um pedido, eu preciso declarar dentro da própria mensagem:

# Usuario(id: int, nome: string, email: string);
# Produto(id: int, nome: string, preco: float, categorias: string[]);
# ItemPedido(produto: Produto, quantidade: int);
# Pedido(id: int, cliente: Usuario, itens: ItemPedido[], total: float, status: string);

Após isso, basta seguir com a declaração de qual entidade deve ser usada e quais dados devem ser considerados, por exemplo:

Pedido(
    9812,
    Usuario(1, "Lucas", "[email protected]"),
    [
        ItemPedido(
            Produto(33, "Mouse RGB", 199.90, ["periférico", "hardware"]),
            2
        ),
        ItemPedido(
            Produto(51, "Teclado Mecânico", 499.00, ["hardware"]),
            1
        )
    ],
    898.80,
    "confirmado"
)

Ao fazer isso, é possível enviar até mais contexto do que usando o JSON, já que o JSON não informa o que cada conjunto de dados representa, sendo puramente uma relação chave: valor. Ou seja, com o MOON seria possível trafegar ainda mais informação, utilizando possivelmente uma menor quantidade de tokens (para quem está preocupado com o consumo no cenário de uso por modelos de linguagem).

É verdade que em cenários de mensagens pequenas, a adição de metadados acabaria aumentando os tokens, apesar de não ser necessário passar as chaves. Mas em grandes mensagens, com muitos objetos aninhados e arrays de objetos, seria possível ganhar quase a mesma economia pretendida pelo TOON

Aqui eu tenho um exemplo de como seria um payload em JSON vs o mesmo em MOON

JSON

{
  "id": 9812,
  "cliente": {
    "id": 1,
    "nome": "Lucas",
    "email": "[email protected]"
  },
  "itens": [
    {
      "produto": {
        "id": 33,
        "nome": "Mouse RGB",
        "preco": 199.9,
        "categorias": ["periférico", "hardware"]
      },
      "quantidade": 2
    },
    {
      "produto": {
        "id": 51,
        "nome": "Teclado Mecânico",
        "preco": 499.0,
        "categorias": ["hardware"]
      },
      "quantidade": 1
    }
  ],
  "total": 898.8,
  "status": "confirmado"
}

MOON

# Usuario(id: int, nome: string, email: string);
# Produto(id: int, nome: string, preco: float, categorias: string[]);
# ItemPedido(produto: Produto, quantidade: int);
# Pedido(id: int, cliente: Usuario, itens: ItemPedido[], total: float, status: string);

Pedido(
    9812,
    Usuario(1, "Lucas", "[email protected]"),
    [
        ItemPedido(
            Produto(33, "Mouse RGB", 199.90, ["periférico", "hardware"]),
            2
        ),
        ItemPedido(
            Produto(51, "Teclado Mecânico", 499.00, ["hardware"]),
            1
        )
    ],
    898.80,
    "confirmado"
)

No final, quero dizer que essa proposta é bem mais um desafio pessoal de curiosidade, onde parei para pensar em formas diferentes de organizar as informações, e não algo formalizado que eu realmente vou defender até o fim e propor como forma de substituir o JSON ou o TOON.

Só queria compartilhar a viagem e saber o que vocês pensam sobre. Faz algum sentido? Ou tô completamente doidão?

Carregando publicação patrocinada...
2

Acho que o principal problema dessa proposta é que não atende o objetivo da necessidade de ter um novo formato. Assim como o TOON não atendeu. A ideia é usar o mínimo de tokens possíveis e manter a acurácia do modelo sobre as informações.

A solução apresentada é interessante, mas é mais funcional para humanos do que para LLM's eu diria. Fiz alguns testes e do jeito que está proposto, o JSON comprimido tem um custo de 103 tokens e o MOON tem o custo de 166.

Mesmo comprimindo o MOON (removendo os espaços, identação, etc) cai para 128. Se mesmo seguindo a sugestão do @wesleyfralima, caí para 117. Ou seja, não trás benefícios práticos. Provavelmente, modelos de dados mais complexos tornariam a quantidade de tokens ainda mais distantes do formato JSON comprimido.

E por último, não menos importante ainda ter a acurácia. Sem a validação dela, a proposta perde um pouco de valor, afinal é preciso alguma mensuração sobre como o modelo vai se comportar com esse novo formato estruturado.

1

Meus 2 cents,

Sim, parece fazer sentido - achei a proposta do MOON mais util que o TOON.

Confesso que nao gosto muito de estruturas baseadas em posicao (como CSV, TOON), mas reconheco que para grandes quantidades de dados eh bem util.

Enfim, se fizer um paper sobre o MOON com certeza vai ter minha 'star' no repositorio.

Saude e Sucesso !

1

Achei interessante!

Em qual contexto seria melhor usar o MOON?

Por exemplo, pelo que li, o TOON ajuda a otimizar a quantidade de tokens usados nos chats com inteligências artificiais.

Aparentemente o MOON é melhor para um humano ler, pois é bem semântico.

Talvez você consiga diminuir a quantidade de tokens, em comparação ao JSON, se omitir os "nomes" após a primeira definição.

Por exemplo, como já definiu os "tipos", bastaria "instanciar" o primeiro "nome":

# Usuario(id: int, nome: string, email: string);
# Produto(id: int, nome: string, preco: float, categorias: string[]);
# ItemPedido(produto: Produto, quantidade: int);
# Pedido(id: int, cliente: Usuario, itens: ItemPedido[], total: float, status: string);

Pedido(
    9812,
    (1, "Lucas", "[email protected]"),
    [
        (
            (33, "Mouse RGB", 199.90, ["periférico", "hardware"]),
            2
        ),
        (
            (51, "Teclado Mecânico", 499.00, ["hardware"]),
            1
        )
    ],
    898.80,
    "confirmado"
)