В нашем современном мире создание онлайн-платформы для общения между клиентами и представителями компании - это необходимое требование для многих бизнесов. Онлайн-чат для сайта является одним из наиболее эффективных и удобных способов связи с потенциальными клиентами и удержания уже имеющихся из-за своей быстрой и простой обработки сообщений.
Я следил за различными видами использования chatGPT с момента его выхода. Описываемое далее решение я еще не встречал и поэтому думаю оно будет кому-то полезным.
Формулировка задачи
Необходимо создать онлайн-чата для сайта со следующими возможностями:
Общение с посетителями на любых языках
Запрос варианта ответа на запрос посетителя у chatGPT, обученного на базе знаний компании
Реализовать все на бесплатных сервисах
Итак, поехали!
Шаг №1: Выбор сервиса для онлайн-чата
Для реализации задачи нам нужна возможность ставить свой обработчик на событие отправки сообщения посетителя. При этом сам сервис должен быть бесплатным.
По итогу был выбрал сервис Tawk.to, у которого есть вот эти два обработчика:
![](https://habrastorage.org/getpro/habr/upload_files/ddf/698/078/ddf6980785a5b69755b693160ad26d9a.png)
Шаг №2: Обучение chatGPT
Для формирования базы знаний компании мы будем использовать библиотеку:
?️ LlamaIndex ? (GPT Index)
https://github.com/jerryjliu/llama_index
Вот пример использования библиотеки из официальной документации
!pip install llama-index
import os
os.environ["OPENAI_API_KEY"] = 'YOUR_OPENAI_API_KEY'
from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader
documents = SimpleDirectoryReader('data').load_data()
index = GPTSimpleVectorIndex(documents)
# save to disk
index.save_to_disk('index.json')
# load from disk
index = GPTSimpleVectorIndex.load_from_disk('index.json')
index.query("<question_text>?")
В качестве данных для формирование базы мы используем краткое описание компании и поместим его в текстовый файл:
# auras.txt
AURA Services
AURA Services, based in Tel Aviv, Israel, is a platform that mediates between local partner performers and clients and focused on short-term local services.
AURA do marketing and local advertisement to promote local partner performers.
The company acts as a broker and charges a commission from local partner performers for promotion of each service for clients.
Шаг №3: Подготовка базы в Notion
Все поступающие сообщения от посетителей мы будем сохранять в Notion.
Вот шаблон таблицы:
https://candied-cactus-f66.notion.site/9cc1b8d874244cc0bef06d6de762d8df
![](https://habrastorage.org/getpro/habr/upload_files/f77/376/84d/f7737684d70d59bf7d7744075784e4e0.png)
Процесс создания интеграции хорошо описан в этой статье:
https://notionso.ru/kb/sozdanie-integratsiy-s-pomoschyu-api-notion/
У нас будет вот такая функция для создание записей в таблице Notion:
def insertDatabase(databaseId, record, token):
headers = {
"Accept": "application/json",
"Authorization": "Bearer " + token,
"Content-Type": "application/json",
"Notion-Version": "2021-05-13",
}
createUrl = "https://api.notion.com/v1/pages"
data = json.dumps(record)
res = requests.request("POST", createUrl, headers=headers, data=data)
return res
Пример записи в таблицу:
record = {"parent": { "database_id": notion_DB_id },"properties": {}}
record['properties']['URL'] = {"title": [{"text": {"content": "https://aura-s.com/"}}]}
record['properties']['Message'] = {"rich_text": [{"text": {"content": "Hello World!"}}]}
record['properties']['chatGPT_reply_English'] = {"rich_text": [{"text": {"content": "How i can help you?"}}]}
insertDatabase(databaseId, record, token)
Шаг №4: Создание Телеграм-бота
Найдите бота @BotFather и отправьте ему команду /start или /newbot, чтобы создать нового бота. Затем следуйте инструкциям, вводя название и короткое имя для вашего бота. После этого вы получите ответ с токеном бота и ссылкой на документацию. Важно сохранить токен в надежном месте, так как он необходим для авторизации и установки связи между вами и вашим ботом.
Шаг №5: Запуск HTTP API на Flask
Для обработки поступающих от посетителей сообщений нам необходимо написать небольшой Backend на Flask.
У нас будет только одна точка входа в API, которая принимает входящее сообщение, затем отправляет запрос в chatGPT и просит его ответить на 3-х языках. Полученные ответы мы отправляем в телеграм бот и в таблицу Notion.
Вот код нашего API:
from flask import Flask, render_template, redirect, url_for, request, session, jsonify
from flask_cors import CORS
from os import path
import json
import os
import requests
import datetime
import openai
import telebot
app = Flask(__name__)
CORS(app) # эта команда необходима для работы с API из React-приложений
bot = telebot.TeleBot(config.tg_bot_key)
# /api/v1.0/new_online_chat_message
@app.route('/api/v1.0/new_online_chat_message', methods=['GET'])
def new_online_chat_message():
url = request.args.get("url", '-')
message = request.args.get("message", '-')
print('[START - new_online_chat_message]')
notion_DB_id = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
record = {"parent": { "database_id": notion_DB_id },"properties": {}}
record['properties']['URL'] = {"title": [{"text": {"content": url}}]}
record['properties']['Message'] = {"rich_text": [{"text": {"content": message}}]}
# Ask chatGPT
reply = ''
if message != '-':
index = GPTSimpleVectorIndex.load_from_disk('/wiki/index.json')
# ID чата с телеграм ботом
chat_id = 'XXXXXXXXX'
# English
response = index.query(message + '. Answer in English', response_mode="compact")
record['properties']['chatGPT_reply_English'] = {"rich_text": [{"text": {"content": response.response}}]}
reply = response.response
bot.send_message(chat_id, '??\n' + reply)
# Spanish
response = index.query(message + '. Answer in Spanish', response_mode="compact")
record['properties']['chatGPT_reply_Spanish'] = {"rich_text": [{"text": {"content": response.response}}]}
reply = response.response
bot.send_message(chat_id, '??\n' + reply)
# German
response = index.query(message + '. Answer in German', response_mode="compact")
record['properties']['chatGPT_reply_German'] = {"rich_text": [{"text": {"content": response.response}}]}
reply = response.response
bot.send_message(chat_id, '??\n' + reply)
res = notion_api.insertDatabase(notion_DB_id, record, config.notion_token)
print(res, res.text)
###
return reply
if __name__ == "__main__":
app.run(debug=True, host='0.0.0.0', port=5000)
Шаг №6: Отправка сообщений из чата на сайте на HTTP API
И финальная часть - мы добавляем обработчик в виджет чата Tawk.to:
<!--Start of Tawk.to Script-->
<script type="text/javascript">
var Tawk_API=Tawk_API||{}, Tawk_LoadStart=new Date();
(function(){
var s1=document.createElement("script"),s0=document.getElementsByTagName("script")[0];
s1.async=true;
s1.src='https://embed.tawk.to/640e244831ebfa0fe7f220c1/1grbjrffn';
s1.charset='UTF-8';
s1.setAttribute('crossorigin','*');
s0.parentNode.insertBefore(s1,s0);
})();
window.Tawk_API = window.Tawk_API || {};
window.Tawk_API.onChatMessageVisitor = function(message){
var x = new XMLHttpRequest();
x.open("GET", "https://АДРЕС_API/api/v1.0/new_online_chat_message?url=aura-s.com&message="+message, true);
x.onload = function (){
alert( x.responseText);
}
x.send(null);
};
</script>
<!--End of Tawk.to Script-->
Демонстрация работы
Итог
Я надеюсь данное решение будет вам полезно и если вы используете его где-то, напишите пожалуйста про это в комментариях.
И конечно я готов ответить на все ваши вопросы, пишите в мой ТГ.