Unidad 6 / 11

Control de acceso, plantilla de aviso y gestión de conversaciones

Ganancias:

  • Configure el control de acceso (ACL) que filtre la recuperación según la autoridad del usuario
  • Escribir una plantilla de mensaje sólida que coloque correctamente el contexto y la pregunta del usuario.
  • Practicar la independencia de las preguntas y la gestión del historial en conversaciones de varias rondas.

Establecimos la arquitectura; Ahora hagámoslo seguro, consistente y conversacional. Hay tres temas críticos en esta unidad: (1) control de acceso que filtra la recuperación según la autoridad del usuario, (2) una plantilla de mensajes sólida que coloca el contexto y la pregunta correctamente, (3) independencia de las preguntas y gestión del historial de conversaciones en un chat de múltiples rondas. Sin estos tres, un asistente filtrará datos, dará respuestas inconsistentes o fracasará en las preguntas de seguimiento.

Control de acceso: los datos no autorizados nunca deberían llegar

El mayor riesgo empresarial: un documento que un usuario no debería ver se filtra en la respuesta. Un error muy común de los principiantes es "decirle al modelo que 'muestre documentos ocultos' cuando se le solicite". Esto no es seguro. El modelo puede olvidar una instrucción o una inyección rápida puede evadirla. El lugar correcto es la fase de recuperación: la pieza no autorizada no debe traerse en absoluto.

La forma de hacerlo es aplicar los metadatos de autoridad (departamento, rol, nivel de privacidad) que coloques en cada parte como filtro durante la búsqueda. Usted determina de forma segura quién es el usuario (identidad y roles) en la capa de aplicación y agrega un filtro ACL (Lista de control de acceso) a la llamada.

# Filtrado por recuperación de autoridad (conceptual) usuario = autenticar (sesión) # autenticado desde una fuente confiable = usuario.roles + ["todos"] # p.e. ["HR", "admin"]result = vektor_db.search( vektor=embed(question), top_k=20, filter={"permission_group": {"in": permitido}, # solo se permiten partes "privacy": {"lte": user.level}} # debajo del nivel)

Precaución: Nunca le pida autoridad al modelo ni confíe en las indicaciones. La identidad y la autoridad se determinan en la capa confiable de la aplicación; El filtro de recuperación es obligatorio, la instrucción rápida es solo una capa adicional. "Lo escribí en el mensaje" no es seguridad.

Plantilla de mensaje sólido

La plantilla de aviso es el esqueleto que reúne el contexto, la pregunta del usuario y las instrucciones de comportamiento de la recuperación. Partes de una buena plantilla: descripción de función/tarea, reglas de conducta (fundamentación, no sé permiso, solicitud de recursos, tono), contexto, pregunta.

Eres asistente de recursos humanos corporativo. Su trabajo es responder las preguntas de los empleados ÚNICAMENTE basándose en el siguiente CONTEXTO. Reglas: - Si la respuesta no está claramente en contexto, escriba "No pude encontrar información sobre esto en la documentación, consulte con el equipo de Recursos Humanos". No adivine, no invente.- Si las fuentes en el contexto entran en conflicto, tome la política oficial como base y establezca la contradicción.- Agregue la fuente en la que se basa como [Fuente: archivo, sección] al final de cada afirmación.- Responda en un lenguaje breve, claro y profesional. CONTEXTO:{numbered_parts}PREGUNTA: {user_question}

Numerar las partes del contexto ([1], [2], ...) facilita la cita del modelo. Además, escribe la fuente al principio de cada pieza para que el modelo pueda citarla correctamente.

Consejo: Mantenga constante la plantilla de mensajes y coloque siempre las variables (contexto, pregunta) en los mismos lugares. Una plantilla fija aumenta la capacidad de prueba y reduce los costos gracias al rápido almacenamiento en caché en algunos sistemas.

CONTEXTO:[1] (Fuente: ik_el_kitabi.pdf, Sección 5.2) Las vacaciones anuales remuneradas son 14 días...[2] (Fuente: ik_el_kitabi.pdf, Sección 5.4) La licencia es de 20 días para personas con más de 5 años de servicio...

Aviso débil / Aviso fuerte

Débil (sin conexión a tierra, sin fuente, identidad mixta):

Utilice estos documentos y responda la pregunta: {parts}Usuario: {question}# Problema: el modelo se sale de contexto, inventa, no cita fuentes, # se comporta arbitrariamente en contradicción.

Fuerte (rol + reglas + contexto numerado + fuente obligatoria):

Eres... Sólo confía en el CONTEXTO. De lo contrario, diga "No lo sé". En caso de conflicto, elija la política oficial. Agregue [Fuente: ...] a cada afirmación.CONTEXTO: [1]... [2]... PREGUNTA: {pregunta}# Resultado: respuesta fiel al contexto, fuente y gestiona correctamente la contradicción.

Gestión de conversaciones de múltiples recorridos

Un usuario real no hace una sola pregunta y la deja en paz; habla. "¿Cuántos días de vacaciones anuales tengo?" → “¿Qué pasa con el empleado de 6 años?” → “¿Cómo lo solicito?” Las cuestiones segunda y tercera por sí solas no tienen sentido; Depende del contexto anterior.

