🔥알림🔥
① 테디노트 유튜브 - 구경하러 가기!
② LangChain 한국어 튜토리얼 바로가기 👀
③ 랭체인 노트 무료 전자책(wikidocs) 바로가기 🙌

19 분 소요

Google의 Gemini API로 임베딩을 생성하고 문서 검색하는 방법을 다룹니다.

Reference

본 튜토리얼은 Google Gemini Pro API 도큐먼트 문서를 참조하여 작성하였습니다.

  • 본 문서의 원 저작권자는 2023 Google LLC. 이며, 코드는 Apache License, Version 2.0 에 따라 사용이 허가된 파일입니다. 라이센스는 하단에 고지하였습니다.
  • 원문 바로가기

실습파일


요약

  • 📘 Google Gemini Pro API를 기반으로 한 문서 검색 튜토리얼
  • 🔑 원 저작권자 Google LLC의 공식 문서 참조
  • 📜 Apache License 2.0에 따른 사용 권한
  • 🚀 임베딩 기술로 Google Car 관련 문서 검색 방법 탐구
  • 🐍 Python과 Jupyter 환경에서의 실행 가이드
  • 🛠️ 필수 라이브러리 설치 및 API 키 설정 방법
  • 🧠 임베딩 모델 선택 및 사용법 상세 안내
  • 📊 데이터베이스 구축과 Q&A 시스템 구현 방법
  • 💡 질문과 답변 응용 프로그램 예시 제공

개요

이 예제는 Gemini API를 사용하여 임베딩을 생성하고 문서 검색을 수행하는 방법을 보여줍니다. Python 클라이언트 라이브러리를 사용하여 검색 문자열 또는 질문과 문서 내용을 비교할 수 있는 단어 임베딩을 구축합니다.

이 튜토리얼에서는 Google Car와 관련된 질문을 하기 위해 일련의 문서에 대해 문서 검색을 수행하는 데 임베딩을 사용합니다.

필수 조건

이 퀵스타트는 Google Colab에서 실행할 수 있습니다.

자체 개발 환경에서 이 퀵스타트를 완료하려면 다음 요구 사항을 충족해야 합니다:

  • Python 3.9 이상

  • 노트북을 실행하기 위한 jupyter 설치.

설정

먼저, Gemini API Python 라이브러리를 다운로드하고 설치하세요.

  • !pip install: pip 패키지 관리자를 사용하여 Python 패키지를 설치하는 명령어입니다.

  • -U: 이미 설치된 패키지가 있다면 최신 버전으로 업그레이드하는 옵션입니다.

  • -q: 명령어 실행 시 로그를 최소화하여 출력하는 ‘quiet’ 모드 옵션입니다.

  • google.generativeai: Google에서 제공하는 생성적 인공지능 관련 라이브러리입니다. 이 라이브러리를 설치함으로써 사용자는 Google의 생성적 AI 기능을 활용할 수 있습니다.

!pip install -U -q google.generativeai
# 위 코드는 Python의 패키지 관리 시스템인 pip을 사용하여 google.generativeai 라이브러리를 설치하는 명령어입니다.
# '-U' 옵션은 이미 설치된 패키지가 있을 경우 최신 버전으로 업그레이드합니다.
# '-q' 옵션은 명령어 실행 시 로그를 최소화하여 출력합니다.
  • textwrap 모듈은 긴 문자열을 주어진 너비에 맞게 여러 줄로 나누어 표시할 때 사용됩니다.

  • numpy는 수치 계산을 위한 다차원 배열 객체와 배열 조작을 위한 다양한 함수를 제공합니다.

  • pandas는 데이터 조작 및 분석을 위한 고수준의 자료 구조와 데이터 분석 도구를 제공합니다.

  • google.generativeaigoogle.ai.generativelanguage는 Google이 제공하는 생성적 AI 및 언어 모델 관련 기능을 사용할 수 있게 해주는 라이브러리입니다.

  • google.colab.userdata는 Google Colab 환경에서 사용자의 API 키와 같은 민감한 정보를 안전하게 저장할 수 있도록 도와줍니다.

  • IPython.display.Markdown을 사용하면 IPython 환경(주로 Jupyter Notebook이나 Google Colab)에서 Markdown 형식의 텍스트를 표시할 수 있습니다.

# 텍스트를 특정 너비로 감싸는 데 사용되는 라이브러리를 가져옵니다.
import textwrap

# 과학 계산을 위한 라이브러리인 numpy를 가져옵니다.
import numpy as np

# 데이터 분석을 위한 라이브러리인 pandas를 가져옵니다.
import pandas as pd

# Google의 생성적 AI 모듈을 가져옵니다.
import google.generativeai as genai

# Google의 생성적 언어 모델을 가져옵니다.
import google.ai.generativelanguage as glm

# IPython 환경에서 Markdown 형식의 텍스트를 표시하기 위한 모듈을 가져옵니다.
from IPython.display import Markdown

API 키 받기

Gemini API를 사용하기 전에 먼저 API 키를 받아야 합니다. 아직 없다면, Google AI Studio에서 한 번의 클릭으로 키를 생성하세요.

API 키 받기

Colab에서, 왼쪽 패널의 ‘API_KEY’라는 이름으로 비밀 관리자에 키를 추가하세요.

