# Вызов функций с помощью LLM

import {Cards, Card} from 'nextra-theme-docs'
import {CodeIcon} from 'components/icons'

## Начало работы с вызовом функций

Вызов функций — это возможность надежно подключать LLM к внешним инструментам, чтобы обеспечить эффективное использование инструментов и взаимодействие с внешними API.

LLM, такие как GPT-4 и GPT-3.5, были точно настроены, чтобы определять, когда необходимо вызвать функцию, а затем выводить JSON, содержащий аргументы для вызова функции. Функции, вызываемые при вызове, будут действовать как инструменты в вашем ИИ приложении, и вы можете определить более одной функции в одном запросе.

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

Вызов функций позволяет разработчикам создавать:

- диалоговые агенты, которые могут эффективно использовать внешние инструменты для ответов на вопросы. Например, запрос «Какая погода в Белизе?» будет преобразовано в вызов функции, такой как `get_current_weather(location: string, unit: 'celsius' | 'fahrenheit')`
- Решения на базе LLM для извлечения и маркировки данных (например, извлечение имен людей из статьи в Википедии).)
- приложения, которые могут помочь преобразовать естественный язык в вызовы API или запросы к базе данных.
- диалоговые механизмы поиска знаний, которые взаимодействуют с базой знаний

В этом руководстве мы покажем, как предлагать моделям, таким как GPT-4, и моделям с открытым исходным кодом, выполнять вызов функций для различных сценариев использования.

## Вызов функций с помощью GPT-4

В качестве простого примера предположим, что мы попросили модель проверить погоду в данном месте.

Один только LLM не сможет ответить на этот запрос, поскольку он был обучен на наборе данных. Способ решения этой проблемы — объединить LLM с внешним инструментом. Вы можете использовать возможности вызова функций модели, чтобы определить функцию для вызова вместе с ее аргументами, а затем вернуть ответ. Ниже приведен простой пример того, как этого можно добиться с помощью API OpenAI.

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

```
What is the weather like in London?
```

Чтобы обработать этот запрос с помощью вызова функции, первым шагом является определение функции погоды или набора функций, которые вы будете передавать как часть запроса API OpenAI:

```python
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_current_weather",
            "description": "Get the current weather in a given location",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city and state, e.g. San Francisco, CA",
                    },
                    "unit": {
                        "type": "string", 
                        "enum": ["celsius", "fahrenheit"]},
                },
                "required": ["location"],
            },
        },   
    }
]
```

Функция `get_current_weather` возвращает текущую погоду в заданном месте. Когда вы передаете это определение функции как часть запроса, оно фактически не выполняет функцию, а просто возвращает JSON  объект, содержащий аргументы, необходимые для вызова функции. Вот несколько фрагментов кода, как этого добиться.

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

```python
def get_completion(messages, model="gpt-3.5-turbo-1106", temperature=0, max_tokens=300, tools=None):
    response = openai.chat.completions.create(
        model=model,
        messages=messages,
        temperature=temperature,
        max_tokens=max_tokens,
        tools=tools
    )
    return response.choices[0].message
```

Вот как вы могли бы составить вопрос пользователя:

```python
messages = [
    {
        "role": "user",
        "content": "What is the weather like in London?"
    }
]
```

Наконец, вы можете вызвать метод `get_completion` выше и передать как `сообщения`, так и `инструменты`:

```python
response = get_completion(messages, tools=tools)
```

Объект `response` содержит следующее:

```python
ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='...', function=Function(arguments='{"location":"London","unit":"celsius"}', name='get_current_weather'), type='function')])
```

В частности, объект `аргументы` содержит важные аргументы, извлеченные моделью и необходимые для выполнения запроса.

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

## Блокноты

Вот блокнот с простым примером, демонстрирующим, как использовать вызов функций с OpenAI API:

<Cards>
    <Card 
        icon={<CodeIcon />}
        title="Function Calling with OpenAI APIs"
        href="https://github.com/dair-ai/Prompt-Engineering-Guide/blob/main/notebooks/pe-function-calling.ipynb"
    />
</Cards>

## Вызов функций с помощью LLM с открытым исходным кодом
Дополнительные заметки о вызове функций с помощью LLM с открытым исходным кодом появятся скоро.

## Варианты использования вызова функций

Ниже приведен список случаев использования, которые могут извлечь выгоду из возможности вызова функций LLM:

- **Диалоговые агенты**: вызов функций можно использовать для создания сложных диалоговых агентов или чат-ботов, которые отвечают на сложные вопросы, вызывая внешние API или внешнюю базу знаний и предоставляя более релевантные и полезные ответы.

- **Понимание естественного языка**: он может преобразовывать естественный язык в структурированные данные JSON, извлекать структурированные данные из текста и выполнять такие задачи, как распознавание именованных объектов, анализ настроений и извлечение ключевых слов.

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

- **Интеграция API**: его можно использовать для эффективной интеграции LLM с внешними API для получения данных или выполнения действий на основе входных данных. Это может быть полезно для создания системы контроля качества или творческого помощника. В общем, вызов функций может преобразовать естественный язык в действительные вызовы API.

- **Извлечение информации**: вызовы функций можно эффективно использовать для извлечения конкретной информации из заданных входных данных, например для получения соответствующих новостей или ссылок из статьи.


## Использованная литература
- [Fireworks Raises the Quality Bar with Function Calling Model and API Release](https://blog.fireworks.ai/fireworks-raises-the-quality-bar-with-function-calling-model-and-api-release-e7f49d1e98e9)
- [Benchmarking Agent Tool Use and Function Calling](https://blog.langchain.dev/benchmarking-agent-tool-use/)
- [Function Calling](https://ai.google.dev/docs/function_calling)
- [Interacting with APIs](https://python.langchain.com/docs/use_cases/apis)
- [OpenAI's Function Calling](https://platform.openai.com/docs/guides/function-calling)
- [How to call functions with chat models](https://cookbook.openai.com/examples/how_to_call_functions_with_chat_models)
- [Pushing ChatGPT's Structured Data Support To Its Limits](https://minimaxir.com/2023/12/chatgpt-structured-data/)
- [Math Problem Solving with Function Calling](https://github.com/svpino/openai-function-calling/blob/main/sample.ipynb)

