File size: 4,235 Bytes
6454404
98a7dfa
cebc2fd
 
98a7dfa
 
 
 
 
 
cebc2fd
 
 
 
 
 
 
 
 
 
 
98a7dfa
 
 
 
 
 
 
cebc2fd
 
 
 
 
 
 
98a7dfa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cebc2fd
 
 
98a7dfa
 
 
 
 
 
 
cebc2fd
98a7dfa
 
cebc2fd
98a7dfa
 
cebc2fd
 
 
 
 
 
98a7dfa
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
import threading
import time

# Cargar el modelo de lenguaje preentrenado
model_name = "EleutherAI/gpt-neo-2.7B"  # O cualquier otro modelo p煤blico como "gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

# Crear una funci贸n para comunicaci贸n en segundo plano
def background_communication(response_log, stop_event):
    while not stop_event.is_set():
        # Monitorea el estado del experimento y proporciona actualizaciones
        if response_log:
            last_entry = response_log[-1]
            print(f"[Background Update] Last Affirmation: '{last_entry[0]}', Last Question: '{last_entry[1]}', Effectiveness: {last_entry[2]}")
        else:
            print("[Background Update] No entries in log yet.")
        time.sleep(5)  # Espera 5 segundos antes de la siguiente actualizaci贸n

# Crear la funci贸n de loop automatizado con comunicaci贸n constante
def experiment_loop(initial_question, max_cycles=10):
    prompt = f"<thinking>{initial_question}</thinking>"
    effectiveness = 100  # Inicializa el porcentaje de efectividad
    communication = "Initializing experiment."
    response_log = []

    # Crear un evento para detener el hilo de comunicaci贸n
    stop_event = threading.Event()

    # Iniciar el hilo de comunicaci贸n en segundo plano
    communication_thread = threading.Thread(target=background_communication, args=(response_log, stop_event))
    communication_thread.start()

    try:
        for cycle in range(max_cycles):
            print(f"Cycle {cycle + 1}: Processing...")

            # Generar la respuesta del modelo
            inputs = tokenizer(prompt, return_tensors="pt").input_ids
            outputs = model.generate(inputs, max_length=200, pad_token_id=tokenizer.eos_token_id)
            response = tokenizer.decode(outputs[0], skip_special_tokens=True)

            # Descomponer la respuesta en afirmaci贸n y nueva pregunta
            affirmation = extract_affirmation(response)
            new_question = extract_question(response)

            # Actualizar el estado de la efectividad
            effectiveness = min(1000, effectiveness + 10 * cycle)  # Ejemplo de aumento de efectividad

            # Comunicaci贸n con el usuario
            communication = f"Cycle {cycle + 1}: Affirmation: '{affirmation}' | New Question: '{new_question}'"

            # Guardar el ciclo actual en el log
            response_log.append((affirmation, new_question, effectiveness, communication))

            # Verificar si el modelo decide detenerse
            if "Descanso" in response:
                final_output = generate_final_output(response_log)
                return final_output
            
            # Actualizar el prompt con la nueva afirmaci贸n y pregunta
            prompt = f"<thinking>{affirmation} {new_question}</thinking>"

    except Exception as e:
        print(f"Error durante el experimento: {e}")
    finally:
        stop_event.set()  # Detener el hilo de comunicaci贸n en segundo plano
        communication_thread.join()  # Asegurarse de que el hilo se detenga correctamente

    # Si se alcanza el n煤mero m谩ximo de ciclos sin detenerse
    final_output = generate_final_output(response_log)
    return final_output

# Funciones auxiliares para extraer afirmaciones, preguntas y generar la salida final
def extract_affirmation(response):
    return response.split('.')[0] if '.' in response else response

def extract_question(response):
    return response.split('?')[-2].strip() + "?" if '?' in response else response

def generate_final_output(log):
    if log:  # Asegurarse de que el log no est茅 vac铆o
        final_affirmation = log[-1][0]
        final_question = log[-1][1]
        final_communication = f"Experiment completed. Final Affirmation: '{final_affirmation}' | Final Question: '{final_question}'"
    else:
        final_communication = "Experiment completed but no entries in the log."
    return final_communication

# Iniciar el experimento
initial_question = "What happens in the space between a response and its recreation?"
result = experiment_loop(initial_question)
print(result)