Fabrice AI: a jornada técnica

Como mencionei na publicação anterior, o desenvolvimento do Fabrice AI se mostrou muito mais complexo do que o esperado, o que me obrigou a explorar várias abordagens diferentes.

A abordagem inicial: Índice Llama – Pesquisa vetorial

Minha primeira incursão no aprimoramento das habilidades de recuperação do Fabrice AI envolveu o uso do Índice Llama para pesquisa vetorial. O conceito era simples: pegar o conteúdo do meu blog, convertê-lo em documentos Langchain e, em seguida, transformá-los em documentos Llama. Esses documentos Llama seriam então armazenados em um índice vetorial, o que me permitiria consultar esse índice para obter informações relevantes.

No entanto, quando comecei a testar o sistema, ficou claro que essa abordagem não estava produzindo os resultados que eu esperava. Especificamente, quando eu consultava o sistema com perguntas de contexto pesado, como “Quais são os maiores erros que os fundadores de mercado cometem?”, a IA não conseguia fornecer respostas significativas. Em vez de recuperar o conteúdo diferenciado que eu sabia estar incorporado nos dados, ela retornava respostas irrelevantes ou incompletas.

Esse fracasso inicial me levou a reconsiderar minha abordagem. Percebi que simplesmente armazenar conteúdo em um índice vetorial não era suficiente; o mecanismo de recuperação precisava entender o contexto e as nuances das perguntas que estavam sendo feitas. Essa percepção foi a primeira de muitas lições que moldariam a evolução da Fabrice AI.

Armazenamento de conhecimento: Armazenamento e recuperação de documentos do MongoDB

Com as limitações da abordagem do índice Llama em mente, passei a explorar o armazenamento dos documentos do Llama no MongoDB. O esquema flexível e a estrutura orientada a documentos do MongoDB pareciam ser uma solução promissora para gerenciar os diversos tipos de conteúdo que eu havia acumulado ao longo dos anos.

O plano era criar uma experiência de pesquisa mais dinâmica e responsiva. No entanto, essa abordagem teve problemas rapidamente. A funcionalidade de pesquisa, que eu havia previsto ser mais robusta, não funcionou como esperado. Em vez disso, as consultas que deveriam retornar documentos relevantes não produziam resultados ou apresentavam conteúdo irrelevante.

Esse contratempo foi frustrante, mas também ressaltou uma lição fundamental: o método de armazenamento é tão importante quanto a estratégia de recuperação. Comecei a considerar outras opções, como a utilização do MongoDB Atlas para pesquisas vetoriais, que poderia fornecer a precisão e a escalabilidade de que eu precisava. No entanto, antes de me comprometer com essa alternativa, eu queria explorar outras abordagens para determinar se haveria uma solução mais eficaz.

Metadata Retriever e Vector Store: Buscando especificidade

Um dos próximos caminhos que explorei foi o uso de um recuperador de metadados combinado com um armazenamento de vetores. A ideia por trás dessa abordagem era categorizar a vasta gama de informações na Fabrice AI e, em seguida, recuperar respostas com base nessas categorias. Ao estruturar os dados com metadados, eu esperava melhorar a capacidade da IA de fornecer respostas específicas e direcionadas.

No entanto, esse método também tinha suas limitações. Embora parecesse promissor na superfície, a IA teve dificuldades para fornecer respostas precisas a todos os tipos de consultas. 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, ele retornou respostas vagas ou nenhuma resposta.

Essa abordagem me ensinou uma lição valiosa sobre a importância do contexto na IA. Não basta simplesmente categorizar as informações; a IA também deve entender como essas categorias interagem e se sobrepõem para formar um entendimento coeso do conteúdo. Sem essa profundidade de compreensão, até mesmo os métodos de recuperação mais sofisticados podem ser insuficientes.

Estruturação do conhecimento: O SummaryTreeIndex

Enquanto continuava a refinar a IA do Fabrice, experimentei criar um SummaryTreeIndex. Essa abordagem visava resumir todos os documentos em um formato de árvore, permitindo que a IA navegasse por esses 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 principais e responder às consultas com informações concisas e precisas. No entanto, esse método também enfrentou desafios significativos. A IA teve dificuldades para fornecer respostas significativas a consultas complexas, como “Como tomar decisões importantes na vida?” Em vez de aproveitar o conteúdo rico e cheio de nuances armazenado nos resumos, as respostas da IA geralmente eram superficiais ou incompletas.

