Um serviço RESTful em Flask que integra um Large Language Model (LLM) local (via LM Studio) para auxiliar no ensino e aprendizado de inglês. Ele oferece avaliação gramatical, tradução de palavras com exemplos contextuais e a verificação do status do serviço LLM.
O Teacher English visa simplificar e agilizar o processo de avaliação de gramática e a consulta de vocabulário para estudantes e professores de inglês. Ao integrar um LLM local, o projeto oferece uma solução autônoma e eficiente para feedback gramatical instantâneo e enriquecimento de vocabulário com exemplos práticos, tornando o aprendizado e o ensino mais interativos e acessíveis.
O Teacher English expõe os seguintes endpoints de API:
/api/grammar/evaluate):
/api/translate/word):
/api/llm/status):
Siga os passos abaixo para configurar e executar o Teacher English em sua máquina.
Certifique-se de ter o seguinte instalado:
bartowski/llama-3.2-1b-instruct ou phi-3-mini-4k-instruct-GGUF. Você pode baixá-los diretamente pelo LM Studio.Clone o Repositório:
git clone [https://github.com/seu-usuario/teacher_english.git](https://github.com/seu-usuario/teacher_english.git) # Substitua pelo seu usuário/repositório cd teacher_english
Crie e Ative o Ambiente Virtual:
python -m venv .venv # No Windows (PowerShell): .venv\Scripts\Activate.ps1 # No Windows (CMD): .venv\Scripts\activate.bat # No macOS / Linux: source .venv/bin/activate
Instale as Dependências:
pip install Flask python-dotenv pydantic openai
Ou, se você já gerou um requirements.txt:
pip install -r requirements.txt
Crie o Arquivo de Variáveis de Ambiente (.env):
Na raiz do projeto (teacher_english/), crie um arquivo chamado .env com o seguinte conteúdo. Ajuste o LLM_MODEL_NAME para o nome exato do modelo que você carregou no seu LM Studio.
# .env # Variáveis de Ambiente para a aplicação teacher_english # --- Configurações do LLM --- # URL base do servidor de inferência do LM Studio. # Geralmente é localhost na porta 1234. LLM_BASE_URL=http://localhost:1234/v1 # Chave de API para o LM Studio. Para uso local, qualquer string serve. LLM_API_KEY=lm-studio_api_key_local # Nome do modelo LLM carregado no LM Studio. # AJUSTE ESTE VALOR para o nome EXATO do modelo que você carregou. # Ex: gemma-2-2b-it, lmstudio-community/bartowski/llama-3.2-1b-instruct, etc. # Você pode encontrar este nome na aba 'Local Inference Server' do LM Studio. LLM_MODEL_NAME=bartowski/llama-3.2-1b-instruct
Crie os Arquivos __init__.py:
Certifique-se de que os arquivos __init__.py (que podem ser vazios) existam em cada subdiretório do src/ para que o Python reconheça a estrutura como um pacote. A estrutura deve ser a seguinte:
teacher_english/
├── .venv/
├── src/
│ ├── __init__.py <-- Adicione aqui
│ ├── core/
│ │ ├── __init__.py <-- Adicione aqui
│ │ ├── entities.py
│ │ └── use_cases.py
│ ├── adapters/
│ │ ├── __init__.py <-- Adicione aqui
│ │ └── llm_adapter.py
│ ├── infrastructure/
│ │ ├── __init__.py <-- Adicione aqui
│ │ └── llm_api_client.py
│ ├── web/
│ │ ├── __init__.py <-- Adicione aqui
│ │ └── controllers.py
│ └── main.py
├── .env
├── requirements.txt
└── README.md
Você pode criar esses arquivos vazios usando touch __init__.py (Linux/macOS) ou type nul > __init__.py (Windows CMD) em cada diretório correspondente.
bartowski/llama-3.2-1b-instruct). Salve-o em um SSD para melhor desempenho.1234 (ou ajuste a variável LLM_BASE_URL no seu .env se for diferente).Com seu ambiente virtual ativado e o LM Studio rodando o servidor de inferência local, execute a aplicação Flask a partir da raiz do projeto:
(.venv) python -m src.main
A aplicação estará acessível em http://127.0.0.1:5000/
Todos os endpoints estão prefixados com /api.
POST /api/grammar/evaluate{ "phrase": "I has a new car and very happy." }
{ "comentarios": "A frase foi corrigida para garantir concordância verbal e uso correto do adjetivo. 'Has' foi corrigido para 'have' e 'very happy' para 'very happy'.", "erros_encontrados": [ "Concordância verbal (has -> have)", "Uso incorreto de advérbio/adjetivo (very happy -> very happy)" ], "frase_corrigida": "I have a new car and I am very happy.", "frase_original": "I has a new car and very happy.", "percentual_assertividade": 75.0 }
POST /api/translate/word{ "word": "apple" }
{ "palavra_original": "apple", "sugestoes_frases": [ "She loves to eat an apple every morning. (Ela adora comer uma maçã todas as manhãs.)", "The new store sells only the best apples. (A nova loja vende apenas as melhores maçãs.)", "An apple a day keeps the doctor away. (Uma maçã por dia mantém o médico afastado.)" ], "tipo_gramatical": "substantivo", "traducao_pt": "maçã" }
GET /api/llm/status{ "mensagem": "LLM está ativo e respondendo.", "modelo_carregado": "gemma-2-2b-it", "status": "ativo", "tempo_resposta_ms": 65.21 }
{ "mensagem": "Não foi possível conectar ao servidor do LLM. Detalhes: [Detalhes do erro de conexão]", "modelo_carregado": null, "status": "inativo", "tempo_resposta_ms": null }