Google Bard был выпущен (в некоторых странах) для того, чтобы люди могли использовать и испытать искусственный интеллект, который Google продвигает в качестве основного конкурента ChatGPT.

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

Ранее я писал о создании кода Python с помощью ChatGPT.

https://medium.com/@bigfundu/chatgpt-otp-code-generator-4fb77de5e01b

Вот аналогичный пример с Google Bard.

Я: Как создавать одноразовые пароли и проверять их через API в Python?

Бард. Чтобы создать одноразовые пароли и проверить их через API в Python, выполните следующие действия:

Установите библиотеку pyotp.

Создайте объект pyotp.TOTP для нужного генератора одноразовых паролей.

Сгенерируйте OTP-код.

Отправьте OTP-код пользователю.

Пользователь вводит OTP-код в приложение.

Приложение проверяет код одноразового пароля на соответствие объекту pyotp.TOTP.

Если код OTP действителен, приложение переходит к запрошенному действию.

Если OTP-код недействителен, приложение выводит сообщение об ошибке.

Вот пример того, как сгенерировать и проверить OTP в Python:

import pyotp
# Create a TOTP object for the Google Authenticator generator.
totp = pyotp.TOTP('otpauth://totp/[email protected]?secret=ABCDEFGHIJKL')
# Generate an OTP code.
otp_code = totp.now()
# Send the OTP code to the user.
print('The OTP code is: {}'.format(otp_code))
# The user enters the OTP code into the application.
user_otp_code = input('Enter the OTP code: ')
# Validate the OTP code.
if totp.verify(user_otp_code):
    print('The OTP code is valid.')
else:
    print('The OTP code is invalid.')

Это всего лишь базовый пример того, как создавать и проверять одноразовые пароли в Python. Есть много других способов сделать это, и лучший подход зависит от ваших конкретных потребностей.

Я исследовал Bard дальше, чтобы увидеть, что он может сделать с тем же контекстом.

Я: можно ли изменить тот же пример, чтобы использовать FastAPI с Python?

Бард: Конечно, вот пример того, как сгенерировать и проверить одноразовый пароль с помощью FastAPI с Python:

from fastapi import FastAPI, Depends, HTTPException
from pyotp import TOTP
app = FastAPI()
# Create a TOTP object for the Google Authenticator generator.
totp = TOTP('otpauth://totp/[email protected]?secret=ABCDEFGHIJKL')
@app.post("/generate-otp")
async def generate_otp():
    # Generate an OTP code.
    otp_code = totp.now()
    # Send the OTP code to the user.
    return {"otp_code": otp_code}
@app.post("/validate-otp")
async def validate_otp(user_otp_code: str):
    # Validate the OTP code.
    if totp.verify(user_otp_code):
        return {"valid": True}
    else:
        raise HTTPException(status_code=401, detail="Invalid OTP code")

Это всего лишь базовый пример того, как создавать и проверять одноразовые пароли с помощью FastAPI с Python. Есть много других способов сделать это, и лучший подход зависит от ваших конкретных потребностей.

Опираясь на это приглашение, я подтолкнул Bard к включению обработки ошибок.

Я. Можете ли вы также добавить комментарии к этому коду и добавить обработку исключений?

Бард: Конечно, вот код с комментариями и обработкой исключений:

from fastapi import FastAPI, Depends, HTTPException
from pyotp import TOTP

app = FastAPI()
# Create a TOTP object for the Google Authenticator generator.
totp = TOTP('otpauth://totp/[email protected]?secret=ABCDEFGHIJKL')
# This endpoint generates an OTP code.
@app.post("/generate-otp")
async def generate_otp():
    """Generates an OTP code."""
    # Generate an OTP code.
    otp_code = totp.now()
    # Send the OTP code to the user.
    return {"otp_code": otp_code}
# This endpoint validates an OTP code.
@app.post("/validate-otp")
async def validate_otp(user_otp_code: str):
    """Validates an OTP code."""
    # Validate the OTP code.
    try:
        if totp.verify(user_otp_code):
            return {"valid": True}
        else:
            raise HTTPException(status_code=401, detail="Invalid OTP code")
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

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

