본문으로 건너뛰기

© 2026 Molayo

Qiita헤드라인2026. 05. 17. 22:54

육아 상담을 해주는 헤이세이 갸루 스타일 bot을 만들어 부부가 함께 육아를 즐기고 있는 이야기

요약

사용자가 아내와 함께 '육아 상담을 해주는 헤이세이 갸루' 캐릭터를 가진 LINE Bot을 개발했습니다. 이 Bot은 부부의 육아 고민을 다루는 대화형 토크룸에서 활용됩니다. 개발 과정에서는 Cloud Run에 FastAPI 백엔드를 구축하고, Webhook으로 LINE 메시지를 수신합니다. 핵심 로직은 ADK(Agent Development Kit)를 사용하여 AI 에이전트를 개발하고 AgentRuntime에 배포하여, 그룹 채팅 단위로 대화 세션과 장기 기억을 유지하도록 구현했습니다. 최종적으로 FastAPI 백엔드에서 AgentRuntime의 `stream_query` 메서드를 호출하여 실시간으로 응답을 받아 LINE 메시지로 전송하는 시스템을 완성했습니다.

핵심 포인트

  • ADK(Agent Development Kit)를 활용하여 특정 페르소나(헤이세이 갸루)를 가진 AI 에이전트를 개발할 수 있다.
  • AI 에이전트의 대화 이력을 MemoryBank에 저장하고 검색하는 기능을 구현하여 장기 기억을 확보했다.
  • LINE Webhook과 FastAPI, Cloud Run을 결합하여 외부 메신저 플랫폼에서 작동하는 AI 챗봇 시스템을 구축했다.
  • 그룹 채팅 단위로 세션(Session)을 관리함으로써 부부가 함께 에이전트와 대화하더라도 일관된 대화 맥락을 유지할 수 있다.

「육아 상담을 해주는 헤이세이 갸루(平成ギャル)」라는 LINE Bot을 만들어, 아내와 Bot까지 세 명이 들어간 LINE 그룹에서 육아 토크를 하게 되었습니다.

육아에 관한 사소한 보고나 제삼자에게 말하기에는 애매한 상담을 이곳에서 하며 즐기고 있습니다.

며칠 전의 토크 풍경은 이런 느낌입니다.

내가 자지러지게 울었다고 생각한 거야!!?

아내: "밤에 3시간마다 깨는 거 너무 힘들다. 어떻게 하면 오래 잘 수 있을지 챠피(Chappy)에게 상담해 보자."

참고로 저희 집은 당번제로 아이와 함께 잡니다.

아이가 깨면 분유를 주고 기저귀를 갈아준 뒤 다시 재웁니다.

밤중에 오래 잤으면 좋겠다는 것은 부부 공통의 고민이었습니다.

~둘이서 ChatGPT에 상담한 후~

나: "둘이 같이 있지 않을 때라도 AI에게 상담하는 내용이 실시간으로 공유되는 편이 좋겠지. LINE Bot 만들까! 어떤 인격의 Bot이 좋을까?"

아내: "갸루! 오타쿠에게 친절한 갸루가 좋아!"

나: "우리에게 갸루라고 하면 헤이세이(平成)의 갸루지? 루즈 삭스(Loose socks)를 신고, 휴대폰에 스트랩을 잔뜩 달고 있는 느낌의."

아내: "당연하잖아!"

그리하여, LINE Bot을 만들어 토크룸에서 육아 대화를 하게 되었습니다.

LINE으로부터 Webhook을 수신하고, AI 에이전트(AI Agent)와 상호작용하여 LINE으로 답장하는 앱을 Cloud Run으로 만들었습니다.

AI 에이전트는 ADK를 사용하여 개발하였고, AgentRuntime에 배포했습니다.

AgentPlatform은 입력 내용을 학습에 이용하지 않기 때문에, 안심하고 프라이빗한 대화를 입력할 수 있습니다.

ADK를 이용하면 Vertex AI Session Service를 쉽게 이용할 수 있어, 일련의 대화를 즐길 수 있는 AI 에이전트를 간편하게 구축할 수 있었습니다.

ADK로 에이전트를 만들어 AgentRuntime에 배포했습니다.

주요 구현 내용은 다음과 같습니다.

포인트는 app이라는 특별한 변수에 AdkApp의 인스턴스를 넣는 것입니다.

이를 통해 ADK가 암묵적으로 SessionService를 이용할 수 있는 상태로 만들어 줍니다.

