TIL - 영화 정보앱(3) < AI 연동하기 ( 구글 Gemini ) >
## 해당 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'
},
...
],
}#
나온 결과값 예시는 다음과 같았다.