TIL

TIL - 영화 정보앱(3) < AI 연동하기 ( 구글 Gemini ) >

hamiric 2024. 12. 30. 10:36

## 해당 TIL은 주어진 과제를 수행하면서 얻은 학습 내용과, 시행착오 등등을 종합해서 작성한것임

 

1. Google Generative Ai 라이브러리

구글에서 제공하는 Gemini API

 

Gemini API 빠른 시작  |  Google AI for Developers

개발자를 위한 Gemini API 시작하기

ai.google.dev

 

해당 API를 사용하기 위해서는, API Key를 발급받아야 하며, 해당 링크에서 간편하게 받을 수 있다.

 

로그인 - Google 계정

이메일 또는 휴대전화

accounts.google.com

 

Flutter SDK 용 라이브러리는 Google_Generative_Ai 라이브러리를 통해, 간편하게 Gemini API를 사용할 수 있다.

 

google_generative_ai | Dart package

The Google AI Dart SDK enables developers to use Google's state-of-the-art generative AI models (like Gemini).

pub.dev

 

사용법

  • 라이브러리 설치
// Terminal
flutter pub add google_generative_ai

 

  • 모델 사용하기

문서에서 제공하는, 일반적인 사용법은 다음과 같다.

이번 프로젝트에서 사용할 Gemini 기능은 텍스트 생성이기 때문에 텍스트 생성 기능 사용법만 설명한다.

// 텍스트 전용 입력에서 텍스트 생성
import 'dart:io';

import 'package:google_generative_ai/google_generative_ai.dart';

void main() async {
  // Access your API key as an environment variable (see "Set up your API key" above)
  final apiKey = Platform.environment['API_KEY'];
  if (apiKey == null) {
    print('No \$API_KEY environment variable');
    exit(1);
  }
  // The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
  final model = GenerativeModel(model: 'gemini-1.5-flash', apiKey: apiKey);
  final content = [Content.text('Write a story about a magic backpack.')];
  final response = await model.generateContent(content);
  print(response.text);
}

 

또한 모델 매개변수를 설정하여 모델의 설정값을 지정해 줄 수 있다.

// 모델 매개변수 구성
final generationConfig = GenerationConfig(
  stopSequences: ["red"],  // 텍스트 생성을 중지할 특정 단어나 패턴을 설정하는 옵션
  maxOutputTokens: 200,    // 생성되는 텍스트의 최대 길이를 설정하는 옵션
  temperature: 0.9,        // 창의성 및 예측 가능성을 조절하는 옵션 (1이 가까울수록 창의적)
  topP: 0.1,               // 텍스트를 생성할 때 확률 분포에서 상위 p 확률을 가진 단어들만을 고려하여 생성
  topK: 16,                // 생성할 때 가장 높은 확률을 가진 k개의 후보 단어만을 고려하여 다음 단어를 선택
);
final model = GenerativeModel(
  // The Gemini 1.5 models are versatile and work with most use cases
  model: 'gemini-1.5-flash',
  apiKey: apiKey,
  generationConfig: generationConfig,
);

 

 

프롬프트 설정법

원하는 답변을 얻기 위해서는, 프롬프트를 보다 세세하게 다듬을 필요가 있다.

다음은 프롬프트를 작성하기위한 Tip은 다음과 같다.

 

  • 목적과 기대 결과 명시

"무엇을 알고 싶은지", "형식은 어떤지", "제약 조건은 무엇인지"를 명확히 서술한다.

입력된 태그와 관련된 실제 영화 5개를 추천해줘. 영화 제목은 영어로, 이유는 200자 이내의 한글로 작성해.

 

  • 구조화된 응답 요청

원하는 결과를 정해진 형식으로 명시하면, 답변이 일관되고 가공하기 쉬워진다.

답변은 JSON 형식으로 답변해줘. 형식은 아래와 같아.
{
  "recommend_movie": [
    {
      "title": "영화 제목",
      "reason": "추천 이유"
    }
  ]
}

 

  • 제약 조건과 기준 추가

필요한 제한사항을 추가하면 답변이 더 적합해진다.

추천된 영화는 TMDB에서 검색 가능한 실제 영화여야 하며, 최신작을 우선으로 추천해.

 

  • 예시 제공

원하는 답변의 예시를 보여주면, 생성 모델이 이해하기 훨씬 쉽다.

답변 예시는 다음과 같아.
{
  recommend_movie: [
    {
      title: '추천영화1',
      reason: '추천하는 이유1'
    },
    {
      title: '추천영화2',
      reason: '추천하는 이유2'
    },
    ...
  ],
}

 

  • 불필요한 내용을 배제

원하지 않는 답변 유형을 명시적으로 배제한다.

가상의 영화 제목은 포함하지 말아줘.
답변은 오직 JSON 형식으로만 작성해.

 

  • 가이드라인 강조

"반드시", "오직", "필수적으로" 같은 표현으로 가이드라인을 강조하면, 생성모델이 보다 명확히 요구사항을 파악할 수 있다.

모든 추천 영화는 반드시 TMDB API에서 검색 가능해야 하며, 제목은 영어만 사용해.

 

 

결과

해당 팁들을 사용하고, 여러번 조정한 결과, 프로젝트에 사용하게된 프롬프트는 다음과 같다.

[ $content 는 태그값이 들어올 매개변수 ]

다음 태그에 해당되는 실제 존재하는 영화 5개를 추천해줘.

추천영화들은 반드시 아래의 조건을 만족해야해.
1. 실제 개봉된 영화여야 하며, 가상의 영화나 임의로 만들어낸 제목은 포함되지 않아야 함.
2. 추천은 **TMDB API**와 같은 신뢰할 수 있는 영화 데이터베이스를 기반으로 판단한 결과여야 하며, 추천된 영화의 제목은 반드시 **TMDB API에서 검색할 수 있는 실제 제목**이어야 함.
3. 태그가 영화와 명확히 관련되지 않거나, 의미 없는 문자열일 경우 해당 태그를 무시.
4. 입력된 태그가 없거나 입력된 모든 태그가 무효화된 경우, 영화 장르나 테마에 구애받지 않고 신뢰할 수 있는 데이터베이스를 기반으로 영화를 추천해야 함.
5. 가능하면 최신 영화를 우선적으로 추천하며, 태그와 관련된 영화가 최신작 중에서 존재하지 않을 경우에만 오래된 영화를 추천할 수 있음.
6. 입력된 태그가 너무 많을 경우, 모든 태그를 만족할 필요는 없음.

추천 영화들은 반드시 아래의 태그를 포함해야 해:
$content

**답변은 오직 JSON 형식으로만 작성해 줘.**
`title` 값은 연도가 포함되지 않은 영어 제목만, `reason` 값은 한글로 작성해줘. 
`reason`은 해당 영화를 추천하는 이유를 200자 이내로 서술하며, 마지막에 반드시 "~이기 때문에 추천합니다."로 끝내줘.

예시는 다음과 같아. 분리하기 쉽게 {} 양끝에 #을 붙여줘
#{
  recommend_movie: [
    {
      title: '추천영화1',
      reason: '추천하는 이유1'
    },
    {
      title: '추천영화2',
      reason: '추천하는 이유2'
    },
    ...
  ],
}#

 

나온 결과값 예시는 다음과 같았다.