내가 첫 번째 AI 에이전트를 구축한 방법
요약
사용자가 터미널 환경에서 자연어로 일정을 관리할 수 있는 개인용 AI 에이전트 구축 과정을 소개합니다. Strands Agents 라이브러리를 활용하여 모델, 도구, 지침을 연결하는 구조를 설명하며, 개인정보 보호를 위해 Ollama를 통한 로컬 모델 실행 방식과 성능 향상을 위한 Amazon Bedrock 전환 방법을 다룹니다.
핵심 포인트
- Strands Agents를 사용하여 모델, 도구, 시스템 프롬프트를 결합한 에이전트 구현 가능
- 에이전트가 데이터베이스에 직접 접근하는 대신 TerminalUI에 작업을 요청하는 안전한 아키텍처 채택
- Ollama를 활용하여 Llama 3.2와 같은 로컬 모델을 사용함으로써 개인정보 보호 강화
- 필요에 따라 Amazon Bedrock으로 전환하여 추론 및 도구 사용 성능 확장 가능
나는 나의 하루를 더 잘 정리하고 싶습니다. 할 일, 회의, 마감 기한 등이 있으며, 무언가를 잊어버릴 때까지 이 모든 것이 내 머릿속에만 존재합니다. 다만 한 가지 세부 사항이 있는데, 나는 터미널 (terminal)에 있고 CLI 도구들을 사용하는 것을 매우 좋아한다는 점입니다. 그래서 생각했습니다. '만약 내가 터미널에 "내일 오전 10시에 회의를 잡아줘"라고 말하면, 그것이 그냥 실행되게 할 수 있다면 어떨까?' 내가 어떻게 나만의 에이전트 (agent)를 구축했는지, 어떤 결정을 내렸는지, 그리고 내부적으로 어떻게 작동하는지 보여드리겠습니다.
-
내가 구축한 것
내 터미널에서 실행되는 데이 오거나이저 (day organizer)입니다. 내가 자연어 (natural language)로 말할 수 있는 채팅창과 나의 할 일, 캘린더, 그리고 다음 일정들을 보여주는 패널들이 있습니다. 흥미로운 점은 그 이면에 있는 것입니다. 즉, 내가 요청하는 것을 이해하고, 무엇을 할지 결정하며, 내 데이터에 따라 행동하는 AI 에이전트 (AI agent)입니다. 에이전트는 데이터베이스 (database)에 직접 접근하지 않습니다. 작업이나 이벤트를 생성해야 할 때, TerminalUI에 그 작업을 요청합니다. 단일 프로세스가 데이터를 제어하며, 에이전트는 사용자를 이해하는 데 집중합니다. 이 글에서는 에이전트에 초점을 맞추어, 어떻게 구축했는지, 어떤 구성 요소들을 가지고 있는지, 그리고 각각이 어떻게 작동하는지에 대해 다룹니다. -
Strands Agents를 이용한 에이전트 생성
에이전트는 모델 (model), 도구 (tools), 그리고 지침 (instructions)이라는 세 가지 주요 구성 요소를 가집니다. Strands Agents는 이러한 요소들을 직접 연결할 수 있는 방법을 제공합니다:
from strands import Agent
from strands_tools import current_time , file_read , file_write
agent = Agent (
model = modelo ,
tools = [ current_time , create_task , create_event , ...],
system_prompt = " Eres un asistente que organiza el día del usuario... "
)
이 몇 줄의 코드만으로 기능하는 에이전트를 가질 수 있습니다. 모델을 전달하고, 도구를 제공하며, 지침을 정의하면 Strands가 루프 (loop)를 담당합니다.
- 모델 선택하기
나의 첫 번째 요구 사항은 개인정보 보호 (privacy)였습니다. 나의 할 일들은 개인적인 것이기에, 이를 외부 서버로 보내고 싶지 않았습니다. 그래서 Ollama를 사용하여 로컬 모델 (local model)로 시작했습니다.
옵션 1: Ollama를 사용한 로컬 모델 (local model)
from strands.models.ollama import OllamaModel
modelo = OllamaModel (
model_id = "llama3.2:3b",
host = "http://localhost:11434",
max_tokens = 4096,
)
에이전트가 제 컴퓨터에서 실행되는 모델을 사용하므로, 제 정보가 인터넷으로 나가지 않습니다. 아직 파운데이션 모델 (foundation models)을 로컬에서 실행하는 것이 어렵다는 점은 알고 있지만, Can I Run AI를 통해 귀하의 하드웨어가 어떤 모델을 지원하는지 확인할 수 있습니다.
옵션 2: 더 강력한 성능을 원하시나요?
더 나은 추론 (reasoning)이나 더 나은 도구 사용 (tool use) 능력이 필요하고 AWS 계정이 있다면, 단 한 줄의 코드로 Amazon Bedrock으로 전환할 수 있습니다:
from strands.models import BedrockModel
modelo = BedrockModel ()
흥미로운 점을 하나 주목해 보세요. 나머지 코드는 바뀌지 않습니다. 도구 (tools), 시스템 프롬프트 (system prompt), 로직 등 모든 것이 그대로 유지되며 오직 모델만 바뀝니다. Strands는 이러한 복잡성을 추상화하며, 좋은 소식은 제가 언급한 것보다 더 많은 모델 제공자 (model providers)를 지원한다는 것입니다. Gemini, OpenAI, Anthropic은 지원되는 것 중 일부일 뿐이며, 전체 목록은 여기서 확인할 수 있습니다. 저는 일상적인 용도로는 Ollama를 사용하고, 에이전트가 더 복잡한 작업을 처리해야 할 때는 Bedrock을 사용합니다.
- 도구 (Tools)
도구가 없다면 제 에이전트는
def query_tasks ( date : str ) -> str : # <- 2. # 3. """ 특정 날짜의 데이터베이스에서 작업을 검색합니다. 사용자가 특정 날짜의 작업에 대해 물어볼 때 이 도구를 사용하세요. """ #4. tasks = db . query ( f " SELECT * FROM tasks WHERE date = ' { date } '" ) return str ( tasks )
무슨 일이 일어나고 있는지 주목하세요:
@tool은 Strands에게 이 함수가 에이전트에서 사용 가능하다는 것을 알려줍니다. 타입 힌트 (Type hints)는 모델이 제공해야 하는 매개변수를 정의합니다. 독스트링 (Docstring)은 매우 중요합니다. Strands는 이를 사용하여 모델에게 도구가 무엇을 하는지, 그리고 언제 사용해야 하는지를 알려줍니다. 본문은 일반적인 Python 코드입니다.
강력한 점은 다음과 같습니다: 당신이 에이전트가 무엇을 할 수 있는지 정의하면, 모델이 그것을 언제 할지 결정합니다. 저는 결코 "사용자가 X라고 말하면 create_task를 호출해"라고 말하지 않습니다. 모델이 스스로 추론하고 결정합니다. 제 프로젝트에는 16개의 커스텀 도구가 있습니다. 하지만 모든 도구에 적용되는 원칙은 동일합니다: @tool, 명확한 독스트링 (Docstring), 그리고 본문의 로직입니다.
- 시스템 프롬프트 (System Prompt)
시스템 프롬프트 (System prompt)는 모델이 받는 첫 번째 프롬프트이며, 우리 에이전트가 어떻게 행동할지를 정의합니다. 여기에 비즈니스 규칙이 담기며, 이것이 무작위로 행동하는 에이전트와 예측 가능한 방식으로 행동하는 에이전트의 차이를 만듭니다.
system_prompt = """ 당신은 나의 개인 생산성 비서입니다. 나의 하루를 정리하고, 작업을 검토하며, 일정을 계획하는 것을 도와주세요. 간결하고 실용적으로 답변하세요. """
-
작동하는 루프 (The loop in action)
모든 것을 종합해 봅시다. 제가 에이전트에게 "내일 오전 10시에 팀 회의를 잡아줘"라고 말합니다. -
메시지를 받습니다. 에이전트가 사용자의 요청을 읽습니다.
-
생각합니다. 오늘이 몇 일인지 확인하고 추론합니다: "내일은 2026-05-08이고, 오전 10시에 이벤트를 원한다."
-
행동합니다.
create_event를 호출하면, 도구가 SQLite에 이벤트를 저장하고 결과를 반환합니다. -
관찰합니다. 이벤트가 ID 7로 생성되었습니다.
-
응답합니다. "알겠습니다, 내일 5월 8일 오전 10시에 팀 회의를 예약했습니다."
당신만의 에이전트를 구축하세요. Strands의 에이전트는 세 가지 요소로 구성됩니다:
- 모델 (Model): 추론을 담당하는 두뇌
- 도구 (Tools): 실행할 수 있는 동작
- 시스템 프롬프트 (System Prompt): 규칙과 페르소나
2~3개의 도구를 가진 에이전트만으로도 실제 문제를 해결할 수 있습니다:
- Markdown 노트를 관리하는 에이전트
- AWS 서비스 상태를 조회하는 에이전트
- 날짜와 장소별로 사진을 정리하는 에이전트
패턴은 항상 동일합니다. 모델을 선택하고, @tool로 도구를 정의하며, 명확한 규칙이 담긴 시스템 프롬프트를 작성한 뒤, Strands가 루프 (Loop)를 처리하도록 맡기면 됩니다. Strands Agents는 오픈 소스 (Open source)이며 몇 분 안에 시작할 수 있는 문서가 마련되어 있습니다. 제가 만든 오거나이저의 코드는 GitHub에 있습니다.
자주 묻는 질문 (FAQ)
Q: 로컬에서 에이전트를 실행하는 데 비용이 얼마나 드나요?
A: 전혀 들지 않습니다. Ollama와 Llama 3.2를 사용하면 모든 것이 비용 없이 사용자의 기기에서 실행됩니다. Bedrock을 사용한다면 처리된 토큰 (Token)에 따라 비용을 지불하지만, 개인적인 용도로는 매우 경제적입니다.
Q: 에이전트가 실수할 수도 있나요?
A: 네. 때로는 날짜를 잘못 해석하거나 잘못된 도구를 선택할 수 있습니다. 그렇기 때문에 명확한 규칙이 담긴 시스템 프롬프트가 중요하며, 도구들이 동작하기 전에 입력을 검증해야 하는 이유이기도 합니다.
Q: 다른 프레임워크 (Framework)를 사용할 수 있나요?
A: 네. 개념(모델 + 도구 + 프롬프트 + 루프)은 보편적입니다. 제가 Strands를 선택한 이유는 단순하고, 오픈 소스이며, 각 요소를 직접 제어할 수 있기 때문입니다.
결론
저는 터미널을 벗어나지 않고 하루를 정리하고 싶다는 단순한 문제에서 시작했습니다. 결국 자연어를 이해하고, 상대적인 날짜를 해결하며, 저의 작업과 이벤트를 관리하는 AI 에이전트를 구축하게 되었습니다.
핵심 요소:
- 모델 (Model): 두뇌. 로컬용으로는 Ollama, 클라우드용으로는 Bedrock을 사용합니다. Strands를 사용하면 코드를 다시 작성하지 않고도 교체가 가능합니다.
- 도구 (Tools): 손. 에이전트가 무엇을 할 수 있는지 정의하는
@tool이 포함된 Python 함수입니다. - 시스템 프롬프트 (System Prompt): 판단 기준. 에이전트를 예측 가능하고 유용하게 만드는 구체적인 규칙입니다.
- 루프 (Loop): Strands가 '생각하기(Think) → 행동하기(Act) → 관찰하기(Observe)' 사이클을 자동으로 관리합니다.
모델 하나, 도구 두 개, 그리고 명확한 프롬프트로 시작하세요. 그 다음 반복하며 개선해 나가면 됩니다. 다음 글에서 뵙겠습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기