API 키를 받은 후에는 SDK에 전달해야 합니다. 이는 두 가지 방법으로 할 수 있습니다:

  • 키를 GOOGLE_API_KEY 환경 변수에 넣으세요(SDK가 자동으로 거기서 가져옵니다).

  • genai.configure(api_key=...)에 키를 전달하세요.

  • userdata.get('API_KEY'): userdata 딕셔너리에서 ‘API_KEY’에 해당하는 값을 가져옵니다. 만약 ‘API_KEY’가 존재하지 않으면 None을 반환합니다.

  • genai.configure(api_key=API_KEY): genai 라이브러리를 사용하기 위해 API 키를 설정하는 부분입니다. 이 코드는 genai 라이브러리의 기능을 사용하기 전에 필수적으로 호출되어야 합니다.

# API 키를 환경변수에서 가져오거나, userdata 딕셔너리에서 'API_KEY' 키로 직접 가져옵니다.
API_KEY = "이곳에 API 키를 입력하세요."

# genai 라이브러리를 구성하기 위해 API 키를 설정합니다.
genai.configure(api_key=API_KEY)

핵심 포인트

다음으로, 모델을 선택하게 됩니다. 이 튜토리얼에는 어떤 임베딩 모델도 사용할 수 있지만, 실제 애플리케이션에서는 특정 모델을 선택하고 그것을 고수하는 것이 중요합니다. 서로 다른 모델들의 출력은 호환되지 않습니다.

참고: 현재 Gemini API는 특정 지역에서만 사용 가능합니다.

  • genai.list_models(): genai 라이브러리에서 제공하는 모델 목록을 가져오는 함수입니다.

  • for m in genai.list_models(): 가져온 모델 목록을 순회하는 반복문입니다.

  • if 'embedContent' in m.supported_generation_methods: 모델이 ‘embedContent’라는 콘텐츠 임베딩 기능을 지원하는지 확인합니다.

  • print(m.name): 조건을 만족하는 모델의 이름을 출력합니다.

# genai 라이브러리의 list_models 함수를 사용하여 사용 가능한 모델들의 목록을 가져옵니다.
for m in genai.list_models():
    # 각 모델의 supported_generation_methods 속성 중 'embedContent' 메소드를 지원하는지 확인합니다.
    if "embedContent" in m.supported_generation_methods:
        # 'embedContent' 메소드를 지원하는 모델의 이름을 출력합니다.
        print(m.name)
models/embedding-001

임베딩 생성

이 섹션에서는 Gemini API의 임베딩을 사용하여 텍스트 조각에 대한 임베딩을 생성하는 방법을 살펴보겠습니다.

임베딩 모델 embedding-001의 API 변경 사항

새로운 임베딩 모델인 embedding-001에는 새로운 작업 유형 매개변수가 있으며, 선택적 제목이 있습니다(작업 유형=RETRIEVAL_DOCUMENT일 때만 유효).

이러한 새로운 매개변수는 가장 최신의 임베딩 모델에만 적용됩니다. 작업 유형은 다음과 같습니다:

작업 유형 설명
RETRIEVAL_QUERY 주어진 텍스트가 검색/검색 설정에서 쿼리임을 지정합니다.
RETRIEVAL_DOCUMENT 주어진 텍스트가 검색/검색 설정에서 문서임을 지정합니다.
SEMANTIC_SIMILARITY 주어진 텍스트가 의미론적 텍스트 유사성(STS)에 사용될 것임을 지정합니다.
CLASSIFICATION 임베딩이 분류에 사용될 것임을 지정합니다.
CLUSTERING 임베딩이 클러스터링에 사용될 것임을 지정합니다.

참고: RETRIEVAL_DOCUMENT에 대한 제목을 지정하면 검색을 위한 더 나은 품질의 임베딩을 제공합니다.

  • title 변수에는 AI와 Google Workspace에 대한 개발자용 다음 세대 AI에 관한 제목이 저장됩니다.

  • sample_text 변수에는 제목과 함께 전체 기사 내용이 저장됩니다. 이 텍스트는 임베딩 생성에 사용됩니다.

  • model 변수에는 임베딩을 생성할 때 사용할 모델의 이름이 저장됩니다.

  • genai.embed_content 함수는 주어진 콘텐츠에 대한 임베딩을 생성하는 데 사용됩니다. 이 함수는 모델 이름, 콘텐츠, 작업 유형, 제목을 매개변수로 받습니다.

  • task_type="retrieval_document"는 생성된 임베딩이 문서 검색 작업에 사용될 것임을 나타냅니다.

  • 생성된 임베딩은 print 함수를 통해 출력됩니다.

# 제목을 문자열로 선언합니다.
title = "The next generation of AI for developers and Google Workspace"
# 샘플 텍스트를 문자열로 선언합니다. 여기에는 제목과 본문이 포함되어 있습니다.
sample_text = (
    "Title: The next generation of AI for developers and Google Workspace"
    "\n"
    "Full article:\n"
    "\n"
    "Gemini API & Google AI Studio: An approachable way to explore and prototype with generative AI applications"
)

# 사용할 모델의 이름을 문자열로 선언합니다.
model = "models/embedding-001"
# genai.embed_content 함수를 사용하여 콘텐츠의 임베딩을 생성합니다.
# 이 함수는 모델, 콘텐츠, 작업 유형, 제목을 인자로 받습니다.
embedding = genai.embed_content(
    model=model, content=sample_text, task_type="retrieval_document", title=title
)

