Pull to refresh

Бесплатный мультиязычный чат для сайта на Tawk + Notion + Telegram + chatGPT + GPT-Index

Reading time5 min
Views12K

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

Я следил за различными видами использования chatGPT с момента его выхода. Описываемое далее решение я еще не встречал и поэтому думаю оно будет кому-то полезным.

Формулировка задачи

Необходимо создать онлайн-чата для сайта со следующими возможностями:

  • Общение с посетителями на любых языках

  • Запрос варианта ответа на запрос посетителя у chatGPT, обученного на базе знаний компании

  • Реализовать все на бесплатных сервисах

Итак, поехали!

Шаг №1: Выбор сервиса для онлайн-чата

Для реализации задачи нам нужна возможность ставить свой обработчик на событие отправки сообщения посетителя. При этом сам сервис должен быть бесплатным.

По итогу был выбрал сервис Tawk.to, у которого есть вот эти два обработчика:

Шаг №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://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-->

Демонстрация работы

Итог

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

И конечно я готов ответить на все ваши вопросы, пишите в мой ТГ.

Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
Total votes 12: ↑11 and ↓1+13
Comments10

Articles