## 해당 TIL은 주어진 과제를 수행하면서 얻은 학습 내용과, 시행착오 등등을 종합해서 작성한것임
GitHub - Oz-player/oz_player
Contribute to Oz-player/oz_player development by creating an account on GitHub.
github.com
MUOZ 프로젝트를 진행하면서, 새롭게 생각해야 될게 많았고, 너무 정신이 없던 나머지 TIL 작성을 약간 미루었던거 같다..
TIL 작성할 만한 부분은 꽤 있었는데, 시간에 쫓겨서..
약 2~3주간 프로젝트를 진행하면서 있었던 TIL 부분들을 한번에 우다다다 쏟아내 보고자 한다.
1. Gemini 사용하기
Gemini를 플러터에서 사용하는 방법은 간단하다.
구글에서 제공하는 Google Generative Ai 라이브러리를 사용하면 간단하게 사용할 수 있는데,
해당 방법은 이전 포스팅에서 설명하니 확인하기 바란다.
TIL - 영화 정보앱(3) < AI 연동하기 ( 구글 Gemini ) >
## 해당 TIL은 주어진 과제를 수행하면서 얻은 학습 내용과, 시행착오 등등을 종합해서 작성한것임 1. Google Generative Ai 라이브러리구글에서 제공하는 Gemini API Gemini API 빠른 시작 | Google AI for Dev
hamiric.tistory.com
2. 프롬프트 작성법과 고도화
LLM 을 사용하는데 있어 가장 중요한 것은, 원하는 결과를 얻기 위한 프롬프트 작성이라고 할 수 있다.
이번 프로젝트에서 원하는 결과값은 어떠한 조건(상황)에서 추천하는 음악을 추천받는 것이다.
초기 프롬프트는 다음과 같았다.
아래 조건에 맞는 실제로 존재하는 노래를 최대 $num곡 정도 추천해줘.
1. 지금 나의 기분은 '$moodtext'
2. 지금 내가 하고 있는것은 '$situationtext'
3. 추천 받고 싶은 노래의 장르는 '$genretext'
4. 선호하는 아티스트는 '$artisttext'
5. 조건에 맞는 곡만 최대 $num곡까지 추천할 것.
답변은 오직 JSON 형식으로만 작성해 줘.
답변 예시는 다음과 같아
{
musicName : '노래제목',
artist : '가수이름',
}
정말 필요한 조건만 적어놓은 느낌이다.
그러나 결과값은 그다지 좋지 못했었는데,
{
"musicName": "사랑은 늘 도망가",
"artist": "임영웅"
}
이렇게 정상적인 출력이 나오다가도,
{
"musicName": "나의 모든 날",
"artist": "태연"
}
이렇게 존재하지 않는 곡 이름을 내 뱉을 때가 있었다.
이런 할루시네이션 현상이 꽤나 자주 발생하는 모습이었고, 이를 해결하기 위해서 여러가지 시도를 하게 되었다.
최종적으로 고친 프롬프트는 다음과 같다.
아래 조건에 맞는 실제로 존재하는 노래를 최대 $num곡 정도 추천해줘.
1. 지금 나의 기분은 '$moodtext'
2. 지금 내가 하고 있는것은 '$situationtext'
3. 추천 받고 싶은 노래의 장르는 '$genretext'
4. 선호하는 아티스트는 '$artisttext'
5. Spotify나 ManiaDB에 등록되어 있는, 반드시 존재하는 노래만 추천해야 함.
6. 조건에 맞는 곡만 최대 $num곡까지 추천할 것.
7. 한국곡 추천을 우선으로 하되, 전 세계 다양한 나라의 곡들도 추천될 수 있도록 할 것.
8. 다음곡들은 추천에서 제외할것
$except
응답값은 다음 조건에 맞아야 함
1. musicName값은 '가수 - 노래제목' 으로 출력되어야 하며, 괄호가 없어야함
2. 노래 제목 또는 가수 이름에 괄호가 포함된 경우, 괄호와 그 안의 내용은 제거해야 함.
3. 어떠한 경우라도, 응답은 ***JSON*** 형태의 데이터만 있어야 하며, 응답형식은 반드시 ***JSON***으로 출력되어야 함
응답 형식:
[
{
"musicName": "가수 - 노래제목"
}
]
이렇게 프롬프트를 수정하면서 알게된 점이 있는데
첫번째로 결과값을 하나의 문장에서 처리할 수 있도록 하는것이 보다 정확한 결과값을 출력하게 하는데 도움이 된다는 것이다.
이전 프롬프트는
'musicName'과 'artist'를 각각 다른 문장으로 출력하게끔 되어 있었는데, 이를 하나의 문장으로 처리하도록 바꾸었더니 할루시네이션 현상이 유의미 하게 줄어든 모습을 확인할 수 있었다.
또한
이러한 데이터 셋에서 어떠한 값을 출력해야 할 경우, 예시가 되는 DB 이름이라던가를 확실히 명시했을때 결과값이 보다 정확히 나오는 것을 알 수 있었는데,
'Spotify나 ManiaDB에 등록되어 있는' 이라는 문구가 나름대로 효과적이었다.
그리고 할루시네이션을 방지하는 가장 좋은 방법은, 역시나 최신 LLM 모델 또는 상위의 모델을 사용하는 것이었다.
gemini-1.5-flash에서 좀더 전문적이고 무거운 gemini-1.5-pro 로 모델을 바꾸었더니, 할루시네이션 현상이 확연히 줄어든 모습을 확인할 수 있었다. (물론 로딩 시간과 money 의 압박이 늘어나긴 하더라..)
##
추가적으로 프롬프트 작성이후 알게된 사실중 하나인데..
지금 현재 프롬프트처럼 결과값에 'JSON 형식으로 출력해줘' 라고 프롬프트에 명시하고 출력하게 했었는데..
알아보니,
GenerationConfig 의 responseMimeType 옵션을 사용하면 결과값을 JSON 형식으로 던져주게끔 설정할 수 있다고 한다는 것을 알았다.
final generationConfig = GenerationConfig(
responseMimeType: 'application/json'
);
final model = GenerativeModel(
model: 'gemini-1.5-pro',
apiKey: apiKey,
generationConfig: generationConfig,
);
이 포스팅을 보게되신 분들은 나처럼 프롬프트에 'JSON 형식으로 출력해줘' 같은 걸로 토큰 낭비하지 말고,
해당 설정을 이용해서 보다 간편하게 사용할 수 있도록 하자..
'TIL' 카테고리의 다른 글
TIL - MUOZ (5) (Sentry) (0) | 2025.02.11 |
---|---|
TIL - MUOZ (4) (Riverpod의 다양한 Notifier 사용법) (0) | 2025.02.10 |
TIL - MUOZ (2) (오디오 플레이어 UI) (0) | 2025.02.08 |
TIL - MUOZ (1) (오디오 플레이어 - Just Audio) (0) | 2025.02.07 |
TIL - ERROR: R8: Missing class org.tensorflow.lite.gpu.GpuDelegateFactory$Options (Flutter) (0) | 2025.01.14 |