# 생성된 임베딩을 출력합니다.
print(embedding)
{'embedding': [0.03411343, -0.05517662, -0.020209055, -0.0041249567, 0.058917783, 0.014129515, 0.0045353593, 0.0014303668, 0.05976634, 0.08292115, 0.007162964, 0.0069041685, -0.053083427, -0.010905125, 0.0321402, -0.037163995, 0.050372455, 0.019348344, -0.037328612, 0.026647927, 0.030781753, -0.011288501, -0.031485256, -0.060248993, -0.026219442, -0.009794235, 0.006630139, -0.01846516, -0.026324715, 0.020442624, -0.06317684, 0.014559574, -0.052296035, 0.016451128, -9.720217e-05, -0.051706687, -0.0054406044, -0.056967627, 0.011144145, -0.009201792, -0.0021951047, -0.1099701, -0.011712193, 0.021221714, 0.009171804, -0.029621972, 0.034534883, 0.039578073, 0.019021519, -0.06269169, 0.039473332, 0.052403256, 0.061814185, -0.034507945, -0.009557816, -0.0049551064, 0.017839009, -0.021176832, 0.015043588, 0.015390569, -0.006334281, 0.043696404, -0.028341983, 0.028433999, 0.01472686, -0.06585564, -0.044533554, 0.0055523133, 0.035775978, 0.031099156, 0.027357662, 0.028062241, 0.056972917, -0.054656833, -0.027864764, -0.15486294, -0.027930057, 0.043678433, 0.008391214, 0.020209847, 0.002841071, -0.07201404, -0.05025868, -0.034896467, -0.030400582, 0.016623711, -0.050455835, -0.025557702, 0.0050540236, 0.032266915, -0.018223321, -0.04913693, 0.07667526, -0.03066128, -0.0127946865, 0.107169494, -0.0563475, -0.016773727, -0.010336115, -0.05220995, -0.022049127, 0.00478732, -0.039094422, 0.015671168, 0.041542538, 0.016112784, -0.022650082, 0.002988097, -0.061147556, 0.06630078, -0.057244215, -0.013767544, -0.003466806, -0.053994596, 0.04230463, -0.029314812, 0.021347178, 0.04522084, 0.0072983643, 0.0247336, 0.020755325, 0.025620919, 0.021721177, 0.008178421, -0.063603185, 0.025854606, -0.037521806, 0.020877894, 0.033131972, 0.030288944, 0.0033810628, -0.048698667, -0.027295412, 0.05622969, 0.029634966, 0.029705161, 0.010602056, -0.02217137, 0.03195607, 0.047208548, -0.013620148, 0.038463745, 0.0052672145, -0.024868716, -0.0071725682, 0.069668904, -0.092124775, 0.014151632, 0.0057337824, -0.006012909, -0.035946254, 0.0334855, -0.07426327, 0.033595767, 0.033740804, 0.0394573, -0.048899952, 0.06265119, 0.0028897377, 0.0039847936, 0.0329678, -0.012809373, 0.050108086, 0.009314281, -0.019499086, -0.048860364, -0.015204039, 0.008016007, 0.015667893, 0.03903864, 0.011732032, 0.034669068, -0.01226258, -0.052623957, 0.006695629, -0.05849198, 0.00101155, -0.009621011, -0.0052014636, -0.020959012, -0.02466722, -0.03861565, 0.049754824, 0.048655674, 0.0044479654, -0.020404046, 0.101043485, -0.022594253, -0.06822699, 0.044780556, -0.03859346, -0.015194885, -0.0059435116, -0.016267126, 0.0012126336, 0.054198146, 0.01978253, 0.02905382, 0.034172967, -0.0032252679, 0.020003818, 0.07212547, 0.035888623, -0.00029856138, 0.0044168616, 0.036989234, 0.100975856, 0.0048228516, -0.04405796, 0.00039434276, -0.044601627, -0.011658614, 0.03398768, 0.02250937, 0.034583274, -0.03440395, -0.003274625, -0.005927225, -0.007679341, -0.025777208, -0.02205426, 0.00823437, -0.027172998, -0.015607741, -0.022958823, 0.098416075, -0.045472592, 0.031623535, 0.030663209, -0.03987397, 0.0048750523, 0.057770126, 0.04547866, 0.009881574, 0.044948515, 0.012011639, 0.003141497, 0.0016209317, 0.07142094, 0.025111957, -0.049478546, 0.052195616, 0.041401174, 0.0380032, -0.05878786, -0.007194873, -0.015402912, 0.048243146, 0.025205499, 0.051020827, -0.030305905, -0.031656887, -0.008994425, 0.039839912, -0.043015696, 0.008373317, -0.089018084, -0.045301914, -0.0074205245, 0.0049243467, 0.060365975, -0.06462967, 0.00815101, -0.020417998, 0.00030822973, -0.039288856, 0.04017253, 0.03137731, -0.031728875, 0.03444872, -0.031234143, -0.048502136, 0.033941768, 0.034225147, -0.008299359, 0.033098515, -0.012317135, 0.014448822, 0.06187389, -0.059683096, 0.0012899865, 0.007460227, 0.02652167, -0.07248658, -0.05818953, 0.030052334, -0.015347992, -0.035913672, -0.034901086, -0.0661791, -0.055562418, 0.0130468095, -0.0035763406, -0.0086615095, -0.046888705, -0.005326655, -0.021710252, 0.072175056, 0.038597208, -0.038364347, -0.005039459, -0.07634857, -0.045539834, -0.07372115, 0.018378831, -0.032071035, -0.030269828, -0.044599615, 0.05132602, 0.04769642, 0.0014855171, -0.028435005, -0.0016777773, 0.0072506564, 0.08448479, 0.04224268, -0.029304115, 0.02165559, 0.0056837583, 0.06214723, 0.0028552667, 0.015904495, -0.016737062, -0.0040876116, -0.037475582, 0.04675168, -0.052556172, -0.016293239, -0.014435561, 0.022127734, -0.0052535324, 0.0190588, -0.011537659, 0.0484614, 0.028816467, 0.024607794, -0.043762755, 0.011608192, 0.0021703655, -0.045297306, -0.0048169023, -0.0071430723, 0.011705694, -0.05006429, 0.029933244, -0.020802287, -0.07580785, -0.012268235, 0.07616304, 0.006857885, 0.01853518, 0.043729052, -0.032221675, -0.010121849, -0.019831154, -0.032731093, 0.051531196, 0.0024111927, 0.090960525, -0.036896333, 0.035708647, 0.03678696, 0.00832481, 0.001757778, 0.04144341, 0.042203393, 0.0045936033, 0.021837635, 0.0066275136, 0.0069022025, -0.008452904, -0.03277543, 0.0061044246, -0.02500629, 0.012441071, 0.018081166, -0.06230864, -0.040046707, -0.019351328, 0.0007255696, 0.002202931, -0.041990966, 0.023313772, 0.039377946, -0.0012839311, 0.010378518, 0.0025737497, 0.043841247, -0.0067742136, 0.045794934, 0.01388272, 0.032243907, 0.0919292, 0.03760722, 0.0060486114, 0.010843367, 0.001991803, -0.04838942, -0.006412631, -0.030764624, -0.015602797, -0.048885867, -0.015245706, -0.0006477355, 0.013608845, 0.0040335134, -0.0015530499, -0.008402027, -0.05728556, -0.027370622, 0.019342335, -0.039145477, 0.049000833, -0.052876346, -0.060248777, 0.009484413, 0.011271402, -0.0019944878, -0.013369263, -0.0130786, 0.0050903647, -0.0003995775, 0.04580157, -0.030488051, -0.07777237, 0.022998745, -0.007693635, -0.013473893, 0.0071830116, 0.014312745, 0.019949466, 0.034036275, -0.0011623668, 0.022655929, -0.0049825236, -0.036455333, 0.0033899196, 0.020583669, -0.010457001, 0.027299065, 0.034606297, -0.0111719165, -0.013660416, -0.02705466, -0.05144293, -0.07396907, -0.022817062, -0.0064836126, 0.037774086, -0.06774259, 0.016620712, -0.046481006, -0.030288063, -0.055035893, -0.015402408, -0.014477583, 0.0024700973, 0.024081903, -0.008900536, -0.0032105052, 0.026591286, -0.027869076, -0.014552753, -0.026460772, 0.06831125, -0.019622969, -0.028588912, -0.02271201, 0.0019694276, 0.0079966, -0.013207389, -0.07246265, -0.005246626, -0.03556684, 0.014131167, 0.0018361827, -0.084728725, 0.010380415, -0.038140625, 0.0066234693, -0.023485202, 0.05133969, 0.018931301, -0.0077241925, -0.01968148, -0.0615474, 0.036711216, 0.028462604, -0.02205502, 0.02294784, 0.03529192, 0.044653304, -0.029656367, -0.04243813, -0.024271922, 0.008206945, -0.015324323, 0.028326686, 0.0708875, 0.03499979, -0.04111004, -0.02691298, -0.011054021, 0.035632536, 0.057256706, -0.058149684, 0.022313014, -0.03727344, 0.0095027555, -0.0325091, -0.007395906, 0.009455788, 0.0053972304, -0.028935568, 0.054196633, -0.051867362, -0.010642803, 0.034427024, 0.04308132, 0.020671992, 0.068610825, 0.018303277, -0.08433639, 0.0023544622, -0.009237108, -0.0410166, 0.012912618, -0.035220295, 0.032994937, -0.0063333404, -0.028377546, 0.05429965, -0.022590995, -0.033762764, -0.0061482205, 0.0014308131, 0.05402618, -0.030298075, -0.020893354, 0.04020406, -0.013849863, -0.047842298, 0.032006662, 0.037729368, -0.02878951, 0.002758488, -0.0023380243, -0.052403864, 0.021707276, -0.02718091, 0.0045513017, 0.02493268, -0.016037108, 0.009521465, 0.022595555, -0.03332406, -0.01791281, -0.026219219, 0.015336862, 0.018615942, 0.0014700901, 0.005194217, -0.0059983027, -0.002134208, 0.055935774, 0.0002028429, -0.01381741, 0.0005677742, 0.052481145, -0.0056857914, -0.024219796, -0.0074823913, 0.041230515, 0.005571935, 0.06841099, -0.025634678, -0.037456885, -0.0021465495, -0.05163424, 0.048833348, 0.057269894, -0.0017718605, -0.012836743, 0.054180846, -0.032427873, -0.003244846, 0.01254491, 0.0071952185, 0.02080726, 0.015043071, -0.08000574, 0.047099367, -0.009071923, 0.022494175, -0.007407801, -0.018199192, 0.01923855, -0.016820459, 0.026590073, 0.05919531, -0.015211094, -0.051043298, 0.05085604, -0.027980763, -0.01785205, 0.05260401, 0.0039136643, -0.010834236, 0.015846392, 0.011993318, 0.0085244095, -0.09705911, 0.004848937, -0.03151453, -0.049902532, -0.023312563, 0.0169847, 0.051852323, -0.018586924, -0.011750037, 0.020324359, 0.041236103, 0.046270456, 0.045885824, 0.035645086, 0.027820086, -0.054944187, -0.0018159872, 0.06008568, 0.056207847, 0.03509413, 0.07476336, 0.00042090056, -0.01791933, -0.049269866, 0.013118644, 0.03817175, 0.03985353, -0.023338122, -0.05917611, -0.040447813, -0.014515073, -0.01641867, -0.012444603, -0.015801677, 0.01694387, -0.012097041, -0.10444289, -0.044068433, 0.028175205, 0.0032158983, 0.017225135, 0.024197249, 0.0003871886, 0.008296747, 0.0020322825, -0.06488942, -0.028532177, 0.03631236, -0.021784041, -0.028676897, 0.020023972, -0.015093374, -0.0053404626, -0.035407133, -0.03022746, -0.045240995, -0.089037456, -0.05241791, 0.01601896, -0.058039088, 0.06633133, 0.01435994, 0.0024608225, 0.02044063, 0.049869247, 0.013966787, 0.011062478, 0.023516618, 0.010368709, 0.039040443, -0.03096598, -0.01665127, 0.010691767, -0.0089797005, 0.018564576, 0.03291386, 0.0032383145, -0.00884169, -0.008645399, 0.0001677955, -0.04452774, 0.007207213, -0.008696507, 0.0023566217, -0.025329702, -0.042708885, -0.03173582, 0.06427912, 0.030916397, -0.022305708, -0.018711232, -0.008136281, -0.01636213, 0.019092057, 0.010243902, -0.04405114, 0.018331835, -0.025844995, 0.035896596, 0.049257137, -0.053962618, -0.084952496, -0.009314442, -0.03644633, 0.0010881334, -0.042904764, 0.016017154, -0.011390375, 0.056498464, 0.007735383, 0.015750613, 0.023586866, -0.005065194, -0.05339934, 0.030084236, -0.021841932, -0.0035868485, -0.025362536, 0.0315042, 0.039552346, -0.032164883, -0.03519624, -0.013936666, 0.006526046, 0.02818671, -0.018081086, 0.04806136, -0.04418975, -0.064630605, -0.010125073, -0.02926605, 0.022641547, 0.040159058, 0.022463534, -0.04924557, -0.010198766, -0.019940902, -0.0033762371, -0.07010838, -0.031799905, -0.020567331, -0.015259151, 0.04870838, 0.030047685, -0.016861487, 0.020778332, -0.034649372, -0.0026895248, -0.0053685517, -0.03297844, -0.0048753927, -0.005587019, -0.041837722, 0.0161564, 0.072810896, -0.043315165, 0.03330332]}