Essa experiência ressaltou a dificuldade de equilibrar amplitude e profundidade na IA. Embora os resumos possam fornecer uma visão geral de alto nível, eles geralmente não têm o contexto detalhado necessário para responder a perguntas mais complexas. Percebi que qualquer solução eficaz precisaria integrar tanto o conteúdo detalhado quanto os resumos de alto nível, permitindo que a IA utilizasse ambos conforme necessário.

É por isso que, na versão do Fabrice AI que está no ar atualmente, eu faço com que a IA forneça primeiro um resumo da resposta, antes de entrar em mais detalhes.

Expandindo os horizontes: Índice do Gráfico de Conhecimento

Reconhecendo as limitações dos métodos anteriores, optei por uma abordagem mais sofisticada: o Knowledge Graph Index. Essa abordagem envolveu a construção de um gráfico de conhecimento 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 interconectada do conteúdo, permitindo que a IA da Fabrice respondesse a perguntas complexas e com muito contexto de forma mais eficaz.

Apesar de sua promessa, o Knowledge Graph Index também enfrentou obstáculos significativos. A IA teve dificuldades para produzir resultados precisos, principalmente para consultas que exigiam uma compreensão profunda do contexto. Por exemplo, quando perguntado: “What are fair Seed & Series A valuations?” (Quais são as avaliações justas da Seed e da Série A?), a IA novamente não conseguiu fornecer uma resposta relevante, destacando a dificuldade de integrar texto não estruturado em um gráfico de conhecimento coerente.

Essa abordagem, embora não tenha sido bem-sucedida, forneceu informações importantes sobre os desafios do uso de gráficos de conhecimento em IA. A complexidade dos dados e a necessidade de um contexto preciso significavam que mesmo um gráfico de conhecimento bem construído poderia ter dificuldades para fornecer os resultados desejados. Outra desvantagem do Knowledge Graph Index era sua baixa velocidade. O tempo de resposta para obter documentos relacionados era muito alto em relação a um índice de armazenamento de vetores.

Reavaliando os dados: Gêmeos

Depois de vários contratempos, decidi adotar uma abordagem diferente, aproveitando a IA do Google, o Gemini. A ideia era criar conjuntos de dados a partir de arquivos JSON-CSV e, em seguida, treinar um modelo LLM personalizado usando esses dados. Eu esperava que, usando dados estruturados e um modelo de treinamento robusto, eu pudesse superar alguns dos desafios que haviam atormentado as tentativas anteriores.

No entanto, essa abordagem também encontrou dificuldades. O processo de treinamento foi interrompido devido à formatação incorreta dos dados, o que impediu que o modelo fosse treinado de forma eficaz. Esse contratempo ressaltou a importância da integridade dos dados no treinamento de IA. Sem dados estruturados e formatados corretamente, até mesmo os modelos mais avançados podem não ter o desempenho esperado.

Essa experiência me levou a considerar o potencial de usar o BigQuery para armazenar dados JSON, fornecendo uma plataforma mais dimensionável e confiável para gerenciar os grandes conjuntos de dados necessários para treinar a Fabrice AI de forma eficaz.

Combinando pontos fortes: Documentos Langchain com Pinecone

Apesar dos desafios enfrentados até agora, eu estava determinado a encontrar uma solução que permitisse à Fabrice AI armazenar e recuperar conhecimento de forma eficaz. Essa determinação me levou a fazer experiências com documentos Langchain e Pinecone. A abordagem envolveu a criação de um armazenamento de vetores Pinecone usando documentos Langchain e embeddings OpenAI e, em seguida, a recuperação dos principais documentos semelhantes com base na consulta.

Esse método se mostrou promissor, principalmente quando a consulta incluía o título do documento. Por exemplo, quando perguntado: “Qual é a chave para a felicidade?”, a IA conseguiu recuperar e resumir o conteúdo relevante com precisão. Entretanto, ainda havia limitações, principalmente quando a consulta não continha palavras-chave ou títulos específicos.

