[안드로이드] openAI API를 사용하여 AI 채팅 앱 만들기 ep.1

Bluewave·2024년 3월 23일

안드로이드

목록 보기
1/14
post-thumbnail

만들고자 하는 서비스

우선 앱에 관한 구체적인 것들은 모두 밝힐 수 없는 상황이다. 이는 추후에 여유가 된다면, 구체적인 앱 서비스와 UI 및 프로젝트 회고를 올려보는 걸로,,

만들고자 하는 앱의 주 서비스는 '채팅'이다.
정확히는 AI 채팅 + 챗봇 형태.
챗봇 기능의 경우, 더 정확히 얘기하면 챗봇 보다는 퀴즈를 채팅 형식으로 내는 것이라 따로 API를 활용할 계획은 없다. 그저 문제를 내고, 사용자의 답변을 받아 그저 처리하기만 하면 된다. 문제는 AI 채팅이다.
사실 개발 기간이 약 일주일밖에 되지 않기 때문에 AI 채팅은 포기해야 하나.. 싶기도 한데 일단 최소 이틀이라도 매달려 보기로 했다.

사용하는 API

처음에는 dialogflow를 쓰려고 했다. 그런데 자료도 너무 부족하고, 무엇보다 AI 채팅보다 대부분 챗봇 형태로 사용을 하더라고.
그래서 유료이긴 하지만, 처음에 무료로 어느정도 제공이 된다고 얘기를 들어서 openAI API를 사용해보려고 한다.
ㄴ 이래놓고 하다가 중도포기할 수도 있음..!^
일단 해보는거지 뭐 ~

전체적인 단계

  1. 네트워킹 라이브러리 추가
    Retrofit or Volley
    HTTP 요청을 쉽게 보낼 수 있게 도와줌

  2. API 호출 구현
    Retrofit의 경우, Retrofit 설정 후 OpenAI API에 대한 인터페이스를 정의한다.
    이 인터페이스에는 API의 엔드포인트와 요청 방식(GET, POST 등)이 포함됨

  3. 사용자 인터페이스 구현
    사용자가 채팅을 입력하고, AI 응답을 받을 수 있는 인터페이스.
    일반적으로 EditText(입력란)와 RecyclerView(채팅화면)으로 구현

  4. 채팅 메시지 처리
    사용자가 입력한 메시지를 API 호출을 통해서 OpenAI API에 전달함. 이후 응답을 화면에 표시.

+) 에러 처리
에러 코드 작성.
Retrofit에서 제공하는 콜백 함수를 통해 에러 처리.

  • 보안 및 프라이버시 관련 주의!
    비밀 키 절대!! 외부 노출x 🚨 -> 깃허브 안올라가게 조심 또 조심


구현

openAI 비밀 키 만들기

그런데 openAI API 활용 조차도 많은 자료가 있지 않은 상황이라,, (특히 안드로이드는) 맨땅에 헤딩 느낌이 없지 않아 있다(?)

우선 코드를 작성하기에 앞서, 비밀키를 생성해야 한다.
openAI API 플랫폼 바로가기
위의 링크로 들어가서 가입 먼저 해주고, 왼쪽 메뉴에서 API Keys 선택!

그런 다음 Create new secret key 눌러서 만들어주면 된다.

이름만 넣어주면 됩니당-
참고로 Create하면 비밀 키가 뜨는데 바로 복사해서 어디 넣어놓으세요 ,, 다시 못본다고 함 ‼️


in 안드로이드 스튜디오

우선 미리 안내하자면, 이번 ep.1에서는 앞선 전체적인 단계에서 1,2번만 우선 작성하였다.
ㄴ 이 조차도 뒤에서 수정될 수 있음

1. 네트워킹 라이브러리 추가 - Retrofit

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

build.gradle에 라이브러리 추가

2. API 서비스 인터페이스 정의

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Headers;
import retrofit2.http.POST;

public interface OpenAIApiService {
    @Headers({
            "Content-Type: application/json",
            "Authorization: Bearer YOUR_API_KEY"
    })
    @POST("completion")
    Call<ApiResponse> getCompletion(@Body ApiRequest request);
}

API 엔드포인트와 요청 방식 정의

3. API 호출 메서드 작성

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class ApiClient {
    private static final String BASE_URL = "https://api.openai.com/v1/";
    private OpenAIApiService service;

    public ApiClient() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        service = retrofit.create(OpenAIApiService.class);
    }

    public void getChatResponse(String userInput, Callback<ApiResponse> callback) {
        ApiRequest request = new ApiRequest();
        request.setUserInput(userInput);
        
        Call<ApiResponse> call = service.getCompletion(request);
        call.enqueue(callback);
    }
}

서비스 인터페이스에서 정의한 메서드를 호출하여 API 요청을 보냄

+) ApiRequest.java

public class ApiRequest {
    private String userInput;


    public String getUserInput() {
        return userInput;
    }

    public void setUserInput(String userInput) {
        this.userInput = userInput;
    }
}

+) ApiResponse.java

import com.google.gson.annotations.SerializedName;

public class ApiResponse {
    @SerializedName("id")
    private String id;

    @SerializedName("completion")
    private String completion;

    // Getter 및 Setter 메서드 생략
}

4. API 응답 처리

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class ChatResponseCallback implements Callback<ApiResponse> {
    @Override
    public void onResponse(Call<ApiResponse> call, Response<ApiResponse> response) {
        if (response.isSuccessful()) {
            ApiResponse apiResponse = response.body();
            // API 응답을 처리합니다.
        } else {
            // API 호출이 실패한 경우 에러 처리를 합니다.
        }
    }

    @Override
    public void onFailure(Call<ApiResponse> call, Throwable t) {
        // API 호출이 실패한 경우 에러 처리를 합니다.
    }
}

API 응답을 처리하기 위해서 Retrofit의 콜백 구현
호출이 성공했을 때와 실패했을 처리.



위에 작성한 코드들은 앞으로 프로젝트를 진행하면서 전부 삭제될 수도, 수정될 수도 있지만 우선은 이렇게 작성해놓은 상태이다.
이 글은 이렇게 하세요!! 하는 정보성 글 보다는, 저는 이렇게 하고 있어요 ~ 라는 회고성 글이다..!
정보 전달 목적보다는 개인 프로젝트에 대한 기록용이랄까 암튼 ..
정보가 너ㅓㅓ무 부족한건 팩트라 이렇게라도 남겨놓으면 좋지 않을까 싶다 !

profile
Developer's Logbook

0개의 댓글