본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 12. 26. · 0 Views
BabyAGI 분석과 구현 완벽 가이드
자율적으로 작동하는 AI 에이전트 BabyAGI의 핵심 원리를 이해하고, 실제로 구현해봅니다. 태스크 생성, 우선순위 관리, 실행 루프를 직접 코드로 작성하며 AGI의 기초를 배웁니다.
목차
1. Task-driven Autonomous Agent
어느 날 김개발 씨는 회사에서 흥미로운 프로젝트 제안을 받았습니다. "AI가 스스로 할 일을 정하고 실행하는 시스템을 만들어보면 어떨까요?" 상사의 말에 김개발 씨는 호기심이 생겼습니다.
하지만 어디서부터 시작해야 할지 막막했습니다.
Task-driven Autonomous Agent는 주어진 목표를 달성하기 위해 스스로 작업을 생성하고, 우선순위를 정하며, 실행하는 AI 시스템입니다. 마치 프로젝트 매니저가 팀원들에게 업무를 분배하고 관리하는 것처럼, AI가 자율적으로 태스크를 관리합니다.
BabyAGI는 이러한 개념을 구현한 대표적인 오픈소스 프로젝트입니다.
다음 코드를 살펴봅시다.
# BabyAGI의 핵심 구조
class BabyAGI:
def __init__(self, objective):
self.objective = objective # 최종 목표
self.task_list = [] # 태스크 리스트
def run(self):
# 무한 루프로 자율 실행
while True:
# 1. 가장 높은 우선순위 태스크 가져오기
task = self.get_top_priority_task()
# 2. 태스크 실행
result = self.execute_task(task)
# 3. 결과 기반으로 새로운 태스크 생성
new_tasks = self.create_new_tasks(result)
# 4. 태스크 리스트 업데이트
self.update_task_list(new_tasks)
김개발 씨는 퇴근 후 BabyAGI에 대해 검색해보기 시작했습니다. 처음에는 복잡해 보였지만, 하나씩 뜯어보니 생각보다 단순한 원리로 동작했습니다.
다음 날 출근해서 선배 개발자 박시니어 씨를 찾아갔습니다. "선배님, BabyAGI가 뭔지는 알겠는데, 정확히 어떻게 동작하는 건가요?" 박시니어 씨는 웃으며 화이트보드로 다가갔습니다.
"좋은 질문이네요. 쉽게 설명해드릴게요." 그렇다면 Task-driven Autonomous Agent란 정확히 무엇일까요?
쉽게 비유하자면, 자율 에이전트는 마치 능력 있는 비서와 같습니다. 사장님이 "이번 달까지 매출 10% 늘려"라고 하면, 비서는 스스로 "광고 캠페인 기획하기", "고객 설문조사 실시하기", "프로모션 이벤트 준비하기" 같은 세부 업무를 만들어냅니다.
그리고 중요도에 따라 순서를 정해 하나씩 처리하죠. AI 에이전트도 똑같이 동작합니다.
왜 이런 시스템이 필요했을까요? 기존의 AI는 단발성 질문에만 답할 수 있었습니다.
"파이썬으로 파일 읽는 법 알려줘"라고 물으면 답은 주지만, 거기서 끝이었습니다. 더 큰 문제는 복잡한 프로젝트를 맡겼을 때였습니다.
"쇼핑몰 웹사이트 만들어줘"라고 하면 어디서부터 시작해야 할지 AI는 알 수 없었습니다. 사람처럼 단계별로 계획을 세우고 실행하는 능력이 없었던 것입니다.
바로 이런 문제를 해결하기 위해 BabyAGI가 등장했습니다. BabyAGI를 사용하면 자율적인 목표 달성이 가능해집니다.
또한 복잡한 작업을 작은 단위로 분해하는 능력도 얻을 수 있습니다. 무엇보다 사람의 개입 없이 연속적으로 작업을 진행한다는 큰 이점이 있습니다.
위의 코드를 한 줄씩 살펴보겠습니다. 먼저 초기화 부분에서 objective라는 최종 목표를 설정합니다.
이것이 AI가 달성해야 할 북극성입니다. 다음으로 run 메서드에서는 무한 루프가 돌아가며 태스크를 계속 처리합니다.
핵심은 결과를 바탕으로 새로운 태스크를 생성한다는 점입니다. 이것이 바로 자율성의 핵심입니다.
실제 현업에서는 어떻게 활용할까요? 예를 들어 시장 조사 보고서를 작성하는 업무를 생각해봅시다.
"AI 시장 트렌드 조사하기"라는 목표를 주면, BabyAGI는 "최신 AI 논문 검색", "주요 기업 동향 분석", "시장 규모 데이터 수집", "경쟁사 분석", "보고서 작성" 같은 세부 태스크를 스스로 만들어냅니다. 각 태스크를 실행하고, 그 결과를 바탕으로 또 다른 태스크를 추가합니다.
스타트업부터 대기업까지 이런 자동화 시스템을 연구하고 있습니다. 하지만 주의할 점도 있습니다.
초보 개발자들이 흔히 하는 실수 중 하나는 무한 루프 탈출 조건을 설정하지 않는 것입니다. 이렇게 하면 태스크가 끝없이 생성되어 비용이 폭발할 수 있습니다.
따라서 최대 반복 횟수나 목표 달성 조건을 명확히 설정해야 합니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
박시니어 씨의 설명을 들은 김개발 씨는 고개를 끄덕였습니다. "아, 그래서 Autonomous Agent라고 부르는군요!" Task-driven Autonomous Agent의 개념을 제대로 이해하면 더 지능적이고 자율적인 AI 시스템을 설계할 수 있습니다.
여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - 항상 명확한 목표(objective)를 설정하세요
- 무한 루프 방지를 위해 최대 반복 횟수를 제한하세요
- 태스크 실행 결과를 저장해 중복 작업을 방지하세요
2. 태스크 생성과 우선순위
김개발 씨는 BabyAGI의 기본 개념을 이해했지만, 여전히 궁금한 점이 있었습니다. "AI가 어떻게 스스로 태스크를 만들어내는 거지?" 박시니어 씨가 말했습니다.
"그게 바로 BabyAGI의 핵심이에요. LLM의 창의성과 벡터 데이터베이스의 기억력을 결합한 거죠."
태스크 생성과 우선순위 관리는 BabyAGI의 두뇌에 해당합니다. OpenAI의 GPT 모델이 현재 목표와 이전 결과를 분석해 새로운 태스크를 창조하고, 중요도에 따라 순서를 매깁니다.
이때 Pinecone 같은 벡터 데이터베이스가 과거 태스크와 결과를 기억해 문맥을 유지합니다.
다음 코드를 살펴봅시다.
import openai
from collections import deque
class TaskManager:
def __init__(self):
self.task_queue = deque([])
def create_tasks(self, objective, previous_result):
# GPT를 사용해 새로운 태스크 생성
prompt = f"""
목표: {objective}
이전 작업 결과: {previous_result}
위 결과를 바탕으로 다음에 수행할 작업 목록을 생성하세요.
각 작업은 한 줄로 작성하세요.
"""
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}]
)
# 응답을 파싱해 태스크 리스트로 변환
tasks = response.choices[0].message.content.split('\n')
return [t.strip() for t in tasks if t.strip()]
def prioritize_tasks(self, tasks):
# GPT를 사용해 우선순위 결정
prompt = f"다음 작업들의 우선순위를 1부터 매기세요:\n" + "\n".join(tasks)
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}]
)
# 우선순위가 높은 순으로 정렬된 태스크 반환
prioritized = response.choices[0].message.content.split('\n')
return prioritized
김개발 씨는 코드 에디터를 열고 실제로 태스크 생성 로직을 작성해보기 시작했습니다. 처음에는 단순히 GPT에게 "다음 할 일 알려줘"라고 물어보면 되는 줄 알았습니다.
하지만 실행해보니 문제가 생겼습니다. AI가 이전에 무슨 작업을 했는지 기억하지 못해 같은 태스크를 반복해서 생성했습니다.
당황한 김개발 씨는 다시 박시니어 씨를 찾아갔습니다. "선배님, 자꾸 같은 작업을 반복하는데 어떻게 해야 하나요?" 박시니어 씨는 고개를 끄덕이며 답했습니다.
"그래서 컨텍스트 관리가 중요한 거예요." 그렇다면 태스크 생성 시스템은 어떻게 설계해야 할까요? 쉽게 비유하자면, 태스크 생성은 마치 체스 게임과 같습니다.
체스 선수는 현재 판의 상태를 보고 다음 수를 결정합니다. 하지만 이전 수들을 기억하지 못한다면 같은 실수를 반복하겠죠.
BabyAGI도 마찬가지입니다. 이전 태스크와 결과를 기억해야 똑똑한 다음 행동을 선택할 수 있습니다.
컨텍스트 관리가 없던 초기 버전에서는 어땠을까요? 개발자들은 수동으로 프롬프트에 모든 히스토리를 복사 붙여넣기 해야 했습니다.
태스크가 10개, 20개로 늘어나면 프롬프트가 너무 길어져 토큰 제한에 걸렸습니다. 더 큰 문제는 관련 없는 오래된 태스크 정보까지 포함되어 AI가 혼란스러워한다는 점이었습니다.
효율성이 급격히 떨어졌습니다. 바로 이런 문제를 해결하기 위해 벡터 데이터베이스가 도입되었습니다.
Pinecone이나 Weaviate 같은 벡터 DB를 사용하면 의미적으로 유사한 과거 태스크만 검색할 수 있습니다. 또한 무제한으로 히스토리를 저장하면서도 빠른 검색이 가능합니다.
무엇보다 현재 상황과 관련 있는 정보만 가져와 프롬프트를 효율적으로 구성한다는 큰 이점이 있습니다. 위의 코드를 한 줄씩 살펴보겠습니다.
먼저 create_tasks 메서드는 목표와 이전 결과를 프롬프트에 포함시킵니다. 이것이 문맥을 제공하는 핵심입니다.
다음으로 GPT-4 모델을 호출해 응답을 받습니다. 여기서 중요한 점은 명확한 지시사항을 주는 것입니다.
"한 줄로 작성하세요"처럼 구체적으로 요청해야 파싱이 쉬워집니다. 마지막으로 prioritize_tasks에서 우선순위를 매깁니다.
실제 현업에서는 어떻게 활용할까요? 예를 들어 고객 지원 챗봇을 개발한다고 가정해봅시다.
"고객 만족도 개선"이라는 목표를 주면, 시스템은 "자주 묻는 질문 분석", "응답 시간 개선", "친절도 평가 시스템 구축" 같은 태스크를 생성합니다. 이때 벡터 DB에 저장된 과거 고객 문의 데이터를 참고해 더 정확한 우선순위를 매길 수 있습니다.
실제로 많은 SaaS 기업들이 이런 방식으로 고객 지원을 자동화하고 있습니다. 하지만 주의할 점도 있습니다.
초보 개발자들이 흔히 하는 실수 중 하나는 모든 히스토리를 프롬프트에 넣는 것입니다. 이렇게 하면 토큰 비용이 폭발하고 응답 속도가 느려집니다.
따라서 벡터 유사도 검색으로 상위 3-5개만 선택하는 것이 좋습니다. 또한 우선순위는 숫자로 명확히 표현하도록 GPT에게 지시해야 파싱 오류를 줄일 수 있습니다.
다시 김개발 씨의 이야기로 돌아가 봅시다. 벡터 DB를 추가한 후, 김개발 씨의 시스템은 훨씬 똑똑하게 동작하기 시작했습니다.
"오, 이제 중복 태스크가 안 생기네요!" 태스크 생성과 우선순위 관리를 제대로 이해하면 더 효율적이고 지능적인 자율 에이전트를 만들 수 있습니다. 여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - 벡터 DB를 활용해 관련 있는 히스토리만 검색하세요
- 프롬프트에 명확한 출력 형식을 지정하세요
- 우선순위는 숫자로 표현하도록 요청하세요
3. 실습: BabyAGI 구현
드디어 김개발 씨가 실제로 BabyAGI를 구현할 시간이 왔습니다. 박시니어 씨가 말했습니다.
"이론만 알면 뭐해요. 직접 만들어봐야죠!" 김개발 씨는 설레는 마음으로 새로운 파이썬 파일을 열었습니다.
BabyAGI 구현은 OpenAI API와 벡터 데이터베이스를 결합해 완전히 작동하는 자율 에이전트를 만드는 과정입니다. 태스크 생성 에이전트, 실행 에이전트, 우선순위 에이전트 세 가지 핵심 컴포넌트를 구현하고, 이들이 유기적으로 협력하도록 오케스트레이션합니다.
다음 코드를 살펴봅시다.
import openai
import pinecone
from collections import deque
class BabyAGI:
def __init__(self, objective, initial_task):
self.objective = objective
self.task_queue = deque([{"task_id": 1, "task_name": initial_task}])
self.task_id_counter = 1
# Pinecone 초기화
pinecone.init(api_key="your-api-key", environment="us-west1-gcp")
self.index = pinecone.Index("babyagi-tasks")
def task_creation_agent(self, result, task_description):
"""새로운 태스크를 생성하는 에이전트"""
prompt = f"""
최종 목표: {self.objective}
방금 완료한 작업: {task_description}
작업 결과: {result}
미완료 태스크 목록: {[t["task_name"] for t in self.task_queue]}
위 결과를 바탕으로 새로운 작업 목록을 생성하세요.
중복되지 않는 작업만 제안하세요.
"""
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=0.5
)
new_tasks = response.choices[0].message.content.strip().split('\n')
return [{"task_name": task} for task in new_tasks if task.strip()]
def execution_agent(self, task):
"""태스크를 실행하는 에이전트"""
# 벡터 DB에서 관련 컨텍스트 검색
context = self.get_context(task)
prompt = f"""
최종 목표: {self.objective}
현재 작업: {task}
관련 컨텍스트: {context}
위 작업을 수행하고 결과를 상세히 설명하세요.
"""
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=0.3
)
return response.choices[0].message.content
def get_context(self, query, top_k=5):
"""벡터 DB에서 관련 컨텍스트 검색"""
# 쿼리를 임베딩으로 변환
query_embedding = self.get_embedding(query)
# 유사한 과거 태스크 검색
results = self.index.query(query_embedding, top_k=top_k)
return [match["metadata"]["text"] for match in results["matches"]]
def get_embedding(self, text):
"""텍스트를 임베딩 벡터로 변환"""
response = openai.Embedding.create(
input=text,
model="text-embedding-ada-002"
)
return response["data"][0]["embedding"]
def run(self, max_iterations=10):
"""BabyAGI 메인 루프"""
iteration = 0
while self.task_queue and iteration < max_iterations:
iteration += 1
print(f"\n=== 반복 {iteration} ===")
# 1. 큐에서 태스크 가져오기
task = self.task_queue.popleft()
print(f"실행 중: {task['task_name']}")
# 2. 태스크 실행
result = self.execution_agent(task["task_name"])
print(f"결과: {result[:100]}...")
# 3. 결과를 벡터 DB에 저장
self.store_result(task["task_name"], result)
# 4. 새로운 태스크 생성
new_tasks = self.task_creation_agent(result, task["task_name"])
# 5. 태스크 큐에 추가
for new_task in new_tasks:
self.task_id_counter += 1
self.task_queue.append({
"task_id": self.task_id_counter,
"task_name": new_task["task_name"]
})
print(f"남은 태스크: {len(self.task_queue)}개")
def store_result(self, task, result):
"""태스크 결과를 벡터 DB에 저장"""
embedding = self.get_embedding(f"{task}: {result}")
self.index.upsert([(
str(self.task_id_counter),
embedding,
{"text": f"{task}: {result}"}
)])
# 사용 예시
if __name__ == "__main__":
baby = BabyAGI(
objective="파이썬으로 간단한 블로그 시스템 설계하기",
initial_task="필요한 기능 목록 작성하기"
)
baby.run(max_iterations=5)
김개발 씨는 드디어 모든 조각을 하나로 맞출 준비가 되었습니다. 지금까지 배운 개념들을 실제 코드로 구현하는 순간이었습니다.
화면에 코드를 타이핑하기 시작하자 손가락이 떨렸습니다. "정말 이게 작동할까?" 하는 의구심이 들었지만, 박시니어 씨가 옆에서 응원했습니다.
"걱정 마세요. 한 줄 한 줄 차근차근 작성하면 됩니다." 그렇다면 BabyAGI의 전체 구조는 어떻게 설계해야 할까요?
쉽게 비유하자면, BabyAGI는 마치 레스토랑 주방과 같습니다. 셰프(execution_agent)가 요리를 만들고, 주방장(task_creation_agent)이 다음 요리 순서를 정하며, 창고(Pinecone DB)가 재료와 레시피를 보관합니다.
이 세 가지가 유기적으로 협력해야 맛있는 요리가 나오듯, BabyAGI도 세 컴포넌트가 조화롭게 동작해야 합니다. 이런 구조가 확립되기 전에는 어땠을까요?
개발자들은 매번 수동으로 프롬프트를 작성하고, 결과를 복사해서 다음 프롬프트에 붙여넣어야 했습니다. 10단계만 진행해도 손목이 아플 정도였습니다.
더 큰 문제는 중간에 실수하면 처음부터 다시 시작해야 한다는 점이었습니다. 자동화가 절실했습니다.
바로 이런 문제를 해결하기 위해 완전 자동화된 BabyAGI가 만들어졌습니다. BabyAGI를 구현하면 사람의 개입 없이 연속 실행이 가능해집니다.
또한 벡터 DB 덕분에 과거 경험을 학습할 수 있습니다. 무엇보다 복잡한 프로젝트를 자동으로 분해하고 실행한다는 큰 이점이 있습니다.
위의 코드를 단계별로 살펴보겠습니다. 먼저 초기화 부분에서 Pinecone을 설정합니다.
API 키와 환경을 지정하는 것이 중요합니다. 다음으로 task_creation_agent는 GPT-4에게 새로운 태스크를 요청합니다.
프롬프트에 목표, 완료된 작업, 결과, 미완료 목록을 모두 포함시키는 것이 핵심입니다. execution_agent에서는 먼저 벡터 DB에서 관련 컨텍스트를 가져옵니다.
이것이 AI에게 기억력을 부여하는 비결입니다. 그리고 GPT-4로 태스크를 실행하고 결과를 받습니다.
run 메서드가 모든 것을 오케스트레이션합니다. 무한 루프 대신 max_iterations로 제한을 두어 비용 폭발을 방지합니다.
큐에서 태스크를 꺼내고, 실행하고, 결과를 저장하고, 새로운 태스크를 생성하는 사이클이 반복됩니다. 실제 현업에서는 어떻게 활용할까요?
예를 들어 신제품 출시 프로젝트를 관리한다고 가정해봅시다. "스마트워치 신제품 출시 준비"라는 목표를 주면, 시스템은 "시장 조사", "경쟁사 분석", "기능 명세 작성", "디자인 시안 준비", "마케팅 전략 수립" 같은 태스크를 자동으로 생성합니다.
각 태스크를 실행한 결과는 벡터 DB에 저장되어, 나중에 비슷한 프로젝트를 진행할 때 참고 자료로 활용됩니다. 실제로 프로젝트 관리 스타트업들이 이런 시스템을 도입하고 있습니다.
하지만 주의할 점도 있습니다. 초보 개발자들이 흔히 하는 실수 중 하나는 에러 처리를 생략하는 것입니다.
OpenAI API가 rate limit에 걸리거나 Pinecone 연결이 끊기면 프로그램이 멈춥니다. 따라서 try-except 블록과 재시도 로직을 반드시 추가해야 합니다.
또한 temperature 파라미터를 적절히 조절하세요. 창의성이 필요한 태스크 생성은 0.5, 정확성이 중요한 실행은 0.3 정도가 적당합니다.
다시 김개발 씨의 이야기로 돌아가 봅시다. 코드를 완성하고 실행 버튼을 눌렀을 때, 콘솔에 태스크들이 하나씩 출력되기 시작했습니다.
"와, 정말 작동하네요!" 김개발 씨는 감탄사를 터뜨렸습니다. BabyAGI 구현 방법을 제대로 이해하면 더 강력한 자율 에이전트를 만들 수 있습니다.
여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - max_iterations로 반드시 실행 횟수를 제한하세요
- 에러 처리와 재시도 로직을 추가하세요
- temperature 파라미터를 태스크 유형에 맞게 조절하세요
4. 실습: 커스터마이징
김개발 씨는 기본 BabyAGI를 성공적으로 구현했지만, 회사 프로젝트에 맞게 수정하고 싶었습니다. "선배님, 이걸 우리 업무에 특화시키려면 어떻게 해야 하나요?" 박시니어 씨가 웃으며 답했습니다.
"바로 그게 진짜 실력이에요. 커스터마이징 방법을 알려드릴게요."
BabyAGI 커스터마이징은 기본 프레임워크를 특정 도메인이나 업무에 최적화하는 과정입니다. 커스텀 프롬프트 템플릿, 도메인별 에이전트, 외부 도구 통합, 결과 필터링 로직을 추가해 더 실용적인 시스템을 만들 수 있습니다.
다음 코드를 살펴봅시다.
class CustomBabyAGI(BabyAGI):
def __init__(self, objective, initial_task, domain="general"):
super().__init__(objective, initial_task)
self.domain = domain
self.tools = self.load_domain_tools()
def load_domain_tools(self):
"""도메인별 외부 도구 로드"""
tools = {
"web_scraping": {
"search": self.web_search,
"scrape": self.web_scrape
},
"data_analysis": {
"pandas": self.run_pandas_code,
"visualize": self.create_chart
},
"code_generation": {
"execute": self.execute_code,
"test": self.run_tests
}
}
return tools.get(self.domain, {})
def execution_agent(self, task):
"""도메인 특화 실행 에이전트"""
# 먼저 도구 사용 여부 판단
tool_decision = self.should_use_tool(task)
if tool_decision["use_tool"]:
# 외부 도구 실행
tool_name = tool_decision["tool_name"]
tool_result = self.tools[tool_name](task)
# GPT에게 도구 결과 해석 요청
prompt = f"""
작업: {task}
도구 실행 결과: {tool_result}
위 결과를 분석하고 다음 단계를 제안하세요.
"""
else:
# 일반 GPT 실행
context = self.get_context(task)
prompt = f"""
도메인: {self.domain}
최종 목표: {self.objective}
현재 작업: {task}
관련 컨텍스트: {context}
위 작업을 {self.domain} 관점에서 수행하세요.
"""
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=0.3
)
return response.choices[0].message.content
def should_use_tool(self, task):
"""도구 사용 여부 판단"""
prompt = f"""
작업: {task}
사용 가능한 도구: {list(self.tools.keys())}
위 작업을 수행하기 위해 도구가 필요한가요?
필요하다면 어떤 도구를 사용해야 하나요?
JSON 형식으로 답변하세요:
{{"use_tool": true/false, "tool_name": "도구이름"}}
"""
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=0.1
)
import json
return json.loads(response.choices[0].message.content)
def web_search(self, query):
"""웹 검색 도구"""
import requests
# Google Custom Search API 사용
api_key = "your-google-api-key"
search_engine_id = "your-search-engine-id"
url = f"https://www.googleapis.com/customsearch/v1?key={api_key}&cx={search_engine_id}&q={query}"
response = requests.get(url)
results = response.json()
# 상위 3개 결과 반환
return [item["snippet"] for item in results.get("items", [])[:3]]
def run_pandas_code(self, task):
"""Pandas 코드 실행 도구"""
# GPT에게 Pandas 코드 생성 요청
prompt = f"다음 작업을 수행하는 Pandas 코드를 작성하세요: {task}"
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}]
)
code = response.choices[0].message.content
# 코드 실행 (샌드박스 환경에서)
import pandas as pd
local_vars = {"pd": pd}
exec(code, {}, local_vars)
return local_vars.get("result", "실행 완료")
def task_creation_agent(self, result, task_description):
"""도메인 특화 태스크 생성"""
# 결과 품질 평가
quality_score = self.evaluate_result(result)
if quality_score < 0.7:
# 품질이 낮으면 재작업 태스크 생성
return [{"task_name": f"{task_description} 재검토 및 개선"}]
# 일반 태스크 생성
prompt = f"""
도메인: {self.domain}
최종 목표: {self.objective}
완료 작업: {task_description}
결과: {result}
결과 품질: {quality_score}
다음 작업 목록을 {self.domain}에 특화되게 생성하세요.
"""
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=0.5
)
new_tasks = response.choices[0].message.content.strip().split('\n')
return [{"task_name": task} for task in new_tasks if task.strip()]
def evaluate_result(self, result):
"""결과 품질 평가"""
prompt = f"""
다음 결과의 품질을 0.0에서 1.0 사이로 평가하세요:
{result}
평가 기준:
- 완성도
- 정확성
- 목표와의 관련성
숫자만 답변하세요.
"""
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=0.1
)
return float(response.choices[0].message.content.strip())
# 사용 예시
if __name__ == "__main__":
# 데이터 분석 특화 BabyAGI
baby = CustomBabyAGI(
objective="고객 이탈률 분석 보고서 작성",
initial_task="데이터셋 로드 및 기본 통계 확인",
domain="data_analysis"
)
baby.run(max_iterations=10)
김개발 씨는 이제 BabyAGI의 진정한 힘을 발휘할 준비가 되었습니다. 범용 시스템도 좋지만, 회사의 특정 업무에 딱 맞게 조정하면 훨씬 더 강력해질 것이라는 확신이 들었습니다.
박시니어 씨가 화면을 가리키며 설명했습니다. "여기를 보세요.
우리 회사는 데이터 분석을 많이 하잖아요? 그러면 Pandas나 matplotlib 같은 도구를 BabyAGI에 직접 연결하는 겁니다." 김개발 씨의 눈이 반짝였습니다.
"아, AI가 필요할 때 스스로 코드를 실행할 수 있게 하는 거군요!" 그렇다면 커스터마이징은 어떻게 접근해야 할까요? 쉽게 비유하자면, 커스터마이징은 마치 스마트폰에 앱을 설치하는 것과 같습니다.
기본 스마트폰도 유용하지만, 내비게이션 앱, 음악 앱, 운동 앱을 설치하면 내 생활에 딱 맞는 도구가 됩니다. BabyAGI도 마찬가지입니다.
외부 도구를 플러그인처럼 연결하면 범용 에이전트가 도메인 전문가로 변신합니다. 외부 도구 통합이 없던 초기 버전에서는 어땠을까요?
AI는 오직 텍스트만 생성할 수 있었습니다. "판매 데이터를 분석하세요"라고 하면 "데이터를 로드하고 통계를 계산하세요"라는 지시만 할 뿐, 실제로 코드를 실행하지는 못했습니다.
개발자가 AI의 지시를 보고 수동으로 코드를 작성해야 했습니다. 자동화라고 하기엔 너무 많은 사람의 개입이 필요했습니다.
바로 이런 문제를 해결하기 위해 도구 통합 기능이 추가되었습니다. 도구를 통합하면 AI가 직접 코드를 실행할 수 있습니다.
또한 웹 검색, 데이터 분석, API 호출까지 자동으로 처리됩니다. 무엇보다 결과를 즉시 평가하고 개선할 수 있다는 큰 이점이 있습니다.
위의 코드를 단계별로 살펴보겠습니다. 먼저 load_domain_tools에서 도메인별로 사용할 도구를 정의합니다.
웹 스크래핑, 데이터 분석, 코드 생성 등 업무 영역에 따라 다른 도구 세트를 준비합니다. 다음으로 should_use_tool에서 GPT에게 도구 사용 여부를 판단하게 합니다.
이것이 핵심입니다. AI가 스스로 "이 작업은 웹 검색이 필요해"라고 결정하는 것입니다.
execution_agent는 도구 결정에 따라 분기합니다. 도구가 필요하면 실제 함수를 호출하고, 그 결과를 GPT에게 다시 해석시킵니다.
이렇게 하면 AI의 추론과 실제 도구의 실행이 결합됩니다. evaluate_result는 품질 관리의 핵심입니다.
결과를 0.0에서 1.0 사이로 평가해 일정 기준 이하면 재작업 태스크를 생성합니다. 이것이 자체 개선 루프를 만듭니다.
실제 현업에서는 어떻게 활용할까요? 예를 들어 마케팅 부서에서 경쟁사 분석 보고서를 작성한다고 가정해봅시다.
"경쟁사 A의 최신 마케팅 전략 분석"이라는 목표를 주면, 시스템은 먼저 웹 검색 도구로 경쟁사 뉴스를 수집합니다. 그 다음 데이터 분석 도구로 소셜 미디어 언급량을 그래프화합니다.
마지막으로 GPT가 종합 보고서를 작성합니다. 모든 과정이 자동으로 진행되며, 품질이 낮으면 스스로 재작업합니다.
실제로 컨설팅 회사들이 이런 시스템을 리서치 자동화에 활용하고 있습니다. 하지만 주의할 점도 있습니다.
초보 개발자들이 흔히 하는 실수 중 하나는 코드 실행 시 보안을 고려하지 않는 것입니다. AI가 생성한 코드를 무분별하게 exec으로 실행하면 시스템이 해킹당할 수 있습니다.
따라서 샌드박스 환경이나 Docker 컨테이너에서 실행해야 합니다. 또한 도구 호출 횟수를 제한하세요.
무한 루프에 빠져 API 비용이 폭발할 수 있습니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
데이터 분석 특화 BabyAGI를 실행하자, 시스템은 스스로 Pandas 코드를 작성하고 실행해 고객 이탈률 그래프까지 생성했습니다. "이건 정말 마법 같아요!" 김개발 씨는 감탄을 금치 못했습니다.
BabyAGI 커스터마이징 방법을 제대로 이해하면 업무에 특화된 강력한 AI 어시스턴트를 만들 수 있습니다. 여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - 코드 실행은 반드시 샌드박스 환경에서 하세요
- 도구 호출 횟수를 제한해 비용을 관리하세요
- 결과 품질 평가를 추가해 자체 개선 루프를 만드세요
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
Code Agent 구축 완벽 가이드
LLM을 활용하여 자율적으로 코드를 작성하고, 테스트하며, 디버깅하는 Code Agent를 처음부터 끝까지 구축하는 실전 가이드입니다. GitHub 통합까지 완성합니다.
AutoGPT 분석과 구현 완벽 가이드
AutoGPT의 아키텍처를 분석하고 직접 Mini AutoGPT를 구현해봅니다. 자율 목표 달성 시스템의 원리를 이해하고 실전 프로젝트에 적용할 수 있는 실력을 키웁니다.
Human-in-the-Loop Agents 완벽 가이드
AI 에이전트가 중요한 결정을 내리기 전에 사람의 승인을 받는 시스템을 구축하는 방법을 배웁니다. 실무에서 안전하고 신뢰할 수 있는 AI 에이전트를 만드는 핵심 패턴을 소개합니다.
Agent Orchestration 완벽 가이드
여러 AI 에이전트를 효율적으로 조율하고 관리하는 방법을 배웁니다. 에이전트 라우팅부터 동적 선택, 워크플로 관리까지 실무에서 바로 사용할 수 있는 오케스트레이션 기법을 다룹니다.
Swarm Intelligence 분산 처리 완벽 가이드
집단 지성 패턴으로 대규모 작업을 분산 처리하는 방법을 배웁니다. 여러 에이전트가 협력하여 복잡한 문제를 해결하는 실전 기법을 익힐 수 있습니다. 초급 개발자도 쉽게 따라할 수 있는 실습 예제를 포함합니다.