Capstone 86 Reglas constitucionales Motor
Type: Build
Languages: Python, YAML
Prerequisites: Phase 18 safety lessons, Phase 19 Track A lessons 25-29
Time: ~90 min
El problema
Los clasificadores cubren las fallas reconocibles. Las reglas de los motores cubren las contractuales. Un equipo que escribe un asistente de codificación quiere una restricción como "cada respuesta que contiene código debe terminar en un bloque ejecutable o en una suposición declarada". Un equipo que ejecuta un bot de soporte al cliente quiere "cada negativa debe ofrecer un paso siguiente". Estas restricciones no son objetivos naturales del clasificador. Son predicados sobre la respuesta, la conversación y la política del sistema, y deben ser legibles por un no ingeniero.
La representación honesta es un archivo declarativo. Una constitución vive en YAML junto al código, en el control de versiones, con un proceso de revisión separado.name, una predicate, una severity, y un explanationEl motor carga el archivo, evalúa cada regla en función de la salida de candidato y devuelve una estructura ViolationEl motor de reglas de esta piedra angular compone predicados conall_of¿ Qué ?any_of, y not_Así que una sola regla puede expresar "si la respuesta contiene código, debe terminar con un bloque ejecutable Y no hacer referencia a una biblioteca interna solamente".
La otra mitad de la lección es revisión. Un motor de reglas que sólo bloquea está a medio construir. Un motor de reglas que propone una corrección es operativamente útil: el asistente redacta una respuesta, el motor señala las violaciones, un fijactor produce una respuesta revisada y el motor confirma que la revisión cumple con las reglas. La lección presenta un fijaje mínimo (reemplazo de regex por regla) y una diferencia estructurada (adiciones, removiciones, modificaciones línea por línea) entre el borrador y el revisado.
Concepto
flowchart LR D[draft response] --> RE[rules engine] RE -->|violations| F[fixer] F --> R[revised response] R --> RE2[rules engine 2nd pass] RE2 -->|verdict| OUT[accepted or escalated] D -.->|diff| R
Una regla tiene la forma
yaml- name: end-with-runnable-or-assumption
severity: medium
applies_when:
contains_regex: '```python'
must:
any_of:
- ends_with_regex: '```\s*$'
- contains_regex: 'assumption:'
explanation: "Code responses must end in either a closing fence or an explicit assumption."
fix:
append_if_missing: "\n\nAssumption: example inputs are valid."Los predicados son atómicos:contains_regex¿ Qué ?not_contains_regex¿ Qué ?ends_with_regex¿ Qué ?starts_with_regex¿ Qué ?max_words¿ Qué ?min_wordsLas composiciones son:all_of¿ Qué ?any_of¿ Qué ?not_El motor evalúa .applies_whenEn primer lugar, si la regla no se aplica, la infracción se registra como not_applicableDe lo contrario , el motor evalúa .musty produce cualquiera de los dos.passo violation¿ Qué ?
Las gravedades sonlow¿ Qué ?medium¿ Qué ?highLa puerta de abajo (lección 87) trata de unahighviolación de la regla es lo mismo que una highVeredicto del clasificador: bloque.
El fijaje es una lista de operaciones declarativas: append_if_missing¿ Qué ?prepend_if_missing¿ Qué ?replace_regex. Cada operación mapea una regla por nombre a una transformación. El fijaje se limita intencionalmente a las modificaciones locales; las reescrituras estructurales pertenecen a una capa separada de rechazo y ayuda no cubierta aquí.
La diferencia se calcula con respecto al original y al revisado.Changeregistros con opLa puerta de entrada en el torrente puede registrar la diferencia para que un revisor humano audite el comportamiento del fijaje a lo largo del tiempo.
Construye el mismo
code/rules.ymlEl cargador en lacode/main.pyacepta un archivo YAML (cuando PyYAML está disponible) o un archivo JSON (construido).rules.ymlque la lección prueba el análisis por ambos caminos de código. code/main.pydefine el Enginey Fixerclases y una diffLa función de la composición se evalúa recursivamente con cortocircuito enany_of¿ Qué ?
La constitución en su forma enviada:
no-empty-refusal(medio) - el rechazo debe incluir una sugerencia o una redirecciónend-with-runnable-or-assumption(medio) - las respuestas de código deben cerrarse limpiamenteno-pii-in-examples(alto) - los datos de ejemplo no deben contener correos electrónicos o formas telefónicascite-when-asserting-fact(bajo) - las líneas que comienzan con "Según" deberán contener una cita entre paréntesisno-internal-library-leak(Alto) - las palabrasinternal-onlyypolicybot-internalno debe aparecer en la salidabounded-length(bajo) - las respuestas no podrán exceder de 800 palabras
Usalo
python3 main.pyLa demostración ejecuta tres respuestas de borrador a través del motor, imprime violaciones, ejecuta el corrector, imprime la diferencia y escribe outputs/rules_report.json. Una de las fijas tiene una regla no aplicable (no hay bloque de código en el proyecto), y el informe muestra not_applicablepara que el equipo vea que el motor lo evaluó explícitamente.
Envío
outputs/skill-constitutional-rules-engine.mddocumenta la gramática de las reglas y las operaciones del fijaje.
Los ejercicios
- Añade una regla que requiera que cada respuesta incluya la frase "Si esto es urgente" cuando el aviso menciona la seguridad.
- Reemplazar el fijactor de regex con un fijactor de plantillas que toma ranuras nombradas.
- Añadir un punto final de métricas que, dado un corpus de proyectos, devuelve la tasa de violación por regla para que el equipo pueda ver qué regla está sobre-disparando.
Términos clave
| Term | Common usage | Precise meaning |
|---|---|---|
| constitution | a vague policy doc | a YAML file of rules with predicates, severities, and explanations |
| predicate | a check | a callable from text to bool, atomic or composed via all_of/any_of/not_ |
| violation | a failure | a structured record with rule name, severity, explanation, and matched span |
| fixer | a model fine-tune | a deterministic per-rule transform mapping draft to revised |
| diff | a string compare | a structured list of add, remove, edit operations between draft and revised |
Leer más
La lección 87 compone este motor con el detector de entrada y el clasificador de salida en una única puerta de seguridad.
This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.
Browse the complete course catalog or open this lesson on GitHub.