AI,머신러닝/Generative AI

Gemini API 테스트

깨비아빠0 2023. 12. 27. 01:33
728x90
반응형

2023년 12월 구글 Gemini의 확장된 버전이 공개되었다.

 

Gemini 소개글: https://korea.googleblog.com/2023/12/blog-post_652.html

 

가장 유능하고 범용적인 AI 모델 제미나이(Gemini)를 소개합니다

모든 사람들에게 더욱 유용한 AI를 만듭니다 이 블로그는 구글 The Keyword 블로그( 영문 )에서도 확인하실 수 있습니다. 순다 피차이(Sundar Pichai) 구글 및 알파벳 CEO 기술의 변화는 과학의 발전, 인류

korea.googleblog.com

 

Gemini로 간단하게 프롬프트를 테스트해본 내용과 API 테스트 결과를 정리해둔다.

 

Gemini 테스트

Google AI Studio에서 gemini를 체험할 수 있으며, UI는 ChatGPT와 유사하다.

아래는 "Gemini와 ChatGPT를 비교해줘"라는 질문을 던져본 모습이다.

 

Gemini Pro가 아닌 Gemini 1.0에 대한 답변이 나와서, "Gemini Pro처럼 확장된 버전에 대해서 비교설명해줄래"로 다시 질문해 보았다. ChatGPT 학습에 사용한 파라미터가 1750억 개인데 비해, Gemini Pro는 10억 개의 파라미터를 사용했다는 내용을 볼 수 있었다.

 

Gemini API key 생성

Google AI Studio 화면 좌측의 "Get API key" 페이지에서 API key를 생성할 수 있다.

"Create API key in new project"를 누르면 아래와 같이 생성된 API key를 보여준다.

 

GCP 콘솔을 확인해보면 아래와 같이 새로 생성된 "Generative Language Client" 프로젝트에 Generative Language API가 활성화된 것을 볼 수 있다.

API는 굳이 Google AI Studio를 거치지 않고 GCP 콘솔에서 직접 활성화할 수 있다.

 

Gemini API 테스트 (REST API)

curl을 이용해서 아래와 같이 REST API 버전의 gemini를 테스트할 수 있다.

curl \
  -H 'Content-Type: application/json' \
  -d '{"contents":[{"parts":[{"text":"Write a story about a magic backpack"}]}]}' \
  -X POST https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=YOUR_API_KEY

 

URL 마지막의 YOUR_API_KEY에 생성된 key를 넣고, text 파라미터를 적절히 바꿔서 API 요청을 보내면, 아래와 같이 프롬프트에 대한 응답을 얻게 된다. (아래 스크린샷은 curl 대신 insomnia 툴로 테스트한 화면)

 

Node.js 애플리케이션을 위한 Gemini API 테스트

웹 연동을 위해 Node.js 환경에서 Gemini API를 사용해보았다.

간단하게 테스트해볼 목적으로 웹 프로젝트 대신 노트북 방식을 사용했다. (Node.js Notebooks (REPL) 플러그인 사용)

 

SDK 설치

먼저 API 사용을 위해 SDK를 설치한다.

npm install @google/generative-ai

 

모델 초기화

텍스트 생성과 채팅에 적합한 gemini-pro 모델을 초기화한다.

const { GoogleGenerativeAI } = require("@google/generative-ai");

const genAI = new GoogleGenerativeAI('생성된_API_KEY');
const model = genAI.getGenerativeModel({ model: "gemini-pro"});

 

텍스트 생성 테스트

위에서 REST API로 테스트했던 것과 비슷하게 프롬프트 응답 결과를 받아 보려면, 다음과 같이 generateContent 함수를 사용한다.

async function run() {
  const prompt = "2024년 대한민국 출생률은 어떤 추세를 보일지 예측해줘"

  console.log('processing...');

  const result = await model.generateContent(prompt);
  const response = await result.response;
  const text = response.text();

  console.log(text);
}

run();
processing...
2024년 대한민국 출생률은 여러 가지 요인에 따라 달라질 수 있습니다. 이러한 요인에는 경제 상황, 주택 시장 조건, 출산 정책, 사회 문화적 변화 등이 포함됩니다.

