Porque quem tem tempo? (também parte 1 porque me levou mais longe do que eu esperava 😬)

O Couchbase apresentou recentemente suporte para pesquisa vetorial. E eu estava procurando uma desculpa para brincar com ele. Acontece que recentemente houve um ótimo tópico no Twitter sobre marketing para desenvolvedores. Eu me identifico com a maior parte do que está lá. É um tópico fantástico. Eu poderia resumi-lo para garantir que meus colegas de equipe possam tirar o melhor proveito dele em pouco tempo. Por exemplo, eu poderia escrever esse resumo manualmente. Ou essa pode ser a desculpa que eu estava procurando.

Vamos pedir a um LLM (Large Language Model) que resuma essa brilhante discussão para mim e para o benefício de outras pessoas. Em teoria, as coisas devem acontecer da seguinte forma:

    1. Obtendo os tweets
    2. Transformando-os em vetores graças a um LLM
    3. Armazenamento do tweet e dos vetores no Couchbase
    4. Criação de um índice para consultá-los
    5. Pergunte algo ao LLM
    6. Transforme isso em um vetor
    7. Execute uma pesquisa de vetores para obter algum contexto para o LLM
    8. Criar o prompt do LLM a partir da pergunta e do contexto
    9. Obtenha uma resposta fantástica

Esse é basicamente um fluxo de trabalho RAG. RAG significa Retrieval Augmented Generation (Geração Aumentada de Recuperação). Ele permite que os desenvolvedores criem aplicativos baseados em LLM mais precisos e robustos, fornecendo contexto.

Extração de dados do Twitter

A primeira coisa a fazer é obter dados do Twitter. Na verdade, essa é a parte mais difícil se você não assinar a API deles. Mas com um bom e velho trabalho de sucata, você ainda pode fazer algo decente. Provavelmente não é 100% preciso, mas é decente. Então, vamos a isso.

Obtendo meu IDE favorito, com o Plug-in do Couchbase instalado, crio um novo script Python e começo a brincar com twikituma biblioteca de coleta de dados do Twitter. Tudo funciona bem até que recebo rapidamente um erro HTTP 429. Muitas solicitações. Tenho me esforçado demais. Fui pego. Algumas coisas para atenuar isso.

    1. Primeiro, certifique-se de armazenar o cookie de autenticação em um arquivo e reutilizá-lo, em vez de refazer o login freneticamente, como eu fiz.
    2. Em segundo lugar, mude para um IDE on-line, pois você poderá alterar o IP com mais facilidade.
    3. Terceiro, introduza o tempo de espera e torne-o aleatório. Não tenho certeza se a parte aleatória ajuda, mas por que não, é fácil.

O script final tem a seguinte aparência:

Foi um pouco doloroso evitar o 429, passei por várias iterações, mas no final consegui algo que funciona em sua maior parte. Só precisei adicionar o colchete inicial e final para transformá-lo em uma matriz JSON válida:

Josh está obviamente certo, as meias estão no centro do que fazemos no marketing para desenvolvedores, juntamente com a ironia.

Agora, tenho um arquivo que contém uma matriz de documentos JSON, todos com dicas de marketing para desenvolvedores. O que vem a seguir?

Transformando tweets em vetores

Para garantir que possa ser usado por um LLM como contexto adicional, ele precisa ser transformado em um vetor, ou incorporação. Basicamente, é uma matriz de valores decimais entre 0 e 1. Tudo isso permitirá o RAG, Retrieval Augmented Generation. Isso não é universal, cada LLM tem sua própria representação de um objeto (como dados de texto, áudio ou vídeo). Por ser extremamente preguiçoso e não saber o que está acontecendo nesse espaço, escolhi OpenAI/ChatGPT. É como se houvesse mais modelos surgindo a cada semana do que tínhamos estruturas JavaScript em 2017.

De qualquer forma, criei minha conta na OpenAI, criei uma chave de API, adicionei alguns dólares porque, aparentemente, você não pode usar a API deles se não o fizer, mesmo as coisas gratuitas. Então, eu estava pronto para transformar tweets em vetores. O caminho mais curto para obter a incorporação por meio da API é usar o curl. Ele terá a seguinte aparência:

Aqui você pode ver que a entrada JSON tem um campo de entrada que será transformado em um vetor e o campo de modelo que faz referência ao modelo a ser usado para transformar o texto em um vetor. A saída fornece o vetor, o modelo usado e as estatísticas de uso da API.

