Comments 15
Большое спасибо за содержательную и понятную статью!
Спасибо, было полезно:]
А как покинуть дополнительные параметры с контекста пользователя, Токен авторизации, например?
Как вариант, добавить в функции доп. параметр token. При формировании списка функций в виде JSON исключить его (чтобы LLM о нем не знала). А при вызове call_tool наоборот - добавить.
Но вообще у MCP есть варианты авторизации/аутентификации: https://gofastmcp.com/integrations/auth0
Спс! Судя по описанию в ссылке там авторизация выполняется сервер-сервер (хотя может я чего то недопонял)
А про параметры что то я вообще не понял :)
Если вернуться к текущей статье, то нам нужно авторизовать все же нашего HR. Ну и вообще несколько шире, если у HR открыта страничка "отдела продаж", то при создании сотрудника хотелось бы покинуть этот самый id отдела
Если хотите чтобы LLM сама прокидывала "id отдела", то нужно в промте его указать (захардкодить). Тогда LLM будет знать откуда сотрудник и подставлять в параметры функции его отдел.
Хм.. т.е. HR пишет текст: "добавь сотрудника петрова"
Я из него делаю "добавь сотрудника петрова, используй следующие параметры departmentId: 121
auth token: bla-bla-bla"
ЗЫ извиняюсь, если вопрос звучит "детским", но я и вправду с этими штуками пока только поверхностно знаком )
Да, как вариант. Но думаю можно и прокидывать эту информацию в функции при их вызове.
так вот я и не могу взять в толк, как их прокидывать при вызове, т.е. пользователь отправляет нативный запрос мне в приложение, я его могу модифицировать и ретранслировать в ЛЛМ, но вызов к апи то уже сама ЛЛМ делает, и в этот процесс, на сколько я понимаю, я вмешаться не могу
Все не так :) Попробуйте воспроизвести код в статье, чтобы понятнее было :)
LLM сама ничего вызвать не может. LLM это генератор текста, она может только напечатать текст. И таки образом сообщить нам, что она хочет вызвать какой то инструмент. А мы уже должны сами распарсить это желание и вызвать нужный инструмент.
В статье это делается так:tool_result = await call_tool(
tool_name=tool.function.name,
arguments=eval(tool.function.arguments)
)
Вот здесь в arguments и можно подсунуть то что нам нужно.
А есть ли польза, если совмещать подачу в ллм доступных инструментов и применять Structured Output схему? Например, если ожидается что в этом запросе будут использоваться конкретные методы и только аргументы неизвестны.
Подскажите пожалуйста, почему Вы выбрали вариант Hermes и Deepseek в качестве парсеров?
Разве модель qwen3-14b не умеет сразу в strict json — т.е. сразу генерировать tool call формат?
Так написано в официальной документации: https://qwen.readthedocs.io/en/latest/framework/function_call.html#vllm
Разработка MCP-сервера на примере CRUD операций