Вызов функции OpenAI

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

  • Для вызова внешних API.
  • Преобразование запросов на естественном языке в вызовы API или вызовы базы данных
  • Извлечение структурированных данных из текста

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

Чтобы получить текущую цену акций компании, зарегистрированной в США, мы будем использовать Finnhub. Finnhub предоставляет бесплатный ключ API, который можно получить, выполнив следующие действия:

  • Перейти на Сайт Finnhub.
  • Нажмите «Получить бесплатный ключ API», а затем зарегистрируйтесь.

Он предоставит вам ключ API, который мы будем использовать для получения цен на акции.

Чтобы получить текущий курс обмена валюты между двумя странами, мы будем использовать Alphavantage. Alpha Vantage также предоставляет бесплатный ключ API, который можно получить, выполнив следующие действия:

  • Перейти на Сайт AlphaVantage.
  • Нажмите кнопку «ПОЛУЧИТЕ БЕСПЛАТНЫЙ API-КЛЮЧ СЕГОДНЯ», а затем заполните короткую форму.

Он предоставит вам ключ API, который мы будем использовать для получения курсов обмена валют между двумя странами.

Теперь, когда у нас есть ключи API Finnhub и Alpha Vantage, мы можем приступить к созданию приложения. Ниже приведено пошаговое руководство, которому вы можете следовать, чтобы создать приложение:

Шаг 1:

Для начала вам нужно установить два пакета, openai и finnhub-python, используя следующие команды:

pip install openai
pip install finnhub-python

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

import json
import requests
import finnhub

Шаг 2:

Во-первых, мы создаем утилиту, которая упрощает запросы к Chat Completions API. Вспомогательная функция принимает четыре параметра: сообщения, функции, вызов функции и модель. Назначение каждого параметра следующее:

сообщения: требуется приглашение, которое будет использоваться при вызове API ChatGPT.

functions: Он возьмет список доступных спецификаций функций, которые могут быть вызваны ChatGPT.

function_call: этот параметр позволяет нам указать либо имя конкретной функции, либо установить его как «Нет». Когда указано имя функции, API будет направлено на вызов этой конкретной функции. Если мы хотим, чтобы модель OpenAI не использовала какую-либо функцию, нам нужно передать этот аргумент как None.

модель: t будет называться моделью, которую мы хотим использовать, здесь мы используем модель «gpt-3.5-turbo-0613». Вы также можете использовать «gpt-4–0613».

Эта функция вызовет конечную точку завершения чата OpenAI с соответствующими параметрами и вернет ответ.

def chat_completion_request(messages, functions=None, function_call=None, model=GPT_MODEL):
    headers = {
        "Content-Type": "application/json",
        "Authorization": "Bearer " + "<your_openai_key>",
    }
    json_data = {"model": model, "messages": messages}
    if functions is not None:
        json_data.update({"functions": functions})
    if function_call is not None:
        json_data.update({"function_call": function_call})
    try:
        response = requests.post(
            "https://api.openai.com/v1/chat/completions",
            headers=headers,
            json=json_data,
        )
        return response
    except Exception as e:
        print("Unable to generate ChatCompletion response")
        print(f"Exception: {e}")
        return e

Шаг 3:

Далее мы разработаем функцию вызова Finnhub API для получения текущей цены акций компании, зарегистрированной в США. Во-первых, вам нужно создать клиент finnhub, передав API finnhub. Затем мы можем написать нашу функцию, как показано ниже:

finnhub_client = finnhub.Client(api_key="<Your_finnhub_API_key>")
def get_current_stock_price(arguments):
    try:
        arguments = json.loads(arguments)['ticker_symbol']
        price_data=finnhub_client.quote(arguments)
        stock_price = price_data.get('c', None)
        if stock_price == 0:
            return "This company is not listed within USA, please provide another name."
        else:
            return stock_price
    except:
        return "This company is not listed within USA, please provide another name."

Шаг 4:

Далее мы создадим функцию, которая будет вызывать Alpha Vantage API для получения курса обмена валюты между двумя странами. Вам нужно добавить следующие строки кода для реализации функции.

def currency_exchange_rate(arguments):
    try:
        from_country_currency = json.loads(arguments)['from_country_currency']
        to_country_currency = json.loads(arguments)['to_country_currency']
        url = f'https://www.alphavantage.co/query?function=CURRENCY_EXCHANGE_RATE&from_currency={from_country_currency}&to_currency={to_country_currency}&apikey='<your_Alphavantage_api_key>''
        r = requests.get(url)
        data = r.json()
        return data['Realtime Currency Exchange Rate']['5. Exchange Rate']
    except:
        return "I am unable to parse this, please try something new."

Шаг 5:

Теперь нам нужно создать спецификации функций для взаимодействия с Finnhub API и Alpha Vantage API. Мы передадим эти спецификации функций в Chat Completions API, чтобы сгенерировать аргументы функции, соответствующие спецификации. В этой спецификации функции необходимо указать имя и описание функции и ее параметров. Вы можете описать функциональную спецификацию следующим образом:

