Estructura & salida
Aprende cómo usar esquemas estructurados de entrada y salida para recibir datos JSON confiables y analizables de un LLM.
Cuando estás escribiendo programas orientados a un LLM, quieres proporcionar entradas sin ambigüedades y obtener salidas sin ambigüedades.
Entrada estructurada
#Como entrada, un LLM puede recibir prácticamente cualquier cosa que puedas representar como texto. Eso incluye texto libre y texto semiestructurado como Markdown, pero también incluye formatos estructurados como CSV, JSON y XML. Si tienes datos con estructura, dale formato a los datos con esa estructura y el LLM te dará mejores resultados.
Además de la entrada de texto estructurado, también puedes pasar datos binarios, como imágenes o archivos PDF. En la muestra, la aplicación pasa las imágenes de captura de pantalla del crucigrama a Gemini para que infiera los datos de la cuadrícula:
final imageParts = <Part>[];
for (final image in images) {
final imageBytes = await image.readAsBytes();
final mimeType = lookupMimeType(image.path, headerBytes: imageBytes)!;
imageParts.add(InlineDataPart(mimeType, imageBytes));
}
final content = [
Content.multi([
TextPart(_crosswordPrompt),
...imageParts,
]),
];
final response = await _crosswordModel.generateContent(content);
...
Este código pasa el prompt y las imágenes a Gemini como parte de la misma solicitud.
Salida estructurada
#A un LLM le puede resultar más difícil generar una salida estructurada que procesar una entrada estructurada. Debes ser claro y minucioso al pedirle al modelo una salida en JSON para asegurarte de obtener algo que puedas analizar de manera confiable en tus aplicaciones.
Comienza por inicializar la instancia del modelo con tu formato de salida esperado:
// the schema for the clue solver output
static final _crosswordSchema = Schema(
SchemaType.object,
properties: {
'width': Schema(SchemaType.integer),
'height': Schema(SchemaType.integer),
'grid': Schema(
SchemaType.array,
items: Schema(
SchemaType.array,
items: Schema(
SchemaType.object,
properties: {
'color': Schema(SchemaType.string),
'clueNumber': Schema(SchemaType.integer, nullable: true),
},
),
),
),
'clues': Schema(
SchemaType.object,
properties: {
'across': Schema(
SchemaType.array,
items: Schema(
SchemaType.object,
properties: {
'number': Schema(SchemaType.integer),
'text': Schema(SchemaType.string),
},
),
),
'down': Schema(
SchemaType.array,
items: Schema(
SchemaType.object,
properties: {
'number': Schema(SchemaType.integer),
'text': Schema(SchemaType.string),
},
),
),
},
),
},
);
// The model for inferring crossword data from images.
_crosswordModel = FirebaseAI.googleAI().generativeModel(
model: 'gemini-2.5-pro',
generationConfig: GenerationConfig(
responseMimeType: 'application/json',
responseSchema: _crosswordSchema,
),
);
Y aunque esto podría ser suficiente, los resultados más confiables se obtienen cuando también especificas el esquema de salida en la instrucción del sistema:
final _crosswordPrompt =
'''
Analyze the following crossword puzzle images and return a JSON object
representing the grid size, contents, and clues. The images may contain
different parts of the same puzzle (e.g., the grid the across clues, the down
clues). Combine them to form a complete puzzle.
The JSON schema is as follows: ${jsonEncode(_crosswordSchema.toJson())}
'''
Ahora puedes analizar la respuesta de texto del modelo como JSON:
final response = await _crosswordModel.generateContent(content);
final json = jsonDecode(response.text!);
final width = json['width'] as int;
final height = json['height'] as int;
final gridData = json['grid'] as List;
final cluesData = json['clues'] as Map<String, dynamic>;
...
La salida de JSON confiable del modelo es lo que hace posible integrar la IA en tu aplicación. Los datos pueden o no ser correctos, pero estarán en un formato con el que tu aplicación pueda trabajar.
A menos que se indique lo contrario, la documentación en este sitio refleja Flutter 3.44.0. Página actualizada por última vez el 25-06-2026. Ver código fuente oreportar un problema.