Em Parte 1 Vimos como extrair o Twitter, transformar tweets em documentos JSON, obter uma representação de incorporação desse tweet, armazenar tudo no Couchbase e como executar uma pesquisa vetorial. Essas são as primeiras etapas de uma arquitetura de Geração Aumentada de Recuperação que poderia resumir um tópico do Twitter. A próxima etapa é usar um modelo de linguagem grande. Podemos solicitar que ele resuma a discussão e podemos enriquecer o contexto da solicitação graças à pesquisa vetorial.

LangChain e Streamlit

Então, como fazer com que tudo isso funcione em conjunto com um LLM? É aí que o projeto LangChain pode ajudar. Seu objetivo é permitir que os desenvolvedores criem aplicativos baseados em LLM. Já temos alguns exemplos disponíveis em GitHub que mostram nosso módulo LangChain. Como esta demonstração do RAG, que permite que o usuário carregue um PDF, vetorize-o, armazene-o no Couchbase e use-o em um chatbot. Esse está em JavaScript, mas há também um Versão Python.

Acontece que isso é exatamente o que eu quero fazer, só que usando um PDF em vez de uma lista de tweets. Então, eu o bifurquei e comecei a brincar com ele aqui. Aqui, Nithish está usando algumas bibliotecas interessantes, LangChain, é claro, e Streamlit. Outra coisa legal para aprender! O Streamlit é como um PaaS com baixo código e ciência de dados serviço. Ele permite que você implemente aplicativos baseados em dados com muita facilidade, com o mínimo de código, de uma forma muito, muito opinativa.

Configuração

Vamos dividir o código em partes menores. Podemos começar com a configuração. O método a seguir garante que as variáveis de ambiente corretas estejam definidas e interrompe a implantação do aplicativo se elas não estiverem.

O check_environment_variable é chamado várias vezes para garantir que a configuração necessária esteja definida e, se não estiver, interromperá o aplicativo.

Isso significa que tudo o que está ali é necessário. Uma conexão com OpenAI e para Couchbase. Vamos falar rapidamente sobre o Couchbase. É um banco de dados distribuído JSON e multimodelo com um cache integrado. Você pode usá-lo como K/V, SQL, pesquisa de texto completo, séries temporais, análises, e adicionamos novos recursos fantásticos na versão 7.6: CTEs recursivos para fazer consultas de gráficos, ou o que mais nos interessa hoje, a pesquisa vetorial. A maneira mais rápida de tentar é ir para cloud.couchbase.comO sistema oferece uma avaliação de 30 dias, sem necessidade de cartão de crédito.

A partir daí, você pode seguir as etapas e configurar seu novo cluster. Configure um bucket, um escopo, uma coleção e um índice, um usuário e certifique-se de que o cluster esteja disponível externamente, e você poderá passar para a próxima parte. Obter uma conexão com o Couchbase a partir do aplicativo. Isso pode ser feito com essas duas funções. Você pode ver que elas são anotadas com @st.cache_resource. Ele é usado para armazenar em cache o objeto da perspectiva do Streamlit. Ele o torna disponível para outras instâncias ou repetições. Aqui está o trecho do documento

Decorador para armazenar em cache funções que retornam recursos globais (por exemplo, conexões de banco de dados, modelos de ML).

Os objetos armazenados em cache são compartilhados entre todos os usuários, sessões e repetições. Eles devem ser thread-safe porque podem ser acessados de vários threads simultaneamente. Se a segurança de thread for um problema, considere usar st.session_state para armazenar recursos por sessão.

Com isso, temos uma conexão com o cluster do Couchbase e uma conexão com o wrapper do armazenamento vetorial do LangChain Couchbase.

connect_to_couchbase(connection_string, db_username, db_password) cria a conexão do cluster do Couchbase. get_vector_store(_cluster, db_bucket, db_scope, db_collection, _embedding, index_name,) cria o Armazém de vetor de sofá wrapper. Ele mantém uma conexão com o cluster, as informações de bucket/scope/collection para armazenar dados, o nome do índice para garantir que possamos consultar os vetores e a propriedade de incorporação.

Aqui, ele se refere à função OpenAIEmbeddings. Ela pegará automaticamente o OPENAI_API_KEY e permitir que a LangChain use a API da OpenAI com a chave. Cada chamada de API será transparente para a LangChain. O que também significa que a troca de provedor de modelo deve ser bastante transparente quando se trata de gerenciamento de incorporação.

Gravação de documentos LangChain no Couchbase

Agora é onde a mágica acontece, onde obtemos os tweets, os analisamos como JSON, criamos a incorporação e gravamos o documento JSON na coleção específica do Couchbase. Graças ao Steamlit, podemos configurar um widget de upload de arquivo e executar uma função associada:

Ele se parece um pouco com o código da parte 1, exceto pelo fato de que toda a criação de incorporação é gerenciada de forma transparente pelo LangChain. O campo de texto será vetorizado e os metadados serão adicionados ao documento do Couchbase. Ele terá a seguinte aparência:

