조대협 (http://bcho.tistory.com)
지난 글에 이어서, Gemini에서 잘 알려지지 않은 기능을 연결해서 소개한다.
오늘 소개하는 기능은 구글 검색 연동과, Gemini가 코드를 생성하고, 이를 실행할 수 있는 Code Execution이라는 기능 두가지이다.
Google Search Grounding
Gemini API중에서 아마 가장 유용한 기능중 하나가 아닌가 싶은데, Google AI 모델 답게, Google Search 엔진과 연동이 된다. 내장된 구글 검색 도구를 가지고 있으며, 이를 사용하면, 질문에 대한 답을 얻기 위해서 구글 검색을 통해서 자료를 검색한 후에, 이를 기반으로 Gemini가 답변을 해준다.
from google import genai
from google.genai.types import Tool, GenerateContentConfig, GoogleSearch
client = genai.Client(api_key=my_api_key)
model_id = "gemini-2.0-flash"
google_search_tool = Tool(
google_search = GoogleSearch()
)
response = client.models.generate_content(
model=model_id,
contents="인터넷 블로거 조대협에 대해서 자세하게 알려줘. 경력,저서,대외 활동을 포함해줘",
config=GenerateContentConfig(
tools=[google_search_tool]
)
)
for each in response.candidates[0].content.parts:
print(each.text)
위의 예제는 구글 검색 도구를 이용하여 “조대협” 에 대해서 조사하는 코드이다.
아래가 결과인데, 모든 내용이 정확하다.
**경력:**
* 스타트업 개발자로 시작
* BEA 시스템즈 코리아 웹로직 기술 지원 엔지니어 (전)
* 한국 오라클 컨설턴트 (전)
* 마이크로소프트 아키텍트 (전)
* 삼성전자 무선사업부 아키텍트 (현)
* 미디어 스타트업 피키캐스트 CTO (전)
* 현재 Google Cloud Principal Architect로 재직하며, 주니어 클라우드 엔지니어들을 위한 아키텍처 디자인 교육 프로그램을 전 세계 구글러 대상으로 운영
**저서:**
* 대용량 아키텍처와 성능 튜닝 (프리렉, 2015)
* 소프트웨어 개발과 테스트 (프리렉, 2015)
* 빠르게 훑어보는 구글 클라우드 플랫폼 (2016)
* 랭체인으로 실현하는 LLM 아키텍처 (프리렉, 2024)
: (중략)
아래는 구글 검색 기능을 사용하지 않고, Gemini 모델에 학습된 정보만을 이용해서 생성한 답변인데, 주요 경력이나 저서가 모두 틀리다.
**주요 경력**
* **현재:**
* 쿠팡 소프트웨어 개발 디렉터 (Software Development Director)
* **과거:**
* eBay 코리아 아키텍트
* SK플래닛 플랫폼 아키텍트
* 오픈소스 컨설팅, Red Hat 등 다양한 IT 기업에서 근무
**저서**
* **대규모 서비스를 지탱하는 기술:** 국내 IT 개발자들에게 MSA와 데브옵스 개념을 널리 알린 베스트셀러입니다. 대규모 시스템 설계 및 운영에 대한 실질적인 경험과 지식을 담고 있습니다.
* **DevOps 쿡북:** 데브옵스 개념과 실무 적용 방법을 다양한 레시피 형태로 풀어낸 책입니다. 데브옵스를 처음 접하는 개발자나 시스템 운영자에게 유용한 가이드가 됩니다.
* **Data Engineering 쿡북:** 데이터 엔지니어링의 기초부터 실제 데이터 파이프라인 구축, 관리, 운영까지 다루는 책입니다.
* **쿠버네티스 인 액션:** 쿠버네티스에 대한 이론적인 설명뿐만 아니라 실제 운영 환경에서 발생하는 문제 해결 방법과 노하우를 담고 있습니다.
일반적인 지식이 아닌, 특정인이나 특정 지식에 대한 답변은 LLM의 경우 Hallucination을 유발할 수 있는 가능성이 많고, 이로 인하여 답변의 내용을 신뢰하기 어렵다. 이렇게 외부 데이터 스토리지를 참고 해서 답변을 하는 기법을 grouding이라고 하는데, 구글 gemini는 구글 검색엔진을 외부 소스로 이용해서 손쉽게 구현이 가능하다.
물론 이를 코드로 직접 구현해도 되지만, 구글 검색 API를 연동해야 하고, 검색된 문서에서 HTML/자바 스크립트들을 별도로 파싱해야 하며, 검색 결과가 많은 경우 input window에 다 들어가지 않을 수 있기 때문에 많은 후처리가 필요하지만, Gemini Google Search Grounding은 옵션 하나로 손쉽게 이 기능을 구현할 수 있다.
Code Execution
일반적으로 LLM 모델은 코드를 생성은 가능하지만, 생성된 코드를 실행할 수 는 없다.
별도로 생성된 코드를 다운로드 받아서 별도의 런타임에서 코드를 실행하도록 해야 하지만, Gemini는 모델 API에서 코드를 생성한 후에, 그 코드를 실행하고, 결과를 리턴받을 수 있다.
이는 여러 유스케이스에서 유용하게 사용될 수 있는데, 예를 들어 매출 데이터를 업로드한 후에, 그 매출 데이터로 선형회귀 머신러닝 모델을 만들어서 학습하도록 하고, 그 모델을 이용하여 다음달 매출을 시뮬레이션 할 수 있다.
이 기능을 Gemini Code Execution이라고 하는데, 몇가지 제약이 있다.
- 파이썬 코드만 실행이 가능함
현재는 파이썬 코드만 실행이 가능하며, 주요 파이썬 라이브러리를 함께 사용할 수 있다. 다른 프로그래밍 언어로도 코드 생성은 가능하나 실행은 불가능하다. - gVisor라는 격리된 컨테이너 공간에서 실행됨
gVisor(https://gvisor.dev/)는 구글이 오픈소스로 개발한 컨테이너엔진으로 (Docker와 유사하다고 생각하면된다). 일반적인 컨테이너 엔진과는 다르게 격리 효과가 뛰어나다. 일반적인 컨테이너 엔진의 경우에는 호스트 머신의 커널을 공유하는데 반하여, gVisor는 커널을 격리하여, 서로 다른 컨테이너들이 커널을 통해서 데이터를 공유하거나 유출하는 것을 방지할 수 있다. - 최대 30초 까지 실행이 가능함.
아래는 선형 회귀 학습용 데이터를 생성하고 실행하는 코드 예시이다.
모델 호출시에 ToolCodeExecution을 포함해주면 된다.
from google import genai
from google.genai import types
client = genai.Client(api_key=my_api_key)
model_id = "gemini-2.0-flash"
response = client.models.generate_content(
model=model_id,
contents="Y=2X와 유사한 선형회귀데이터를 생성하려고 한다. 파이썬을 이용해서, 100개의 데이터를 생성하는 코드를 만들어서 실행해줘",
config=GenerateContentConfig(
tools=[types.Tool(code_execution=types.ToolCodeExecution)]
)
)
for part in response.candidates[0].content.parts:
if part.text is not None:
print("### Text part")
print(part.text)
if part.executable_code is not None:
print("### Code part")
print(part.executable_code.code)
if part.code_execution_result is not None:
print("### Code result part")
print(part.code_execution_result.output)
아래는 코드의 실행 결과이다.
Response에 Text, Code, Result 부분이 따로 있는데, Text 부분은 설명이 들어가고 Code 부분은 Gemini 가 생성한 코드, 그리고 마지막으로 result 부분에는 Code를 실행한 결과를 출력하게 된다.
### Text part
알겠습니다. `Y = 2X`와 유사한 선형 회귀 데이터를 생성하는 Python 코드를 작성하고 실행하겠습니다. 데이터에 약간의 노이즈를 추가하여 완벽한 선형 관계가 아닌 현실적인 데이터를 만들겠습니다.
### Code part
import numpy as np
# 데이터 포인트의 개수
n_samples = 100
# X 값 생성 (0과 1 사이의 난수)
X = np.random.rand(n_samples)
# Y 값 생성 (Y = 2X + 노이즈)
noise = 0.1 * np.random.randn(n_samples) # 노이즈 추가
Y = 2 * X + noise
# X와 Y 출력 (처음 5개만)
print("X (처음 5개):", X[:5])
print("Y (처음 5개):", Y[:5])
# 데이터 전체 개수 출력
print(f"{n_samples=}")
### Code result part
X (처음 5개): [0.18859923 0.19698167 0.21192154 0.3700807 0.40281184]
Y (처음 5개): [0.38710175 0.39031429 0.47773753 0.78376626 0.80973927]
n_samples=100
### Text part
위 코드는 다음을 수행합니다.
1. `numpy` 라이브러리를 가져옵니다.
2. 데이터 포인트의 개수 `n_samples`를 100으로 설정합니다.
3. `X` 값을 0과 1 사이의 난수로 생성합니다.
4. `Y` 값을 `Y = 2X + 노이즈`로 생성합니다. 노이즈는 정규 분포를 따르는 작은 값으로, 데이터에 약간의 변동성을 더합니다.
5. 생성된 `X`와 `Y`의 처음 5개 값을 출력합니다.
6. 데이터 전체 개수를 출력합니다.
이제 `X`와 `Y`에 선형 회귀 분석을 수행할 수 있는 데이터가 준비되었습니다.
'빅데이타 & 머신러닝 > 생성형 AI (ChatGPT etc)' 카테고리의 다른 글
LLM 모델 알고리즘 이해를 기반으로, 효율적인 프롬프트 작성하기 (0) | 2025.07.06 |
---|---|
Gemini CLI 활용 방법과 숨겨진 가치 (0) | 2025.07.05 |
잘알려지지 않은 Gemini의 유용한 기능-#1 Thinking & Context URL (2) | 2025.06.03 |
AI 개발 시대에서, 개발자로 살아남기 위해서.. (3) | 2025.05.21 |
바이브 코딩 다음은 AIOps (3) | 2025.05.19 |