RAG + Marcação Semântica

Outras línguas: English Español 한국어 中文

A importância da documentação difere entre projetos de software, mas mesmo a documentação mais importante desempenha um papel inerentemente auxiliar. Não é algo de que um programa dependa para funcionar corretamente. Mesmo quando a documentação compartilha dados com o programa, a conexão ainda é unidirecional. A documentação voltada para o usuário reflete o produto e não muda a maneira como o produto funciona.

A principal razão para isso é puramente tecnológica. Poderíamos implementar novos recursos e correções apenas escrevendo documentação - se as instruções em linguagem natural pudessem ser específicas o suficiente, e os computadores fossem excelentes em interpretá-las. Isso soa familiar, não é?

Enquanto o debate continua se a programação totalmente em linguagem natural será possível, essa possível mudança é na verdade sobre a acessibilidade do desenvolvimento de software, ao invés de introduzir uma nova maneira de os programas operarem. Em última análise, ainda estaríamos obtendo os mesmos binários, agora com um compilador adicional, admitidamente notável, envolvido.

A IA pode impulsionar recursos de uma maneira diferente? Hoje, gostaria de cobrir um dos recursos recentes impulsionados pela IA em IDEs do JetBrains, que aproveita o processamento de linguagem natural diretamente, transformando grande parte de nossa documentação em um recurso de desenvolvimento extremamente útil.

Pesquisa de ação

A partir da versão 2024.3, o Assistente de IA nas IDEs do JetBrains tem acesso às ações da IDE e ajuda você a encontrar a ação correta para o problema em questão. Além disso, pode executar esta ação para você:

O Assistente de IA sugere um recurso da IDE e mostra um botão para lançar a ação correspondente O Assistente de IA sugere um recurso da IDE e mostra um botão para lançar a ação correspondente

Como mencionado anteriormente, este recurso é impulsionado pela documentação. Embora o bom e velho código certamente desempenhe um papel, a seleção da ação correta depende exclusivamente de uma forma avançada de RAG (geração aumentada por recuperação) – sem a necessidade de inúmeras funções LLM ou mapeamentos especiais.

Antes de passarmos para os detalhes, vamos revisitar brevemente o conceito de RAG.

RAG

Geração aumentada por recuperação (RAG) é uma técnica comumente usado para melhorar a precisão e o embasamento das respostas LLM. É especialmente eficaz quando os LLMs são obrigados a dar respostas sobre tópicos além de seus dados de treinamento e fatos que mudam frequentemente, tornando o ajuste fino impraticável.

Em sua forma mais comum, a técnica consiste em manter um índice sobre a documentação. Neste índice, a chave reflete o significado de um elemento do documento, representado por incorporações (embeddings), e o valor corresponde ao conteúdo do elemento ou a uma referência ao próprio elemento. Graças à representação numérica das chaves, os elementos correspondentes podem ser comparados e recuperados semanticamente usando métodos como similaridade do cosseno ou k-nearest neighbors (KNN).

O diagrama do índice semântico - incorporações como chave, conteúdo como valor O diagrama do índice semântico - incorporações como chave, conteúdo como valor

Veja o que acontece quando você faz uma pergunta em um chat de IA assistido por RAG:

Como eu mudo o tamanho da fonte?

O sistema primeiro pesquisa o índice, e se isso for bem sucedido, anexa as descobertas ao prompt. Por exemplo:

Como eu mudo o tamanho da fonte?
Aqui estão algumas informações suplementares que podem ajudá-lo a responder à pergunta:
-> os resultados da pesquisa são inseridos aqui <-

Com essa abordagem, a resposta correta provavelmente pode ser inferida a partir das informações suplementares fornecidas, resultando em uma resposta mais informada e precisa do LLM. Do ponto de vista do usuário final, pode parecer que o modelo se tornou mais inteligente, enquanto na realidade o modelo permanece inalterado - a única diferença está no prompt.

Agora, vamos ver como podemos melhorar essa abordagem.

Marcação semântica

Se você escreve documentação técnica, provavelmente está familiarizado com o conceito de marcação semântica:

Com a marcação semântica, você especifica o “significado” por trás de cada elemento

