Guías
De cero a un veredicto sobre su propia aplicación
Tiene una función de Python que responde preguntas y quiere saber si es lo bastante buena para publicarla. Tres comandos le llevan de esa función a una decisión de publicación, sin YAML escrito a mano: oloproof init --system escribe el proyecto alrededor de su función, oloproof check dice si funcionará antes de gastar nada, y oloproof run decide. Todo se ejecuta en su máquina, sin cuenta y sin llamadas a modelos.
Cada salida de abajo proviene de ejecutar estos comandos sobre la función mostrada.
1. Su función
Cualquier función que reciba un caso y devuelva una respuesta. Esta es bot.py, con un módulo auxiliar que importa:
from prompts import GREETING
def answer(question):
text = question.lower()
if "refund" in text:
reply = "Refunds are available within 30 days of purchase."
elif "ship" in text:
reply = "We ship to the US and Canada."
else:
reply = "A support agent will follow up within one business day."
return {"reply": f"{GREETING} {reply}", "topic": "support"}2. Escribir el proyecto alrededor de ella
Desde el directorio que contiene bot.py:
oloproof init --system bot:answerInitialized Oloproof project in . around bot:answer
Each case's input is a string, read from the function's first parameter.
Fill in before a run means anything:
data/cases.jsonl 3 placeholder cases: give each a real input and, as its expected
phrase, words a right answer contains. Add more: see below.
oloproof.yaml the check reads the whole answer; if your function returns an
object, add `field:` naming the key that holds the text.
release.yaml a placeholder bar of 0.80; set the one your release needs.
What this suite can decide, if every case is measured:
mentions-floor (mentions_expected at least 0.8, 3 cases):
1 or more pass: INSUFFICIENT_EVIDENCE (not established yet); 0: FAIL
(ruled out). With 50 cases, PASS from 46; with 100, from 89.
Next: oloproof check, then oloproof runLa referencia se importa primero, y no se escribe nada a menos que se resuelva en una función; un error en su módulo se detiene aquí con su archivo y su línea. La función no se llama. Aparecen tres archivos: oloproof.yaml (su función y una comprobación), data/cases.jsonl (tres casos provisionales) y release.yaml (el umbral). La entrada del caso es una cadena porque el primer parámetro se llama question; un parámetro llamado case, inputs, row o anotado como dict recibe en cambio un objeto.
La comprobación es contains: un caso pasa cuando la respuesta contiene la frase esperada del caso. Es una comprobación determinista, así que no necesita medirse frente a personas antes de poder decidir. La guía de suites enumera todas las demás comprobaciones y jueces.
3. Rellenar los casos
Sustituya los casos provisionales por preguntas reales y las palabras que contiene una respuesta correcta, un caso por línea:
{"id": "refund_01", "input": "Can I get a refund?", "expected": {"phrase": "30 days"}}
{"id": "ship_01", "input": "Do you ship to Canada?", "expected": {"phrase": "US and Canada"}}
{"id": "other_01", "input": "My order is late", "expected": {"phrase": "follow up"}}Tres casos no pueden superar un umbral de 0.80, como dice la tabla de arriba: con tres, la mejor respuesta es INSUFFICIENT_EVIDENCE. La ejecución de abajo usa 30 casos como estos, diez por tema, donde basta con que pasen 29.
4. Comprobar antes de ejecutar
oloproof checkAntes de definir el campo, decía:
ok System: callable bot:answer imports.
ok Called on case refund_01: it answered {"reply": "Thanks for writing in. Refunds are available within 30 days of purchase.", "topic": "support"}
Evaluators on that answer (one case, not a result):
ok mentions_expected (contains) can read the answer; it passed this case.
note It reads the whole answer object; `field:` can name one of reply, topic.Así que añada field: reply bajo la comprobación en oloproof.yaml y vuelva a comprobar:
ok System: callable bot:answer imports.
ok Called on case refund_01: it answered {"reply": "Thanks for writing in. Refunds are available within 30 days of purchase.", "topic": "support"}
Evaluators on that answer (one case, not a result):
ok mentions_expected (contains) can read the answer; it passed this case.
Code: the system's version hashes bot.py, prompts.py. Edit one and the next run calls the system again.
What this suite can decide, if every case is measured:
mentions-floor (mentions_expected at least 0.8, 30 cases):
29 or 30 pass: PASS (established); 19 to 28: INSUFFICIENT_EVIDENCE (not
established yet); 18 or fewer: FAIL (ruled out). With 50 cases, PASS from
46; with 100, from 89.
CI: no model key is needed for the evaluators. Keys your own function reads are not checked here.
Ready. Next: oloproof runLo que significa cada parte:
- Importa y responde: El sistema se construye exactamente como lo construye oloproof run, y se llama sobre el primer caso (--case ID elige otro, --no-call omite la llamada). Si lanza una excepción, la línea nombra el error y el archivo y la línea de su código.
- Evaluadores: Cada comprobación que no necesita modelo se ejecuta sobre esa única respuesta. Un campo que no encuentra se nombra junto con los campos que tiene la respuesta. Un aprobado o un fallo aquí es un caso, no un resultado. check nunca llama a un juez basado en modelo; lo dice, y una ejecución lo llama.
- Código: Los archivos cuyo contenido es la versión del sistema: su módulo y los módulos del proyecto que importa, más cualquier system.code_paths. Un archivo del proyecto cargado al importar o llamar al sistema que no esté entre ellos (un módulo importado por nombre en tiempo de ejecución, por ejemplo) se lista como no hasheado: añádalo a code_paths, o un cambio en él reutiliza respuestas obsoletas.
- Lo que puede decidir: La misma tabla que oloproof plan. Sin un release.yaml, dice que una ejecución responde con palabras sencillas y no decide nada.
- CI: Cada modelo que llama el proyecto y el secreto que necesita un job de CI para él, ANTHROPIC_API_KEY u OPENAI_API_KEY salvo que api_key_env nombre otro, y ninguno para un servidor en esta máquina.
check no almacena nada. Sale con 2 cuando hay algo que corregir y con 0 en caso contrario, y oloproof check --json imprime los mismos hallazgos como un único documento.
5. Ejecutarlo
oloproof runGate: ALLOW (exit 0)
mentions-floor:
100.0%, range 88.4% to 100.0% (exact binomial interval); 30 of 30 casesEl informe de la ejecución es más largo; estos son su veredicto y la línea de la regla. Los 30 casos pasaron, y el rango al que se sujeta la tasa empieza en 88,4 %, por encima del umbral de 0.80, así que la regla dice PASS y la puerta permite la publicación. oloproof inspect latest lo vuelve a leer.
Siguiente
- Añada la puerta a los pull requests: oloproof init --ci github escribe el workflow junto a este proyecto (guía de CI).
- Cambie la comprobación por un juez cuando una frase no pueda decir qué es una respuesta correcta (guía de jueces); oloproof check nombra entonces la clave que necesita la CI.
- ¿Ya tiene respuestas en un archivo en lugar de una función? oloproof eval answers.jsonl las comprueba sin ningún proyecto.