Działanie ChatGPT poprzez API

0

W wolnych chwilach "bawię się" API od OpenAI w ramach prób napisania prymitywnego programu do chatowania na własne potrzeby. Bez owijania w bawełnę, załóżmy, że ten program ma być zwykłym interfejsem chatu, jak każda apka służąca do chatowania.

O ile w kwestiach interfejsu i działania samego programu nie mam żadnych pytań, o tyle mam pytania i wątpliwości odnośnie komunikacji z OpenAI poprzez REST API. Sam ChatGPT niestety nie był w stanie udzielić satysfakcjonujących odpowiedzi na te pytania. Posiadam klucz API i wpłaciłem $10 na potrzeby korzystania z API.

  1. ChatGPT powiedział mi, że silnik (model) GPT-4o sterowany poprzez interfejs webowy generuje odpowiedzi w formacie Markdown i wyświetla interfejs webowy konwertuje je na HTML. W ramach testu, zakładam nowy chat i zadaję pytanie Co to jest Soundies?. Dostaję długą odpowiedź z formatowaniem. Teraz poprzez API wybieram model GPT-4o i w identyczne sposób zadają pytanie. Dostaję krótszą odpowiedź czystym tekstem. Natomiast, jak wyślę pytanie Co to jest Soundies? Podaj odpowiedź w formacie Markdown., to już dostaję odpowiedź podobną do tej uzyskanej w interfejsie webowym. Jedynie udało mi się dowiedzieć, że prawdopodobnie pomiędzy interfejsem, a silnikiem jest jakiś pośredniczący algorytm, który ulepsza pytania tak, żeby zawsze generował odpowiedzi Markdown. Jaki to algorytm lub jak wysterować API, aby uzyskiwać Markdown z automatu za każdym razem? ChatGPT jedynie proponuje odpowiednie spreparowanie pytania lub ewentualnie prymitywne dopisanie sztampowej prośby o format Markdown do każdego wysłanego pytania, co na jedno wychodzi. Jak uzyskać efekt taki sam, jak w interfejsie webowym?

  2. Udało mi się dowiedzieć, że w przypadku API, trzeba za każdym razem przesyłać całą rozmowę, tak, jakby silnik GPT był bezstanowy. Jak to zrobić, to się dowiedziałem, ale co wtedy, gdy objętość rozmowy przekracza limit tokenów? ChatGPT proponuje tak naprawdę dwie rzeczy: Pierwsza rzecz to zamiast wysyłać wszystko za każdym razem, to wysyłać tylko kilka ostatnich komunikatów. Druga rzecz, jaką umie zaproponować, to przeredagować historyczne komunikaty tak, żeby były krótsze, ale zawierały najważniejsze informacje. Jak faktycznie jest to robione w interfejsie webowym ChatGPT? Na to proste pytanie sam ChatGPT nie umie odpowiedzieć.

Cel odpowiedzi na powyższe pytania jest tylko jeden: Działanie mojego programu jak najbardziej podobne do działania interfejsu webowego w zakresie uzyskiwania odpowiedzi od silnika GPT.

2

Możesz spróbować (przykłady z https://platform.openai.com/docs/quickstart)

  1. Instrukcje dla GPT
import OpenAI from "openai";
const openai = new OpenAI();

const completion = await openai.chat.completions.create({
    model: "gpt-4o-mini",
    messages: [
          { role: "system", content: "Podaj odpowiedź w formacie Markdown." }, <-- instrukcja jak ma się zachowywać
        {
            role: "user",
            content: "Co to jest Soundies?",<--- zapytanie 
        },
    ],
});

console.log(completion.choices[0].message);
  1. Dla historii konwersacji możesz próbować to jakoś optymalizować (tak by nie wysyłać wszystkiego) za pomocą embeddings (https://platform.openai.com/docs/guides/embeddings).

a) dla nowego zapytania liczysz embedding
b) korelujesz z embeddings, które masz w lokalnej bazie danych i wybierasz "najlepiej skorelowany dokument"

Jako request wysyłasz zadanie dla GPT wraz z kontekstem: treścią "najlepiej skorelowanego dokumentu" (w teorii ten dokument powinien być dużo mniejszy niż cała historia i dostarczać "najlepszy" kontekst wspomagający GPT w odpowiedzi na pytanie).

Jak liczyć embedding? Użyć OpenAI :) Albo lokalnych modeli (o takich wspominają np. https://medium.com/hackademia/how-to-use-local-embedding-models-and-sentence-transformers-c0bf80a00ce2 )

0

ad.1. Sprawdziłem i to działa "mnie więcej":

  • gpt-4 - nawet, jak się poprosi o Markdown, to często nie oddaje Markdown
  • gpt-4o- działa tylko wtedy, gdy wyraźnie poprosi się o określony format
  • gpt-4mini - to działa chyba najlepiej.

ad.2. Popatrzę na to embeddings w wolnym czasie, po Świętach, obecnie testuję modyfikację najprostszego algorytmu, czyli wysłanie kilku wiadomości wstecz i dostaję satysfakcjonujące efekty. Moja modyfikacja polega na tym, zeby nie liczyc sztywno typu "10 ostatnich zapytań", tylko zliczać tokeny (z API dostaję liczbę tokenów kaðego wysłanego i otrzymanego tekstu) i wysłać tyle ostatnich wiadomości, żeby zmieścić się w założonym z góry limicie, np 5000 tokenów w wiadomościach wstecz.

Czy jest taka możliwość, że do samej obsługi pogawędek z ChatGPT w przeglądarce, też jest zaprzęgnięty ten sam model GPT, żeby odpowiednio spreparował zapytania, które trafiają do tego GPT, z którego użytkownik dostaje odpowiedź? Różnica byłaby taka, że w przypadku API, pytania i odpowiedzi są przesyłane tak, jak są, nic nie jest automatycznie preparowane "po drodze" i to by tłumaczyło, dlaczego w webie jest tak ładnie i pięknie, a w API już nie bardzo. No i taryfa opłat jest inna, bo w API płaci się za tokeny, czyli tyle, ile się korzysta, a w webie to płaci się stałą kwotę, dosyć sporą jak za okazjonalne pogawędki lub częste, ale krótkie pogawędki, niezależnie od tego, ile się korzysta.

Jeżeli takie komplikacje, to nie widzę sensu je zastosować, bo to nie problem dopisać komentarz "poproszę w Markdown" wraz z pierwszym pytaniem, to akurat działa. Zawsze też można po otrzymaniu odpowiedzi wysłać "napisz to samo jeszcze raz, ale formatując w Markdown".

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.