Skip to main content

Structured Outputs

solve any problems

ForceLLM output JSON format and specified Schema

Old solutions

In the prompt,LLM is required to output the Output JSON format and the name and type of each field, for example

output in JSON object with follow fileds:
- name: string
- age: number
- isFemale: boolean

LangChain has a Parser that can help you generate prompt words.

Question 1

However,LLM still have a chance to output is not in JSON format, or the fields are not expected.

Later solutions

OpenAI's API introduces thejson_object Pattern, which can forceLLM to return JSON format.

Question 2

The fields returned byLLM may not be expected.

the latest solutions

OpenAI's Structured Outputs solution allows you to pass an explicit JSON Schema in the field of the API soLLM can output the specified format.

response_format: { "type": "json_schema", "json_schema": … , "strict": true }

You can specify the format in json_schema, for example:

{
type: "json_schema",
json_schema: {
name: "math_response",
schema: {
type: "object",
properties: {
steps: {
type: "array",
items: {
type: "object",
properties: {
explanation: { type: "string" },
output: { type: "string" }
},
required: ["explanation", "output"],
additionalProperties: false
}
},
final_answer: { type: "string" }
},
required: ["steps", "final_answer"],
additionalProperties: false
},
strict: true
}
}

In Node.js, you can use it more easily: Earth:

Define JSON Schema first

import { z } from "zod";
import { zodResponseFormat } from "openai/helpers/zod";

const Step = z.object({
explanation: z.string(),
output: z.string(),
});

const MathResponse = z.object({
steps: z.array(Step),
final_answer: z.string(),
});

Then put it in the response_format field

const completion = await openai.beta.chat.completions.parse({
model: "gpt-4o-mini",
messages: [
{ role: "system", content: "You are a helpful math tutor. Guide the user through the solution step by step." },
{ role: "user", content: "how can I solve 8x + 7 = -23" },
],
response_format: zodResponseFormat(MathResponse, "math_response"),
});

Earth convenient.

How to use it in LangChain

import { ChatOpenAI } from "@langchain/openai";
import { HumanMessage, SystemMessage } from "@langchain/core/messages";
import { StringOutputParser } from "@langchain/core/output_parsers";
import { z } from "zod";
import { zodResponseFormat } from "openai/helpers/zod";

export async function main() {
const CalendarEvent = z.object({
name: z.string(),
date: z.string(),
participants: z.array(z.string()),
});

const model = new ChatOpenAI({
model: "gpt-4o-mini",
// 在这里添加
modelKwargs: {
response_format: zodResponseFormat(CalendarEvent, "event"),
},
});
const messages = [
new SystemMessage("Extract the event information."),
new HumanMessage("我和小明参加婚礼"),
];
const parser = new StringOutputParser();

const chain = model.pipe(parser);
const resp = await chain.invoke(messages);
console.log(resp);
}

reference

official website