Essa abordagem demonstrou o potencial da combinação de diferentes tecnologias para aprimorar o desempenho da IA. Ao integrar os documentos da Langchain com o armazenamento de vetores da Pinecone, consegui melhorar a relevância e a precisão das respostas da IA, embora com algumas limitações.

Alcançando 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 refinar o conhecimento armazenado na Fabrice AI. Ao carregar todo o conteúdo em uma base de conhecimento GPT, pretendi criar uma plataforma mais consistente e confiável para recuperar e interagir com meu conhecimento.

Essa abordagem provou ser uma das mais bem-sucedidas, com a IA capaz de fornecer melhores resultados em uma série de consultas. A chave para esse sucesso foi a integração de todo o conhecimento em um sistema único e coeso, permitindo que a IA aproveitasse toda a amplitude do conteúdo ao responder às perguntas.

Como mencionei em meu post anterior, não consegui fazer com que ele funcionasse em meu site, e ele só estava disponível para assinantes pagos do Chat GPT, o que eu achava muito limitado. Além disso, embora estivesse melhor, eu ainda não gostava da qualidade das respostas e não me sentia à vontade para divulgá-las ao público.

Refinamento final: Assistentes de GPT usando o Modelo 4o

A peça final do quebra-cabeça no desenvolvimento da Fabrice AI veio com a introdução dos GPT Assistants usando o Modelo 4o. Essa abordagem representou o ponto culminante de tudo o que aprendi ao longo do projeto. Ao utilizar um banco de dados de vetores e refinar os prompts, meu objetivo era atingir o nível mais alto possível de precisão e compreensão contextual nas respostas da IA.

Esse método envolveu o upload de todo o conhecimento que eu havia acumulado em um banco de dados vetorial, que foi usado como base para as interações da IA. O banco de dados vetorial permitiu que a IA realizasse pesquisas mais sofisticadas, recuperando informações com base no significado semântico das consultas, em vez de depender apenas da correspondência de palavras-chave. Isso representou um avanço significativo em relação às abordagens anteriores, permitindo que a IA compreendesse melhor e respondesse a perguntas complexas e com nuances.

Uma das principais inovações dessa 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. Isso envolveu não apenas ajustar o texto dos prompts, mas também experimentar diferentes maneiras de estruturar as consultas para obter as melhores respostas possíveis.

Os resultados foram impressionantes. A IA agora era capaz de lidar com uma ampla gama de consultas com alta precisão, mesmo quando as perguntas eram abertas ou exigiam uma compreensão profunda do contexto. Por exemplo, quando perguntaram a você: “Como tomar as decisões mais importantes da sua vida?” A IA forneceu uma resposta abrangente e perspicaz, baseando-se em uma variedade de fontes e perspectivas para fornecer uma resposta completa.

Esse sucesso foi o resultado de centenas de horas de trabalho e inúmeros experimentos. Ele demonstrou que, com a combinação certa de tecnologia e refinamento, era possível criar uma IA que pudesse não apenas armazenar e recuperar informações de forma eficaz, mas também interagir com elas de maneira significativa. O desenvolvimento dos GPT Assistants usando o Modelo 4o marcou o ponto em que a IA da Fabrice realmente se tornou realidade, atingindo o nível de sofisticação e precisão que eu havia imaginado desde o início. A API do GPT Assistants foi então integrada ao meu blog para permitir que os usuários finais interagissem com a Fabrice AI da maneira como você a vê no blog agora.

Refletindo sobre a jornada

O processo de desenvolvimento da Fabrice AI destacou as complexidades do trabalho com IA, principalmente quando se trata de compreender e contextualizar informações. Isso me ensinou que não há atalhos no desenvolvimento de IA – cada etapa, cada iteração e cada experimento é uma parte necessária da jornada para criar algo realmente eficaz.

Olhando para o futuro, estou animado para continuar refinando e expandindo a Fabrice AI. Conforme mencionado na última postagem, analisarei as perguntas feitas para completar a base de conhecimento onde houver lacunas. Também espero lançar uma versão interativa que se pareça comigo e com a qual você possa conversar.

>