Perbandingan output terstruktur di antara penyedia LLM populer - OpenAI, Gemini, Anthropic, Mistral, dan AWS Bedrock
API yang sedikit berbeda memerlukan pendekatan khusus.
Berikut adalah perbandingan dukungan sampingan untuk output terstruktur (mendapatkan JSON yang andal) di berbagai penyedia LLM populer, beserta contoh Python minimal
Kita sudah melihat bagaimana cara meminta output terstruktur dari LLM yang dihosting di Ollama. Di sini kita akan meninjau bagaimana cara meminta hal yang sama dari penyedia lain.
TL;DR matriks
Penyedia | Mode JSON “Bawaan” | Pemaksaan JSON Schema | Knob Tipeikal | Catatan |
---|---|---|---|---|
OpenAI | Ya | Ya (kelas satu) | response_format={"type":"json_schema", ...} |
Berfungsi melalui Responses API atau Chat Completions; juga dapat melakukan pemanggilan fungsi. |
Google Gemini | Ya | Ya (kelas satu) | response_schema= + response_mime_type="application/json" |
Mengembalikan JSON yang divalidasi secara ketat ketika skema diatur. |
Anthropic (Claude) | Tidak langsung | Ya (melalui Tool Use dengan JSON schema) | tools=[{input_schema=...}] + tool_choice |
Memaksa model untuk “memanggil” alat yang Anda definisikan dengan skema; menghasilkan argumen yang sesuai dengan skema. |
Mistral | Ya | Sebagian (hanya JSON; tidak ada skema server-side) | response_format={"type":"json_object"} |
Memastikan JSON, tetapi Anda memvalidasinya terhadap skema Anda secara klien-side. |
AWS Bedrock (platform) | Bervariasi per model | Ya (melalui Tool/Converse schema) | toolConfig.tools[].toolSpec.inputSchema |
API Converse Bedrock memvalidasi input alat terhadap skema JSON. |
Output Terstruktur LLM - Informasi Umum
Output terstruktur LLM merujuk pada kemampuan model bahasa besar (LLMs) untuk menghasilkan respons yang secara ketat mematuhi format atau struktur yang ditentukan sebelumnya, bukan menghasilkan teks bebas. Output terstruktur ini dapat berupa format seperti JSON, XML, tabel, atau template, sehingga data dapat dibaca oleh mesin, konsisten, dan mudah diparse oleh perangkat lunak untuk digunakan dalam berbagai aplikasi.
Output terstruktur berbeda dari output LLM tradisional, yang biasanya menghasilkan teks alami yang terbuka. Sebaliknya, output terstruktur memaksa skema atau format tertentu, seperti objek JSON dengan kunci dan jenis nilai yang didefinisikan, atau kelas tertentu dalam output (misalnya, jawaban pilihan ganda, kelas sentimen, atau format baris database). Pendekatan ini meningkatkan keandalan, mengurangi kesalahan dan halusinasi, serta menyederhanakan integrasi ke dalam sistem seperti database, API, atau alur kerja.
Penghasilan output terstruktur dalam LLM sering kali melibatkan teknik seperti:
- Menentukan instruksi prompt yang rinci untuk memandu model menghasilkan output dalam format yang diinginkan.
- Menggunakan alat validasi dan parsing seperti Pydantic dalam Python untuk memastikan output sesuai dengan skema.
- Terkadang memaksa pembatasan dekoding berdasarkan tata bahasa atau mesin keadaan akhir untuk memastikan kepatuhan tingkat token terhadap format.
Manfaat output terstruktur LLM meliputi:
- Membaca mesin dan kemudahan integrasi.
- Mengurangi variabilitas dan kesalahan.
- Meningkatkan prediktabilitas dan verifikasi untuk tugas yang memerlukan format data yang konsisten.
Tantangan meliputi desain skema yang efektif, penanganan data bersarang yang kompleks, dan potensi keterbatasan kemampuan penalaran dibandingkan dengan generasi teks bebas.
Secara keseluruhan, output terstruktur memungkinkan LLM lebih berguna dalam aplikasi yang memerlukan data yang tepat dan terformat, bukan hanya teks yang dapat dibaca manusia.
Contoh Python Output Terstruktur
Semua potongan kode mengekstrak informasi acara sebagai JSON: {judul, tanggal, lokasi}
. Ganti kunci/model sesuka Anda.
1) OpenAI — JSON Schema (ketat)
from openai import OpenAI
import json
client = OpenAI()
schema = {
"name": "Event",
"schema": {
"type": "object",
"properties": {
"title": {"type": "string"},
"date": {"type": "string", "description": "YYYY-MM-DD"},
"location": {"type": "string"}
},
"required": ["title", "date", "location"],
"additionalProperties": False
},
"strict": True
}
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "user", "content": "Ekstrak acara dari: 'PyData Sydney adalah pada 2025-11-03 di Darling Harbour.'"}
],
response_format={"type": "json_schema", "json_schema": schema},
)
data = json.loads(resp.choices[0].message.content)
print(data)
Fitur Output Terstruktur OpenAI memaksa skema ini di sisi server.
2) Google Gemini — skema respons + MIME JSON
import google.generativeai as genai
from google.genai import types
# Konfigurasi dengan API key Anda
# genai.configure(api_key="your-api-key")
schema = types.Schema(
type=types.Type.OBJECT,
properties={
"title": types.Schema(type=types.Type.STRING),
"date": types.Schema(type=types.Type.STRING),
"location": types.Schema(type=types.Type.STRING),
},
required=["title", "date", "location"],
additional_properties=False,
)
resp = genai.generate_content(
model="gemini-2.0-flash",
contents="Ekstrak acara dari: 'PyData Sydney adalah pada 2025-11-03 di Darling Harbour.'",
generation_config=genai.GenerationConfig(
response_mime_type="application/json",
response_schema=schema,
),
)
print(resp.text) # sudah valid JSON sesuai skema
Gemini akan mengembalikan JSON ketat yang sesuai dengan response_schema
.
3) Anthropic (Claude) — Penggunaan Alat dengan JSON schema
from anthropic import Anthropic
import json
client = Anthropic()
tool = {
"name": "extract_event",
"description": "Kembalikan detail acara.",
"input_schema": {
"type": "object",
"properties": {
"title": {"type": "string"},
"date": {"type": "string"},
"location": {"type": "string"}
},
"required": ["title", "date", "location"],
"additionalProperties": False
}
}
msg = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=256,
tools=[tool],
tool_choice={"type": "tool", "name": "extract_event"}, # paksa skema
messages=[{"role": "user", "content":
"Ekstrak acara dari: 'PyData Sydney adalah pada 2025-11-03 di Darling Harbour.'"}],
)
# Claude akan "memanggil" alat; ambil argumen (yang sesuai dengan skema Anda)
tool_use = next(b for b in msg.content if b.type == "tool_use")
print(json.dumps(tool_use.input, indent=2))
Claude tidak memiliki saklar “mode JSON” umum; sebaliknya, Penggunaan Alat dengan input_schema
memberi Anda argumen yang divalidasi dan sesuai dengan skema (dan Anda dapat memaksa penggunaannya).
4) Mistral — mode JSON (validasi sisi klien)
from mistralai import Mistral
import json
client = Mistral()
resp = client.chat.complete(
model="mistral-large-latest",
messages=[{"role":"user","content":
"Kembalikan JSON dengan kunci judul, tanggal (YYYY-MM-DD), lokasi untuk: "
"'PyData Sydney adalah pada 2025-11-03 di Darling Harbour.'"}],
response_format={"type": "json_object"} # memastikan JSON valid
)
data = json.loads(resp.choices[0].message.content)
print(data)
# Tips: validasi `data` terhadap skema Pydantic/JSON Anda secara lokal.
json_object
Mistral memaksa bentuk JSON (tidak skema yang tepat) — validasi sisi klien.
5) AWS Bedrock — API Converse Tool schema (model-agnostic)
import boto3, json
bedrock = boto3.client("bedrock-runtime", region_name="us-east-1")
model_id = "anthropic.claude-3-5-sonnet-20240620-v1:0"
tools = [{
"toolSpec": {
"name": "extract_event",
"inputSchema": {
"json": {
"type": "object",
"properties": {
"title": {"type": "string"},
"date": {"type": "string"},
"location": {"type": "string"}
},
"required": ["title","date","location"],
"additionalProperties": False
}
}
}
}]
resp = bedrock.converse(
modelId=model_id,
toolConfig={"tools": tools},
toolChoice={"tool": {"name": "extract_event"}}, # paksa skema
messages=[{"role":"user","content":[{"text":
"Ekstrak acara dari: 'PyData Sydney adalah pada 2025-11-03 di Darling Harbour.'"}]}],
)
# Ambil konten toolUse
tool_use = next(
c["toolUse"] for c in resp["output"]["message"]["content"] if "toolUse" in c
)
print(json.dumps(tool_use["input"], indent=2))
Bedrock memvalidasi input alat terhadap skema JSON Anda dan banyak model yang dihosting (misalnya, Claude) mendukungnya melalui Converse.
Panduan Praktis dan Validasi
- Jika Anda ingin jaminan sisi server terkuat: Output terstruktur OpenAI atau skema respons Gemini.
- Jika Anda sudah menggunakan Claude/Bedrock: definisikan Alat dengan skema JSON dan paksa penggunaannya; baca argumen alat sebagai objek bertipe Anda.
- Jika Anda menggunakan Mistral: aktifkan
json_object
dan validasi secara lokal (misalnya, dengan Pydantic).
Polanya validasi (berfungsi untuk semua penyedia)
from pydantic import BaseModel, ValidationError
class Event(BaseModel):
title: str
date: str
location: str
try:
event = Event.model_validate(data) # `data` dari penyedia apa pun
except ValidationError as e:
# handle / retry / minta model untuk memperbaiki dengan e.errors()
print(e)
Tautan yang Berguna
- https://platform.openai.com/docs/guides/structured-outputs
- https://ai.google.dev/gemini-api/docs/structured-output
- https://docs.mistral.ai/capabilities/structured-output/json_mode/
- https://aws.amazon.com/blogs/machine-learning/structured-data-response-with-amazon-bedrock-prompt-engineering-and-tool-use
- https://github.com/aws-samples/anthropic-on-aws/blob/main/complex-schema-tool-use/README.md
- https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html
- Cara Meminta Output Terstruktur dari LLM yang Dihosting di Ollama
- Cheat Sheet Python
- AWS SAM + AWS SQS + Python PowerTools
- Perbandingan Kinerja AWS Lambda: JavaScript vs Python vs Golang