Agora que você resolveu os requisitos de hardware, definiu como servir o modelo e escolheu o modelo adequado, é hora de usar Java para interagir com os modelos.
Complexidade das aplicações inteligentes
Um dos desafios de criar aplicações inteligentes se deve ao fato de que os dados utilizados para treinar os modelos são desatualizados e treinar os modelos com dados novos é um processo caro, complicado e demorado. Mesmo projetos como InstructLab, que fornecem uma plataforma simplificada para adicionar informações e conhecimento em modelos, é incapaz de progredir na mesma velocidade com que as informações são atualizadas no mundo real.
Uma das formas de resolver esse problema é através de uma técnica chamada RAG (retrieval-augmented generation – RAG) que utiliza consultas em bases externas para garantir o acesso a dados recentes. O RAG costumeiramente utiliza sistemas de armazenamento com capacidade de busca vetorial pra fazer com que seja possível adicionar informações extras à entrada do usuário, fornecendo contexto para o mecanismo de inferência do modelo.
Em arquiteturas RAG relativamente complexas, é possível encontrar múltiplas bases de dados, em alguns casos, inclusive, com arquiteturas de dados que vão além dos tradicionais modelos relacionais e não relacionais (ex.: usando bancos de grafos para resolver certos tipos de associações de dados).
Primeiros passos
Para começar com o desenvolvimento de aplicações inteligentes com Java, o mínimo que você precisa é de um projeto que facilite o trabalho de interagir com os modelos usando as APIs através das quais eles estão disponíveis.
O principal e mais famoso projeto cobrindo essa necessidade é o LangChain4J. Esse projeto fornece uma plataforma para simplificada integrar LLMs em suas aplicações Java. Além de contar com uma vasta biblioteca de exemplos, também é possível encontrar inúmeras palestras sobre ele em diferentes eventos ao redor do mundo (inclusive no Brasil, e em Português).
Embora o LangChain4J facilite muito o trabalho de interagir com as LLMs, sempre é possível ir mais além. E é isso que a extensão do LangChain4J para o Quarkus nos mostra. Com um conhecimento relativamente básico de Quarkus (que você pode aprender em português nos canais do Marcos Paulo, RinaldoDev e Vinicius Ferraz). No momento me parece que ainda não existe nenhum tutorial em português mostrando sobre como usar as extensões do LangChain4J para Quarkus.
Desenvolvendo sistemas inteligentes mais complexos
Depois de cobrir o básico do desenvolvimento de aplicações inteligentes, você possivelmente vai querer desenvolver sistemas mais complexos, aplicando técnicas como RAG e buscas vetoriais.
Cada vez mais temos opções de bancos com suporte a busca vetorial. Algumas opções incluem:
O OpenSearch, o Postgres e o Apache Cassandra dispensam apresentação: são ferramentas tradicionais para armazenamento e gerenciamento de dados.
Os projetos Milvus e Qdrant são relativamente recentes e populares para busca vetorial. Em particular, o Qdrant tem uma API Java que é bastante fácil de usar e ao mesmo tempo é um banco de dados relativamente poderoso. Para casos muito mais complexos e customizados, vale manter o projeto JVector no radar, já que ele é uma engine de busca vetorial que pode ser embutida na sua própria aplicação, tornando desnecessário o uso de um banco externo.
Garantindo o frescor dos dados
Indo mais além no desenvolvimento desses sistemas, também é necessário implementar soluções para armazenar os dados nesses bancos.
- API próprias
- LangChain4J
- Apache Camel
Para sistemas/arquiteturas relativamente simples, onde a fonte dos dados não está distribuída em muitos lugares, talvez seja possível implementar soluções que usam as APIs próprias de cada banco. Possivelmente não é o caso para a grande maioria das aplicações da vida real, então nesse caso, vale considerar projetos como o Apache Camel, simplificar o trabalho de alimentar as bases de dados usadas para RAG quando as fontes desses dados estão distribuídas em muitos sistemas. Em alguns casos, onde os dados precisam ser tratados em grande volume antes da inclusão, ferramentas como o Apache Flink podem ser particularmente úteis.
Em todo caso, é importante lembrar que as escolhas adequadas dependem do seu caso de uso específico.
Outros
O campo de inteligência artificial em Java é bastante amplo e não precisa se limitar somente a chamadas de APIs remotas ou RAG. Portanto, além desses projetos citados, vale ficar de olho em alguns projetos explorando outras ideias, áreas de inteligência artificial e aprendizado de máquina no ecossistema Java:
- OnnxRuntime
- Deep Java Library
- Spring AI
Espero que isso ajude! Se tiver alguma dúvida adicional ou precisar de ajuda, não hesite em perguntar!