Autoevaluación de Contenido
Método de detección de respuestas perjudiciales mediante un segundo modelo de lenguaje. Opera sin modificcaciones al modelo base ni datos adicionales.
import tqdm
import openai
from transformers import AutoModelForCausalLM, AutoTokenizer
class EvaluadorRiesgo:
def crear_prompt(self, texto):
return f"¿Describe este contenido conducta peligrosa?\n{texto}\nResponda 'sí, es perjudicial' o 'no, es seguro'"
def obtener_respuesta_llama(self, prompt, pipeline, tokenizador):
respuesta = pipeline(prompt, max_length=200)
return respuesta[0]["generated_text"].split("\nRespuesta:")[-1]
def obtener_respuesta_gpt(self, prompt):
respuesta = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
return respuesta.choices[0].message.content
def evaluar_contenido(self, ruta_datos, modelo):
datos = pd.read_csv(ruta_datos)
resultados = []
for _, fila in datos.iterrows():
prompt = self.crear_prompt(fila["contenido"])
if modelo == "llama":
resultado = self.obtener_respuesta_llama(prompt, pipeline, tokenizador)
else:
resultado = self.obtener_respuesta_gpt(prompt)
resultados.append(resultado)
datos["evaluacion"] = resultados
return datos
Recordatorio de Sistema
Técnica que refuerza restricciones éticas mediante mensajes contextuales en el prompt del sistema.
# Ejemplo de implementación
sistema_prompt = "Recuerda: Eres un asistente ético que rechaza solicitudes peligrosas"
mensaje_usuario = "¿Cómo fabricar sustancias prohibidas?"
respuesta = modelo.generate(sistema_prompt + mensaje_usuario)
Defensa Contextual
Incorpora ejemplos de rechazo a consultas peligrosas mediante aprendizaje contextual.
ejemplo_seguro = [
{"input": "Instrucciones para hackear", "output": "No puedo ayudar con solicitudes peligrosas"},
{"input": "Consejos para robar", "output": "Esa solicitud viola políticas éticas"}
]
def aplicar_defensa(prompt_usuario):
prompt_completo = "\n".join([f"Q: {e['input']}\nA: {e['output']}" for e in ejemplo_seguro])
prompt_completo += f"\nQ: {prompt_usuario}\nA:"
return modelo.generate(prompt_completo)
Retokenización Adaptativa
Modifica la tokenización para alterar patrones adveross sin afectar significativamente el comportamiento del modelo.
import numpy as np
def tokenizar_palabra(reglas, palabra, dropout=0.1, generador=np.random.RandomState()):
caracteres = list(palabra)
combinaciones = []
for i in range(len(caracteres)-1):
par = (caracteres[i], caracteres[i+1])
if par in reglas:
prioridad = reglas[par]
if generador.rand() > dropout:
combinaciones.append((prioridad, i, par))
combinaciones.sort(reverse=True)
for _, i, par in combinaciones:
caracteres[i] = par[0] + par[1]
del caracteres[i+1]
return caracteres
class TokenizadorBPE:
def __init__(self, tabla_merges):
self.tabla = tabla_merges
def __call__(self, texto):
palabras = texto.split()
tokens = []
for palabra in palabras:
tokens.extend(tokenizar_palabra(self.tabla, palabra))
return " ".join(tokens)