Введение

Большие языковые модели (LLM) выводят текст в ответ на наши запросы. Хотя это обеспечивает удовлетворительное взаимодействие при общении с ними, это создает проблему, когда мы стремимся включить эти модели в наши приложения. Для беспрепятственной интеграции зачастую крайне важно иметь эти ответы в структурированном формате, который можно эффективно использовать и передавать в последующие процессы. Именно здесь на помощь приходит Pydantic, устраняющий разрыв между текстовыми ответами от LLM и структурированными входными данными, необходимыми нашим приложениям. Pydantic позволяет нам определить желаемую модель данных, в которую могут быть преобразованы выходные данные LLM. Таким образом, мы можем обеспечить структурированные, проверенные и, следовательно, более полезные ответы от наших LLM.

Запросите свой LLM с помощью подсказки

Чтобы получить ответ от нашего LLM с помощью подсказки, мы используем функцию ниже.

Давайте вызовем эту функцию со следующей подсказкой:

Погружение в моделирование Pydantic

Используя модели Pydantic, давайте создадим структурированный вывод для наших данных. Мы определяем модель CityResponse, которая фиксирует ключевые детали: название города, страну, в которой он находится, население и местную валюту. Затем мы объединяем эти города в модель Cities. Этот процесс помогает нам составить индивидуальный список городов с подробной спецификой и аккуратно упакованный для более глубокой обработки данных. Обязательно укажите описание для каждого поля, так как LangChain будет использовать его для генерации подсказки.

Используйте Langchain для настройки анализатора вывода Pydantic.

Далее мы воспользуемся PydanticOutputParser LangChain. Это помогает нам формировать выходные данные нашей языковой модели в соответствии с желаемым форматированием.

Инструкции формата служат основой для структурирования вывода нашей языковой модели. Эти инструкции устанавливают, что выходные данные должны соответствовать определенной схеме JSON. Они приводят несколько примеров, когда один экземпляр JSON правильно следует схеме — объект с ключом «foo» и значением массива, а другой экземпляр не соответствует схеме.

Запросите свой LLM и получите структурированный ответ

Двигаясь дальше, давайте воспользуемся PromptTemplate из LangChain для настройки структурированного ввода в нашу языковую модель. Как только приглашение будет настроено, мы передадим его в LLM и получим ответ. Мы видим, что ответ хорошо сформирован, как мы указали в верхних разделах.

Добавить собственную логику проверки

Кроме того, мы можем использовать логику проверки моделей Pydantic для каждого поля. Этот дополнительный уровень проверки гарантирует, что каждый ответ LLM точно соответствует нашим заранее определенным стандартам. Например, давайте рассмотрим требование к написанию названий городов заглавными буквами. Чтобы реализовать это, мы воспользуемся декоратором validator и встроим нашу условную логику в метод класса validate_cities. Получив ответ от LLM, мы можем оценить его соответствие установленным нами критериям.

Когда мы анализируем ответ, Pydantic проверяет значения поля city_name. Стамбул не является строкой в ​​верхнем регистре, как мы указали. Итак, мы получаем следующую ошибку:

OutputParserException: Failed to parse Cities from completion {
  "cities": [
    {
      "city_name": "Istanbul",
      "country": "Turkey",
      "population_number": 15030000,
      "local_currency": "Turkish lira"
    },
    {
      "city_name": "Moscow",
      "country": "Russia",
      "population_number": 12615000,
      "local_currency": "Russian ruble"
    },
    {
      "city_name": "London",
      "country": "United Kingdom",
      "population_number": 8908000,
      "local_currency": "Pound sterling"
    }
  ]
}. Got: 1 validation error for Cities
cities
  City name 'Istanbul' is not uppercase (type=value_error)

Заключение

В заключение отметим, что использование моделей Pydantic, PromptTemplate и PydanticOutputParser из LangChain в нашем коде Python представляет собой бесценный подход к получению хорошо структурированных и высокоспецифичных данных из больших языковых моделей. Такой подход не только оптимизирует сложный процесс работы с неструктурированными результатами, но и позволяет нам поддерживать высокий уровень качества данных, гарантируя полное соответствие нашим требованиям и спецификациям.