카테고리 없음

Flutter - 원하는 테마의 ChatGPT API로 인공지능 챗봇 만들기

Dave Park 2024. 5. 11. 18:48

맵핑에 AI 기능이 추가되었다.

사용자의 검색어에 따른 데이트코스 추천 AI 챗봇이다.

딥러닝의 학습방식에 그치는 나의 인공지능 지식의 한계에 따라 ChatGPT API를 활용하기로 결정했다.

 

내가 원하는 챗봇을 구현하기 위한 개발 Flow를 간략하게 설명해보자면

 

1. [사용자 입력] 사용자가 검색어 입력 및 원하는 테마를 선택한다.

2. [데이터 전처리1] 사용자의 입력값을 분석하여 키워드를 뽑아낸다.

3. [데이터 전처리2] 키워드와 테마에 해당하는 라벨링된 데이터를 스크립트에 추가한다.

4. [ChatGPT 입력] 원하는 리턴 값(응답 양식, 주소, 명칭, 설명 등등)과 스크립트를 ChatGPT API로 전송한다.

5. [ChatGPT 출력] 리턴 값을 전처리하여(텍스트와 지도정보를 구분 짓는다) 텍스트와 지도 핀 객체를 생성한다. (이때 오류를 최소화해야한다)

6. [사용자 출력] 레이아웃에 맞게 사용자에게 출력한다.

 

이렇게 간단하게 설명할 수 있다.

 

큐어팜에도 AI기능이 추가되었다.

사용자의 설문에 따라 치료 솔루션을 제공하는 것이다.

솔루션 제공 AI를 구현하기 위한 개발 Flow는 다음과 같다.

 

1. [사용자입력] 사용자가 설문 진행 및 원하는 심리치료 서비스 선택을 진행한다.

2. [데이터전처리1] 설문 질문 및 대답(수치화)을 그대로 스크립트화 한다.

3. [데이터전처리2] 사용자가 원하는 심리치료 카테고리에 해당하는 라벨링된 서비스 데이터를 스크립트에 추가한다.

4. [ChatGPT 입력] 원하는 리턴 값(응답 양식, 서비스명, 설명)과 스크립트를 Chat GPT로 전송한다.

5. [ChatGPT 출력] 리턴 값을 전처리하여(설문결과와 서비스 추천을 구분 짓는다) 설문결과지와 서비스 추천란 객체를 생성한다.

6. [사용자 출력] 레이아웃에 맞게 사용자에게 출력한다.

 

이제 본격적으로 구현방법을 정리해보겠다.

 

1. ChatGPT API 키를 발급받는다. 실무에 사용하는 사람이라면 서버에 Key 값을 저장해놔야한다.

API 키 발급 사이트

 

OpenAI API

An API for accessing new AI models developed by OpenAI

platform.openai.com

우선 위 사이트에서 자신만의 api key를 발급받자, 주의해야할 점은 처음에 한번만 key를 복사해올 수 있다는 점이다.

 

2. 프롬프트 입력 및 API 통신

- 프롬프트에 입력할 값을 각 앱의 목적에 맞게 스크립트화해야한다.

설정

http 패키지가 필요하므로, 먼저 pubspec.yaml파일에 http 패키지를 추가해 주어야 한다.

프로젝트 코드

OpenAI API에 요청을 보내고 응답을 처리하는 코드

Future generateResponse(String input) async {
  String token = "Bearer 네이티브 앱 키";

  var response = await http.post(
      Uri.parse(
          "https://api.openai.com/v1/engines/text-davinci-003/completions"),
      headers: {
        "Content-Type": "application/json",
        "Authorization": token,
      },
      body: jsonEncode({
        "prompt": input,
        "temperature": 0.5,
        "max_tokens": 50,
        "top_p": 1,
        "frequency_penalty": 0,
        "presence_penalty": 0
      }));
  if (response.statusCode == 200) {
    Map<string, dynamic=""> data = jsonDecode(utf8.decode(response.bodyBytes));
    String text = data["choices"][0]["text"].toString().trim();
    return text;
  } else {
    throw Exception("Failed to generate response: ${response.statusCode}");
  }
}
</string,>

pub.dev 에 sdk 가 있지만 나는 그 라이브러리를 사용하지 않고 해보려고 한다.
( chat_gpt_sdk / pub.dev <= 라이브러리 사용방법을 볼 수 있음 )

코드 설명

prompt : ChatGPT에게 전달할 사용자 질문을 뜻한다.

temperature : 응답 생성 시 사용되는 온도 값으로, 온도가 높을수록 다양한 응답을 생성한다. 그만큼 불일치한 응답을 생성할 가능성도 높아진다고 한다. (기본값: 0.5)

max_tokens : 생성되는 응답의 최대 길이를 나타낸다. (기본값: 50)

top_p : 응답 생성 시 사용되는 확률 분포의 상위 p%를 사용한다. (기본값: 1)

frequency_penalty : 빈번한 단어나 구문을 생성하는 것을 방지하는데 사용된다. (기본값: 0)

presence_penalty : 특정 키워드를 포함하지 않는 응답을 생성하는 것을 방지하는 데 사용된다. (기본값: 0)

 

이러한 설정들은 본인이 사용하고자 하는 목적에 따라 조절하여 사용하면 될 것 같다!

  • 나는 여기서 401 Error로 인해 계속 익셉션으로 빠졌다.. 왜인가 하면 String token = "Bearer 네이티브 앱 키"; 이부분에서 Bearer을 빼고 나의 네이티브 앱 키만 넣어서 실행시켰다.

3. 리턴 받은 text의 구문을 전처리하여 다시 사용자에게 출력한다.

ex) 아래는 버튼을 누르면 Chatgpt의 답이 출력되는 예제이다.

@override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('GPT-3 Text Generation'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: generateText,
                child: Text('Generate Text'),
              ),
              SizedBox(height: 20),
              Text(_generatedText),
            ],
          ),
        ),
      ),
    );
  }

 

4. 과금 최소화 방법

1. 한글보다는 영문으로 작동할 수 있도록 구현한다.(토큰이 적게 들어감)

2. Stop Sequence를 이용한다.

3. 쿼리 최적화 및 토큰 제한을 한다.

토큰 제한: API 요청 시 최대 토큰 수를 제한하여 비용을 관리한다.
(max_tokens, n, best_of 파라미터를 최적화 한다.)
생성되는 최대 토큰 수는 [ max_tokens * max (n, best_of) ]로 계산되며, n, best_of가 1인 경우(Default) max_tokens 수의 답변을 생성한다.