Por exemplo, Markdown não é semântico. No Markdown, você opera com elementos comuns de documento como títulos, parágrafos, listas e assim por diante, além de algumas propriedades tipográficas. Esta sintaxe esboça uma estrutura de alto nível e diz ao processador como renderizar o documento. O que ele não diz é o propósito, ou o significado, de vários elementos dentro do documento.

Aqui está um breve exemplo. Os asteriscos indicam para o processador que ele deve colocar a frase em itálico, similares ao que <i> em HTML significa:

*Olhe para os dois lados antes de atravessar a rua!*

Em contraste, o MDX, um superconjunto do Markdown, tem propriedades semânticas. MDX permite que você defina elementos personalizados, que geralmente representam componentes de IU e podem comunicar o propósito pretendido do conteúdo:

<Warning>
    Olhe para os dois lados antes de atravessar a rua!
</Warning>

Ao contrário do Markdown simples, este exemplo específico do MDX abstrai o aspecto visual e se concentra no propósito do conteúdo. Como escritores de documentação, nos preocupamos menos se o <Warning> deve usar itálico ou se destacar de algum outro modo do texto regular. Seu estilo é definido em um lugar separado, como dentro do próprio componente, ou em uma folha de estilos CSS. Essa separação de preocupações torna a base de código mais fácil de manter e permite que você altere o estilo de uma maneira centralizada com base no significado do conteúdo.

Um par perfeito?

Na JetBrains, criamos nossa documentação usando Writerside. Esta ferramenta suporta tanto o Markdown quanto o XML semântico como formatos de origem para documentação. O exemplo abaixo mostra uma estrutura de documento típica escrita em XML semântico do Writerside:

<chapter title="Testing" id="testing">

    ... some content ...

    <procedure title="Navigate to tests" type="choices">
        <p>
            When at a symbol declaration, you can navigate to the corresponding
            tests by doing one of the following:
        </p>
        <step>
            From the main menu, select <ui-path>Navigate | Test</ui-path>.
        </step>
        <step>
            Press <shortcut key="GotoTest"/>.
        </step>
    </procedure>

    ... more content ...

</chapter>

Você notará que há algumas informações meta no trecho fornecido. Ele já é valioso pelas razões mencionadas acima, mas nada nos impede de colocá-lo para algum uso adicional.

Considere a tag <shortcut> , que representa um atalho dependente da plataforma. Esta tag é uma parte de uma camada de indireção que permite gerenciar e validar menções de atalhos de maneira centralizada.

Para inserir um atalho dentro de um documento, você usa a tag <shortcut> junto com o ID de ação correspondente assim: <shortcut key="CoolAction"> . Durante o processo de construção, a ferramenta valida e transforma os elementos <shortcut> nos atalhos de teclado reais para os keymaps disponíveis.

Essa abordagem sincroniza os atalhos entre a documentação e o produto, além de dar aos usuários da documentação a flexibilidade de escolher seu keymap preferido. Para ver isso em ação, visite ajuda do IntelliJ IDEA e observe como os atalhos mudam no texto dependendo do keymap selecionado no menu Shortcuts:

Página de ajuda do IntelliJ IDEA com o menu 'Shortcuts' no cabeçalho da página Página de ajuda do IntelliJ IDEA com o menu 'Shortcuts' no cabeçalho da página

Esse é o propósito principal da tag <shortcut> . Como essa tag pode ser beneficiada em termos de aprimoramento do RAG?

O uso mais direto é exibir atalhos específicos da plataforma no chat de IA, assim como na página de ajuda:

Assistente de IA mostra o atalho correto para a plataforma Assistente de IA mostra o atalho correto para a plataforma

No entanto, existe uma parte mais interessante. Semelhante à construção de índices para recuperar fatos e instruções, é possível construir índices que permitam a pesquisa de IDs de ação.

No cenário RAG mais simples discutido anteriormente, geramos as incorporações do mesmo elemento pretendido para recuperação. No entanto, para o índice de ID de ação, usaremos a seguinte estrutura:

O diagrama para o índice de 'ID de ação' - as chaves são as incorporações, os valores são os IDs de ação O diagrama para o índice de 'ID de ação' - as chaves são as incorporações, os valores são os IDs de ação

Nesse exemplo, o elemento que envolve a tag <shortcut key="GotoTest"/> seria a tag <step> ou até mesmo o <procedure> :

