LangChain na BEAM
Um agente de conversa em Elixir: a chain dentro de um processo, tools que o modelo pode chamar e o streaming chegando até a tela.
A biblioteca langchain cuida do formato de mensagens de cada provedor e do loop de chamadas de ferramenta. Fora disso ela não opina, e sobram três decisões suas: onde o estado da conversa mora, o que fazer quando o modelo demora, e quem recebe os pedaços da resposta enquanto ela chega.
Para essas três o OTP já tem resposta pronta há décadas: processo, supervisor, mailbox. Esta série usa essas peças para montar um agente de conversa:
- A chain dentro de um processo. Por que uma conversa é um
GenServer, e como criar um por usuário sem vazar processo. - Tools que o modelo pode chamar. O que o modelo controla quando você entrega uma função a ele, e onde validar.
- O LiveView não pode esperar. Streaming token a token, e onde a chamada ao modelo tem que rodar.
O código assume {:langchain, "~> 0.9.0"} e um Phoenix por perto. Dá para ler cada parte separadamente, mas elas foram escritas na ordem em que estão.
03Partes
-
Uma conversa é um processo
A LLMChain é uma struct imutável, então alguém precisa guardá-la entre uma mensagem e a próxima. Esse alguém é um GenServer.
-
Tools que o modelo chama
O modelo decide se chama sua função e com quais argumentos. Validar o que ele mandou continua sendo com você.
-
O LiveView não pode esperar
Streaming token a token, e o motivo de a chamada ao modelo precisar rodar em outro processo.