by dottxt-ai (open source) Python 3.9+, локальные модели (llama.cpp, vllm, transformers), OpenAI API
Библиотека для structured generation — генерации структурированного вывода из языковых моделей с гарантированным форматом. Использует grammar-based sampling: модель физически не может выдать невалидный JSON или неправильную структуру. Возможности: - Генерация валидного JSON по Pydantic-схеме - Regex-guided generation: вывод точно соответствует паттерну - Enum и choice: ответ только из заданных вариантов - CFG (Context-Free Grammar): произвольные грамматики - Работает с llama.cpp, vllm, transformers - Интеграция с OpenAI-compatible API - Значительно надёжнее, чем prompt-based подходы
# pip:
pip install outlines
# С поддержкой transformers:
pip install "outlines[transformers]"
# С llama.cpp:
pip install "outlines[llamacpp]"
# Пример — Pydantic schema:
from pydantic import BaseModel
import outlines
class Person(BaseModel):
name: str
age: int
model = outlines.models.transformers("mistralai/Mistral-7B-v0.1")
generator = outlines.generate.json(model, Person)
result = generator("Extract: John is 30 years old")
# Person(name="John", age=30)
🗒️ Структурированные выводы для LLM 🗒️
Сделано с ❤👷️ командой .txt
Нам доверяют NVIDIA, Cohere, HuggingFace, vLLM и другие.
API .txt в настоящее время находится на ранней стадии доступа. Запросить доступ здесь →
Мы сотрудничаем с избранными партнёрами для разработки новых интерфейсов для структурированной генерации.
Вам нужны XML, FHIR, пользовательские схемы или грамматики? Давайте поговорим.
Проверьте свою схему: поделитесь одной схемой, и мы покажем вам, что ломается при генерации, какие ограничения это исправляют, а также показатели соответствия до и после. Зарегистрируйтесь здесь.

