Outlines

by dottxt-ai (open source) · Python 3.9+, локальные модели (llama.cpp, vllm, transformers), OpenAI API

Framework AI Assistants Open Source v1.3.1 · 30.06.2026 активный

Библиотека для 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 подходы

v1.3.1
30.06.2026 current
Добавлен 19.06.2026 · Обновлён 19.06.2026 · AI Assistants
Установка
# 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)
переведено ИИ

Логотип Outlines Логотип Outlines

🗒️ Структурированные выводы для LLM 🗒️

Сделано с ❤👷️ командой .txt
Нам доверяют NVIDIA, Cohere, HuggingFace, vLLM и другие.

Версия PyPI Загрузки Звёзды

Discord Блог Twitter


API .txt в настоящее время находится на ранней стадии доступа. Запросить доступ здесь →

🚀 Строим будущее структурированной генерации

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

Вам нужны XML, FHIR, пользовательские схемы или грамматики? Давайте поговорим.

Проверьте свою схему: поделитесь одной схемой, и мы покажем вам, что ломается при генерации, какие ограничения это исправляют, а также показатели соответствия до и после. Зарегистрируйтесь здесь.

Содержание

Почему Outlines?

LLM мощны, но их выводы непредсказуемы. Большинство решений пытаются исправить плохие выводы после генерации с помощью парсинга, регулярных выражений или хрупкого кода, который легко ломается.

Outlines гарантирует структурированные выводы во время генерации — напрямую из любого LLM.

  • Работает с любой моделью - Один и тот же код запускается для OpenAI, Ollama, vLLM и других
  • Простая интеграция - Просто передайте желаемый тип вывода: model(prompt, output_type)
  • Гарантия валидной структуры - Больше никаких проблем с парсингом или сломанным JSON
  • Независимость от провайдера - Смените модель, не меняя код

Философия Outlines

Outlines следует простому паттерну, который отражает собственную систему типов Python. Просто укажите желаемый тип вывода, и Outlines гарантирует, что ваши данные точно соответствуют этой структуре:

  • Для ответа "да/нет" используйте Literal["Yes", "No"]
  • Для числовых значений используйте int
  • Для сложных объектов определите структуру с помощью модели Pydantic

Быстрый старт

Начать работу с outlines просто:

1. Установите outlines

pip install outlines

2. Подключитесь к предпочитаемой модели

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)
)

3. Начните с простых структурированных выводов

from typing import Literal
from pydantic import BaseModel


# Простая классификация
sentiment = model(
    "Проанализируйте: 'Этот продукт полностью изменил мою жизнь!'",
    Literal["Позитивный", "Негативный", "Нейтральный"]
)
print(sentiment)  # "Позитивный"

# Извлечение конкретных типов
temperature = model("Какова точка кипения воды в градусах Цельсия?", int)
print(temperature)  # 100

4. Создавайте сложные структуры

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)

Их используют outlines

Логотипы пользователей Логотипы пользователей

Интеграции моделей

Тип модели Описание Документация
Поддержка серверов vLLM и Ollama Интеграции серверов →
Поддержка локальных моделей transformers и llama.cpp Интеграции моделей →
Поддержка API OpenAI, Gemini и Dottxt Интеграции API →

Основные возможности

Возможность Описание Документация
Множественный выбор Ограничение выходных данных предопределенными вариантами Руководство по множественному выбору →
Вызов функций Вывод структуры из сигнатур функций Руководство по функциям →
JSON/Pydantic Генерация выходных данных, соответствующих JSON-схемам Руководство по JSON →
Регулярные выражения Генерация текста, соответствующего паттерну регулярного выражения Руководство по регулярным выражениям →
Грамматики Наложение сложных структур на выходные данные Руководство по грамматикам →

Другие возможности

Возможность Описание Документация
Шаблоны промптов Разделение сложных промптов и кода Руководство по шаблонам →
Пользовательские типы Интуитивный интерфейс для создания сложных типов Руководство по типам Python →
Приложения Инкапсуляция шаблонов и типов в функции Руководство по приложениям →

О .txt

лого dottxt лого dottxt

Outlines разрабатывается и поддерживается компанией .txt, которая посвятила себя повышению надежности LLM для production-приложений.

Наш фокус — развитие технологий структурированной генерации:

Следите за нами в Twitter или читайте наш блог, чтобы быть в курсе нашей последней работы по повышению надежности LLM.

Сообщество

Участники Звезды Загрузки Бейдж Discord

Цитируйте Outlines

@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}
}
Комментарии
Войдите, чтобы оставить комментарий