Найти тему
КиберMamedov 💻🔥

Собственный чат GPT на базе API GigaChat

Картинку сделал в Kandinsky, утверждает, что именно так выглядит GigaChat API. Ох, уж эти нейросети.
Картинку сделал в Kandinsky, утверждает, что именно так выглядит GigaChat API. Ох, уж эти нейросети.

Недавно GigaChat предоставил доступ к своему API для некоммерческих проектов.

В этой статье разберемся, как свой класс на Python, который можно использовать, как свой собственный чат GPT. Или Собственный GigaChatGPT? Решайте сами.

Переходите по ссылке, проходи регистрацию (если есть возможность, то лучше через “Сбер ID”, так у тебя будет больше токенов).

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

-2

Работа с сервисом состоит из двух этапов:

  1. Получение токена;
  2. Отправка запросов с использованием токена.

Перейдя в функцию авторизации запроса мы увидим это:

-3

Как видите, здесь представлен запрос в формате работы с curl. Поэтому код на Python предстоит переписать самостоятельно.

Надеюсь Вы что-то уже писали на Python, поэтому тонкости синтаксиса объяснять не буду. Представим, что рабочий файл уже создан. В первую очередь подключим две библиотеки:

  1. requests - которая будет выполнять роль curl;
  2. json, чтобы обрабатывать полученные запросы.
import requests
import json

Для работы нам понадобятся два параметра.

-4

Сразу создадим под них константы:

AUTHORIZATION = ''
RqUID = '6f0b1291-c7f3-43c6-bb2e-9f3efb2dc98e'

Чтобы заполнить значение AUTHORIZATION необходимо в исходную вкладку GigaChat и нажать на эту кнопку.

-5

Далее создадим класс и опишем его инициализацию:

class GigaChat:

def __init__(self, auth, rq):
self.auth = auth
self.rqUID = rq
self.get_token()
self.communication = []

Метода self.get_token() у нас еще нет, мы к нему сейчас перейдем, он будет выполнять первый пункт “Получение токена”.

Поле self.communication будет хранить всю переписку, чтобы GigaChat мог видеть всю переписку.

Перейдем к созданию метода get_token.

def get_token(self):
url = 'https://ngw.devices.sberbank.ru:9443/api/v2/oauth'
headers = {
'Authorization': f'Bearer {self.auth}',
'RqUID': self.rqUID,
'Content-Type': 'application/x-www-form-urlencoded'
}
data = {
'scope': 'GIGACHAT_API_PERS'
}
response = self.get(url, headers, data)
self.access_token = json.loads(response.text)["access_token"]

Фактически, все действия сводятся к тому, чтобы добавить в поле self.access_token полученный токен json.loads(response.text)["access_token"]. Происходит это путем переписывания curl запроса и отправки его через метод get. Давай его создадим.

def get(self, url, headers, data, verify=False, json = False):
if json:
return requests.post(url, headers=headers, json=data, verify=verify)
else:
return requests.post(url, headers=headers, data=data, verify=verify)

Здесь в зависимости от того используется json или нет, выбирается определенный набор аргументов для отправки POST запроса через метод requests.post.

Токен получен, необходимо написать метод для общения. Для этого давай посмотрим, как составить запрос. Перейди в документации в раздел “Работа с историей чата”.

-6

Давай перепишем этот curl запрос под метод Python, назовем его ask_a_question.

def ask_a_question(self, question, temperature=0.7):
url = "https://gigachat.devices.sberbank.ru/api/v1/chat/completions"
headers = {
"Content-Type": "`application/json",
"Authorization": f"Bearer {self.access_token}"
}
self.communication.append({"role": "user", "content": question})
data = {
"model": "GigaChat:latest",
"messages": self.communication,
"temperature": temperature
}
response = self.get(url, headers, data, json = True).json()
content = response['choices'][0]['message']['content']
self.communication.append({"role": "assistant", "content": content})
return content

Как видишь, здесь мы применяем поле self.communication, которое определили заранее при инициализации будущего экземпляра класса. Здесь видно self.communication.append({"role": "assistant", "content": content}), что добавляются отдельно сообщения пользователя и так называемого ассистента, т.е. ответы от GigaChat.

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

def reset(self):
self.communication.clear()

Отлично! Класс готов. Теперь создадим его экземпляр. Запустим бесконечный цикл, в котором пропишем условие, если приходит сообщение “Очистить историю”, то вызывать метод reset. В остальных случаях все ответы печатать в консоль.

chat = GigaChat(AUTHORIZATION, RqUID)
while True:
question = input("Что бы Вы хотели спросить?\n")
if question in "Очистить историю":
chat.reset()
continue
print("Ответ: ", chat.ask_a_question(question))

Запускаем и задаем вопрос:

-7

А вот и ответ:

-8

Отлично! Все работает и он сразу просит задать следующий вопрос. Удачного тебе общения!
Если ты ищешь, как реализовать это на
PHP тогда можешь прочитать эту статью.

Была ли статья для тебя полезна? Подпишись на канал, чтобы ничего не пропустить.


GAC
114,2 тыс интересуются