Как стать автором
Обновить

Комментарии 4

Не очень понятно, что именно дословно спускается в модель. Как модель понимает что такое tool, как его вызывать, в каком формате принимать и передавать данные. Где это всё запромпчено? Интересно было бы увидеть полный лог всех токенов запуска модели. На скриншотах logfire этого тоже не увидел: агенту говорится, что он агент по погоде, и тут же раз и tool call в нужном формате. Как он догадался?

В контексте агентов с тулами логику можно описать следующим образом:
Агент может "вызвать" функцию, вернув json, который эту функцию описывает.
В моем примере это выглядит так:

{4 items
"role": "assistant"
,
"tool_calls": [1 item
0: {3 items
"id": "rw7sMUNny"
,
"type": "function"
,
"function": {2 items
"name": "duckduckgo_search"
,
"arguments": "{\"query\": \"Температура в Москве\"}"
,
}
}

Потому тула начинает выполнять запросы в интернет, например:

{7 items
"content": [10 items
0: {3 items
"title": "Погода В Москве - Gismeteo"
,
"href": "https://www.gismeteo.ru/weather-moscow-4368/"
,
"body": "Погода в Москве на сегодня, подробный прогноз погоды на сегодня для населенного пункта Москва, Москв..."
,
}
1: {3 items
"title": "Прогноз погоды в Москве на 10 дней — Яндекс.Погода"
,
"href": "https://yandex.ru/pogoda/moscow"
,
"body": "Подробный прогноз погоды для Москвы на сегодня, завтра, неделю, 10 дней, месяц на Яндекс.Погоде. Про..."
,
}

В итоге на основе контекста из тулы формируется финальный ответ

{4 items
"role": "assistant"
,
"tool_calls": [1 item
0: {3 items
"id": "xYPRWInGS"
,
"type": "function"
,
"function": {2 items
"name": "final_result"
,
"arguments": "{\"description\": \"Сейчас на улице тепло, достаточно надеть легкую куртку\", \"temperature\": 14, \"wind_speed\": 2}"
,
}
}
]
"gen_ai.message.index": 3
,
"event.name": "gen_ai.assistant.message"
,


Функция выполняется у вас локально, результат её вызова переходит в контекст Input запроса модели. То есть в ваш системный промпт и промпт пользователя подмешивается еще респанс с тулы, из за чего значительно растет расход токенов на input.
Модель соответственно анализируя все это выдает финальный ответ, качество которого зависит от системного промпта, запроса пользователя и качества работы самой тулы.
В реальности, а не как на игрушечном примере в этой статье, вы скорее всего захотите более явно и подробно описать и через системный промпт те тулы, которые вы хотите использовать, а также само описание тулов также сделаете подробным.
Также когда у вас есть конкретно определенный формат вывода, например через модель Pydantic, модель будет подстраивать агрументы в тулу так, чтобы выполнить все что вы указали, при этом формируя аргументы функции не за один раз, а за несколько запросов, пока все поля не будут заполнены (в идеале)
Подробнее можно почитать в документации от Open AI: https://platform.openai.com/docs/guides/function-calling?api-mode=responses&example=get-weather#overview.

Надеюсь смог ответить на ваш вопрос

Так а как модели объясняется, в каком формате строить обращение в тулу и как парсить ответ? Это же простыня промпта должна быть с синтаксисом json, правилами формирования, примерами вызова, кодов возврата и т.п. Должна ли модель быть предварительно обучена пользованию тулов, или сгодится lama3 например?

Мне кажется это out-of-scope вопрос, который больше подходит для отдельной небольшой статьи.
Во первых по вопросу об LLama я предлагаю изучить системную карточку/статью данной модели, а именно конкретной с xxB параметрами модели.
Для LLama 3.1 например представлен специальный токен:
<|python_tag|>
он как раз используется для того чтобы обозначить модели представленный тул.
Также в карточке LLama представлено множество примеров того, как на уровне специальных токенов размечается текст, чтобы модель поняла то, что от неё хотят.
Также там обозночается, что 8B модель по идее может работать с тулами, но качество может быть сомнительным.

картинка принципа работы с тулами
картинка принципа работы с тулами

У Transformers есть неплохое объяснение того как это можно реализовать, абстрагируясь от Pytorch (в качестве низкоуровневой библиотеки), без каких либо сторонних API эндпоинтов.
На уровне модели:
статья: https://huggingface.co/blog/unified-tool-use
документация: https://huggingface.co/docs/transformers/main/chat_extras#tools

Актуальные модели умеют с этим работать и могут быть дообучены под эти задачи.
статьи про это:
Toolformer: Language Models Can Teach Themselves to Use Tools:
https://arxiv.org/pdf/2302.04761
TOOLFLOW: Boosting LLM Tool-Calling Through Natural and Coherent Dialogue Synthesis:
https://arxiv.org/pdf/2410.18447

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации