Zbuduj chatbota LLM z niestandardową bazą wiedzy
Published: 2024-02-01 21:01:31

Z całą uwagą, jaką otrzymują te LLM i ChatGPT, pojawia się nowa zasada "Garbage in, garbage out". Podczas korzystania z GPT-4 lub GPT-3.5, lub jakiegokolwiek innego dużego modelu językowego, koncepcja ta ma zastosowanie w dwóch miejscach [Prompt Engineering](https://en.wikipedia.org/wiki/Prompt_engineering#:~:text=Prompt%20engineering%20(also%20known%20as,of%20it%20being%20explicitly%20given.) i [Dostrajanie](https://en.wikipedia.org/wiki/Fine-tuning_(deep_learning)). Powinniśmy również rozważyć, kiedy te modele zostały przeszkolone, aby zweryfikować, jak stare lub nowe są dane, które nam dostarczają.

Większość firm korzysta dziś z korporacyjnych źródeł danych - wewnątrz zapory sieciowej lub na zewnątrz, a nie w domenie publicznej. Jeśli możemy wykorzystać LLM na tych danych, pojawią się nowe możliwości.

W tym artykule omówimy tworzenie chatbota z niestandardową bazą wiedzy w 30 minut, aby sztuczna inteligencja odpowiadała na pytania dotyczące danych.

![](/cdn/3prze68gbwl1/3qYPBDJSpSd5oecj2fUDae/f2a980695856b249c645e7ea774b87fe/Screenshot_2023-07-20_at_10.17.38_PM.png)

Wymagania wstępne dla stworzenia bota wiedzy
--------------------------------------------

Musimy zastanowić się, ile danych mamy do stworzenia niestandardowej bazy wiedzy. Na tym blogu stworzymy asystenta przy użyciu dokumentacji PubNub. Istnieje wiele dokumentacji, więc powinniśmy rozważyć skorzystanie z usługi produkcyjnej, takiej jak [Vectara](https://vectara.com/), [Pinecone](https://www.pinecone.io/)lub [Weaviate](https://weaviate.io/) do zarządzania naszymi osadzeniami wektorowymi. Możesz użyć LangChain do utworzenia lokalnej wektorowej bazy danych dla mniejszych ilości danych. LangChain obsługuje również mapowanie niestandardowych zagnieżdżeń do modeli LLM poprzez wyszukiwanie semantyczne lub podobieństwa.

W tym blogu zajmiemy się konfiguracją wektorowej bazy danych w Vectara, ponieważ zapewnia ona proste rozwiązanie typu "przeciągnij i upuść" dla wszystkich danych firmy. Najlepszym sposobem interakcji z Vectara jest wykorzystanie [PubNub Functions](https://www.pubnub.com/docs/general/serverless/functions/overview#:~:text=PubNub%20provides%20Functions%20to%20capture,filter%2C%20and%20even%20aggregate%20data.)który zapewnia bezserwerowy kontener JavaScript uruchamiany za każdym razem, gdy wystąpi wcześniej zdefiniowane zdarzenie. Będziesz mieć możliwość dostosowania, kiedy funkcja zostanie uruchomiona i uruchomiona, będąc w stanie dostosować sposób działania AI Knowledge Bot.

Vectara wykorzysta Twój zestaw danych do indeksowania danych w wielu osadzeniach. Po wprowadzeniu tekstu lub danych użytkownika Vectara przeprowadzi wyszukiwanie semantyczne danych i podsumuje znalezione wyniki, udzielając odpowiedzi na pytanie przy użyciu niestandardowych danych. Pozwoli to na uzyskanie odpowiednich informacji. Vectara obsługuje wiele typów plików, takich jak TXT, HTML, PDF i pliki Word. Zbierz wszystkie dokumenty, które chcesz przesłać i dodaj je do osobnego folderu.

### Jak skonfigurować aplikację Vectara

Konfiguracja Vectara jest następująca:

1.  [Zarejestruj się](https://console.vectara.com/login) lub zaloguj się do Vectara
    
2.  Po przejściu do pulpitu nawigacyjnego kliknij przycisk `Utwórz` korpus.
    
3.  Po nadaniu korpusowi nazwy i opisu w nagłówku `Data Ingestion` przeciągnij i upuść pliki, o których chcesz wiedzieć LLM, do sekcji `Upload Files`. Po przesłaniu plików możesz sprawdzić swój identyfikator korpusu w górnej części strony, ponieważ będzie on potrzebny do napisania żądania.
    
4.  Kliknij swój adres e-mail w prawym górnym rogu i zapisz swój `identyfikator` klienta na później.
    
5.  Wybierz `Klucze API` i utwórz klucz API dla swojego korpusu, wybierając go z menu rozwijanego. Zapisz klucz API na później.
    

### Architektura wysokiego poziomu

Architektura będzie wyglądać następująco:

1.  Aplikacja czatu będzie używać PubNub do wysyłania i odbierania wiadomości
    
2.  Funkcja PubNub będzie nasłuchiwać tych wiadomości na określonym kanale
    
3.  Sygnał PubNub zostanie uruchomiony, aby poinformować użytkownika, kiedy sztuczna inteligencja myśli i kiedy skończy.
    
4.  Wiadomość zostanie następnie przekazana do Vectara przy użyciu Vectara Rest API.
    
5.  Funkcja PubNub przeanalizuje 1 z wielu wyników z odpowiedzi od Vectara.
    
6.  Odpowiedź zostanie następnie opublikowana na kanale powiązanym z chatbotem.
    

Konfigurowanie funkcji PubNub
-----------------------------

1.  Przejdź do [admin dashboard](https://admin.pubnub.com/)
    
2.  Wybierz `funkcje` w menu po lewej stronie i kliknij odpowiedni zestaw kluczy, którego chcesz użyć.
    
3.  Wybierz `+ Utwórz moduł` i wprowadź nazwę oraz opis modułu.
    
4.  Wybierz właśnie utworzony moduł i kliknij + Utwórz `funkcję`
    
5.  Nadaj funkcji nazwę, taką jak `Vectara Query` i wybierz opcję `After Publish lub Fire` z menu rozwijanego. Ta funkcja zostanie uruchomiona po opublikowaniu wiadomości na odpowiednim kanale, w tym przypadku `docs-pubnub-ai` .
    
6.  Ustaw nazwę kanału na `docs-pubnub-ai`.
    
7.  Kliknij na `Moje sekrety` i utwórz sekret o nazwie `VECTARA_API_KEY` i `CUSTOMER_ID`.
    

Oto kod do wysyłania zapytań do bazy danych Vectara z funkcji PubNub
--------------------------------------------------------------------

Fragment kodu dla funkcji PubNub jest zdefiniowany w następujący sposób:

```js
const Promise = require('promise');

//
// API Key For OpenAI
// **Add your Vectara API Key and Customer ID to MY SECRETS (Left Panel)**
//
let VECTARA_API_KEY = null;
let CUSTOMER_ID = null;
let channel = "docs-pubnub-ai-response";
function getVectaraKey() {
   // Use cached key
   if (VECTARA_API_KEY && CUSTOMER_ID) {
       return new Promise(resolve => resolve(VECTARA_API_KEY));
   }
   // Fetch key from vault
   return vault.get("VECTARA_API_KEY").then(apikey => {
       return vault.get("CUSTOMER_ID").then(customer_id => {
            VECTARA_API_KEY = apikey;
            CUSTOMER_ID = customer_id;
           return new Promise(resolve => resolve(VECTARA_API_KEY));
       });
   });
}

//
// Import Modules
//
const xhr = require('xhr');
const vault = require('vault');
const pubnub = require('pubnub');

//
// Main
//
export default (request) => {
   // Input data for Vectara
   let message = request.message.text;
   let signalMessage = { message: { type: "typing_on" }, channel: channel };
   return pubnub.signal(signalMessage).then((_) => {
       return getVectaraKey().then(_ => {
           return vectara(message).then(response => {
               return pubnub.publish({
                   channel: channel,
                   message: {
                       id: "PubNubAI",
                       type: "default",
                       text: response
                   },
               }).then((publishResponse) => {
                   console.log(publishResponse);
                   message = { message: { type: "typing_off" }, channel: channel };
                   return pubnub.signal(message).then((signalOffResponse) => {
                       console.log(signalOffResponse);
                       return request.ok();
                   });
               }).catch((err) => {
                   console.error(err);
               });
           });
       });
   });
};

//
// API Call to Vectara asking the AI a question
//
async function vectara(question) {
   console.log("SENDING REQUEST TO VECTARA");
   const url = "https://api.vectara.io/v1/query";
   const body = JSON.stringify({
       "query": [
           {
           "query": question,
           "start": 0,
           "numResults": 10,
           "contextConfig": {
               "charsBefore": 0,
               "charsAfter": 0,
               "sentencesBefore": 2,
               "sentencesAfter": 2,
               "startTag": "<b>",
               "endTag": "</b>"
           },
           "corpusKey": [
               {
               "customerId": CUSTOMER_ID,
               "corpusId": 1,
               "semantics": "DEFAULT",
               "dim": [
                   {
                   "name": "string",
                   "weight": 0
                   }
               ],
               "lexicalInterpolationConfig": {
                   "lambda": 0.025
               }
               }
           ],
           "rerankingConfig": {
               "rerankerId": 272725717
           },
           "summary": [
               {
               "summarizerPromptName": "",
               "maxSummarizedResults": 5,
               "responseLang": "eng",
               "summarizerPromptId": 1,
               "debug": false,
               "responseChars": 0
               }
           ]
           }
       ]
   });

   const http_options = {
       'method': 'POST',
       'timeout': 20000,
       'headers': {
           'Content-Type': 'application/json',
           'customer-id': CUSTOMER_ID,
           'x-api-key': VECTARA_API_KEY
        },
       'body': body
   };

   xhr.timeout = 100000;

   // Send API Request to OpenAI GPT Model
   const response = await xhr.fetch(url, http_options).then(res => res.json());

   // Parse the response and get the summary
   const summary = response.responseSet[0].summary[0].text;

   return summary;
}
```

Podłączanie funkcji PubNub do interfejsu użytkownika
----------------------------------------------------

Aby podłączyć funkcję PubNub do interfejsu użytkownika, postępuj zgodnie z kodem zdefiniowanym powyżej, używając jednego z wielu [SDK](https://www.pubnub.com/docs/sdks) udostępnianych przez PubNub. [Publikuj/subskrybuj](https://www.pubnub.com/docs/sdks/javascript/api-reference/publish-and-subscribe) do kanału `pubnub-docs-ai` i poczekać, aż zapytanie Vectara zakończy działanie po użyciu powyższej funkcji PubNub. Podłączanie wskaźnika [Typing Indicator](https://www.pubnub.com/docs/chat/sdks/messages/typing) do nasłuchiwania sygnałów PubNub na kanale `pubnub-docs-ai` pozwoli użytkownikowi zobaczyć, kiedy bot PubNub Knowledge myśli, dodając płynniejsze wrażenia użytkownika końcowego.

Kod do podłączenia funkcji PubNub w React:

```js
const pubnub = new PubNub({
   publishKey: process.env.NEXT_PUBLIC_PUBLISH_KEY!,
   subscribeKey: process.env.NEXT_PUBLIC_SUBSCRIBE_KEY!,
   userId: "You",
 });

 const publishChannel = "docs-pubnub-ai";

 const sendMessage = (message: string) => {
   if (message) {
     pubnub.publish({
         channel: publishChannel, message: {
           text: message
       }});
   }
 };
```

Podsumowanie
------------

Korzystanie z funkcji PubNub wraz z dowolną wektorową bazą danych lub Vector Store to bardzo szybki i gotowy do produkcji sposób na stworzenie własnego AI Knowledge Bot. W ten sposób można wykorzystać nie tylko Vectarę, ale także Pinecone, Weaviate lub dowolną inną produkcyjną wektorową bazę danych. Dzięki PubNub Functions łatwo jest hostować i kontrolować sposób wysyłania wiadomości oraz czas ich wysyłania, aby zwiększyć funkcjonalność wektorowych baz danych.

Zarejestruj się w naszym [panelu administratora](https://admin.pubnub.com/#/register) aby rozpocząć konfigurację zestawu kluczy PubNub. Sprawdź również liczbę [samouczków](https://www.pubnub.com/tutorials/) i [blogów](https://www.pubnub.com/blog/) dla konkretnego [przypadku użycia](https://www.pubnub.com/use-case/).

Jak PubNub może ci pomóc?
=========================

Ten artykuł został pierwotnie opublikowany na [PubNub.com](https://www.pubnub.com/blog/build-chatbot-with-custom-knowledge-base/)

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](https://www.pubnub.com/tour/introduction/), aby zrozumieć podstawowe koncepcje każdej aplikacji opartej na PubNub w mniej niż 5 minut.

Rozpocznij konfigurację
-----------------------

Załóż [konto](https://admin.pubnub.com/signup/) PubNub, aby uzyskać natychmiastowy i bezpłatny dostęp do kluczy PubNub.

Rozpocznij
----------

[Dokumenty](https://www.pubnub.com/docs) PubNub pozwolą Ci rozpocząć pracę, niezależnie od przypadku użycia lub [zestawu SDK](https://www.pubnub.com/docs).