В этом руководстве мы создаём рабочий процесс с использованием 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) и вызова функций в соответствии со схемой.