Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

0
respostas

[Projeto] Uma alternativa ao GPT usando OLLAMA e gemma4

from openai import OpenAI
from dotenv import load_dotenv
import os
import openai
import json

load_dotenv()

API_KEY = os.getenv("OLLAMA_API_KEY") 
OLLAMA_HOST = os.getenv("OLLAMA_BASE_URL")

cliente = OpenAI(
        api_key=API_KEY,  
        base_url=OLLAMA_HOST
    )
modelo = "gemma4:e4b"

def carrega(nome_do_arquivo):
    #omitido pra caber aqui no post

def salva(nome_do_arquivo, conteudo):
  #omitido pra caber aqui no post

def limpar_conteudo(conteudo):
    #limpar saída do modelo, removendo os blocos de código e espaços em branco
    conteudo = conteudo.strip().replace("```json", "").replace("```", "")
    return conteudo


def analisar_transacao(lista_transacoes):
    print("1. Executando a análise de transação")

    prompt_sistema = """
        Analise as transações financeiras a seguir e identifique se cada uma delas é uma "Possível Fraude" ou deve ser "Aprovada". 
        Adicione um atributo "Status" com um dos valores: "Possível Fraude" ou "Aprovado".

        Cada nova transação deve ser inserida dentro da lista do JSON.

        # Possíveis indicações de fraude
        - Transações com valores muito discrepantes
        - Transações que ocorrem em locais muito distantes um do outro e diferente de todos as outras cidades considere possível fraude
        - verifique o horário, cidade e estados das Transações, em horários próximos e cidades e estado diferentes alertar fraude
        
        Adote o formato de resposta abaixo para compor sua resposta.
            
        # Formato Saída 
        {
            "transacoes": [
                {
                "id": "id",
                "tipo": "crédito ou débito",
                "estabelecimento": "nome do estabelecimento",
                "horário": "horário da transação",
                "valor": "R$XX,XX",
                "nome_produto": "nome do produto",
                "localização": "cidade - estado (País)"
                "status": ""
                },
            ]
        }
    """
        
    lista_mensagens = [
            {
                    "role": "system",
                    "content": prompt_sistema
            },
            {
                    "role": "user",
                    "content": f"Considere o CSV abaixo, onde cada linha é uma transação diferente: {lista_transacoes}. Sua resposta deve adotar o #Formato de Resposta (apenas um json sem outros comentários)"
            }
    ]
   
    try:
        resposta = cliente.chat.completions.create(
                messages=lista_mensagens,
                model=modelo,
                temperature=0
            )

        conteudo = resposta.choices[0].message.content
        conteudo = limpar_conteudo(conteudo)
        print("\nConteúdo:", conteudo)

        json_resultado = json.loads(conteudo)
       
        return json_resultado
    except openai.AuthenticationError as e:
        print(f"Erro de Autenticação: {e}")
    except openai.APIError as e:
        print(f"Erro de API: {e}")

def gerar_parecer(transacao):
        print("2. Gerando um parecer para cada transação.")

        prompt_sistema = f"""
        Para a seguinte transação, forneça um parecer, apenas se o status dela for de "Possível Fraude". Indique no parecer uma justificativa para que você identifique uma fraude.
        Transação: {transacao}

        ## Formato de Resposta
        "id": "id",
        "tipo": "crédito ou débito",
        "estabelecimento": "nome do estabelecimento",
        "horario": "horário da transação",
        "valor": "R$XX,XX",
        "nome_produto": "nome do produto",
        "localizacao": "cidade - estado (País)"
        "status": "",
        "parecer" : "Colocar Não Aplicável se o status for Aprovado"
        """

        lista_mensagens = [
                {
                    "role": "system",
                    "content": prompt_sistema
                }
            ]

        resposta = cliente.chat.completions.create(
            messages = lista_mensagens,
            model=modelo,
        )

        conteudo = resposta.choices[0].message.content
        #print(conteudo)
        print("Finalizou a geração de parecer")
        return conteudo

def gerar_recomendacao(parecer):
    #omitido pra caber aqui no post

# Processamento em lotes
lista_de_transacoes = carrega("./dados/transacoes.csv")
transacoes_analisadas = analisar_transacao(lista_de_transacoes)

for transacao in transacoes_analisadas["transacoes"]: 
        id_transacao = transacao["id"]
        produto_transacao = transacao["nome_produto"]
        status_transacao = transacao["status"]

        if transacao["status"] == "Possível Fraude": 
            parecer = gerar_parecer(transacao)
            recomendacao = gerar_recomendacao(parecer)
            salva(f"transacao-{id_transacao}-{produto_transacao}-{status_transacao}.txt", recomendacao)