아그노와 밀버스로 프로덕션 준비된 멀티 에이전트 시스템을 구축하는 방법
AI 에이전트를 구축해 본 적이 있다면 데모는 훌륭하게 작동하지만 프로덕션에 적용하는 것은 완전히 다른 이야기라는 벽에 부딪힌 적이 있을 것입니다.
이전 게시물에서 에이전트 메모리 관리와 순위 재지정에 대해 다루었습니다. 이제 실제로 프로덕션 환경에서 에이전트를 구축하는 더 큰 문제를 해결해 보겠습니다.
현실은 이렇습니다. 프로덕션 환경은 지저분합니다. 단일 에이전트로는 거의 해결되지 않기 때문에 멀티 에이전트 시스템이 어디에나 존재합니다. 하지만 현재 사용 가능한 프레임워크는 데모는 잘 되지만 실제 부하가 걸리면 중단되는 가벼운 프레임워크와 학습과 구축에 오랜 시간이 걸리는 강력한 프레임워크의 두 가지 진영으로 나뉘는 경향이 있습니다.
저는 최근 아그노를 실험해 봤는데, 과도한 복잡성 없이 프로덕션 준비에 초점을 맞춘 합리적인 중간 지점에 있는 것 같습니다. 이 프로젝트는 몇 달 만에 37,000개 이상의 GitHub 별을 얻었으며, 다른 개발자들도 유용하다고 생각하는 것으로 보입니다.
이 글에서는 Milvus를 메모리 레이어로 사용하는 Agno를 사용하여 멀티 에이전트 시스템을 구축하면서 배운 점을 공유하고자 합니다. LangGraph와 같은 대안과 Agno를 어떻게 비교하는지 살펴보고 직접 사용해 볼 수 있는 완전한 구현 과정을 안내해 드리겠습니다.
아그노란 무엇인가요?
아그노는 프로덕션용으로 특별히 제작된 멀티에이전트 프레임워크입니다. 이 프레임워크는 두 가지 레이어로 구성되어 있습니다:
아그노 프레임워크 레이어: 에이전트 로직을 정의하는 곳
AgentOS 런타임 레이어: 해당 로직을 실제로 배포할 수 있는 HTTP 서비스로 전환합니다.
프레임워크 계층은 에이전트가 수행해야 할 작업을 정의하고, AgentOS는 해당 작업이 실행 및 제공되는 방식을 처리합니다.
프레임워크 계층
이것은 상담원이 직접 작업하는 것입니다. 여기에는 세 가지 핵심 개념이 도입됩니다:
에이전트: 특정 유형의 작업을 처리합니다.
팀: 여러 에이전트를 조정하여 복잡한 문제를 해결합니다.
워크플로: 실행 순서 및 구조 정의
한 가지 마음에 드는 점은 새로운 DSL을 배우거나 플로우차트를 그릴 필요가 없다는 점입니다. 에이전트 동작은 표준 Python 함수 호출을 사용하여 정의됩니다. 이 프레임워크는 LLM 호출, 도구 실행 및 메모리 관리를 처리합니다.
AgentOS 런타임 레이어
AgentOS는 비동기 실행을 통해 많은 양의 요청을 처리할 수 있도록 설계되었으며, 상태 비저장 아키텍처를 통해 간편하게 확장할 수 있습니다.
주요 기능은 다음과 같습니다:
에이전트를 HTTP 엔드포인트로 노출하기 위한 기본 제공 FastAPI 통합
세션 관리 및 스트리밍 응답
엔드포인트 모니터링
수평적 확장 지원
실제로는 대부분의 인프라 작업을 AgentOS가 처리하므로 사용자는 에이전트 로직 자체에 집중할 수 있습니다.
Agno의 아키텍처에 대한 개략적인 개요는 다음과 같습니다.
아그노와 랭그래프 비교
Agno가 어디에 적합한지 이해하기 위해 가장 널리 사용되는 멀티에이전트 프레임워크 중 하나인 LangGraph와 비교해 보겠습니다.
LangGraph는 그래프 기반 상태 머신을 사용합니다. 전체 에이전트 워크플로를 그래프로 모델링하여 단계는 노드, 실행 경로는 에지로 표현합니다. 이는 프로세스가 고정되어 있고 엄격하게 정돈되어 있을 때 잘 작동합니다. 하지만 개방형 또는 대화형 시나리오에서는 제한적으로 느껴질 수 있습니다. 상호 작용이 더욱 동적으로 변할수록 깔끔한 그래프를 유지하기가 더 어려워집니다.
아그노는 다른 접근 방식을 취합니다. 단순한 오케스트레이션 계층이 아니라 엔드투엔드 시스템입니다. 에이전트 동작을 정의하면 에이전트OS가 모니터링, 확장성, 멀티턴 대화 지원 기능이 내장된 프로덕션 준비된 HTTP 서비스로 자동 노출합니다. 별도의 API 게이트웨이, 사용자 지정 세션 관리, 추가 운영 도구가 필요하지 않습니다.
다음은 간단한 비교입니다:
| 차원 | LangGraph | Agno |
|---|---|---|
| 오케스트레이션 모델 | 노드와 에지를 사용한 명시적 그래프 정의 | Python으로 정의된 선언적 워크플로우 |
| 상태 관리 | 개발자가 정의하고 관리하는 사용자 정의 상태 클래스 | 내장 메모리 시스템 |
| 디버깅 및 통합 가시성 | LangSmith(유료) | AgentOS UI(오픈 소스) |
| 런타임 모델 | 기존 런타임에 통합 | 독립형 FastAPI 기반 서비스 |
| 배포 복잡성 | LangServe를 통한 추가 설정 필요 | 즉시 사용 가능 |
LangGraph는 더욱 유연하고 세분화된 제어 기능을 제공합니다. Agno는 제작 기간을 단축할 수 있도록 최적화합니다. 프로젝트 단계, 기존 인프라 및 필요한 사용자 지정 수준에 따라 올바른 선택이 달라집니다. 확실하지 않은 경우 두 가지를 모두 사용하여 소규모 개념 증명을 실행하는 것이 가장 신뢰할 수 있는 결정 방법입니다.
에이전트 메모리 레이어로 Milvus 선택하기
프레임워크를 선택했다면 다음 결정은 메모리와 지식을 저장하는 방법입니다. 이를 위해 Milvus를 사용합니다. Milvus는 42,000개 이상의 GitHub 스타를 보유한 AI 워크로드용으로 구축된 가장 인기 있는 오픈 소스 벡터 데이터베이스입니다.
Agno는 기본적으로 Milvus를 지원합니다. agno.vectordb.milvus 모듈은 연결 관리, 자동 재시도, 일괄 쓰기, 임베딩 생성과 같은 프로덕션 기능을 래핑합니다. 연결 풀을 구축하거나 네트워크 장애를 직접 처리할 필요 없이 몇 줄의 Python으로 작동하는 벡터 메모리 계층을 만들 수 있습니다.
Milvus는 필요에 따라 확장할 수 있습니다. 세 가지 배포 모드를 지원합니다 :
Milvus Lite: 경량, 파일 기반 - 로컬 개발 및 테스트에 적합합니다.
독립형: 프로덕션 워크로드를 위한 단일 서버 배포
분산: 대규모 시나리오를 위한 전체 클러스터
Milvus Lite로 시작하여 로컬에서 에이전트 메모리를 검증한 다음 트래픽이 증가함에 따라 애플리케이션 코드를 변경하지 않고도 독립형 또는 분산형으로 전환할 수 있습니다. 이러한 유연성은 초기 단계에서는 빠르게 반복하지만 나중에 확장할 명확한 경로가 필요할 때 특히 유용합니다.
단계별: Milvus로 프로덕션 준비 완료된 Agno 에이전트 구축하기
프로덕션에 바로 사용할 수 있는 에이전트를 처음부터 구축해 보겠습니다.
전체 워크플로우를 보여주기 위해 간단한 단일 에이전트 예제로 시작하겠습니다. 그런 다음 다중 에이전트 시스템으로 확장해 보겠습니다. AgentOS는 모든 것을 호출 가능한 HTTP 서비스로 자동 패키징합니다.
1. Docker로 Milvus 독립형 배포하기
(1) 배포 파일을 다운로드합니다.
**wget** **
<https://github.com/Milvus-io/Milvus/releases/download/v2.****5****.****12****/Milvus-standalone-docker-compose.yml> -O docker-compose.yml**
(2) Milvus 서비스 시작
docker-compose up -d
docker-compose ps -a
2. 핵심 구현
import os
from pathlib import Path
from agno.os import AgentOS
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.knowledge.knowledge import Knowledge
from agno.vectordb.milvus import Milvus
from agno.knowledge.embedder.openai import OpenAIEmbedder
from agno.db.sqlite import SqliteDb
os.environ\["OPENAI_API_KEY"\] = "you-key-here"
data_dir = Path("./data")
data_dir.mkdir(exist_ok=True)
knowledge_base = Knowledge(
contents_db=SqliteDb(
db_file=str(data_dir / "knowledge_contents.db"),
knowledge_table="knowledge_contents",
),
vector_db=Milvus(
collection="agno_knowledge",
uri="http://192.168.x.x:19530",
embedder=OpenAIEmbedder(id="text-embedding-3-small"),
),
)
*# Create Agent*
agent = Agent(
name="Knowledge Assistant",
model=OpenAIChat(id="gpt-4o"),
instructions=\[
"You are a knowledge base assistant that helps users query and manage knowledge base content.",
"Answer questions in English.",
"Always search the knowledge base before answering questions.",
"If the knowledge base is empty, kindly prompt the user to upload documents."
\],
knowledge=knowledge_base,
search_knowledge=True,
db=SqliteDb(
db_file=str(data_dir / "agent.db"),
session_table="agent_sessions",
),
add_history_to_context=True,
markdown=True,
)
agent_os = AgentOS(agents=\[agent\])
app = agent_os.get_app()
if __name__ == "__main__":
print("\n🚀 Starting service...")
print("📍 http://localhost:7777")
print("💡 Please upload documents to the knowledge base in the UI\n")
agent_os.serve(app="knowledge_agent:app", port=7777, reload=False)
(1) 에이전트 실행하기
**python** **knowledge_agent.py**
3. AgentOS 콘솔에 연결하기
https://os.agno.com/
(1) 계정 생성 및 로그인
(2) 에이전트를 AgentOS에 연결
(3) 노출 포트 및 에이전트 이름 구성하기
(4) 밀버스에서 문서 추가 및 인덱싱하기
(5) 에이전트 엔드 투 엔드 테스트
이 설정에서 Milvus는 고성능 시맨틱 검색을 처리합니다. 지식창고 어시스턴트가 기술 관련 질문을 받으면 search_knowledge 툴을 호출하여 쿼리를 임베드하고 Milvus에서 가장 관련성이 높은 문서 청크를 검색한 다음 그 결과를 응답의 기초로 사용합니다.
Milvus는 세 가지 배포 옵션을 제공하므로 모든 배포 모드에서 애플리케이션 수준 API를 일관되게 유지하면서 운영 요구사항에 맞는 아키텍처를 선택할 수 있습니다.
위의 데모는 핵심 검색 및 생성 흐름을 보여줍니다. 그러나 이 설계를 프로덕션 환경으로 옮기려면 몇 가지 아키텍처 측면에 대해 더 자세히 논의해야 합니다.
검색 결과가 에이전트 간에 공유되는 방식
Agno의 팀 모드에는 이후 에이전트가 이전 에이전트의 전체 상호작용 기록을 상속할 수 있는 share_member_interactions=True 옵션이 있습니다. 즉, 첫 번째 상담원이 Milvus에서 정보를 검색하면 후속 상담원이 동일한 검색을 다시 실행하는 대신 해당 결과를 재사용할 수 있습니다.
장점도 있습니다: 검색 비용이 팀 전체에 걸쳐 분할 상각됩니다. 하나의 벡터 검색이 여러 상담원을 지원하므로 중복 쿼리가 줄어듭니다.
단점: 검색 품질이 증폭됩니다. 초기 검색이 불완전하거나 부정확한 결과를 반환하면 그 오류는 검색에 의존하는 모든 상담원에게 전파됩니다.
그렇기 때문에 다중 에이전트 시스템에서는 검색 정확도가 더욱 중요합니다. 검색이 잘못되면 상담원 한 명의 응답만 저하되는 것이 아니라 팀 전체에 영향을 미칩니다.
다음은 팀 설정의 예입니다:
from agno.team import Team
analyst = Agent(
name="Data Analyst",
model=OpenAIChat(id="gpt-4o"),
knowledge=knowledge_base,
search_knowledge=True,
instructions=\["Analyze data and extract key metrics"\]
)
writer = Agent(
name="Report Writer",
model=OpenAIChat(id="gpt-4o"),
knowledge=knowledge_base,
search_knowledge=True,
instructions=\["Write reports based on the analysis results"\]
)
team = Team(
agents=\[analyst, writer\],
share_member_interactions=True, *# Share knowledge retrieval results*
)
아그노와 밀버스가 별도로 계층화된 이유
이 아키텍처에서 Agno는 대화 및 오케스트레이션 계층에 위치합니다. 대화 흐름 관리, 상담원 조정, 대화 상태 유지를 담당하며 세션 기록은 관계형 데이터베이스에 보관됩니다. 제품 문서 및 기술 보고서와 같은 시스템의 실제 도메인 지식은 별도로 처리되어 Milvus에 벡터 임베딩으로 저장됩니다. 이렇게 명확한 구분을 통해 대화 로직과 지식 저장을 완전히 분리할 수 있습니다.
이것이 운영적으로 중요한 이유
독립적인 확장: 아그노 수요가 증가하면 더 많은 아그노 인스턴스를 추가하세요. 쿼리 볼륨이 증가하면 쿼리 노드를 추가하여 Milvus를 확장하세요. 각 계층은 독립적으로 확장됩니다.
다양한 하드웨어 요구 사항: Agno는 CPU와 메모리를 사용합니다(LLM 추론, 워크플로우 실행). Milvus는 처리량이 많은 벡터 검색(디스크 I/O, 때로는 GPU 가속)에 최적화되어 있습니다. 이를 분리하면 리소스 경합을 방지할 수 있습니다.
비용 최적화: 각 레이어에 대해 독립적으로 리소스를 조정하고 할당할 수 있습니다.
이러한 계층적 접근 방식은 보다 효율적이고 탄력적이며 프로덕션에 바로 사용할 수 있는 아키텍처를 제공합니다.
Milvus와 함께 Agno를 사용할 때 모니터링해야 할 사항
Agno에는 평가 기능이 기본으로 제공되지만 Milvus를 추가하면 모니터링해야 할 항목이 확장됩니다. 그간의 경험을 바탕으로 다음 세 가지 영역에 집중하세요:
검색 품질: Milvus가 반환하는 문서가 실제로 쿼리와 관련이 있는가, 아니면 벡터 수준에서 표면적으로만 유사한가?
답변의 충실성: 최종 응답이 검색된 콘텐츠에 근거하고 있는가, 아니면 LLM이 지원되지 않는 클레임을 생성하고 있는가?
엔드투엔드 지연 시간 분석: 총 응답 시간만 추적하지 마세요. 임베딩 생성, 벡터 검색, 컨텍스트 어셈블리, LLM 추론 등 단계별로 세분화하여 속도 저하가 발생하는 위치를 파악할 수 있습니다.
실제 예시를 들어보겠습니다: Milvus 컬렉션이 백만 개에서 천만 개로 늘어나면 검색 지연 시간이 증가하는 것을 볼 수 있습니다. 이는 일반적으로 인덱스 매개변수( nlist 및 nprobe)를 조정하거나 독립형에서 분산 배포로 전환하는 것을 고려하라는 신호입니다.
결론
프로덕션에 사용할 수 있는 에이전트 시스템을 구축하려면 LLM 호출과 검색 데모를 함께 연결하는 것 이상의 것이 필요합니다. 명확한 아키텍처 경계, 독립적으로 확장되는 인프라, 문제를 조기에 파악할 수 있는 통합 가시성이 필요합니다.
이 포스팅에서는 Agno와 Milvus가 어떻게 함께 작동하는지 살펴보았습니다: 멀티에이전트 오케스트레이션을 위한 Agno, 확장 가능한 메모리와 의미 검색을 위한 Milvus. 이러한 레이어를 분리하면 핵심 로직을 다시 작성하지 않고도 프로토타입에서 프로덕션으로 이동할 수 있으며 필요에 따라 각 구성 요소를 확장할 수 있습니다.
비슷한 설정을 실험하고 계신다면 어떤 점이 효과적이었는지 궁금합니다.
Milvus에 대한 질문이 있으신가요? Slack 채널에 참여하거나 20분 동안 진행되는 Milvus 오피스 아워 세션을 예약하세요.
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word