De agora em diante, temos funções para gerenciar o upload de tweets, vetorizar os tweets e armazená-los no Couchbase. É hora de usar o Streamlit para criar o aplicativo real e gerenciar o fluxo de bate-papo. Vamos dividir essa função em vários blocos.

Escreva um aplicativo Streamlit

Começando com a declaração principal e a proteção do aplicativo. Você não quer que ninguém o use e use seus créditos do OpenAI. Graças ao Streamlit, isso pode ser feito com bastante facilidade. Aqui, configuramos uma proteção por senha usando o parâmetro LOGIN_PASSWORD variável env. E também definimos a configuração global da página graças à variável set_page_config método. Isso lhe dará um formulário simples para inserir a senha e uma página simples.

Para ir um pouco além, podemos adicionar as verificações de variáveis de ambiente, a configuração do OpenAI e do Couchbase e um título simples para iniciar o fluxo do aplicativo.

O Streamlit tem uma boa integração de espaço de código. Eu realmente recomendo que você o use, pois facilita muito o desenvolvimento. E nosso plug-in VSCode pode ser instalado, para que você possa navegar no Couchbase e executar consultas.

Run SQ++ Vector Search query from Codespace

Executar a consulta SQL++ Vector Search do Codespace

A Basic streamlit application opened in codespace

Um aplicativo Basic Streamlit aberto no Codespace

Criar cadeias LangChain

Depois disso, vem a configuração da corrente. É aí que o LangChain realmente se destaca. É aqui que podemos configurar o retriever. Ele será usado pelo LangChain para consultar o Couchbase em busca de todos os tweets vetorizados. Em seguida, é hora de criar o prompt do RAG. Você pode ver que o modelo usa um {contexto} e {pergunta} parâmetro. Criamos um objeto de prompt de chat a partir do modelo.

Depois disso, vem a escolha do LLM, aqui escolhi o GPT4. E, finalmente, a criação da cadeia.

A cadeia é criada a partir do modelo escolhido, do contexto e dos parâmetros de consulta, do objeto de prompt e de um StrOuptutParser. Sua função é analisar a resposta do LLM e enviá-la de volta como uma cadeia de caracteres streamable/chunkable. A função RunnablePassthrough chamado para o parâmetro da pergunta é usado para garantir que ele seja passado para o prompt "como está", mas você pode usar outros métodos para alterar/sanitizar a pergunta. É isso, uma arquitetura RAG. Fornecer algum contexto adicional a um prompt do LLM para obter uma resposta melhor.

Também podemos construir uma cadeia sem ela para comparar os resultados:

Não há necessidade de contexto no modelo de prompt e no parâmetro de cadeia, e não há necessidade de um retriever.

Agora que temos algumas cadeias, podemos usá-las por meio do Streamlit. Esse código adicionará a primeira pergunta e a barra lateral, permitindo upload de arquivos:

Em seguida, as instruções e a lógica de entrada:

 

Com isso, você tem tudo o que é necessário para executar o aplicativo streamlit que permite ao usuário:

    • Faça upload de um arquivo JSON contendo tweets
    • Transforme cada tweet em um documento LangChain
    • Armazene-os no Couchbase junto com sua representação de incorporação
    • Gerencie dois prompts diferentes:
      • um com um recuperador LangChain para adicionar contexto
      • e um sem

Se você executar o aplicativo, verá algo parecido com isto:

The full streamlit application example opened in Codespace

O exemplo completo do aplicativo streamlit foi aberto no Codespace

Conclusão

E quando você pergunta "as meias são importantes para os desenvolvedores?", obtém essas duas respostas muito interessantes:

Com base no contexto fornecido, parece que as meias são importantes para alguns desenvolvedores, conforme mencionado por Josh Long e Simon Willison em seus tweets. Eles expressam o desejo de usar meias e parecem valorizá-las.

As meias são importantes para os desenvolvedores, pois proporcionam conforto e suporte quando passam longas horas sentados em um computador. Além disso, manter os pés aquecidos pode ajudar a melhorar o foco e a produtividade.

Voilà, temos um bot que sabe sobre um tópico do Twitter e pode responder de acordo. E o mais divertido é que ele não usou apenas o texto Vector no contexto, mas também usou todos os metadados armazenados, como o nome de usuário, porque também indexamos todos os metadados do documento LangChain ao criar o índice na parte 1.

Mas isso está realmente resumindo o tópico X? Na verdade, não. Porque o Vector Search enriquecerá o contexto com os documentos mais próximos e não com o tópico completo. Portanto, é preciso fazer um pouco de engenharia de dados. Vamos falar sobre isso na próxima parte!

Recursos

Autor

A ordem da postagem em relação a outras postagens. Laurent Doguin, Advogado do desenvolvedor, Couchbase

Laurent é um Developer Advocate baseado em Paris, onde se concentra em ajudar os desenvolvedores Java e a comunidade francesa. Ele escreve código em Java e postagens de blog em Markdown. Antes de se juntar ao Couchbase, ele era o contato da comunidade Nuxeo, onde dedicou seu tempo e experiência para ajudar toda a comunidade Nuxeo a se tornar mais ativa e eficiente.

Posição vertical a partir do topo para iniciar o corte como uma porcentagem da altura da imagem.