Объединение ChatGPT с Wolfram Alpha для получения более точных результатов вычислений.

Введение

ChatGPT сам по себе не так хорош для выполнения вычислений или возврата числовых ответов. Он не только каждый раз будет давать вам разные ответы, но также будет составлять числа и формулировать их убедительно. Я знал, что есть способ это исправить, и был полон решимости найти решение.

В этом сообщении блога мы рассмотрим, как создать чат-бот на Python, который сочетает в себе возможности ChatGPT и Wolfram Alpha, чтобы обеспечить более полный и интеллектуальный диалог.

ChatGPT, основанный на OpenAI, представляет собой большую языковую модель, которая может генерировать ответы, подобные человеческим, на пользовательский ввод с использованием обработки естественного языка. Его можно обучить на широком спектре источников данных, и он может генерировать ответы практически на любой запрос. Wolfram Alpha, с другой стороны, представляет собой вычислительную машину знаний, которая может решать проблемы в различных областях, но особенно известна своей способностью решать математические и научные вопросы.

Объединив эти два мощных инструмента, мы можем создать чат-бота, способного давать надежные и интеллектуальные ответы на более широкий спектр пользовательских запросов.

Информация об API

1 марта 2023 года OpenAI выпустила ChatGPT API, что дало мне прекрасную возможность продолжить этот проект. На самом деле я работал над этим проектом несколько недель назад с API GPT-3, но ответы были не такими человеческими, как ответы API ChatGPT. API ChatGPT также упрощает разработку подсказок, о чем я расскажу позже в этой статье.

Я забыл упомянуть, что в OpenAI есть библиотека Python, которая предоставляет альтернативу HTTP-запросам. Я использовал библиотеку Python для этого проекта, хотя я считаю, что этот проект будет работать так же, если мы будем использовать HTTP-запросы.

Wolfram Alpha имеет API коротких ответов, который возвращает один результат в виде обычного текста непосредственно из Wolfram Alpha. Он имеет собственную обработку естественного языка, которая позволяет пользователям передавать запросы, связанные с вычислениями, и получать ответ в виде обычного текста. Мне показалось, что это идеальный API для слияния с API ChatGPT, чтобы получить более полный чат-бот, обеспечивающий лучший пользовательский интерфейс.

Чат-бот

Этот чат-бот работает, принимая пользовательский ввод и передавая его непосредственно в ChatGPT для обработки. Если ChatGPT определяет, что пользователь ввел расчетный, фактический или аналитический вопрос, он передается API коротких ответов Wolfram Alpha, который возвращает ответ. Все остальные запросы обрабатываются и отвечают ChatGPT как обычно.

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

import requests
import wolframalpha
import openai
import re
from APIKeys import WOLFRAM_APP_ID, OPENAI_API_KEY

# Wolfram Alpha credentials
client = wolframalpha.Client(WOLFRAM_APP_ID)

# OpenAI credentials
openai.api_key = OPENAI_API_KEY

Далее нам понадобится функция, которая сможет обрабатывать ввод пользователя через ChatGPT. Именно здесь выполняется основная часть работы, особенно при быстром инжиниринге.

В этой функции мы отправляем ввод пользователя в API ChatGPT, используя метод openai.ChatCompletion.create() и параметр engine, установленный на gpt-3.5-turbo, самую продвинутую языковую модель OpenAI на момент написания этой статьи. Мы также установили температуру на 0,2, чтобы генерировать меньше случайных ответов. Кроме того, мы устанавливаем параметр max_tokens равным 256, чтобы ограничить длину генерируемого ответа. Наконец, мы возвращаем сгенерированный текст ответа. Для получения дополнительной информации о том, как работают эти параметры, ознакомьтесь со Справочной документацией по API.

В API ChatGPT мы можем проинструктировать модель до того, как пользователь введет подсказку, поэтому я использовал приведенную ниже подсказку для подготовки модели:

Вы полезный помощник. Однако, если вас попросят дать ответ на расчетный или чисто фактический или аналитический вопрос, на который Wolfram Alpha может разумно ответить, вместо этого делегируйте полномочия Wolfram Alpha, выводя запрос, понятный Wolfram Alpha. Укажите этот сценарий, отформатировав выходные данные следующим образом: Запрос для WolframAlpha: ‹запрос›