임베딩 데이터베이스 구축하기

임베딩 데이터베이스를 구축하기 위해 다음의 세 가지 샘플 텍스트를 사용합니다. 각 문서의 임베딩을 생성하기 위해 Gemini API를 사용할 것입니다. 더 나은 시각화를 위해 데이터프레임으로 변환하세요.

  • DOCUMENT1, DOCUMENT2, DOCUMENT3는 각각 자동차의 기능에 대한 설명을 담고 있는 딕셔너리입니다.

  • title 키는 문서의 제목을 나타냅니다.

  • content 키는 해당 기능에 대한 상세한 사용 방법을 설명하는 문자열을 담고 있습니다.

  • documents 리스트는 위에서 정의한 세 개의 문서 딕셔너리를 포함하고 있으며, 이를 통해 여러 문서를 한 곳에서 관리할 수 있습니다.

# 각 문서는 자동차의 다른 기능들에 대한 설명을 담고 있는 딕셔너리입니다.
DOCUMENT1 = {
    "title": "Operating the Climate Control System",
    "content": "Your Googlecar has a climate control system that allows you to adjust the temperature and airflow in the car. To operate the climate control system, use the buttons and knobs located on the center console.  Temperature: The temperature knob controls the temperature inside the car. Turn the knob clockwise to increase the temperature or counterclockwise to decrease the temperature. Airflow: The airflow knob controls the amount of airflow inside the car. Turn the knob clockwise to increase the airflow or counterclockwise to decrease the airflow. Fan speed: The fan speed knob controls the speed of the fan. Turn the knob clockwise to increase the fan speed or counterclockwise to decrease the fan speed. Mode: The mode button allows you to select the desired mode. The available modes are: Auto: The car will automatically adjust the temperature and airflow to maintain a comfortable level. Cool: The car will blow cool air into the car. Heat: The car will blow warm air into the car. Defrost: The car will blow warm air onto the windshield to defrost it.",
}