И, наконец, добавил несколько тестовых случаев в этот код.

Я. Можете ли вы создать тестовые примеры для этого кода?

Бард: Конечно, вот несколько тестов для этого кода:

import pytest
from fastapi import FastAPI, Depends, HTTPException
from pyotp import TOTP

app = FastAPI()
# Create a TOTP object for the Google Authenticator generator.
totp = TOTP('otpauth://totp/[email protected]?secret=ABCDEFGHIJKL')
# This endpoint generates an OTP code.
@app.post("/generate-otp")
async def generate_otp():
    """Generates an OTP code."""
    # Generate an OTP code.
    otp_code = totp.now()
    # Send the OTP code to the user.
    return {"otp_code": otp_code}
# This endpoint validates an OTP code.
@app.post("/validate-otp")
async def validate_otp(user_otp_code: str):
    """Validates an OTP code."""
    # Validate the OTP code.
    try:
        if totp.verify(user_otp_code):
            return {"valid": True}
        else:
            raise HTTPException(status_code=401, detail="Invalid OTP code")
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@pytest.mark.asyncio
async def test_generate_otp():
    # Test that the generate_otp endpoint generates an OTP code.
    response = await app.post("/generate-otp")
    assert response.status_code == 200
    assert response.json() == {"otp_code": "123456"}

@pytest.mark.asyncio
async def test_validate_otp_valid_code():
    # Test that the validate_otp endpoint validates a valid OTP code.
    response = await app.post("/validate-otp", json={"user_otp_code": "123456"})
    assert response.status_code == 200
    assert response.json() == {"valid": True}

@pytest.mark.asyncio
async def test_validate_otp_invalid_code():
    # Test that the validate_otp endpoint rejects an invalid OTP code.
    response = await app.post("/validate-otp", json={"user_otp_code": "654321"})
    assert response.status_code == 401
    assert response.json() == {"detail": "Invalid OTP code"}

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

Но Бард еще не готов к решению общих задач по математике и естественным наукам. ChatGPT в настоящее время намного лучше (не идеально) в этом отношении.

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

— — — — — — — — — — — —

Подсказка 1: работа, проделанная для поднятия массы m с поверхности земли на высоту h, равную радиусу земли R, равна ? Пожалуйста, пишите на английском языке.

Бард: Работа, совершенная для поднятия массы m с поверхности земли на высоту h, равную радиусу земли R, составляет:

Фрагмент кода

Вт = мгР

Где:

W - работа, выполненная в джоулях

m - масса объекта в килограммах

g — ускорение свободного падения на поверхности Земли, равное примерно 9,8 м/с².

R - радиус Земли, который составляет примерно 6 371 км.

Совершенная работа равна изменению потенциальной энергии тела. Потенциальная энергия объекта определяется следующим уравнением:

U = мгч

Где:

U - потенциальная энергия в джоулях

m - масса объекта в килограммах

g — ускорение свободного падения на поверхности Земли, равное примерно 9,8 м/с².

h - высота объекта над поверхностью Земли в метрах

В этом случае высота объекта равна радиусу Земли. Следовательно, потенциальная энергия тела:

U = мгР

Работа, совершенная для подъема тела, равна изменению потенциальной энергии. Таким образом, выполненная работа:

W = U_final - U_initial = mgR - 0 = mgR

— —

ChatGPT: чтобы рассчитать работу, проделанную (W) при подъеме массы (m) с поверхности Земли на высоту (h), равную радиусу Земли (R), нам нужно рассмотреть изменение гравитационно потенциальная энергия. Совершенная работа равна разнице гравитационной потенциальной энергии между начальным и конечным положениями.

На поверхности Земли гравитационная потенциальная энергия (U1) равна:

U1 = -G * (M * m) / R

Где G — гравитационная постоянная (6,674 x 10^-11 Н м²/кг²), M — масса Земли (приблизительно 5,972 x 10²⁴ кг), а R — радиус Земли.

