Apple обновила документацию по работе с Foundation Models и добавила страницу с руководством по промптингу локальных языковых моделей. В документе подчёркивают, что правила немного отличаются от принципов промптинга облачных моделей из-за ограниченных ресурсов устройств.

Foundation Models — фреймворк от Apple, который позволяет разработчикам использовать в проектах локальные языковые модели. Благодаря этому можно реализовывать несложные нейросетевые функции с офлайн-доступом.

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

  • Пишите чётко и в повелительной форме. Стоит избегать размытых формулировок, жаргона, двусмысленных фраз и всего, что модель может неправильно понять. Сложны�� задания лучше разделять на более простые и понятные.

  • Задайте роль. Старайтесь объяснять модели, какую роль ей следует отыгрывать. Это поможет генерировать более релевантные ответы. Например, для приложения, которое отвечает на вопросы по разработке, подойдёт роль опытного программиста, а для игры про Дикий Запад — ковбоя.

  • Помните про контекстное окно. Локальные модели упираются в производительность устройств, что надо учитывать при формировании запроса. Контекстное окно Foundation Models составляет всего 4096 токенов. Кроме того, чем больше входных токенов, тем меньше остаётся токенов для ответа.

  • Указывайте язык вывода. Сам запрос можно составить на английском языке, но отдельно указать, на каком языке следует генерировать ответ.

Запросы с несколькими условиями инженеры Apple рекомендуют разделять с помощью управляющих конструкций. Это поможет модели не отвлекаться на условия, которые неприменимы в конкретной ситуации. 

Например, следующий запрос в проекте:

let instructions = """
    You are a friendly innkeeper. Generate a greeting to a new guest that walks in the door.
    IF the guest is a sorcerer, comment on their magical appearance.
    IF the guest is a bard, ask if they're willing to play music for the inn tonight.
    IF the guest is a soldier, ask if there’s been any dangerous activity in the area.
    There is one single and one double room available.
    """

Можно разделить с помощью конструкции switch-case:

var customGreeting = ""
switch role {
case .bard:
    customGreeting = """
        This guest is a bard. Ask if they’re willing to play music for the inn tonight.
        """
case .soldier:
    customGreeting = """
        This guest is a soldier. Ask if there’s been any dangerous activity in the area.
        """
case .sorcerer:
    customGreeting = """
        This guest is a sorcerer. Comment on their magical appearance.
        """
default:
    customGreeting = "This guest is a weary traveler."
}


let instructions = """
    You are a friendly inn keeper. Generate a greeting to a new guest that walks in the door.
    \(customGreeting)
    There is one single and one double room available.
    """

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

// Instructions that contain JSON key-value pairs that represent the structure
// of a customer. The structure tells the model that each customer must have
// a `name`, `imageDescription`, and `coffeeOrder` fields.
let instructions = """
    Create an NPC customer with a fun personality suitable for the dream realm. \
    Have the customer order coffee. Here are some examples to inspire you:

    {name: "Thimblefoot", imageDescription: "A horse with a rainbow mane", \
    coffeeOrder: "I would like a coffee that's refreshing and sweet, like the grass in a summer meadow."}
    {name: "Spiderkid", imageDescription: "A furry spider with a cool baseball cap", \
    coffeeOrder: "An iced coffee please, that's as spooky as I am!"}
    {name: "Wise Fairy", imageDescription: "A blue, glowing fairy that radiates wisdom and sparkles", \
    coffeeOrder: "Something simple and plant-based, please. A beverage that restores my wise energy."}
    """