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

Недавно я запустил образовательный информационный бюллетень, посвященный ИИ, у которого уже более 160 000 подписчиков. TheSequence — это информационный бюллетень, ориентированный на машинное обучение, без BS (то есть без шумихи, без новостей и т. д.), чтение которого занимает 5 минут. Цель состоит в том, чтобы держать вас в курсе проектов машинного обучения, научных работ и концепций. Пожалуйста, попробуйте, подписавшись ниже:



Внедрение руководства обеспечивает превосходный и более эффективный контроль над современными языковыми моделями по сравнению с традиционными методологиями подсказок или цепочек. Используя программы управления, пользователи могут плавно объединять генерацию, подсказки и логическое управление, тем самым создавая непрерывный поток, который соответствует встроенному механизму обработки текста языковой модели. Опытным путем было продемонстрировано, что оптимизация структуры вывода с помощью простых фреймворков, таких как Chain of Thought, наряду с его разнообразными вариациями, такими как ART, Auto-CoT и т. д., повышает производительность языковых моделей. Внедрение передовых LLM, таких как GPT-4, дает возможность создавать еще более сложные структуры, а руководство служит помощником для создания таких структур с легкостью и экономичностью.

Руководство включает в себя ряд ключевых функций, которые обеспечивают больше контроля при использовании LLM:

· Использует простой и удобный синтаксис, вдохновленный шаблонами Handlebars.

· Предлагает широкий спектр выходных структур, включающих несколько поколений, выборки, условные операторы, использование инструментов и многое другое.

· Обеспечивает возможность потоковой передачи в Jupyter/VSCode Notebook, как на игровой площадке.

· Реализует интеллектуальное кэширование генерации на основе начальных методов.

· Поддерживает ролевые модели чата, такие как ChatGPT.

Использование руководства

Простота Guidance упрощает начало работы. Структура руководства при первоначальном осмотре источает характеристики, напоминающие язык шаблонов. Подобно обычным шаблонам Handlebars, он позволяет пользователям выполнять интерполяцию переменных, обозначаемых такими конструкциями, как {{пословица}}, и осуществлять логическое управление. Однако, в отличие от стандартных языков шаблонов, программы управления придерживаются тщательно определенного линейного порядка выполнения, который точно соответствует порядку токенов, которому следуют на этапе обработки языковой модели.

import guidance

# set the default language model used to execute guidance programs
guidance.llm = guidance.llms.OpenAI("text-davinci-003")

# define a guidance program that adapts a proverb
program = guidance("""Tweak this proverb to apply to model instructions instead.

{{proverb}}
- {{book}} {{chapter}}:{{verse}}

UPDATED
Where there is no guidance{{gen 'rewrite' stop="\\n-"}}
- GPT {{gen 'chapter'}}:{{gen 'verse'}}""")

# execute the program on a specific proverb
executed_program = program(
    proverb="Where there is no guidance, a people falls,\nbut in an abundance of counselors there is safety.",
    book="Proverbs",
    chapter=11,
    verse=14
)

Что производит следующий вывод:

