Przejdź do głównej treści
Wiemy, że integracja niektórych API do pytań i odpowiedzi na rynku nie jest zbyt łatwa, na przykład API Chat Completions od OpenAI, które ma pole messages. Aby zrealizować ciągłą rozmowę, musimy przekazać całą historię kontekstu, a także zająć się problemem przekroczenia limitu Tokenów. API do pytań i odpowiedzi AI oferowane przez AceDataCloud zostało zoptymalizowane pod kątem powyższej sytuacji, zapewniając, że efekty pytań i odpowiedzi pozostają niezmienne, a realizacja ciągłych rozmów została opakowana, co oznacza, że podczas integracji nie musimy już martwić się o przekazywanie messages ani o problem z przekroczeniem limitu Tokenów (API automatycznie zajmuje się tym wewnętrznie). Dodatkowo oferuje funkcje zapytań i modyfikacji rozmów, co znacznie upraszcza całą integrację. Dokument ten przedstawia opis integracji API do pytań i odpowiedzi AI.

Proces aplikacji

Aby korzystać z API, należy najpierw przejść do odpowiedniej strony AI Chat API i złożyć wniosek o odpowiednią usługę. Po wejściu na stronę kliknij przycisk „Acquire”, jak pokazano na obrazku: Jeśli nie jesteś zalogowany lub zarejestrowany, automatycznie zostaniesz przekierowany na stronę logowania, aby zarejestrować się i zalogować. Po zalogowaniu lub rejestracji automatycznie wrócisz na bieżącą stronę. Podczas pierwszej aplikacji otrzymasz darmowy limit, który pozwala na bezpłatne korzystanie z tego API.

Podstawowe użycie

Najpierw zapoznaj się z podstawowym sposobem użycia, czyli wprowadzeniem pytania i uzyskaniem odpowiedzi. Wystarczy prosto przekazać pole question i określić odpowiedni model. Na przykład zapytanie: „Jak masz na imię?”, możemy następnie wypełnić odpowiednie treści na interfejsie, jak pokazano na obrazku: Możemy zobaczyć, że ustawiliśmy nagłówki żądania, w tym:
  • accept: jakiego formatu odpowiedzi oczekujemy, tutaj wpisujemy application/json, czyli format JSON.
  • authorization: klucz do wywołania API, po złożeniu wniosku można go bezpośrednio wybrać z rozwijanej listy.
Dodatkowo ustawiliśmy ciało żądania, w tym:
  • model: wybór modelu, na przykład popularne GPT 3.5, GPT 4 itd.
  • question: pytanie, które chcemy zadać, może być dowolnym czystym tekstem.
Po dokonaniu wyboru, możemy zauważyć, że po prawej stronie wygenerowano odpowiedni kod, jak pokazano na obrazku:

Klikając przycisk „Try”, możemy przeprowadzić test, jak pokazano na powyższym obrazku, otrzymujemy następujący wynik:
{
  "answer": "Jestem modelem językowym AI opracowanym przez OpenAI i nie mam osobistego imienia. Możesz mnie nazywać GPT lub po prostu Chatbot. Jak mogę Ci dzisiaj pomóc?"
}
Możemy zobaczyć, że w zwróconym wyniku znajduje się pole answer, które jest odpowiedzią na to pytanie. Możemy wprowadzić dowolne pytanie, aby uzyskać dowolną odpowiedź. Jeśli nie potrzebujesz wsparcia dla wieloetapowych rozmów, to API może znacznie ułatwić Twoją integrację. Dodatkowo, jeśli chcesz wygenerować odpowiedni kod do integracji, możesz go bezpośrednio skopiować, na przykład kod CURL wygląda następująco:
curl -X POST 'https://api.acedata.cloud/aichat/conversations' \
-H 'accept: application/json' \
-H 'authorization: Bearer {token}' \
-H 'content-type: application/json' \
-d '{
  "model": "gpt-3.5",
  "question": "Jak masz na imię?"
}'
Kod do integracji w Pythonie wygląda następująco:
import requests

url = "https://api.acedata.cloud/aichat/conversations"

headers = {
    "accept": "application/json",
    "authorization": "Bearer {token}",
    "content-type": "application/json"
}