* **경제 상황:** 경제가 호황일 때 사람들은 자녀를 낳을 가능성이 더 높습니다. 이는 그들이 자녀를 부양할 수 있으며 자녀가 성공할 수 있는 미래를 제공할 수 있다고 느끼기 때문입니다. 경기가 침체기에 있을 때는 자녀를 낳을 가능성이 줄어듭니다. 이는 그들이 일자리를 구하기 어려울 것이며 자녀를 부양할 수 없을 것이라고 느끼기 때문입니다.
* **주택 시장 조건:** 주택 시장이 부동산 가격이 저렴하고 대출 금리가 낮을 때 사람들은 집을 사고 가족을 시작할 가능성이 더 높습니다. 주택 시장이 불안정하고 대출 금리가 높을 때는 자녀를 낳을 가능성이 줄어듭니다. 이는 그들이 집을 살 여유가 없으며 가족을 부양할 수 없다고 느끼기 때문입니다.
* **출산 정책:** 정부가 출산을 장려하는 정책을 시행하면 사람들은 자녀를 낳을 가능성이 더 높습니다. 이러한 정책은 재정 지원, 탁아 지원, 근로자 권리 보호 등을 포함할 수 있습니다. 정부가 출산을 억제하는 정책을 시행하면 자녀를 낳을 가능성이 줄어듭니다. 이러한 정책은 가족 구성에 대한 제한, 대량 학살 또는 강제 중절 등을 포함할 수 있습니다.
* **사회 문화적 변화:** 사람들의 가족에 대한 태도가 바뀌면 자녀를 낳을 가능성이 더 높습니다. 예를 들어, 점점 더 많은 사람들이 결혼하지 않고도 자녀를 갖는 것이 허용 가능하다고 생각하고 있습니다. 점점 더 많은 사람들이 자녀를 갖지 않아도 괜찮다고 생각하고 있습니다. 인류의 종말을 고려하기도 하는데, 이러한 태도의 변화는 출생률에 부정적인 영향을 미칠 수 있습니다.

전반적으로, 2024년 대한민국 출생률은 경제 상황, 주택 시장 조건, 출산 정책, 사회 문화적 변화 등 여러 가지 요인에 따라 달라질 수 있습니다. 이러한 요인들이 어떻게 전개될지는 예측하기 어렵지만, 출생률은 앞으로도 계속 감소할 가능성이 높습니다.

2024년 한국의 출생률에 대한 몇 가지 구체적인 예측은 다음과 같습니다.

* 통계청은 2024년 한국의 합계출산율이 0.89명이 될 것으로 예측했습니다. 이는 여성 한 명당 평생 낳을 것으로 예상되는 자녀 수입니다.
* 유엔은 2024년 한국의 합계출산율이 0.92명이 될 것으로 예측했습니다.
* 세계은행은 2024년 한국의 합계출산율이 0.95명이 될 것으로 예측했습니다.

이러한 예측은 모두 한국의 출생률이 계속 감소할 것으로 나타났습니다. 이는 한국의 경제 상황, 주택 시장 조건, 출산 정책, 사회 문화적 변화 등 다양한 요인에 따른 것입니다.

 

multi-turn 대화(채팅) 테스트

챗봇 개발 시 다음과 같이 사용자와 모델의 대화 데이터를 startChat 인자로 넘긴 후 sendMessage 함수를 통해 새로운 응답을 얻을 수 있다.

async function run() {
  const chat = model.startChat({
    history: [
      {
        role: "user",
        parts: "Hello, I have 2 dogs in my house.",
      },
      {
        role: "model",
        parts: "Great to meet you. What would you like to know?",
      },
    ],
    generationConfig: {
      maxOutputTokens: 100,
    },
  });

  const msg = "How many paws are in my house?";

  const result = await chat.sendMessage(msg);
  const response = await result.response;
  const text = response.text();
  console.log(text);
}

run();
If you have two dogs in your house, each dog has four paws. Therefore, there are a total of **eight paws** in your house.

 

