05/01/2025
Don’t Use JSON Schemas in Your LLM Prompts
Use them in the response_schema
instead, if your LLM supports it of course. :^)
After a long and costly battle with Gemini, I’m calling it quits. I’ve been trying to get a JSON response from Gemini’s flash
model for a while now. Most of the time, the JSON response was malformed (often beyond repair), and I had to manually fix it. This required extensive testing to identify where it broke and whether the breakage was consistent enough to address.
Thanks to my team lead, I found out that providing a JSON schema in the prompt was only one way to get a JSON response. The better approach was to create a custom class that represents the JSON response and use that class with the response_schema
parameter in the GenerationConfig
in Python. I guess tunnel vision got the best of me, and I hadn’t even considered this solution.
Here’s a simplified example:
class ComplexObject:
str
color: bool
is_cool:
class JSONResponse:
attributes: List[ComplexObject]
= genai.GenerationConfig(response_mime_type="application/json",
generation_config =JSONResponse)
response_schema
= genai.GenerativeModel("gemini-1.5-flash-latest",
gemini_model =generation_config)
generation_config
= """
payload You are a helpful assistant that outputs
random cool colors and numbers based on user input.
"""
= gemini_model.generate_content(payload) response
With this very simplified example, we can get a JSON response from Gemini without any errors—at least so far in my testing.
Nice Tip
If the order of attributes in the JSON response is important, you can add a prefix to the attribute names. For example, to switch the order of the colors
and is_cool
attributes in the JSON response, you can modify the attribute names like this:
class ComplexObject:
bool
a_is_cool: str b_color:
This may not seem like a huge deal, but if the LLM generates a response and is affected by its own prior output, this can be a lifesaver.