payload = {
    "model": "gpt-3.5",
    "question": "Jak masz na imię?"
}

response = requests.post(url, json=payload, headers=headers)
print(response.text)

Wieloetapowe rozmowy

Jeśli chcesz zintegrować funkcję wieloetapowych rozmów, musisz przekazać dodatkowy parametr stateful, którego wartość wynosi true. Każde kolejne żądanie musi zawierać ten parametr. Po przekazaniu parametru stateful, API dodatkowo zwróci parametr id, który reprezentuje ID bieżącej rozmowy. W przyszłości wystarczy przekazać to ID jako parametr, aby łatwo zrealizować wieloetapowe rozmowy. Poniżej przedstawiamy konkretne operacje. Pierwsze żądanie, ustawiając parametr stateful na true, oraz normalnie przekazując parametry model i question, jak pokazano na obrazku: Odpowiedni kod wygląda następująco:
curl -X POST 'https://api.acedata.cloud/aichat/conversations' \
-H 'accept: application/json' \
-H 'authorization: Bearer {token}' \
-H 'content-type: application/json' \
-d '{
  "model": "gpt-3.5",
  "question": "Jak masz na imię?",
  "stateful": true
}'
Możemy otrzymać następującą odpowiedź:
{
  "answer": "Jestem modelem językowym AI stworzonym przez OpenAI i nie mam osobistego imienia. Możesz mnie po prostu nazywać OpenAI lub ChatGPT. Jak mogę Ci dzisiaj pomóc?",
  "id": "7cdb293b-2267-4979-a1ec-48d9ad149916"
}
Drugie żądanie, przekazując pole id zwrócone w pierwszym żądaniu jako parametr, a parametr stateful nadal ustawiony na true, pytając „Co właśnie zapytałem?”, jak pokazano na obrazku: Odpowiedni kod wygląda następująco:
curl -X POST 'https://api.acedata.cloud/aichat/conversations' \
-H 'accept: application/json' \
-H 'authorization: Bearer {token}' \
-H 'content-type: application/json' \
-d '{
  "model": "gpt-3.5",
  "stateful": true,
  "id": "7cdb293b-2267-4979-a1ec-48d9ad149916",
  "question": "Co właśnie zapytałem?"
}'
Wynik wygląda następująco:
{
  "answer": "Zapytałeś mnie, jak mam na imię. Jako model językowy AI nie posiadam osobistej tożsamości, więc nie mam konkretnego imienia. Możesz mnie jednak nazywać OpenAI lub ChatGPT, to nazwy używane dla tego modelu AI. Czy mogę w czymś jeszcze pomóc?",
  "id": "7cdb293b-2267-4979-a1ec-48d9ad149916"
}
Możemy zobaczyć, że możemy odpowiadać na odpowiednie pytania w oparciu o kontekst.

Odpowiedzi strumieniowe

To API obsługuje również odpowiedzi strumieniowe, co jest bardzo przydatne w integracji z witrynami internetowymi, umożliwiając wyświetlanie efektu literowego. Aby uzyskać odpowiedź strumieniową, można zmienić parametr accept w nagłówku żądania na application/x-ndjson. Zmiana, jak pokazano na obrazku, jednak kod wywołania musi być odpowiednio zmieniony, aby obsługiwał odpowiedzi strumieniowe. Po zmianie accept na application/x-ndjson, API zwróci odpowiednie dane JSON w kolejnych liniach, a w kodzie musimy wprowadzić odpowiednie zmiany, aby uzyskać wyniki w kolejnych liniach. Przykładowy kod wywołania w Pythonie:
import requests

url = "https://api.acedata.cloud/aichat/conversations"

headers = {
    "accept": "application/x-ndjson",
    "authorization": "Bearer {token}",
    "content-type": "application/json"
}

payload = {
    "model": "gpt-3.5",
    "stateful": True,
    "id": "7cdb293b-2267-4979-a1ec-48d9ad149916",
    "question": "Cześć"
}

response = requests.post(url, json=payload, headers=headers, stream=True)
for line in response.iter_lines():
    print(line.decode())
