Em vez de usar serviços como ChatGPT, Amazon Bedrock, Google Bard – existem vários modelos de linguagem grande de código aberto que podem ser usados para executar um chatbot localmente, GPT4ALL é uma dessas opções.
Isso me levou a pensar se era possível executar um LLM dentro da função AWS Lambda. Geralmente são funções pequenas, rápidas de executar e orientadas a eventos. Eles não foram feitos para serem usados em tarefas de processamento complexas, mas são escalonados até zero e você só paga pelo que usar. Ter um LLM dentro de uma função Lambda parece um experimento divertido e uma maneira de ter um modelo hospedado que não requer um processo de longa execução.
Este repositório contém código para criar uma função AWS Lambda de tempo de execução personalizada usando uma imagem de contêiner. Ele também pode ser executado localmente dentro do Docker para teste. A função contém o modelo LLM completo e o código para usar o modelo, permitindo a geração de texto básico a partir de uma chamada HTTP para ele.
Isso usa:
Baixe um modelo GPT4ALL. Para isso usei gpt4all-falcon-newbpe-q4_0.gguf porque é um modelo pequeno (4GB...) que tem boas respostas. Outros modelos devem funcionar, mas precisam ser pequenos o suficiente para caber nos limites de memória do Lambda.
Coloque o arquivo bin
dentro da pasta de function
, próximo ao arquivo lambda_function.py.
Construa a imagem com docker: docker build --platform linux/amd64 -t makgpt:test1
.
Uma vez construído, você pode executá-lo localmente: docker run -p 9000:8080 makgpt:test1
Depois de executado, você pode executar invocações nele em outra janela de terminal, como curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"body":"{"action":"Set fire to a tree"}"}'
Envie a imagem para ECR dentro de sua conta AWS. Para isso, você pode seguir o guia da AWS em Deploying the image
no Guia do desenvolvedor. As etapas simples são:
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
aws ecr create-repository --repository-name hello-world --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
docker tag docker-image:test :latest
docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
Crie uma função Lambda a partir desta imagem, garantindo memória suficiente (recomenda-se 10 GB) e um tempo limite de pelo menos 5 minutos.
Para simplificar, forneça à função Lambda um URL de função e você poderá acessá-la por HTTP.
Você pode então tentar com o URL como: curl "https://INSERTHERE.lambda-url.us-east-1.on.aws/" -d '{"body":"{"action":"Set fire to a tree"}"}'
Esta função é preparada como um jogo básico de aventura em texto com o prompt:
You are a Text-Based Fantasy RPG. The player is exploring the dark forest and you are the dungeon master. The player performs the action: {action} What happens next? You are talking to the player.
{
"action": "Throw your sword at the angry orc"
}
"nAs the player throws their sword at the angry orc, it strikes true and lands squarely in its chest. The orc roars in pain and anger, charging towards the player with a fierce look in its eyes.nnThe player quickly dodges out of the way, but not before noticing something strange about the orc's eyes. They seem to be glowing with an otherworldly light, as if they are possessed by some dark force.nnWith the orc now dangerously close, the player decides to take a risk and try to reason with it. "Stop! I mean you no harm," they say, holding out their hands in a gesture of peace.nnTo their surprise, the orc seems to understand them and hesitates for a moment before continuing its attack. The player quickly grabs their sword and prepares to defend themselves if necessary.nnAs the fight continues, it becomes clear that this orc is not like any other they have faced before. Its movements are unnaturally quick and its strength is unmatched. But with each blow of the sword, the player gains a little more confidence in their abilities.nnFinally, after what seems like an eternity, the orc falls to the ground, defeated."
Tempo gasto: 1m 33s
{
"action": "A wizard casts a spell on the player and turns them into a pencil"
}
"nAs the wizard finishes casting his spell, the player suddenly finds themselves transformed into a pencil. They look down at their new form in confusion before noticing that they are no longer holding the wand they were using to cast spells.nnThe player tries to move around, but find that they are unable to do so without making a noise. They try to speak, but find that they cannot make any sounds with their new pencil body.nnSuddenly, they hear a voice from behind them. "Well, well, well. Look who we have here." The player turns around to see the wizard who cast the spell on them.nnThe wizard chuckles at the player's transformation and begins to speak in a mocking tone. "I bet you didn't expect this when you decided to mess with magic, did you?"nnThe player tries to respond, but finds that they are unable to do so without making any noise. They feel helpless and frustrated as they try to come up with a plan to escape their new form.nnWhat will the player do next?"
Tempo gasto: 1m 1s