<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[SiDi NLP - Medium]]></title>
        <description><![CDATA[Portal destinado a compartilhamento de ideias, conceitos e tutoriais que envolvam Machine Learning e Processamento de Linguagem Natural. Projeto mantido pelo time de NLP do SiDi. - Medium]]></description>
        <link>https://medium.com/sidi-nlp?source=rss----a7bfc1260449---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>SiDi NLP - Medium</title>
            <link>https://medium.com/sidi-nlp?source=rss----a7bfc1260449---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 17 May 2026 17:09:33 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/sidi-nlp" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[LEGIBILIDADE — Como saber se meu texto é muito complexo?]]></title>
            <link>https://medium.com/sidi-nlp/legibilidade-como-saber-se-meu-texto-%C3%A9-muito-complexo-20a82d768f3f?source=rss----a7bfc1260449---4</link>
            <guid isPermaLink="false">https://medium.com/p/20a82d768f3f</guid>
            <category><![CDATA[legibilidade]]></category>
            <category><![CDATA[nlp]]></category>
            <category><![CDATA[leiturabilidade]]></category>
            <dc:creator><![CDATA[Luiza Mastelari]]></dc:creator>
            <pubDate>Tue, 12 May 2026 18:26:30 GMT</pubDate>
            <atom:updated>2026-05-12T18:26:28.522Z</atom:updated>
            <content:encoded><![CDATA[<p>Imagine que você acabou de escrever um texto. Para você, ele está claro, mas será que também está para quem vai ler? Como avaliar se ele está simples o suficiente ou excessivamente complexo? É justamente esse o papel da legibilidade: oferecer maneiras de medir o quão fácil (ou difícil) é compreender um texto.</p><p>A ideia de medir a facilidade de leitura não é nova. Desde a década de 1950, pesquisadores da área de linguística vêm propondo fórmulas que tentam traduzir essa percepção em números. Mesmo assim, esses índices ainda são pouco utilizados em NLP, apesar de serem bastante úteis para trabalhar com grandes volumes de texto.</p><p>Esse conceito pode ser encontrado com outros nomes, como leiturabilidade ou apreensibilidade. Em suma, esses conceitos buscam responder uma mesma pergunta: quão fácil é ler este texto? Para isso, utilizam métricas que ajudam a classificar o nível de dificuldade de leitura de forma mais padronizada.</p><p>Neste artigo, vamos explorar os principais índices de legibilidade, algumas bibliotecas que facilitam sua aplicação e exemplos práticos de como essa abordagem pode apoiar o trabalho com NLP no dia a dia.</p><h3>Como a Legibilidade é calculada?</h3><p>De forma geral, as métricas de legibilidade se baseiam em três elementos principais: a quantidade de frases em um texto, o número de palavras por frase e a complexidade das palavras utilizadas. A lógica é relativamente simples: quanto mais longas forem as frases e quanto mais complexas forem as palavras, maior tende a ser a dificuldade de leitura.</p><p>O que varia entre os diferentes índices é justamente a forma de definir essa “complexidade”. Dependendo do modelo, ela pode ser medida por número de sílabas, quantidade de caracteres ou até mesmo por regras específicas de cada língua.</p><p>Vejamos agora uma lista com os alguns índices e suas características:</p><ul><li><strong>Flesch reading ease — Índice de legibilidade de Flesch:<br></strong>Baseia-se na quantidade de palavras em uma frase e na complexidade das palavras utilizadas. É um dos índices mais conhecidos e amplamente utilizados.</li><li><strong>Gunning fog index — Índice de Nebulosidade de Gunning:<br></strong>Foi um dos primeiros a propor uma escala que estima o nível de educação formal necessário para compreender um texto. Considera frases longas e palavras complexas, definidas, nesse caso, como aquelas com três ou mais sílabas.</li><li><strong>ARI (Automated readability index ) — Índice de Legibilidade Automatizado:</strong><br>Semelhante aos anteriores, mas com uma diferença importante: em vez de utilizar sílabas (que podem ser difíceis de mensurar e nem sempre consensuais), utiliza o número de caracteres por palavra como forma de mensurar sua complexidade, tornando o cálculo mais direto.</li><li><strong>Flesch–Kincaid grade level — Nível de Instrução de Flesch-Kincaid:</strong><br>Nada mais é que a fórmula de Flesch reformulada para uma escala de níveis de instrução.</li><li><strong>Coleman–Liau index — Índice de Coleman-Liau:</strong><br>Diferencia-se principalmente pela forma de calcular a complexidade das frases. Em vez de trabalhar com a razão “palavras por sentença”, utiliza a proporção inversa (“sentenças por palavras”), além de considerar o número de caracteres.</li><li><strong>Índice Gulpease:</strong><br>Este índice é interessante pois foi desenvolvido para a língua italiana, é um exemplo de índice adaptado linguisticamente. Assim como o ARI, não depende da contagem de sílabas para estimar a complexidade.</li></ul><p>O resultado dos índices é fornecido em forma de escalas, que podem ser de 0 ~ 100 ou então de 0 ~ 20. Os resultados próximos à zero representam os textos mais complexos, enquanto 100 seria um texto muito simples.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SUVaiYKdg1HIoNFSCk82xA.jpeg" /></figure><p>Vale atenção especial aos índices que expressam o resultado em termos de anos de escolaridade: nesses casos, a interpretação se inverte — valores mais altos indicam textos mais difíceis, que exigem maior nível de instrução.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iUatKbD5UEVSuYJT6oAm1Q.jpeg" /></figure><p><strong>Atenção:</strong></p><ul><li>Embora os índices normalmente operem dentro de faixas definidas, em alguns casos os valores podem ultrapassar esses limites ou até assumirem valores negativos.</li><li>Cada língua possui (ou deveria possuir) adaptações específicas dessas fórmulas, considerando suas particularidades linguísticas. A aplicação de fórmulas não adaptadas pode gerar métricas não confiáveis.</li></ul><h3>Bibliotecas</h3><p>Agora vamos ver algumas bibliotecas disponíveis que realizam o cálculo de legibilidade:</p><p><strong><em>Inglês</em></strong></p><p>No caso do inglês, a biblioteca <a href="https://pypi.org/project/readability/">Readability</a> na linguagem python permite a aplicação de todos os índices citados (com exceção do índice de Gulpease, por ser elaborado para o italiano), além de outros índices, não citados neste artigo.</p><p>Mais do que apenas calcular métricas, a biblioteca também oferece funcionalidades auxiliares importantes, como contagem de sílabas, identificação de palavras complexas, segmentação de parágrafos e outras análises úteis para estudos de legibilidade.</p><p><strong><em>Português</em></strong></p><p>Para o português, uma ferramenta bastante interessante é o <a href="https://legibilidade.com/">ALT</a>, desenvolvido já com as fórmulas adaptadas à língua. Essa adaptação é importante, já que características linguísticas impactam diretamente o cálculo da legibilidade.</p><p>Interessante notar que ao final o resultado é impresso na gradação de 0 ~ 20 pois o ALT se utiliza da média dos índices de Flesch-Kincaid, Gunning fog, ARI e Coleman-Liau para a métrica final.</p><p>Além do cálculo em si, o software também fornece explicações e insights sobre o texto analisado. Ele destaca, por exemplo, palavras consideradas complexas e frases muito longas que poderiam ser divididas para melhorar a fluidez da leitura.</p><p>Para ilustrar, realizamos um teste com uma review de jogo, buscando observar como a ferramenta se comporta em textos com presença de palavras estrangeiras e gírias:</p><p>Caso o tema seja de interesse, vale a pena explorar tanto o site quanto o artigo publicado pela ferramenta, especialmente pela riqueza de detalhes sobre legibilidade e pelas discussões sobre adaptações necessárias para o português.</p><h3>Uso e aplicação prática das métricas de legibilidade</h3><p>Depois de entender os índices e as ferramentas disponíveis, vale voltar à pergunta inicial: o que, de fato, podemos fazer com tudo isso?</p><p>Um primeiro uso (e talvez o mais imediato) é avaliar os próprios textos. Este artigo, por exemplo, recebeu o nível 13 “Média legibilidade.<br>Dificuldade média. Pode ser bem compreendido por universitários em início de graduação.”. Mais do que um número isolado, esse tipo de métrica ajuda a refletir sobre escolhas de escrita e a ajustar o nível de complexidade de acordo com o público desejado.</p><p>Mas o valor das métricas de legibilidade vai além do uso de um único texto. Dentro da área de NLP, elas se tornam especialmente úteis na análise de datasets textuais, principalmente quando lidamos com corpus muito grandes. Entender o nível médio de legibilidade de um conjunto de dados pode trazer insights importantes sobre o tipo de linguagem presente ali e, consequentemente, sobre o comportamento esperado dos modelos treinados com esses dados.</p><p>Em um cenário cada vez mais marcado pela geração de texto por LLMs, esse tipo de análise ganha ainda mais relevância. Afinal, não basta gerar texto, é preciso garantir que ele seja adequado ao público-alvo. Métricas de legibilidade ajudam justamente a entender essa adequação entre o que se espera e o que foi alcançado.</p><p>Por fim, no contexto de sistemas conversacionais, a legibilidade pode atuar como uma camada adicional de validação. É comum instruirmos modelos a responder com uma “linguagem acessível”, mas como verificar se isso realmente foi cumprido? Os índices de legibilidade oferecem uma forma simples e objetiva de mensurar esse aspecto, funcionando como um critério complementar de avaliação do output.</p><p>REFERÊNCIAS</p><p>[1] <a href="https://legibilidade.com/">https://legibilidade.com/</a></p><p>[2] <a href="https://arxiv.org/search/cs?searchtype=author&amp;query=de+Lima+Moreno,+G+C">Gleice Carvalho de Lima Moreno</a>, <a href="https://arxiv.org/search/cs?searchtype=author&amp;query=de+Souza,+M+P+M">Marco P. M. de Souza</a>, <a href="https://arxiv.org/search/cs?searchtype=author&amp;query=Hein,+N">Nelson Hein</a>, <a href="https://arxiv.org/search/cs?searchtype=author&amp;query=Hein,+A+K">Adriana Kroenke Hein</a>.ALT: um software para análise de legibilidade de textos em Língua Portuguesa</p><p>[3] R. Flesch, “A new readability yardstick”. J. Appl. Psychol 32(3), 221–233 (1948).</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=20a82d768f3f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sidi-nlp/legibilidade-como-saber-se-meu-texto-%C3%A9-muito-complexo-20a82d768f3f">LEGIBILIDADE — Como saber se meu texto é muito complexo?</a> was originally published in <a href="https://medium.com/sidi-nlp">SiDi NLP</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Como criar aplicações com LLM: Agentes e RAG com LangChain]]></title>
            <link>https://medium.com/sidi-nlp/como-criar-aplica%C3%A7%C3%B5es-com-llm-agentes-e-rag-com-langchain-d2c051878fa5?source=rss----a7bfc1260449---4</link>
            <guid isPermaLink="false">https://medium.com/p/d2c051878fa5</guid>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[langchain]]></category>
            <category><![CDATA[nlp]]></category>
            <category><![CDATA[retrieval-augmented-gen]]></category>
            <category><![CDATA[langchain-agents]]></category>
            <dc:creator><![CDATA[Mateus Zorzi]]></dc:creator>
            <pubDate>Tue, 18 Mar 2025 13:17:25 GMT</pubDate>
            <atom:updated>2025-03-18T13:18:14.195Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*A_griGGDDPGGAB0U.png" /></figure><p>Nesse artigo serão abordados alguns conceitos mais complexos e dois dos mais interessantes para utilização através do LangChain, os agentes e RAG. Essas ferramentas possibilitam o desenvolvimento de aplicações utilizando LLMs que são mais dinâmicas e personalizáveis, podendo especializar as respostas para certo tópico e utilizar de um LLM para gerenciar as ações a serem realizadas pela aplicação.</p><h3>Agentes</h3><p>Podemos pensar nos agentes como um orquestrador que permite criar sistemas inteligentes capazes de tomar decisões dinâmicas e executar tarefas de forma autônoma. Essas tarefas são suportadas através de <strong>funções</strong> que os agentes utilizam para realizar suas ações e obter respostas.</p><p>Diferente das cadeias sequenciais, conceito abordado no <a href="https://medium.com/sidi-nlp/como-criar-aplica%C3%A7%C3%B5es-com-llm-introdu%C3%A7%C3%A3o-ao-langchain-75af2305144f">artigo anterior</a>, em que as ordens das ações são pré-estabelecidas no código, os agentes utilizam de um LLM que é capaz de escolher quais ferramentas utilizar e em qual ordem dependendo do contexto da conversa, de forma autônoma.</p><p>Os agentes possuem três componentes principais: um <strong>modelo de linguagem (LLM),</strong> que atua como o cérebro do agente para escolher as ferramentas a serem usadas; <strong>ferramentas (tools)</strong>, funções personalizadas que podem incluir APIs, bancos de dados ou realizar qualquer outro tipo de tarefa como o próprio RAG, que será explicado em breve; e um <strong>executor (agent executor)</strong>, que gerencia a interação entre esses componentes. O agente recebe uma solicitação, analisa quais ferramentas são necessárias para respondê-la e decide, dinamicamente, como resolver a tarefa.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/581/1*SzxMQIEzKdleXLR11oEEjg.png" /></figure><p>Existem diversos tipos de agentes que podem ser utilizados em diferentes contextos, mas para entender a ideia central desse conceito, iremos explorar o A<strong>gente ReAct</strong>.</p><p><strong>Agente ReAct</strong></p><p>Os agentes ReAct (<strong>Re</strong>ason + <strong>Act</strong>ion) funcionam a partir de pensamento e ação. Após ser acionado, nosso agente irá (1) pensar na tarefa e em qual das ferramentas que ele possuí é a adequada. (2) Após isso, realiza a ação através da ferramenta escolhida, e por fim, (3) observa a saída da ferramenta gerando a resposta para o usuário.</p><p>Então vamos pensar em um agente <em>ReAct</em> que irá responder questões de matemática e literatura. Para criarmos nosso agente especializado, precisaremos de pelo menos duas ferramentas que o nosso agente possa acionar para realizar suas ações, uma ferramenta específica para questões de matemática que chamaremos de <em>“math_tool” </em>e outra para questões de literatura que chamaremos de <em>“literature_tool”. </em>Não entrarei no detalhe de cada uma dessas funções em si (<em>math_function</em> e <em>literature_function</em>), mas vamos supor que elas acessem uma API de seus respectivos domínios (matemática e literatura) oferecendo conteúdo para uma resposta mais correta para cada um dos temas.</p><p>No exemplo utilizaremos o agente <em>ZERO_SHOT_REACT_DESCRIPTION que </em>segue a abordagem ReAct. Ele é uma versão específica dentro do LangChain, que não precisa de exemplos e se baseia apenas na descrição <em>(description)</em> das ferramentas disponíveis para escolher com qual ferramenta irá realizar a ação.</p><pre>math_tool = Tool(<br> name=&quot;Math tool&quot;,<br> func=math_function,<br> description=&quot;Responde questões sobre matemática como problemas de adição, <br>subtração, multiplicação e devisão.&quot;<br>)<br><br>literature_tool = Tool(<br> name=&quot;Literature tool&quot;,<br> func=literature_function,<br> description=&quot;Responde questões sobre literatura como análise de obras, <br>autores e citações.&quot;<br>)<br>agent = initialize_agent(<br> tools=[math_tool, literature_tool],<br> llm=llm,<br> agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION<br>)</pre><p>Por exemplo, quando o agente receber uma chamada com o prompt “Quanto é 1 + 1?”, ele irá (1) iniciar o processo, analisando essa questão e identificando que é relacionada ao escopo de matemática. Após isso, <em>então</em> através das descrições da função, irá identificar que deve (2) chamar a nossa ferramenta <em>“math_tool” </em>para realizar a ação, por ser a descrição que mais se enquadra na questão do usuário. Por fim, (3) com a saída gerada pela ferramenta irá retornar uma resposta para o usuário: “A soma de 1+1 é igual a 2.”. Observe a seguir como o agente irá agir com essa entrada.</p><pre>agent.run(&quot;Quanto é 1 + 1?&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/742/0*rf2HB_gQONdgoM5W.png" /></figure><p>Observe que ele precisou chamar apenas a ferramenta específica para questões de matemática sem nenhuma ordem pré-definida. Foi o LLM que identificou que essa era uma questão deste escopo.</p><p>Os agentes são muito úteis para criar aplicações de escopos e ações específicas, sendo que, a qualidade de um agente está diretamente ligada à qualidade de suas ferramentas. Quanto melhor a qualidade das ferramentas para realizar as ações, melhores serão as respostas dos agentes.</p><h3>RAG com LangChain</h3><p><strong>RAG (Retrieval Augmented Generation)</strong> é uma técnica para aprimorar o LLM, incorporando documentos mais atualizados do que aqueles utilizados em seu treinamento ou restringindo o escopo para torná-lo especialista em um determinado tópico.</p><p>Podemos dividir em três passos principais a implementação de RAG com LangChain:</p><ol><li><strong>Carregar os documentos:</strong> primeiro carregamos os documentos que serão utilizados para fornecer novos dados ao LLM. O LangChain já nos fornece algumas classes como <em>PyPDFLoader, CSVLoad, UnstructeredHTMLLoader</em> que possibilitam carregar arquivos .pdf, .csv e .html, respectivamente.</li></ol><pre>from langchain_community.document_loaders import PyPDFLoader<br><br>loader = PyPDFLoader(<br>    &quot;rag_example.pdf&quot;,<br>)<br>data = loader.load()</pre><p><strong>2. Divisão de dados: </strong>após carregarmos os dados, é necessário dividi-los em partes menores para que respeitem o tamanho da janela de contexto do LLM. É interessante manter uma sobreposição de contexto entre as divisões, por exemplo, o <em>documento 1</em> e <em>documento 2</em> possuirão uma parte em comum do documento, permitindo a retenção do contexto (nas classes o parâmetro <em>chunk_overlap </em>representa essa sobreposição). O LangChain nos permite utilizar alguns tipos de divisão de dados, entre eles, temos:</p><p><strong><em>CharaterTextSplitter:</em></strong><em> </em>este método visa satisfazer primeiro o caractere separador e depois o <em>chunk_size</em> e o <em>chunk_overlap</em>. Por dar prioridade ao separador, pode ser que esse método não respeite os limites do <em>chunk_size</em> e do <em>chunk_overlap</em>.</p><pre>from langchain_text_splitters import CharacterTextSplitter<br><br>text_splitter = CharacterTextSplitter(<br>    separator=&quot;.&quot;,<br>    chunk_size=1000,<br>    chunk_overlap=200,<br>)<br>docs = text_splitter.split_text(data)</pre><p><strong><em>RecursiveCharacterTextSplitter: </em></strong>utiliza uma lista de separadores possíveis para fazer a divisão, e, recursivamente observa se as divisões podem ser unificadas, buscando sempre satisfazer o limite do <em>chunk_size. </em>Dessa forma, esse método resulta em uma divisão mais equilibrada e otimizada do que a citada anteriormente.</p><pre>from langchain_text_splitters import RecursiveCharacterTextSplitter<br><br>text_splitter = RecursiveCharacterTextSplitter(<br>    separators=[&quot;.&quot;,&quot;\n&quot;, &quot; &quot;],<br>    chunk_size=1000,<br>    chunk_overlap=200,<br>)<br>docs = text_splitter.split_documents(data)</pre><p><strong>3. Armazenamento e recuperação: </strong>com a utilização de Embeddings, cada documento de texto será transformado em vetor, para que assim possamos extrair o seu valor semântico e posteriormente recuperarmos o documento que mais se assemelha com a requisição do usuário. Dessa forma, após a transformação, os documentos serão armazenados em um banco de dados vetorial. Segue um exemplo de utilização com o Chroma:</p><pre>from langchain_openai import OpenAIEmbeddings<br>from langchain_chroma import Chroma<br><br>&quot;&quot;&quot;carregamos o Embedding que será utilizado&quot;&quot;&quot;<br>embeddings = OpenAIEmbeddings(model=&quot;text-embedding-3-large&quot;)<br><br>&quot;&quot;&quot;transformamos os documentos e armazenamos vetores gerados <br>utilizando Embedding&quot;&quot;&quot;<br>vector_store = Chroma(<br>    docs,<br>    embedding_function=embeddings,<br>    persist_directory=&quot;path_to_save&quot;,<br>)<br><br>&quot;&quot;&quot;recuperamos os dados de três documentos a partir de similaridade, ou seja,<br>os que mais se aproximam da pergunta do usuário&quot;&quot;&quot;<br>retriever = vectorstore.as_retriever(<br>  search_type=&quot;similarity&quot;,<br>  search_kwargs={&quot;k&quot;: 3}<br>)<br><br>&quot;&quot;&quot;criamos uma cadeia sequencial que possibilita passarmos os documentos<br>recuperados pelo retriever como uma diretriz&quot;&quot;&quot;<br>rag_chain = ({&quot;guidelines&quot;: retriever}<br>             | prompt_template<br>             | llm)<br><br>&quot;&quot;&quot;executamos a cadeia sequencial com o RAG&quot;&quot;&quot;<br>rag_chain.invoke(question)</pre><h3>Conclusão</h3><p>Neste artigo e no anterior <em>“Como criar aplicações com LLM: Introdução ao LangChain”</em> discutimos sobre diferentes classes e funções disponíveis a partir do LangChain. Todas as ferramentas citadas podem ser utilizadas de forma integrada para criar uma aplicação com<em> </em>LLMs.</p><p>Começamos definindo qual o objetivo da nossa aplicação<em>, </em>e, após essa definição, analisamos qual LLM suprirá a complexidade envolvida. Então, criamos um agente e definimos as ferramentas (tools) que são necessárias para aplicação, como por exemplo, tools que utilizam de RAG para escopos específicos, e também, criamos os templates que serão utilizados para a aplicação e ferramentas. Dessa forma é possível desenvolver uma aplicação na qual se utiliza grandes modelos de linguagem com uma menor complexidade.</p><p>O LangChain vem se provando um ótimo framework para o desenvolvimento de aplicações baseadas em NLP e vale a atenção para os novos recursos que são constantemente adicionados à biblioteca.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d2c051878fa5" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sidi-nlp/como-criar-aplica%C3%A7%C3%B5es-com-llm-agentes-e-rag-com-langchain-d2c051878fa5">Como criar aplicações com LLM: Agentes e RAG com LangChain</a> was originally published in <a href="https://medium.com/sidi-nlp">SiDi NLP</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Como criar aplicações com LLM: Introdução ao LangChain]]></title>
            <link>https://medium.com/sidi-nlp/como-criar-aplica%C3%A7%C3%B5es-com-llm-introdu%C3%A7%C3%A3o-ao-langchain-75af2305144f?source=rss----a7bfc1260449---4</link>
            <guid isPermaLink="false">https://medium.com/p/75af2305144f</guid>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[langchain-agents]]></category>
            <category><![CDATA[langchain]]></category>
            <category><![CDATA[retrieval-augmented-gen]]></category>
            <category><![CDATA[nlp]]></category>
            <dc:creator><![CDATA[Mateus Zorzi]]></dc:creator>
            <pubDate>Tue, 18 Mar 2025 13:16:44 GMT</pubDate>
            <atom:updated>2025-06-11T15:10:20.720Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*8pgK0kcL5vPRPSmG.png" /></figure><p>O uso de Modelos de Linguagem de Grande Escala (LLMs) ganhou espaço em diversas aplicações e com isso se tornou imprescindível o desenvolvimento de ferramentas que auxiliem na utilização dos mesmos.</p><p>O LangChain é uma biblioteca open-source que facilita a criação de aplicações baseadas em LLMs. Além de possibilitar acesso a dados externos e maior escalabilidade tornando as aplicações mais dinâmicas, oferece ferramentas modulares para construir chatbots, agentes autônomos e sistemas avançados de perguntas e respostas através de classes e funções prontas, proporcionando um ambiente estruturado e eficiente para explorar o potencial dos LLMs e criar soluções inovadoras com menor esforço.</p><p>Por ser uma ferramenta open-source e em contínuo desenvolvimento, vale ressaltar certa atenção para a compatibilidade dos exemplos a seguir, onde foi utilizada a versão 0.3.13 da biblioteca, podendo haver diferenças em outras versões, mas os conceitos explicados permanecerão os mesmos.</p><h4>Carregando modelos</h4><p>Vamos iniciar com o primeiro passo necessário para criar uma aplicação baseada em LLM, carregá-lo. É possível carregar diversos LLMs para utilização a partir desse framework, como, por exemplo, modelos presentes nas APIs do HuggingFace e da OpenAI. O LangChain possui classes que permitem interagir de maneira fácil com essas duas APIs para carregar os seus modelos como descrito a seguir.</p><p>Criando seu token e carregando um modelo com a API do HuggingFace:</p><ol><li><em>Entre na sua conta do HuggingFace</em></li><li><em>Acesses os tokens em configurações: </em><a href="https://huggingface.co/settings/tokens"><em>https://huggingface.co/settings/tokens</em></a></li><li><em>Selecione New Token para criá-la</em></li></ol><pre>from langchain_huggingface import HuggingFaceEndPoint<br><br>llm = HuggingFaceEndpoint(<br>  repo_id=&#39;titiuae/falcon-7b-instruct&#39;,<br>  huggingfacehub_api_token=your_api_token)</pre><p>Criando seu token e carregando um modelo com a API da OpenAI:</p><ol><li><em>Entre na sua conta da OpenAI</em></li><li><em>Acesse o link: </em><a href="https://platform.openai.com/api-keys"><em>https://platform.openai.com/api-keys</em></a></li><li><em>Selecione Create New Secret Key para criá-la</em></li></ol><pre>from langchain_openai import OpenAI<br><br>llm = OpenAI(<br>  repo_id=&#39;gpt-3.5-turbo-instruct&#39;,<br>  api_key=your_api_token)</pre><p>Existem outras formas de carregar LLMs utilizando o LangChain, como utilizar o <em>Ollama </em>através do <em>langchain_ollama </em>para rodar o modelo localmente.</p><ol><li>Instale o Ollama e o pacote necessário: <em>pip install langchain_ollama</em></li><li>Baixe localmente um modelo através do comando <em>ollama pull</em> como, por exemplo: <em>ollama pull llama2</em></li><li>Carregue o modelo em seu código python:</li></ol><pre>from langchain_ollama import OllamaLLM<br><br>llm = OllamaLLM(model=&quot;llama2&quot;)</pre><h4>Prompts</h4><p>Após selecionarmos e carregarmos o modelo com que iremos trabalhar, exploraremos a criação de prompts. O LangChain possui diferentes tipos de templates e cada um com sua especificidade de aplicação, aqui serão citados apenas três deles.</p><ol><li><strong>PromptTemplates: </strong>este template é o mais comum, utilizado para criar um prompt mais simples e de string única, no qual podemos passar valores como parâmetros.</li></ol><pre>from langchain_core.prompts import PromptTemplate<br><br>prompt_template = PromptTemplate.from_template(&quot;Tell me a joke about {topic}&quot;)<br>prompt_template.invoke({&quot;topic&quot;: &quot;cats&quot;})</pre><p>2. <strong>ChatPromptTemplates: </strong>este template é ideal para aplicações de ChatBot ou Perguntas e Respostas (Q&amp;A), pois nos possibilita passar um histórico de mensagens como prompt. O LLM levará em conta o histórico passado para gerar sua resposta. Esse histórico possui três tipos diferentes de mensagens:</p><p><strong>a. AIMessage:</strong> utilizado para indicar as respostas geradas pelo LLM.</p><p><strong>b. HumanMessage:</strong> utilizado para indicar entradas do usuário.</p><p><strong>c. System Message:</strong> utilizado para alterar o comportamento do modelo, por exemplo, pedir para que ele seja mais “educado” na resposta.</p><pre>from langchain_core.prompts import ChatPromptTemplate<br><br>prompt_template = ChatPromptTemplate([<br>    (&quot;system&quot;, &quot;You are a helpful assistant&quot;),<br>    (&quot;human&quot;, &quot;Tell me a joke about cats&quot;),<br>    (&quot;ai&quot;, &quot;Who delivers Christmas presents to cats? Santa Claws.&quot;),<br>    (&quot;human&quot;, &quot;Now tell me about {topic}&quot;)<br>])<br>prompt_template.invoke({&quot;topic&quot;: &quot;dogs&quot;})</pre><p>3. <strong>MessagePlaceHolder: </strong>esse prompt possibilita inserir uma quantidade específica de mensagens em certa parte do nosso prompt, tornando-o mais flexível se assim for necessário, como se fosse um <em>ChatPromptTemplates </em>dinâmico. No exemplo abaixo nós estamos inserindo uma lista com duas mensagens onde declaramos <em>MessagesPlaceholder(“msgs”)</em>, ou seja, nosso prompt nesse caso teria três instruções e poderíamos inserir mais ou menos conforme a necessidade.</p><pre>from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder<br>from langchain_core.messages import HumanMessage<br><br>prompt_template = ChatPromptTemplate([<br>    (&quot;system&quot;, &quot;You are a helpful assistant&quot;),<br>    MessagesPlaceholder(&quot;msgs&quot;)<br>])<br>prompt_template.invoke({&quot;msgs&quot;: [HumanMessage(content=&quot;hi!&quot;), <br>                                HumanMessage(content=&quot;how are you?&quot;)]})</pre><h4>Histórico de conversação</h4><p>Seguindo a ideia dos prompts específicos para ChatBot, agora abordaremos uma das principais ferramentas desse framework: o histórico de conversação.</p><p>O LangChain possui classes que nos permitem armazenar o contexto de conversa com o LLM, possibilitando respostas mais robustas com o uso prolongado da aplicação. A seguir serão apresentadas três das principais possibilidades para armazenar o histórico de conversação.</p><ol><li><strong>ChatMessageHistory: </strong>salva todas as mensagens do histórico. Sempre que é adicionado uma nova mensagem, as anteriores continuam armazenadas e serão consideradas para a resposta seguinte do LLM. O histórico é perdido quando o sistema é reiniciado ou a aplicação é fechada.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/309/1*VUxEuqKRuxfe594oE7YSyA.png" /><figcaption>Utilizando o LLM com histórico de conversação simples.</figcaption></figure><p><strong>2. ConversationBufferMemory: </strong>funciona como um buffer, armazenando o histórico de um número específico de mensagens e, conforme novas mensagens chegam e ultrapassam o limite do buffer, as anteriores são perdidas. Para isso é utilizado um tipo especial de conversação por cadeia (<em>ConversationChain</em>) que permite que o modelo receba essa memória para gerar sua resposta. Este método é indicado para aplicações com conversas curtas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/440/1*7v14zhKO4k3Nf_lItkjrXQ.png" /><figcaption>Utilizando um buffer para armazenar o histórico de conversação.</figcaption></figure><p><strong>3. ConversationSummaryMemory: </strong>sumariza a conversa mantendo um contexto resumido ao longo do uso do LLM. É passado um LLM (<em>summarizer_llm</em>) como parâmetro para <em>ConversationSummaryMemory</em>, e esse LLM será o responsável por realizar a sumarização do histórico de conversação, mantendo o contexto. Este método é indicado para aplicações com conversas longas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/554/1*BwGryPxojkYMjPIYwNMa8Q.png" /><figcaption>Utilizando um resumo do histórico de conversação para manter o contexto.</figcaption></figure><h4>Cadeias sequenciais</h4><p>Agora falaremos de uma ferramenta muito útil do LangChain e que abrirá portas também para a continuação desse artigo, as cadeias sequenciais. Existem alguns problemas que são resolvidos e executados apenas de forma sequencial, onde a ação seguinte depende exclusivamente da resposta de uma ação anterior.</p><p>As cadeias sequenciais<strong> </strong>são estruturas que permitem encadear múltiplos passos em uma única operação. As cadeias permitem criar fluxos de execução onde a saída de um passo pode ser usada como entrada para o próximo. Isso possibilita combinar diferentes ferramentas em uma única operação como, por exemplo, cada ação (chamada de LLM) precisa ter seu prompt para realizar a consulta esperada ao LLM e, em geral, a resposta do LLM precisa ser convertida em uma estrutura aceita pelo seu sistema.</p><p>Abaixo utilizaremos de um exemplo de aplicação onde o usuário pede um itinerário de viagem, mas para criar esse itinerário, o LLM precisa listar as atividades mais interessantes daquele local, ou seja, a ação de criar um itinerário é dependente de uma ação anterior que é listar as atividades. Dessa forma, se faz necessário a utilização das cadeias sequencias. Note também que, para o exemplo abaixo, abordaremos todos os temas citados anteriormente (exceto o histórico de conversação).</p><p>Para criar uma cadeia sequencial seguimos alguns passos utilizando LCEL (LangChain Expression Language). Observe que o “|” (pipe) é utilizado para separar cada um dos passos dentro da cadeia. Os passos acontecem de forma sequencial, seguindo os “|”:</p><ol><li>Criamos os prompts para cada uma das chamadas que acontecerão, sendo o primeiro prompt para listar as atividades e o segundo para criar o itinerário;</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/836/1*zFfmceY5ga8JeLQ0rhyg0w.png" /></figure><p>2. Iniciamos a criação da cadeia de sequência criando um dicionário onde <em>result_from_first_template</em> será o parâmetro que o segundo prompt receberá como entrada e o valor será o resultado da chamada do LLM utilizando o prompt <em>first_template</em> e convertendo a saída do LLM para string (<em>StrOutputParse</em>);</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/705/1*Na3aAxDjOoQ9OrGIgwBYwQ.png" /></figure><p>3. Após obtermos a primeira chamada, seguimos com a cadeia chamando o segundo prompt, seguido pela chamada do LLM e convertendo a saída para string.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/831/1*otByXf6cKaZ2w6WrRyi2BQ.png" /><figcaption>Criando uma cadeia sequencial com LangChain.</figcaption></figure><p>Dessa forma, é possível encadearmos diversas chamadas de LLM em sequência quando uma for dependente da outra, utilizando apenas criação de prompts junto ao LCEL.</p><h4>Conclusão</h4><p>Passamos por alguns conceitos mais básicos como carregar modelos, criar prompts, até chegarmos a alguns mais complexos como histórico de conversação e cadeias sequenciais. Veja como esses tópicos podem ser utilizados em conjunto de uma aplicação, como um ChatBot, que depende de uma sequencia de ações fixa para responder o usuário, e o LangChain nos possibilita utilizar tudo isso a partir de um único framework.</p><p>Há muita coisa que não cabe apenas neste artigo, por isso, o principal objetivo é o encorajamento para aprofundar sobre o assunto. Este é um framework muito recente, tornando-se necessárias constantes atualizações das novas funções e classes que a comunidade incorpora a ele.</p><p>No próximo artigo <em>“Como criar aplicações com LLM: Agentes e RAG com LangChain”</em> discutiremos sobre duas ferramentas que são um pouco mais complexas do que as tratadas nesse artigo e que também as complementam.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=75af2305144f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sidi-nlp/como-criar-aplica%C3%A7%C3%B5es-com-llm-introdu%C3%A7%C3%A3o-ao-langchain-75af2305144f">Como criar aplicações com LLM: Introdução ao LangChain</a> was originally published in <a href="https://medium.com/sidi-nlp">SiDi NLP</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Papel da Amazon, Google e Microsoft na era da IA Generativa]]></title>
            <link>https://medium.com/sidi-nlp/papel-da-amazon-google-e-microsoft-na-era-da-ia-generativa-9ffa97eb82ed?source=rss----a7bfc1260449---4</link>
            <guid isPermaLink="false">https://medium.com/p/9ffa97eb82ed</guid>
            <dc:creator><![CDATA[Yurihallan]]></dc:creator>
            <pubDate>Tue, 22 Oct 2024 16:44:20 GMT</pubDate>
            <atom:updated>2024-10-22T16:44:20.667Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jWT8I3QZPX2MmsmbgM3Kfw.png" /></figure><h3>Uma breve Introdução</h3><p>A inteligência artificial generativa está transformando a maneira de criar conteúdo na internet com sua habilidade de criar conteúdo originais e customizados. Das escritas persuasivas à geração de imagens realísticas, as aplicações dessa tecnologia são amplas e promissoras. Os grandes players (Amazon, Google e Microsoft), não ficaram de fora desse boom da IA.</p><p>Nesse artigo, vamos fazer uma breve comparação dos serviços do Amazon, Google e Microsoft voltados para a IA.</p><h3>Os fundamentos da IA generativa e seu impacto</h3><p>Para começar a falar precisamos primeiro entender<strong> </strong>o que é IA generativa.</p><p><strong>A Inteligência Artificial Generativa (IAG) </strong>é um ramo da inteligência artificial que permite a criação de novos conteúdos, como textos, imagens, músicas e códigos, a partir de dados existentes. Ela funciona treinando modelos de computador em grandes conjuntos de dados para identificar padrões e relações. Uma vez treinados, esses modelos podem gerar novos conteúdos que são semelhantes aos dados originais, mas igualmente originais e criativos. A <strong>IAG</strong> tem aplicações em diversas áreas, desde a geração de arte e design até a criação de conteúdo para marketing e a produção de software. No entanto, é importante ressaltar que a qualidade e a relevância dos conteúdos gerados dependem da qualidade dos dados de treinamento e da arquitetura do modelo.</p><p><strong>Em resumo, o IAG é uma tecnologia que permite a criação de novos conteúdos de forma autônoma, abrindo um leque de possibilidades para a criatividade e a inovação em diversos ramos no mercado.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/876/1*OEDeZ7nAcd-9gD5A_s7qCQ.png" /><figcaption>figure 1- representando o usuário final (empresas ou usuário) que usam os serviços das BigTech Amazon(AWS), Microsoft (Azure), Google (Clouds).</figcaption></figure><p><strong>O usuário final, ao interagir com produtos e serviços de grandes empresas como Amazon, Microsoft e Google, está utilizando inteligência artificial de forma cada vez mais integrada ao seu dia a dia.</strong> Desde as recomendações personalizadas de produtos em plataformas de e-commerce até a tradução instantânea de textos em aplicativos de mensagens, a IA está presente em diversas ferramentas para facilita a vida do usuário.</p><p>A IA está transformando a relação entre empresas e consumidores, tornando as interações mais personalizadas e eficientes, mas é fundamental que essa tecnologia seja desenvolvida e utilizada de forma responsável e consciente.</p><h3>Amazon Bedrock</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/851/1*riAhbjfRkRZNM-LL2i0JrA.png" /></figure><p>O Amazon Bedrock se trata de um serviço que oferece várias opções de modelos de base (FM) de alta performance das principais empresas de IA dentro da Amazon Web Services, que oferecem um conjunto de modelos para o auxílio no desenvolvimento e implantar soluções de IA pôr um custo acessível. Estes modelos podem ser usados para tarefas simples a mais complexas como geração de texto, tradução, pesquisa, geração de imagens e geração de código.</p><p>Segurança, privacidade e práticas responsáveis ​​de IA são princípios fundamentais para a Bedrock.</p><p>Alguns pontos positivos e negativos sobre essa tecnologia irei aborda a seguir.</p><p><strong>Pontos Positivos</strong></p><ul><li><strong>Variedade de modelos:</strong> O Amazon Bedrock oferece acesso a uma ampla gama de modelos de base de empresas líderes em IA permitindo que os usuários escolham o mais adequado para suas necessidades específicas.</li><li><strong>Escalabilidade</strong>: O serviço foi projetado para ajudar você a construir e dimensionar rapidamente aplicativos de IA generativa, facilitando o manuseio de projetos de grande escala.</li><li><strong>Segurança</strong> <strong>e privacidade</strong>: O Amazon Bedrock garante que seus dados permaneçam seguros e privados, o que é crucial para muitas empresas</li><li><strong>Suporte da Amazon</strong>: A plataforma se beneficia de uma infraestrutura robusta e investimento contínuo em tecnologia de IA.</li></ul><p><strong>Pontos Negativos</strong></p><ul><li><strong>Potencial monopolização:</strong> há preocupações de que o domínio da Amazon no espaço de IA possa limitar as oportunidades para empresas menores</li><li><strong>Restrições de acesso:</strong> os usuários precisam solicitar acesso a determinados modelos, o que pode atrasar o processo de desenvolvimento</li><li><strong>Preocupações com privacidade de dados:</strong> apesar de suas medidas de segurança, há preocupações gerais sobre privacidade de dados em aplicativos de IA.</li><li><strong>Dificuldade de Detectar Vieses:</strong> Detectar e mitigar vieses em modelos de linguagem de grande porte é um desafio complexo, exigindo técnicas avançadas de análise de dados. Essas abordagens são a análise de sensibilidade, técnicas de explicabilidade, detecção de anomalias, métodos estatísticos, aprendizado de máquina e análise de texto.</li></ul><h3>Google Vertex AI</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*bMhAHNfkZjgR6SPk_GJ6BA.png" /></figure><p>O Google Vertex IA é uma plataforma de machine learning (ML) que permite treinar e implantar modelos de ML e aplicativos de IA. A Vertex AI combina fluxos de trabalho de engenharia de ML, dados e ciência de dados, permitindo que suas equipes colaborem usando um conjunto de ferramentas comum e escalonem seus aplicativos usando os benefícios do Google Cloud.</p><p>Incluindo mais de 150 modelos de fundação tipo o PaLM 2, Gemini 1.5 Pro e o Gemini 1.5 Flash. Tendo acesso ao Vertex Ai Studio, Agente Builder e as ferramentas de MLOps personalizados para os cientistas de dados gerenciarem os projetos de ML.</p><p>Como nem tudo é perfeito, vou citar alguns pontos positivos e negativos sobre o Google Vertex AI.</p><p><strong>Pontos Positivos</strong></p><ul><li><strong>Plataforma unificada:</strong> Vertex AI oferece uma plataforma única para construir, implantar e escalar modelos de aprendizado de máquina, simplificando o fluxo de trabalho.</li><li><strong>Escalabilidade</strong>: Ele pode lidar com tarefas de aprendizado de máquina em grande escala, sendo adequado para empresas com necessidades significativas de dados e computação.</li><li><strong>Capacidades AutoML</strong>: O Vertex AI inclui AutoML, permitindo que os usuários criem modelos de alta qualidade com esforço mínimo, mesmo que tenham conhecimento limitado em aprendizado de máquina. O <a href="https://cloud.google.com/vertex-ai/docs/beginner/beginners-guide?hl=pt-br">AutoML</a> permite treinar dados tabulares, de imagem, de texto ou de vídeo sem escrever códigos ou preparar divisões de dados. Vou deixar para explicar melhor em um próximo artigo.</li><li><strong>Modelos Pré-construídos</strong>: A plataforma oferece modelos pré-construídos (PaLM 2, Gemini 1.5 Pro e o Gemini 1.5 Flash) para tarefas comuns (Extrair, resumir e classificar dados), economizando tempo e recursos.</li><li><strong>Integração com Google Cloud</strong>: Sendo parte do ecossistema Google Cloud, ele se integra perfeitamente com outros serviços do Google, aumentando sua funcionalidade e facilidade de uso.</li></ul><p><strong>Pontos Negativos</strong></p><ul><li><strong>Complexidade para Iniciantes</strong>: Embora poderoso, o Vertex AI pode ser complexo para usuários sem um forte conhecimento em aprendizado de máquina, exigindo uma curva de aprendizado acentuada.</li><li><strong>Custo</strong>: O preço pode escalonar rapidamente, especialmente para casos de uso extensivos, o que pode ser uma preocupação para empresas menores.</li><li><strong>Personalização Limitada</strong>: Alguns usuários notaram que, embora o AutoML seja conveniente, ele oferece opções limitadas de personalização em comparação com a construção de modelos do zero.</li></ul><h3>Azure OpenAI</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/474/1*GI7-assHT6K8pZCKMAunWg.png" /></figure><p>O Azure OpenAI Service é um serviço totalmente gerenciado que permite aos desenvolvedores integrar modelos OpenAI em seus aplicativos. Ele fornece modelos avançados de IA de linguagem, incluindo GPT-4, GPT-3, Codex, DALL-E e modelos de conversão de texto em fala, com a promessa empresarial e de segurança do Azure.</p><p>Esses modelos podem ser facilmente adaptados à sua tarefa específica, incluindo, entre outros, geração de conteúdo, resumo, compreensão de imagens, pesquisa semântica e linguagem natural para tradução de código. Os usuários podem acessar o serviço por meio de APIs REST, Python SDK ou a interface baseada na Web no Azure OpenAI Studio.</p><p>O Azure enfatiza a integração permitindo um desenvolvimento eficiente dentro do ecossistema Microsoft.</p><p>Assim como o Amazon Bedrock e o Google Vertex AI, o Azure OpenAI também apresenta pontos positivos e negativos.</p><p><strong>Pontos Positivos</strong></p><ul><li><strong>Capacidades Avançadas de IA</strong>: O Azure OpenAI oferece acesso a modelos generativos poderosos, permitindo que as empresas criem aplicações de IA sofisticadas para diversos casos de uso, como processamento de linguagem natural, automação de atendimento ao cliente e geração de conteúdo.</li><li><strong>Integração com o Ecossistema Azure</strong>: Ele se integra perfeitamente com outros serviços do Azure, oferecendo recursos robustos de segurança, escalabilidade e conformidade, essenciais para aplicações empresariais.</li><li><strong>Inovação e Eficiência</strong>: O serviço ajuda as empresas a otimizar processos, melhorar a experiência do cliente e impulsionar a inovação, levando a uma maior eficiência e competitividade.</li><li><strong>Suporte e Recursos</strong>: A Microsoft fornece documentação extensa, suporte e recursos para ajudar os desenvolvedores a construir e implantar soluções de IA de forma eficaz.</li></ul><p><strong>Pontos Negativos</strong></p><ul><li><strong>Custo:</strong> Utilizar o Azure OpenAI pode ser caro, especialmente para pequenas empresas ou startups, devido aos altos recursos computacionais necessários para executar modelos avançados de IA. Se o cliente opta pelo modelo GPT-4o Global Deployment irá pagar no input $5, no output $15 e $260 na reserva mensal pro PTU (Provisioned Throughput Units ou unidades de produção provisionadas)</li><li><strong>Complexidade:</strong> Implementar e gerenciar soluções de IA com o Azure OpenAI pode ser complexo, exigindo conhecimento especializado em IA e serviços em nuvem.</li><li><strong>Lista de Espera:</strong> Devido à alta demanda, o acesso aos modelos mais avançados do Azure OpenAI pode exigir inscrição em uma lista de espera.<strong> </strong>A Microsoft precisa garantir que tenha capacidade suficiente para atender a todos os usuários.</li><li><strong>Potencial para Conteúdo Nocivo:</strong> Sem um design cuidadoso e mitigações, os modelos generativos têm o potencial de produzir conteúdo incorreto ou prejudicial, o que exige monitoramento e controle rigorosos.</li></ul><h3>Qual das 3 plataformas escolher?</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/630/1*AsoMikzxq9W696Z_VWykGQ.png" /></figure><p>A seguir temos uma análise abrangente de como essas plataformas se comparam em aspectos importantes:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/809/1*sehN4NM3Vz-UDbLAE08VxQ.png" /><figcaption>Figura 2: retirado do artigo Medium com o tema: Amazon Bedrock vs Google Vertex AI vs Microsoft Azure Cognitive Services</figcaption></figure><p>Por exemplo, a feature customização são limitadas no Amazon Bedrock e no Microsoft Azure. Já o Google Vertex AI saí na frente com modelos customizados.</p><h3>Casos de usos práticos</h3><p>Irei citar dois exemplos de uso com a plataforma <strong>Amazon Bedrock</strong>. Alguns termos que serão utilizados nos casos de uso a seguir.</p><ul><li><strong>API Gateway</strong>: O Amazon API Gateway é um serviço da AWS para criação, publicação, manutenção, monitoramento e proteção de APIs Rest. APIs agem como a “Porta de entrada” para aplicativos acessarem dados, lógica de negócios ou funcionalidade de seus serviços</li><li><strong>Lambda Function</strong>: O AWS Lambda é um serviço de computação sem servidor e orientado por eventos que permite executar códigos para praticamente qualquer tipo de aplicação ou serviço de back-end sem provisionar ou gerenciar servidores, ou seja, toda a infraestrutura como servidor, network e OS já são de responsabilidade do AWS Lambda Function para você focar apenas em escrever o código da aplicação.</li><li><strong>Bedrock</strong>: O Amazon Bedrock é um serviço totalmente gerenciado que oferece várias opções de modelos de base (FMs) de alta performance das principais empresas de IA.</li><li><strong>Cohere: </strong>Modelo que foi previamente treinado no AWS.</li><li><strong>Stability.AI: </strong>Outro modelo que foi previamente treinado no AWS. Temos muitos outros modelos como AI21 Labs, Anthropic, Cohere, Meta, Stability AI e Amazon</li><li><strong>S3 Bucket:</strong> O amazon S3 (Simple Storage Service) é um serviço de armazenamento de objetos escalável e altamente disponível oferecido pela Amazon Web Services (AWS).</li></ul><ol><li>Caso de uso: <strong>Seguradora</strong>.</li></ol><p>Um bom exemplo é seguradoras de veículos ou empresas que alugam equipamentos e/ou maquinários. Melhorando o fluxo de trabalho e garantindo a análise correta do ativo da empresa.</p><p>Imagine a seguinte situação: Um cliente que tenha sofrido um acidente com seu carro alugado ou próprio envia as imagens do carro para a seguradora e um técnico está demorando para fazer a análise e liberar o seguro. O cliente que tem como único meio de trabalho o carro, ficará sem receber.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/499/1*d8-oejEFOIV5Af05RGia6A.gif" /><figcaption>Então conseguiu pensar na aplicação?</figcaption></figure><p>Com uma solução de um sistema integrado com à IA, é possível gerar uma prévia utilizando o Amazon Bedrock. Isso permite determinar se houve uma perda total do veículo antes de encaminhá-lo a um especialista da seguradora, agilizando o processo interno.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mansa1K19X2zrlEXvzGWIg.png" /><figcaption>Figura 3 — Casos de uso Amazon Bedrock (Seguradora)</figcaption></figure><p>O Usuário tem um sistema que pode enviar uma foto que será recebida pelo API Gateway então essa ferramenta serviria como um “Porteiro” deixando entrar apenas os credenciados para então enviar para uma função Lambda, aqui será a execução do código e toda regra de negócio tratando qualquer erro possível de acontecer nessa comunicação.</p><p>Se a requisição for bem-sucedida o próximo passo será enviar para o Amazon Bedrock com o prompt e demais parâmetros obrigatórios tipo o modelo que eu quero utilizar, nesse caso do exemplo é o Cohere. Por fim, o modelo treinado gera o prompt, ou seja, com base na foto enviada, sendo gerado os resultados esperados como perda total ou parcial.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/220/1*zjuVGC2_hJSePekxyTZOqQ.gif" /><figcaption>Interessante esse caso né.</figcaption></figure><p>2. Caso de uso: <strong>Publicidade</strong>.</p><p>Outro caso de uso seria uma empresa de marketing que solicitou para um funcionário gerar um pôster de um filme que será lançado ou um produto novo. Antigamente, era preciso um tempo e inputs para esse funcionário gerar um pôster criativo. Com as novas tecnologias feita com IA, podemos solicitar da ferramenta para gerar um pôster com algumas linhas de prompts em poucas horas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7GzXCuGekMnUt03zENOHSQ.png" /><figcaption>Figura 4 — Casos de uso Amazon Bedrock (Marketing)</figcaption></figure><p>A maior parte do caso de uso funcionara parecido com o caso de uso da seguradora. O usuário tem um sistema que solicita para a aplicação gerar um pôster com base em alguns prompts de entrada. A API Gateway servirá como o porteiro, depois chegará na função lambda onde será executado algum tipo de código em uma linguagem escolhida.</p><p>Ao passar por essa etapa, vai chegar no Amazon Bedrock, ele irá escolher o modelo que definimos na arquitetura, o modelo é executado, que nesse caso é o Stability.ai, e devolve o output com a solicitação do usuário.</p><p>O Amazon Bedrock envia para o S3 Bucket fazer o upload no sistema de armazenamento de objetos. O S3 Bucket retornará apenas a URL para o meu usuário final depois de salvar a url.</p><h3>Conclusão</h3><p>Plataformas amigáveis para usuários de IA generativa devem se tornar cada vez mais comuns, tornando a tecnologia acessível a mais pessoas. É importante que as empresas entendam os pontos fortes e fracos de cada plataforma para utilizar efetivamente a IA generativa e se manterem competitivas no mercado. Ao avaliar necessidades e prioridades específicas, as empresas podem escolher a melhor plataforma para aproveitar todo o potencial da IA generativa e impulsionar a inovação.</p><h3>Referências:</h3><p>LECHNER, A. <strong>Amazon Bedrock: A nova Era da IA generativa</strong>. 20 maio 2024. Disponível em: <a href="https://www.dio.me">https://www.dio.me</a> Acesso em: 25 jul. 2024</p><p>‌Google, <strong>Exemplos de IA generativa</strong>. Disponível em: <a href="https://cloud.google.com/use-cases/generative-ai?hl=pt-BR">Exemplos de IA generativa | Google Cloud</a>. Acesso em: 02 set 2024.<br> <br> AWS, <strong>O que é IA generativa?</strong> Disponível em: <a href="https://aws.amazon.com/pt/what-is/generative-ai/">O que é IA generativa? — Explicação da inteligência artificial generativa</a> Acesso em: 05 set 2024<br> <br> AWS, <a href="https://aws.amazon.com/pt/bedrock/"><strong>Crie aplicações de IA generativa com modelos de base — Amazon Bedrock</strong> </a>. Disponível em: <a href="https://aws.amazon.com/pt/bedrock/">Amazon Bedrock</a>. Acesso em: 05 set 2024</p><p>Google, <strong>Introdução à Vertex AI</strong>. Disponível em: <a href="https://cloud.google.com/vertex-ai/docs/start/introduction-unified-platform?hl=pt-br">Introdução à Vertex AI</a> Acesso em:02 out 2024</p><p>Microsoft, <strong>What is Azure OpenAI Service?</strong> Disponível em: <a href="https://learn.microsoft.com/en-us/azure/ai-services/openai/overview">What is Azure OpenAu Services</a> Acesso em: 02 out 2024</p><p>Microsoft, <strong>Azure OpenAI service documentation</strong>. Disponível em: <a href="https://learn.microsoft.com/en-us/azure/ai-services/openai/">Azure OpenAI Service documentation — Quickstarts, Tutorials, API Reference — Azure AI services | Microsoft Learn</a> Acesso em: 02 out 2024</p><p>Kaushik, V. <strong>Amazon Bedrock vs Google Vertex AI vs Microsoft Azure Cognitive Services</strong>. Disponível em: <a href="https://medium.com/@kaushikvikas/amazon-bedrock-vs-8a58059026da">Amazon Bedrock vs. Google Vertex AI vs. Microsoft Azure Cognitive Services: A Battle for Generative AI Supremacy | by Vikas Kaushik | Medium</a> Acesso em: 02 out 2024</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9ffa97eb82ed" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sidi-nlp/papel-da-amazon-google-e-microsoft-na-era-da-ia-generativa-9ffa97eb82ed">Papel da Amazon, Google e Microsoft na era da IA Generativa</a> was originally published in <a href="https://medium.com/sidi-nlp">SiDi NLP</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Compressão de modelo: Poda, clustering e destilação de conhecimento]]></title>
            <link>https://medium.com/sidi-nlp/compress%C3%A3o-de-modelo-poda-clustering-e-destila%C3%A7%C3%A3o-de-conhecimento-63799d0745fc?source=rss----a7bfc1260449---4</link>
            <guid isPermaLink="false">https://medium.com/p/63799d0745fc</guid>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[nlp]]></category>
            <category><![CDATA[quantization]]></category>
            <category><![CDATA[model-compression]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Mateus Zorzi]]></dc:creator>
            <pubDate>Wed, 16 Oct 2024 17:25:24 GMT</pubDate>
            <atom:updated>2025-01-30T17:54:48.773Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/735/1*6bHtW4GAYtHncDceovSRVw.jpeg" /></figure><p>A dimensionalidade é um problema recorrente para aplicação de redes neurais e por conta disso existem diversas técnicas possíveis para resolver esse problema.</p><p>No <a href="https://medium.com/sidi-nlp/o-que-%C3%A9-quantiza%C3%A7%C3%A3o-em-machine-learning-5fd12a72a22e">artigo anterior</a>, quantização foi o método abordado para realizar a compressão de redes neurais. Neste, será abordado um tema complementar ao assunto, onde serão introduzidos novos métodos para realizar a compressão de modelos, principalmente o método de “poda” (pruning) e também um método híbrido, onde é utilizado tanto a poda quanto o método de quantização. Os métodos “clustering” e “knowledge distillation” também serão mencionados.</p><h3>Poda (Pruning)</h3><p>O método de poda busca os mesmos objetivos comentados para a quantização, ambos visam adaptar o modelo para utilizá-lo em aparelhos com menor recurso computacional sendo necessário diminuir a complexidade da rede neural utilizada.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/511/0*ZSAtdvW2anwScQ1l.png" /><figcaption>Exemplo de Quantização de float32 para int32. (Fonte: <a href="https://www.qualcomm.com/news/onq/2019/03/heres-why-quantization-matters-ai">https://www.qualcomm.com/news/onq/2019/03/heres-why-quantization-matters-ai</a>)</figcaption></figure><p>Diferente da quantização (imagem acima), como visto anteriormente, em que a complexidade é reduzida alterando o tipo de dado utilizado nos pesos e saídas da rede (alteração de float32 para int32, por exemplo), no método de poda isso é realizado através da “remoção” de pesos da rede, o tipo de dado utilizado se mantém o mesmo. Essa remoção pode acontecer de duas formas e, por isso, existem dois diferentes métodos de poda: o estruturado e o não estruturado. A grande diferença entre os dois métodos se dá por conta da forma que os pesos são “removidos”, buscando a diminuição de complexidade da rede.</p><p>Antes de explicar sobre cada uma das duas técnicas de podas existentes, será apresentado os critérios para realizar poda e seu conceito principal.</p><h4>Critérios de poda</h4><p>Tendo em vista que o objetivo desse método é remover os pesos da rede neural buscando uma menor complexidade e pouca perda de acurácia para o modelo, precisa ser definido qual critério será utilizado para realizar a poda dos pesos. Existem três principais critérios que podem ser aplicados:</p><p><strong>Magnitude do peso (weight magnitude): </strong>nesse critério realiza-se a poda baseado no valor absoluto dos pesos, indica-se um valor de corte (threshold) que será a magnitude mínima permitida para um peso, todos os pesos que possuírem magnitude menor a esse threshold sofrem o processo de poda. Após a aplicação do método utilizando o critério de magnitude, costuma ser recomendado a aplicação de uma normalização nos demais pesos, fazendo com que os mesmos se aproximem de zero.</p><p><strong>Magnitude do gradient (gradient magnitude): </strong>este critério leva em consideração o gradiente durante o processo de treinamento da rede neural, a cada época ou mini batch, o valor do gradiente é observado e determina quais pesos sofrerão da poda.</p><p><strong>Poda local ou global: </strong>este critério realiza a poda em uma porcentagem fixa da rede neural e pode ser aplicado de duas formas, local ou global.<br>Da maneira local a porcentagem será aplicada igualmente para cada layer da rede, por exemplo, uma porcentagem de 50% significa que cada layer terá metade dos seus pesos cortados. Já o método global não leva em consideração cada camada, a poda será realizada em 50% dos pesos de uma forma geral, as camadas sofrerão diferentes quantias de poda.</p><p>Agora que conhecemos os possíveis critérios para realização da poda, falaremos sobre os dois tipos de poda: não-estruturada e estruturada.</p><h4>Poda Não-Estruturada</h4><p>Como dito anteriormente, a grande diferença entre os dois métodos de poda estão na forma como os pesos são removidos. Na poda não-estruturada os pesos não são removidos da rede de fato, na verdade eles são substituídos por zero. Dessa forma a arquitetura da rede neural não sofre alterações, o número de camadas e neurônios permanecerá o mesmo do modelo original, o que será alterado são apenas os valores dos pesos selecionados pelo critério de poda.</p><p>Essa abordagem é mais eficaz para redução de tamanho do modelo e tempo de inferência, mas não muito eficiente para desempenho e custo da rede neural.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/521/1*IJbv9pRLiUThFPIHWobGEA.png" /><figcaption>(Imagem do autor)</figcaption></figure><h4>Poda Estruturada</h4><p>Diferente do método anterior, a poda estruturada realiza alterações diretas na arquitetura, ela não altera o valor dos pesos para zero, mas os remove, retirando alguns neurônios ou até mesmo camadas inteiras da rede neural.</p><p>Este método é mais invasivo do que o anterior e, por conta disso, precisa ter mais cautela ao ser aplicado, pois ele pode gerar uma perda de acurácia maior do que a esperada. Além disso, é necessário prestar atenção em como o método está alterando a arquitetura da rede: dependendo da camada que é podada, isso pode resultar em saídas não esperadas pela rede, gerando erros de execução.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/521/1*NB5wmVMKsdSZz5gLw5Y_kQ.png" /><figcaption>(Imagem do autor)</figcaption></figure><h4>Poda e quantização</h4><p>Como explicado acima, o método de poda é mais uma forma de reduzir a dimensionalidade do modelo, mas utilizando de estratégias e critérios como a relevância e magnitude de certos parâmetros para “removê-los”.</p><p>Mas mesmo após aplicação da técnica de poda e com o conhecimento obtido no artigo sobre quantização, vemos que existe margem para melhorar a compressão do modelo. Uma vez que a poda apenas “remove” os parâmetro que seu critério não julga relevante, os demais parâmetros permanecem na rede neural em seu estado natural, ou seja, em ponto flutuante.</p><p>Utilizando as duas técnicas em conjunto é possível obter uma compressão do modelo ainda melhor, chegando a reduzir o seu tamanho em até 20x. Sobre a perda de acurácia que é sempre a maior preocupação, é importante tomar cuidado principalmente na etapa de poda, mas em geral a perda de acurácia através da aplicação das duas técnicas em conjunto é muito similar a perda quando é aplicada apenas uma das técnicas.</p><p>Para aplicação de ambas as técnicas em conjunto é muito simples, basta seguir o passo a passo de ambas, primeiro realizando a poda de sua rede neural, após isso, aplicar o algoritmo de quantização na sua rede e pronto, resultará em uma rede neural com menor tamanho e latência, além de uma acurácia muito similar ao modelo original.</p><p>A seguir está um código onde é possível utilizar o método de poda e quantização juntos, mais detalhes podem ser encontrados no site do tensorflow:</p><pre>import tensorflow_model_optimization as tfmot<br><br>prune_low_magnitude = tfmot.sparsity.keras.prune_low_magnitude<br><br># Calcula o &quot;end step&quot; para finalizar a poda após 2 &quot;epochs&quot;.<br>batch_size = 128<br>epochs = 2<br>validation_split = 0.1 # 10% of training set will be used for validation set. <br><br>num_images = train_images.shape[0] * (1 - validation_split)<br>end_step = np.ceil(num_images / batch_size).astype(np.int32) * epochs<br><br># Define o modelo para realizar a poda<br>pruning_params = {<br>      &#39;pruning_schedule&#39;: tfmot.sparsity.keras.PolynomialDecay(initial_sparsity=0.50,<br>                                                               final_sparsity=0.80,<br>                                                               begin_step=0,<br>                                                               end_step=end_step)<br>}<br><br>model_for_pruning = prune_low_magnitude(model, **pruning_params)<br><br># Quando utilizado o `prune_low_magnitude` é necessário recompilar o modelo.<br>model_for_pruning.compile(optimizer=&#39;adam&#39;,<br>              loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),<br>              metrics=[&#39;accuracy&#39;])<br><br>model_for_export = tfmot.sparsity.keras.strip_pruning(model_for_pruning)<br><br># Realiza Fine tune no modelo pós poda<br>logdir = tempfile.mkdtemp()<br><br>callbacks = [<br>  tfmot.sparsity.keras.UpdatePruningStep(),<br>  tfmot.sparsity.keras.PruningSummaries(log_dir=logdir),<br>]<br><br>model_for_pruning.fit(train_images, train_labels,<br>                  batch_size=batch_size, epochs=epochs, validation_split=validation_split,<br>                  callbacks=callbacks)<br>model_for_export = tfmot.sparsity.keras.strip_pruning(model_for_pruning)<br><br># Realiza compressão no modelo<br>converter = tf.lite.TFLiteConverter.from_keras_model(model_for_export)<br>pruned_tflite_model = converter.convert()<br><br>_, pruned_tflite_file = tempfile.mkstemp(&#39;.tflite&#39;)<br><br>with open(pruned_tflite_file, &#39;wb&#39;) as f:<br>  f.write(pruned_tflite_model)</pre><h4>Clustering de peso</h4><p>Esse método é tão direto quanto seu próprio nome. Os pesos de cada camada da rede neural serão agrupados em N clusters, dentro desses clusters serão calculados os seus centroides e então os valores dos pesos são substituídos pelos respectivos centroides calculados.</p><p>Como é de se imaginar, o principal parâmetro dessa técnica é o valor de N. Quanto menor o valor de N, menos clusters serão criados e mais compacto será o modelo, porém mais a acurácia pode ser afetada.</p><p>Esse é um método que parece e de fato é muito simples, mas possui uma eficácia tão grande quanto os comentados anteriormente.</p><p>Aqui está um código onde é possível utilizar o método de clustering, mais detalhes podem ser encontrados no site do tensorflow:</p><pre>import tensorflow_model_optimization as tfmot<br><br>cluster_weights = tfmot.clustering.keras.cluster_weights<br>CentroidInitialization = tfmot.clustering.keras.CentroidInitialization<br><br>clustering_params = {<br>  &#39;number_of_clusters&#39;: 16,<br>  &#39;cluster_centroids_init&#39;: CentroidInitialization.LINEAR<br>}<br><br># Cluster a whole model<br>clustered_model = cluster_weights(model, **clustering_params)<br><br># Use smaller learning rate for fine-tuning clustered model<br>opt = keras.optimizers.Adam(learning_rate=1e-5)<br><br>clustered_model.compile(<br>  loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),<br>  optimizer=opt,<br>  metrics=[&#39;accuracy&#39;])<br><br>clustered_model.summary()</pre><h4>Destilação de conhecimento (Knowledge destilation)</h4><p>Este é o método que inicialmente aparenta ser o mais complexo e também mais “brilhante”. Seguindo o próprio nome o intuito é passarmos o conhecimento de um modelo complexo (pré-treinado) para um modelo menos complexo, assim mantendo a acurácia e diminuindo o seu tamanho.</p><p>O processo de destilação de conhecimento ocorre através do treinamento supervisionado, onde o <em>modelo menor (aprendiz)</em> será treinado em um conjunto de dados buscando “imitar” os resultados e representações internas do modelo mais complexo (professor). Para que seja possível o <em>modelo aprendiz</em> generalizar as informações contidas no modelo mais complexo, nesse período de treinamento o modelo busca imitar os resultados baseado em <em>soft labels</em> do modelo professor ao invés das <em>hard labels</em>, já que as<em> soft labels </em>possuem as probabilidades preditas para cada classe.</p><p>Utilizar as <em>soft labels </em>como principal referencia para o treinamento do <em>modelo aprendiz</em> permite que o modelo, em uma tarefa de classificação de imagens por exemplo, aprenda que a probabilidade de uma imagem de um “cachorro” ser classificada como “raposa” é maior do que ser classificada como um “rato”.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*CP2UBsMh4sINDu9w" /><figcaption>Exemplo de destilação de conhecimento entre o modelo “professor” e o “aprendiz”. Fonte: <a href="https://arxiv.org/abs/2006.05525">https://arxiv.org/abs/2006.05525</a></figcaption></figure><h4>Conclusão</h4><p>A compressão de modelos é uma área que sempre estará em pauta e em recorrentes atualizações com a criação de novos métodos, esses são apenas alguns que podem ser utilizados de forma eficaz até o atual momento.</p><p>Cada vez os modelos estão maiores, como os LLMs, e com isso a compressão será cada vez mais necessária para permitir que os modelos avancem de uma maneira que seja plausível e possibilite a sua utilização de diversas maneiras.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=63799d0745fc" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sidi-nlp/compress%C3%A3o-de-modelo-poda-clustering-e-destila%C3%A7%C3%A3o-de-conhecimento-63799d0745fc">Compressão de modelo: Poda, clustering e destilação de conhecimento</a> was originally published in <a href="https://medium.com/sidi-nlp">SiDi NLP</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Prompt e Engenharia de Prompt]]></title>
            <link>https://medium.com/sidi-nlp/prompt-e-engenharia-de-prompt-a8ec69760429?source=rss----a7bfc1260449---4</link>
            <guid isPermaLink="false">https://medium.com/p/a8ec69760429</guid>
            <category><![CDATA[nlp]]></category>
            <category><![CDATA[promptly-written]]></category>
            <category><![CDATA[prompt-engineering]]></category>
            <category><![CDATA[prompt]]></category>
            <dc:creator><![CDATA[Lucas Marques]]></dc:creator>
            <pubDate>Fri, 11 Oct 2024 17:08:18 GMT</pubDate>
            <atom:updated>2024-10-11T17:08:18.034Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*-VstoS1yEQ6SdSH0q3Fz-Q.jpeg" /></figure><p>Prompt e Engenharia de prompt são conceitos essenciais no campo da inteligência artificial generativa, neste artigo vamos nos aprofundar um pouco no que eles significam e como desempenham um papel importante na obtenção de resultados de alta qualidade nos modelos generativos.</p><h3>Prompt</h3><p>O prompt se refere a uma entrada ou instrução fornecida em formato de texto a um modelo de IA generativa, a fim de orientar e guiar sua saída. É como dar uma dica ou um contexto específico para que o modelo saiba exatamente o que você deseja que ele produza. Isso pode variar de consultas simples e diretas até declarações detalhadas para tarefas de alta complexidade.</p><p>No contexto de modelos de geração de imagens como o <strong>DALLE-3</strong>, os prompts são frequentemente descritivos, enquanto em <strong>LLMs </strong>como <strong>GPT-4</strong> ou <strong>Gemini</strong>, podem variar de consultas simples até declarações de problemas de alta complexidade.</p><h3>O que é a Engenharia de Prompt?</h3><p>A engenharia de prompt é o processo de escrever, refinar e otimizar esses inputs para incentivar os sistemas de IA generativas a criar saídas de altíssima qualidade. Elaborar essas entradas ajudam o modelo a entender, não apenas a linguagem, mas também as nuances e as intenções por trás da solicitação, e esse é justamente o desafio de quem está trabalhando neste processo.</p><p>A qualidade do prompt influencia diretamente a qualidade do conteúdo gerado pela IA, seja ele um texto, uma imagem, um código fonte, entre outros tipos de retornos. Um prompt bem elaborado e refinado (após diversos experimentos) permite que o modelo produza resultados bastante precisos e relevantes, reduzindo a necessidade de revisões humanas pós geração do resultado.</p><p>A engenharia de prompt pode envolver técnicas avançadas como o “<strong>Chain-of-thought</strong>” e o “<strong>Reflection</strong>”.</p><p>“<strong>Chain-of-thought</strong>” ou “<strong>Cadeia de pensamentos</strong>”, é uma técnica que fornece um raciocínio de forma sistemática e em passo a passo para o modelo seguir. Ao demonstrar o processo de pensamento necessário para chegar a uma resposta, os modelos podem gerar saídas com maior riqueza de detalhes e precisão. Esse tipo de técnica pode ser utilizada para guiar modelos para a direção mais assertiva possível, mostrando como abordar um problema e como chegar a uma solução baseada na lógica, como por exemplo, a solução de uma equação:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/518/1*5PcvIr_fQeuhlQFSYWPGrg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/905/1*sNfc6vjPRP3bB7Lc3j0qXQ.png" /></figure><p>Já o “<strong>Reflection</strong>”, <strong>“Self-Reflection”</strong> ou “<strong>Reflexão</strong>”, é uma técnica que através do feedback linguístico e humano, colocamos o modelo em um estado de auto-reflexão a respeito do seu resultado anterior, fornecendo contexto e possíveis melhorias para futuras consultas/respostas. Esse tipo de técnica, ajuda o modelo a aprender rapidamente com erros anteriores, levando a melhorias no desempenho em tarefas mais avançadas, ou respostas mais elaboradas. Seguindo o mesmo exemplo da técnica anterior, podemos utilizar o Reflection para fazer o modelo explicar de uma maneira mais clara:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/816/1*NSplHEvUdDzu__kf6q9EUw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/916/1*owbKNU0iOfThYS8adN6zvg.png" /></figure><h3>Tipos de Prompt</h3><h4>Prompt Direto (Zero-Shot): é o tipo mais simples de prompt, ele não fornece exemplos ao modelo, apenas a instrução.</h4><ul><li><strong>Pergunta:</strong></li></ul><blockquote>Quem foi o primeiro presidente dos Estados Unidos?</blockquote><ul><li><strong>Resposta:</strong></li></ul><blockquote>George Washington.</blockquote><h4><strong>Prompt com Exemplos (One-Shot, Few-Shot, Multi-Shot): Utilizam exemplos específicos para ajudar o modelo a focar e gerar respostas mais precisas</strong></h4><ul><li><strong>Pergunta:</strong></li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/447/1*mQETlIQk_i3d7bXsy2Hq3Q.png" /></figure><ul><li><strong>Resposta:</strong></li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/348/1*unP-UTq08cBgwrCJ1_5jCQ.png" /></figure><h4><strong>Prompt de Função:</strong> <strong>Define um papel para o modelo, como se fosse um assistente ou um especialista em uma determinada área</strong></h4><ul><li><strong>Pergunta:</strong></li></ul><blockquote>Você é um tutor de matemática especializado em álgebra. Sua função é explicar passo a passo como resolver equações quadráticas de forma simples e clara para iniciantes. Explique o processo para resolver a seguinte equação: x² — 5x + 6 = 0</blockquote><ul><li><strong>Resposta:</strong></li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/732/1*rHaXlAofCXqPOqZ9DO3t0w.png" /></figure><h3>Avançando um pouco mais no tópico de Engenharia de Prompt</h3><p>Podemos trabalhar com os prompts por meio de uma interface feita pela empresa que disponibiliza o modelo (como por exemplo a OpenAI), em que nos limitamos somente a alguns tipos de técnicas, geralmente, estas empresas só disponibilizam o campo para digitar o prompt.</p><p>Porém, todavia, entretanto… Existem empresas que disponibilizam a <strong>API </strong>de seus modelos, o que torna as coisas ainda mais interessantes, pois isso abre um leque de possibilidades na engenharia de prompt<strong>!</strong></p><p>Por meio da <strong>API</strong>, podemos configurar parâmetros para obtermos respostas ainda mais interessantes e assertivas. Trabalhar em cima desses parâmetros mais baixo nível requer um pouco mais de experimentos para descobrir as configurações mais adequadas para cada uso de prompt. Vamos passar por alguns destes métodos utilizados na engenharia de prompt quando interagimos com o <strong>LLM </strong>via <strong>API</strong>:</p><ul><li><strong>Top-P (Nucleous Sampling)</strong>: É um parâmetro que controla a diversidade da resposta, selecionando as ‘P’ palavras mais prováveis. Isso pode ajudar a evitar a alucinação do modelo, gerando respostas menos improváveis ou fora do contexto proposto no Prompt.</li><li><strong>Temperature</strong>: Este parâmetro controla a aleatoriedade das respostas geradas pelo modelo. Um valor mais alto de temperatura resulta em respostas com mais variação e maior criatividade, enquanto o valor mais baixo tende a produzir respostas mais previsíveis e conservadoras.</li><li><strong>Max_Tokens</strong>: Define o número máximo de tokens que o modelo pode gerar em resposta a um prompt. Isso é útil para limitar o comprimento da saída, garantindo que as respostas não sejam excessivamente longas.</li><li><strong>Frequency_Penalty</strong>: Reduz a probabilidade do modelo repetir a mesma palavra ou frase, incentivando a geração de palavras e frases com mais diversificação ao longo da resposta.</li></ul><h3>Como restringir o escopo dos prompts à aplicação?</h3><p>Realizar a restrição de um escopo de Prompt de um LLM a uma aplicação específica pode ser um grande desafio devido à quantidade de dados que aquele modelo pode ter sido treinado e às diversas tarefas que o modelo pode realizar. Mas é essencial o domínio da engenharia de prompt para obter respostas relevantes e evitar com que essas informações fora de contexto sejam retornadas.</p><p>Para isso, pode-se pensar em estratégias como:</p><ol><li><strong>Contextualização</strong></li><li><strong>Instruções ricas em detalhes</strong></li><li><strong>Exemplos de Few-shot no prompt</strong></li><li><strong>Uso de Chain-of-Thought</strong></li></ol><p>Ou abordagens ainda mais avançadas, como por exemplo:</p><ol><li><strong>Implementação de Filtragem pós-processamento:</strong> Após a geração da resposta do modelo, utilize algoritmos adicionais para filtrar e verificar a relevância da resposta em relação ao domínio proposto.</li><li><strong>Uso de modelos específicos de domínio:</strong> Utilize modelos que já foram treinados e ajustados especificamente para domínios parecidos com a aplicação. Por exemplo, um modelo especializado em linguagem médica para responder perguntas no contexto de saúde.</li><li><strong>Fine-Tuning do modelo:</strong> Realize um fine-tuning do modelo utilizando um conjunto de dados especializado, e que abranja somente o domínio da aplicação. Isso vai ajudar o modelo a se tornar mais especializado no contexto proposto da aplicação.</li><li><strong>RAG (Retrieval-Augmented Generation)</strong>: O RAG é uma técnica que combina um modelo de recuperação de informações (Retriever) com um modelo de geração de texto (generator). A ideia é usar um modelo que busque informações relevantes em uma base de dados específicas, ou um conjunto de documentos, antes de enviar essas informações para um modelo de geração, a fim de produzir uma resposta final estritamente alinhada com o domínio da aplicação.</li></ol><h3>Quando usar prompts e quando realizar o fine-tuning de um LLM?</h3><p>A escolha entre qual e quando utilizar, depende de diversos fatores, incluindo o contexto da aplicação, a complexidade da tarefa, quais os recursos estão disponíveis, e qual a necessidade de ter um modelo especializado.</p><p>Então, quando devo utilizar Prompt?</p><ol><li><strong>Aplicações de Baixa e Média complexidade (Tarefas gerais):</strong> Aplicações que não requerem respostas muito específicas ou complexas, os prompts geralmente são suficientes (responder perguntas em geral, gerar texto, fornecer resumos, etc…).</li><li><strong>Flexibilidade: </strong>Ajustar rapidamente o comportamento do modelo sem treiná-lo novamente (Modificar o prompt conforme necessário).</li><li><strong>Testes e Experimentos:</strong> Realizar testes e experimentos em diferentes modelos para avaliar a qualidade da saída (validar ideia sem investimento significativo de tempo e recurso).</li><li><strong>Limitações de Recursos:</strong> Caso não exista um grande volume de dados ou hardware suficiente para treinar um modelo, utilizar prompt se torna muito prático e eficiente.</li></ol><p>E quando devo fine-tunar um modelo?</p><ol><li><strong>Aplicações de alta complexidade e alta especialização:</strong> Se ter um alto grau de precisão, consistência e especialização na resposta, realizar o fine-tuning do modelo sem dúvidas é a melhor abordagem.</li><li><strong>Melhorar desempenho em tarefas específicas: </strong>Permite que o modelo aprenda nuances de tarefas específicas que serão realizadas de uma maneira mais generalista por modelos genéricos.</li><li><strong>Personalização:</strong> Quando é necessário que o modelo reflita regras de negócios, conhecimento institucional e etc… o fine-tuning permite que o modelo incorpore essas personalizações.</li><li><strong>Controle e consistência de respostas:</strong> Permite um controle maior sobre o comportamento do modelo, garantindo respostas alinhadas com os objetivos da aplicação.</li><li><strong>Desempenho:</strong> Aplicações que demandam uma alta performance e precisão, o fine-tuning melhora significativamente o resultado final.</li></ol><p>E claro, utilizar um mix dessas abordagens pode trazer um desempenho ainda melhor. Se a aplicação permite um fine-tuning de um modelo para um domínio específico, é possível em seguida, utilizar prompts com alto nível de otimização baseado nas técnicas apresentadas anteriormente, para ajustar ainda mais o comportamento do modelo dentro do domínio esperado.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a8ec69760429" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sidi-nlp/prompt-e-engenharia-de-prompt-a8ec69760429">Prompt e Engenharia de Prompt</a> was originally published in <a href="https://medium.com/sidi-nlp">SiDi NLP</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Prevendo a utilidade de comentários em Português Brasileiro de jogos na Steam]]></title>
            <link>https://medium.com/sidi-nlp/prevendo-a-utilidade-de-coment%C3%A1rios-em-portugu%C3%AAs-brasileiro-de-jogos-na-steam-fe457ed31f68?source=rss----a7bfc1260449---4</link>
            <guid isPermaLink="false">https://medium.com/p/fe457ed31f68</guid>
            <category><![CDATA[recomendation-systems]]></category>
            <category><![CDATA[sentiment-analysis]]></category>
            <category><![CDATA[nlp]]></category>
            <category><![CDATA[big-data]]></category>
            <category><![CDATA[machine-learning]]></category>
            <dc:creator><![CDATA[Germano Jorge]]></dc:creator>
            <pubDate>Tue, 11 Jul 2023 12:29:39 GMT</pubDate>
            <atom:updated>2023-07-11T12:29:39.889Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CSk0aULxAr2r99Yj0emJ7w.png" /><figcaption>Fonte: <a href="https://store.steampowered.com/">https://store.steampowered.com/</a>. Acesso em 12/06/2023</figcaption></figure><h3>Introdução</h3><p>Com a crescente influência da internet no processo de tomada de decisão dos consumidores, os comentários online têm se tornado uma fonte valiosa de informações para os usuários. No mercado de jogos, essa tendência não é diferente.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*X9bswliR-12rhwLJnUIMBg.png" /><figcaption>Fonte: <a href="https://exame.com/marketing/decisao-de-compra-e-cada-vez-mais-baseada-em-comentarios/">https://exame.com/marketing/decisao-de-compra-e-cada-vez-mais-baseada-em-comentarios/</a></figcaption></figure><p>De acordo com um artigo publicado na revista “exame”, a decisão de compra de jogos está cada vez mais baseada em comentários na web [1]. Além disso, o mercado de jogos atualmente vale mais do que as indústrias de música e cinema juntas, conforme reportado pelo Canaltech [2].</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jqS4JL8ZlY4iae3xGbCJ2w.png" /><figcaption>Fonte:https://canaltech.com.br/games/mercado-de-games-agora-vale-mais-que-industrias-de-musica-e-cinema-juntas-179455/. Acesso em 11/09/2022</figcaption></figure><p>No contexto específico da plataforma Steam, que é uma das principais plataformas de distribuição digital de jogos, a utilidade dos comentários dos usuários se torna ainda mais relevante. Os jogadores dependem desses comentários para obter informações sobre a qualidade, desempenho e experiência geral dos jogos antes de decidirem realizar uma compra.</p><h3>Os comentários e a avaliação de utilidade</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mXSQyRU-6h7_WsuBw-Tqyg.png" /><figcaption>Comentários do jogo Homem Aranha (2022). O usuário pode votar com “sim” ou “não” para a utilidade do comentário. Logo abaixo, é fornecido o número de pessoas que acharam a análise útil. Fonte: <a href="https://steamcommunity.com/app/1817070">https://steamcommunity.com/app/1817070</a></figcaption></figure><p>Na Steam, todo jogo pode ser avaliado e comentado pela comunidade. A foto acima mostra em azul se o autor recomendou ou não aquele jogo aos demais. Os usuários podem avaliar o comentário como útil ou não (em vermelho na imagem) e o número total de votos de utilidade é mostrado abaixo.</p><h3>Por que prever a utilidade de comentários?</h3><p>Vimos que avaliar a utilidade, então, é um processo manual. Isso pode estar sujeito a alguns problemas. Entre eles, destacam-se:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/609/1*pDzih1EitvmGNP3kDR5fEg.png" /><figcaption>Comentário do jogo Homem Aranha(2022) na Steam. Em vermelho, destaque para a quantidade de pessoas que acharam a análise útil, mesmo que ela não tenha fornecido nenhuma informação relevante. Fonte: <a href="https://steamcommunity.com/app/1817070">https://steamcommunity.com/app/1817070</a></figcaption></figure><ul><li><strong>Favorecimento de comentários não-úteis</strong>: Ao depender exclusivamente de avaliações manuais, existe o risco de que comentários que não agregam valor ou são irrelevantes sejam considerados úteis. Isso pode levar a uma percepção distorcida sobre a qualidade do conteúdo.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ykwzCCn7lnmRK0Eikp3Zgw.png" /><figcaption>Aqui vemos um comentário que discorre sobre história, jogabilidade e gráficos (destaque em verde), e tem tudo para ser uma análise útil, mas que não foi avaliada pela comunidade. Fonte: <a href="https://steamcommunity.com/app/1817070">https://steamcommunity.com/app/1817070</a></figcaption></figure><ul><li><strong>Desfavorecimento de comentários úteis</strong>: Da mesma forma, ao avaliar manualmente a utilidade dos comentários, existe a possibilidade de que alguns comentários relevantes e informativos sejam erroneamente considerados como não úteis. Isso pode resultar em perda de insights valiosos fornecidos pelos usuários. Na imagem, um comentário que destaca diversos pontos como “história”, “jogabilidade” e “gráficos” e que aparenta ser muito útil, pode não ser avaliado pela comunidade. O que nos leva a outro ponto:</li><li><strong>Comentários pouco votados ou recentes passam despercebidos</strong>: Com a avaliação manual, há uma tendência de focar mais nos comentários populares ou bem estabelecidos, enquanto os comentários com menos votos ou mais recentes podem ser ignorados. Isso pode limitar a diversidade de opiniões e perspectivas consideradas na avaliação dos comentários.</li></ul><blockquote><strong>Uma forma de contornar isso é prevendo a utilidade dos comentários com<br>ajuda do Processamento de Línguas de Naturais (PLN) !</strong></blockquote><p>Neste artigo, vamos explorar a previsão da utilidade de comentários em Português Brasileiro de jogos no site Steam. O objetivo é utilizar técnicas de Processamento de Linguagem Natural (PLN) e algoritmos de aprendizado de máquina para automatizar a classificação de comentários como úteis ou não-úteis.</p><h3>Trabalhos relacionados</h3><p>Alguns estudos anteriores já abordaram o tema da previsão da utilidade de comentários de jogos. Barbosa et al. (2016) utilizaram redes neurais artificiais para prever a utilidade de comentários em Português Brasileiro na Steam [3]. Baowaly et al. (2019) realizaram um estudo de caso na loja Steam, para prever a utilidade de avaliações de jogos[4].</p><p>Esses estudos serviram como base e inspiração para o nosso trabalho (Jorge e Pardo, 2022) [5], que teve como objetivos:</p><p>● <strong>Criação de um corpus anotado contendo comentários em Português Brasileiro de jogos na Steam.</strong></p><p>● <strong>Automatizar a predição de utilidade de comentários por meio de algoritmos de aprendizado de máquina.</strong></p><p>● <strong>Descobrir quais atributos linguísticos e não-linguísticos contribuem para definir um comentário como útil.</strong></p><p>● <strong>Testar a hipótese e os métodos de Baowaly et al.(2019).</strong></p><h3>Pipeline</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UvG3DqaoIucFmHsbyQMxuA.png" /><figcaption>Pipeline de Processamento de Linguagem Natural. Fonte: Autoria Própria</figcaption></figure><p>O pipeline do trabalho consiste em coletar comentários em jogos da plataforma Steam, realizar o pré-processamento dos dados, engenharia de atributos, vetorização dos comentários, treinamento de um modelo de aprendizado de máquina e avaliação do modelo. Essas etapas permitem a previsão da utilidade dos comentários e a análise dos atributos relevantes para essa previsão. Os detalhes mais específicos sobre cada etapa serão abordados logo após!</p><h3>Método</h3><h4>Conjunto de dados</h4><p>O conjunto encontra-se disponível no github! Fique a vontade para utilizá-lo e replicar os experimentos:</p><blockquote><a href="https://github.com/germanojorge/SteamBR">https://github.com/germanojorge/SteamBR</a></blockquote><p>Para treinar e testar nosso algoritmo, coletamos um conjunto de dados contendo 2.789.893 comentários em Português Brasileiro de jogos na Steam. Utilizamos um web scraper para extrair esses dados do site. O conjunto de dados foi filtrado considerando apenas comentários com três ou mais votos, resultando em um total de 233.824 comentários. Os jogos foram divididos em 10 gêneros para uma melhor análise. O conjunto está disponível no github.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/870/1*Yv5kWpRzhm2LUTvsCalZHw.png" /><figcaption>Gráfico que representa a distribuição de análises dividida por gêneros de jogos. Fonte: Autoria Própria</figcaption></figure><h4>Pré-processamento</h4><p>Antes de iniciar o treinamento do algoritmo, realizamos um pré-processamento nos comentários. Esse processo consistiu em transformar todas as letras em minúsculas, remover caracteres especiais, números e pontuações, realizar tokenização e remover stopwords, como “a”, “o” e “e”.</p><h4>Engenharia de atributos</h4><p>Na etapa de engenharia de atributos, definimos uma série de características para representar os comentários. Essas características foram divididas em três categorias: metadados, atributos semânticos e atributos distribucionais.</p><p>Os metadados incluíam informações como se o autor recomendou o jogo, o número de sentenças, o número de palavras, o tamanho médio das sentenças, o número de exclamações, o número de interrogações e a proporção entre letras maiúsculas e minúsculas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*UDsZXZyj_iHzMi3d" /><figcaption>Tabela dos tipos de atributos extraídos no conjunto de dados. Fonte: Autoria Própria</figcaption></figure><p>Os atributos semânticos foram obtidos por meio da análise de sentimentos utilizando o dicionário LIWC, que contabiliza palavras que revelam determinados sentimentos e opiniões.</p><p>Já os atributos distribucionais foram gerados utilizando a técnica Doc2Vec, que transforma os comentários em vetores para capturar a semântica distribucional.</p><h4>Aprendizado supervisionado</h4><p>Utilizamos algoritmos de aprendizado de máquina para treinar e testar nosso modelo.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BOcPjIItI6258nwPuy-KwA.png" /><figcaption>Exemplo de modelo de aprendizado supervisionado. Os comentários são inseridos com rótulos para ensinar o modelo. Em seguida, é adicionado um comentário não-rotulado para o modelo prever sua utilidade. Fonte: Autoria Própria</figcaption></figure><p>No aprendizado supervisionado, são inseridos comentários já rotulados como úteis e não úteis. Esses dados rotulados são utilizados para treinar o modelo de aprendizado de máquina, permitindo que ele aprenda a distinguir e prever a utilidade dos comentários com base nos padrões identificados nos dados de treinamento para quando inserirmos um comentário não rotulado.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZWhxP2uvlgsChu59i7GSPQ.png" /><figcaption>Figura que representa como os comentários são de fato, inseridos no modelo, com suas embeddings e demais atributos. Fonte: Autoria Própria</figcaption></figure><p>Contudo, para treinar nosso modelo não basta colocar os comentários em sua forma “crua”, precisamos transformá-los em tabelas de instâncias e atributos. No nosso caso, durante a etapa da engenharia de atributos, já tínhamos feitos esse processo e transformado os comentários em vetores, além de extrair atributos como os metadados, e sentimentos, lembra?</p><p>Depois disso, precisamos escolher o algoritmo e dividir esse conjunto em treino e teste.</p><p>O algoritmo escolhido foi o Gradient Boosting Machine, que já havia sido utilizado por Baowaly et al. (2019) com bons resultados. Dividimos nosso conjunto de dados em 80% para treinamento e 20% para teste. Além disso, realizamos um balanceamento de classes utilizando as técnicas de oversampling e undersampling. Foram treinados um classificador e um regressor.</p><p>Um classificador é utilizado para categorizar os comentários como úteis ou não úteis, enquanto um regressor é usado para prever a pontuação de utilidade em uma escala contínua.</p><h3>Resultados</h3><p>Após realizar o treinamento e teste do modelo, obtivemos os seguintes resultados: a média do RMSE (Root Mean Square Error) foi de 0.95 para o regressor e a média do F1-score foi de 90% para o classificador. Esses resultados indicam que nosso modelo tem uma boa capacidade de prever a utilidade dos comentários.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/755/1*R-B_jcgXzGZyb9jVhhbf1A.png" /><figcaption>Resultados do modelo de aprendizado. Destaque para Sousa &amp; Pardo (2023), que apesar de não chegar ao estado da arte como no inglês, obteve bons resultados. Fonte: Autoria Própria</figcaption></figure><p>a medida F1 representa uma métrica de avaliação que combina a precisão e a cobertura de um modelo de classificação. Ela é calculada a partir da média harmônica entre essas duas métricas e fornece uma medida geral do desempenho do modelo em relação à classificação correta das classes positivas e negativas. A precisão mede a proporção de verdadeiros positivos em relação ao total de exemplos classificados como positivos, enquanto a cobertura mede a proporção de verdadeiros positivos em relação ao total de exemplos verdadeiramente positivos. A medida F1 é especialmente útil quando há um desequilíbrio entre as classes de interesse, como no caso da previsão da utilidade dos comentários, em que os comentários úteis podem ser menos frequentes em comparação aos não úteis. Portanto, a medida F1 é uma métrica relevante para avaliar o desempenho do modelo na previsão da utilidade dos comentários em jogos.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/601/1*eg5RL7DQUdUvsdwMQdd85g.png" /><figcaption>Medidas do erro quadrático médio (Root Mean Squared Error), obtidas pelo modelo de aprendizado em cada gênero. Quanto menor, melhor. Os resultados superaram o estado da arte anterior. Fonte: Autoria Própria</figcaption></figure><p>Já a métrica RMSE (Root Mean Squared Error) é uma medida utilizada para avaliar o desempenho de modelos de regressão, como é o caso da previsão da pontuação de utilidade dos comentários. O RMSE mede a diferença média entre os valores previstos pelo modelo e os valores reais, levando em consideração o quadrado dessa diferença para garantir que valores positivos e negativos não se anulem. Em outras palavras, o RMSE representa a raiz quadrada da média dos erros quadrados, fornecendo uma medida de quão distante as previsões do modelo estão dos valores reais. Quanto menor o valor do RMSE, mais precisa é a previsão do modelo em relação à pontuação de utilidade dos comentários.</p><p>Ao analisar a importância dos atributos, verificamos que o número de palavras e a recomendação foram os atributos de maior relevância na previsão da utilidade dos comentários.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*v4lY0bhWgytp04cBB70CGQ.png" /><figcaption>Tabela de importância dos atributos. Do lado esquerdo, diferentes tipos de atributos (metadados, semânticos, distribucionais), e embaixo seu peso relativo. Fonte: Autoria Própria.</figcaption></figure><h3>Conclusão</h3><blockquote>O presente trabalhou resultou em um artigo no BraSNAM — XII Brazilian Workshop on Social Network Analysis and Mining. E pode ser visualizado em: <a href="https://sol.sbc.org.br/index.php/brasnam/article/view/24801/24622"><strong><em>SteamBR: a dataset for game reviews and evaluation of a state-of-the-art method for helpfulness prediction</em></strong></a></blockquote><p>Neste trabalho, exploramos a previsão da utilidade de comentários em Português Brasileiro de jogos na Steam. Utilizando técnicas de PLN e algoritmos de aprendizado de máquina, conseguimos automatizar a classificação de comentários como úteis ou não-úteis.</p><p>Os resultados obtidos demonstram a viabilidade de utilizar essas técnicas para prever a utilidade dos comentários. A maior quantidade de dados utilizada no estudo contribuiu para melhorar a precisão do modelo. Além disso, identificamos que o número de palavras e a recomendação são os atributos mais importantes na previsão da utilidade dos comentários.</p><p>Esperamos que este estudo possa contribuir para uma melhor compreensão dos comentários em Português Brasileiro de jogos na Steam e auxiliar jogadores e desenvolvedores na tomada de decisões informadas.</p><h3>Referências</h3><p>[1] Decisão de compra é cada vez mais baseada em comentários na web. Disponível em: <a href="https://www.mundodomarketing.com.br/reportagens/comportamento-do-consumidor/25126/decisao-de-compra-e-cada-vez-mais-baseada-em-comentarios-na-web.html">https://www.mundodomarketing.com.br/reportagens/comportamento-do-consumidor/25126/decisao-de-compra-e-cada-vez-mais-baseada-em-comentarios-na-web.html</a></p><p>[2] Mercado de games agora vale mais que indústrias de música e cinema juntas. Disponível em: <a href="https://canaltech.com.br/games/mercado-de-games-agora-vale-mais-que-industrias-de-musica-e-cinema-juntas-179455/">https://canaltech.com.br/games/mercado-de-games-agora-vale-mais-que-industrias-de-musica-e-cinema-juntas-179455/</a></p><p>[3] Baowaly, M. K., Tu, Y. P., &amp; Chen, K. T. (2019).<strong> Predicting the helpfulness of game reviews: A case study on the Steam store</strong>. <em>Journal of Intelligent &amp; Fuzzy Systems</em>, <em>36</em>(5), 4731–4742.</p><p>[4] Barbosa, J. L., Moura, R. S., &amp; Santos, R. L. D. S. (2016, November). <strong>Predicting Portuguese steam review helpfulness using artificial neural networks</strong>. In <em>Proceedings of the 22nd Brazilian Symposium on Multimedia and the Web</em> (pp. 287–293).</p><p>[5] JORGE, Germano Antonio Zani. <strong>Prevendo a utilidade de comentários em portugês brasileiro de jogos no site Steam</strong>. 2022. Trabalho de Conclusão de Curso (MBA) — Instituto de Ciências Matemáticas e de Computação, Universidade de São Paulo, São Carlos, 2022. Disponível em: <a href="https://repositorio.usp.br/directbitstream/ac40baae-6351-49d9-8bdf-edfdb04c01c2/Germano%20Ant%C3%B4nio%20Zani%20Jorge_TCC_MBA_GERMANO_JORGE_COMPLETO_VERSAOFINAL_173931.pdf.">https://repositorio.usp.br/directbitstream/ac40baae-6351-49d9-8bdf-edfdb04c01c2/Germano%20Ant%C3%B4nio%20Zani%20Jorge_TCC_MBA_GERMANO_JORGE_COMPLETO_VERSAOFINAL_173931.pdf.</a> Acesso em: 12 jun. 2023.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=fe457ed31f68" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sidi-nlp/prevendo-a-utilidade-de-coment%C3%A1rios-em-portugu%C3%AAs-brasileiro-de-jogos-na-steam-fe457ed31f68">Prevendo a utilidade de comentários em Português Brasileiro de jogos na Steam</a> was originally published in <a href="https://medium.com/sidi-nlp">SiDi NLP</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Compressão de modelo: Quantização]]></title>
            <link>https://medium.com/sidi-nlp/o-que-%C3%A9-quantiza%C3%A7%C3%A3o-em-machine-learning-5fd12a72a22e?source=rss----a7bfc1260449---4</link>
            <guid isPermaLink="false">https://medium.com/p/5fd12a72a22e</guid>
            <category><![CDATA[tflite]]></category>
            <category><![CDATA[model-quantization]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[nlp]]></category>
            <category><![CDATA[machine-learning]]></category>
            <dc:creator><![CDATA[Mateus Zorzi]]></dc:creator>
            <pubDate>Thu, 06 Jul 2023 12:42:05 GMT</pubDate>
            <atom:updated>2024-10-02T14:00:18.680Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*z2-9-tBcs_ANG3Pe" /></figure><p>Os modelos de Deep Learning mais populares atualmente são conhecidos pela sua capacidade de realizar tarefas de alta complexidade e robustez. Entretanto por possuírem uma arquitetura composta de muitos pesos e neurônios, requerem uma quantidade considerável de recursos computacionais.</p><p>Utilizando a área de Processamento de Linguagem Natural (PLN) como exemplo, três dos modelos mais famosos e utilizados atualmente são BERT, T5 e GPT-3. Tais modelos são disponibilizados como modelos pré-treinados e podem ser ajustados para uma tarefa específica. Por serem considerados LLMs (ou Large Language Models), possuem uma arquitetura composta de milhões (ou bilhões) de parâmetros, como pode ser visto na tabela abaixo:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/381/1*xjRDBjrahcR_COuprLNcVw.png" /><figcaption>Número de parâmetros por modelo.</figcaption></figure><p>Uma das aplicações onde esses modelos podem ser utilizados é a tarefa de Análise de Sentimentos. A partir de um LLM pré-treinado, podemos realizar o processo de fine-tuning e obter um modelo capaz de classificar textos em um aplicativo móvel, por exemplo.</p><p>Mas quando a intenção é utilizar um LLM no contexto de uma aplicação móvel, podemos abordar o problema de duas formas: (i) mantendo uma conexão com um modelo disponibilizado na nuvem ou (ii) embarcando o modelo no próprio dispositivo. Esta última é um desafio a parte, dada as limitações de recurso e processamento que um dispositivo móvel oferece.</p><p>Seria inviável adicionar esse modelo com todos esses parâmetros, tamanho e custo computacional no aplicativo, pois um celular não possui os mesmos recursos computacionais que o ambiente onde o modelo foi treinado. Além disso, impactaria diretamente na latência, desempenho, consumo de memória, entre outros fatores do dispositivo.</p><p>Nesse sentido, técnicas de otimização são empregadas para reduzir a demanda de recursos computacionais sem prejudicar o desempenho do modelo ou a experiência do usuário. Neste artigo, falaremos sobre a Quantização,<strong> </strong>que reduz a complexidade dos pesos e vieses utilizados pelo modelo. Por exemplo, uma rede neural onde seus pesos e vieses comumente são utilizados em ponto de precisão, os mesmos serão convertidos para um tipo de dado de complexidade menor como o inteiro. No exemplo abaixo, pode-se observar um número em ponto flutuante de 32 bits, convertido para o número inteiro mais próximo de 8 bits, seguindo a ideia da <strong>quantização inteira pós treinamento </strong>que será melhor detalhada a frente.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/511/1*AhPTmq1hVNF8ObKtQBDJUA.png" /><figcaption>Exemplo de Quantização de float32 para int32. (Fonte: <a href="https://www.qualcomm.com/news/onq/2019/03/heres-why-quantization-matters-ai">https://www.qualcomm.com/news/onq/2019/03/heres-why-quantization-matters-ai</a>)</figcaption></figure><h3>TensorFlow Lite</h3><p>Apenas lendo o conceito de quantização, pode-se imaginar que é uma transformação simples, mas devido a quantidade de parâmetros e pesos que esses modelos possuem, essa “simples” conversão resulta em uma alteração significante na arquitetura do modelo.</p><p>Uma das ferramentas disponíveis para quantização de modelos disponibilizadas é o <strong>TensorFlow Lite</strong>, disponível com mais informações nesse <a href="https://www.tensorflow.org/lite?hl=pt-br">link</a>. Alguns dos principais ganhos da quantização, especificamente utilizando TensorFlow Lite, são:</p><ol><li><strong>Menor latência</strong>: não há necessadade de conexão a um servidor;</li><li><strong>Privacidade</strong>: nenhum dado do usuário sai do dispositivo;</li><li><strong>Conectividade</strong>: não existe a necessidade de conexão a internet;</li><li><strong>Tamanho reduzido</strong>: o modelo pode reduzir seu tamanho em até 75%;</li><li><strong>Consumo de energia</strong>: diminuindo a complexidade também diminui o consumo de energia do aparelho;</li><li><strong>Compatibilidade</strong>: é compatível com diferentes sistemas e dispositivos como Android, iOS e microcontroladores, além de possuir compatibilidade com diversas linguagens de programação, como: Java, C++ e Python.</li></ol><p>O TensorFlow Lite possibilita a utilização de alguns tipos de quantização que serão detalhados a seguir, e dividem-se em dois principais tipos: quantização pós-treinamento e quantização “durante o treinamento” (aware training). Em resumo, se diferenciam porque a quantização pós-treinamento, como o próprio nome diz, é realizada após o treinamento do modelo e isso torna o processo mais simples. Já o método “aware training” é mais complexo e acontece no momento de inferência do modelo. Mas, em alguns casos, pode oferecer menor perda de acurácia do modelo em relação ao método pós-treinamento.</p><p>Neste artigo, abordaremos apenas o tipo quantização pós-treinamento, por ser a mais recomendada ao iniciar a utilização do TensorFlow Lite e também apresentar ganhos consistentes e desempenho similar ao método “aware training”.</p><h4>Quantização pós-treinamento float16</h4><p>Essa quantização é a mais simples, como mencionado anteriormente, os modelos neurais costumam trabalhar com dados em <em>float32</em>, nesse método esses pesos e vieses serão convertidos para <em>float16</em>. Como é de se esperar, o modelo terá uma redução de cerca de 50% do seu tamanho e a perda de precisão será praticamente nula.</p><p>Um ponto negativo dessa abordagem é que como a conversão dos dados é mínima, passando de <em>float32 </em>para <em>float16</em>, a latência e uso de memória do modelo não será tão otimizada quanto em outros métodos.</p><p>Os códigos para realizar a conversão dos modelos são muito simples. Nesse caso, é necessário apenas carregar o modelo original e depois especificar que a conversão será feita para <em>float16</em>.</p><pre>import tensorflow as tf<br><br>#carrega o modelo original<br>converter = tf.lite.TFLiteConverter.from_saved_model(modelo_salvo)<br>converter.optimizations = [tf.lite.Optimize.DEFAULT]<br><br>#especifica para qual tipo será realizada a conversão (float16)<br>converter.target_spec.supported_types = [tf.float16]<br><br>#realiza a conversão<br>tflite_model = converter.convert()</pre><h4>Quantização de faixa dinâmica pós-treinamento</h4><p>Este é um dos métodos mais indicados a serem utilizados, seus ganhos são muito significativos e a perda de acurácia é mínima. Nesta abordagem os dados são convertidos de <em>float32 </em>para <em>int8,</em> permitindo uma redução do tamanho do modelo em cerca de 75%. Enquanto os pesos e vieses são convertidos para <em>int8</em> as saídas de ativação do modelo permanecem como ponto flutuante.</p><p>Esta é a conversão default do TFLite, por conta disso, não é necessário especificar o tipo que será realizada a conversão (<em>int8</em>) como no exemplo anterior.</p><pre>import tensorflow as tf<br><br>converter = tf.lite.TFLiteConverter.from_saved_model(modelo_salvo)<br><br>converter.optimizations = [tf.lite.Optimize.DEFAULT]<br><br>tflite_model = converter.convert()</pre><h4>Quantização inteira pós-treinamento</h4><p>A quantização inteira é como uma extensão da quantização de faixa dinâmica, ela segue os mesmos princípios, mas além de converter os pesos e vieses do modelo para <em>int8</em> as saídas de ativação do modelo também são convertidas, permitindo um tempo de inferência e latência ainda menores, sendo ideal para dispositivos de baixo poder computacional.</p><p>Este método possui uma diferença para os demais, para realizar a conversão completa de todos os dados de ponto flutuante do modelo é necessário utilizar uma amostragem dos dados de treinamento que irão auxiliar nessa conversão sem uma grande perca de acurácia. Normalmente, é uma pequena amostragem dos dados, como algumas centenas de dados escolhidos de forma randômica dos dados de treinamento ou validação.</p><pre>import tensorflow as tf<br><br><br>converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)<br>converter.optimizations = [tf.lite.Optimize.DEFAULT]<br><br>#indica uma amostra do dataset que será utilizada na conversão<br>converter.representative_dataset = representative_dataset<br><br>#caso algo não possa ser convertido para int será indicado um erro<br>converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]<br><br>#indica que as entradas e saídas do modelo serão convertida para int8<br>converter.inference_input_type = tf.int8<br>converter.inference_output_type = tf.int8<br><br>tflite_model = converter.convert()</pre><h4>Salvando o modelo</h4><p>Após realizar a conversão do modelo utilizando algum dos exemplos acima, podemos salvá-lo em seu novo formato tflite.</p><pre>#indique o caminho onde deseja salvar o modelo .tflite<br>tflite_model_file = tflite_models_dir/&quot;model_tflite.tflite&quot;<br><br>#salva o modelo tflite_model gerado anteriormente no caminho acima<br>tflite_model_quant_file.write_bytes(tflite_model)</pre><p>Após executar o código acima, o modelo estará convertido, salvo e pronto para ser utilizado em dispositivos como um modelo embarcado!</p><p>Neste artigo, abordamos a técnica de Quantização e sua utilidade em aplicações mobile e IoT, mostrando as possíveis quantizações utilizando a biblioteca TensorFlow Lit. No próximo artigo, vamos falar sobre uma outra técnica de compressão de modelos chamada “weight pruning” (ou poda de pesos) que funciona de forma diferente da quantização mas também apresenta resultados interessantes.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5fd12a72a22e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sidi-nlp/o-que-%C3%A9-quantiza%C3%A7%C3%A3o-em-machine-learning-5fd12a72a22e">Compressão de modelo: Quantização</a> was originally published in <a href="https://medium.com/sidi-nlp">SiDi NLP</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Transfer Learning: retrospectiva, abordagens e aplicações em NLP]]></title>
            <link>https://medium.com/sidi-nlp/transfer-learning-retrospectiva-abordagens-e-aplica%C3%A7%C3%B5es-em-nlp-9f629e89dae0?source=rss----a7bfc1260449---4</link>
            <guid isPermaLink="false">https://medium.com/p/9f629e89dae0</guid>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[transfer-learning]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[nlp]]></category>
            <dc:creator><![CDATA[Thomas Roquetti]]></dc:creator>
            <pubDate>Tue, 25 Apr 2023 12:01:33 GMT</pubDate>
            <atom:updated>2023-04-25T12:01:32.898Z</atom:updated>
            <content:encoded><![CDATA[<h4>O que é, onde achar e o básico que você precisa saber sobre Transfer Learning em NLP</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Xb7QhWWdulfmVwwiVlA7Lg.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@santesson89?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Andrea De Santis</a> on <a href="https://unsplash.com/photos/zwd435-ewb4?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>Se você já ouviu ou estudou sobre modelos pré treinados, já teve contato com Transfer Learning (TL).</p><p>Hoje, TL é uma parte fundamental de modelos de linguagem como <strong>Embeddings from Language Models (ELMo)</strong>, <strong>Bidirectional Encoder representations from Transformers (BERT)</strong> e <strong>Text-to-Text Transfer Transformer (T5) </strong>— Os quais podem ser usados para qualquer tarefa decorrente de Processamento de Linguagem Natural (NLP).</p><p>Neste artigo, iremos entender o que é Transfer Learning, ver quais áreas existem para NLP e visitar rapidamente cada uma delas. O objetivo é introduzir os campos que o Transfer Learning aborda dentro de NLP e informar o leitor sobre a existência desses campos.</p><h3>O que é Transfer Learning?</h3><p>Transfer Learning é um método de machine learning onde um modelo desenvolvido para uma tarefa específica é reutilizado como ponto de início para a geração de um novo modelo em outra tarefa.</p><blockquote>Transfer learning and domain adaptation refer to the situation where what has been learned in one setting … is exploited to improve generalization in another setting — Page 526, <a href="http://amzn.to/2fwdoKR">Deep Learning</a>, 2016</blockquote><p>É uma abordagem comum em Deep Learning, embora não exclusiva, e muito utilizada em tarefas de NLP já que desenvolver do zero grandes redes neurais têm um grande custo computacional e de tempo. Além do que, comparado com modelos treinados do zero, modelos pré treinados têm mostrado resultados muito melhores em diversas tarefas de NLP.</p><blockquote>Transfer learning is the improvement of learning in a new task through the transfer of knowledge from a related task that has already been learned.</blockquote><blockquote>— Chapter 11: Transfer Learning, <a href="http://amzn.to/2fgeVro">Handbook of Research on Machine Learning Applications</a>, 2009</blockquote><p>NLP é uma poderosa ferramenta, mas não é nada incomum na hora de criar um novo modelo, esbarrar em problemas de falta de dados ou se deparar com um modelo que não generaliza bem o suficiente. Nesse sentido, Transfer Learning nos permite resolver esses problemas.</p><h3>Por que é útil e como se compara ao método tradicional?</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vYAFfv5RTh-XUcTeQEw0Hg.jpeg" /><figcaption>Fig: 1.1 Aprendizado supervisionado tradicional</figcaption></figure><p>Suponha que estamos fazendo um modelo para a tarefa de<strong> análise de sentimentos</strong> em um domínio de “avaliações de filmes”. Temos dados suficientes para a tarefa e treinamos um modelo que obtém ótimos resultados. Se aplicarmos esse modelo em outro conjunto de dados do mesmo domínio, esperamos ótimos resultados também.</p><p>Agora, se quisermos usar esse modelo de análise de sentimento para aplicar em um outro domínio, no domínio de “avaliações de produtos cosméticos”, é bem provável que o modelo já não tenha um desempenho tão bom quanto antes.</p><p>Se usarmos o paradigma tradicional apresentado na figura 1.1, vamos precisar coletar um córpus anotado e treinar um novo modelo.</p><p>Mas e se não tivermos córpus suficiente nesse novo domínio e não pudermos fazer um? E se quisermos adicionar uma outra classe no modelo , como o caso de neutros? E se não temos recursos computacionais suficientes ou tempo suficiente pra treinar um novo modelo?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*9sE2DFGvgMc3MHytdN_EDg.gif" /></figure><p><strong>Transfer Learning</strong> nos permite lidar com esses cenários trazendo o conhecimento que adquirimos no domínio/tarefa anterior para aplicarmos em uma nova.</p><p>Vamos dar uma definição formal para TL. Dado um domínio fonte <strong>Df,</strong> uma tarefa correspondente <strong>Tf</strong>, um domínio alvo <strong>Da </strong>e uma tarefa alvo <strong>Ta</strong>, o objetivo da transferência de aprendizado é nos possibilitar aprender a distribuição da probabilidade condicional do alvo <strong>P(Ya|Xa)</strong> em <strong>Da</strong>, com a informação adquirida em <strong>Df </strong>e onde <strong>Df≠Da</strong> ou <strong>Tf≠Ta</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_LN-rSXj_uW84bJD5tO0dA.jpeg" /><figcaption>Fig:1.2 Transferência de aprendizado</figcaption></figure><h3>Áreas de Transfer Learning em NLP</h3><p>Iremos explorar agora as diferentes áreas de TL para NLP propostas por <a href="https://www.ruder.io/thesis/">Sebastian Rude (2019)</a> que foram adaptadas da taxonomia geral de TL por <a href="http://www.cs.ust.hk/~qyang/Docs/2009/tkde_transfer_learning.pdf?ref=ruder.io">Pan e Yang (2010)</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*45zKlefHus68k6ORP3WgIw.png" /><figcaption>Fig: 1.3 Diferentes abordagens de aprendizado por transferência <a href="https://ruder.io/thesis/"><em>https://ruder.io/thesis</em></a></figcaption></figure><p>Como visto na imagem acima, temos quatro áreas de TL separados em dois grupos, <em>Inductive </em>e <em>Transductive TL.</em></p><h3>Inductive TL vs Transductive TL</h3><blockquote>In the inductive transfer learning setting, the target task is different from the source task, no matter when the source and target domains are the same or not — page 3, <a href="http://www.cs.ust.hk/~qyang/Docs/2009/tkde_transfer_learning.pdf?ref=ruder.io">Pan e Yang (2010)</a></blockquote><p>No caso de <em>inductive transfer learning</em>, o objetivo é aprender uma tarefa nova, não importando se os domínios são os mesmos ou não. Os dados do domínio alvo <strong>Da </strong>precisam estar rotulados para induzir o modelo preditivo a funcionar no novo domínio.</p><p>Aqui vai a definição formal do <em>inductive. </em>Dado um domínio fonte <strong>Df </strong>e uma tarefa fonte <strong>Tf</strong><em>, um </em><strong>Da </strong>e uma tarefa alvo <strong>Ta</strong>, o <em>inductive TL</em> tem como objetivo melhorar o aprendizado da função preditora alvo <strong><em>Ff(.) </em></strong>em <strong>Da </strong>usando o conhecimento adquirido em <strong>Df</strong> e <strong>Tf</strong>, onde <strong>Tf≠Ta.</strong></p><blockquote>In the transductive transfer learning setting, the source and target tasks are the same, while the source and target domains are different — page 4, <a href="http://www.cs.ust.hk/~qyang/Docs/2009/tkde_transfer_learning.pdf?ref=ruder.io">Pan e Yang (2010)</a></blockquote><p>Já no <em>transductive transfer learning</em> queremos aprender domínios novos para a mesma tarefa. Uma característica importante é que não temos dados rotulados no <strong>Da</strong>, enquanto muitos dados do domínio fonte <strong>Df</strong> estão anotados.</p><p>Em outras palavras, dado um domínio fonte <strong>Df </strong>e uma tarefa de aprendizado correspondente <strong>Tf</strong>, um domínio alvo <strong>Da </strong>e uma tarefa <strong>Ta</strong>, o <em>transductive TL </em>tem como objetivo melhorar o aprendizado da função preditora <strong><em>Ff(.)</em></strong> em <strong>Da </strong>usando o conhecimento adquirido em <strong>Df </strong>e <strong>Tf</strong>, onde <strong>Df≠Da </strong>e <strong>Ta = Tf</strong>. Além disso, no momento do treinamento, pelo menos parte dos dados <strong>Da</strong> não podem estar rotulados.</p><p>Agora que demos uma passada rápida na definição dessas duas categorias, vamos abordar alguns dos tipos e suas aplicações em NLP.</p><p>E é claro: se quiser saber mais profundamente sobre as categorias <strong>Transductive </strong>e <strong>Inductive</strong> leia os trabalhos de <a href="https://www.ruder.io/thesis/">Sebastian Rude (2019)</a> e <a href="http://www.cs.ust.hk/~qyang/Docs/2009/tkde_transfer_learning.pdf?ref=ruder.io">Pan e Yang (2010)</a></p><h3><strong><em>Domain Adaptation</em></strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1006/1*dTrYDg8TJdxoZhT0khdT3w.jpeg" /><figcaption>Fig:1.4 exemplo de Domain Adaptation</figcaption></figure><p>Vamos então começar com o <em>Domain Adaptation. </em>Como o nome diz, o nosso objetivo é adaptar um modelo feito para uma tarefa específica treinado em um domínio <strong>Df</strong>, que agora queremos adaptar o conhecimento que temos para um novo domínio <strong>Da</strong>. Lembrando que a tarefa permanece a mesma por se tratar de <em>transductive learning.</em></p><p>Normalmente, os estudos de como adaptar um domínio são feitos com um único domínio fonte, mas há também estudos lidando com vários domínios fontes.</p><p>Os métodos e abordagens para adaptar o modelo a um domínio, a partir de um único domínio fonte podem ser divididos em:<br>- Abordagens de representação;<br>- Ponderação e seleção de dados;<br>- Abordagens de auto-rotulação.</p><p>Porém, vou limitar este artigo a apenas nomear a existência dessas divisões. É uma tarefa muito difícil explicar essas abordagens em poucas linhas, por isso incentivo mais uma vez: se quiser ver a fundo os métodos, onde já foram aplicados e como são aplicados, sugiro que visite o trabalho de <a href="https://www.ruder.io/thesis/">Sebastian Rude (2019)</a>.</p><p>No trabalho de Sebastian Rude, além dos três métodos acima, você pode encontrar também trabalhos sobre adaptação de domínio de múltiplos domínios fonte.</p><h3>Cross-Lingual Transfer Learning</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*jYV2W681XWJDtufk" /><figcaption>Photo by <a href="https://unsplash.com/@brett_jordan?utm_source=medium&amp;utm_medium=referral">Brett Jordan</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>No <em>Cross-lingual Transfer Learning, </em>o objetivo é usar modelos e recursos em uma língua e transferí-los para outra lingua, mantendo a mesma tarefa.</p><p>Por exemplo: nos modelos <em>zero-shot cross-lingual document classification</em>, <em>zero-shot </em>aqui se<em> </em>refere a <em>zero-shot learning</em> — um paradigma onde o modelo aprende a reconhecer classes às quais não tinha sido apresentado antes e <em>document classification </em>é a tarefa de classificar um documento de acordo com certas classes, essas classes podendo ser, por exemplo, o tipo de texto. Nesta tarefa, o objetivo é treinar um modelo em uma língua e usá-lo para classificar o documento escrito em outra língua.</p><p>As técnicas de C<em>ross-Lingual Transfer Learning</em> são muito relevantes em cenários que exploram idiomas com poucos recursos/dados para serem trabalhados, agora, podem trazer conhecimento transferido de outras línguas que já tem bastante recursos, como o inglês.</p><h3>Multi-Task Learning</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/360/1*zpxE5Jr0MBk5eZ3-Qf4OlQ.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@mindspacestudio?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Mindspace Studio</a> on <a href="https://unsplash.com/photos/iF8GB3WCEls?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>Em aprendizado de máquina, se gerarmos um modelo para uma tarefa alvo, vamos dizer análise de sentimento, fazemos esse modelo apenas para essa tarefa. Mas será se não é possível que, ao gerar um modelo que performe múltiplas tarefas, possam surgir informações que nos ajudem a generalizar melhor a nosssa tarefa de análise de sentimento, fazendo com que obtenhamos resultados melhores?</p><p>Essa abordagem é chamada de <em>Multi-Task Learning</em> (MTL)</p><blockquote>Multitask Learning is an inductive transfer method that improves generalization by learning extra tasks in parallel with the main task while using a shared representation; what is learned for the extra tasks can help the main task be learned better. — page 172, <a href="http://reports-archive.adm.cs.cmu.edu/anon/1997/CMU-CS-97-203.pdf">Multitask Learning</a>, 1997</blockquote><p>O interessante de MTL vem de usar os mesmos paramêtros para tarefas diferentes, o que nos dá duas principais formas de fazer isso.</p><p><strong>Hard parameter sharing:<br></strong>Esse é o método mais comum usado em MTL. Nesse método, as <em>hidden layers</em> são compartilhadas entre todas as tarefas enquanto as <em>layers </em>específicas para a tarefa são separadas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/871/1*pxkOUDRaZIClJ4Psa7NNLQ.jpeg" /><figcaption>Fig:1.6 Hard parameter sharing</figcaption></figure><p><strong>Soft parameter sharing:<br></strong>Nessa abordagem, cada tarefa tem seu próprio modelo e paramêtros. A distância entre os paramêtros é então regularizada para encorajá-los a serem similares.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-0_DWvvAI-bMjux_DOkpQQ.jpeg" /><figcaption>Fig:1.7 Soft parameter sharing</figcaption></figure><p>O MTL não serve apenas para melhorar a performance de uma tarefa específica em base de várias tarefas auxiliares. Na verdade, ela funciona bem também quando o objetivo é realizar várias tarefas em paralelo.</p><p>Mas, no cenário de ter uma tarefa alvo com o objetivo de aumentar o seu desempenho, vale ressaltar que existem fatores para escolher tarefas auxiliares, sendo um deles o quão relacionadas elas são, como por exemplo: saber se a tarefa principal e a tarefa secundária compartilham as mesmas features (informação de baixo nível) para fazer predições.</p><h3>Sequential Transfer Learning</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*oIc5tJe_Jfl47Hzy" /><figcaption>Photo by <a href="https://unsplash.com/@ekrull?utm_source=medium&amp;utm_medium=referral">Eric Krull</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Agora chegamos no famigerado <em>Sequential Transfer Learning</em> (STL), essa área envolve transferir conhecimento com uma sequência de passos, onde a tarefa alvo e a fonte não necessariamente são similares.</p><p>Diferente do MTL onde as tarefas são treinadas juntas, o STL consiste em dois estágios. Na primeira fase (pré treinamento), o modelo é treinado nos dados fontes, e na segunda fase (adaptação) o modelo é treinado na tarefa alvo.</p><p>O STL é um tema muito interessante, e é nele que iremos focar na segunda parte desta série. Assim, teremos a oportunidade de um mergulho num tópico que se encontra em alta e é infinitamente interessante.</p><p>Não deixe de acompanhar!</p><h3>Agradecimentos</h3><p><a href="https://medium.com/u/7006e939c777">Francisca Ysabelle Manríquez</a> pela revisão do texto</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9f629e89dae0" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sidi-nlp/transfer-learning-retrospectiva-abordagens-e-aplica%C3%A7%C3%B5es-em-nlp-9f629e89dae0">Transfer Learning: retrospectiva, abordagens e aplicações em NLP</a> was originally published in <a href="https://medium.com/sidi-nlp">SiDi NLP</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introdução à Análise de Sentimentos (parte 1)]]></title>
            <link>https://medium.com/sidi-nlp/introdu%C3%A7%C3%A3o-%C3%A0-an%C3%A1lise-de-sentimentos-parte-1-2ba5ec942c3?source=rss----a7bfc1260449---4</link>
            <guid isPermaLink="false">https://medium.com/p/2ba5ec942c3</guid>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[análise-de-sentimentos]]></category>
            <category><![CDATA[sentiment-analysis]]></category>
            <dc:creator><![CDATA[Rodrigo José Vasconcelos Borba]]></dc:creator>
            <pubDate>Wed, 29 Mar 2023 17:33:55 GMT</pubDate>
            <atom:updated>2023-03-29T17:33:55.638Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oqfRuIleu4CfJ2cEDzHNYg.jpeg" /></figure><p>Análise de sentimentos (AS) é uma subárea do Processamento de Linguagem Natural (PLN) que, através de uma mineração contextual de dados, extrai informações subjetivas com a finalidade de entender os sentimentos, atitudes, emoções, avaliações e opiniões de pessoas a respeito de marcas, empresas, produtos, serviços, indivíduos, eventos, acontecimentos, entre outros.</p><p>Dentro da área de PLN, a AS carrega diversos desafios linguísticos, geralmente concentrados nos níveis da semântica acerca daquilo que está sendo analisado. Com a finalidade de se extrair um significado, a análise deve levar em consideração diversas possíveis estruturas de frases. As pessoas, quando se comunicam entre si, possuem muitas liberdades linguísticas, como as gírias, frases mais curtas e objetivas, palavras ou expressões que podem causar ambiguidade e ampliar a interpretação do que de fato aquilo significa.</p><p>A comunicação vai muito além de palavras e seus significados explícitos. Entre pessoas é muito complexa e repleta de nuances: uma sentença pode expressar diversos sentimentos em uma pessoa dependendo do contexto e da forma como foi escrita, demonstrando raiva, curiosidade, alegria, entusiasmo, frustração, tristeza e entre outros sentimentos que deverão ser compreendidos pela máquina.</p><h4><strong>Aprofundando na análise e entendendo os desafios</strong></h4><p>Podemos citar alguns níveis de “estudo” da língua como: Fonética e Fonologia, Sintaxe, Morfologia, Semântica, Discurso, etc. Como comentado anteriormente, as tarefas da Análise de Sentimentos estão concentradas no nível da <strong>semântica</strong>, onde a principal função é a extração ou conhecimento de um significado, e a semântica pode ser dividida em duas categorias: <strong>lexical </strong>e <strong>composicional</strong>.</p><p>A semântica <strong>lexical </strong>é a responsável por dar o significado de uma palavra naquele contexto em específico. Ou seja, se fizéssemos uma tarefa de classificação de polaridade para a frase “Aquele jogador é ok.”, iriamos classificá-la como positiva, pois o estrangeirismo “ok” qualifica “aquele jogador” positivamente.</p><p>Já quando estamos falando da procura da análise da ocorrência de composições lexicais, nos referimos a semântica <strong>composicional</strong>. Por exemplo, na sentença “O jogo foi fora de série.”, “fora”, é uma palavra que geralmente é, semanticamente falando, utilizada para representar algo negativo. “Série”, nessa frase, é absolutamente neutro. Porém, a expressão “fora de série”, se fossemos fazer outra tarefa de classificação de polaridade, indica admiração, algo que realmente foi melhor do que esperavam e, portanto, classificaríamos a sentença como positiva.</p><h4><strong>Aplicações com Análise de Sentimentos</strong></h4><p>Existem diversas<strong> </strong>aplicações práticas para a AS. Imagine possuir uma empresa e desenvolver uma solução que pode analisar o mercado e a competitividade dos produtos similares que outras empresas estão produzindo, ou também entender e identificar os pontos positivos e negativos do seu produto através dos comentários de seus consumidores que são feitos online, ou até mesmo trabalhar em um fator voltado para a política para analisar o sentimento das pessoas acerca daquilo que está sendo feito ou até mesmo entender as dores das pessoas e as reais necessidades sociais e a partir disso tomar decisões mais satisfatórias e assertivas no âmbito político de sua cidade.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/863/1*Nymaco0lmM2WGI9pJ-c97Q.png" /></figure><p>O “objetivo” da Análise de Sentimentos é extrair o significado daquilo que a pessoa quis dizer, a associação das palavras, frases e textos e a relação disso com o significante. A compreensão e o estudo acerca dos desafios do PLN são herdados para a AS, principalmente os desafios de sintaxe, semântica e a classificação de polaridade.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/563/1*6jT2xt6lXXVCIgqrA6YQ5A.png" /><figcaption><a href="https://www.sentisum.com/customer-sentiment-analysis">https://www.sentisum.com/customer-sentiment-analysis</a></figcaption></figure><h4><strong>Desafios da Análise de Sentimentos</strong></h4><p>Depois de citar o objetivo da AS e os desafios da análise semântica, é importante observar que existem alguns “obstáculos” para que esse objetivo seja alcançado. Alguns deles serão listados abaixo:</p><p>1. Sentimentos e opiniões são subjetivos;</p><p>2. Dependendo do contexto, as palavras podem ter o sentido contrário;</p><p>3. Existe uma enorme quantidade de fontes e formatos para obtenção dos dados;</p><p>4. Grande quantidade de linguagem informal;</p><p>5. As palavras podem conter duplo sentido.</p><p>Outro conceito importante é a definição do nível de granularidade da tarefa proposta. Essa definição pode ser dividida em três níveis para a análise de sentimentos: nível de <strong>documento</strong>, nível de <strong>sentença </strong>e nível de <strong>entidade</strong>.</p><p>Quando falamos de nível de documento, estamos nos referindo à análise completa de um texto. Dentro desse nível, a complexidade é de determinar a polaridade total que aquele documento representa. Como existem várias frases dentro de um texto com polaridades diferentes, dizer se ele é positivo, negativo ou neutro em sua totalidade acaba sendo um desafio a mais.</p><blockquote>“A minha empresa tem um bom ambiente para se trabalhar, mas o salário é muito ruim.”</blockquote><p>No exemplo acima, foi-se extraída uma frase de um texto, onde é possível notar que, apenas nela, foram identificadas polaridades diferentes: “<strong>bom</strong>”, sendo algo positivo e “<strong>ruim</strong>”, negativo. Isso corrobora o grande desafio em determinar a polaridade total do texto.</p><p>O <strong>nível de sentença</strong>, como o nome sugere, é a análise da extração da polaridade de apenas uma sentença. Ela pode ser considerada como uma etapa intermediária para a análise de nível de documento, uma vez que a composição de todas as sentenças pode indicar aquilo que o texto quer dizer e qual é a polaridade geral dele.</p><p>O <strong>nível de entidade</strong> (ou aspecto) é aquele em que se busca reconhecer quais são os atributos da entidade principal de determinada opinião. Esse nível é geralmente usado em tarefas de sumarização de opiniões.</p><p><strong>Classificação de Polaridade</strong></p><p>Agora, trataremos mais especificamente de um problema de polaridade, que envolve entender as opiniões de usuários e classificá-las em um conjunto de classes. Este problema é amplamente estudado e compreendido, pois se trata de algo muito comum no nosso dia a dia. Em diversos lugares, podemos observar um uso muito claro dessa classificação, como: reviews de filmes, livros, aplicativos e produtos nos mais diversos marketplaces.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1002/1*F0-OcvoPp9DkGJyCACipQQ.png" /></figure><p>Uma das divisões que podemos observar é a divisão de três classes: <strong>positivo</strong>, <strong>neutro </strong>e <strong>negativo</strong>. Essas divisões são um grande desafio na análise de sentimentos: quanto maior o número de classes, mais complexos se tornam os métodos de classificação, mesmo para nós seres humanos; pois isso faz com que o custo da anotação de corpora de sentimentos aumente também. As divisões podem chegar a quatro ou até cinco classes.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/546/1*MWA3LGCGlzWjDFMpbMJM6Q.png" /></figure><p>A imagem anterior exemplifica muito bem a complexidade e os desafios da análise de sentimentos e como são classificadas as polaridades dentro das frases. De um lado, temos <em>“A pizza é muito boa” —</em> o que traz um sentimento positivo em relação à pizza. E do outro lado, <em>“mas a entrega demorou muito” </em>carrega um sentimento negativo em relação ao serviço.</p><p>Nesse caso, não conseguimos apenas pela frase saber se, no geral, essa é uma opinião positiva ou negativa. Ela tem seus pontos positivos e também negativos. Mas, como notamos, é possível classificar a polaridade das frases de acordo com as palavras, sentimentos e emoções que elas expressam.</p><p>Para concluir, a Análise de Sentimentos, que é uma subárea do Processamento de Linguagem Natural com o objetivo de entender sentimentos, emoções e avaliações a respeito de pessoas, coisas, produtos e outros, tem seus desafios e complexidades em relação à analise semântica de níveis de granularidade.</p><p>Classificar a polaridade de frases, textos, documentos, também são problemas enfrentados pela AS, pelo fato de todos eles carregarem consigo opiniões subjetivas e emocionais, podendo elas serem positivas, neutras ou negativas. Uma sentença pode ter tanto “partes” positivas quanto negativas e, pode até existir aquelas em que, apesar de parecerem positivas, dependendo do contexto, se “tornam” negativas.</p><p>Neste artigo, introduzimos a fundamentação teórica da Análise de Sentimentos e gostaríamos de convidar a todos a lerem o próximo, onde vamos mostrar uma aplicação prática do que foi abordado neste. Fique atento e não perca!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2ba5ec942c3" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sidi-nlp/introdu%C3%A7%C3%A3o-%C3%A0-an%C3%A1lise-de-sentimentos-parte-1-2ba5ec942c3">Introdução à Análise de Sentimentos (parte 1)</a> was originally published in <a href="https://medium.com/sidi-nlp">SiDi NLP</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>