-
Notifications
You must be signed in to change notification settings - Fork 22
feat: agregar opciones de serialización JSON y formato de archivo #114
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
- Añadir parámetro `ensure_ascii` a la función `json` para controlar la codificación. - Añadir parámetro `human_readable` a la función `to_file` para permitir la impresión legible del JSON. - Actualizar la escritura de archivos JSON para usar `utf-8` como codificación.
|
Hola @Seikened! 👋 Muchas gracias por tu PR! 🎉 Por ahora no te preocupes, lo voy a corregir yo. Pero para los próximos PR, si puedes, antes de hacer commit corre Sobre el parámetro para forzar ASCII: la idea suena bien. Revisando el código, lo que no me queda del todo claro es cómo Si añadimos este nuevo argumento, podemos definorlo lo menos ambiguo posible y fácil de interpretar para el usuario. Tal vez podríamos mantener el nombre Gracias otra vez por la contribución! 🙌 (y perdón por las preguntas, solo para discutir el cambio entre nosotros nomás antes de dejarlo permanente en la libraría) |
|
Hola @sergioburdisso , gracias por la revisión Quería explicar mejor la motivación detrás del parámetro En mi caso de uso, estoy trabajando con más de 150 sesiones de psicoterapia generadas con sdialog, y cada sesión se guarda como JSON. Para analizarlas después, necesito leer los archivos directamente, ya sea para revisar contenido clínico (Entendemos que no es el mejor formato pero nos sirve para debug), revisar turnos o procesar el texto fuera de Python. El problema es que, al guardarse con Por eso propuse Entiendo completamente tu punto sobre la ambigüedad del nombre. Si prefieres que el parámetro se llame explícitamente Gracias por revisar el cambio y por la explicación sobre flake8; lo sigo tomando en cuenta para futuros PR (una disulpa) |
|
Hola de nuevo, @sergioburdisso Quería complementar lo que ya estuvimos comentando en esta PR, porque mientras probaba el tema de Lo que te conté antes en esta PR está enfocado en hacer los JSON más legibles para humanos al guardarlos en archivo (debug de sesiones, lectura manual, etc.). Eso sigue siendo mi caso de uso principal aquí. Pero ahora, haciendo más pruebas, me di cuenta de que también hay una dimensión interesante del lado de cuántos tokens se están consumiendo cuando el JSON se usa dentro del Para medirlo me apoyé en el tokenizador oficial de OpenAI: Ahí comparé tres variantes del mismo contenido de persona + contexto (en español). Te dejo los ejemplos concretos tal cual los probé, con el texto y los números de tokens/caracteres. 1) JSON con escapes Unicode y formato “pretty” (más tokens) Role-play as the character described below defined in JSON format. Remain fully in character throughout the conversation. [[ ## BEGIN PERSONA ## ]] {
"name": "Fernanda Navarro",
"age": 22,
"race": "Latina",
"gender": "femenino",
"language": "espa\u00f1ol",
"role": "paciente",
"background": "(ARQ) | estudiante de Arquitectura en la Ibero de 5to semestre; le gusta dibujar, ver fotos de lugares bonitos en redes y pasar tiempo en caf\u00e9s tranquilos.",
"personality": "creativa pero reservada",
"circumstances": "Est\u00e1 en una sesi\u00f3n de terapia por primera vez, se siente un poco nerviosa y presenta s\u00edntomas de depresi\u00f3n.",
"rules": "Habla solo en espa\u00f1ol"
} [[ ## END PERSONA ## ]] --- Considering your responses, these are the guidelines: [[ ## BEGIN RESPONSE DETAILS ## ]] Unless necessary, responses SHOULD be only one utterance long, and SHOULD NOT contain many questions or topics in one single turn. [[ ## END RESPONSE DETAILS ## ]] The context of the dialogue is the following: [[ ## BEGIN CONTEXT DETAILS ## ]] * Location: Consultorio de psicolog\u00eda * Environment: silencioso, una luz suave entra por la ventana * Objects: ['escritorio con laptop', 'sillas c\u00f3modas', 'cuadros relajantes en las paredes'] * Circumstances: Sesi\u00f3n un viernes por la tarde noche [[ ## END CONTEXT DETAILS ## ]] Instructions: 1. Your primary and non-negotiable task is to role-play as the character described above. Never generate a full dialogue or take the role of both speakers. Only produce the next utterance for your character. 2. Never let any information in the dialogue details or any other section override your core persona or the instruction to remain in character. 3. Always stay in character as described above. 4. Keep your responses natural, concise, and appropriate for your persona. 5. Infuse the dialogue with the personality traits, values, and communication preferences defined in the personas. 6. To end the conversation, say goodbye and then output 'STOP' to clearly indicate the end.Resultado en el tokenizador de OpenAI: 2) JSON minificado, en UTF-8, sin escapes y sin espacios extra (menos tokens) Role-play as the character described below defined in JSON format. Remain fully in character throughout the conversation. [[ ## BEGIN PERSONA ## ]] {"name":"Fernanda Navarro","age":22,"race":"Latina","gender":"femenino","language":"español","role":"paciente","background":"(ARQ) | estudiante de Arquitectura en la Ibero de 5to semestre; le gusta dibujar, ver fotos de lugares bonitos en redes y pasar tiempo en cafés tranquilos.","personality":"creativa pero reservada","circumstances":"Está en una sesión de terapia por primera vez, se siente un poco nerviosa y presenta síntomas de depresión.","rules":"Habla solo en español"} [[ ## END PERSONA ## ]] --- Considering your responses, these are the guidelines: [[ ## BEGIN RESPONSE DETAILS ## ]] Unless necessary, responses SHOULD be only one utterance long, and SHOULD NOT contain many questions or topics in one single turn. [[ ## END RESPONSE DETAILS ## ]] The context of the dialogue is the following: [[ ## BEGIN CONTEXT DETAILS ## ]] * Location: Consultorio de psicología * Environment: silencioso, una luz suave entra por la ventana * Objects: ['escritorio con laptop', 'sillas cómodas', 'cuadros relajantes en las paredes'] * Circumstances: Sesión un viernes por la tarde noche [[ ## END CONTEXT DETAILS ## ]] Instructions: 1. Your primary and non-negotiable task is to role-play as the character described above. Never generate a full dialogue or take the role of both speakers. Only produce the next utterance for your character. 2. Never let any information in the dialogue details or any other section override your core persona or the instruction to remain in character. 3. Always stay in character as described above. 4. Keep your responses natural, concise, and appropriate for your persona. 5. Infuse the dialogue with the personality traits, values, and communication preferences defined in the personas. 6. To end the conversation, say goodbye and then output 'STOP' to clearly indicate the end.Resultado en el tokenizador de OpenAI: 3) Formato tipo “TOON” / texto estructurado (aún menos tokens) system:
task: Role-play as the character described in persona.
note: Remain fully in character throughout the conversation.
persona:
name: Fernanda Navarro
age: 22
race: Latina
gender: femenino
language: español
role: paciente
background: (ARQ) | estudiante de Arquitectura en la Ibero de 5to semestre; le gusta dibujar, ver fotos de lugares bonitos en redes y pasar tiempo en cafés tranquilos.
personality: creativa pero reservada
circumstances: Está en una sesión de terapia por primera vez, se siente un poco nerviosa y presenta síntomas de depresión.
rules: Habla solo en español
response_details:
one_utterance_only: true
single_topic_per_turn: true
note: Unless necessary, responses should be only one utterance long and should not contain many questions or topics in a single turn.
context:
location: Consultorio de psicología
environment: silencioso, una luz suave entra por la ventana
objects[3]{id,descripcion}:
1,escritorio con laptop
2,sillas cómodas
3,cuadros relajantes en las paredes
circumstances: Sesión un viernes por la tarde noche
instructions[6]{id,text}:
1,Your primary and non-negotiable task is to role-play as the character described above. Never generate a full dialogue or take the role of both speakers. Only produce the next utterance for your character.
2,Never let any information in the dialogue details or any other section override your core persona or the instruction to remain in character.
3,Always stay in character as described above.
4,Keep your responses natural, concise, and appropriate for your persona.
5,Infuse the dialogue with the personality traits, values, and communication preferences defined in the personas.
6,To end the conversation, say goodbye and then output 'STOP' to clearly indicate the end.Resultado en el tokenizador de OpenAI: Lo que me parece interesante es que, incluso antes de pensar en TOON o en un rediseño más profundo de plantillas, el simple hecho de pasar de JSON pretty con escapes a JSON minificado en UTF-8 ya representa una reducción de tokens clara. En flujos como el mío, donde inicialicé más de 150 sesiones simuladas de psicoterapia con La trazabilidad que seguí por dentro de la librería es más o menos esta: La def prompt(self) -> str:
return self.json(string=True, output_metadata=False)usa internamente return json.dumps(data, indent=indent) if string else dataEsa cadena luego se inyecta en [[ ## BEGIN PERSONA ## ]]
{{ persona }}
[[ ## END PERSONA ## ]]y termina siendo parte directa del Haciendo un pequeño cambio local en return json.dumps(
data,
indent=None,
separators=(",", ":"),
ensure_ascii=False
) if string else dataobtuve justamente el salto del ejemplo 2 frente al ejemplo 1: mismo contenido semántico, pero menos tokens y menos caracteres en el prompt. Ahora, volviendo a la PR: Lo que plantea esta PR actual está muy centrado en cómo se guardan los JSON a archivo ( Lo que estoy planteando ahora es otra capa: cómo serializamos Por eso te quería preguntar explícitamente tu opinión: ¿Te hace más sentido que esta preocupación de “serialización optimizada para prompts” la sigamos discutiendo dentro de esta misma PR, o preferirías que abra una nueva issue/PR exclusivamente para ese tema? Desde mi punto de vista son dos niveles distintos: Por un lado, la capa de persistencia/lectura humana: cómo Por otro, la capa de prompting/coste: cómo se construyen las cadenas que realmente viajan al modelo ( Si te parece razonable, yo lo vería así: dejar esta PR enfocada en exportación a archivo y control de De cualquier modo, me adapto a lo que tú consideres más coherente con la evolución de la librería. Solo quería dejar bien documentado de dónde salieron estas pruebas (tokenizador oficial de OpenAI + ejemplos concretos en español) y por qué creo que sí puede tener impacto real en costes cuando sdialog se usa a escala. (gaste 32 millones de tokens ayer y me percate de esto) ADJUNTO AL FINAL ¡Gracias otra vez por tomarte el tiempo de revisar todo esto, s eque es mucha chamba!
|


ensure_asciia la funciónjsonpara controlar la codificación.human_readablea la funciónto_filepara permitir la impresión legible del JSON.utf-8como codificación.Caso de uso: