Outlines: генерирует структурированный текст с помощью регулярных выражений, JSON или моделей Pydantic.

Общее введение

Outlines - это библиотека с открытым исходным кодом, разработанная dottxt-ai для расширения возможностей применения больших языковых моделей (LLM) посредством генерации структурированного текста. Библиотека поддерживает множество интеграций моделей, включая OpenAI, трансформаторы, llama.cpp и т.д. Она предоставляет простые, но мощные примитивы подсказок и основана на шаблонизаторе Jinja. Outlines позволяет пользователю выполнять быструю генерацию с помощью регулярных выражений, шаблонов JSON или моделей Pydantic, а также поддерживает различные алгоритмы выборки, такие как жадные алгоритмы, полиномиальная выборка и поиск по пучкам. Проект также предоставляет такие возможности, как генерация кэша, пакетный вывод и т.д., направленные на повышение скорости и производительности вывода моделей.Outlines был использован в вызовах функций основными фреймворками вывода (например, VLLM, TGI).

Outlines:通过正则表达式、JSON或Pydantic模型生成结构化文本输出

 

Список функций

  • Интеграция с несколькими моделями: поддержка OpenAI, трансформаторов, llama.cpp и других моделей.
  • Простые и мощные подсказки: основаны на шаблонизаторе Jinja.
  • Генерация структуры регулярных выражений: быстрая генерация текста, соответствующего регулярным выражениям
  • Генерация JSON: генерируйте текст на основе схемы JSON или моделей Pydantic.
  • Генерация синтаксических структур: поддержка циклов, условий и генерация пользовательских функций Python
  • Генерировать кэш: результаты генерирования кэша для повышения эффективности
  • Пакетные рассуждения: поддержка пакетной обработки для повышения скорости рассуждений
  • Несколько алгоритмов выборки: поддерживает жадные, полиномиальные алгоритмы выборки и алгоритмы лучевого поиска.
  • Поддержка Docker: предоставляйте официальные образы Docker для легкого развертывания.

 

Использование помощи

Процесс установки

  1. Убедитесь, что среда Python установлена.
  2. Установите Outlines с помощью pip:
   pip install outlines
  1. Если вам нужна основная функциональность версии Rust, вы можете установить outlines-core:
   pip install outlines-core

Руководство по использованию

Основное использование

  1. Импортируйте библиотеку Outlines:
   import outlines
  1. Выберите и загрузите модель:
   model = outlines.models.transformers("openai/gpt-3.5-turbo")
  1. Создавайте подсказки и генерируйте текст:
   prompt = "生成一个关于AI技术的简短介绍。"
generated_text = model.generate(prompt)
print(generated_text)

Дополнительные возможности

  1. Создание структурированного текста с помощью регулярных выражений:
   import outlines
generator = outlines.generate.regex("^[A-Z][a-z]+$")
result = generator("生成一个符合正则表达式的单词")
print(result)
  1. Генерируйте текст, используя схему JSON:
   import outlines
from pydantic import BaseModel
class Person(BaseModel):
name: str
age: int
generator = outlines.generate.json(Person)
result = generator({"name": "Alice", "age": 30})
print(result)
  1. Используется несколько алгоритмов отбора проб:
   import outlines
generator = outlines.generate.choice(model, ["选项1", "选项2", "选项3"])
result = generator("请选择一个选项:")
print(result)
  1. Разверните образ Docker:
   docker pull outlinesdev/outlines
docker run -p 8000:8000 outlinesdev/outlines

общие проблемы

  • Как увеличить скорость генерации? Скорость генерации может быть значительно увеличена за счет использования пакетного вывода и генерации кэш-функций.
  • Как интегрировать пользовательские функции? Для обработки сложной логики во время генерации можно использовать пользовательские функции Python.

 

Проблемы, связанные с неструктурированным выводом больших моделей

вопросы

Большие языковые модели (Large Language Models, LLM) обладают широкими возможностями генерации текстов, но недостаточно надежны при генерации структурированных данных. Это представляет собой серьезную проблему для приложений ИИ, ориентированных на агентов.

Основные вопросы

  • несоответствие результатов: При извлечении информации о рейсах из электронных писем идеальным вариантом был бы вывод последовательных JSON-объектов, но LLM часто не справляется с этой задачей, что приводит к таким проблемам, как "JSON decode errors".
  • Отсутствие надежности: Эта непредсказуемость затрудняет создание сложных модульных систем на основе LLM.

влиять (обычно негативно)

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

Преимущества структурированного вывода

Общая структура данных

Даже кажущиеся неструктурированными данные (например, наборы данных GSM) часто имеют внутреннюю структуру, которую можно использовать.

Гарантированный формат вывода

Задавая специальные структуры (например, JSON или регулярные выражения), вы можете гарантировать достоверность вывода и избежать утомительной постобработки.

Повышение производительности и эффективности

  • Повышение эффективности JSON: Эффективность JSON увеличилась с 17,7% до 99,9% при использовании структурированной генерации.
  • Сокращение потребности в примерах: В бенчмарке GSM8K производительность однократной структурированной генерации почти сравнима с восьмикратной неструктурированной генерацией.
  • Улучшение производительности открытой модели: В бенчмарке вызовов функций производительность повышается с 86% до 96,5%, даже превосходя GPT-4.

Структурированные и неструктурированные результаты

Чтобы лучше понять преимущества структурированного вывода, мы можем сравнить различия между структурированным и неструктурированным выводом на следующем примере.

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

неструктурированный вывод

Если выходные данные, генерируемые большой моделью, не имеют строгого форматирования, можно получить следующий текст:

飞往巴黎的航班在下周二,可能是早上10点,飞机是法国航空。

Этот вывод, хотя и содержит необходимую нам информацию (пункт назначения, дата, время, авиакомпания и т. д.), не имеет четкой структуры. Чтобы извлечь из него эту информацию, разработчику приходится разбирать каждое поле с помощью регулярных выражений или других методов обработки текста, что утомительно и чревато ошибками. Например, для разных входов модель может выдавать результаты в разном формате, что приводит к ошибкам обработки системы или "ошибкам декодирования JSON".

Структурированный вывод

Если используется структурированная генерация, модель будет возвращать данные, соответствующие заданному формату, например:

{
  "destination": "巴黎",
  "departure_date": "2024-11-25",
  "time": "10:00",
  "airline": "法国航空"
}

В этом случае результат получается единообразным и стандартизированным. Разработчику больше не нужно дополнительно обрабатывать или разбирать информацию, поскольку все ключевые поля уже возвращены в ожидаемом формате. Это не только экономит время разработки, но и значительно снижает вероятность ошибок.

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

 

Вызывает ли использование Outlines проблемы с производительностью для больших моделей?

Как работают конспекты?

обоснование

  • Обработка логита: После того как модель сгенерирует логиты, Outlines проверяет каждый возможный следующий токен и блокирует те, которые нарушают заданную структуру.
  • Оптимизация эффективности: Чрезвычайно низкие дополнительные накладные расходы благодаря эффективному маскированию.

типичный пример

"Если сгенерированный жетон разрушит структуру, она немедленно блокируется, чтобы процесс генерации строго следовал заданной структуре".

Замедляет ли структурированный вывод результатов?

Это не так. Напротив, структурированная генерация обычно ускоряет процесс генерации:

  • Сокращение количества бесполезных жетонов: Избегайте генерации избыточных имен полей или скобок, заранее определяя структуру.
  • Сокращение длины поколенияСтруктурированный вывод обычно содержит меньше лексем, выполняется быстрее и понятнее.

Сравнение Outlines с другими библиотеками структурированного генерирования

  • Сравните с руководством: Outlines имеет практически нулевые накладные расходы на этапе вывода, в то время как Guidance может значительно замедлиться при генерации большого количества лексем.
  • Сравнение с LMQLОсновными достоинствами Outlines являются легкость конструкции и эффективность.

пример кода

Ниже приведен пример использования Outlines для создания структурированных данных о событиях:

from datetime import datetime
from pydantic import BaseModel, Field
from outlines import generate, models

# 加载模型
model = models.mlxlm("mlx-community/Hermes-3-Llama-3.1-8B-8bit")

# 使用 Pydantic 定义事件结构
class Event(BaseModel):
    title: str = Field(description="title of the event")
    location: str
    start: datetime = Field(
        default=None, description="date of the event if available in iso format"
    )

# 获取当前时间
now = datetime.now().strftime("%A %d %B %Y and it's %H:%M")

# 定义提示
prompt = f"""
Today's date and time are {now}
Given a user message, extract information of the event like date and time in iso format, location and title.
If the given date is relative, think step by step to find the right date.
Here is the message:
"""

# 示例消息
message = """Hello Kitty, my grandmother will be here , I think it's better to postpone our
appointment to review math lessons to next Friday at 2pm at the same place, 3 avenue des tanneurs, I think that one hour will be enough
see you 😘 """

# 创建生成器
generator = generate.json(model, Event)

# 提取事件信息
event = generator(prompt + message)

# 输出结果
print(f"Today: {now}")
print(event.json())

Сформированная информация о событиях выглядит следующим образом:

{
  "title": "Math Review",
  "location": "3 avenue des tanneurs",
  "start": "2024-11-22T14:00:00Z"
}

Выводы и перспективы

Структурированная генерация - это уже не просто нишевая функция, а будущее приложений для больших моделей:

  • Повышенная надежность и эффективность: Производительность LLM значительно улучшается благодаря структурированной генерации.
  • Потенциал открытого исходного кода: Успех Outlines демонстрирует потенциал моделей с открытым исходным кодом для конкуренции с проприетарными моделями.

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

© заявление об авторских правах

Похожие статьи

Нет комментариев

Вы должны войти в систему, чтобы участвовать в комментариях!
Войти сейчас
нет
Нет комментариев...