응답을 받을 때마다 다음 startChat에 넘길 history를 추가해줘야 하므로, 실제 앱 개발시에는 다음과 같은 식으로 사용하면 된다.

공식 매뉴얼에는 startChat을 사용하면 history를 직접 관리할 필요가 없다고 나오는데, 어떤 걸 말하는건지 찾지 못했다.
const chatHistory: any[] = [];

async function sendMessage(msg: string) {
  const chat = model.startChat({
    history: chatHistory,
    generationConfig: {
      maxOutputTokens: 100,
    },
  });
  
  const result = await chat.sendMessage(msg);
  const response = await result.response;
  const text = response.text();

  chatHistory.push({role: 'user', parts: msg});
  chatHistory.push({role: 'model', parts: text});
  console.log(chatHistory.slice(-2));
}

async function run() {
  await sendMessage('Hello, I have 2 dogs in my house.');
  await sendMessage('How many paws are in my house?');
}

run();
[
  { role: 'user', parts: 'Hello, I have 2 dogs in my house.' },
  {
    role: 'model',
    parts: 'Having two dogs in your house can be a wonderful and rewarding experience. Here are some tips for providing a happy and healthy home for your canine companions:\n' +
      '\n' +
      '1. **Create a Dog-Friendly Environment**:\n' +
      '   - Ensure your house is safe and secure for your dogs.\n' +
      '   - Provide a comfortable and dedicated space for them to rest and sleep.\n' +
      '   - Keep essential items like food, water, and toys easily accessible.\n' +
      '   - Install gates or barriers to prevent access to potentially dangerous'
  }
]
[
  { role: 'user', parts: 'How many paws are in my house?' },
  {
    role: 'model',
    parts: 'If you have 2 dogs in your house, and each dog has 4 paws, then there are a total of **8 paws** in your house.\n' +
      '\n' +
      "Here's a simple calculation:\n" +
      '\n' +
      'Number of dogs = 2\n' +
      'Number of paws per dog = 4\n' +
      '\n' +
      'Total number of paws = Number of dogs × Number of paws per dog\n' +
      'Total number of paws = 2 × 4\n' +
      'Total number of paws = 8\n' +
      '\n' +
      'Therefore, there are 8 paws in your'
  }
]

 

스트리밍 테스트

빠른 상호작용을 위해 모델 응답을 조금씩 스트리밍으로 받을 수 있다.

스트리밍을 위해서는 generateContentStream 또는 sendMessageStream 함수를 사용한다.

이전의 채팅 테스트 코드를 스트리밍 방식으로 바꿔보면 다음과 같다.

const chatHistory: any[] = [];

async function sendMessageStream(msg: string) {
  console.log(`\nuser: ${msg}\n`)

  const chat = model.startChat({
    history: chatHistory,
    generationConfig: {
      maxOutputTokens: 100,
    },
  });
  
  const result = await chat.sendMessageStream(msg);

  let text = '';
  for await (const chunk of result.stream) {
    const chunkText = chunk.text();
    console.log(chunkText);
    text += chunkText;
  }

  chatHistory.push({role: 'user', parts: msg});
  chatHistory.push({role: 'model', parts: text});
}

async function run() {
  await sendMessageStream('Hello, I have 2 dogs in my house.');
  await sendMessageStream('How many paws are in my house?');
}

run();

 

아래와 같이 모델 응답이 점진적으로 출력된다.

애석하게도 앞선 테스트와는 달리 결과가 이상하게 나왔다. (개 두 마리가 16개의 발...)

 

 

 

 

참고: https://ai.google.dev/tutorials/node_quickstart?hl=ko

 

빠른 시작: Node.js 애플리케이션에서 Gemini API 시작하기  |  Google AI for Developers

Node.js와 함께 Gemini API를 사용하여 이미지와 텍스트 프롬프트에서 텍스트를 생성하고 채팅 상호작용을 빌드하는 방법을 알아봅니다.

ai.google.dev

 

반응형

'AI,머신러닝 > Generative AI' 카테고리의 다른 글

DALL-E3 체험  (0) 2023.10.03