На высоте h, равной радиусу Земли (h = R), расстояние от центра Земли равно 2R. Гравитационная потенциальная энергия (U2) на этой высоте равна:

U2 = -G * (M * m) / (2R)

Теперь мы можем найти проделанную работу (W), рассчитав изменение потенциальной энергии гравитации:

W = U2 — U1

W = -G * (M * m) / (2R) — (-G * (M * m) / R)

Для упрощения мы можем выделить общие термины:

W = (M * m * G) * (1/R — 1/(2R))

W = (M * m * G) * (1–1/2) / R

W = (M * m * G) * (1/2) / R

Итак, работа, совершенная для подъема массы m с поверхности Земли на высоту, равную радиусу Земли R, равна:

W = (1/2) * G * M * m / R

— — — — — — — — — — — —

Подсказка 2. Когда брусок массы M подвешен на длинном тросе длиной L см, длина троса становится равной L+l см. Во что превращается упругая потенциальная энергия проволоки? Пожалуйста, пишите на английском языке.

Бард: Вот ответ на английском языке:

Когда брусок массы М подвешен на длинной нити длиной L см, длина проволоки становится равной L+1 см. Упругая потенциальная энергия проволоки принимает вид:

U = 1/2 * k * (L+l)^2

Где k — жесткость проволоки.

Упругая потенциальная энергия провода запасается в проводе в результате работы силы тяжести над бруском. Сила тяжести растягивает проволоку, а упругая потенциальная энергия — это энергия, запасенная в проволоке в результате этого растяжения.

Упругая потенциальная энергия проволоки может быть рассчитана по следующей формуле:

U = 1/2 * k * x^2

Где U — упругая потенциальная энергия, k — жесткость проволоки, а x — расстояние, на которое растягивается проволока.

В этом случае расстояние, на которое натягивается проволока, составляет L+1 см. Следовательно, упругая потенциальная энергия проволоки равна:

U = 1/2 * k * (L+l)^2

— —

ChatGPT: когда блок массой M подвешен на длинной проволоке длиной L см, а длина проволоки увеличивается на l см (до L + l см), проволока испытывает упругую деформацию, накопление упругой потенциальной энергии. Упругая потенциальная энергия (U), запасенная в проволоке, может быть рассчитана с использованием закона Гука и формулы для потенциальной энергии пружины:

U = (1/2) * k * x²

Здесь k — жесткость пружины (или силовая постоянная) проволоки, а x — удлинение (l) проволоки.

Чтобы найти жесткость пружины (k), мы можем использовать следующее соотношение, полученное из закона Гука:

k = (F/x)

Здесь F — приложенная к проволоке сила, равная силе тяжести, действующей на брусок массой М:

F = M * g

Где g — ускорение свободного падения (примерно 9,81 м/с²).

Подставляя выражение для силы в уравнение для жесткости пружины:

k = (M * g) / l

Теперь мы можем подставить это выражение для жесткости пружины (k) в формулу для упругой потенциальной энергии (U):

U = (1/2) * ((M * g) / l) * l²

Упрощение уравнения:

U = (1/2) * M * g * l

Упругая потенциальная энергия (U) проволоки, когда блок массы M подвешен, а длина проволоки увеличивается на l см, равна:

U = (1/2) * M * g * l

Обратите внимание, что длины в этом уравнении должны быть в метрах (а не в см), чтобы соответствовать единицам измерения g (м/с²). Чтобы перевести L и l из см в метры, разделите их значения на 100.

Что мне понравилось в Барде:

  • Контекст хорошо запомнился и разговор велся правильно
  • Программирование простых примеров с помощью Python было быстрым и легким (предостережение: еще предстоит полностью изучить более сложные примеры)
  • Он не такой многословный, как ChatGPT, но выдает информацию достаточно быстро.
  • Код Python можно было экспортировать в Google Colab для использования (еще не полностью протестировать).

Я еще не тестировал Bard (опубликую отдельно):

  • Перевод кода на несколько языков программирования
  • Обобщение содержания
  • Проверка информации