{/ Эта страница автоматически создается на основе файла SKILL.md навыка с помощью сайта site/scripts/generate-skill-docs.py. Редактируйте исходный код SKILL.md, а не эту страницу. /}
Необязательно — установите с помощью hermesskills installofficial/mlops/outlines
Путь
необязательные навыки/млопс/вывод/контуры
Версия
1.0.0
Автор
Исследование оркестра
Лицензия
Массачусетский технологический институт
Зависимости
контуры, трансформеры, вллм, пидантик
Платформы
Linux, MacOS, Windows
Теги
Быстрое проектирование, Схемы, Структурированная генерация, JSON Schema, Pydantic, Локальные модели, Генерация на основе грамматики, vLLM, Трансформеры, Типовая безопасность
Ссылка: полная версия SKILL.md:::информация
Ниже приведено полное определение навыка, которое Гермес загружает при активации этого навыка. Это то, что агент видит в качестве инструкций, когда навык активен.
Контуры: генерация структурированного текста
Когда использовать этот навык
Используйте Outlines, когда вам нужно:
- Гарантия допустимой структуры JSON/XML/code во время генерации.
- Используйте модели Pydantic для типобезопасных выходных данных.
- Поддержка локальных моделей (Transformers, llama.cpp, vLLM)
- Максимальная скорость вывода благодаря структурированной генерации с нулевыми издержками.
- Автоматическое создание по схемам JSON.
- Выборка токенов управления на уровне грамматики.
Звезды GitHub: более 8000 | От: dottxt.ai (ранее.txt)
Установка
# Base installation
pipinstalloutlines
# With specific backends
pipinstalloutlinestransformers# Hugging Face models
pipinstalloutlinesllama-cpp-python# llama.cpp
pipinstalloutlinesvllm# vLLM for high-throughput
Быстрый старт
Базовый пример: классификация
importoutlinesfromtypingimportLiteral# Load modelmodel=outlines.models.transformers("microsoft/Phi-3-mini-4k-instruct")# Generate with type constraintprompt="Sentiment of 'This product is amazing!': "generator=outlines.generate.choice(model,["positive","negative","neutral"])sentiment=generator(prompt)print(sentiment)# "positive" (guaranteed one of these)
С моделями Pydantic
frompydanticimportBaseModelimportoutlinesclassUser(BaseModel):name:strage:intemail:strmodel=outlines.models.transformers("microsoft/Phi-3-mini-4k-instruct")# Generate structured outputprompt="Extract user: John Doe, 30 years old, john@example.com"generator=outlines.generate.json(model,User)user=generator(prompt)print(user.name)# "John Doe"print(user.age)# 30print(user.email)# "john@example.com"
Основные понятия
1. Ограниченная выборка токенов
Outlines использует конечные автоматы (FSM) для ограничения генерации токенов на уровне логита.
Как это работает:
1. Преобразование схемы (JSON/Pydantic/regex) в контекстно-свободную грамматику (CFG).
2. Преобразование CFG в конечный автомат (FSM).
3. Фильтруйте недействительные токены на каждом этапе генерации.
4. Перемотка вперед, когда существует только один действительный токен.
Преимущества:
- Нулевые издержки: фильтрация происходит на уровне токена.
- Увеличение скорости: ускоренная перемотка вперед по детерминированным путям.
- Гарантированная достоверность: неверные выходные данные невозможны.
importoutlines# Pydantic model -> JSON schema -> CFG -> FSMclassPerson(BaseModel):name:strage:intmodel=outlines.models.transformers("microsoft/Phi-3-mini-4k-instruct")# Behind the scenes:# 1. Person -> JSON schema# 2. JSON schema -> CFG# 3. CFG -> FSM# 4. FSM filters tokens during generationgenerator=outlines.generate.json(model,Person)result=generator("Generate person: Alice, 25")
2. Структурированные генераторы
Outlines предоставляет специализированные генераторы для различных типов вывода.
Генератор выбора
# Multiple choice selectiongenerator=outlines.generate.choice(model,["positive","negative","neutral"])sentiment=generator("Review: This is great!")# Result: One of the three choices
# Generate text matching regexgenerator=outlines.generate.regex(model,r"[0-9]{3}-[0-9]{3}-[0-9]{4}"# Phone number pattern)phone=generator("Generate phone number:")# Result: "555-123-4567" (guaranteed to match pattern)
Генераторы целых чисел и чисел с плавающей запятой
Outlines поддерживает несколько локальных серверов и серверов на основе API.
Трансформеры (Обнимающее лицо)
importoutlines# Load from Hugging Facemodel=outlines.models.transformers("microsoft/Phi-3-mini-4k-instruct",device="cuda"# Or "cpu")# Use with any generatorgenerator=outlines.generate.json(model,YourModel)
# For production deploymentsmodel=outlines.models.vllm("meta-llama/Llama-3.1-8B-Instruct",tensor_parallel_size=2# Multi-GPU)generator=outlines.generate.json(model,YourModel)
OpenAI (ограниченная поддержка)
# Basic OpenAI supportmodel=outlines.models.openai("gpt-4o-mini",api_key="your-api-key")# Note: Some features limited with API modelsgenerator=outlines.generate.json(model,YourModel)
4. Пидантическая интеграция
Outlines имеет первоклассную поддержку Pydantic с автоматическим переводом схемы.
Базовые модели
frompydanticimportBaseModel,FieldclassArticle(BaseModel):title:str=Field(description="Article title")author:str=Field(description="Author name")word_count:int=Field(description="Number of words",gt=0)tags:list[str]=Field(description="List of tags")model=outlines.models.transformers("microsoft/Phi-3-mini-4k-instruct")generator=outlines.generate.json(model,Article)article=generator("Generate article about AI")print(article.title)print(article.word_count)# Guaranteed > 0
Вложенные модели
classAddress(BaseModel):street:strcity:strcountry:strclassPerson(BaseModel):name:strage:intaddress:Address# Nested modelgenerator=outlines.generate.json(model,Person)person=generator("Generate person in New York")print(person.address.city)# "New York"
Перечисления и литералы
fromenumimportEnumfromtypingimportLiteralclassStatus(str,Enum):PENDING="pending"APPROVED="approved"REJECTED="rejected"classApplication(BaseModel):applicant:strstatus:Status# Must be one of enum valuespriority:Literal["low","medium","high"]# Must be one of literalsgenerator=outlines.generate.json(model,Application)app=generator("Generate application")print(app.status)# Status.PENDING (or APPROVED/REJECTED)
Общие шаблоны
Схема 1: извлечение данных
frompydanticimportBaseModelimportoutlinesclassCompanyInfo(BaseModel):name:strfounded_year:intindustry:stremployees:intmodel=outlines.models.transformers("microsoft/Phi-3-mini-4k-instruct")generator=outlines.generate.json(model,CompanyInfo)text="""Apple Inc. was founded in 1976 in the technology industry.The company employs approximately 164,000 people worldwide."""prompt=f"Extract company information:\n{text}\n\nCompany:"company=generator(prompt)print(f"Name: {company.name}")print(f"Founded: {company.founded_year}")print(f"Industry: {company.industry}")print(f"Employees: {company.employees}")
Схема 2: Классификация
fromtypingimportLiteralimportoutlinesmodel=outlines.models.transformers("microsoft/Phi-3-mini-4k-instruct")# Binary classificationgenerator=outlines.generate.choice(model,["spam","not_spam"])result=generator("Email: Buy now! 50% off!")# Multi-class classificationcategories=["technology","business","sports","entertainment"]category_gen=outlines.generate.choice(model,categories)category=category_gen("Article: Apple announces new iPhone...")# With confidenceclassClassification(BaseModel):label:Literal["positive","negative","neutral"]confidence:floatclassifier=outlines.generate.json(model,Classification)result=classifier("Review: This product is okay, nothing special")
Шаблон 3: Структурированные формы
classUserProfile(BaseModel):full_name:strage:intemail:strphone:strcountry:strinterests:list[str]model=outlines.models.transformers("microsoft/Phi-3-mini-4k-instruct")generator=outlines.generate.json(model,UserProfile)prompt="""Extract user profile from:Name: Alice JohnsonAge: 28Email: alice@example.comPhone: 555-0123Country: USAInterests: hiking, photography, cooking"""profile=generator(prompt)print(profile.full_name)print(profile.interests)# ["hiking", "photography", "cooking"]
Шаблон 4: Извлечение нескольких сущностей
classEntity(BaseModel):name:strtype:Literal["PERSON","ORGANIZATION","LOCATION"]classDocumentEntities(BaseModel):entities:list[Entity]model=outlines.models.transformers("microsoft/Phi-3-mini-4k-instruct")generator=outlines.generate.json(model,DocumentEntities)text="Tim Cook met with Satya Nadella at Microsoft headquarters in Redmond."prompt=f"Extract entities from: {text}"result=generator(prompt)forentityinresult.entities:print(f"{entity.name} ({entity.type})")
Шаблон 5: Генерация кода
classPythonFunction(BaseModel):function_name:strparameters:list[str]docstring:strbody:strmodel=outlines.models.transformers("microsoft/Phi-3-mini-4k-instruct")generator=outlines.generate.json(model,PythonFunction)prompt="Generate a Python function to calculate factorial"func=generator(prompt)print(f"def {func.function_name}({', '.join(func.parameters)}):")print(f' """{func.docstring}"""')print(f" {func.body}")
Шаблон 6: Пакетная обработка
defbatch_extract(texts:list[str],schema:type[BaseModel]):"""Extract structured data from multiple texts."""model=outlines.models.transformers("microsoft/Phi-3-mini-4k-instruct")generator=outlines.generate.json(model,schema)results=[]fortextintexts:result=generator(f"Extract from: {text}")results.append(result)returnresultsclassPerson(BaseModel):name:strage:inttexts=["John is 30 years old","Alice is 25 years old","Bob is 40 years old"]people=batch_extract(texts,Person)forpersoninpeople:print(f"{person.name}: {person.age}")
Конфигурация серверной части
Трансформеры
importoutlines# Basic usagemodel=outlines.models.transformers("microsoft/Phi-3-mini-4k-instruct")# GPU configurationmodel=outlines.models.transformers("microsoft/Phi-3-mini-4k-instruct",device="cuda",model_kwargs={"torch_dtype":"float16"})# Popular modelsmodel=outlines.models.transformers("meta-llama/Llama-3.1-8B-Instruct")model=outlines.models.transformers("mistralai/Mistral-7B-Instruct-v0.3")model=outlines.models.transformers("Qwen/Qwen2.5-7B-Instruct")
лама.cpp
# Load GGUF modelmodel=outlines.models.llamacpp("./models/llama-3.1-8b.Q4_K_M.gguf",n_ctx=4096,# Context windown_gpu_layers=35,# GPU layersn_threads=8# CPU threads)# Full GPU offloadmodel=outlines.models.llamacpp("./models/model.gguf",n_gpu_layers=-1# All layers on GPU)
vLLM (Производство)
# Single GPUmodel=outlines.models.vllm("meta-llama/Llama-3.1-8B-Instruct")# Multi-GPUmodel=outlines.models.vllm("meta-llama/Llama-3.1-70B-Instruct",tensor_parallel_size=4# 4 GPUs)# With quantizationmodel=outlines.models.vllm("meta-llama/Llama-3.1-8B-Instruct",quantization="awq"# Or "gptq")
Лучшие практики
1. Используйте определенные типы
# ✅ Good: Specific typesclassProduct(BaseModel):name:strprice:float# Not strquantity:int# Not strin_stock:bool# Not str# ❌ Bad: Everything as stringclassProduct(BaseModel):name:strprice:str# Should be floatquantity:str# Should be int
2. Добавьте ограничения
frompydanticimportField# ✅ Good: With constraintsclassUser(BaseModel):name:str=Field(min_length=1,max_length=100)age:int=Field(ge=0,le=120)email:str=Field(pattern=r"^[\w\.-]+@[\w\.-]+\.\w+$")# ❌ Bad: No constraintsclassUser(BaseModel):name:strage:intemail:str
3. Используйте перечисления для категорий
# ✅ Good: Enum for fixed setclassPriority(str,Enum):LOW="low"MEDIUM="medium"HIGH="high"classTask(BaseModel):title:strpriority:Priority# ❌ Bad: Free-form stringclassTask(BaseModel):title:strpriority:str# Can be anything
4. Предоставьте контекст в подсказках
# ✅ Good: Clear contextprompt="""Extract product information from the following text.Text: iPhone 15 Pro costs $999 and is currently in stock.Product:"""# ❌ Bad: Minimal contextprompt="iPhone 15 Pro costs $999 and is currently in stock."
5. Обработка необязательных полей
fromtypingimportOptional# ✅ Good: Optional fields for incomplete dataclassArticle(BaseModel):title:str# Requiredauthor:Optional[str]=None# Optionaldate:Optional[str]=None# Optionaltags:list[str]=[]# Default empty list# Can succeed even if author/date missing
Сравнение с альтернативами
Особенность
Контуры
Инструктор
Руководство
ЛМКЛ
Поддержка Пидантика
✅ Родной
✅ Родной
❌ Нет
❌ Нет
Схема JSON
✅ Да
✅ Да
⚠️ Ограниченная
✅ Да
Ограничения регулярных выражений
✅ Да
❌ Нет
✅ Да
✅ Да
Локальные модели
✅ Полный
⚠️ Ограниченная
✅ Полный
✅ Полный
Модели API
⚠️ Ограниченная
✅ Полный
✅ Полный
✅ Полный
Нулевые накладные расходы
✅ Да
❌ Нет
⚠️ Частичная
✅ Да
Автоматическая повторная попытка
❌ Нет
✅ Да
❌ Нет
❌ Нет
Кривая обучения
Низкий
Низкий
Низкий
Высокий
Когда следует выбирать контуры:
- Использование локальных моделей (Transformers, llama.cpp, vLLM)
- Нужна максимальная скорость вывода
- Хотите поддержку модели Pydantic
- Требуется структурированная генерация с нулевыми накладными расходами.
- Контроль процесса выборки токенов
Когда выбирать альтернативы:
- Инструктор: нужны модели API с автоматической повторной попыткой.
- Рекомендации: необходимо восстановление токенов и сложные рабочие процессы.
- LMQL: предпочитаете декларативный синтаксис запроса.
Характеристики производительности
Скорость:
- Нулевые накладные расходы: структурированная генерация так же быстро, как и без ограничений.
- Ускоренная оптимизация: пропускает детерминированные токены.
- в 1,2–2 раза быстрее, чем подходы к проверке после генерации.
Память:
- FSM компилируется один раз для каждой схемы (кэшируется)
- Минимальные накладные расходы во время выполнения
- Эффективность с vLLM для высокой пропускной способности.
Точность:
- 100 % действительные выходные данные (гарантировано FSM)
- Не требуются циклы повторов
- Детерминированная фильтрация токенов