Wynik wygląda następująco:
{"answer": "Cześć", "delta_answer": "Cześć", "id": "7cdb293b-2267-4979-a1ec-48d9ad149916"}
{"answer": "Cześć!", "delta_answer": "!", "id": "7cdb293b-2267-4979-a1ec-48d9ad149916"}
{"answer": "Cześć! Jak", "delta_answer": " Jak", "id": "7cdb293b-2267-4979-a1ec-48d9ad149916"}
{"answer": "Cześć! Jak mogę", "delta_answer": " mogę", "id": "7cdb293b-2267-4979-a1ec-48d9ad149916"}
{"answer": "Cześć! Jak mogę ci", "delta_answer": " ci", "id": "7cdb293b-2267-4979-a1ec-48d9ad149916"}
{"answer": "Cześć! Jak mogę ci pomóc", "delta_answer": " pomóc", "id": "7cdb293b-2267-4979-a1ec-48d9ad149916"}
{"answer": "Cześć! Jak mogę ci pomóc?", "delta_answer": "?", "id": "7cdb293b-2267-4979-a1ec-48d9ad149916"}
Można zauważyć, że odpowiedź w answer to najnowsza treść odpowiedzi, a delta_answer to nowa treść odpowiedzi, którą można zintegrować z systemem. JavaScript również jest wspierany, na przykład kod do wywołania strumieniowego w Node.js wygląda następująco:
const axios = require("axios");

const url = "https://api.acedata.cloud/aichat/conversations";
const headers = {
  "Content-Type": "application/json",
  Accept: "application/x-ndjson",
  Authorization: "Bearer {token}",
};
const body = {
  question: "Cześć",
  model: "gpt-3.5",
  stateful: true,
};

axios
  .post(url, body, { headers: headers, responseType: "stream" })
  .then((response) => {
    console.log(response.status);
    response.data.on("data", (chunk) => {
      console.log(chunk.toString());
    });
  })
  .catch((error) => {
    console.error(error);
  });
Przykładowy kod w Javie:
String url = "https://api.acedata.cloud/aichat/conversations";
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"question\": \"Cześć\", \"stateful\": true, \"model\": \"gpt-3.5\"}");
Request request = new Request.Builder()
        .url(url)
        .post(body)
        .addHeader("Content-Type", "application/json")
        .addHeader("Accept", "application/x-ndjson")
        .addHeader("Authorization", "Bearer {token}")
        .build();

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        e.printStackTrace();
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        if (!response.isSuccessful()) throw new IOException("Nieoczekiwany kod " + response);
        try (BufferedReader br = new BufferedReader(
                new InputStreamReader(response.body().byteStream(), "UTF-8"))) {
            String responseLine;
            while ((responseLine = br.readLine()) != null) {
                System.out.println(responseLine);
            }
        }
    }
});
Inne języki można przekształcić samodzielnie, zasada jest taka sama.

Ustawienia modelu

Wiemy, że API związane z OpenAI ma odpowiednią koncepcję system_prompt, która ustawia domyślne ustawienia dla całego modelu, na przykład jego nazwę itd. To API AI Q&A również udostępnia ten parametr, nazywa się preset, dzięki czemu możemy dodać ustawienia do modelu. Użyjmy przykładu, aby to zobaczyć: Tutaj dodatkowo dodajemy pole preset, którego treść to Jesteś profesjonalnym artystą, jak pokazano na obrazku: Odpowiedni kod wygląda następująco:
curl -X POST 'https://api.acedata.cloud/aichat/conversations' \
-H 'accept: application/json' \
-H 'authorization: Bearer {token}' \
-H 'content-type: application/json' \
-d '{
  "model": "gpt-3.5",
  "stateful": true,
  "question": "W czym możesz mi pomóc?",
  "preset": "Jesteś profesjonalnym artystą"
}'
Wynik wygląda następująco:
{
    "answer": "Jako profesjonalny artysta mogę zaoferować szereg usług i pomocy w zależności od twoich specyficznych potrzeb. Oto kilka sposobów, w jakie mogę ci pomóc:\n\n1. Sztuka na zamówienie: Jeśli masz konkretną wizję lub pomysł, mogę stworzyć sztukę na zamówienie dla ciebie. Może to obejmować obrazy, rysunki, sztukę cyfrową lub jakikolwiek inny medium, które preferujesz.\n\n2. Zlecone dzieła: Jeśli masz na myśli konkretny temat lub koncepcję, mogę stworzyć zlecone dzieła sztuki dostosowane do twoich preferencji. Może to być dla osobistej przyjemności lub jako unikalny prezent dla kogoś specjalnego.\n\n3. Konsultacje artystyczne: Jeśli potrzebujesz wskazówek dotyczących wyboru sztuki, projektowania wnętrz lub jak pokazać i wyeksponować sztukę w swojej przestrzeni, mogę zapewnić profesjonalne porady, aby pomóc w poprawie twojego poczucia estetyki i stworzeniu spójnego wyglądu."
}
Można zauważyć, że powiedzieliśmy GPT, że jest robotem, a następnie zapytaliśmy, co może dla nas zrobić, a on może odegrać rolę robota, aby odpowiedzieć na pytania.

