메인 콘텐츠로 건너뛰기
우리는 시장에 있는 일부 질문 응답 API의 연동이 상대적으로 쉽지 않다는 것을 알고 있습니다. 예를 들어 OpenAI의 Chat Completions API는 messages 필드가 있으며, 연속 대화를 완료하려면 모든 맥락 이력을 전달해야 하고, 동시에 Token 초과 제한 문제를 처리해야 합니다. AceDataCloud에서 제공하는 AI 질문 응답 API는 이러한 상황을 최적화하여 질문 응답 효과를 유지하면서 연속 대화의 구현을 캡슐화했습니다. 연동 시 messages의 전달에 대해 걱정할 필요가 없으며, Token 초과 제한 문제도 신경 쓸 필요가 없습니다(API 내부에서 자동으로 처리됨). 또한 대화 조회, 수정 등의 기능도 제공하여 전체 연동이 크게 간소화되었습니다. 이 문서에서는 AI 질문 응답 API의 연동 설명을 소개합니다.

신청 절차

API를 사용하려면 먼저 AI 질문 응답 API 해당 페이지에서 서비스를 신청해야 합니다. 페이지에 들어가면 “Acquire” 버튼을 클릭합니다. 아래와 같이: 로그인 또는 등록이 되어 있지 않으면 자동으로 로그인 페이지로 리디렉션되어 등록 및 로그인을 초대합니다. 로그인 및 등록 후에는 자동으로 현재 페이지로 돌아옵니다. 첫 번째 신청 시 무료 한도가 제공되어 해당 API를 무료로 사용할 수 있습니다.

기본 사용

먼저 기본 사용 방식을 이해해야 합니다. 즉, 질문을 입력하고 답변을 얻는 것입니다. 간단히 question 필드를 전달하고 해당 모델을 지정하면 됩니다. 예를 들어 “What’s your name?”이라고 질문하면, 다음과 같이 인터페이스에 해당 내용을 입력할 수 있습니다: 여기서 우리는 Request Headers를 설정했습니다. 포함된 내용은 다음과 같습니다:
  • accept: 어떤 형식의 응답 결과를 받고 싶은지, 여기서는 application/json, 즉 JSON 형식으로 입력합니다.
  • authorization: API 호출을 위한 키로, 신청 후 직접 드롭다운에서 선택할 수 있습니다.
또한 Request Body를 설정했습니다. 포함된 내용은 다음과 같습니다:
  • model: 모델 선택, 예를 들어 주류 모델인 GPT 3.5, GPT 4 등.
  • question: 질문할 내용으로, 임의의 순수 텍스트일 수 있습니다.
선택 후, 오른쪽에 해당 코드가 생성된 것을 확인할 수 있습니다:

“Try” 버튼을 클릭하면 테스트를 진행할 수 있으며, 위 그림과 같이 다음과 같은 결과를 얻을 수 있습니다:
{
  "answer": "I am an AI language model developed by OpenAI and I don't have a personal name. However, you can call me GPT or simply Chatbot. How can I assist you today?"
}
여기서 반환된 결과에는 answer 필드가 있으며, 이는 해당 질문에 대한 답변입니다. 우리는 임의의 질문을 입력하여 임의의 답변을 얻을 수 있습니다. 다중 대화 지원이 필요하지 않다면, 이 API는 연동을 크게 편리하게 해줍니다. 또한 해당 연동 코드를 생성하고 싶다면, 생성된 코드를 직접 복사할 수 있습니다. 예를 들어 CURL의 코드는 다음과 같습니다:
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": "What's your name?"
}'
Python의 연동 코드는 다음과 같습니다:
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": "What's your name?"
}

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

다중 대화