DOCUMENT2 = {
    "title": "Touchscreen",
    "content": "Your Googlecar has a large touchscreen display that provides access to a variety of features, including navigation, entertainment, and climate control. To use the touchscreen display, simply touch the desired icon.  For example, you can touch the 'Navigation' icon to get directions to your destination or touch the 'Music' icon to play your favorite songs.",
}

DOCUMENT3 = {
    "title": "Shifting Gears",
    "content": "Your Googlecar has an automatic transmission. To shift gears, simply move the shift lever to the desired position.  Park: This position is used when you are parked. The wheels are locked and the car cannot move. Reverse: This position is used to back up. Neutral: This position is used when you are stopped at a light or in traffic. The car is not in gear and will not move unless you press the gas pedal. Drive: This position is used to drive forward. Low: This position is used for driving in snow or other slippery conditions.",
}

# 세 개의 문서를 리스트에 저장합니다.
documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]

사전의 내용을 데이터프레임으로 정리하여 시각화를 개선합니다.

  • pd.DataFrame(documents): documents라는 리스트를 pandas의 DataFrame 객체로 변환합니다.

  • df.columns = ['Title', 'Text']: DataFrame의 컬럼 이름을 ‘Title’과 ‘Text’로 지정합니다.

  • df: 최종적으로 생성된 DataFrame 객체를 출력합니다.

# pandas 라이브러리를 pd라는 이름으로 가져옵니다.
import pandas as pd

