Создание надёжных конвейеров LLM с использованием Outlines и Pydantic

В этом руководстве мы создаём рабочий процесс с использованием Outlines для генерации структурированных и безопасных по типу выходных данных из языковых моделей. Мы работаем с типизированными ограничениями, такими как Literal, int и bool, и разрабатываем шаблоны подсказок с помощью outlines.Template, а также применяем строгую проверку схемы с помощью моделей Pydantic.

Установка зависимостей и инициализация конвейера

Мы устанавливаем все необходимые зависимости и инициализируем конвейер Outlines с помощью лёгкой модели инструктирования. Мы настраиваем обработку устройств так, чтобы система автоматически переключалась между CPU и GPU в зависимости от доступности.

«`python
import os, sys, subprocess, json, textwrap, re

subprocess.check_call([sys.executable, «-m», «pip», «install», «-q»,
«outlines», «transformers», «accelerate», «sentencepiece», «pydantic»])
«`

Определение функций для чата и баннеров

Мы создаём повторно используемые вспомогательные функции для форматирования чата и чистых баннеров разделов, чтобы структурировать рабочий процесс.

«`python
def buildchat(usertext: str, system_text: str = «You are a precise assistant. Follow instructions exactly.») -> str:
try:
msgs = [{«role»: «system», «content»: systemtext}, {«role»: «user», «content»: usertext}]
return tokenizer.applychattemplate(msgs, tokenize=False, addgenerationprompt=True)
except Exception:
return f»{systemtext}\n\nUser: {usertext}\nAssistant:»

def banner(title: str):
print(«\n» + «=» * 90)
print(title)
print(«=» * 90)
«`

Извлечение JSON-объектов и их восстановление

Мы реализуем надёжное извлечение JSON и утилиты минимального восстановления для безопасного извлечения структурированных выходных данных из несовершенных генераций.

«`python
def extractjsonobject(s: str) -> str:
s = s.strip()
start = s.find(«{«)
if start == -1:
return s
depth = 0
in_str = False
esc = False
for i in range(start, len(s)):
ch = s[i]
if in_str:
if esc:
esc = False
elif ch == «\\»:
esc = True
elif ch == ‘»‘:
in_str = False
else:
if ch == ‘»‘:
in_str = True
elif ch == «{«:
depth += 1
elif ch == «}»:
depth -= 1
if depth == 0:
return s[start:i + 1]
return s[start:]
«`

Структурированные выходные данные с использованием Pydantic

Мы определяем расширенные схемы Pydantic с перечислениями, ограничениями регулярных выражений, ограничениями полей и структурированными списками.

«`python
class ServiceTicket(BaseModel):
priority: TicketPriority
category: Literal[«billing», «login», «bug», «feature_request», «other»]
requires_manager: bool
summary: str = Field(minlength=10, maxlength=220)
actionitems: List[str] = Field(minlength=1, max_length=6)
«`

Вызов функций в стиле схемы

Мы реализуем рабочий процесс вызова функций, генерируя структурированные аргументы, соответствующие определённой схеме.

«`python
class AddArgs(BaseModel):
a: int = Field(ge=-1000, le=1000)
b: int = Field(ge=-1000, le=1000)

def add(a: int, b: int) -> int:
return a + b
«`

В заключение мы реализовали полностью структурированный конвейер генерации с использованием Outlines с сильной типизацией, проверкой схемы и контролируемым декодированием. Мы продемонстрировали, как перейти от простых типизированных выходных данных к расширенной экстракции на основе Pydantic и шаблонам выполнения функций.

1. Какие инструменты и библиотеки используются для создания надёжных конвейеров LLM в статье?

В статье используются такие инструменты и библиотеки, как Outlines, Pydantic, Transformers, Accelerate, Sentencepiece. Они применяются для генерации структурированных и безопасных по типу выходных данных из языковых моделей.

2. Какие преимущества даёт использование Outlines и Pydantic при работе с языковыми моделями?

Использование Outlines позволяет разрабатывать шаблоны подсказок и генерировать структурированные выходные данные. Pydantic обеспечивает строгую проверку схемы, что повышает надёжность и безопасность работы с данными.

3. Какие типы данных используются в примере с определением функций для чата и баннеров?

В примере используются строковые данные (str) для пользовательского текста и текста системы, а также булевы значения (bool) и списки (List) для определения функций.

4. Какие ограничения и проверки применяются к данным в примере со структурированными выходными данными с использованием Pydantic?

В примере со структурированными выходными данными используются ограничения на типы данных (int, bool, Literal), длину строк (minlength, maxlength) и другие параметры. Это обеспечивает соответствие данных заданной схеме.

5. Какие функции реализованы для структурирования рабочего процесса в статье?

Для структурирования рабочего процесса реализованы функции для форматирования чата (buildchat) и создания баннеров разделов (banner), а также функции для извлечения JSON-объектов (extractjson_object) и вызова функций в соответствии со схемой.

Источник