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 (опубликую отдельно):
- Перевод кода на несколько языков программирования
- Обобщение содержания
- Проверка информации