# documents라는 이름의 리스트를 DataFrame 객체로 변환합니다.
df = pd.DataFrame(documents)
# DataFrame의 컬럼 이름을 'Title'과 'Text'로 설정합니다.
df.columns = ["Title", "Text"]
# DataFrame 객체인 df를 출력합니다.
df
Title Text
0 Operating the Climate Control System Your Googlecar has a climate control system th...
1 Touchscreen Your Googlecar has a large touchscreen display...
2 Shifting Gears Your Googlecar has an automatic transmission. ...

각 텍스트 본문에 대한 임베딩을 구하세요. 이 정보를 데이터프레임에 추가하세요.

  • embed_fn 함수는 제목(title)과 텍스트(text)를 입력받아 임베딩을 생성하는 함수입니다.

  • 이 함수는 genai.embed_content를 호출하여 임베딩을 생성하고, 생성된 임베딩을 반환합니다.

  • model, content, task_type, title을 인자로 전달하여 특정 모델을 사용해 문서 검색(retrieval) 작업에 적합한 임베딩을 생성합니다.

  • 데이터프레임의 apply 함수를 사용하여, 각 행에 대해 embed_fn 함수를 적용합니다.

  • lambda 함수를 통해 각 행의 ‘Title’과 ‘Text’ 컬럼 값을 embed_fn 함수에 전달합니다.

  • axis=1apply 함수가 각 행에 대해 적용되어야 함을 의미합니다.

  • 결과적으로, 각 행의 ‘Embeddings’ 컬럼에 해당 행의 제목과 텍스트로부터 생성된 임베딩이 저장됩니다.

  • 최종적으로 수정된 데이터프레임 df가 출력됩니다.

# 데이터프레임의 각 텍스트에 대한 임베딩을 얻어서 'Embeddings' 컬럼에 추가하는 함수 정의
# 제목과 텍스트를 입력받아 임베딩을 생성하고 반환하는 함수
def embed_fn(title, text):
    # genai.embed_content 함수를 사용하여 임베딩 생성
    # 모델, 내용, 작업 유형, 제목을 인자로 전달
    return genai.embed_content(
        model=model, content=text, task_type="retrieval_document", title=title
    )["embedding"]