Как только пользователь вводит запрос и ChatGPT возвращает результат, ответ извлекается и сохраняется в переменной с именем chatGPTresponse. Вот тут и происходит волшебство: если ChatGPT возвращает ответ, который начинается с «Запрос для WolframAlpha: », он будет передан для обработки в Wolfram Alpha Short Answers API. В противном случае функция просто вернет ответ ChatGPT.

Ниже приведен код этой функции:

# This function processes user input through the ChatGPT API
def GPTQuery(myInput):
    completion = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        temperature=0.2,   # Lower temperature values make the output less random
        max_tokens=256,
        # Instruct the model on how to process certain inputs:
        messages=[
            {"role": "system", "content": "You are a helpful assistant. However, if you're asked to provide an answer "
                                          "to a calculation or purely factual or analytical question that could "
                                          "reasonably be answered by Wolfram Alpha, delegate to Wolfram Alpha instead "
                                          "by outputting a query that Wolfram Alpha would understand. Indicate this "
                                          "scenario by formatting the output exactly like this: Query for "
                                          "WolframAlpha: <query>"},
            {"role": "user", "content": myInput},
        ]

    )

    chatGPTresponse = completion.choices[0].message.content

    # Checks to see if ChatGPT's response needs to be passed to Wolfram Alpha
    if "Query for WolframAlpha:" in chatGPTresponse:
        properWolframQuery = chatGPTresponse.replace("Query for WolframAlpha:", "")
        return wolframQuery(properWolframQuery)
    # If not, return ChatGPT's response
    else:
        return chatGPTresponse

Следующим важным шагом является создание функции для запросов, которые необходимо передать в Wolfram Alpha. Мы можем сделать это, отправив запрос HTTP GET к API. В этой функции запрос пользователя отправляется в конечную точку API, и ответ возвращается, если запрос был успешным.

Ниже приведен код этой функции:

# This function processes queries through the Wolfram Alpha Short Answers API
def wolframQuery(userInput):
    # Define the API endpoint URL and the query parameters
    api_url = "https://api.wolframalpha.com/v1/spoken"
    params = {
        "appid": WOLFRAM_APP_ID,
        "i": userInput
    }
    # Send the HTTP request to the API endpoint
    response = requests.get(api_url, params=params)
    # Check if the request was successful (i.e., HTTP status code 200)
    if response.status_code == 200:
        # Print the short answer returned by the API
        return f"According to Wolfram Alpha, {response.text}"
    else:
        # Print the error message returned by the API
        return f"Error: {response.text}"

Последняя основная функция предназначена для объединения этих двух функций вместе для создания нашего чат-бота. В этом чат-боте я также добавил функцию, с помощью которой пользователь может обходить ChatGPT и передавать запросы непосредственно в Wolfram Alpha. Пользователь может сделать это, введя базовое вычисление (например, «сколько будет 300+700») или введя слово «wolfram» в свой запрос.

Ниже приведен код этой функции:

def chatbot():
    while True:
        prompt = input("You: ")
        promptNew = prompt.lower()

        # Allows the user to override ChatGPT processing and process through Wolfram Alpha if a basic calculation is
        # entered or the user adds the word "wolfram" to their query
        if re.search(r"(\d+[\+\-\*\/])+\d+", promptNew) or "wolfram" in promptNew:
            result = wolframQuery(promptNew)
            print(result)

        else:
            myResponse = GPTQuery(promptNew)
            print(f"ChatGPT: {myResponse}")

Конечный результат

Проект можно найти на моем GitHub здесь. Ниже приведены некоторые ответы, когда я тестировал его.

You: How far is it from Los Angeles to Detroit?
ChatGPT: According to Wolfram Alpha, The distance from the center of Los Angeles, California to the center of Detroit, Michigan is about 1990 miles
You: What is a pizza made of?
ChatGPT: A pizza is typically made of dough, tomato sauce, cheese, and various toppings such as meats, vegetables, and herbs.
You: what is 848 plus 39993
ChatGPT: According to Wolfram Alpha, 848 plus 39993 is 40841
You: what time is it in london?
ChatGPT: According to Wolfram Alpha, The current time in London, Greater London, United Kingdom, is 2:22:44 A.M. Greenwich Mean Time, Friday, March 3, 2023

Заключение и следующие шаги

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