Благодаря унифицированному API, основанному на тегах ролей (например, {{#system}}…{{/system}}), Guidance расширяет поддержку моделей чата на основе API, таких как GPT-4, и моделей открытых чатов, таких как Vicuna. Эта интеграция обеспечивает плавную разработку интерактивных диалогов, в которых гармонично сочетаются богатые шаблоны, логический контроль и возможности, предлагаемые передовыми моделями чата.

# connect to a chat model like GPT-4 or Vicuna
gpt4 = guidance.llms.OpenAI("gpt-4")
# vicuna = guidance.llms.transformers.Vicuna("your_path/vicuna_13B", device_map="auto")

experts = guidance('''
{{#system~}}
You are a helpful and terse assistant.
{{~/system}}

{{#user~}}
I want a response to the following question:
{{query}}
Name 3 world-class experts (past or present) who would be great at answering this?
Don't answer the question yet.
{{~/user}}

{{#assistant~}}
{{gen 'expert_names' temperature=0 max_tokens=300}}
{{~/assistant}}

{{#user~}}
Great, now please answer the question as if these experts had collaborated in writing a joint anonymous answer.
{{~/user}}

{{#assistant~}}
{{gen 'answer' temperature=0 max_tokens=500}}
{{~/assistant}}
''', llm=gpt4)

experts(query='How can I be more productive?')

Что приводит к следующему результату:

Программы управления, похожие на обычные шаблоны Handlebars, расширяют поддержку как интерполяции переменных (например, {{input}}), так и логического управления. Однако что отличает программы управления от стандартных языков шаблонов, так это их четкий линейный порядок выполнения, который напрямую отражает порядок токенов, наблюдаемый во время обработки языковой модели. Эта уникальная характеристика позволяет пользователям использовать возможности языковой модели на любом этапе выполнения: генерация текста с помощью команды {{gen}} или принятие решений на основе логического потока управления с помощью {{#select}}…{{or}}… {{/select}} команда. Путем беспрепятственного чередования генерации и подсказок достигаются точные выходные структуры, что приводит к повышенной точности и одновременному получению прозрачных и легко анализируемых результатов.

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

import guidance
                                                      
# set the default language model used to execute guidance programs
guidance.llm = guidance.llms.OpenAI("text-davinci-003") 

# define the few shot examples
examples = [
    {'input': 'I wrote about shakespeare',
    'entities': [{'entity': 'I', 'time': 'present'}, {'entity': 'Shakespeare', 'time': '16th century'}],
    'reasoning': 'I can write about Shakespeare because he lived in the past with respect to me.',
    'answer': 'No'},
    {'input': 'Shakespeare wrote about me',
    'entities': [{'entity': 'Shakespeare', 'time': '16th century'}, {'entity': 'I', 'time': 'present'}],
    'reasoning': 'Shakespeare cannot have written about me, because he died before I was born',
    'answer': 'Yes'}
]

# define the guidance program
structure_program = guidance(
'''Given a sentence tell me whether it contains an anachronism (i.e. whether it could have happened or not based on the time periods associated with the entities).
----

{{~! display the few-shot examples ~}}
{{~#each examples}}
Sentence: {{this.input}}
Entities and dates:{{#each this.entities}}
{{this.entity}}: {{this.time}}{{/each}}
Reasoning: {{this.reasoning}}
Anachronism: {{this.answer}}
---
{{~/each}}

{{~! place the real question at the end }}
Sentence: {{input}}
Entities and dates:
{{gen "entities"}}
Reasoning:{{gen "reasoning"}}
Anachronism:{{#select "answer"}} Yes{{or}} No{{/select}}''')

# execute the program
out = structure_program(
    examples=examples,
    input='The T-rex bit my dog'
)

Создание следующего вывода:

В сценариях, где одна программа руководства охватывает несколько поколений или операторов потока управления, направленных на LLM, возникает замечательная возможность существенно повысить эффективность логического вывода. Это достигается за счет проницательного повторного использования кэшей ключей/значений при навигации по подсказке. Следовательно, структура руководства интеллектуально инструктирует LLM генерировать исключительно обозначенный зеленый текстовый раздел вместо обработки всей программы. Такой подход приводит к заметному сокращению времени выполнения этой подсказки на 50% по сравнению с традиционной методологией генерации.

# we use LLaMA here, but any GPT-style model will do
llama = guidance.llms.Transformers("your_path/llama-7b", device=0)

# we can pre-define valid option sets
valid_weapons = ["sword", "axe", "mace", "spear", "bow", "crossbow"]

# define the prompt
character_maker = guidance("""The following is a character profile for an RPG game in JSON format.
```json
{
    "id": "{{id}}",
    "description": "{{description}}",
    "name": "{{gen 'name'}}",
    "age": {{gen 'age' pattern='[0-9]+' stop=','}},
    "armor": "{{#select 'armor'}}leather{{or}}chainmail{{or}}plate{{/select}}",
    "weapon": "{{select 'weapon' options=valid_weapons}}",
    "class": "{{gen 'class'}}",
    "mantra": "{{gen 'mantra' temperature=0.7}}",
    "strength": {{gen 'strength' pattern='[0-9]+' stop=','}},
    "items": [{{#geneach 'items' num_iterations=5 join=', '}}"{{gen 'this' temperature=0.7}}"{{/geneach}}]
}```""")

# generate a character
character_maker(
    id="e1f491f7-7ab8-4dac-8c20-c92b5e7d883d",
    description="A quick and nimble fighter.",
    valid_weapons=valid_weapons, llm=llama
)

Генерация следующего вывода:

Руководство позволяет вам вызывать функции Python, используя следующий синтаксис:

def aggregate(best):
   return '\n'.join(['- ' + x for x in best])
prompt = guidance('''The best thing about the beach is {{~gen 'best' n=3 temperature=0.7 max_tokens=7 hidden=True}}
{{aggregate best}}''')
prompt = prompt(aggregate=aggregate)
prompt

Кроме того, приостановка выполнения до тех пор, пока не будет предоставлен конкретный ввод:

prompt = guidance('''Generate a response to the following email:
{{email}}.
Response:{{gen "response"}}
{{await 'instruction'}}
{{gen 'updated_response'}}''', stream=True)
prompt = prompt(email='Hello there')
prompt

Руководство предоставляет один из самых простых и полных способов разработки сложных рабочих процессов LLM. Многие идеи, лежащие в основе Guidance, вероятно, повлияют на будущее программирования на основе LLM.