Agent를 처음 알게 된 후 Agent에 대해 공부해보겠다고 마음 먹은 시점과 맞물려 마침 구글에서 Google-ADK(Agent Development Kit)을 출시하였다. 그래서 기존 OpenAI 기반의 Agent 생성관련 자료가 많은데도 불구하고 이를 파보기로 하였다.
그런데 막 출시한 서비스라 레퍼런스가 없어도 너무 없었다. 검색결과에 표시되는 글 하나하나 클릭해봐도 공식 Google 에서 제공하는 메뉴얼 내용을 그냥 복붙한 수준의 글이 대부분이었다.
그래서 내가 삽질에 삽질을 거듭한 Google-ADK 내용을 공유해보려고 한다.
먼저 공식 사이트에서 제공하는 코드를 이용하면 전부 adk 라는 Tool 기반으로 동작을 한다. 바로 채팅형식의 UI 확인이 쉽긴하지만, 오류가 발생하거나 세부 컨트롤이 필요할 경우 난감한 경우가 많았다. 그래서 해당 Tool 기반이 아닌 오로지 코드기반으로 구현을 해보았다.
먼저 google-adk 패키지를 먼저 설치해준다.
pip install google-adk
작업할때는 다른 프로젝트와 충돌이 없게 가상환경(venv)을 만들어서 작업하는 것을 추천한다.
이제 우리는 전일 주식가격을 알려주는 Agent를 만들어 볼 것이다.
먼저 Agent에 대한 정의를 생성한다. 모든 Agent는 비동기로 호출되어야 한다.
# Agent 정의
async def get_root_agent_sync():
root_agent = LlmAgent(
model="gemini-2.5-flash",
name="root_agent",
instruction="당신은 주식가격을 답하는 Agent 입니다. 종목을 입력하면 전일 기준 종료가격을 알려주세요",
)
return root_agent
그 다음으로 실제 해당 Agent와 채팅을 구동하는 main 함수영역을 만들어준다.
# 메인 함수
async def async_main():
# Session 초기화
# TO DO : USER_ID 와 SESSION_ID는 로그인 정보 연동하여 처리 필요
session_service = InMemorySessionService()
print(f"Session Service 생성완료.")
APP_NAME = "stock_app"
USER_ID = "user_123"
SESSION_ID = "session_123"
session = await session_service.create_session(
state={}, app_name=APP_NAME, user_id=USER_ID, session_id=SESSION_ID
)
print(f"Session '{SESSION_ID}' 생성완료.")
# Agent 초기화
root_agent = await get_root_agent_sync()
# Runner 초기화
runner = Runner(
app_name=APP_NAME,
agent=root_agent,
session_service=session_service
)
print(f"Runner 생성완료. - agent '{root_agent.name}'.")
# Agent 채팅 시작
while True:
try:
# 사용자 입력받기
user_query = input("[사용자 (종료: quit/exit/종료)] : ")
if user_query.lower() in ["quit", "exit", "종료"]:
print("대화를 종료합니다.")
break
content = types.Content(role='user', parts=[types.Part(text=user_query)])
# 결과 응답 메세지
final_response_text = "Agent 마지막 응답메세지가 없습니다"
async for event in runner.run_async(user_id=USER_ID, session_id=SESSION_ID, new_message=content):
if event.is_final_response():
# 최종 응답메세지가 있을 경우 runner.run_async() 종료
if event.content and event.content.parts:
final_response_text = event.content.parts[0].text
break
# 최종 응답 메세지 출력
print(f"[{event.author}] {final_response_text}")
except Exception as e:
print(f"An error occurred: {e}")
위 코드가 다되었으면 메인함수에서 실행해준다.
if __name__ == '__main__':
try:
asyncio.run(async_main())
except Exception as e:
print(f"An error occurred: {e}")
실제 실행해보면 아래와 같이 표시된다.
결과에서도 확인되다시피 전일 종가를 질문했는데, 실제 2024년 5월 23일 결과를 알려준다. 이는 해당 모델의 학습한 기간이 저 시점이기 때문에 이후 가격을 알수가 없다.
이럴경우 Agent에서는 도구(Tool)란 걸 추가해서 지시를 할 수가 있다.
예를들어 구글 검색이라는 내장 도구를 추가해보자.
구글검색 도구를 추가하기 위해 아래 코드를 추가한다.
from google.adk.tools import google_search
그 다음에 위에서 구현했던 root_agent 정의 부분을 아래와 같이 변경한다.
# Agent 정의
async def get_root_agent_sync():
root_agent = LlmAgent(
model="gemini-2.5-pro",
name="root_agent",
instruction="""
당신은 주식가격을 답하는 Agent 입니다. 종목을 입력하면 전일 기준 종료가격을 알려주세요.
구글검색 도구를 이용해서 알려주세요
""",
tools=[google_search]
)
return root_agent
위와 같이 프롬프트에 "구글검색 도구를 이용해서 주세요" 라고 지침을 추가하여 Agent로 하여금 모델 결과 외에 구글 검색을 하라는 지시를 추가하였다.
다시 실행해보면 아래와 같이 결과가 바로 전일기준으로 표시되는 걸 확인 할 수 있다.
여기까지 Google-ADK를 이용하여 간단한 Agent를 만드는걸 해보았다.
마치면서..
이로써 Agent란 새로운 형태의 환경을 경험해보았고 응용분야도 다양할 것 같다는 생각이 들었다.
앞으로도 삽질은 계속 될것이며, 검색했을 때 발견 못했던 새로운 팁이 또 나오면 공유를 해볼 예정이다.
이글이 나처럼 새로 google-adk 개발을 접한분들에게 도움이 되었으면 좋겠다.
'AI > Agent' 카테고리의 다른 글
🧠 GPT 하나로 부족하다고? LangChain, RAG, Agent는 도대체 뭐야? (2) | 2025.06.27 |
---|