Rozpoznawanie obrazów

To AI również wspiera dodawanie załączników do rozpoznawania obrazów, przekazując odpowiedni link do obrazu przez references, na przykład mam tutaj zdjęcie jabłka, jak pokazano na obrazku: Link do tego obrazu to https://cdn.acedata.cloud/ht05g0.png, możemy bezpośrednio przekazać go jako parametr references, jednocześnie należy pamiętać, że model musi być wybrany jako wspierający rozpoznawanie wizualne, obecnie wspierany jest gpt-4-vision, więc wejście wygląda następująco: Odpowiedni kod wygląda następująco:
curl -X POST 'https://api.acedata.cloud/aichat/conversations' \
-H 'accept: application/json' \
-H 'authorization: Bearer {token}' \
-H 'content-type: application/json' \
-d '{
  "model": "gpt-4-vision",
  "question": "Ile jabłek jest na zdjęciu?",
  "references": ["https://cdn.acedata.cloud/ht05g0.png"]
}'
Wynik wygląda następująco:
{
  "answer": "Na zdjęciu jest 5 jabłek."
}
Można zauważyć, że udało nam się uzyskać odpowiedź na podstawie odpowiedniego obrazu.

Pytania online

To API wspiera również modele online, w tym GPT-3.5 i GPT-4, które mogą wspierać, w tle API odbywa się automatyczne przeszukiwanie internetu i podsumowywanie, możemy wybrać model jako gpt-3.5-browsing, aby to przetestować, jak pokazano na obrazku: Kod wygląda następująco:
```shell
curl -X POST 'https://api.acedata.cloud/aichat/conversations' \
-H 'accept: application/json' \
-H 'authorization: Bearer {token}' \
-H 'content-type: application/json' \
-d '{
  "model": "gpt-3.5-browsing",
  "question": "Jaka jest dzisiaj pogoda w Nowym Jorku?"
}'
Wynik działania jest następujący:
{
  "answer": "Pogoda w Nowym Jorku dzisiaj jest następująca:\n- Temperatura aktualna: 16°C (60°F)\n- Maksymalna: 16°C (60°F)\n- Minimalna: 10°C (50°F)\n- Wilgotność: 47%\n- Indeks UV: 6 z 11\n- Wschód słońca: 5:42\n- Zachód słońca: 20:02\n\nJest pochmurno z szansą na sporadyczne opady deszczu w nocy, a szansa na deszcz wynosi 50%.\nAby uzyskać więcej szczegółów, możesz odwiedzić [The Weather Channel](https://weather.com/weather/tenday/l/96f2f84af9a5f5d452eb0574d4e4d8a840c71b05e22264ebdc0056433a642c84).\n\nCzy jest coś jeszcze, co chciałbyś wiedzieć?"
}
Można zauważyć, że automatycznie połączył się z witryną The Weather Channel i uzyskał informacje z niej, a następnie zwrócił aktualne wyniki.
Jeśli masz wyższe wymagania co do jakości odpowiedzi modelu, możesz zmienić model na gpt-4-browsing, a efekty odpowiedzi będą lepsze.