Article image
Marcelo Alves
Marcelo Alves15/08/2024 21:53
Compartilhe

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

    image

    • Fazendo pull da imagem olama/olama
    docker pull ollama/ollama
    

    image

    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
    

    image

    • Container em execução do Docker for Windows

    image

    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
    

    image

    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.
    

    image

    • 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?
    

    image

    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
    

    image

    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.

    Referências

    Compartilhe
    Comentários (0)