A veces necesitamos LLM (modelos de idiomas grandes) para producir información estructural en lugar de lenguaje natural. La forma más fácil es usar JSON.
Pero antes de recibir el último token de respuesta, el JSON está roto, lo que significa que no puede usar JSON.parse para decodificarlo. Pero aún queremos transmitir los datos al usuario.
Aquí viene partial-json-parser , una biblioteca liviana y personalizable para analizar las cuerdas JSON parciales. Aquí hay una demostración.
(Tenga en cuenta que también hay una implementación de JavaScript)
pip install partial-json-parser # or poetry / pdm / uv partial-json-parser se implementa puramente en Python, con buenos pistas de tipo. Es dependencia cero y funciona con Python 3.6+.
Puede instalar Ejecutar su Playground de demostración instalando rich también o:
pip install partial-json-parser[playground] Luego ejecute el json-playground en su terminal, y puede probar el analizador de manera interactiva.
from partial_json_parser import loads
> >> loads ( '{"key": "v' ) # {'key': 'v'} Alternativamente, puede usar ensure_json para obtener la cadena JSON completa:
from partial_json_parser import ensure_json
> >> ensure_json ( '{"key": "v' ) # '{"key": "v"}' Puede importar la función loads y el objeto Allow en la biblioteca así:
from partial_json_parser import loads , Allow El objeto Allow es solo una enumación para las opciones. Determina qué tipos pueden ser parciales. Los tipos no incluidos en allow solo aparecen después de que se puede garantizar su finalización.
La función loads funciona al igual que el json.loads incorporado. Cargas al analizar una cadena JSON completa:
result = loads ( '{"key":"value"}' )
print ( result ) # Outputs: {'key': 'value'} Puede analizar una cadena JSON parcial pasando un parámetro adicional a la función loads . Este parámetro es un bitwise o de las constantes desde el indicador Allow :
(Tenga en cuenta que puede importar directamente las constantes que necesita de partial-json-parser )
from partial_json_parser import loads , Allow , STR , OBJ
result = loads ( '{"key": "v' , STR | OBJ )
print ( result ) # Outputs: {'key': 'v'} En este ejemplo, Allow.STR le dice al analizador que está bien si una cadena está incompleta, y Allow.OBJ le dice al analizador así como un dict. El analizador luego intenta devolver tantos datos como pueda.
Si no permite cadenas parciales, no agregará "key" al objeto porque "v no está cerca:
result = loads ( '{"key": "v' , OBJ )
print ( result ) # Outputs: {}
result = loads ( '{"key": "value"' , OBJ )
print ( result ) # Outputs: {'key': 'value'}Similitud, puede analizar listas parciales o incluso valores especiales parciales si lo permite:
(Tenga en cuenta que allow que los valores predeterminados lo Allow.ALL .
result = loads ( '[ {"key1": "value1", "key2": [ "value2' )
print ( result ) # Outputs: [{'key1': 'value1', 'key2': ['value2']}]
result = loads ( "-Inf" )
print ( result ) # Outputs: -inf Si la cadena JSON está malformada, la función parse lanzará un error:
loads ( "wrong" ) # MalformedJSON: Malformed node or string on line 1 json_string <string> : la cadena JSON (incomplete) para analizar.allow_partial <Allow | int> : especifique qué tipo de parcialidad está permitida durante el análisis JSON (predeterminado: Allow.ALL ).parser (str) -> JSON : un analizador JSON ordinario. El valor predeterminado es json.loads . Complete la cadena JSON y análisis con la función parser .
Devuelve el valor de Python analizado.
Alias: decode , parse_json .
json_string <string> : la cadena JSON (incomplete) para completar.allow_partial <Allow | int> : especifique qué tipo de parcialidad está permitida durante el análisis JSON (predeterminado: Allow.ALL ).Devuelve la cadena JSON completa.
json_string <string> : la cadena JSON (incomplete) para completar.allow_partial <Allow | int> : especifique qué tipo de parcialidad está permitida durante el análisis JSON (predeterminado: Allow.ALL ).Devuelve una tupla de una porción de la cadena de entrada y la finalización.
Tenga en cuenta que esta es una API de bajo nivel, solo útil para la depuración y la demostración.
Clase de enum que especifica qué tipo de parcialidad está permitida durante el análisis JSON. Tiene los siguientes miembros:
STR : Permitir cadena parcial.NUM : Permitir el número parcial.ARR : Permitir una matriz parcial.OBJ : Permitir objeto parcial.NULL : Permitir nulo parcial.BOOL : Permitir booleano parcial.NAN : Permitir nan parcial.INFINITY : Permitir el infinito parcial._INFINITY : permita la infinidad parcial.INF : Permitir tanto el infinito y la infinidad parciales.SPECIAL : Permitir todos los valores especiales.ATOM : Permitir todos los valores atómicos.COLLECTION : Permitir todos los valores de colección.ALL : Permitir todos los valores. Para ejecutar las pruebas para esta biblioteca, debe clonar el repositorio e instalar las dependencias:
git clone https://github.com/promplate/partial-json-parser.git
cd partial-json-parser
pdm installLuego, puede ejecutar las pruebas usando hipótesis y pytest:
pdm testTenga en cuenta que si bien nos esforzamos por cubrir tantos casos de borde como sea posible, siempre es posible que algunos casos no estén cubiertos.
Este proyecto tiene licencia bajo la licencia MIT.