Json Correctness
The json correctness metric measures whether your LLM application is able to generate actual_outputs with the correct json schema.
Required Arguments
To use the JsonCorrectnessMetric, you'll have to provide the following arguments when creating an LLMTestCase:
inputactual_output
Read the How Is It Calculated section below to learn how test case parameters are used for metric calculation.
Usage
First define your schema by creating a pydantic BaseModel:
from pydantic import BaseModel
class ExampleSchema(BaseModel):
name: strThen supply it as the expected_schema when creating a JsonCorrectnessMetric, which can be used for end-to-end evaluation:
from deepeval import evaluate
from deepeval.metrics import JsonCorrectnessMetric
from deepeval.test_case import LLMTestCase
metric = JsonCorrectnessMetric(
expected_schema=ExampleSchema,
model="gpt-4",
include_reason=True
)
test_case = LLMTestCase(
input="Output me a random Json with the 'name' key",
# Replace this with the actual output from your LLM application
actual_output="{'name': null}"
)
# To run metric as a standalone
# metric.measure(test_case)
# print(metric.score, metric.reason)
evaluate(test_cases=[test_case], metrics=[metric])There are ONE mandatory and SEVEN optional parameters when creating an PromptAlignmentMetric:
expected_schema: apydanticBaseModelspecifying the schema of the Json that is expected from your LLM.- [Optional]
threshold: a float representing the minimum passing threshold. Can also be set toNoneto run the metric in score-only mode. Defaulted to0.5. - [Optional]
model: a string specifying which of OpenAI's GPT models to use to generate reasons, OR any custom LLM model of typeDeepEvalBaseLLM. Defaulted togpt-5.4. - [Optional]
include_reason: a boolean which when set toTrue, will include a reason for its evaluation score. Defaulted toTrue. - [Optional]
strict_mode: a boolean which when set toTrue, enforces a binary metric score: 1 for perfection, 0 otherwise. It also overrides the current threshold and sets it to 1. Defaulted toFalse. - [Optional]
async_mode: a boolean which when set toTrue, enables concurrent execution within themeasure()method. Defaulted toTrue. - [Optional]
verbose_mode: a boolean which when set toTrue, prints the intermediate steps used to calculate said metric to the console, as outlined in the How Is It Calculated section. Defaulted toFalse. - [Optional]
flaky: a boolean which when set toTrue, marks the metric as flaky. Defaulted toFalse.
Within components
You can also run the JsonCorrectnessMetric within nested components for component-level evaluation.
from deepeval.dataset import Golden
from deepeval.tracing import observe, update_current_span
...
@observe(metrics=[metric])
def inner_component():
# Set test case at runtime
test_case = LLMTestCase(input="...", actual_output="...")
update_current_span(test_case=test_case)
return
@observe
def llm_app(input: str):
# Component can be anything from an LLM call, retrieval, agent, tool use, etc.
inner_component()
return
evaluate(observed_callback=llm_app, goldens=[Golden(input="Hi!")])As a standalone
You can also run the JsonCorrectnessMetric on a single test case as a standalone, one-off execution.
...
metric.measure(test_case)
print(metric.score, metric.reason)How Is It Calculated?
The PromptAlignmentMetric score is calculated according to the following equation:
The JsonCorrectnessMetric does not use an LLM for evaluation and instead uses the provided expected_schema to determine whether the actual_output can be loaded into the schema.
FAQs
Why do I still need to pass a model if the metric is deterministic?
actual_output loads into your expected_schema. The model only generates the reason on invalid schemas when include_reason is True; set include_reason=False to skip it.Does scoring cost money or call an LLM?
include_reason is True.How do I validate an output that's a list of JSON objects?
pydantic BaseModel in a RootModel — e.g. class ExampleSchemaList(RootModel[List[ExampleSchema]]) — and pass it as the expected_schema.