Você não gosta de ler as mensagens de compromisso de outras pessoas? Não? Bem, eu gosto e, enquanto lia uma mensagem de confirmação muito perspicaz, percebi todo o conteúdo inexplorado que existe em vários logs do Git (supondo que o desenvolvedor que você segue esteja escrevendo mensagens úteis, é claro). Então, não seria ótimo se você pudesse fazer perguntas a um repositório? Vamos ver como isso pode ser feito usando o RAG com o Couchbase Shell.

TL;DR

Configuração do Couchbase Shell

A etapa inicial é instalar e configurar o cbsh. Vou usar minha instância do Capella. Para obter a configuração, você pode acessar a seção Conectar de seu cluster do Capella e selecione Shell do Couchbase. Esta é a configuração em [[cluster]]. Para configurar o modelo, dê uma olhada no que está em [[llm]]. Eu escolhi o OpenAI, mas há outros. Você precisa definir o modelo usado para a incorporação (que é o que transforma o texto em um vetor) e um para o Chat. Esse modelo recebe a pergunta e algum contexto adicional para responder à pergunta. E, é claro, você precisará de uma chave de API.

Você também precisa ter o Git instalado e, então, estará tudo pronto.

Importar o registro de confirmação do Git

A primeira etapa é obter todos os commits do repositório em JSON. Por ser preguiçoso e velho, e por velho quero dizer que não estou acostumado a perguntar a uma IA, pesquisei isso no Google, encontrei vários Gists com links para outros Gists e, por fim, resolvi neste caso.

Eu o baixei, fiz o sourcing, entrei no meu repositório git local do couchbase-shell e o chamei.

Mas, para que o leitor se pergunte se tomei a decisão certa, vamos perguntar ao modelo configurado. A Cbsh tem um perguntar permitindo que você faça isso:

Esse comando produzirá cada commit no repositório como um objeto JSON com o hash do commit, o nome e o e-mail do autor, a data do commit e a mensagem do commit. O --tudo garante que todas as ramificações sejam incluídas. A bandeira --reverso lista os commits em ordem cronológica inversa. Por fim, a saída é redirecionada para um arquivo commits.json arquivo.

Certifique-se de executar esse comando no diretório raiz do repositório Git do qual você deseja obter os commits.

E, como se vê, ele não funciona imediatamente (chocante, eu sei). E não tinha todas as informações de que eu precisava, como a parte do corpo da mensagem. É claro que poderíamos gastar tempo ajustando isso, mas é muito específico, com muitos casos extremos.

De qualquer forma, agora tenho uma lista de commits no formato JSON:

Então, o que você pode fazer com uma matriz JSON de objetos JSON? Você pode importá-lo por meio da interface do usuário do Capella ou importá-lo com o Couchbase Shell. Primeiro, eu crio o array escopo e coleção e selecioná-los com cb-env e, em seguida, criar o índice SQL++.

Como o cbsh é baseado no Nushell, o arquivo JSON resultante pode ser facilmente aberto, transformado em um dataframe, transformado em um documento do Couchbase e inserido dessa forma:

Vamos obter alguns documentos só para ver como funcionou:

Portanto, esse é o conteúdo que poderíamos usar para o RAG. É hora de enriquecer esses documentos.

Enriqueça o documento com um modelo de IA

Para enriquecer o documento, você precisa ter um modelo configurado. Aqui estou usando o OpenAI e o enriquecer-doc comando cbsh:

A cláusula SELECT retornará um objeto JSON com o conteúdo do documento e campos adicionais id e texto. O texto é o assunto e o corpo anexados em uma única string. O objeto é agrupado em um objeto de conteúdo e fornecido ao vetor enriquecer-doc com texto como parâmetro, pois esse é o campo que será transformado em um vetor. Agora deve haver um textVector em cada documento.

Pesquisa de vetores

Para pesquisar esses vetores, precisamos criar um índice Vector Search. Isso pode ser feito por meio da API ou da interface do usuário para algo personalizável. Aqui, estou satisfeito com as opções padrão e, por isso, uso o cbsh:

O índice criado usará ponto_produto como um algoritmo de similaridade, a dimensionalidade do vetor será de 1536, o nome do índice é comprometer e o campo indexado é textVector. O bucket, o escopo e a coleção são os selecionados por meio de cb-env.

Para testar a pesquisa vetorial, a consulta de pesquisa deve ser transformada em um vetor e depois canalizada para a pesquisa:

Ele retorna 3 linhas por padrão. Vamos estendê-lo para ver o conteúdo do documento. Estou adicionando rejeitar -i textVector para remover o campo vetorial, pois ninguém precisa de um campo de 1536 linhas na saída do terminal:

Pergunte ao seu repositório Git

A partir daí, você tem todos os commits de um repositório Git armazenados no Couchbase, enriquecidos com um modelo de IA, e todos indexados e pesquisáveis. A última coisa a fazer é chamar o modelo para executar uma consulta com o RAG. Ele começa transformando uma pergunta em um vetor, canaliza-a para uma pesquisa de vetor, obtém o documento completo a partir dos IDs de retorno, seleciona o objeto de conteúdo sem o campo de vetor, transforma cada objeto em um documento JSON (dessa forma, podemos enviar o conteúdo e seus metadados estruturados), envolve o jsonText em uma tabela e, por fim, canalizá-lo para o perguntar comando:

Perguntar ao LLM quando o suporte ao Gemini foi introduzido. Obtemos uma data e um hash de confirmação. Assim, é fácil verificar usando git show. Há um pouco de repetição aqui, portanto, você pode declarar uma variável para sua pergunta e reutilizá-la:

E agora todos nós sabemos por que a grade do cliente teve de ser reescrita. Talvez isso não responda às suas perguntas, mas agora você sabe como obter respostas de qualquer repositório!

Autor

Postado por Laurent Doguin

Laurent é um nerd metaleiro que mora em Paris. Em sua maior parte, ele escreve código em Java e texto estruturado em AsciiDoc, e frequentemente fala sobre dados, programação reativa e outras coisas que estão na moda. Ele também foi Developer Advocate do Clever Cloud e do Nuxeo, onde dedicou seu tempo e experiência para ajudar essas comunidades a crescerem e se fortalecerem. Atualmente, ele dirige as Relações com Desenvolvedores na Couchbase.

2 Comentários

  1. Muito legal. Seria interessante incluir o registro de alterações completo, para dar mais contexto ao LLM.

    1. Laurent Doguin abril 1, 2025 em 6:28 am

      Sim, eu também estava pensando no Github PR. Há muito potencial!

Deixar uma resposta