Въведение

Големите езикови модели (LLM) извеждат текст в отговор на нашите подкани. Въпреки че това осигурява задоволително взаимодействие при чат с тях, това представлява предизвикателство, когато се стремим да включим тези модели в нашите приложения. За безпроблемна интеграция често е от решаващо значение тези отговори да са в структуриран формат, който може да се използва ефективно и да се препраща към последващи процеси. Това е мястото, където Pydantic идва на помощ, преодолявайки празнината между текстовите отговори от LLM и структурирания вход, от който се нуждаят нашите приложения. Pydantic ни позволява да дефинираме желан модел на данни, в който изходът от LLM може да бъде прехвърлен. По този начин можем да осигурим структурирани, валидирани и следователно по-полезни отговори от нашите LLM.

Заявете своя LLM с подкана

За да получим отговор от нашия LLM чрез подкана, ние използваме функцията по-долу.

Нека извикаме тази функция със следната подкана:

Гмуркане в пидантичното моделиране

Използвайки Pydantic модели, нека създадем структуриран изход за нашите данни. Ние дефинираме CityResponse модел, който улавя ключови подробности - име на град, държава, в която се намира, население и местна валута. След това обединяваме тези градове в модел Cities. Този процес ни помага да изготвим персонализиран списък с градове, със специфики и спретнато пакетирани за проницателна обработка на данни. Важно е да предоставите описание за всяко поле, тъй като LangChain ще ги използва за генериране на подкана.

Използвайте Langchain, за да настроите Pydantic Output Parser

След това ще използваме „PydanticOutputParser“ на LangChain. Това ни помага да оформим изхода на нашия езиков модел, за да отговори на форматирането, което желаем.

Инструкциите за форматиране служат като план за структуриране на изхода на нашия езиков модел. Тези инструкции установяват, че изходът трябва да се придържа към определена JSON схема. Те предоставят някои примери, при които един екземпляр на JSON следва правилно схемата — обект с ключ „foo“ и стойност на масива и друг екземпляр, който не е в съответствие със схемата.

Направете запитване към вашия LLM и получете структуриран отговор

Продължавайки напред, нека използваме PromptTemplate от LangChain, за да конфигурираме структуриран вход към нашия езиков модел. След като подканата бъде конфигурирана, ще я предадем на LLM и ще получим отговор обратно. Виждаме, че отговорът е добре оформен, както посочихме в горните секции.

Добавете персонализирана логика за валидиране

Освен това можем да използваме логиката за валидиране на Pydantic модели за всяко поле. Този допълнителен слой на валидиране гарантира, че всеки отговор от LLM се привежда в съответствие с нашите предварително дефинирани стандарти. Например, нека разгледаме изискването имената на градовете да са с главни букви. За да приложим това, ще използваме декоратора валидатор и ще вградим нашата условна логика в метода на класа validate_cities. След като получим отговор от LLM, можем да оценим съответствието му с нашите зададени критерии.

Когато анализираме отговора, Pydantic потвърждава стойностите на полето city_name. Istanbul не е низ с главни букви, както посочихме. Така че получаваме следната грешка:

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 представлява безценен подход към набирането на добре структурирани и силно специфични данни от големи езикови модели. Този подход не само рационализира сложния процес на работа с неструктурирани изходи, но също така ни позволява да поддържаме високо ниво на качество на данните, гарантирайки, че нашите изисквания и спецификации са напълно изпълнени.