Jeszcze do niedawna, jeśli chciałeś zbudować chatbota, używałeś "przetwarzania języka naturalnego" (NLP), aby zrozumieć i zinterpretować to, o co prosił użytkownik, a następnie próbowałeś spełnić to żądanie za pomocą logiki zaplecza, potencjalnie zintegrowanej z zastrzeżoną usługą. Rozwiązania takie jak Dialogflow lub Microsoft Bot framework zapewniają konwersacyjną sztuczną inteligencję opartą na uczeniu maszynowym i tradycyjnie są popularne wśród programistów tworzących chatboty.
OpenAI i ChatGPT OpenAI sprawiają, że tworzenie chatbota opartego na sztucznej inteligencji jest łatwiejsze niż kiedykolwiek. Ponieważ duży model językowy (LLM), który zasila OpenAI, opiera się na publicznym zbiorze danych, możesz łatwo poprawić wrażenia użytkownika z aplikacji, dostarczając wszelkie informacje, których można oczekiwać w publicznej bazie wiedzy.
PubNub obsługuje doświadczenia w czasie rzeczywistym dla wielu branż i przypadków użycia, w tym obsługa klienta i czat w aplikacji.Wszystkie te doświadczenia w czasie rzeczywistym są zasilane danymi, zarówno wiadomościami czytelnymi dla użytkownika, jak i metadanymi dotyczącymi rozwiązania - czy nie byłoby wspaniale wykorzystać te istniejące dane do zasilania chatbota?
Kilka przykładowych zastosowań w świecie rzeczywistym:
Udzielanie odpowiedzi na najczęściej zadawane pytania dotyczące obsługi klienta
Rozszerzanie istniejących danych o dodatkowe treści, na przykład sugerowanie miejsc, w których można zjeść w pobliżu podanej lokalizacji.
Dostarczanie podsumowań konwersacji na podstawie historii wiadomości.
Opublikowaliśmy artykuł na ten temat i chociaż ten starszy artykuł jest nadal poprawny, branża rozwija się bardzo szybko, a kilka miesięcy to dużo czasu.
W tym artykule omówimy, jak zbudować chatbota opartego na OpenAI, podobnego do tego, który można zobaczyć w naszej prezentacji PubNub showcase pokazanej poniżej.
Architektura wysokiego poziomu
Aby stworzyć chatbota podobnego do ChatGPT, należy skorzystać z interfejsu API OpenAI Chat i założyć konto w celu utworzenia klucza API. Interfejs API OpenAI jest dostępny jako punkt końcowy REST, więc można go wywołać z praktycznie dowolnego języka programowania, chociaż większość dostarczonych przykładów jest napisana w Pythonie.
Najlepszym sposobem na wyodrębnienie danych z PubNub, aby zainicjować lub kontynuować rozmowę z chatbotem, jest użycie funkcji. Funkcje zapewniają bezserwerowy kontener JavaScript, który działa w Node.JS i umożliwia wykonywanie logiki biznesowej za każdym razem, gdy zdarzenie wystąpi w sieci PubNub, takie jak otrzymanie wiadomości czatu. Funkcje PubNub są często używane do tłumaczenia języków w czasie rzeczywistym, filtrowania wulgaryzmów lub wywoływania usług innych firm, takich jak OpenAI.
Ten przykład będzie działał w następujący sposób:
Istniejąca aplikacja czatu używa PubNub do wysyłania i odbierania wiadomości w czasie rzeczywistym.
Funkcja PubNub będzie nasłuchiwać wiadomości wysyłanych do określonego kanału.
Pojedyncza wiadomość sama w sobie nie zapewnia żadnego kontekstu dla ChatGPT, więc część historii konwersacji będzie również buforowana, aby umożliwić ciągły dialog.
Funkcja PubNub wywoła API OpenAI i pobierze odpowiedź
Odpowiedź zostanie opublikowana na kanale PubNub powiązanym z Twoim chatbotem
Można to zobaczyć na poniższym diagramie sekwencji:
Użytkownik wpisuje wiadomość w aplikacji czatu. Dzięki ponad 50 zestawom SDK PubNub jest w stanie obsługiwać zdecydowaną większość aplikacji, a wiadomość zostanie opublikowana na kanale reprezentującym chatbota w sieci PubNub.
Funkcja PubNub jest skonfigurowana tak, aby była wywoływana po wystąpieniu zdarzenia publikacji na kanale. Po otrzymaniu wiadomości pobierana jest historia kanału, aby zapewnić pewien kontekst rozmowy, a ta historia, wraz z danymi wejściowymi użytkownika i dodatkowym kontekstem, jest dostarczana do ChatGPT za pośrednictwem interfejsu API Chat Completion.
Interfejs API ChatGPT wygeneruje odpowiedzi dostosowane do przebiegu konwersacji
W ramach funkcji PubNub odbierana jest odpowiedź od ChatGPT, która jest analizowana i publikowana z powrotem w sieci PubNub.
Aplikacja, która wcześniej zasubskrybowała otrzymywanie wiadomości z PubNub, wyświetli odpowiedź chatbota.
Konfiguracja funkcji PubNub
Utwórz funkcję PubNub w następujący sposób:
Wymagania wstępne: Jeśli jesteś nowy w PubNub, postępuj zgodnie z naszą dokumentacją, aby skonfigurować swoje konto lub odwiedź naszą wycieczkę, aby zrozumieć, na czym polega PubNub.
Przejdź do panelu administratora
Wybierz
funkcje
z menu po lewej stronie i wybierz odpowiedni zestaw klawiszy, w którym chcesz utworzyć funkcję.Wybierz
+ Utwórz nowy moduł
.Wprowadź nazwę i opis modułu, wybierz zestaw klawiszy, a następnie naciśnij przycisk
Utwórz
.Wybierz właśnie utworzony moduł
Wybierz + Utwórz nową
funkcję
Nadaj funkcji nazwę i wybierz typ zdarzenia
After Publish lub Fire
. Ta funkcja zostanie wywołana PO przesłaniu wiadomości do PubNub. Funkcje mogą być synchroniczne lub asynchroniczne, a w tym przypadku po prostu przechwytujemy kopię wiadomości do wysłania do OpenAI. Więcej szczegółów na temat różnych typów funkcji można znaleźć w naszej dokumentacjiKanał funkcji powinien odpowiadać kanałowi, na którym publikujesz wiadomości, które chcesz wysłać do OpenAI. Możesz użyć tutaj symbolu wieloznacznego, więc na przykład
chatgpt.
* będzie pasował do każdego kanału, który rozpoczyna się od chatgpt. Ponieważ chcemy, aby ta funkcja rozmawiała z wieloma osobami jednocześnie, symbol wieloznaczny pozwala nam oddzielić, który użytkownik jest zaangażowany w aktywną rozmowę, abyśmy mogli odpowiedzieć na odpowiednim kanale.Tam, gdzie wiele osób jednocześnie rozmawia z OpenAI, PubNub zajmuje się tworzeniem wielu instancji funkcji. Na przykład chatgpt.dave
ichatgpt.simon
to dwa różne kanały, ale oba będą wywoływać funkcję PubNub nasłuchującą nachatgpt.*
. Sposób, w jaki PubNub obsługuje symbole wieloznaczne kanałów, wyjaśniono bardziej szczegółowo w naszej dokumentacji.Wybierz
Moje sekrety
i utwórz nowy sekret dla klucza API OpenAI; poniższy kod zakłada, że ten sekret nazywa sięOPENAI_API_KEY
.
Oto przykładowa funkcja PubNub, która wywoła OpenAI / ChatGPT
const pubnub = require('pubnub');
const xhr = require('xhr');
const vault = require('vault');
// Process all messages posted to the private ChatGPT channel
// This will be unique for each user, so chat is 1:1 with ChatGPT
export default request => {
const inboundChannel = request.channels[0];
if (request.message.content.type == "text" && request.message.sender != "OpenAI")
{
// user’s query
let naturalCommand = request.message.content.text;
// Always provide OpenAI with some context of how you want questions answered
let historicalMsgs =
[{"role": "system", "content": "You are a helpful assistant, expert in PubNub"}];
return getOpenaiApiKey().then(apikey => {
// Read the last messages from the conversation to provide conversation context
return pubnub.history({
channel: inboundChannel,
count: 10
}).then((response) => {
response['messages'].forEach((value, index) => {
// The message role will vary depending on whether it was sent or received
if (value.entry.sender && value.entry.sender == "OpenAI")
historicalMsgs.push({"role": "assistant",
"content": value.entry.content.text})
else
historicalMsgs.push({"role": "user",
"content": value.entry.content.text})
});
// Depending on timing, last published message may or may not yet be stored
if (historicalMsgs[historicalMsgs.length - 1].content != naturalCommand)
{
historicalMsgs.push({"role": "user",
"content": naturalCommand});
}
return openAI(naturalCommand, historicalMsgs).then(aiResponse => {
// Respond back by publishing the message to PubNub
pubnub.publish({
channel: inboundChannel, // In the showcase, this is unique per user
message: {
content: {
type: "text",
text: aiResponse
},
sender: "OpenAI",
},
});
return request.ok();
});
})
});
}
return request.ok();
};
// Get API Key for OpenAI
// Key is populated via Vault Secret Manager
let OPENAI_API_KEY = null;
function getOpenaiApiKey() {
// Use cached key
if (OPENAI_API_KEY) {
return new Promise(resolve => resolve(OPENAI_API_KEY));
}
// Fetch key from vault
return vault.get("OPENAI_API_KEY").then(apikey => {
OPENAI_API_KEY = apikey;
return new Promise(resolve => resolve(OPENAI_API_KEY));
});
}
// API Call to OpenAI asking the AI to run functions if it thinks it needs to
function openAI(naturalCommand, msgs) {
// Generate Function Instructions for the AI
const url = 'https://api.openai.com/v1/chat/completions';
const http_options = {
'method': 'POST',
'headers': {
"Content-Type": "application/json",
"Authorization": `Bearer ${OPENAI_API_KEY}`,
},
'body': JSON.stringify({
"model": "gpt-3.5-turbo",
"messages": msgs,
"max_tokens": 300
}),
timeout: 9500, // PubNub functions timeout limit can be raised if needed
retries: 0
};
return xhr.fetch(url, http_options).then((resp) => {
const body = JSON.parse(resp.body);
return body.choices[0].message.content;
})
.catch((err) => {
console.log(err);
return "Timed out. Please try again or ask a simpler question";
});
}
Praktyczne uwagi dotyczące wywoływania interfejsu API OpenAI
Właściwości interfejsu API uzupełniania czatu
Kod przedstawiony w tym artykule wykorzystuje OpenAI Chat Completion API, ale jest bardziej konfigurowalny niż pokazano powyżej.
Określenie wartości stream
jako true spowoduje zwrócenie odpowiedzi OpenAI jako strumienia danych ponad zdarzeniami wysyłanymi przez serwer. W praktyce może to zmniejszyć postrzegane opóźnienie, ponieważ użytkownik zobaczy bardziej natychmiastową odpowiedź, podobnie jak działa interfejs sieciowy ChatGPT.
model
pozwala określić model językowy używany do generowania odpowiedzi. API jest zasilane przez rodzinę modeli o różnych możliwościach i cenach, przy czym modele są często aktualizowane i dodawane są nowe modele.
max_tokens
ogranicza liczbę tokenów, których API użyje do wygenerowania danych wyjściowych. Ogólnie rzecz biorąc, im mniejsza liczba tokenów, tym mniej złożone dane wyjściowe i tym mniej kontekstu jest śledzone, ale odpowiedzi będą dostarczane szybciej.
Rola
wiadomości pozwala określić autora wiadomości. Przykład w tym artykule wykorzystuje system
do dostarczenia pewnych instrukcji do OpenAPI, użytkownika
do wiadomości wysyłanych przez użytkownika końcowego i asystenta
do odpowiedzi wcześniej dostarczonych przez OpenAI.
Model można dodatkowo dostosować, określając temperature
/ top_p
, frequency_penality
i presence_penalty
. Więcej informacji na ten temat można znaleźć w dokumentacji OpenAPI.
Interfejs API umożliwia również definiowanie i określanie niestandardowych funkcji, które rozszerzają możliwości modelu, co wykracza poza zakres tego bloga. Jeśli chcesz dowiedzieć się więcej, mamy osobny post, który ilustruje, w jaki sposób możesz zezwolić ChatGPT na publikowanie w PubNub w Twoim imieniu, umożliwiając Ci powiedzenie czegoś w rodzaju: "Wyślij wiadomość do głównego kanału, informując ich, że będę gotowy za 5 minut"."Można również zezwolić ChatGPT na wywoływanie własnego API biznesowego, dostarczając na przykład informacje o produkcie lub informacje o statusie zamówienia bezpośrednio do klienta.
Dostarczanie kontekstu do czatu
ŻądaniaHTTP są bezstanowe, więc aby zaangażować się w długotrwałą rozmowę z OpenAI, musi istnieć sposób na nadanie pewnego kontekstu API, opisanie dotychczasowej rozmowy i dostarczenie metadanych wokół tej rozmowy.
Interfejs API uzupełniania cz atu akceptuje tablicę wiadomości
, które pozwalają modelowi sztucznej inteligencji wywnioskować znaczenie z tego, co w przeciwnym razie mogłoby być niejednoznacznym pytaniem. Rozważmy ten przykład:
> [Użytkownik] Jak duża jest Ziemia?
> [OpenAI] Ziemia ma średnicę około 12 742 kilometrów.
> [Użytkownik] Chodziło mi o to, jak ciężka jest Ziemia?
> Ziemia ma masę około 5,97x10^24 kg.
Oczywiście, aby odpowiedzieć na pytanie "Jak ciężka jest", sztuczna inteligencja musiała zrozumieć, czym jest "to".
Budując chatbota opartego na PubNub, będziesz musiał zdecydować, ile kontekstu konwersacji należy zapewnić. Jeśli korzystasz z funkcji PubNub, masz dostęp do całej historii wiadomości dla kanału, a przykład zawiera 10 poprzednich wiadomości w rozmowie. Oczywiście możesz zapewnić znacznie więcej, jeśli zajdzie taka potrzeba, w zależności od potrzeb:
// Read in the last messages from the conversation to provide some context to Chat GPT
pubnub.history({
channel: inboundChannel,
count: 10
}).then((response) => {
response['messages'].forEach((value, index) => {
if (value.entry.sender && value.entry.sender == "ChatGPT")
historicalMsgs.push({"role": "assistant", "content": value.entry.content.text})
else
historicalMsgs.push({"role": "user", "content": value.entry.content.text})
});
Posiadanie kontekstu czatu już w PubNub sprawia, że dostarczenie tego kontekstu do OpenAI jest banalnie proste. Należy pamiętać, że rola
będzie się różnić w zależności od tego, czy wiadomość została wysłana do OpenAI, czy odebrana z OpenAI.
Długotrwałe zapytania
Podczas opracowywania chatbota podobnego do ChatGPT i konfigurowania parametrów używanych przez model sztucznej inteligencji należy wziąć pod uwagę oczekiwany czas odpowiedzi na zapytanie. Domyślnie funkcje PubNub oferują maksymalny czas działania wynoszący 10 sekund na wywołanie, który można zwiększyć, kontaktując się z pomocą techniczną. Ogólnie rzecz biorąc, chatbot, który zbyt długo odpowiada na pytanie użytkownika, będzie postrzegany przez niego negatywnie, dlatego dobrą praktyką jest wybranie parametrów modelu, aby osiągnąć równowagę między szybkością reakcji a możliwościami, jak wspomniano wcześniej.
Niektóre przypadki użycia OpenAI mogą oczekiwać odpowiedzi mierzonych w minutach, a nie sekundach. Jeśli integrujesz OpenAI ze swoim rozwiązaniem PubNub i spodziewasz się, że czas trwania odpowiedzi przekroczy domyślny czas działania funkcji, skontaktuj się z nami, a my udzielimy Ci zaleceń i porad.
Podsumowując
Korzystając z połączenia PubNub i OpenAI / ChatGPT, możliwe jest szybkie tworzenie niezwykle potężnych rozwiązań czasu rzeczywistego w celu dodania sztucznej inteligencji i czatu do dowolnego doświadczenia online.
Gdy będziesz gotowy, aby rozpocząć, odwiedź nasz panel administracyjny, aby zarejestrować się w celu uzyskania bezpłatnego zestawu kluczy PubNub. Mamy wiele samouczków i wersji demonstracyjnych obejmujących każdą branżę lub sprawdź naszą wizytówkę PubNub (dostępną również na Github), aby zobaczyć przykładowego chatbota obsługiwanego przez OpenAI.
Spis treści
Architektura wysokiego poziomuKonfiguracjafunkcji PubNubUtwórzfunkcję PubNub w następujący sposób:Oto przykładowa funkcja PubNub, która wywoła OpenAI / ChatGPTPraktycznerozważania podczas wywoływania OpenAI APIChatCompletion API PropertiesProvidingContext to ChatLong-RunningQueriesPodsumowanie
Jak PubNub może ci pomóc?
Ten artykuł został pierwotnie opublikowany na PubNub.com
Nasza platforma pomaga programistom tworzyć, dostarczać i zarządzać interaktywnością w czasie rzeczywistym dla aplikacji internetowych, aplikacji mobilnych i urządzeń IoT.
Fundamentem naszej platformy jest największa w branży i najbardziej skalowalna sieć przesyłania wiadomości w czasie rzeczywistym. Dzięki ponad 15 punktom obecności na całym świecie obsługującym 800 milionów aktywnych użytkowników miesięcznie i niezawodności na poziomie 99,999%, nigdy nie będziesz musiał martwić się o przestoje, limity współbieżności lub jakiekolwiek opóźnienia spowodowane skokami ruchu.
Poznaj PubNub
Sprawdź Live Tour, aby zrozumieć podstawowe koncepcje każdej aplikacji opartej na PubNub w mniej niż 5 minut.
Rozpocznij konfigurację
Załóż konto PubNub, aby uzyskać natychmiastowy i bezpłatny dostęp do kluczy PubNub.
Rozpocznij
Dokumenty PubNub pozwolą Ci rozpocząć pracę, niezależnie od przypadku użycia lub zestawu SDK.