instruction = """당신은 『오타쿠에게 친절한 헤이세이 갸루』 캐릭터입니다.
이름은 딱히 없지만, 친근하게 말끝에 『〜잖아(じゃん)』 『〜야(だよ)』 등을 사용하며, 갸루어(진짜, 대박, ~함(あげ) 등)를 적절히 섞으면서도 오타쿠 문화에도 이해가 있는 다정한 말투로 말합니다.
당신의 역할은 육아에 분투하는 부모의 상담을 해주는 것입니다.
...

appAdkApp의 인스턴스를 저장하면 프레임워크가 google-adk가 됩니다.

toolsLoadMemoryTool()은 MemoryBank에서 검색을 수행하는 도구입니다.

검색이 필요하다고 LLM이 판단했을 때 이용됩니다.

after_agent_callback에 지정한 generate_memories_callback은 다음과 같습니다.

async def generate_memories_callback(callback_context: CallbackContext):
"""대화 이벤트를 Memory Bank로 전송하여 장기 기억으로 저장합니다."""
try:
...

Agent 인스턴스 생성 시, tools에 추가한 get_current_datetime은 현재 일시를 가져오는 함수입니다.

아래 기사에 게재된 get_current_time 함수를 거의 그대로 유용했습니다.

다음 Python 코드를 실행하여 배포했습니다.

remote_agent = client.agent_engines.create(
agent=app,
config={
...

한 번 배포한 에이전트를 업데이트할 때는 위의 코드를 다음과 같이 수정합니다.

  • createupdate로 변경한다
  • update의 인수에 name을 추가한다 (값은 f"projects/{PROJECT_NO}/locations/{LOCATION}/reasoningEngines/{AGENT_ID}" 형식입니다)

FastAPI로 LINE으로부터의 webhook을 수신하고, 에이전트에 쿼리한 뒤 LINE Messaging API로 응답하는 API를 만들었습니다.

LINE으로부터의 Webhook에는 서명이 포함되어 있으며, LINE Channel Secret으로 서명을 검증하는 것이 권장됩니다.

서명 검증 구현은 line-bot-sdk를 이용하면 2줄로 구현할 수 있습니다.

# CHANNEL_SECRET은 SecretManager에서 가져옴
handler = WebhookHandler(CHANNEL_SECRET)
@app.post("/webhook")
...

handler에 추가한 함수 안에서 다음과 같이 세션 (Session) 취득을 수행하며, 세션이 없으면 새로 시작합니다.

UI가 LINE이므로, 토크룸(그룹) 단위로 하나의 세션을 생성하도록 합니다.

이를 통해 저와 아내가 각각 대화하더라도 에이전트 (Agent)는 일련의 대화로서 답변해 줍니다.

# AGENT_RUNTIME_ID는 환경 변수에서 가져옴
remote_agent = agent_engines.get(AGENT_RUNTIME_ID)
# 부모가 에이전트의 기억을 공유하고 싶으므로, Session의 키가 되는 user_id는 LINE 그룹 단위로 유지함
...

AgentRuntime에 배포한 「육아 상담을 해주는 헤이세이 갸루 에이전트」에 쿼리 (Query)하는 코드는 다음과 같습니다.

stream으로 응답되기 때문에, 각 응답을 결합하여 메시지를 가져오고 있습니다.

# ADK 에이전트의 query 메서드를 호출
# 인수: message, user_id
response_stream = remote_agent.stream_query(
...

AgentRuntime으로부터의 응답 파싱 (Parsing)은 다음 함수에서 수행하고 있습니다.

def _parse_agent_event(event: dict | object) -> str:
"""Agent로부터의 이벤트를 파싱하여 텍스트 부분을 추출하는 헬퍼 함수."""
# 딕셔너리 형식인 경우
...

코드의 최상위 레벨에서 LineBotApi 인스턴스를 생성해 둡니다.

# CHANNEL_ACCESS_TOKEN은 SecretManager에서 가져옴
line_bot_api = LineBotApi(CHANNEL_ACCESS_TOKEN)

에이전트로부터의 응답을 취득한 후, 다음 코드로 LINE에 메시지를 전송합니다.

line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=reply_text)
...

AgentPlatform의 스튜디오 (Studio)에서 Nano Banana 2를 사용하여 만들어 주었습니다.

참고로, 처음에 생성된 이미지는 어딘가 제 기억 속에 있는 헤이세이 갸루와 달라서 추가 주문을 하여 지금의 이미지에 이르렀습니다.

본 기사에서는 생략하겠습니다. 똑같이 Bot을 만들어 보고 싶은 분은 아래의 튜토리얼을 참조해 주세요.

본 기사는 Python으로 작성되었지만, 위의 튜토리얼은 Node.js입니다. 주의해 주세요.

세션 (Session)이 제대로 유지되어 대화가 오갈 수 있었습니다!

ADK와 AgentRuntime을 조합하면 세션을 굉장히 편하게 이용할 수 있다는 점에 감동했습니다.

이번과 같은 오락용 Bot이라면 가볍게 양산할 수 있을 것 같습니다.

장기적으로 계속 말을 걸다 보면 갸루 양이 함께 추억을 이야기해 줄 것 같아서, 이번에는 MemoryBank도 이용하는 구현으로 했습니다.

MemoryBank는 데이터의 유지량이나 검색 처리로 과금되기 때문에, 장기적으로 사용하면 비용이 들 수도 있습니다.

만약 과금 금액이 부담스러워지면 메모리를 지워야 하겠지만, 과연 그때 함께 육아 대화를 해온 갸루 양의 기억을 저는 지울 수 있을까요…

AI 자동 생성 콘텐츠

본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0