- No início de 2023, o LinkedIn começou a lançar um portfólio de produtos que utilizam recursos de GenAI
- Os primeiros produtos de GenAI começaram com o simples modelo de "entrada de prompt, saída de string" e evoluíram para experiências de agentes conversacionais com suporte a memória de contexto
- Ao construir uma stack tecnológica para aplicações GenAI, a empresa implementou uma abordagem para equilibrar time-to-market e alavancagem de longo prazo
Gênese e evolução
- Houve a necessidade de construir um framework que oferecesse mecanismos padronizados para tarefas comuns
- Como a maior parte da stack de serving online do LinkedIn é programada em Java, o início foi com um midtier Java compartilhado
- À medida que os casos de uso aumentaram, esse midtier se tornou um gargalo de desenvolvimento e operação, levando à divisão em vários serviços midtier Java específicos por caso de uso
- Engenheiros de IA preferem Python para workflows offline baseados em LLM, prompt engineering e avaliação
- No curto prazo, decidiu-se manter stacks online e offline fragmentadas, mas no longo prazo optou-se por usar Python também no serving online
- Foi construído um framework Python para serving online com base no projeto open source LangChain
- Foi iniciado um projeto, com foco em Python, para habilitar suporte em Python às dependências centrais de infraestrutura
- Atualmente, o framework de aplicações GenAI é um wrapper fino construído sobre o LangChain
Gerenciamento de prompts
- Prompt engineering é o principal mecanismo para "programar" LLMs
- No início, usava-se interpolação manual de strings no código, mas isso era propenso a erros e não escalava
- Foi introduzido um componente Prompt Source of Truth e padronizado o uso da linguagem de templates Jinja
- A biblioteca de resolução de prompts foi reescrita de Java para Python
- Com o surgimento de UIs conversacionais, passou a ser necessária mais estrutura para os papéis de humano e IA na conversa
- No fim, houve convergência para a OpenAI Chat Completions API
Automação de tarefas por meio de skills
- A abstração de skills foi estendida para aplicações GenAI e usada como mecanismo de automação de tarefas
- No início, isso foi construído com código customizado que encapsulava APIs internas e externas do LinkedIn usando esquemas JSON amigáveis para LLM
- Surgiram problemas como implementação duplicada de skills, mudanças em skills downstream e especificação manual de skills pelos desenvolvedores
- Foi introduzido o conceito de Skill Inversion, permitindo que o downstream defina as skills e as exponha ao aplicativo chamador
- Um serviço centralizado de registro de skills, plugins de build e ferramentas dinâmicas do LangChain simplificaram os processos de acesso, desenvolvimento e operação de skills
- A stack tecnológica está evoluindo para gerar gradualmente abstrações de skills para todas as APIs, permitindo que LLMs interajam de forma fluida
Consciência de contexto e personalização
- Como LLMs são stateless por padrão, consciência de contexto e personalização são difíceis
- No início, usava-se Couchbase ou Espresso DB como armazenamento, e cada equipe era responsável por configuração de banco de dados, escrita/leitura etc.
- Como a janela de contexto dos LLMs é limitada, passaram a ser necessários recursos de busca semântica (com uso de embeddings) e resumo
- Foi construída uma infraestrutura de memória conversacional aproveitando a stack de mensageria do LinkedIn
- Foi introduzido o conceito de Experiential Memory, derivado da experiência de interação entre usuário e aplicação
- Isso foi integrado ao framework de aplicações GenAI para que desenvolvedores possam usar o recurso sem atrito
Inferência de modelos e fine-tuning
- No início, eram usados apenas LLMs fornecidos pelo serviço Azure OpenAI
- LLMs como o Llama, ajustados finamente para tarefas específicas do LinkedIn, mostraram qualidade semelhante ou superior à de modelos comerciais
- A empresa está trabalhando para tornar transparente a experiência de desenvolvimento de aplicações entre modelos externos e internos
- A camada de inferência expõe a OpenAI Chat Completions API para todos os LLMs
- Por meio de hooks de configuração no framework de aplicações, é possível alternar facilmente entre modelos on-premises e externos
Migração
- É importante migrar rapidamente de soluções legadas customizadas para soluções padronizadas
- Uma equipe enxuta, composta por engenheiros com conhecimento profundo da stack Java e da nova stack, ficou responsável pela migração
- Foi usada uma abordagem gradual, migrando componentes individuais um a um
- O processo começou por apps simples e pequenos, avançando para apps complexos e grandes
- Engenheiros seniores foram pareados com novos desenvolvedores Python para que pudessem aprender Python na prática
Considerações finais
- A nova stack tecnológica de aplicações GenAI estabelece uma base sólida para adotar o desenvolvimento AI-first e construir apps de GenAI de forma eficiente e responsável
- Ela terá papel importante para alcançar a visão de oferecer oportunidades econômicas a todos os membros da força de trabalho global
- Ainda há muitos desafios a serem resolvidos
- À medida que a fronteira das experiências de produto se desloca de assistentes conversacionais para agentes de IA, novos requisitos de capacidade e operação estão aumentando rapidamente. Mais detalhes sobre isso também serão divulgados posteriormente
Ainda não há comentários.