<procedure title="Navigate to tests" type="choices">
    <p>
        When at a symbol declaration, you can navigate to the corresponding
        tests by doing one of the following:
    </p>
    <step>
        From the main menu, select <ui-path>Navigate | Test</ui-path>.
    </step>
    <step>
        Press <shortcut key="GotoTest"/>.
    </step>
</procedure>

Contexto importa

Para demonstrar a importância de indexar o conteúdo do elemento que envolve, vamos usar como exemplo o recurso Set Value do IntelliJ IDEA. Este recurso permite que você atualize variáveis enquanto o programa está suspenso no modo de depuração.

O ID para a ação correspondente é SetValue . No entanto, este ID isoladamente não é particularmente descritivo. Dado que SetValue e muitos outros IDs são combinações de palavras bastante genéricas em programação, uma busca semântica baseada apenas nestes IDs resultará em uma parte inaceitável tanto de falsos positivos quanto de negativos. Sem incluir o contexto adicional no índice, a tarefa se torna praticamente impossível.

Em contraste, ao estabelecer a relação entre o ID da ação e o conteúdo circundante, fornecemos ao Assistente de IA detalhes sobre a funcionalidade exata, seus casos de uso comuns e limitações. Essas informações aumentam significativamente a precisão da recuperação:

O Assistente de IA sugere o recurso correto (Definir Valor) para uma solicitação que fala sobre 'Atualizar uma variável' O Assistente de IA sugere o recurso correto (Definir Valor) para uma solicitação que fala sobre 'Atualizar uma variável'

A parte do cliente

Por fim, uma vez que o Assistente de IA tem o ID de ação correto, pode sugerir essa ação e até exibir um botão para invocá-lo diretamente do chat:

O Assistente de IA exibe um botão que permite executar a ação diretamente do chat O Assistente de IA exibe um botão que permite executar a ação diretamente do chat

Claro, essa parte é um pouco mais complexa do que simplesmente adicionar um botão à IU. Dado que as ações da IDE dependem do contexto, existem verificações adicionais que precisam ser implementadas, mas este tópico é muito específico para o desenvolvimento da Plataforma IntelliJ e justifica uma discussão separada por si só.

Outros elementos de marcação

Neste post, nos concentramos principalmente no recurso de ‘pesquisa de ação’, que funciona recuperando IDs de ação da tag <shortcut> do Writerside. No entanto, você pode aplicar os mesmos princípios a muitos outros tipos de elementos dentro da marcação semântica.

Apenas um exemplo rápido usando o elemento <ui-path>. Este elemento denota uma série de elementos de IU, como itens de menu, pelos quais é preciso navegar para acessar a funcionalidade descrita.

<step>
    Open the IDE settings (<shortcut key="ShowSettings"/>),
    then navigate to <ui-path>Tools | Terminal</ui-path>.
</step>

Faz todo o sentido fornecer caminhos longos na ajuda da web, porque a navegação direta de uma página da web para o produto geralmente não é prática. Por outro lado, quando um usuário pergunta sobre isso no produto, não há motivo para não mostrar a página de configurações correspondente imediatamente:

O Assistente de IA mostra um botão que permite que você navegue diretamente para o menu referenciado na documentação O Assistente de IA mostra um botão que permite que você navegue diretamente para o menu referenciado na documentação

Resumo

Há algum tempo, muitos imaginaram o conceito de Web 3.0. A ideia era mover toda a web para marcação semântica, para que as máquinas pudessem usá-la como as pessoas. Embora isso não tenha acontecido, é interessante como as mesmas ideias estão se tornando relevantes novamente, agora a partir da perspectiva das ferramentas e técnicas modernas.

O recurso que cobri neste artigo é apenas um exemplo de como você pode alavancar suas boas práticas existentes, como a marcação semântica, com os sistemas IA Gen. Existem muito mais a serem explorados. Se você tem um interesse particular em RAG, aqui está uma excelente coleção de tutoriais sobre geração aumentada por recuperação.

Você gostou do artigo? Gosta de experimentar com IA Gen? Embora meu blog não tenha uma seção de comentários, ainda ficaria feliz em ouvir sua perspectiva e casos de uso, então não hesite em entrar em contato usando os contatos na parte inferior.

Te vejo em breve!

all posts ->