Criei um analisador de vídeos do Youtube usando Python, LangChain e WhatsApp

8.61k views4593 WordsCopy TextShare
Asimov Academy
Código completo do projeto na nossa plataforma: https://hub.asimov.academy/materiais/?q=obsidian&utm...
Video Transcript:
é assim que eu tenho criado e organizado as minhas anotações nesse vídeo tu vai aprender a utilizar Python e l chain para criar notas completas no teu obsidian apenas enviando mensagens no teu WhatsApp e como isso funciona por exemplo eu posso só copiar um link do YouTube e enviar num grupo do WhatsApp que eu criei esse sistema vai entender Qual é o tipo de mensagem que eu enviei para utilizar as ferramentas corretas de forma dinâmica para transformar isso em uma nota direto no meu obsidian que eu posso acessar pelo celular aqui eu defini como que
eu quero acessar saída com as tags o resumo curto um resumo detalhado e essa saída é completamente personalizável tu pode deixar ela do jeito que tu quiser eu tenho utilizado o obsidian porque ele é uma ferramenta muito boa para criar notas e organizar elas de uma forma que eu posso conectar elas através de tags e acessar essas informações quando eu precisar nesse projeto a gente vai utilizar o Selenium para fazer um bot que fica lendo as mensagens que eu envio num grupo do WhatsApp e o leng chain para criar um agente com acesso às ferramentas
que a gente desenvolver e a capacidade de decidir qual a melhor função para cada aquilo que a gente enviar aqui eu vou explicar como utilizar esse agente e Essas funções mas já fica o convite para vocês acessarem o nosso curso de Agentes de a com python leng chain que temos disponível na nossa plataforma lá vocês vão ter uma explicação muito mais completa e aprofundada de como utilizar e desenvolver os sistemas com leng chain lá também temos um curso gratuito de A análise de dados e de Python zero bom então vamos desenvolver passo a passo como
funciona esse assistente de criação de nota eu criei essa classe que se chama Isac onde eu inicializo a llm quem tiver utilizar o GPT 4 4 mini eu inicializo a classe das Ferramentas que esse agente vai ter acesso e inicializo a classe do WhatsApp web onde a gente vai extrair os dados do WhatsApp e então eu crio a função que vai inicializar esse ajente e a que vai executar aqui dentro dessa função eu passo para ele todas as ferramentas que a gente vai desenvolver para que ele possa utilizar e dentro da função processar mensagem eu
executo esse agente eu passo o agente que gente vai criar pro agente dutor com todas as ferramentas para que ele decida de forma dinâmica qual ferramenta ele utilizar dependendo da mensagem que a gente enviar pro WhatsApp então aqui eu faço tudo isso rodar eu inicializo a classe do Isaac faço a busca da conversa do WhatsApp crio o agente e aqui eu inicializo algumas variáveis a mensagem vazia e a última mensagem como quit que vai ser a mensagem que se a gente enviar no WhatsApp ele encerra o programa eu inicializo ela com o quit eu vou
fazer uma verificação se a mensagem é diferente de quit e depois se a mensagem é diferente da última mensagem enquanto a mensagem não for quit ele espera um segundo para ter um tempo de processamento e busca a última mensagem que eu enviei no grupo do WhatsApp salvando em mensagem se a mensagem for diferente da última mensagem e ela existir eu vou dar um print na mensagem Vou atualizar Qual é a última mensagem e então vou fazer o processamento dessa mensagem executando o agente vou passar os agentes que a gente criou e as ferramentas por fim
a gente dá um print no resultado Se der algum erro ele nos retorna qu esse erro e volta pro loop ficando lendo a última mensagem Até que a gente receba uma mensagem diferente eu vou explicar tudo isso no final quando a gente tiver um entendimento melhor de como todo o código funciona mas por enquanto esse aqui vai ser o no aqui a gente vai usar o leng chain a gente vai usar a função slip para dar o A Espera de Um Segundo a vai usar as Tools chat openi vamos fazer a importação das Tools do
Isaac e da ferramenta de extrair os dados do WhatsApp mas é importante a gente entender aqui essas ferramentas que vão ser chamadas pelo agente a gente definiu elas já ele vai ter acesso aqui a ferramenta de baixar vídeos do YouTube extrair áudios do vídeo transcrever o áudio descrever imagens e salvar notas tudo através da exact Tools essas exact Tools aqui a gente vai definir elas dentro dessa classe que a gente tá utilizando as ferramentas aqui eu tô só chamando as funções que a gente vai desenvolver baixar vídeos transcrever áudio escrever imagem e salvar nota eu
não estô fazendo execução Da Lógica dentro dessas ferramentas para eu ter um controle maior de como que funciona Essas funções Eu só recebo um texto e passo o texto para essa função bem simples certo então vamos começar com a explicação de como funciona o baixar vídeos do YouTube aqui a gente vai importar biblioteca os que nos permite manipular e acessar arquivos e a biblioteca re que é uma biblioteca de expressões regulares do Python que a gente vai utilizar ela para extrair caracteres proibidos nos caminhos do Windows a gente vai utilizar biblioteca P importando a classe
do YouTube é uma biblioteca específica pra gente acessar e baixar ações de links do YouTube aqui na função baixar vídeo aqui eu vou passar para ela o link do YouTube e vou acessar o vídeo com a maior resolução possível Vou salvar na variável o título que a gente vai extrair desse vídeo e aqui a gente poderia também acessar ela filtrando apenas por áudio apenas por vídeos ou baixar só o áudio também essa biblioteca tem diversas funções aqui eu vou definir o caminho de saída como vídeos vou verificar se esse diretório existe e se não existir
eu vou criar ele então eu vou fazer um atamento no título do arquivo vou passar para ele o título que a gente extraiu do link vou remover qualquer caracter que a gente não posso usar como nome de arquivo ou caminho de pasta e só para garantir eu vou dar um replace em aspas para nada Às vezes a gente recebe os link ou até o próprio agente nos retorna O caminho entre aspas ou tem uma aspas perdida no caminho só para garantir eu tô fazendo esse replace eu tive alguns problemas com isso e a forma mais
simples que eu achei de contornar esse problema foi fazendo esse replace eu também vou retirar todos os espaços dessa string e substituir por um underline e por fim eu adiciono um Underline no começo do título e um ponto MP4 no final esse underline é porque quando tu tem barra e algum caractere específico pode ter problema no caminho do Windows então eu tô adicionando esse underline para garantir que nunca vai ter esse problema na sequência eu faço download desse vídeo que a gente acessou salvando no caminho que a gente definiu com o nome do arquivo que
a gente definiu faço um print PR tem um retorno e então eu altero a variável do caminho de vídeo para que ela seja completa com o caminho do diretório e o nome do arquivo dou um print só para ter um retorno de novo e retorno esse vídeo que a gente definiu assim ele garante que o retorno que a gente vai ter dessa função é o caminho completo da onde que tá salvo esse arquivo e qual é o nome que ele tem a gente vai usar esse formato em todas as nossas funções para ter um padrão
bem específico de como utilizar elas aqui eu posso passar um link profess só para testar quando eu rodar esse arquivo aqui do download YouTube ele vai rodar só essa função aqui pra gente poder testar se isso aqui tá funcionando de forma isolada então por exemplo aqui baixando o vídeo do YouTube com o link que a gente passou baixou Tears in the rain do Blade Runner tá funcionando o código agora com o vídeo baixado vamos desenvolver aqui como que funciona a função de áudio aqui a gente vai utilizar de novo a biblioteca os a gente vai
utilizar a biblioteca mve Pie que nos dá ferramentas para manipular vídeos e áudios nesse caso aqui só os áudios a biblioteca Faster Whisper importando a classe o spare Model pra gente fazer a transcrição desses áudios e a biblioteca load env novamente pra gente acessar as informações do arquivo env eu vou est salvando aqui o arquivo env exemplo onde a gente vai estar o opena apiq e aqui tu tem que botar a tua api remove o exemplo e bota a tua apiq aqui eu tô utilizando outra então pro desenvolvimento da função dist extrair áudio a gente
passa para ela aquele caminho do vídeo onde a gente salvou garante que a gente não tem aspas porque às vezes o agente nos passa o caminho do vídeo entre aspas então para garantir que a gente não vai ter esse problema eu tô sempre removendo isso foi a forma mais simples de garantir que não tem esse el dou um print pra gente saber onde que a gente tá eu pego o nome do diretório desse caminho que a gente passou substituo a palavra vídeos por áudios eu pego o nome do arquivo e crio um caminho pro áudio
que vai ser o caminho do diretório nome do arquivo pmp3 eu dou um print para verificar e carrego esse vídeo usando vídeo file clip salvo na variável vídeo eu faço a verificação se o diretório que a gente vai salvar o áudio existe sen não eu crio ele e salvo o áudio extraído do vídeo nesse caminho que a gente definiu e retorno o caminho para esse arquivo de áudio na função de transcrever vamos seguir a mesma lógica onde eu passo o caminho do áudio removo qualquer aspas que o agente possa nos colocar e utilizo a classe
do Whisper Model com o modelo médium aqui eu tô utilizando o modelo médium utilizando o processamento no CPU como eu tô rodando esse código no notebook eu não tenho placa de vídeo aqui mas se tu tiver tu pode utilizar o kuda que então ele vai rodar no teu placa de vídeo que vai ser muito mais rápido faço a execução da função de transcrever o áudio em língua portuguesa e salvo na variável result e na sequência eu salvo cada segmento da transcrição desse áudio dentro da variável transcrição separando cada segmento por um espaço quando isso terminar
eu vou definir o caminho de saída com o diretório do arquivo de áudio substituindo áudios pros transcrições então o nosso caminho vai ser o underline transcrições pego o nome do arquivo e Gero a variável com o caminho completo onde a gente vai salvar essa transcrição com o nome do diretório o nome do arquivo pmd MD O markdown que é o tipo de arquivo que eu decidi usar nesse projeto faço a verificação se essa pasta de transcrições existe se não existir eu crio ela Então faço a transcrição completa dentro desse arquivo que a gente criou dou
um print de retorno e retorno o caminho completo dessa transcrição aqui quando eu tiver o retorno do caminho do áudio eu passo paraa transcrição vamos fazer o teste ele extrai o áudio inicia a transcrição transcrição salva na pasta transcrições então com a transcrição feita vamos desenvolver o código onde a gente vai criar as notas do nosso obsídio aqui eu criei a função notas que vai receber o cinho dessa transcrição mas essa função vai chamar todas as outras funções onde cada uma dessas funções vai criar um pedaço dessa nota e depois a gente une tudo numa
nota completa aqui a gente vai utilizar o chat Open como llm recebendo a pq do noss env a gente vai utilizar o modelo GPT 4 mini que é o melhor custo benefício que a gente tem com temperatura zero assim a gente minimiza qualquer Alucinação que ele possa ter aqui na função salvar notas a gente vai receber o caminho do arquivo de transcrição fazer aquela substituição das aspas como eu já tinha falado anteriormente fazer um print desse caminho só pra gente ter uma verificação então utilizando biblioteca os a gente vai abrir esse arquivo ler o conteúdo
dele passar esse texto pra função criar tags criar resumo curto criar resumo detalhado criar Bullet points e formatar nota recebendo todas essas variáveis com o retorno das llms dá um print do conteúdo Então a gente vai definir que o nome do diretório onde a gente vai salvar essas notas é o mesmo caminho do diretório substituindo transcrições por notas e o nome do arquivo é o nome do arquivo de transcrição criando a variável desse resumo como o caminho o nome do arquivo pon markdown e esse caminho aqui para essa explicação desse vídeo eu tô salvando nesse
diretório aqui das notas mas na verdade eu passo para ele o caminho onde tá o Volt do meu obsídio e toda essa configuração aqui de tags resumos tudo isso aqui pode ser editável da forma como tu preferir não precisa ser tags não precisa ser markdown e também não precisa salvar no teu obsidian tu pode definir como for a melhor função para ti eu faço a verificação se o caminho de sair existe se não existe eu crio eu abro o arquivo do resumo e salvo a nota que a gente criou bom então vamos criar Essas funções
aqui onde a gente cria cada pedaço da nota a função criar tags ela vai criar tags referente ao texto que a gente vai passar para ela e a gente vai passar esse prompt pra llm do chat openi Isso aqui é uma é um promp que tu pode alterar tu pode fazer como tu quiser É um comando que tu vai dar paraa inteligência artificial com linguagem natural e como eu falei não precisa ter essa função isso aqui é o que tá servindo para mim pode ser melhorado Com certeza e tu pode editar da melhor forma que
te atender a gente tem também no na nossa plataforma um curso de engenharia de prompt que serve exatamente para isso para tu melhorar o teu prompt para Inteligência Artificial e aqui eu só tô passando o texto completo da transcrição para essa inteligência aqui ela me retorna o conteúdo da resposta da Inteligência Artificial que no caso aqui eu tô pedindo para criar 10 tags referente a esse texto com um padrão específico de hashtag filosofia eu dou mais de um exemplo para ele como que eu quero essas essas tags e ele me retorna O texto para eu
depois formatar essa nota a função criar resumo curto eu tô criando um resumo desse texto em até 20 palavras passando esse texto paraa Inteligência Artificial e tendo de retorno a resposta da Inteligência Artificial a mesma lógica pro resumo detalhado só que aqui eu peço um resumo mais completo então eu vou ter as tags um resumo bem curto um resumo maior e os Bullet points que essa inteligência vai criar na função salvar notas eu chamo a função de formatar nota onde eu passo as tags criadas o resumo curto resumo detalhado e o Bullet Point eu junto
em uma variável as respostas que eu tive nessas funções num formato que eu especifiquei que é as tags no topo o texto resumo do vídeo o resumo curto seguido do resumo curto resumo detalhado seguido com resumo detalhado e os Bullet points aqui eu tô utilizando uma formatação pro markdown que é Como o obsidium funciona eu retorno esse texto completo que é o que nós vamos salvar dentro do nosso arquivo de nota e aqui a gente pode pode testar passando a transcrição que a gente acabou de criar pra função salvar notas ele vai acessar as funções
criar as tags criar o resumo curto criar o resumo detalhado criar os Bullet points E então salvar o resumo no Nossa pasta de notas aqui na classe do WhatsApp web eu tô utilizando a biblioteca os e a biblioteca slip pra gente ter acesso aos arquivos e a função de fazer de espera eu tô utilizando celenium muito similar com o bot que tem desenvolvido na nossa plataforma esse projeto de automação de WhatsApp com celenio que vocês também podem acessar para ter uma compreensão melhor de como funciona essa biblioteca Então a primeira coisa que a gente faz
é fazer algumas definições iniciais onde a gente vai pegar o diretório raiz do nosso projeto defini uma pasta chamada downloads Wats uma variável de controle de qual foi o último arquivo baixado quando não for um link for um vídeo ou uma imagem A gente vai salvar o caminho desse arquivo pra gente não ter o problema de baixar mais de uma vez o mesmo arquivo aqui eu defino as opções do meu navegador e um caminho para onde eu vou salvar as opções de perfil para eu não ter que ficar lendo qrcode toda vez que eu rodar
esse código eu informo essas opções de perfil pro meu navegador e nesse comando aqui ele serve para que o Chrome não abra com a interface a primeira vez que a gente roda o código é preciso ler o qrcode mas nas próximas vezes como a gente salvou esse perfil per fil não é mais necessário isso então a gente abre o WhatsApp web no nosso Chrome Esse comando de slip aqui 45 segundos ele serve só pra gente poder ter um tempo de ler o QR Code como depois a gente não vai mais precisar ler o QR Code
ele não vai mais ser necessário então depois a gente comenta essa linha depois que a gente fez as configurações iniciais o que a gente vai fazer é buscar a conversa Esse comando aqui ele serve por celen não esperar ele ter acesso ao botão de pesquisar ou começar uma nova conversa aqui ele vai esperar 2 segundos para carregar a conversa E então achar onde que tem o título Isaac que é esse elemento aqui ele vai clicar nele conversa aberta se ele não encontrar ele nos retorna O erro então na sequência O que nós vamos fazer é
encontrar a última mensagem aqui eu tô replicando a lógica do m para quando a gente rodar esse código isolado a gente conseguir testar as funcionalidades do WhatsApp web não vai ter o processar agentes mas a lógica de mensagens e última mensagem se mantém a mesma buscando então a última mensagem ele vai encontrar o elemento com a classe message out E então a gente vai executar função buscar texto para essa variável que encontrou a mensagem a e salvar o que o retorno dentro da variável mensagem a função de buscar texto Ele vai tentar encontrar um elemento
que se chama selectable text isso funciona quando a gente tiver um link ele vai tá em texto aqui então vai ser um texto selecionável se for um texto eles não Retornam essa string Mas se for um áudio ou um vídeo MP4 ou um arquivo de foto ele vai retornar n Então se essa mensagem for uma string válida eles retorna a string E se for n ou então ele busca o arquivo sempre que não for um texto um link vai ser um arquivo para baixar Então a gente vai Executar a lógica da função buscar Arquivo ele
vai encontrar o elemento e secia Elo do tem bai baixar e faz downlo aqui fazer uma configur chr Dode que vai caminho pão para Oslo whatsappa downlo dentro do noss projeto o diretório desses downloads do WhatsApp e listar todos os arquivos que existem dentro dele e se for um arquivo a gente vai salvar o caminho dele dentro de arquivos na sequência a gente vai pegar qual é o arquivo mais novo e retornar esse arquivo Então agora que a gente já tem uma forma de baixar os arquivos que a gente recebe por WhatsApp e retornar as
mensagens eu vou mostrar para vocês a função como que a gente extrai informações de imagem a gente já tem uma forma de transformar os vídeos e áudios em notas e Falta a imagem JPEG então eu vou mostrar para vocês como que a gente desenvolve essa função aqui a gente vai utilizar a biblioteca bas64 para transformar os dados binários em uma string e o bites io da biblioteca io que é inputs outputs nós vamos utilizar pra trabalhar com esses dados binários e a biblioteca pillow nós vamos utilizar para manipular e salvar os arquivos de imagem diferentes
formatos nesse caso aqui para salvar em binário a gente vai utilizar o shat open e o Human message carregando as informações do com load the champ vamos inicializar aqui a llm do chat openi com o GPT 4 ami e desenvolver a função aqui aqui a gente tem o DOC string explicando o que essa função faz nessa linha nós abrimos a imagem do caminho que nós passamos para essa função criamos um objeto de bytes I onde a gente vai armazenar os dados da Imagem e então salvamos a imagem do buffer no formato JPEG Isso vai nos
permitir que a imagem seja manipulada como um arquivo de memória então a gente utiliza o b64 para converter esses dados em uma string no formato utf8 então agora a gente vai definir essa lista chamada input onde a gente vai informar a mensagem nos formatos que a gente quer a primeira coisa que a gente faz é informar uma mensagem do tipo texto onde eu passo o comando para llm analisar a imagem e descrever detalhamente seu conteúdo caso ela possua texto transcreva-os em formato markdown e ao mesmo tempo nós vamos passar a imagem codificada no formato base
64 Então vamos utilizar o método Evoke com esse input pra gente ter o retorno da Inteligência Artificial e salvar essa análise no análise de imagem então aqui quando a gente rodar esse código isolado eu inicializo o processo de imagem eu informei para ele o caminho da imagem que a gente baixou e inicializo o open analyses salvando na na variável o conteúdo que a gente de retorno dessa slm certo agora Com todas essas funções desenvolvidas vamos entrar no detalhe como que funciona o nosso código principal ele vai buscar a conversa criar os agentes vai rodar o
bot do WhatsApp enquanto a gente não enviar a mensagem de quit vai buscar a última mensagem a cada um segundo se a mensagem que ele receber for diferente da última mensagem ele vai atualizar qual foi a última mensagem e informar pro agente Qual é essa mensagem passando para ele os agentes que a gente inicializou e todas as ferramentas que a gente desenvolveu bom as ferramentas que a gente desenvolveu aqui a Gente Tá informando com o decorator que Essas funções são ferramentas que podem ser utilizadas a gente tá utilizando o DOC string para criar uma descrição
do que que essa função faz que é a mesma descrição que a gente utiliza dentro dessa inicialização das Ferramentas que o Isaac vai utilizar aqui é importante que o o nome seja bastante descritivo com o que ela pode fazer e a descrição explique o que ela faz eu tô usando basicamente as mesmas descrições do Doc Strings aqui ter uma boa descrição e um bom nome facilita com que o agente utiliza a ferramenta certa na hora certa aqui a gente vai listar para ele todas as ferramentas disponíveis e inicializar ele com o llm do chat Open
modelo GPT 4 almin eu tô usando um chat Prom template para informar pro sistema como ele deve se comportar dizendo que ele é um assistente especializado em ajudar o usuário a criar notas detalhadas e completas da mesma forma que eu expliquei anteriormente esse prompt aqui pode ser alterado ele pode ser ajustado e com certeza pode ser melhorado para que ele tenha a melhor resposta possível isso aqui é um processo que necessita de alguns testes a gente cria esse prompt a gente roda ele e se não tiver a resposta que a gente espera a gente pode
alterar ele até a gente chegar no resultado que a gente quer aqui eu tô passando para ele um placeholder da história dessa conversa para que eles entendam o que que tá acontecendo e o Human input que é a mensagem que a gente vai passar para ele nesse projeto aqui tá sendo a mensagem com o link ou o caminho do arquivo e esse placeholder com end scratchpad que é a forma como o agente entende o que ele já fez então aqui ele vai informar qual ferramenta ele tá utilizando Qual que é a próxima ferramenta que ele
tá utilizando e eles mantm um contexto para ele receber a mensagem Inicial passar por todo o processo utilizando as Tools e no final tem a resposta que a gente quer e ele não se perder no meio do caminho então a gente utiliza a função do Create Tool calling Eng passando para ele a llm do shat Open a lista de ferramentas que a gente desenvolveu e o prompt do shot prompt template retornamos aqui o Agent e as Tools que serão passadas pro processar mensagens eu aqui eu tô com verb que é uma forma da gente ter
a saída detalhada do que que a gente tá fazendo então eu crio um prompt para O Executor que vai se chamar input e ele vai receber um prompt específico pra utilização dessas funções quanto mais bem detalhado descrito melhor nesse caso aqui o comando que ele recebe é identificar o tipo de arquivo da mensagem e eu especifico se for um link do YouTube baixa o vídeo extrai o áudio e segue todo o processo se for um arquivo MP4 ele segue uma sequência também e eu faço isso para cada tipo de mensagem se eu tivesse outras funções
eu poderia adicionar aqui como ele deve se comportar de acordo com a mensagem que ele receb e então ele executa o agente Executor e recebe o retorno dessa llm salvando em resultado nesse processo aqui ele vai receber a mensagem e se for um vídeo do YouTube ele vai baixar o vídeo extrair o áudio transcrever o áudio e salvar a nota Caso seja uma imagem ele vai descrever essa imagem e salvar a nota Bom aqui a gente já tem o código completo criando o nosso agente escrevendo o que ele tem que fazer dependendo do que ele
receber mensagem assim ele vai ter a capacidade de decidir dinamicamente o que fazer com cada informação então testando aqui ele vai abrir a conversa ler a última mensagem que é um link do YouTube vai baixar esse vídeo extrair o áudio transcrever o áudio e criar nota a partir disso E assim a gente completa o desenvolvimento desse assistente de criação de notas o código completo vai est disponível na nossa plataforma onde tu encontra outros projetos como esse e os cursos gratuitos de A análise de dados e Python do zero
Copyright © 2024. Made with ♥ in London by YTScribe.com