다중 대화 기능을 연동하려면 추가 매개변수 stateful을 전달해야 하며, 그 값은 true입니다. 이후의 각 요청에는 이 매개변수를 포함해야 합니다. stateful 매개변수를 전달하면 API는 현재 대화의 ID를 나타내는 추가 id 매개변수를 반환합니다. 이후에는 해당 ID를 매개변수로 전달하기만 하면 쉽게 다중 대화를 구현할 수 있습니다. 아래에서 구체적인 작업을 시연하겠습니다. 첫 번째 요청에서 stateful 매개변수를 true로 설정하고, modelquestion 매개변수를 정상적으로 전달합니다. 아래와 같이: 해당 코드입니다:
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": "What's your name?",
  "stateful": true
}'
다음과 같은 답변을 얻을 수 있습니다:
{
  "answer": "I am an AI language model created by OpenAI and I don't have a personal name. You can simply call me OpenAI or ChatGPT. How can I assist you today?",
  "id": "7cdb293b-2267-4979-a1ec-48d9ad149916"
}
두 번째 요청에서는 첫 번째 요청에서 반환된 id 필드를 매개변수로 전달하고, stateful 매개변수는 여전히 true로 설정하여 “What I asked you just now?”라고 질문합니다. 아래와 같이: 해당 코드입니다:
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": "What I asked you just now?"
}'
결과는 다음과 같습니다:
{
  "answer": "You asked me what my name is. As an AI language model, I do not possess a personal identity, so I don't have a specific name. However, you can refer to me as OpenAI or ChatGPT, the names used for this AI model. Is there anything else I can help you with?",
  "id": "7cdb293b-2267-4979-a1ec-48d9ad149916"
}
맥락에 따라 해당 질문에 대한 답변을 할 수 있음을 확인할 수 있습니다.

스트리밍 응답

이 인터페이스는 스트리밍 응답도 지원합니다. 이는 웹 페이지 연동에 매우 유용하며, 웹 페이지에서 글자 단위로 표시되는 효과를 구현할 수 있습니다. 스트리밍 응답을 원하면 요청 헤더의 accept 매개변수를 application/x-ndjson으로 변경하면 됩니다. 변경 사항은 아래와 같으며, 호출 코드는 스트리밍 응답을 지원하도록 적절한 변경이 필요합니다. acceptapplication/x-ndjson으로 변경하면 API는 해당 JSON 데이터를 줄 단위로 반환하며, 코드 측면에서 우리는 줄 단위 결과를 얻기 위해 적절한 수정을 해야 합니다. Python 샘플 호출 코드는:
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": "안녕하세요"
}

response = requests.post(url, json=payload, headers=headers, stream=True)
for line in response.iter_lines():
    print(line.decode())
출력 효과는 다음과 같습니다:
{"answer": "안녕하세요", "delta_answer": "안녕하세요", "id": "7cdb293b-2267-4979-a1ec-48d9ad149916"}
{"answer": "안녕하세요!", "delta_answer": "!", "id": "7cdb293b-2267-4979-a1ec-48d9ad149916"}
{"answer": "안녕하세요! 어떻게", "delta_answer": " 어떻게", "id": "7cdb293b-2267-4979-a1ec-48d9ad149916"}
{"answer": "안녕하세요! 어떻게 도와드릴까요", "delta_answer": " 도와드릴까요", "id": "7cdb293b-2267-4979-a1ec-48d9ad149916"}
{"answer": "안녕하세요! 어떻게 도와드릴까요?", "delta_answer": "?", "id": "7cdb293b-2267-4979-a1ec-48d9ad149916"}
응답에서 answer는 최신 답변 내용이며, delta_answer는 추가된 답변 내용입니다. 결과에 따라 시스템에 통합할 수 있습니다. JavaScript도 지원되며, Node.js의 스트리밍 호출 코드는 다음과 같습니다:
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: "안녕하세요",
  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);
  });
Java 샘플 코드:
String url = "https://api.acedata.cloud/aichat/conversations";
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"question\": \"안녕하세요\", \"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("예상치 못한 코드 " + response);
        try (BufferedReader br = new BufferedReader(
                new InputStreamReader(response.body().byteStream(), "UTF-8"))) {
            String responseLine;
            while ((responseLine = br.readLine()) != null) {
                System.out.println(responseLine);
            }
        }
    }
});
다른 언어는 별도로 수정할 수 있으며, 원리는 모두 동일합니다.

모델 프리셋