LLM мощны, но их выводы непредсказуемы. Большинство решений пытаются исправить плохие выводы после генерации с помощью парсинга, регулярных выражений или хрупкого кода, который легко ломается.
Outlines гарантирует структурированные выводы во время генерации — напрямую из любого LLM.
model(prompt, output_type)
Outlines следует простому паттерну, который отражает собственную систему типов Python. Просто укажите желаемый тип вывода, и Outlines гарантирует, что ваши данные точно соответствуют этой структуре:
Literal["Yes", "No"]intНачать работу с outlines просто:
pip install outlines
import outlines
from transformers import AutoTokenizer, AutoModelForCausalLM
MODEL_NAME = "microsoft/Phi-3-mini-4k-instruct"
model = outlines.from_transformers(
AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map="auto"),
AutoTokenizer.from_pretrained(MODEL_NAME)
)
from typing import Literal
from pydantic import BaseModel
# Простая классификация
sentiment = model(
"Проанализируйте: 'Этот продукт полностью изменил мою жизнь!'",
Literal["Позитивный", "Негативный", "Нейтральный"]
)
print(sentiment) # "Позитивный"
# Извлечение конкретных типов
temperature = model("Какова точка кипения воды в градусах Цельсия?", int)
print(temperature) # 100
from pydantic import BaseModel
from enum import Enum
class Rating(Enum):
poor = 1
fair = 2
good = 3
excellent = 4
class ProductReview(BaseModel):
rating: Rating
pros: list[str]
cons: list[str]
summary: str
review = model(
"Обзор: XPS 13 имеет отличное время автономной работы и потрясающий дисплей, но сильно греется и веб-камера имеет плохое качество.",
ProductReview,
max_new_tokens=200,
)
review = ProductReview.model_validate_json(review)
print(f"Рейтинг: {review.rating.name}") # "Рейтинг: good"
print(f"Плюсы: {review.pros}") # "Плюсы: ['great battery life', 'stunning display']"
print(f"Итог: {review.summary}") # "Итог: Good laptop with great display but thermal issues"
Вот готовые к использованию примеры, показывающие, как Outlines решает распространённые задачи:
🙋♂️ Сортировка обращений в поддержку Этот пример показывает, как преобразовать свободно написанное письмо клиента в структурированный тикет сервиса. Парся атрибуты, такие как приоритет, категория и флаги эскалации, код обеспечивает автоматическую маршрутизацию и обработку проблем поддержки.
import outlines
from enum import Enum
from pydantic import BaseModel
from transformers import AutoTokenizer, AutoModelForCausalLM
from typing import List
MODEL_NAME = "microsoft/Phi-3-mini-4k-instruct"
model = outlines.from_transformers(
AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map="auto"),
AutoTokenizer.from_pretrained(MODEL_NAME)
)
def alert_manager(ticket):
print("Внимание!", ticket)
class TicketPriority(str, Enum):
low = "низкий"
medium = "средний"
high = "высокий"
urgent = "срочный"
class ServiceTicket(BaseModel):
priority: TicketPriority
category: str
requires_manager: bool
summary: str
action_items: List[str]
customer_email = """
Тема: СРОЧНО - Не могу получить доступ к своему аккаунту после оплаты
Я оплатил премиум-план 3 часа назад и до сих пор не могу получить доступ ни к каким функциям.
Я пытался выйти и войти снова несколько раз. Это недопустимо, так как у меня
через час презентация для клиента, и мне нужна аналитическая панель.
Пожалуйста, исправьте это немедленно или верните мою оплату.
"""
prompt = f"""
user
Проанализируйте это письмо клиента:
{customer_email}
# Используйте категоризацию для управления инвентарём
categories = [
ProductCategory.model_validate_json(category) for category in categories
]
for product, category in zip(product_descriptions, categories):
update_inventory(product, category.main_category, category.sub_category)
📊 Парсинг данных о событиях с неполной информацией Этот пример использует outlines для парсинга описаний событий в структурированную информацию (такую как название, дата, местоположение, тип и темы), даже обрабатывая случаи, когда данные неполные. Он использует union-типы для возврата либо структурированных данных о событии, либо запасного ответа "Я не знаю", обеспечивая надежное извлечение в различных сценариях.
import outlines
from typing import Union, List, Literal
from pydantic import BaseModel
from enum import Enum
from transformers import AutoTokenizer, AutoModelForCausalLM
MODEL_NAME = "microsoft/Phi-3-mini-4k-instruct"
model = outlines.from_transformers(
AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map="auto"),
AutoTokenizer.from_pretrained(MODEL_NAME)
)
class EventType(str, Enum):
conference = "conference"
webinar = "webinar"
workshop = "workshop"
meetup = "meetup"
other = "other"
class EventInfo(BaseModel):
"""Структурированная информация о техническом событии"""
name: str
date: str
location: str
event_type: EventType
topics: List[str]
registration_required: bool
# Создайте union-тип, который может быть либо структурированным EventInfo, либо "Я не знаю"
EventResponse = Union[EventInfo, Literal["I don't know"]]
# Примеры описаний событий
event_descriptions = [
# Полная информация
"""
Присоединяйтесь к DevCon 2023, ведущей конференции для разработчиков, которая состоится 15-17 ноября 2023 года
в Конференц-центре Сан-Франциско. Темы включают AI/ML, облачную инфраструктуру и web3.
Требуется регистрация.
""",
# Недостаточная информация
"""
Техническое событие на следующей неделе. Подробности скоро!
"""
]
# Обработка событий
results = []
for description in event_descriptions:
prompt = f"""
<|im_start>system
You are a helpful assistant
# "Встреча «Обзор дорожной карты продукта» запланирована на 2023-10-17 с 3 участниками"
📝 Динамическое создание промптов с использованием повторно используемых шаблонов Используя шаблоны на основе Jinja, этот пример показывает, как создавать динамические промпты для задач, таких как анализ тональности. Он иллюстрирует, как легко повторно использовать и настраивать промпты, включая стратегии обучения по нескольким примерам (few-shot learning), для различных типов контента, гарантируя при этом, что выходные данные остаются структурированными.
import outlines
from typing import List, Literal
from transformers import AutoTokenizer, AutoModelForCausalLM
MODEL_NAME = "microsoft/phi-4"
model = outlines.from_transformers(
AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map="auto"),
AutoTokenizer.from_pretrained(MODEL_NAME)
)
# 1. Создайте повторно используемый шаблон с синтаксисом Jinja
sentiment_template = outlines.Template.from_string("""
<|im_start>user
Проанализируйте тональность следующего {{ content_type }}:
{{ text }}
Предоставьте анализ в формате: «Positive», «Negative» или «Neutral».
<|im_end>
<|im_start>assistant
""")
# 2. Генерируйте промпты с различными параметрами
review = "Этот ресторан превзошел все мои ожидания. Фантастический сервис!"
prompt = sentiment_template(content_type="отзыв", text=review)
# 3. Используйте шаблонизированный промпт со структурированной генерацией
result = model(prompt, Literal["Positive", "Negative", "Neutral"])
print(result) # "Positive"
# Шаблоны также можно загружать из файлов
example_template = outlines.Template.from_file("templates/few_shot.txt")
# Использование с примерами для обучения по нескольким примерам
examples = [
("Еда была холодная", "Negative"),
("Персонал был дружелюбным", "Positive")
]
few_shot_prompt = example_template(examples=examples, query="Обслуживание было медленным")
print(few_shot_prompt)

| Тип модели | Описание | Документация |
|---|---|---|
| Поддержка серверов | vLLM и Ollama | Интеграции серверов → |
| Поддержка локальных моделей | transformers и llama.cpp | Интеграции моделей → |
| Поддержка API | OpenAI, Gemini и Dottxt | Интеграции API → |
| Возможность | Описание | Документация |
|---|---|---|
| Множественный выбор | Ограничение выходных данных предопределенными вариантами | Руководство по множественному выбору → |
| Вызов функций | Вывод структуры из сигнатур функций | Руководство по функциям → |
| JSON/Pydantic | Генерация выходных данных, соответствующих JSON-схемам | Руководство по JSON → |
| Регулярные выражения | Генерация текста, соответствующего паттерну регулярного выражения | Руководство по регулярным выражениям → |
| Грамматики | Наложение сложных структур на выходные данные | Руководство по грамматикам → |
| Возможность | Описание | Документация |
|---|---|---|
| Шаблоны промптов | Разделение сложных промптов и кода | Руководство по шаблонам → |
| Пользовательские типы | Интуитивный интерфейс для создания сложных типов | Руководство по типам Python → |
| Приложения | Инкапсуляция шаблонов и типов в функции | Руководство по приложениям → |
Outlines разрабатывается и поддерживается компанией .txt, которая посвятила себя повышению надежности LLM для production-приложений.
Наш фокус — развитие технологий структурированной генерации:
Следите за нами в Twitter или читайте наш блог, чтобы быть в курсе нашей последней работы по повышению надежности LLM.
@article{willard2023efficient,
title={Efficient Guided Generation for Large Language Models},
author={Willard, Brandon T and Louf, R{\'e}mi},
journal={arXiv preprint arXiv:2307.09702},
year={2023}
}