Post

LLM 모델 api을 활용하여 텍스트 생성 및 함수 호출

개요

토이프로젝트에서 유저의 체형 정보를 가지고 어울리는 의상을 추천해주는 서비스에 LLM 모델을 활용해보았다.

의상 검색 기능에는 네이버 쇼핑 api를 연동했다.

LLM 모델 비교

가장 유명한 LLM 모델인 ChatGPT, Claude, Gemini 중에 선택하기로 했다.

아무래도 토이프로젝트다 보니 큰 요금이 나가는 것은 원치 않아서 요금을 중점적으로 비교했다.

모델입력캐싱된 입력출력
GPT-5US$1.250/100만 개 토큰US$0.125/100만 개 토큰US$10.000/100만 개 토큰
GPT-5 proUS$15.00/100만 개 토큰-US$120.00/100만 개 토큰
Claude Opus 4.1$15 / MTokWrite : $18.75 / MTok
Read : $1.50 / MTok
$75 / MTok
Claude Sonnet 4.5Prompts ≤ 200K tokens : $3 / MTok
Prompts > 200K tokens : $6 / MTok
≤ 200K tokens :
Write : $3.75 / MTok
Read : $0.30 / MTok
> 200K tokens :
Write : $7.50 / MTok
Read : $0.60 / MTok
Prompts ≤ 200K tokens : $15 / MTok
Prompts > 200K tokens : $22.50 / MTok
Haiku 4.5$1 / MTokWrite : $1.25 / MTok
Read : $0.10 / MTok
$5 / MTok
Gemini 2.5 Pro (무료)$0 / MTok
분당 요청 수 (RPM) : 5
분당 토큰 수 : 125,000
일일 요청 수 : 100
-$0
Gemini 2.5 Flash (무료)$0 / MTok
분당 요청 수 (RPM) : 10
분당 토큰 수 : 250,000명
일일 요청 수 : 250
-$0
Gemini 2.5 Pro$1.25, 프롬프트가 200,000개 이하의 토큰인 경우
$2.50, 프롬프트가 200,000개를 초과하는 토큰인 경우
$0.125, 프롬프트 <= 200,000개 토큰
$0.25, 프롬프트 > 200,000개 토큰
시간당 1,000,000개 토큰당$4.50 (스토리지 가격)
$10.00, 프롬프트 <= 200,000개 토큰
$15.00, 프롬프트 > 200,000개
Gemini 2.5 Flash$0.30 (텍스트 / 이미지 / 동영상)
$1.00 (오디오)
$0.03 (텍스트/이미지/동영상)
$0.1 (오디오)
시간당 토큰 1,000,000개당$1.00 (스토리지 가격)
$2.50

Gemini 2.5 무료 등급으로도 충분히 개발 테스트가 가능할 것 같아 Gemini 2.5 무료 등급으로 결정했다.

이제 Gemini 2.5 Pro와 Gemini 2.5 Flash 모델 중에 어떤 것을 사용할 지 비교해보자.

모델설명
Gemini 2.5 Pro코드, 수학, STEM의 복잡한 문제를 추론할 수 있을 뿐만 아니라 긴 컨텍스트를 사용하여 대규모 데이터 세트, 코드베이스, 문서를 분석할 수 있는 최첨단 사고 모델
Gemini 2.5 Flash최고의 가격 대비 성능을 갖추었으며 다양한 기능을 제공하는 모델 2.5 Flash는 대규모 처리, 짧은 지연 시간, 사고력이 필요한 대량 작업, 에이전트 사용 사례에 가장 적합

내가 개발할 기능에서는 복잡한 추론 작업이 필요하지 않기 때문에 분당/일일 요청 수, 분당 토큰 수가 더 많고 속도가 빠른 Gemini 2.5 Flash 모델로 최종 선택하였다.

참고 사이트

Gemini 2.5 사용하기

Google AI Studio에서 프로젝트 및 API 키를 생성하고,

프로젝트에 패키지를 설치해준다.

1
npm install @google/genai

new GoogleGenAI({})로 ai 객체를 생성한다.

