조대협 (http://bcho.tistory.com)
보통 우리가 LLM을 생각하면 LLM 모델은 학습된 정보를 기반으로 질문에 답변을 하는 기능만 생각하지만 LLM을 서비스하는 API의 경우 추가적인 기능을 제공하는 경우가 많다.
Gemini API의 경우 구글 검색을 통한 답변이나, 코드를 생성한 후 자동으로 실행해주는 Code execution과 같은 추가 기능을 제공한다. 이는 Gemini LLM 모델에 추가적으로 Google Search나 코드 실행과 같은 추가 기능을 개발하여, API를 통해서 서비스 하는 개념이다.
Gemini API에는 생각보다 유용한 기능들이 많은데, 이 글에서는 Gemini API의 유용한 기능을 위주로 살펴보도록 한다.
Thinking
먼저 Thinking 모델 (Reasoning 모델이라고도 함)에 대해서 알아보도록 하자.
일반 모델은 입력된 질문에 대해서, LLM이 학습된 내용에 따라서, 답변을 하는 방식으로, 질문에 대한 답변을 확률적인 방식으로 예측하여 답변한다.
반면 Thinking모델의 경우에는 답변을 하기전에 어떻게 논리적으로 답변을 할지에 대해서 전략을 세워서, 이를 기반으로 답변한다.
예를 들어
- Chain Of Thought (COT) : 문제의 해결 방법을 다단계로 나눠서 접근을 한다던가.
- Problem Decomposition : 하나의 질문을 여러개의 질문으로 분류하여 하위 문제를 해결하여 합한다거나,
- Self Correction : 스스로 생성한 답변을 검토하고 오류를 수정하여 개선한다는 식의 접근 방법을 사용한다.
그래서 Thinking 모델의 경우에는 수학이나 코딩 같은 복잡한 문제에 유리하고 좀 더 정확한 답변을 기대할 수 있지만,Thinking이라는 중간 단계를 거치는 만큼, 응답 속도가 상대적으로 느리고 더 많은 컴퓨팅 자원을 필요로 한다.
Gemini 2.5 Flash와 Pro 두 모델은 모두 Thinking 모델로 논리적인 사고 기능을 가지고 있다.
Gemini 2.5 Flash의 경우에는 필요에 따라서 이 Thinking 기능을 끌 수 있다. (Gemini 2.5 Pro는 Thinking 기능을 끌 수 없다.) Thinking 기능을 끌 경우에는 좀 더 빠른 응답 시간과 적은 토큰 사용량을 기대할 수 있다.
<그림. AIStudio에서 Thinking mode를 On/Off하는 옵션>
만약에 Thinking 기능을 사용할 경우 “Thinking budget(예산)”이라는 것을 설정할 수 있는데, 간단하게 설명하면 얼마나 깊게 사고를 할지를 정할 수 있다. 토큰 양으로 정의하는데 0~24576 토큰까지로 지정할 수 있다. Thinking에 사용되는 토큰을 크게 주면 조금더 문제를 깊고 논리적으로 판단할 수 있도록 하는 것이고, 낮게 줄 수 록 생각을 덜하고 빠른 응답을 하도록 하는것이다. 보통 디폴트 값으로 8000 토큰을 사용하는데, 깊은 논리적 사고가 필요한 경우 24576 토큰까지 사용하도록 설정하는 것이 좋다.
아래는 Thinking 모드를 사용하도록 한 코드 예제이다. GenerateContentConfig에 Gemini 호출에 대한 설정 정보를 줄 수 있는데, include_thoughts=True로 하게되면, Thinking 모드로 동작하며, 응답 메시지에 Thinking 내용을 포함해서 리턴한다.
from google import genai
from google.genai import types
client = genai.Client(api_key=MY_API_KEY)
response = client.models.generate_content(
model="gemini-2.5-flash-preview-05-20",
contents="Provide a list of 3 famous physicists and their key contributions",
config=types.GenerateContentConfig(
thinking_config=types.ThinkingConfig( include_thoughts=True)
),
)
for part in response.candidates[0].content.parts:
if not part.text:
continue
if part.thought:
print("Thought summary:")
print(part.text)
print()
else:
print("Answer:")
print(part.text)
print()
아래는 코드를 실행할 결과로, 답변을 생성하기전에 어떤 과정으로 문제를 접근했는지를 “Thought Summary”에 출력하였다.
Thought summary:
**My Thinking on Famous Physicists and Their Contributions**
Okay, so the task is to identify three famous physicists and pinpoint their most significant contributions. "Famous" means widely recognized, and "key contributions" implies breakthroughs, the *big* stuff.
: (중략)
Answer:
Here are three famous physicists and their key contributions:
1. **Isaac Newton** (1642-1727)
* **Key Contributions:** Formulated the **laws of motion** (classical mechanics) and the **law of universal gravitation**, which described gravity as a universal force. These laid the foundation for much of classical physics and explained the motion of
: (중략)
만약에 Thinking 과정에서 소요된 토큰 수를 카운트하려면 meta 데이터에서 token 카운트 정보를 출력하면 된다.
print("Thoughts tokens:",response.usage_metadata.thoughts_token_count)
print("Output tokens:",response.usage_metadata.candidates_token_count)
Context URL
LLM은 학습된 정보로만 답변을 하기 때문에,외부 URL에 있는 정보를 이용해서 답변을 할 수 없다.
예를 들어 “https://bcho.tistory.com/1477 글을 요약해줘.”라는 질문을 했을때,일반적인 LLM 답변을 할 수 없다고 답변을 하거나(이건 잘 구현된 시스템이고), 아니면 LLM에 기억된 정보를 통해서 답변하는데 이는 학습 당시의 정보라서 변경이되었을 수 도 있고, 확률적으로 비슷한 문서를 가지고 답변을 하기 때문에, Hallucination이 발생할 가능성이 높다. (답변이 쓸수가 없다)
이러한 기능을 구현하기 위해서는 해당 URL의 내용을 스크래핑 해서 그 내용을 LLM Input context window에 넣도록 할 수 있지만, 스크래퍼를 만들어야 하고 또한 스크래핑된 HTML에서 HTML 태그등을 제거한 후에, 정보성 내용만을 Text로 추출해야 하는등 추가적인 작업이 필요하다.
Gemini에서는 Context URL이라는 기능을 제공하는데, 해당 URL들을 Context 정보로 해서 Gemini가 참고해서 답변할 수 있는 기능이다.
from google import genai
from google.genai import types
client = genai.Client(api_key=MY_API_KEY)
url_context_tool = Tool(
url_context = types.UrlContext
)
prompt = "https://bcho.tistory.com/1477 글을 요약해줘."
response = client.models.generate_content(
model="gemini-2.5-flash-preview-05-20",
contents=prompt,
config=GenerateContentConfig(
tools=[url_context_tool],
response_modalities=["TEXT"],
)
)
Markdown(response.text)
위의 코드와 같이 Tool에 types.UrlContext를 정의한 후에, GenerateContentConfig의 tools 변수에 전달해주면된다. 한개의 URL이 아니라 N개의 URL을 동시에 가지고 올 수 있다.
참고로 해당 기능은 experimental (시험) 단계 기능으로, 예고 없이 API가 변경되거나, 기능이 삭제될 수 있다.
'빅데이타 & 머신러닝 > 생성형 AI (ChatGPT etc)' 카테고리의 다른 글
Gemini CLI 활용 방법과 숨겨진 가치 (0) | 2025.07.05 |
---|---|
잘알려지지 않은 Gemini의 유용한 기능 #2 - 구글 검색 연동과, 코드 실행 (7) | 2025.06.15 |
AI 개발 시대에서, 개발자로 살아남기 위해서.. (3) | 2025.05.21 |
바이브 코딩 다음은 AIOps (3) | 2025.05.19 |
체계적인 바이브 코딩 5단계 + 필수 도구!! (0) | 2025.04.23 |