# 데이터프레임의 각 행에 대해 'Title'과 'Text' 컬럼의 값을 사용하여
# embed_fn 함수를 호출하고, 결과 임베딩을 'Embeddings' 컬럼에 저장
# apply 함수를 사용하여 각 행에 함수를 적용, axis=1은 행 단위 적용을 의미
# lambda 함수를 사용하여 각 행의 'Title'과 'Text' 값을 embed_fn 함수에 전달
# 최종적으로 수정된 데이터프레임을 출력
# df는 이미 정의된 pandas 데이터프레임 변수임
df["Embeddings"] = df.apply(lambda row: embed_fn(row["Title"], row["Text"]), axis=1)
df
Title Text Embeddings
0 Operating the Climate Control System Your Googlecar has a climate control system th... [-0.033361107, -0.021217084, -0.049581926, -0....
1 Touchscreen Your Googlecar has a large touchscreen display... [0.01014847, -0.031820476, -0.015613061, -0.04...
2 Shifting Gears Your Googlecar has an automatic transmission. ... [-0.04270796, -0.007160868, -0.03242516, -0.02...

문서 검색을 위한 Q&A 시스템 구축하기

임베딩이 생성되었으니, 이제 이 문서들을 검색할 수 있는 Q&A 시스템을 만들어 봅시다. 하이퍼파라미터 튜닝에 대한 질문을 하고, 그 질문의 임베딩을 생성한 다음 데이터프레임에 있는 임베딩 컬렉션과 비교해 보겠습니다.

질문의 임베딩은 부동 소수점 값의 리스트인 벡터가 될 것이며, 이는 점곱을 사용하여 문서의 벡터와 비교됩니다. API에서 반환된 이 벡터는 이미 정규화되어 있습니다. 점곱은 두 벡터 사이의 방향 유사성을 나타냅니다.

점곱의 값은 -1부터 1까지의 범위를 가질 수 있습니다. 두 벡터 사이의 점곱이 1이면, 벡터들은 같은 방향을 가리킵니다. 점곱 값이 0이면, 이 벡터들은 서로 직교하거나 관련이 없습니다. 마지막으로, 점곱이 -1이면 벡터들은 반대 방향을 가리키며 서로 유사하지 않습니다.

새로운 임베딩 모델(embedding-001)을 사용할 때, 사용자 질의의 경우 작업 유형을 QUERY로, 문서 텍스트를 임베딩할 때는 DOCUMENT로 지정해야 합니다.

작업 유형 설명
RETRIEVAL_QUERY 주어진 텍스트가 검색/검색 설정에서 질의임을 명시합니다.
RETRIEVAL_DOCUMENT 주어진 텍스트가 검색/검색 설정에서 문서임을 명시합니다.
  • query 변수에는 사용자의 질문이 문자열 형태로 저장됩니다.

  • model 변수에는 사용할 임베딩 모델의 이름이 문자열 형태로 저장됩니다.

  • genai.embed_content 함수는 임베딩 모델을 사용하여 주어진 콘텐츠의 임베딩을 생성하는 데 사용됩니다.

    • model 인자에는 사용할 모델의 이름을 전달합니다.

    • content 인자에는 임베딩을 생성할 콘텐츠(여기서는 사용자의 질문)를 전달합니다.

    • task_type 인자에는 임베딩의 용도를 나타내는 문자열을 전달합니다. 여기서는 ‘retrieval_query’로 설정하여 검색 쿼리에 대한 임베딩을 생성하도록 지정합니다.

# 사용자의 질문을 변수에 저장합니다.
query = "How do you shift gears in the Google car?"
# 사용할 모델의 이름을 변수에 저장합니다.
model = "models/embedding-001"

# genai 라이브러리의 embed_content 함수를 사용하여
# 주어진 질문(query)에 대한 임베딩을 생성합니다.
# 이때, 모델 이름과 태스크 유형(task_type)을 인자로 전달합니다.
request = genai.embed_content(model=model, content=query, task_type="retrieval_query")

find_best_passage 함수를 사용하여 점곱을 계산한 다음, 데이터프레임을 가장 큰 점곱 값부터 작은 값 순으로 정렬하여 데이터베이스에서 관련된 지문을 검색합니다.

  • find_best_passage 함수는 주어진 querydataframe 내의 문서들 사이의 유사도를 계산하여 가장 관련성이 높은 문서의 텍스트를 반환합니다.

  • genai.embed_content 함수를 사용하여 주어진 query의 임베딩을 생성합니다. 이때 modeltask_type을 인자로 전달합니다.

  • numpydot 함수를 사용하여 데이터프레임의 ‘Embeddings’ 열에 있는 모든 문서의 임베딩과 쿼리 임베딩의 점곱(dot product)을 계산합니다.

  • np.argmax 함수를 사용하여 점곱 결과 중 가장 큰 값을 가지는 인덱스를 찾습니다. 이 인덱스는 가장 유사한 문서를 나타냅니다.

  • dataframe.iloc[idx]['Text']를 통해 가장 유사도가 높은 문서의 텍스트를 반환합니다.

def find_best_passage(query, dataframe):
    """
    쿼리와 데이터프레임 내의 각 문서 사이의 거리를 점곱을 이용하여 계산합니다.
    """
    # 쿼리에 대한 임베딩을 생성합니다. 임베딩은 검색 쿼리 작업 유형에 맞게 생성됩니다.
    query_embedding = genai.embed_content(
        model=model, content=query, task_type="retrieval_query"
    )
    # 데이터프레임의 'Embeddings' 열에 있는 모든 임베딩과 쿼리 임베딩의 점곱을 계산합니다.
    dot_products = np.dot(
        np.stack(dataframe["Embeddings"]), query_embedding["embedding"]
    )
    # 점곱의 결과 중 가장 큰 값을 가지는 인덱스를 찾습니다.
    idx = np.argmax(dot_products)
    # 가장 큰 점곱 값을 가진 인덱스에 해당하는 텍스트를 반환합니다.
    return dataframe.iloc[idx]["Text"]

데이터베이스에서 가장 관련성 높은 문서를 확인하세요:

  • find_best_passage 함수는 주어진 질의(query)에 대해 가장 적합한 문단을 찾기 위해 사용됩니다.

  • 이 함수는 두 개의 인자를 받습니다:

    1. query: 검색하고자 하는 질의 또는 키워드입니다.

    2. df: 검색 대상이 되는 데이터를 포함하고 있는 데이터프레임입니다.

  • 함수의 실행 결과로 가장 적합한 문단이 반환되며, 이는 변수 passage에 저장됩니다.

  • 마지막으로 passage 변수를 출력하여 함수의 결과를 확인할 수 있습니다.

# 주어진 질의(query)에 대해 가장 적합한 문단(passage)을 찾는 함수 'find_best_passage'를 호출합니다.
# 이 함수는 질의에 가장 잘 맞는 문단을 데이터프레임(df)에서 찾아 반환합니다.
passage = find_best_passage(query, df)
# 찾아진 문단을 출력합니다.
passage
'Your Googlecar has an automatic transmission. To shift gears, simply move the shift lever to the desired position.  Park: This position is used when you are parked. The wheels are locked and the car cannot move. Reverse: This position is used to back up. Neutral: This position is used when you are stopped at a light or in traffic. The car is not in gear and will not move unless you press the gas pedal. Drive: This position is used to drive forward. Low: This position is used for driving in snow or other slippery conditions.'

질문과 답변 응용 프로그램

텍스트 생성 API를 사용하여 Q & A 시스템을 만들어 봅시다. 아래에 사용자 정의 데이터를 입력하여 간단한 질문과 답변 예시를 만들어 보세요. 여전히 유사성의 척도로 내적(dot product)을 사용할 것입니다.

  • make_prompt 함수는 두 개의 매개변수를 받습니다: query (질문)와 relevant_passage (관련 문단).

  • relevant_passage에서 작은따옴표, 큰따옴표, 줄바꿈 문자를 제거하여 escaped 변수에 저장합니다. 이는 프롬프트에 포함될 텍스트를 정제하기 위함입니다.

  • textwrap.dedent를 사용하여 여러 줄에 걸친 문자열에서 각 줄 앞의 공백을 제거합니다. 이를 통해 문자열을 보기 좋게 정렬할 수 있습니다.

  • 문자열의 format 메서드를 사용하여 queryescaped 변수의 값을 문자열에 삽입합니다.

  • 최종적으로 생성된 프롬프트 문자열을 반환합니다.

def make_prompt(query, relevant_passage):
    # 주어진 문단에서 작은따옴표, 큰따옴표, 줄바꿈 문자를 제거합니다.
    escaped = relevant_passage.replace("'", "").replace('"', "").replace("\n", " ")
    # 질문과 정제된 문단을 포함하는 프롬프트를 생성합니다.
    # textwrap.dedent를 사용하여 여러 줄에 걸친 문자열의 각 줄 앞에 있는 공백을 제거합니다.
    prompt = textwrap.dedent(
        """You are a helpful and informative bot that answers questions using text from the reference passage included below. \
  Be sure to respond in a complete sentence, being comprehensive, including all relevant background information. \
  However, you are talking to a non-technical audience, so be sure to break down complicated concepts and \
  strike a friendly and conversational tone. \
  If the passage is irrelevant to the answer, you may ignore it.
  QUESTION: '{query}'
  PASSAGE: '{relevant_passage}'

    ANSWER:
  """
    ).format(query=query, relevant_passage=escaped)

    return prompt
  • make_prompt 함수는 두 개의 인자 querypassage를 받아서 이를 결합한 새로운 문자열을 반환하는 함수입니다.

  • 이 코드는 make_prompt 함수를 호출하여 반환된 문자열을 prompt 변수에 저장합니다.

  • 마지막으로 print 함수를 사용하여 prompt 변수에 저장된 문자열을 콘솔에 출력합니다.

# make_prompt 함수를 사용하여 query와 passage를 결합한 문자열을 생성합니다.
prompt = make_prompt(query, passage)
# 생성된 문자열을 출력합니다.
print(prompt)
You are a helpful and informative bot that answers questions using text from the reference passage included below.   Be sure to respond in a complete sentence, being comprehensive, including all relevant background information.   However, you are talking to a non-technical audience, so be sure to break down complicated concepts and   strike a friendly and conversational tone.   If the passage is irrelevant to the answer, you may ignore it.
  QUESTION: 'How do you shift gears in the Google car?'
  PASSAGE: 'Your Googlecar has an automatic transmission. To shift gears, simply move the shift lever to the desired position.  Park: This position is used when you are parked. The wheels are locked and the car cannot move. Reverse: This position is used to back up. Neutral: This position is used when you are stopped at a light or in traffic. The car is not in gear and will not move unless you press the gas pedal. Drive: This position is used to drive forward. Low: This position is used for driving in snow or other slippery conditions.'

    ANSWER:

당신의 질문에 답을 찾기 위해 Gemini 콘텐츠 생성 모델 중 하나를 선택하세요.

  • genai.list_models(): genai 라이브러리에서 제공하는 모델 목록을 반환하는 함수입니다.

  • for m in genai.list_models(): 반환된 모델 목록을 순회하는 반복문입니다.

  • if 'generateContent' in m.supported_generation_methods: 모델이 지원하는 생성 메소드 중 ‘generateContent’가 있는지 확인합니다.

  • print(m.name): ‘generateContent’ 메소드를 지원하는 모델의 이름을 출력합니다.

# genai 라이브러리의 list_models 함수를 사용하여 사용 가능한 모델 목록을 가져옵니다.
for m in genai.list_models():
    # 각 모델의 지원하는 생성 메소드 중 'generateContent'가 포함되어 있는지 확인합니다.
    if "generateContent" in m.supported_generation_methods:
        # 조건을 만족하는 모델의 이름을 출력합니다.
        print(m.name)
models/gemini-pro
models/gemini-pro-vision
  • genai.GenerativeModel('gemini-ultra'): genai 라이브러리의 GenerativeModel 클래스를 사용하여 ‘gemini-ultra’라는 이름의 생성 모델을 초기화합니다. (아직 미지원하여 'gemini-pro' 로 대체하였습니다.

  • model.generate_content(prompt): 초기화된 모델의 generate_content 메소드를 호출하여, 인자로 주어진 prompt에 기반한 내용을 생성합니다. 이 메소드는 생성된 내용을 반환합니다.

# genai 라이브러리의 GenerativeModel 클래스를 사용하여 'gemini-ultra' 모델을 초기화합니다.
model = genai.GenerativeModel("gemini-pro")
# 초기화된 모델을 사용하여 주어진 prompt에 대한 내용을 생성합니다.
answer = model.generate_content(prompt)
  • Markdown(answer.text): 이 코드는 answer.text라는 문자열을 마크다운 형식으로 변환하기 위해 사용됩니다.

  • 주로 텍스트를 HTML로 변환하여 웹 페이지에 표시할 때 사용됩니다.

# 주어진 코드에 주석을 추가한 결과
Markdown(answer.text)  # Markdown 클래스를 사용하여 answer.text의 내용을 마크다운 형식으로 변환
The Google car features an automatic transmission, eliminating the need for manual gear shifting. When you want to change gears, simply move the shift lever to the desired position. For example, move it to "Park" when you're parking to lock the wheels and prevent the car from moving. Choose "Reverse" to move backward. Use "Neutral" when stopped at a traffic light or in congested traffic, allowing the car to remain stationary without being in gear. For regular driving, select "Drive," and if you encounter snow or slippery conditions, opt for "Low."

라이선스

# @title Licensed under the Apache License, Version 2.0 (the "License");
# 이 파일은 Apache License, Version 2.0에 따라 사용이 허가되었습니다.
# 라이선스를 준수하는 경우에만 이 파일을 사용할 수 있습니다.
# 라이선스는 다음의 링크에서 얻을 수 있습니다:
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# 법률에 의해 요구되거나 서면으로 합의된 경우를 제외하고,
# 라이선스에 따라 배포된 소프트웨어는 "있는 그대로"의 기준으로 제공되며,
# 명시적이거나 묵시적인 어떠한 종류의 보증이나 조건도 부여되지 않습니다.
# 라이선스가 부여하는 허가 및 제한 사항을 정하는 데 적용되는 법률을 참조하십시오.

댓글남기기