기다림은 그만, 구축을 시작하세요: Milvus와 Llama 3.2로 만드는 음성 비서
"죄송합니다. 이 기능은 아직 귀하의 지역에서 사용할 수 없습니다."
유럽에 거주하고 있다면, 아마 이 메시지를 셀 수 없을 만큼 많이 보셨을 것입니다. 전 세계가 새로운 AI 혁신이 나올 때마다 환호하는 동안, 우리 중 많은 이들은 비유적인 창문에 코를 바짝 대고 밖에서 파티를 바라보는 처지가 됩니다. Llama 3.2부터 OpenAI의 Advanced Voice Mode까지, 우리는 "귀하의 지역에 곧 제공됩니다... soon™️"라는 끝없는 순환에 갇혀 있습니다.
그래서 저는 기다리는 데 지쳤습니다. 우리가 파티에 참여할 수 없다면, 우리만의 파티를 열어 봅시다!
이 블로그에서는 음성 상호작용을 위해 설계된 특화된 Agentic RAG(Retrieval-Augmented Generation) 시스템인 Voice Assistant를 구축하는 과정을 안내합니다. 벡터 데이터베이스로 Milvus, Llama 3.2, 그리고 Assemby AI, DuckDuckGo, ElevenLabs를 포함한 다양한 GenAI 기술과 같은 오픈 소스 프로젝트를 사용하여, 이 음성 어시스턴트는 단순한 처리를 넘어 음성 질의를 지능적으로 이해하고 응답합니다.
사용할 주요 기술
- Milvus는 고차원 vector embeddings를 통해 수십억 규모의 비정형 데이터를 저장, 인덱싱, 검색하는 오픈 소스 고성능, 고확장성 vector database입니다. Retrieval Augmented Generation(RAG), 시맨틱 검색, multimodal search, 추천 시스템과 같은 최신 AI 애플리케이션을 구축하는 데 완벽합니다. Milvus는 노트북부터 대규모 분산 시스템까지 다양한 environments에서 효율적으로 실행됩니다.
- Llama 3.2는 Meta에서 제공하는 최신 대규모 언어 모델(LLM)입니다. 우리는 이를 사용해 Milvus에서 검색한 정보를 기반으로 응답을 생성할 것입니다.
- Assembly AI는 음성 언어를 높은 정확도로 문자 텍스트로 변환하도록 설계된 고급 음성-텍스트 API를 제공합니다.
- DuckDuckGo는 사용자 개인정보 보호를 강조하며, 사용자 데이터를 기반으로 결과를 맞춤화하는 전통적인 검색 엔진과 달리 모든 사용자에게 동일한 검색 결과를 제공하는 검색 엔진입니다.
- ElevenLabs는 고급 음성 합성을 전문으로 하며, 사용자가 짧은 오디오 샘플로 사실적인 음성 클론을 만들 수 있게 해줍니다.
우리가 만들 것: 음성 상호작용을 위한 Agentic RAG 시스템
Agentic RAG 시스템을 구축하는 방법은 여러 가지가 있습니다. 관심 있는 분들을 위해, 저는 Llama 3.2, LangChain, LangGraph를 사용해 로컬 agentic RAG 시스템을 구축하는 방법을 단계별로 설명한 블로그를 작성한 적이 있습니다.
하지만 이번에는 기존 프레임워크에 의존하지 않고 처음부터 에이전트를 구축하는 다른 경로를 택합니다. 이 RAG 시스템의 아키텍처는 여러 구성 요소로 나뉘며(아래 그림 참조), 각 구성 요소는 이 프로세스의 특정 부분을 처리합니다.
Figure- the architecture of this agentic RAG system.png
그림: 이 agentic RAG 시스템의 아키텍처
아래는 이 agentic RAG 시스템이 작동하는 방식에 대한 개요입니다.
- 사용자가 음성 쿼리를 시스템에 보내면서 상호작용을 시작합니다.
- Assembly AI가 사용자의 음성을 실시간으로 텍스트로 전사합니다.
- 전사된 텍스트는 Query Processor에서 처리되며, agentic RAG 시스템의 벡터 분석 및 키워드 감지를 위해 준비됩니다.
- Milvus 벡터 데이터베이스가 의미적 유사도 검색을 수행하고 쿼리와 의미적으로 높은 유사도를 가진 문서를 검색합니다.
- 동시에 Keyword Detector는 텍스트에서 특정 작업을 트리거할 수 있는 특정 키워드를 스캔합니다. 예를 들어 캘린더 관련 키워드가 식별되면 Google Calendar API에 접근할 수 있습니다.
- Milvus에서 검색된 문서는 agentic 시스템에 의해 쿼리와의 관련성이 확인됩니다. 관련성이 있으면 Llama 3.2를 사용한 응답 생성으로 진행하고, 그렇지 않으면 웹 검색이 시작됩니다. Milvus의 문서가 관련성이 없으면 DuckDuckGo가 웹 검색을 수행합니다.
- Llama 3.2는 관련성 확인 결과에 따라 Milvus, DuckDuckGo 또는 Keyword Detector 중 하나에서 얻은 정보를 사용하여 일관성 있고 문맥에 적절한 응답을 생성합니다.
- Llama 3.2가 생성한 응답은 ElevenLabs의 Text-to-Speech 기술을 사용하여 음성으로 변환됩니다.
- 마지막으로 합성된 음성 응답이 사용자에게 전달되며, 지능적이고 문맥을 인식하는 답변으로 상호작용 루프가 완료됩니다.
다음 섹션에서는 이 agentic RAG 시스템을 어떻게 구축하는지, 특히 이 시스템이 다양한 유형의 검색을 동시에 처리하는 방식을 논의하겠습니다.
다중 소스 오케스트레이션
선형적인 query → retrieve → generate 패턴을 따르는 기존 RAG 시스템과 달리, 우리 시스템은 스스로 판단합니다. 구현의 핵심 구성 요소를 살펴보겠습니다:
💡 참고: 명확성과 가독성을 위해 여기서는 가장 중요한 코드 스니펫에 집중하겠습니다. 전체 구현은 our GitHub repository에서 확인할 수 있습니다.
첫째, Milvus 벡터 검색
milvus_results = self.milvus_wrapper.search_similar_text(text)
relevant_results = [result for result in milvus_results
if result["distance"] > 0.6]
if relevant_results:
context = "\n".join([result["text"] for result in milvus_results])
augmented_query = f"""
Context: {context}
User Query: {text}
Please answer based on the given context.
"""
질문을 하면 먼저 Milvus 지식 베이스에서 관련 결과를 확인합니다. 관련 있는 것(유사도 > 0.6)을 찾으면 이를 사용해 쿼리에 답변합니다.
둘째, 캘린더 통합
elif any(keyword in text.lower() for keyword in
["calendar", "schedule", "events", "appointment"]):
events = await self.calendar_service.get_upcoming_events()
augmented_query = f"""
Calendar Events: {events}
User Query: {text}
Please answer based on their calendar events.
"""
일정에 대해 질문하는 경우, 지식 베이스를 완전히 건너뛰고 바로 캘린더로 이동합니다. 정보가 정확히 어디에 있는지 알고 있는데 벡터를 검색할 필요가 없습니다!
마지막으로, 웹 검색 폴백
else:
web_results = self.web_searcher.search(text)
if web_results:
context = "\n".join(web_results[:3])
augmented_query = f"""
Web search results: {context}
User Query: {text}
Please answer based on the web search results.
"""
Milvus에서 관련 있는 것을 찾을 수 없고 캘린더 쿼리도 아니라면, DuckDuckGo를 통한 웹 검색으로 폴백합니다. 그런 다음 상위 결과를 가져와 가장 관련성 높은 문단을 추출하고 이를 다시 LLM Llama 3.2에 전달합니다.
마지막으로, Llama 3.2는 해당 정보를 컨텍스트로 사용하여 일관성 있고 정확한 응답을 생성합니다.
RAG에 Milvus를 사용하는 이유는?
RAG 시스템의 성능은 검색 속도와 검색 품질에 달려 있습니다. 이것이 바로 여기서 Milvus가 핵심인 이유입니다:
- 속도가 중요합니다: 음성 어시스턴트를 만들 때, 그 누구도 답변을 받기 위해 5초를 기다리고 싶어 하지 않습니다. Milvus는 수백만 개의 벡터를 밀리초 단위로 검색할 수 있습니다.
- 규모에 따른 정확도: Milvus는 Approximate Nearest Neighbor(ANN) 알고리즘을 통해 고차원 벡터 검색을 관리하는 데 탁월합니다. IVF_FLAT, HNSW, DiskANN 같은 강력한 인덱싱 옵션을 통해 Milvus는 벡터 데이터베이스가 확장되더라도 높은 재현율을 보장하여, 대규모 시스템에서도 검색 결과의 무결성을 유지합니다.
결과는?
우리의 DIY 음성 어시스턴트가 현존하는 최고는 아닐 수 있지만, 몇 가지 독특한 강점이 있습니다:
- 모듈식 설계: 어떤 컴포넌트든 교체할 수 있습니다(AssemblyAI 대신 Whisper를 써보는 건 어떨까요?)
- 완전한 제어: 블랙박스 없이, 투명하고 해킹 가능한 코드만 있습니다
- 개인정보 보호 중심: 당신의 데이터는 당신의 것입니다
결론
이 프로젝트가 OpenAI Advanced Voice 모드가 할 수 있는 것과는 분명히 거리가 멀지만, 그래도 자신만의 AI 어시스턴트를 만드는 데는 만족스러운 무언가가 있습니다. Claude의 매력이나 ChatGPT의 세련미는 없을지 몰라도, 개성은 있습니다. 더 중요한 것은, AI 스택에 대한 진정한 소유권과 제어권을 제공한다는 점입니다. Milvus 벡터 데이터베이스 같은 오픈 소스 도구를 사용함으로써, 우리는 다음과 같은 것을 만들 수 있음을 보여주었습니다:
- 진정으로 당신의 것: 모든 컴포넌트가 투명하고 수정 가능합니다
- 지리적 제한 없음: 어디에나 배포하고 누구에게나 제공할 수 있습니다
- 영구적으로 사용 가능: 갑작스러운 API 변경이나 서비스 중단이 없습니다
- 완전한 커스터마이징 가능: 기능을 추가하고, 동작을 수정하거나, 특정 요구에 맞게 최적화할 수 있습니다
- 개인정보 보호 우선: 당신의 데이터는 당신의 인프라에, 당신의 통제 아래에 머뭅니다
그리고 제가 언급할 수도 있는 다른 AI 도구들과 달리, 이 어시스턴트는 지도에서 유럽이 어디에 있는지 확실히 압니다!
전체 코드는 저희 Github에서 확인할 수 있습니다.
여러분의 의견을 듣고 싶습니다!
이 블로그 게시물이 마음에 드셨다면, 다음을 고려해 주세요:
- ⭐ GitHub에 스타 주기
- 💬 여러분의 경험을 공유하기 위해 Milvus Discord community에 참여하기
- 🔍 Milvus를 활용한 RAG 애플리케이션의 더 많은 예제를 보려면 Bootcamp repository 살펴보기
계속 읽기

Why Context Engineering Is Becoming the Full Stack of AI Agents
Discover how context engineering unifies prompts, RAG, and tools to build smarter, production-ready AI agents powered by Milvus.

Zilliz Cloud Introduces Advanced BYOC-I Solution for Ultimate Enterprise Data Sovereignty
Explore Zilliz Cloud BYOC-I, the solution that balances AI innovation with data control, enabling secure deployments in finance, healthcare, and education sectors.

AI Integration in Video Surveillance Tools: Transforming the Industry with Vector Databases
Discover how AI and vector databases are revolutionizing video surveillance with real-time analysis, faster threat detection, and intelligent search capabilities for enhanced security.