functions = [
    {
        "name": "get_current_stock_price",
        "description": "It will get the current stock price of the US company.",
        "parameters": {
            "type": "object",
            "properties": {
                "ticker_symbol": {
                    "type": "string",
                    "description": "This is the symbol of the company.",
                }
            },
            "required": ["ticker_symbol"],
        },
    },
    {
        "name": "currency_exchange_rate",
        "description": "It will get the currency exchange rate between 2 countries.",
        "parameters": {
            "type": "object",
            "properties": {
                "from_country_currency": {
                    "type": "string",
                    "description": "This is the currency of the country whose we need to map.",
                },
                "to_country_currency": {
                    "type": "string",
                    "description": "This is the currency of the country to which we need to map.",
                }
            },
            "required": ["from_country_currency","to_country_currency"],
        },
    }]

Шаг 6:

Теперь мы можем использовать возможности вызова функций OpenAI. Нам нужно вызвать API завершения чата с подсказками и спецификациями функций. Он вызовет ChatGPT и сгенерирует JSON, который мы можем использовать для вызова функции в нашем коде. Вы можете использовать приведенный ниже код для генерации JSON, который в дальнейшем будет использоваться для вызова локальной функции.

user_input = input("Please enter your question here: ")
# prompt
messages = [{"role": "system", "content": "Don't make assumptions about what values to plug into functions. Ask for clarification if a user request is ambiguous."}]
messages.append({"role": "user", "content": user_input})
# calling chat_completion_request to call ChatGPT completion endpoint
chat_response = chat_completion_request(
    messages, functions=functions
)
# fetch response of ChatGPT and call the function
assistant_message = chat_response.json()["choices"][0]["message"]
print(assistant_message)

Выход:

Мы спросили: «Какова цена акций Apple?». ChatGPT признал необходимость вызова функции «get_current_stock_price» с параметром «AAPL» для доступа к API Finnhub. Таким образом, он выдал ответ JSON, содержащий имя функции и соответствующий параметр, необходимый для выполнения локальной функции.

Please enter your question here: What is the stock price of Apple?
{'role': 'assistant', 'content': None, 'function_call': {'name': 'get_current_stock_price', 'arguments': '{\n  "ticker_symbol": "AAPL"\n}'}}

Шаг 7:

Теперь мы можем вызвать локальную функцию «get_current_stock_price», используя JSON, сгенерированный ChatGPT, как показано ниже:

if assistant_message['content']: print("Response is: ", assistant_message['content']) else: fn_name = assistant_message["function_call"]["name"] arguments = assistant_message["function_call"]["arguments"] function = locals()[fn_name] result = function(arguments) print("Response is: ", result)
if assistant_message['content']:
    print("Response is: ", assistant_message['content'])
else:
    fn_name = assistant_message["function_call"]["name"]
    arguments = assistant_message["function_call"]["arguments"]
    function = locals()[fn_name]
    result = function(arguments)
    print("Response is: ", result)

Выход:

Please enter your question here: What is the stock price of Apple?
{'role': 'assistant', 'content': None, 'function_call': {'name': 'get_current_stock_price', 'arguments': '{\n  "ticker_symbol": "AAPL"\n}'}}
Response is:  184.92

Шаг 8:

Теперь мы можем объединить 2 вышеуказанных шага, чтобы сгенерировать JSON с помощью ChatGPT и вызвать локальную функцию, используя сгенерированный JSON, и поместить их в цикл, как показано ниже:

user_input = input("Please enter your question here: (if you want to exit then write 'exit' or 'bye'.) ")
while user_input.strip().lower() != "exit" and user_input.strip().lower() != "bye":
    # prompt
    messages = [{"role": "system", "content": "Don't make assumptions about what values to plug into functions. Ask for clarification if a user request is ambiguous."}]
    messages.append({"role": "user", "content": user_input})
    # calling chat_completion_request to call ChatGPT completion endpoint
    chat_response = chat_completion_request(
        messages, functions=functions
    )
    # fetch response of ChatGPT and call the function
    assistant_message = chat_response.json()["choices"][0]["message"]
    if assistant_message['content']:
        print("Response is: ", assistant_message['content'])
    else:
        fn_name = assistant_message["function_call"]["name"]
        arguments = assistant_message["function_call"]["arguments"]
        function = locals()[fn_name]
        result = function(arguments)
        print("Response is: ", result)
    user_input = input("Please enter your question here: ")

Полученные результаты:

Please enter your question here: (if you want to exit then write 'exit' or 'bye'.) 1 dollar is equal to what rs?    
Response is:  81.94000000
Please enter your question here: What is the current stock price of Amazon?
Response is:  125.4902
Please enter your question here: Currency exchange rate between india and canada?
Response is:  0.01606000
Please enter your question here: Stock price of Tesla?
Response is:  260.54

Вы также можете использовать приведенный ниже colab для запуска вышеуказанного кода.

https://colab.research.google.com/drive/1Ki1gDUfF8bWw8Z-pr0IDHtLrGXM2G7NL?usp=sharing

Первоначально опубликовано в разделе Вызов функций OpenAI с примерами внешнего API 21 июня 2023 г.