Fantástico, e agora? Transformar esses dados em vetores não é barato. É melhor que sejam armazenados em um banco de dados para serem reutilizados posteriormente. Além disso, você pode obter facilmente alguns recursos adicionais interessantes, como a pesquisa híbrida.

Há algumas maneiras de ver isso. Há uma maneira manual tediosa que é ótima para aprender coisas. E há o uso de bibliotecas e ferramentas que facilitam a vida. Na verdade, fui direto ao ponto usando Langchain achando que isso facilitaria minha vida, e foi o que aconteceu, até que me perdi um pouco. Então, para nosso benefício coletivo de aprendizado, vamos começar com a maneira manual. Tenho uma matriz de documentos JSON, preciso vetorizar seu conteúdo, armazená-lo no Couchbase e, depois, poderei consultá-los com outro vetor.

Carregando os tweets em um Vector Store como o Couchbase

Vou usar Python porque sinto que preciso me aperfeiçoar nisso, embora possamos ver a implementação do Langchain em Java ou JavaScript. E a primeira coisa que quero abordar é como me conectar ao Couchbase:

Nesse código, você pode ver o connect_to_couchbase que aceita um método string de conexão, nome de usuário e senha. Todos eles são fornecidos pelas variáveis de ambiente carregadas no início. Quando tivermos o objeto do cluster, poderemos obter o bucket, o escopo e a coleção associados. Se você não estiver familiarizado com o Couchbase, as coleções são semelhantes a uma tabela RDBMS. Os escopos podem ter tantas coleções e baldes quantos forem os escopos. Essa granularidade é útil por vários motivos (multilocação, sincronização mais rápida, backup etc.).

Mais uma coisa antes de obter a coleção. Precisamos de um código para transformar o texto em vetores. Usando o cliente OpenAI, ele tem a seguinte aparência:

Isso fará um trabalho semelhante ao da chamada de curl anterior. Apenas certifique-se de que você tenha o OPENAI_API_KEY definida para que o cliente funcione.

Agora vamos ver como criar um documento do Couchbase a partir de um tweet JSON, com a incorporação gerada.

O documento tem três campos, metadados contém o tweet inteiro, texto é o texto transformado em uma string e incorporação é a incorporação gerada com o OpenAI. A chave será o ID do tweet. E upsert é usado para atualizar ou inserir o documento, caso ele não exista.

Se eu executar isso e me conectar ao meu servidor Couchbase, verei documentos sendo criados.

A Screenshot of the Couchbase Capella UI showing the list of created Documents

Neste ponto, extraí dados do Twitter, carreguei-os no Couchbase como um tweet por documento, com a incorporação do OpenAI gerada e inserida para cada tweet. Estou pronto para fazer perguntas para consultar documentos semelhantes.

Executar o Vector Search em Tweets

E agora é hora de falar sobre o Vector Search. Como pesquisar tweets semelhantes a um determinado texto? A primeira coisa a fazer é transformar o texto em um vetor ou incorporação. Então, vamos fazer a pergunta:

É isso aí. O queryEmbedding contém um vetor que representa a consulta. Para a consulta:

Como quero ver o que estou fazendo, estou ativando os registros do Couchbase SDK configurando essa variável de ambiente:

Se você estiver acompanhando o processo e tudo correr bem, deverá receber uma mensagem de erro!

E isso é bom porque temos um QueryIndexNotFoundException. Ele está procurando um índice que ainda não existe. Portanto, precisamos criá-lo. Você pode fazer login em seu cluster no Capella e acompanhar o processo:

Quando tiver o índice, você poderá executá-lo novamente e obterá o seguinte resultado:

Obtemos Linha de pesquisa que contêm o índice usado, a chave do documento, a pontuação relacionada e, em seguida, vários campos vazios. Você pode ver que isso também é ordenado por pontuaçãoe está fornecendo o tweet mais próximo da consulta encontrada.

Como podemos saber se funcionou? A coisa mais rápida a fazer é procurar o documento com nosso plug-in do IDE. Se você estiver usando o VSCode ou qualquer JetBrains IDE, deve ser bem fácil. Você também pode fazer login no Couchbase Capella e encontrá-lo lá.

Ou podemos modificar o índice de pesquisa para armazenar o campo de texto e os metadados associados e executar novamente a consulta:


Conclusão

Então funcionou, o tweet de Josh sobre meias aparece no topo da pesquisa. Agora você já sabe como extrair dados do Twitter, transformar tweets em vetores, armazenar, indexar e consultá-los no Couchbase. O que isso tem a ver com LLM e IA? Falaremos mais sobre isso na próxima postagem!

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.

Deixar uma resposta