Output parsers: структурированный вывод

Урок о том, как превратить свободный текст модели в предсказуемую структуру данных.

Output parser — компонент, который преобразует текстовый ответ модели в нужный тип данных (строку, список, JSON, объект).

Зачем парсить вывод

Модель возвращает текст, а приложению нужны данные: словарь, число, список. Если разбирать ответ регулярками вручную, любая вольность модели ломает код. Парсер решает две задачи: подсказывает модели нужный формат (через инструкции в промпте) и разбирает ответ в структуру, проверяя его корректность.

Виды парсеров

  • StrOutputParser — просто вытаскивает текст из AIMessage.
  • JsonOutputParser — разбирает ответ как JSON.
  • PydanticOutputParser — валидирует ответ по схеме Pydantic-модели.
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import JsonOutputParser
from langchain_openai import ChatOpenAI

parser = JsonOutputParser()
prompt = ChatPromptTemplate.from_template(
    "Извлеки поля name и city. {format_instructions}\nТекст: {text}"
)
chain = prompt | ChatOpenAI(model="gpt-4o-mini") | parser
result = chain.invoke({
    "text": "Меня зовут Аня, я из Казани",
    "format_instructions": parser.get_format_instructions(),
})
print(result["city"])

Разбор JSON-ответа в Python-словарь — это обычный json.loads:

import json

raw = '{"name": "Аня", "city": "Казань"}'
data = json.loads(raw)
print(data["name"], "из", data["city"])

Вывод:

Аня из Казань

Как работает под капотом

У парсера два метода. get_format_instructions() возвращает текст вроде «верни валидный JSON с полями…», который вы вставляете в промпт — так модель узнаёт формат. Второй метод вызывается в конце цепочки: он берёт текст ответа и парсит его. Если модель вернула невалидный JSON, парсер бросит ошибку — это сигнал ужесточить промпт или добавить retry. Pydantic-парсер вдобавок проверяет типы и обязательные поля, поэтому даёт самую строгую гарантию структуры.

Частые ошибки

  • Не вставить format_instructions в промпт. Тогда модель не знает, какой формат от неё ждут, и парсер падает.
  • Лишний текст вокруг JSON. Модель любит добавлять «Вот ваш JSON:» — просите вернуть только структуру.
  • Считать парсер гарантией. Он проверяет формат, но не истинность данных; модель может выдумать значения.

Итог

  • Парсер превращает текст ответа в структуру и подсказывает модели формат.
  • Есть StrOutputParser, JsonOutputParser, PydanticOutputParser (самый строгий).
  • В промпт обязательно вставляют format_instructions.
  • Парсер проверяет формат, но не истинность данных.
Проверьте себя
1. Для чего нужен output parser?
AЧтобы ускорить модель
BЧтобы превратить текстовый ответ в структуру и задать модели формат
CЧтобы хранить историю диалога
DЧтобы искать документы в базе
2. Что обязательно вставить в промпт при использовании JSON/Pydantic-парсера?
AТемпературу
Bformat_instructions из парсера
CКлюч API
DИсторию диалога
3. Что НЕ гарантирует парсер вывода?
AЧто ответ соответствует ожидаемому формату
BЧто данные в ответе истинны и не выдуманы моделью
CЧто JSON валиден
DЧто типы полей совпадают со схемой (Pydantic)