SLM (Small Language Models) com Docker + Ollama + Python para treinar suas habilidades em Engenharia de Prompts
Este artigo foi criado com o objetivo de democratizar os estudos em Engenharia de Prompts.
Considerando que muitas plataformas de IA são pagas ou apresentam restrições de uso, seja limitando tokens gerados ou recursos disponíveis, por que não criar nossa própria plataforma local, sem limitações de uso?
Pré-requisitos
- Docker for Windows instalado
- Docker configurado no Path do Windows (C:\Program Files\Docker\Docker\resources\bin)
- Python instalado
1. Configurando a Imagem e o Container
Primeiramente, certifique-se de que o Docker for Windows está em execução. Em seguida, vamos fazer o pull da imagem ollama/ollama no terminal de sua preferência.
- Docker for Windows em execução
- Fazendo pull da imagem olama/olama
docker pull ollama/ollama
Agora, vamos criar nosso container e mantê-lo em execução em segundo plano.
- Criando o container no modo detached (-d) e liberando a porta 11434:
docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
- Container em execução do Docker for Windows
Com o container em execução, podemos prosseguir para os próximos passos.
2. Executando um Modelo SLM (Small Language Models) no Ollama
O comando abaixo executa o modelo llama3 dentro do nosso container recém-criado. O modelo é baixado automaticamente, permitindo que você interaja com ele em seguida.
- Executando o modelo llama3 no Ollama
docker exec -it ollama ollama run llama3
3. Aplicando boas práticas de Engenharia de Prompt com o Llama3 no Ollama
- Nosso prompt inicial
Boa noite!\r\nGostaria que fosse criado um flash card para minhas férias em Miguel Pereira - RJ\r\nGostaria que fossem detalhados os pontos turísticos mais importantes, hotéis, bares e restaurantes.
- Refinando nosso prompt para uma resposta mais adequada
Ouvi dizer que existe o Parque dos Dinos em Miguel Pereira. Poderia incluir no meu flash card?
4. Criando uma aplicação em Python com Streamlit para consumir a API do Ollama
O poder do Ollama vai além. Enquanto está em execução, o Ollama disponibiliza uma API que permite a integração com suas aplicações em qualquer linguagem. A porta padrão da API do Ollama é a 11434.
Vou criar uma aplicação simples em Python para demonstrar a integração com a API do Ollama. Para reproduzir o código, é necessário ter o Python instalado em seu sistema operacional.
- Instalando as bibliotecas necessárias
pip install streamlit requests
- Código do app.py
import streamlit as st
import requests
import json
OLLAMA_API_URL = "http://localhost:11434/api/chat"
def get_ollama_response(model, messages):
try:
response = requests.post(
OLLAMA_API_URL,
json={"model": model, "messages": messages, "stream": True},
stream=True
)
response.raise_for_status()
full_response = ""
for line in response.iter_lines():
if line:
try:
line_json = json.loads(line.decode('utf-8'))
full_response += line_json["message"]["content"]
except json.JSONDecodeError as e:
st.error(f"Erro ao decodificar fragmento da resposta da API: {e}")
return full_response or "Nenhuma resposta encontrada."
except requests.exceptions.RequestException as e:
st.error(f"Erro ao obter resposta da API: {e}")
return f"Erro ao obter resposta da API: {e}"
st.title("Chat com API do Ollama")
if "messages" not in st.session_state:
st.session_state.messages = []
with st.form(key='user_input_form'):
user_input = st.text_input("Digite seu prompt:", key="user_input")
submit_button = st.form_submit_button(label='Enviar')
if submit_button and user_input:
st.session_state.messages.append({"role": "user", "content": user_input})
st.write(st.session_state.messages)
response = get_ollama_response("llama3", st.session_state.messages)
st.session_state.messages.append({"role": "assistant", "content": response})
for i, message in enumerate(reversed(st.session_state.messages)):
if message["role"] == "user":
st.text_area("Você:", message["content"], key=f"user_{i}", height=75)
elif message["role"] == "assistant":
st.text_area("Ollama:", message["content"], key=f"bot_{i}", height=75)
- Executando nosso programa em Python com Streamlit
streamlit run app.py
Conclusões
Configurar esse ambiente foi uma experiência muito interessante, pois nos permitiu criar uma plataforma local para estudar as melhores práticas de Engenharia de Prompts sem nos preocuparmos com custos. Isso nos permite focar no que realmente importa: o conhecimento.