텍스트 출력하기

ai.models.generateContent에 model과 contents를 전달하여 호출하면 출력을 생성할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { GoogleGenAI } from "@google/genai";

// The client gets the API key from the environment variable `GEMINI_API_KEY`.
const ai = new GoogleGenAI({});

async function main() {
  const response = await ai.models.generateContent({
    model: "gemini-2.5-flash",
    contents: "Explain how AI works in a few words", // 프롬프트
  });
  console.log(response.text);
}

main();

구조화된 출력

Gemini는 JSON 또는 enum 값을 구조화된 출력으로 생성할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import { GoogleGenAI, Type } from "@google/genai";

const ai = new GoogleGenAI({});

async function main() {
  const response = await ai.models.generateContent({
    model: "gemini-2.5-flash",
    contents:
      "List a few popular cookie recipes, and include the amounts of ingredients.",
    config: {
      responseMimeType: "application/json",
      responseSchema: {
        type: Type.ARRAY,
        items: {
          type: Type.OBJECT,
          properties: {
            recipeName: {
              type: Type.STRING
            },
            ingredients: {
              type: Type.ARRAY,
              items: {
                type: Type.STRING
              }
            }
          },
          propertyOrdering: ["recipeName", "ingredients"]
        }
      }
    }
  });

  console.log(response.text);
}

main();

// 출력값 :
// [
//   {
//     "recipeName": "Chocolate Chip Cookies",
//     "ingredients": [
//       "1 cup (2 sticks) unsalted butter, softened",
//       "3/4 cup granulated sugar",
//       "3/4 cup packed brown sugar",
//       "1 teaspoon vanilla extract",
//       "2 large eggs",
//       "2 1/4 cups all-purpose flour",
//       "1 teaspoon baking soda",
//       "1 teaspoon salt",
//       "2 cups chocolate chips"
//     ]
//   },
//   ...
// ]

Gemini 2.5를 사용한 사고

2.5 Flash 및 Pro 모델은 품질을 향상하기 위해 기본적으로 ‘사고’가 사용 설정되어 있어 실행하는 데 시간이 더 걸리고 토큰 사용량이 증가할 수 있다.

thinkingBudget 파라미터는 대답을 생성할 때 사용할 사고 토큰 수를 모델에 안내한다.

일반적으로 토큰 수가 많을수록 더 자세한 추론이 가능하므로 복잡한 작업을 처리할 수 있다.

지연 시간이 더 중요한 경우 thinkingBudget을 낮추거나 0으로 설정하여 사고를 사용 중지할 수 있다.

사고를 중지하면 복잡한 추론이나 검증 과정을 거치지 않고 빠르게 출력한다.

thinkingBudget을 -1로 설정하면 동적 사고가 사용 설정된다. 즉, 모델이 요청의 복잡성에 따라 예산을 조정한다.

1
2
3
4
5
6
7
8
9
const response = await ai.models.generateContent({
  model: "gemini-2.5-flash",
  contents: "How does AI work?",
  config: {
    thinkingConfig: {
      thinkingBudget: 0 // Disables thinking
    }
  }
});
모델기본 설정 (사고 예산이 설정되지 않음)범위생각하는 과정 사용 중지동적 사고 사용 설정
Gemini 2.5 Pro동적 사고: 모델이 사고 시점과 사고량을 결정함128~32768생각을 사용 중지할 수 없음thinkingBudget = -1
Gemini 2.5 Flash동적 사고: 모델이 사고 시점과 사고량을 결정함0~24576thinkingBudget = 0thinkingBudget = -1

사실 확인이나 복잡한 추론이 필요하지 않은 간단한 요청은 사고를 중지하는 것이 효율적이고, 복잡한 수학 풀이나 코딩 등에는 사고 토큰을 최대로 사용하는 것이 좋다.

사고를 중지하는 것보다 동적 사고가 유연하게 출력할 것 같아서, 따로 세팅하지 않고 기본 설정(동적 사고)으로 두었다.

참고 사이트

Gemini 생각

This post is licensed under CC BY 4.0 by the author.