Como referi no post anterior, o desenvolvimento da IA do Fabrice revelou-se muito mais complexo do que o esperado, obrigando-me a explorar muitas abordagens diferentes.
A abordagem inicial: Índice Llama – Pesquisa Vetorial
A minha primeira incursão para melhorar as capacidades de recuperação do Fabrice AI envolveu a utilização do Índice Llama para pesquisa vetorial. O conceito era simples: pegar no conteúdo do meu blogue, convertê-lo em documentos Langchain e depois transformá-los em documentos Llama. Estes documentos Llama seriam depois armazenados num índice vetorial, permitindo-me consultar este índice para obter informações relevantes.
No entanto, quando comecei a testar o sistema, tornou-se evidente que esta abordagem não estava a produzir os resultados que eu esperava. Especificamente, quando questionei o sistema com perguntas de contexto pesado, como “Quais são os maiores erros que os fundadores de mercados cometem?”, a IA não conseguiu dar respostas significativas. Em vez de recuperar o conteúdo diferenciado que eu sabia que estava embutido nos dados, ela retornava respostas irrelevantes ou incompletas.
Este fracasso inicial levou-me a reconsiderar a minha abordagem. Apercebi-me de que não bastava armazenar o conteúdo num índice vetorial; o mecanismo de recuperação tinha de compreender o contexto e as nuances das perguntas que estavam a ser feitas. Esta constatação foi a primeira de muitas lições que iriam moldar a evolução da Fabrice AI.
Armazenamento de conhecimento: Armazenamento e recuperação de documentos MongoDB
Com as limitações da abordagem do índice Llama em mente, explorei em seguida o armazenamento dos documentos Llama no MongoDB. O esquema flexível e a estrutura orientada para documentos do MongoDB pareciam ser uma solução promissora para gerir os diversos tipos de conteúdo que tinha acumulado ao longo dos anos.
O plano era criar uma experiência de pesquisa mais dinâmica e reactiva. No entanto, esta abordagem rapidamente se deparou com problemas. A funcionalidade de pesquisa, que eu tinha previsto ser mais robusta, não teve o desempenho esperado. As consultas que deveriam ter devolvido documentos relevantes, em vez disso, não produziram resultados ou apresentaram conteúdos irrelevantes.
Este contratempo foi frustrante, mas também sublinhou uma lição fundamental: o método de armazenamento é tão importante como a estratégia de recuperação. Comecei a considerar outras opções, como a utilização do MongoDB Atlas para pesquisas vectoriais, que poderia potencialmente fornecer a precisão e a escalabilidade de que precisava. No entanto, antes de me comprometer com esta alternativa, queria explorar outras abordagens para determinar se haveria uma solução mais eficaz.
Recuperador de metadados e armazenamento de vectores: Procura a especificidade
Uma das próximas vias que explorei foi a utilização de um recuperador de metadados combinado com um armazenamento de vectores. A ideia subjacente a esta abordagem era categorizar o vasto conjunto de informações no Fabrice AI e depois obter respostas com base nessas categorias. Ao estruturar os dados com metadados, esperava melhorar a capacidade da IA de fornecer respostas específicas e direcionadas.
No entanto, este método também tinha as suas limitações. Embora parecesse promissor à primeira vista, a IA teve dificuldade em dar respostas exactas a todos os tipos de perguntas. Por exemplo, quando perguntei: “O autor é otimista?” O sistema não conseguiu interpretar a pergunta no contexto do conteúdo relevante. Em vez de fornecer uma análise perspicaz com base nos metadados, devolveu respostas vagas ou nenhuma.
Esta abordagem ensinou-me uma lição valiosa sobre a importância do contexto na IA. Não basta simplesmente categorizar a informação; a IA também tem de compreender como estas categorias interagem e se sobrepõem para formar uma compreensão coesa do conteúdo. Sem esta profundidade de compreensão, mesmo os métodos de recuperação mais sofisticados podem ser insuficientes.
Estruturação do conhecimento: O SummaryTreeIndex
Enquanto continuava a aperfeiçoar a IA Fabrice, experimentei criar um SummaryTreeIndex. Esta abordagem tinha como objetivo resumir todos os documentos num formato de árvore, permitindo que a IA navegasse através destes resumos e recuperasse informações relevantes com base na estrutura do conteúdo.
A ideia era que, ao resumir os documentos, a IA poderia identificar rapidamente os pontos-chave e responder às perguntas com informações concisas e precisas. No entanto, este método também enfrentou desafios significativos. A IA teve dificuldade em dar respostas significativas a questões complexas, como “Como tomar decisões importantes na vida?” Em vez de se basear no conteúdo rico e cheio de nuances armazenado nos resumos, as respostas da IA eram frequentemente superficiais ou incompletas.
Esta experiência sublinhou a dificuldade de equilibrar a amplitude e a profundidade na IA. Embora os resumos possam fornecer uma visão geral de alto nível, muitas vezes não têm o contexto detalhado necessário para responder a perguntas mais complexas. Apercebi-me de que qualquer solução eficaz teria de integrar tanto o conteúdo detalhado como os resumos de alto nível, permitindo que a IA recorresse a ambos quando necessário.
É por isso que, na versão atual do Fabrice AI, a IA começa por dar um resumo da resposta, antes de entrar em mais pormenores.
Expandir os horizontes: Índice do gráfico de conhecimentos
Reconhecendo as limitações dos métodos anteriores, optei por uma abordagem mais sofisticada: o Knowledge Graph Index. Esta abordagem envolveu a construção de um gráfico de conhecimentos a partir de texto não estruturado, permitindo que a IA se envolvesse em consultas baseadas em entidades. O objetivo era criar uma compreensão mais dinâmica e interligada do conteúdo, permitindo que a IA Fabrice respondesse mais eficazmente a perguntas complexas e contextualizadas.
Apesar da sua promessa, o Índice do Gráfico de Conhecimento também enfrentou obstáculos significativos. A IA teve dificuldade em produzir resultados precisos, especialmente para consultas que exigiam uma compreensão profunda do contexto. Por exemplo, quando lhe foi perguntado: “Quais são as avaliações justas da Seed & Series A?”, a IA não conseguiu dar uma resposta relevante, destacando a dificuldade de integrar texto não estruturado num gráfico de conhecimento coerente.
Esta abordagem, embora não tenha sido bem sucedida, forneceu informações importantes sobre os desafios da utilização de gráficos de conhecimentos na IA. A complexidade dos dados e a necessidade de um contexto preciso significavam que mesmo um gráfico de conhecimentos bem construído poderia ter dificuldades em obter os resultados desejados. Uma outra desvantagem do índice do gráfico do conhecimento era a sua baixa velocidade. O tempo de resposta para obter documentos relacionados era muito elevado em relação a um índice de armazenamento de vectores.
Reavaliando os dados: Gémeos
Depois de vários contratempos, decidi adotar uma abordagem diferente, utilizando a IA da Google, Gemini. A ideia era criar conjuntos de dados a partir de ficheiros JSON-CSV e depois treinar um modelo LLM personalizado utilizando esses dados. Esperava que, utilizando dados estruturados e um modelo de treino robusto, pudesse ultrapassar alguns dos desafios que tinham afetado as tentativas anteriores.
No entanto, esta abordagem também encontrou dificuldades. O processo de formação foi interrompido devido a uma formatação incorrecta dos dados, o que impediu a formação eficaz do modelo. Este contratempo sublinhou a importância da integridade dos dados na formação em IA. Sem dados corretamente formatados e estruturados, mesmo os modelos mais avançados podem não ter o desempenho esperado.
Esta experiência levou-me a considerar o potencial da utilização do BigQuery para armazenar dados JSON, proporcionando uma plataforma mais escalável e fiável para gerir os grandes conjuntos de dados necessários para treinar eficazmente a IA Fabrice.
Combinando pontos fortes: Documentos Langchain com Pinecone
Apesar dos desafios enfrentados até agora, estava determinado a encontrar uma solução que permitisse à Fabrice AI armazenar e recuperar conhecimentos de forma eficaz. Esta determinação levou-me a fazer experiências com documentos Langchain e Pinecone. A abordagem envolveu a criação de um armazenamento vetorial Pinecone utilizando documentos Langchain e embeddings OpenAI, recuperando depois os principais documentos semelhantes com base na consulta.
Este método revelou-se prometedor, especialmente quando a consulta incluía o título do documento. Por exemplo, quando lhe foi perguntado “Qual é a chave para a felicidade?”, a IA foi capaz de recuperar e resumir o conteúdo relevante com exatidão. No entanto, ainda existiam limitações, especialmente quando a consulta não incluía palavras-chave ou títulos específicos.
Esta abordagem demonstrou o potencial da combinação de diferentes tecnologias para melhorar o desempenho da IA. Ao integrar os documentos Langchain com o armazenamento de vectores do Pinecone, consegui melhorar a relevância e a precisão das respostas da IA, embora com algumas limitações.
Alcança a consistência: Construtor GPT OpenAI
Depois de explorar vários métodos e tecnologias, recorri ao GPT Builder da Open AI para consolidar e aperfeiçoar os conhecimentos armazenados no Fabrice AI. Ao carregar todo o conteúdo para uma base de conhecimentos GPT, pretendi criar uma plataforma mais consistente e fiável para recuperar e interagir com os meus conhecimentos.
Esta abordagem provou ser uma das mais bem sucedidas, com a IA a conseguir fornecer melhores resultados numa série de consultas. A chave para este sucesso foi a integração de todo o conhecimento num sistema único e coeso, permitindo que a IA utilizasse toda a amplitude do conteúdo ao responder às perguntas.
Como mencionei no meu post anterior, não consegui que funcionasse no meu site e só estava disponível para os subscritores pagos do Chat GPT, o que achei demasiado limitativo. Além disso, embora fosse melhor, eu ainda não gostava da qualidade das respostas e não me sentia confortável em divulgá-las ao público.
Refinamento final: Assistentes de GPT usando o modelo 4o
A última peça do puzzle no desenvolvimento da IA Fabrice surgiu com a introdução dos assistentes GPT utilizando o modelo 4o. Esta abordagem representou o culminar de tudo o que tinha aprendido ao longo do projeto. Utilizando uma base de dados de vectores e refinando as instruções, pretendi atingir o nível mais elevado possível de precisão e compreensão contextual nas respostas da IA.
Este método envolveu o carregamento de todo o conhecimento que eu tinha acumulado numa base de dados vetorial, que foi depois utilizada como base para as interações da IA. A base de dados vetorial permitiu à IA efetuar pesquisas mais sofisticadas, recuperando informações com base no significado semântico das consultas, em vez de se basear apenas na correspondência de palavras-chave. Isto representou um avanço significativo em relação às abordagens anteriores, permitindo que a IA compreendesse melhor e respondesse a questões complexas e matizadas.
Uma das principais inovações desta abordagem foi o refinamento cuidadoso dos prompts.
Ao elaborar e testar meticulosamente diferentes prompts, consegui orientar a IA no sentido de fornecer respostas mais precisas e relevantes.
Isto envolveu não só ajustar a redação dos avisos, mas também experimentar diferentes formas de estruturar as perguntas para obter as melhores respostas possíveis.
Os resultados foram impressionantes.
A IA era agora capaz de lidar com uma vasta gama de consultas com elevada precisão, mesmo quando as perguntas eram abertas ou exigiam uma compreensão profunda do contexto.
Por exemplo, quando lhe perguntaram: “Como tomar as decisões mais importantes da tua vida?”
A IA forneceu uma resposta abrangente e perspicaz, recorrendo a uma variedade de fontes e perspectivas para dar uma resposta completa.
Este sucesso foi o culminar de centenas de horas de trabalho e de inúmeras experiências. Demonstrou que, com a combinação certa de tecnologia e refinamento, era possível criar uma IA que pudesse não só armazenar e recuperar informações de forma eficaz, mas também interagir com elas de forma significativa. O desenvolvimento dos GPT Assistants utilizando o Model 4o marcou o ponto em que a IA Fabrice se tornou verdadeiramente própria, atingindo o nível de sofisticação e precisão que eu tinha imaginado desde o início. A API dos GPT Assistants foi então integrada no meu blogue para permitir que os utilizadores finais interagissem com a Fabrice AI da forma como a vês agora no blogue.
Refletir sobre a viagem
O processo de desenvolvimento da IA do Fabrice realçou as complexidades do trabalho com a IA, particularmente no que diz respeito à compreensão e contextualização da informação. Ensinou-me que não há atalhos no desenvolvimento da IA – cada passo, cada iteração e cada experiência é uma parte necessária da viagem para criar algo verdadeiramente eficaz.
Olhando para o futuro, estou entusiasmado por continuar a aperfeiçoar e a expandir a IA da Fabrice. Como mencionei no último post, vou rever as perguntas feitas para completar a base de conhecimentos onde existem lacunas. Também espero eventualmente lançar uma versão interactiva que se pareça comigo e com a qual possas falar.