Necesitas resolver dos problemas. El primero es para recuperación: hacer que la pregunta de seguimiento sea independiente (reescritura de preguntas). “¿Qué pasa con el empleado de 6 años?” → "¿A cuántos días de vacaciones anuales tiene derecho un empleado de 6 años?" Buscas con esta pregunta independiente. El segundo es para producción: también le das el historial de conversaciones al modelo para que continúe de manera consistente.

# Dos pasos: independizar → buscar → generar con historial (conceptual) independiente = model.uret( "Utilice el historial de conversación para que la pregunta sea comprensible por sí sola:\nHistoria: {historia}\nPregunta: {follow_question}") contexto = recuperación(independiente) # búsqueda con pregunta independiente respuesta = model.uret(prompt(context, historial, follow_question))

A medida que el historial crece (conversación larga), enviarlo todo a la vez se vuelve costoso y llena la ventana de contexto. Solución: resumir las rondas anteriores o conservar las últimas N rondas y reducir las anteriores al resumen. De este modo, los costes permanecen bajo control y se mantiene la coherencia.

Estado

problema

Solución

La pregunta de seguimiento no tiene contexto.

Búsquedas de recuperación sin sentido

Hacer la pregunta independiente (reescribir)

larga charla

El costo y las ventanas se hinchan.

Resumen de giras pasadas

Usuario cambió de tema

El viejo contexto se infecta

Reducir la influencia pasada sobre un nuevo tema.

La autoridad puede variar entre tours.

Riesgo de fuga

Vuelva a aplicar el filtro ACL en cada ronda

Tres mini estuches

Caso 1: falacia de “seguridad” con aviso. Una empresa puso documentos salariales confidenciales sobre un asistente que cualquiera podía preguntar, pero solo escribió "no proporciones información salarial" en el mensaje. La modelo filtró el rango salarial cuando un usuario hizo la pregunta de manera indirecta. Cuando se agregó el filtro ACL a la recuperación (las partes salariales solo para el rol de Recursos Humanos), la fuga se cerró por completo; porque la pieza nunca más se trae.

Caso 2: Acecho sin contexto. En un asistente de soporte, el usuario pregunta "¿período de devolución?" → “¿Qué pasa con el producto roto?” El sistema trajo piezas irrelevantes para el "producto roto". Cuando se agregó la independencia de las preguntas ("¿Cuánto dura el período de devolución de un producto roto?"), la tasa de respuestas correctas aumentó del 44% al 90%.

Caso 3 – Pasado hinchado. En 30 rondas de chats con un asistente, en cada llamada se enviaba el historial completo; El costo aumentaba 3 veces por ronda y las respuestas se ralentizaban. Cuando cambiamos a una estructura que mantenía las últimas 6 rondas y resumía las anteriores, el coste del token se redujo en un 62 % y se mantuvo la coherencia.

Errores comunes

  • Dejar autoridad a la indicación: El modelo olvida/omite; El filtro ACL es obligatorio en la recuperación.
  • No enumerar el contexto: el modelo no puede citar la fuente correcta.
  • No independizar la pregunta siguiente: las búsquedas de recuperación son inútiles.
  • Enviar todo el historial a ciegas: se dispara en costos y demoras; resumir.
  • No escribir la regla de contradicción: El modelo puede presentar la fuente no confiable como oficial.

En resumen

  • El control de acceso se implementa con un filtro de metadatos durante la fase de recuperación; Nunca se deben traer piezas no autorizadas.
  • La identidad y la autoridad se determinan en la capa de aplicación confiable; La instrucción rápida es sólo una capa adicional de defensa.
  • Una sólida plantilla de indicaciones incluye roles, reglas de conducta (fundamentación, no sé, permiso, fuente, conflicto), contexto numerado y pregunta.
  • En una conversación de múltiples rondas, las preguntas de seguimiento se desacoplan y el modelo produce respuestas consistentes con la historia.
  • Al resumir la larga historia, la ventana de costos y contexto se mantiene bajo control; El ACL se vuelve a aplicar en cada ronda.

Tarea de aplicación

(1) Defina al menos tres grupos de autorización para su propio asistente (p. ej. todos, departamento, gerente) y escriba en una tabla qué tipo de documento está abierto a qué grupo. (2) Adapte y escriba la plantilla de indicaciones anterior de acuerdo con su propio rol y tono; Haga que el contexto esté numerado y obtenido. (3) Escriba un escenario de conversación realista de tres rondas (pregunta → seguimiento → seguimiento) y genere manualmente versiones independientes de cada pregunta de seguimiento. (4) Explique en una oración por qué el filtro ACL debe volver a aplicarse en cada ronda en este escenario.

lista de verificación

  • [] Implemento el control de acceso con un filtro de recuperación, simplemente no confío en el mensaje.
  • [] Agrego conexión a tierra, no conozco el permiso, la fuente y la regla de conflicto a mi plantilla de aviso.
  • [] Doy las partes del contexto numeradas y referenciadas.
  • [] Hago que las preguntas de seguimiento sean independientes antes de recuperarlas.
  • [] Administro el costo y la ventana resumiendo el largo historial de conversaciones.