{"id":570445,"date":"2025-05-26T23:34:12","date_gmt":"2025-05-26T22:34:12","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=pycharm&#038;p=570445"},"modified":"2025-05-27T00:08:00","modified_gmt":"2025-05-26T23:08:00","slug":"como-criar-chatbots-com-o-langchain","status":"publish","type":"pycharm","link":"https:\/\/blog.jetbrains.com\/pt-br\/pycharm\/2025\/05\/como-criar-chatbots-com-o-langchain\/","title":{"rendered":"Como criar chatbots com o LangChain"},"content":{"rendered":"<p><em>Esta \u00e9 uma postagem de um convidado, <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/08\/how-to-build-chatbots-with-langchain\/#author\" data-type=\"link\" data-id=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/08\/how-to-build-chatbots-with-langchain\/#author\">Dido Grigorov<\/a>, engenheiro de aprendizado profundo e programador Python com 17 anos de experi\u00eancia na \u00e1rea.<\/em><\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-570469\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/05\/PC-social-BlogFeatured-1280x720-2x-5.png\" alt=\"\" width=\"2560\" height=\"1440\" \/><\/figure>\n<p>Os chatbots evolu\u00edram muito al\u00e9m de meras ferramentas de perguntas e respostas. Com o poder dos modelos grandes de linguagem (LLMs), os chatbots podem compreender o contexto das conversas e gerar respostas semelhantes \u00e0s humanas, o que os torna valiosos para aplica\u00e7\u00f5es de suporte ao cliente e outros tipos de assist\u00eancia virtual.\u00a0<\/p>\n<p>O LangChain, um framework de c\u00f3digo aberto, simplifica o processo de criar esses chatbots de conversa, fornecendo ferramentas para a integra\u00e7\u00e3o transparente de modelos, gerenciamento de contexto e engenharia de prompts.<\/p>\n<p>Nesta postagem de blog, vamos explorar como funciona o LangChain e como os chatbots interagem com os LLMs. Tamb\u00e9m vamos guiar voc\u00ea passo a passo na cria\u00e7\u00e3o de um chatbot sens\u00edvel ao contexto que fornece respostas precisas e relevantes, usando o LangChain e o GPT-3.<\/p>\n<p><!--more--><\/p>\n<h2 class=\"wp-block-heading\"><strong>O que s\u00e3o chatbots na \u00e1rea de <\/strong>LLMs<strong>?<\/strong><\/h2>\n<p>Na \u00e1rea de LLMs, chatbots s\u00e3o um tipo de software de ponta que simula conversas com usu\u00e1rios, semelhantes \u00e0s conversas destes com humanos, atrav\u00e9s de interfaces de texto ou voz. Esses chatbots exploram os recursos avan\u00e7ados dos LLMs, que por sua vez s\u00e3o redes neurais treinadas em grandes volumes de dados de texto, o que lhes permite produzir respostas semelhantes \u00e0s humanas para uma grande variedade de prompts de entrada.<\/p>\n<p>Dentre outras coisas, chatbots baseados em LLMs podem levar o contexto da conversa em considera\u00e7\u00e3o ao gerarem uma resposta. Isso significa que eles podem se manter coerentes entre diferentes intera\u00e7\u00f5es e podem processar consultas complexas para produzirem sa\u00eddas alinhadas com as inten\u00e7\u00f5es do usu\u00e1rio. Al\u00e9m disso, esses chatbots avaliam o tom emocional da entrada do usu\u00e1rio e ajustam suas respostas para se adequarem ao estado de esp\u00edrito do usu\u00e1rio.<\/p>\n<p>Os chatbots s\u00e3o altamente adapt\u00e1veis e personalizados. Eles aprendem com a forma como os usu\u00e1rios interagem com eles. Assim, melhoram suas respostas ajustando-as conforme as prefer\u00eancias e necessidades individuais do usu\u00e1rio.\u00a0<\/p>\n<h2 class=\"wp-block-heading\"><strong>O que \u00e9 o LangChain?<\/strong><\/h2>\n<p>O LangChain \u00e9 um framework de c\u00f3digo aberto, desenvolvido para criar aplicativos que usam modelos grandes de linguagem (LLMs). Ele vem com ferramentas e abstra\u00e7\u00f5es que permitem personalizar melhor as informa\u00e7\u00f5es produzidas a partir desses modelos, mantendo a precis\u00e3o e a relev\u00e2ncia.\u00a0<\/p>\n<p>Uma express\u00e3o comum que voc\u00ea pode ver ao ler sobre LLMs \u00e9 &#8220;cadeias de prompts&#8221;. Uma cadeia de prompts \u00e9 uma sequ\u00eancia de prompts ou instru\u00e7\u00f5es usadas no contexto de intelig\u00eancia artificial e aprendizado de m\u00e1quina, com a finalidade de guiar o modelo de IA atrav\u00e9s de um processo de v\u00e1rias etapas para gerar resultados mais precisos, detalhados ou refinados. Esse m\u00e9todo pode ser empregado em v\u00e1rias tarefas, como reda\u00e7\u00e3o, solu\u00e7\u00e3o de problemas ou gera\u00e7\u00e3o de c\u00f3digo.\u00a0<\/p>\n<p>Os desenvolvedores podem criar novas cadeias de prompts usando o LangChain e este \u00e9 um dos pontos mais fortes desse framework. \u00c9 poss\u00edvel at\u00e9 modificar modelos j\u00e1 existentes de prompts sem precisar treinar o modelo novamente ao usar novos conjuntos de dados.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Como funciona o LangChain?<\/strong><\/h2>\n<p>O LangChain \u00e9 um framework projetado para simplificar o desenvolvimento de aplicativos que usam modelos de linguagem. Ele oferece uma su\u00edte de ferramentas que ajudam os desenvolvedores a criarem e gerenciarem de forma eficiente aplicativos envolvendo processamento de linguagem natural (NLP) e modelos grandes de linguagem. Definindo as etapas necess\u00e1rias para conseguir o resultado desejado (que pode ser um chatbot, automa\u00e7\u00e3o de tarefas, um assistente virtual, suporte ao cliente e muito mais), os desenvolvedores podem adaptar modelos de linguagem a contextos espec\u00edficos de neg\u00f3cios, de forma flex\u00edvel, usando o LangChain.\u00a0<\/p>\n<p>Esta \u00e9 uma vis\u00e3o geral de como o LangChain funciona.<\/p>\n<h3 class=\"wp-block-heading\"><strong>Integra\u00e7\u00e3o de modelos<\/strong><\/h3>\n<p>O LangChain tem suporte a v\u00e1rios modelos de linguagem, incluindo os da <em>OpenAI, Hugging Face, Cohere, Anyscale, Azure Models, Databricks, Ollama, Llama, GPT4All, Spacy, Pinecone, AWS Bedrock, MistralAI<\/em> e outros. Os desenvolvedores podem facilmente alternar entre modelos diferentes ou usar diversos modelos em um \u00fanico aplicativo. \u00c9 poss\u00edvel criar solu\u00e7\u00f5es de integra\u00e7\u00e3o de modelos desenvolvidos de forma personalizada, o que permite que os desenvolvedores tirem proveito de recursos espec\u00edficos, sob medida para seus aplicativos.<\/p>\n<h3 class=\"wp-block-heading\"><strong>Cadeias<\/strong><\/h3>\n<p>O conceito central do LangChain \u00e9 o de <strong>cadeias<\/strong>, que re\u00fanem diferentes componentes de IA para obter respostas sens\u00edveis ao contexto. Uma cadeia representa um conjunto de a\u00e7\u00f5es automatizadas entre um prompt de usu\u00e1rio e a sa\u00edda final do modelo. O LangChain oferece dois tipos de cadeias:<\/p>\n<ul>\n<li><strong>Cadeias sequenciais:<\/strong> permitem que a sa\u00edda de um modelo ou fun\u00e7\u00e3o seja usada como entrada para outro modelo ou fun\u00e7\u00e3o. Isso \u00e9 especialmente \u00fatil ao elaborar processos com v\u00e1rias etapas que dependem umas das outras.<\/li>\n<li><strong>Cadeias paralelas:<\/strong> permitem a execu\u00e7\u00e3o simult\u00e2nea de diversas tarefas, com suas sa\u00eddas reunidas ao final. Isso \u00e9 perfeito para executar tarefas que possam ser divididas em subtarefas completamente independentes.<\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\"><strong>Mem\u00f3ria<\/strong><\/h3>\n<p>O LangChain facilita o armazenamento e a recupera\u00e7\u00e3o de informa\u00e7\u00f5es entre v\u00e1rias intera\u00e7\u00f5es. Isso \u00e9 essencial quando for necess\u00e1rio que o contexto persista, como no caso de chatbots ou agentes interativos. O LangChain tamb\u00e9m oferece dois tipos de mem\u00f3ria:<\/p>\n<ul>\n<li><strong>Mem\u00f3ria de curto prazo<\/strong> \u2014 ajuda a acompanhar as sess\u00f5es recentes.<\/li>\n<li><strong>Mem\u00f3ria de longo prazo<\/strong> \u2014 permite reter as informa\u00e7\u00f5es das sess\u00f5es anteriores, melhorando a capacidade do sistema de recordar chats anteriores e as prefer\u00eancias dos usu\u00e1rios.<\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\"><strong>Ferramentas e utilit\u00e1rios<\/strong><\/h3>\n<p>O LangChain oferece muitas ferramentas, mas as mais usadas s\u00e3o Prompt Engineering, Data Loaders e Evaluators.\u00a0 No que diz respeito a Prompt Engineering, o LangChain cont\u00e9m utilit\u00e1rios para criar bons prompts, o que \u00e9 muito importante para obter as melhores respostas dos modelos de linguagem.<\/p>\n<p>Se voc\u00ea quiser carregar arquivos em CSV, PDF ou outro formato, os <strong>Data Loaders<\/strong> ajudar\u00e3o voc\u00ea a carregar e pr\u00e9-processar diferentes tipos de dados, tornando poss\u00edvel usar esses dados em intera\u00e7\u00f5es de modelos.<\/p>\n<p>A avalia\u00e7\u00e3o \u00e9 uma parte essencial do trabalho com modelos de aprendizado de m\u00e1quina e modelos grandes de linguagem. \u00c9 por isso que o LangChain oferece os <strong>Evaluators<\/strong> \u2014 ferramentas usadas para testar modelos de linguagem e cadeias para que os resultados gerados satisfa\u00e7am aos crit\u00e9rios necess\u00e1rios, que podem incluir:<\/p>\n<p><strong>Crit\u00e9rios para conjuntos de dados:<\/strong><\/p>\n<ul>\n<li><strong>Exemplos com curadoria manual:<\/strong> para come\u00e7ar com dados de entrada de alta qualidade e diversificados.<\/li>\n<li><strong>Registros hist\u00f3ricos:<\/strong> para usar dados e feedback reais de usu\u00e1rios.<\/li>\n<li><strong>Dados sint\u00e9ticos:<\/strong> para gerar exemplos baseados nos dados iniciais.<\/li>\n<\/ul>\n<p><strong>Tipos de avalia\u00e7\u00f5es:<\/strong><\/p>\n<ul>\n<li><strong>Humana:<\/strong> pontua\u00e7\u00e3o e feedback manuais.<\/li>\n<li><strong>Heur\u00edstica:<\/strong> fun\u00e7\u00f5es baseadas em regras, com ou sem refer\u00eancias.<\/li>\n<li><strong>LLM como \u00e1rbitro:<\/strong> LLMs pontuam as sa\u00eddas, com base em crit\u00e9rios codificados neles.<\/li>\n<li><strong>Em pares:<\/strong> compara\u00e7\u00e3o de duas sa\u00eddas, escolhendo a melhor.<\/li>\n<\/ul>\n<p><strong>Avalia\u00e7\u00f5es de aplicativos:<\/strong><\/p>\n<ul>\n<li><strong>Testes de unidade:<\/strong> verifica\u00e7\u00f5es heur\u00edsticas r\u00e1pidas.<\/li>\n<li><strong>Testes de regress\u00e3o:<\/strong> medem mudan\u00e7as no desempenho ao longo do tempo.<\/li>\n<li><strong>Retestagem:<\/strong> reprocessamento de dados de produ\u00e7\u00e3o em novas vers\u00f5es.<\/li>\n<li><strong>On-line:<\/strong> avalia\u00e7\u00f5es em tempo real, muitas vezes para fins de salvaguardas e classifica\u00e7\u00f5es.<\/li>\n<\/ul>\n<p><strong>Agentes<\/strong><strong><br \/><\/strong>Os agentes do LangChain s\u00e3o essencialmente entidades aut\u00f4nomas que usam LLMs para interagirem com os usu\u00e1rios, executarem tarefas e tomarem decis\u00f5es com base em entradas em linguagem natural.<\/p>\n<p><strong>Agentes orientados por a\u00e7\u00f5es<\/strong> usam modelos de linguagem para decidirem a\u00e7\u00f5es ideais para tarefas predefinidas. Do outro lado, <strong>agentes interativos<\/strong> ou aplica\u00e7\u00f5es interativas como chatbots usam esses agentes, que tamb\u00e9m levam em conta a entrada fornecida pelo usu\u00e1rio e a mem\u00f3ria armazenada ao responderem a consultas.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Como os chatbots funcionam com LLMs?<\/strong><\/h2>\n<p>Os LLMs por tr\u00e1s dos chatbots usam compreens\u00e3o de linguagem natural (NLU) e gera\u00e7\u00e3o de linguagem natural (NLG), que s\u00e3o possibilitadas pelo pr\u00e9-treinamento de modelos com um volume imenso de dados de texto.<\/p>\n<h3 class=\"wp-block-heading\"><strong>Compreens\u00e3o de linguagem natural (NLU)<\/strong><\/h3>\n<ul>\n<li><strong>Sensibilidade ao contexto:<\/strong> LLMs podem compreender as sutilezas e refer\u00eancias de uma conversa e acompanhar conversas de uma sess\u00e3o para outra. Isso possibilita que os chatbots gerem para os clientes respostas l\u00f3gicas e apropriadas para o contexto.<\/li>\n<li><strong>Reconhecimento de inten\u00e7\u00e3o:<\/strong> Esses modelos devem ser capazes de compreender a inten\u00e7\u00e3o do usu\u00e1rio a partir de suas consultas, n\u00e3o importando se a linguagem \u00e9 muito espec\u00edfica ou bastante gen\u00e9rica. Os modelos podem discernir o que o usu\u00e1rio deseja obter e determinar a melhor maneira de ajud\u00e1-lo a atingir esse objetivo.<\/li>\n<li><strong>An\u00e1lise de sentimentos:<\/strong> Os chatbots podem determinar a emo\u00e7\u00e3o do usu\u00e1rio atrav\u00e9s do tom da linguagem usada e se adaptar ao estado emocional do usu\u00e1rio. Isso aumenta o engajamento do usu\u00e1rio.<\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\"><strong>Gera\u00e7\u00e3o de linguagem natural (NLG)<\/strong><\/h3>\n<ul>\n<li><strong>Gera\u00e7\u00e3o de respostas:<\/strong> Quando se fazem perguntas a LLMs, as respostas que eles fornecem s\u00e3o corretas, tanto em termos de gram\u00e1tica quanto do contexto. Isso ocorre porque as respostas produzidas por esses modelos imitam a comunica\u00e7\u00e3o humana, devido ao treinamento desses modelos em volumes imensos de dados de texto em linguagem natural.<\/li>\n<li><strong>Criatividade e flexibilidade:<\/strong> Al\u00e9m de respostas simples, chatbots baseados em LLMs podem contar hist\u00f3rias, criar poemas ou dar descri\u00e7\u00f5es detalhadas de um problema t\u00e9cnico espec\u00edfico. Portanto, podem ser considerados muito flex\u00edveis em termos do material fornecido.<\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\"><strong>Personaliza\u00e7\u00e3o e adaptabilidade<\/strong><\/h3>\n<ul>\n<li><strong>Aprendizado a partir de intera\u00e7\u00f5es:<\/strong> Chatbots tornam as intera\u00e7\u00f5es personalizadas, porque t\u00eam a capacidade de aprender a partir do comportamento e das escolhas do usu\u00e1rio. Pode-se dizer que eles est\u00e3o sempre aprendendo, o que os torna mais eficazes e precisos ao responderem perguntas.<\/li>\n<li><strong>Adapta\u00e7\u00e3o a diferentes \u00e1reas de conhecimento:<\/strong> Os LLMs podem ser ajustados a determinadas \u00e1reas ou especialidades, o que permite que os chatbots atuem como especialistas no assunto em rela\u00e7\u00f5es com clientes, suporte t\u00e9cnico ou na \u00e1rea de sa\u00fade.<\/li>\n<\/ul>\n<p>Os LLMs s\u00e3o capazes de compreender e gerar texto em diversos idiomas, o que os faz adequados a aplica\u00e7\u00f5es em diversos contextos lingu\u00edsticos.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Como criar o seu pr\u00f3prio chatbot com o LangChain em cinco etapas<\/strong><\/h2>\n<p>Este projeto tem o objetivo de criar um chatbot que use o GPT-3 para procurar respostas dentro de documentos. Primeiro, vamos obter conte\u00fado de artigos on-line, dividi-los em peda\u00e7os pequenos, computar suas inclus\u00f5es e armazen\u00e1-los no Deep Lake. Depois, vamos usar a consulta de um usu\u00e1rio para recuperar os peda\u00e7os mais relevantes do Deep Lake. Esses peda\u00e7os ser\u00e3o incorporados em um prompt para gerar a resposta final com o LLM.<\/p>\n<p>\u00c9 importante observar que usar LLMs traz o risco de gerar &#8220;alucina\u00e7\u00f5es&#8221;, ou informa\u00e7\u00f5es falsas. Isso pode ser inaceit\u00e1vel em muitas situa\u00e7\u00f5es de suporte ao cliente, mas o chatbot ainda pode ser valioso para ajudar os operadores a elaborarem respostas que podem ser verificadas antes de fornecidas aos usu\u00e1rios.<\/p>\n<p>Em seguida, vamos explorar como gerenciar conversas com o GPT-3 e dar exemplos para demonstrar a efic\u00e1cia deste fluxo de trabalho.<\/p>\n<h3 class=\"wp-block-heading\"><strong>Etapa 1: Cria\u00e7\u00e3o do projeto, pr\u00e9-requisitos e instala\u00e7\u00e3o das bibliotecas necess\u00e1rias<\/strong><\/h3>\n<p>Primeiro, crie o projeto do chatbot no PyCharm. Abra o <a href=\"https:\/\/www.jetbrains.com\/pycharm\/\" target=\"_blank\" rel=\"noopener\" data-type=\"link\" data-id=\"https:\/\/www.jetbrains.com\/pycharm\/\">PyCharm<\/a> e clique em &#8220;New project&#8221;. Em seguida, d\u00ea um nome ao seu projeto.<\/p>\n<figure class=\"wp-block-image size-full is-style-default\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-504042\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/08\/unnamed-1.png\" alt=\"Criar um projeto no PyCharm\" width=\"780\" height=\"638\" \/><\/figure>\n<p>Depois de terminar a configura\u00e7\u00e3o do projeto, fa\u00e7a login no <a href=\"https:\/\/platform.openai.com\/docs\/overview\" target=\"_blank\" rel=\"noopener\">Web site da plataforma de API OpenAI<\/a> (ou crie uma conta no site) e gere a sua &#8220;<code>OPENAI_API_KEY<\/code>&#8220;. Para isso, v\u00e1 at\u00e9 a se\u00e7\u00e3o &#8220;API Keys&#8221; no menu de navega\u00e7\u00e3o \u00e0 esquerda e clique no bot\u00e3o &#8220;+Create new secret key&#8221;. N\u00e3o se esque\u00e7a de copiar a sua chave.<\/p>\n<p>Depois disso, obtenha o seu &#8220;<code>ACTIVELOOP_TOKEN<\/code>&#8221; criando uma conta no <a href=\"https:\/\/www.activeloop.ai\/\" target=\"_blank\" rel=\"noopener\">Web site da Activeloop<\/a>. Depois de fazer login, clique no bot\u00e3o &#8220;Create API Token&#8221; e voc\u00ea ser\u00e1 levado \u00e0 p\u00e1gina de cria\u00e7\u00e3o de tokens. Tamb\u00e9m copie esse token.<\/p>\n<p>Depois que voc\u00ea tiver o token e a chave, abra as configura\u00e7\u00f5es do PyCharm clicando no bot\u00e3o com tr\u00eas pontinhos junto aos bot\u00f5es &#8220;Run&#8221; e &#8220;Debug&#8221; e selecione &#8220;Edit&#8221;. Voc\u00ea dever\u00e1 ver esta janela abaixo:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-504079\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/08\/unnamed-3.png\" alt=\"Configura\u00e7\u00f5es de execu\u00e7\u00e3o e depura\u00e7\u00e3o no PyCharm\" width=\"1382\" height=\"989\" \/><\/figure>\n<p>Agora, localize o campo &#8220;Environment variables&#8221; e o \u00edcone \u00e0 direita dele. Clique nele. Voc\u00ea ver\u00e1 a janela a seguir:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-544577\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/02\/unnamed-1.png\" alt=\"Vari\u00e1veis de ambiente no PyCharm\" width=\"1382\" height=\"989\" \/><\/figure>\n<p>Em seguida, clique no bot\u00e3o &#8220;+&#8221; para come\u00e7ar a adicionar as suas vari\u00e1veis de ambiente. Tenha cuidado com os nomes que usar. Os nomes devem ser os mesmos mencionados acima: &#8220;<code>OPENAI_API_KEY<\/code>&#8221; e &#8220;<code>ACTIVELOOP_TOKEN<\/code>&#8220;. Quando terminar, clique em &#8220;OK&#8221; na primeira janela e depois em &#8220;Apply&#8221; e &#8220;OK&#8221; na segunda.<\/p>\n<p>Essa \u00e9 uma grande vantagem do PyCharm e eu a adoro, porque o PyCharm cuida das vari\u00e1veis de ambiente automaticamente para n\u00f3s, sem precisar fazer chamadas adicionais a elas e nos permitindo pensar mais na parte criativa do c\u00f3digo.<\/p>\n<p><em>Observa\u00e7\u00e3o:<\/em> a <strong><em>Activeloop<\/em><\/strong><em> \u00e9 uma empresa de tecnologia com foco no desenvolvimento de infraestruturas de dados e ferramentas para aprendizado de m\u00e1quina e intelig\u00eancia artificial. A empresa tem o objetivo de simplificar o processo de gerenciar, armazenar e processar conjuntos de dados de larga escala, especialmente para aprendizado profundo e outras aplica\u00e7\u00f5es de IA.<\/em><\/p>\n<p>O <strong><em>Deep Lake<\/em><\/strong><em> \u00e9 o carro-chefe da Activeloop. Ele oferece recursos eficientes de armazenamento, gerenciamento e acesso a dados e \u00e9 otimizado para os conjuntos de dados em larga escala que costumam ser usados em IA.<\/em><\/p>\n<h4 class=\"wp-block-heading\"><strong>Instala\u00e7\u00e3o das <strong>bibliotecas<\/strong><\/strong> <strong>necess\u00e1rias<\/strong><\/h4>\n<p>Usaremos a classe &#8220;<code>SeleniumURLLoader<\/code>&#8221; do LangChain, que utiliza as bibliotecas &#8220;<code>unstructured<\/code>&#8221; e &#8220;<code>selenium<\/code>&#8221; do Python. Instale-as usando o pip.\u00a0 \u00c9 recomend\u00e1vel instalar a \u00faltima vers\u00e3o, embora o c\u00f3digo tenha sido testado especificamente com a vers\u00e3o 0.7.7.\u00a0<\/p>\n<p>Para isso, use o seguinte comando no terminal do PyCharm:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install unstructured selenium<\/pre>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-544604\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/02\/Install-Selenium-1.png\" alt=\"\" width=\"1385\" height=\"991\" \/><\/figure>\n<p>Agora, precisamos instalar <code>langchain<\/code>, <code>deeplake<\/code> e <code>openai<\/code>. Para isso, basta usar este comando no seu terminal (na mesma janela que voc\u00ea usou para o Selenium) e esperar um pouco at\u00e9 que tudo tenha sido instalado com sucesso:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install langchain==0.0.208 deeplake openai==0.27.8 psutil tiktoken<\/pre>\n<p>Para garantir que todas as bibliotecas sejam instaladas adequadamente, basta adicionar as linhas a seguir, necess\u00e1rias para o nosso aplicativo de chatbot, e clicar no bot\u00e3o &#8220;Run&#8221;:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from langchain.embeddings.openai import OpenAIEmbeddings\n\nfrom langchain.vectorstores import DeepLake\n\nfrom langchain.text_splitter import CharacterTextSplitter\n\nfrom langchain import OpenAI\n\nfrom langchain.document_loaders import SeleniumURLLoader\n\nfrom langchain import PromptTemplate<\/pre>\n<p>Outra maneira de instalar as suas bibliotecas \u00e9 atrav\u00e9s das configura\u00e7\u00f5es do PyCharm. Abra-as e v\u00e1 at\u00e9 a se\u00e7\u00e3o &#8220;Project -&gt; Python Interpreter&#8221;. Em seguida, localize o bot\u00e3o &#8220;+&#8221;, pesquise o seu pacote e clique no bot\u00e3o &#8220;Install Package&#8221;. Depois que terminar, feche a janela e, na janela seguinte, clique em &#8220;Apply&#8221; e depois em &#8220;OK&#8221;.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-503888\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/08\/image-38.png\" alt=\"Interpretador Python no PyCharm\" width=\"1012\" height=\"759\" \/><\/figure>\n<h3 class=\"wp-block-heading\"><strong>Etapa 2: Dividir o conte\u00fado em peda\u00e7os e computar suas inclus\u00f5es<\/strong><\/h3>\n<p>Como j\u00e1 mencionado, nosso chatbot ir\u00e1 se &#8220;comunicar&#8221; usando conte\u00fado origin\u00e1rio de artigos on-line. Foi por isso que escolhi o Digitaltrends.com como minha fonte de dados e selecionei 8 artigos para come\u00e7ar. Todos esses artigos foram organizados em uma lista do Python e atribu\u00eddos a uma vari\u00e1vel chamada &#8220;articles&#8221;.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">articles = ['https:\/\/www.digitaltrends.com\/computing\/claude-sonnet-vs-gpt-4o-comparison\/',\n           'https:\/\/www.digitaltrends.com\/computing\/apple-intelligence-proves-that-macbooks-need-something-more\/',\n           'https:\/\/www.digitaltrends.com\/computing\/how-to-use-openai-chatgpt-text-generation-chatbot\/',\n           'https:\/\/www.digitaltrends.com\/computing\/character-ai-how-to-use\/',\n           'https:\/\/www.digitaltrends.com\/computing\/how-to-upload-pdf-to-chatgpt\/']<\/pre>\n<p>Vamos carregar os documentos das URLs fornecidas e os dividir em peda\u00e7os, usando &#8220;<code>CharacterTextSplitter<\/code>&#8221; com peda\u00e7os de tamanho 1000 sem sobreposi\u00e7\u00e3o:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Use the selenium to load the documents\nloader = SeleniumURLLoader(urls=articles)\ndocs_not_splitted = loader.load()\n\n# Split the documents into smaller chunks\ntext_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)\ndocs = text_splitter.split_documents(docs_not_splitted)<\/pre>\n<p>Se voc\u00ea executar o c\u00f3digo que temos at\u00e9 agora e tudo funcionar bem, voc\u00ea dever\u00e1 receber a seguinte sa\u00edda:<\/p>\n<p><em><code>[Document(page_content=\"techcrunchnntechcrunchnnWe, TechCrunch, are part of the Yahoo family of brandsThe sites and apps that we own and operate, including Yahoo and AOL, and our digital advertising service, Yahoo Advertising.Yahoo family of brands.nn\u00a0 \u00a0 When you use our sites and apps, we use nnCookiesCookies (including similar technologies such as web storage) allow the operators of websites and apps to store and read information from your device. Learn more in our cookie policy.cookies to:nnprovide our sites and apps to younnauthenticate users, apply security measures, and prevent spam and abuse, andnnmeasure your use of our sites and appsnn\u00a0 \u00a0 If you click '\", metadata={'source':\u00a0\u2026\u2026\u2026\u2026\u2026]<\/code><\/em><\/p>\n<p>Em seguida, vamos gerar as inclus\u00f5es, usando &#8220;OpenAIEmbeddings&#8221;, e salv\u00e1-los em uma armazenagem vetorial do Deep Lake, hospedada na nuvem. Em condi\u00e7\u00f5es ideais, em um ambiente de produ\u00e7\u00e3o, poder\u00edamos enviar todo um Web site ou uma aula de um curso para um conjunto de dados do Deep Lake, permitindo fazer consultas em milhares ou at\u00e9 milh\u00f5es de documentos.\u00a0<\/p>\n<p>Usando um conjunto de dados sem servidor do Deep Lake na nuvem, aplicativos de v\u00e1rios locais podem acessar um conjunto centralizado de dados de forma transparente, sem precisar configurar uma armazenagem vetorial em uma m\u00e1quina dedicada.<\/p>\n<h4 class=\"wp-block-heading\"><strong>Por que precisamos de documentos em peda\u00e7os e de inclus\u00f5es?<\/strong><\/h4>\n<p>Ao se criarem chatbots com o LangChain, documentos em peda\u00e7os e inclus\u00f5es s\u00e3o essenciais por v\u00e1rios motivos relacionados \u00e0 efici\u00eancia, precis\u00e3o e desempenho do chatbot.<\/p>\n<p>As <strong>inclus\u00f5es<\/strong> s\u00e3o representa\u00e7\u00f5es vetoriais de textos (palavras, frases, par\u00e1grafos ou documentos) que capturam sua sem\u00e2ntica. Eles encapsulam o contexto e o significado das palavras em um formato num\u00e9rico. Isso permite que o chatbot compreenda e gere respostas contextualmente apropriadas, capturando nuances, sin\u00f4nimos e rela\u00e7\u00f5es entre palavras.<\/p>\n<p>Gra\u00e7as \u00e0s inclus\u00f5es, o chatbot tamb\u00e9m pode identificar e recuperar rapidamente as respostas ou informa\u00e7\u00f5es mais relevantes a partir de uma base de conhecimento, porque as inclus\u00f5es permitem associar as consultas do usu\u00e1rio aos peda\u00e7os mais semanticamente relevantes de informa\u00e7\u00e3o, mesmo que a reda\u00e7\u00e3o da consulta seja diferente.<\/p>\n<p>A <strong>divis\u00e3o em peda\u00e7os<\/strong>, por outro lado<strong>,<\/strong> envolve dividir documentos grandes em peda\u00e7os menores e mais f\u00e1ceis de administrar. Peda\u00e7os menores s\u00e3o mais r\u00e1pidos para processar e analisar que documentos grandes e monol\u00edticos. Isso resulta em menores tempos de resposta no chatbot.<\/p>\n<p>A divis\u00e3o dos documentos em peda\u00e7os tamb\u00e9m ajuda na relev\u00e2ncia da sa\u00edda, porque quando um usu\u00e1rio faz uma pergunta, costuma ser a respeito apenas de uma parte espec\u00edfica do documento. A divis\u00e3o em peda\u00e7os permite que o sistema identifique e recupere apenas as se\u00e7\u00f5es relevantes e que o chatbot possa fornecer respostas mais precisas e exatas.<\/p>\n<p>Agora, vamos voltar ao nosso aplicativo e atualizar o c\u00f3digo a seguir, incluindo o ID da sua organiza\u00e7\u00e3o do Activeloop. Lembre-se que, como padr\u00e3o, o ID da sua organiza\u00e7\u00e3o \u00e9 o mesmo que o seu nome de usu\u00e1rio.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># TODO: use your organization id here. (by default, org id is your username)\nmy_activeloop_org_id = \"didogrigorov\"\nmy_activeloop_dataset_name = \"jetbrains_article_dataset\"\ndataset_path = f\"hub:\/\/{my_activeloop_org_id}\/{my_activeloop_dataset_name}\"\ndb = DeepLake(dataset_path=dataset_path, embedding_function=embeddings)\n\n\n# add documents to our Deep Lake dataset\ndb.add_documents(docs)<\/pre>\n<p>Outro recurso excelente e que eu adoro no PyCharm \u00e9 a op\u00e7\u00e3o de adicionar anota\u00e7\u00f5es TODO diretamente em coment\u00e1rios do Python. Basta digitar TODO com tudo em mai\u00fasculas e todas as anota\u00e7\u00f5es ir\u00e3o para uma se\u00e7\u00e3o do PyCharm onde voc\u00ea poder\u00e1 visualiz\u00e1-las todas juntas:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># TODO: use your organization id here. (by default, org id is your username)<\/pre>\n<p>Voc\u00ea pode clicar nelas e o PyCharm lhe mostrar\u00e1 diretamente onde elas est\u00e3o no seu c\u00f3digo. Acho esse recurso muito conveniente para os desenvolvedores e o uso o tempo todo:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-503899\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/08\/image-39.png\" alt=\"Anota\u00e7\u00f5es TODO em coment\u00e1rios do Python no PyCharm\" width=\"1445\" height=\"993\" \/><\/figure>\n<p>Se voc\u00ea executar o c\u00f3digo que temos at\u00e9 agora e tudo funcionar normalmente, voc\u00ea dever\u00e1 ver a seguinte sa\u00edda:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-504068\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/08\/unnamed-2.png\" alt=\"Execu\u00e7\u00e3o do c\u00f3digo do chatbot no PyCharm\" width=\"1377\" height=\"989\" \/><\/figure>\n<p>Para encontrar os peda\u00e7os mais semelhantes a uma determinada consulta, podemos usar o m\u00e9todo &#8220;similarity_search&#8221;, oferecido pelo armazenamento vetorial do Deep Lake:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Check the top relevant documents to a specific query\nquery = \"how to check disk usage in linux?\"\ndocs = db.similarity_search(query)\nprint(docs[0].page_content)<\/pre>\n<h3 class=\"wp-block-heading\"><strong>Etapa 3: Criar o prompt para o GPT-3<\/strong><\/h3>\n<p>Vamos criar um modelo de prompt integrando prompts de atua\u00e7\u00e3o em pap\u00e9is, dados pertinentes da base de conhecimento e a consulta do usu\u00e1rio. Esse modelo estabelecer\u00e1 a persona do chatbot como um agente ostensivo de suporte ao cliente. O modelo aceita duas vari\u00e1veis de entrada: &#8220;chunks_formatted&#8221;, contendo os trechos selecionados e pr\u00e9-formatados dos artigos, e &#8220;query&#8221;, representando a pergunta do usu\u00e1rio. O objetivo \u00e9 produzir uma resposta precisa, baseando-se apenas nos peda\u00e7os fornecidos, evitando quaisquer informa\u00e7\u00f5es inventadas ou incorretas.<\/p>\n<h3 class=\"wp-block-heading\"><strong>Etapa 4: Criar a funcionalidade do chatbot<\/strong><\/h3>\n<p>Para gerar uma resposta, come\u00e7amos obtendo os &#8220;k&#8221; peda\u00e7os (por exemplo, os 3 peda\u00e7os) mais semelhantes \u00e0 consulta do usu\u00e1rio. Ent\u00e3o, esses peda\u00e7os s\u00e3o formatados como um prompt, que \u00e9 enviado ao modelo do GPT-3, com um valor de temperatura de 0.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># user question\nquery = \"How to check disk usage in linux?\"\n\n# retrieve relevant chunks\ndocs = db.similarity_search(query)\nretrieved_chunks = [doc.page_content for doc in docs]\n\n# format the prompt\nchunks_formatted = \"nn\".join(retrieved_chunks)\nprompt_formatted = prompt.format(chunks_formatted=chunks_formatted, query=query)\n\n# generate answer\nllm = OpenAI(model=\"gpt-3.5-turbo-instruct\", temperature=0)\nanswer = llm(prompt_formatted)\nprint(answer)<\/pre>\n<p>Se tudo funcionar bem, a sua sa\u00edda deve ser:<\/p>\n<p><em><code>To upload a PDF to ChatGPT, first log into the website and click the paperclip icon next to the text input field. Then, select the PDF from your local hard drive, Google Drive, or Microsoft OneDrive. Once attached, type your query or question into the prompt field and click the upload button. Give the system time to analyze the PDF and provide you with a response.<\/code><\/em><\/p>\n<h3 class=\"wp-block-heading\"><strong>Etapa 5: Criar o hist\u00f3rico de conversas<\/strong><\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Create conversational memory\nmemory = ConversationBufferMemory(memory_key=\"chat_history\", input_key=\"input\")\n\n# Define a prompt template that includes memory\ntemplate = \"\"\"You are an exceptional customer support chatbot that gently answers questions.\n\n{chat_history}\n\nYou know the following context information.\n\n{chunks_formatted}\n\nAnswer the following question from a customer. Use only information from the previous context information. Do not invent stuff.\n\nQuestion: {input}\n\nAnswer:\"\"\"\n\nprompt = PromptTemplate(\n    input_variables=[\"chat_history\", \"chunks_formatted\", \"input\"],\n    template=template,\n)\n\n# Initialize the OpenAI model\nllm = OpenAI(openai_api_key=\"YOUR API KEY\", model=\"gpt-3.5-turbo-instruct\", temperature=0)\n\n# Create the LLMChain with memory\nchain = LLMChain(\n    llm=llm,\n    prompt=prompt,\n    memory=memory\n)\n\n# User query\nquery = \"What was the 5th point about on the question how to remove spotify account?\"\n\n# Retrieve relevant chunks\ndocs = db.similarity_search(query)\nretrieved_chunks = [doc.page_content for doc in docs]\n\n# Format the chunks for the prompt\nchunks_formatted = \"nn\".join(retrieved_chunks)\n\n# Prepare the input for the chain\ninput_data = {\n    \"input\": query,\n    \"chunks_formatted\": chunks_formatted,\n    \"chat_history\": memory.buffer\n}\n\n# Simulate a conversation\nresponse = chain.predict(**input_data)\n\nprint(response)<\/pre>\n<p>Vamos percorrer o c\u00f3digo de forma mais conversacional.<\/p>\n<p>Para come\u00e7ar, vamos criar uma mem\u00f3ria das conversas usando &#8220;<code>ConversationBufferMemory<\/code>&#8220;. Isso permite que nosso chatbot se lembre do hist\u00f3rico corrente de conversas, usando &#8216;<code>input_key=\"input\"<\/code>&#8216; para gerenciar as entradas que chegarem do usu\u00e1rio.<\/p>\n<p>Em seguida, vamos projetar um modelo de prompt. Esse modelo \u00e9 como um script para o chatbot, incluindo se\u00e7\u00f5es para o hist\u00f3rico do chat, os peda\u00e7os de informa\u00e7\u00f5es que reunimos e a pergunta (entrada) atual do usu\u00e1rio. Essa estrutura ajuda o chatbot a saber exatamente qual contexto ele tem e qual pergunta ele precisa responder.<\/p>\n<p>Depois, vamos prosseguir inicializando a cadeia do nosso modelo de linguagem, ou &#8220;<code>LLMChain<\/code>&#8220;. Pense nisso como uma montagem dos componentes: pegamos nosso modelo de prompt, o modelo de linguagem e a mem\u00f3ria que criamos antes e combinamos tudo em um \u00fanico fluxo de trabalho.<\/p>\n<p>Quando chegar o momento de processar uma consulta do usu\u00e1rio, prepararemos a entrada. Isso envolve criar um dicion\u00e1rio que inclua a pergunta do usu\u00e1rio (&#8220;<code>input<\/code>&#8220;) e os peda\u00e7os relevantes de informa\u00e7\u00f5es (&#8220;<code>chunks_formatted<\/code>&#8220;). Esse arranjo garante que o chatbot tenha todos os dados de que precisa para criar uma resposta bem informada.<\/p>\n<p>Finalmente, geramos uma resposta. Invocamos o m\u00e9todo &#8220;<code>chain.predict<\/code>&#8220;, passando a ele os dados de entrada que preparamos. O m\u00e9todo processa essa entrada atrav\u00e9s do fluxo de trabalho que criamos e a sa\u00edda \u00e9 a resposta do chatbot, que ent\u00e3o mostramos.<\/p>\n<p>Essa abordagem permite que nosso chatbot mantenha uma conversa suave e bem informada, lembrando-se das intera\u00e7\u00f5es anteriores e fornecendo respostas relevantes, baseadas no contexto.<\/p>\n<p>Outro dos meus truques favoritos com o PyCharm, que me ajudou muito a criar esta funcionalidade, foi a possibilidade de posicionar o cursor sobre um m\u00e9todo, teclar &#8220;CTRL&#8221; e clicar no m\u00e9todo.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-544616\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/02\/put-my-cursor-over-a-method.gif\" alt=\"Posicione o cursor sobre um m\u00e9todo\" width=\"1200\" height=\"805\" \/><\/figure>\n<h2 class=\"wp-block-heading\"><strong>Conclus\u00e3o<\/strong><\/h2>\n<p>O GPT-3 \u00e9 excelente para criar chatbots de conversa capazes de responderem perguntas espec\u00edficas com base em informa\u00e7\u00f5es de contexto fornecidas no prompt. Por\u00e9m, pode ser um desafio garantir que o modelo gere respostas baseadas apenas nesse contexto, pois o modelo muitas vezes tende a &#8220;alucinar&#8221; (isto \u00e9, gerar informa\u00e7\u00f5es novas e potencialmente falsas). O impacto dessas informa\u00e7\u00f5es falsas depende de cada caso de uso.<\/p>\n<p>Em resumo, desenvolvemos um sistema sens\u00edvel ao contexto para responder perguntas usando o LangChain, seguindo as estrat\u00e9gias e o c\u00f3digo fornecidos. Esse processo incluiu dividir os documentos em peda\u00e7os, computar suas inclus\u00f5es, implementar um buscador para encontrar peda\u00e7os semelhantes, criar um prompt para o GPT-3 e usar o modelo do GPT-3 para gerar um texto. Essa abordagem ilustra o potencial de se usar o GPT-3 para criar chatbots poderosos e precisos quanto ao contexto e ao mesmo tempo enfatiza a import\u00e2ncia de ser vigilante quanto ao risco de gerar informa\u00e7\u00f5es falsas.<\/p>\n<h2 id=\"author\" class=\"wp-block-heading\"><strong>Sobre o autor<\/strong><\/h2>\n<div class=\"about-author \">\n<div class=\"about-author__box\">\n<div class=\"row\">\n<div class=\"about-author__box-img\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/08\/dido-grigorov.jpeg\" alt=\"Dido Grigorov\" \/><\/div>\n<div class=\"about-author__box-text\">\n<h4>Dido Grigorov<\/h4>\n<p><i><span style=\"font-weight: 400;\">Dido \u00e9 um engenheiro de aprendizado profundo e programador Python com impressionantes 17 anos de experi\u00eancia na \u00e1rea. No momento, ele est\u00e1 fazendo estudos avan\u00e7ados na prestigiosa Universidade Stanford, onde ele est\u00e1 matriculado em um programa de IA de ponta, liderado por especialistas renomados, como Andrew Ng, Christopher Manning, Fei-Fei Li e Chelsea Finn, que d\u00e3o a Dido insights e mentoria inigual\u00e1veis.<\/span><\/i><\/p>\n<p><i><span style=\"font-weight: 400;\">A paix\u00e3o de Dido pela intelig\u00eancia artificial fica evidente na sua dedica\u00e7\u00e3o tanto ao trabalho quanto \u00e0 experimenta\u00e7\u00e3o. Ao longo dos anos, ele desenvolveu uma expertise profunda no projeto, implementa\u00e7\u00e3o e otimiza\u00e7\u00e3o de modelos de aprendizado de m\u00e1quina. Sua profici\u00eancia em Python permitiu que ele abordasse problemas complexos e colaborasse em solu\u00e7\u00f5es inovadoras de IA em v\u00e1rias \u00e1reas do conhecimento.<\/span><\/i><\/p>\n<p><em>Artigo original em ingl\u00eas por:<\/em><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/03\/evgenia-200x200.jpg\" width=\"200\" height=\"200\" alt=\"Evgenia Verbina\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                            <h4>Evgenia Verbina<\/h4>\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":1086,"featured_media":570469,"comment_status":"closed","ping_status":"closed","template":"","categories":[952,1401],"tags":[6230,8556,8557],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/570445"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/types\/pycharm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/comments?post=570445"}],"version-history":[{"count":5,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/570445\/revisions"}],"predecessor-version":[{"id":570483,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/570445\/revisions\/570483"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/570469"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=570445"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=570445"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=570445"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=570445"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}