우리는 OpenAI 관련 API에 system_prompt 개념이 있다는 것을 알고 있습니다. 이는 전체 모델에 프리셋을 설정하는 것입니다. 본 AI 질문 응답 API도 이 매개변수를 노출하고 있으며, 이를 통해 모델에 프리셋을 추가할 수 있습니다. 예를 들어, preset 필드를 추가하여 내용은 당신은 전문 아티스트입니다로 설정할 수 있습니다. 여기서 우리는 preset 필드를 추가하여 내용을 당신은 전문 아티스트입니다로 설정합니다:
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": "무엇을 도와줄 수 있나요?",
  "preset": "당신은 전문 아티스트입니다"
}'
실행 결과는 다음과 같습니다:
{
    "answer": "전문 아티스트로서, 귀하의 특정 요구에 따라 다양한 서비스와 지원을 제공할 수 있습니다. 제가 도와드릴 수 있는 몇 가지 방법은 다음과 같습니다:\n\n1. 맞춤형 예술 작품: 특정 비전이나 아이디어가 있다면, 귀하를 위해 맞춤형 예술 작품을 만들 수 있습니다. 여기에는 그림, 드로잉, 디지털 아트 또는 귀하가 선호하는 다른 매체가 포함될 수 있습니다.\n\n2. 의뢰 작품: 특정 주제나 개념이 있다면, 귀하의 선호에 맞춘 의뢰 예술 작품을 만들 수 있습니다. 이는 개인적인 즐거움을 위한 것이거나 특별한 사람을 위한 독특한 선물이 될 수 있습니다.\n\n3. 예술 상담: 예술 선택, 인테리어 디자인 또는 귀하의 공간에서 예술을 전시하고 보여주는 방법에 대한 안내가 필요하다면, 미적 감각을 향상시키고 일관된 모습을 만들기 위해 전문적인 조언을 제공할 수 있습니다."
}
여기서 우리는 GPT에게 그가 로봇이라고 말한 후, 그가 우리를 위해 무엇을 할 수 있는지 물어보았습니다. 그러면 그는 로봇의 역할을 맡아 질문에 답변할 수 있습니다.

이미지 인식

본 AI는 첨부 파일을 추가하여 이미지 인식을 지원할 수 있으며, references를 통해 해당 이미지 링크를 전달하면 됩니다. 예를 들어, 여기 사과 이미지가 있습니다: 해당 이미지의 링크는 https://cdn.acedata.cloud/ht05g0.png이며, 이를 references 매개변수로 전달하면 됩니다. 또한, 모델은 시각 인식을 지원하는 모델을 선택해야 하며, 현재 지원되는 모델은 gpt-4-vision입니다. 따라서 입력은 다음과 같습니다:
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": "사진에 사과가 몇 개 있나요?",
  "references": ["https://cdn.acedata.cloud/ht05g0.png"]
}'
실행 결과는 다음과 같습니다:
{
  "answer": "사진에 사과가 5개 있습니다."
}
우리는 해당 이미지에 대한 답변 결과를 성공적으로 얻었습니다.

인터넷 질문 응답

본 API는 인터넷 모델도 지원하며, GPT-3.5와 GPT-4 모두 지원됩니다. API 뒤에는 자동으로 인터넷을 검색하고 요약하는 과정이 있으며, 모델을 gpt-3.5-browsing으로 선택하여 경험할 수 있습니다.
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": "오늘 뉴욕의 날씨는 어떤가요?"
}'
운영 결과는 다음과 같습니다:
{
  "answer": "오늘 뉴욕의 날씨는 다음과 같습니다:\n- 현재 온도: 16°C (60°F)\n- 최고: 16°C (60°F)\n- 최저: 10°C (50°F)\n- 습도: 47%\n- 자외선 지수: 11점 만점에 6점\n- 일출: 오전 5:42\n- 일몰: 오후 8:02\n\n흐림과 함께 가끔 비가 내릴 가능성이 있으며, 비가 올 확률은 50%입니다.\n자세한 내용은 [The Weather Channel](https://weather.com/weather/tenday/l/96f2f84af9a5f5d452eb0574d4e4d8a840c71b05e22264ebdc0056433a642c84)를 방문하실 수 있습니다.\n\n더 알고 싶은 것이 있나요?"
}
모델의 응답 품질에 대한 요구가 더 높다면, 모델을 gpt-4-browsing으로 변경하면 응답 효과가 더 좋습니다.