46.5kЗаказать демоВойтиНачать бесплатно

Хватит ждать, начните создавать: голосовой ассистент с Milvus и Llama 3.2

Nov 23, 20246 min read

"К сожалению, эта функция пока недоступна в вашем регионе."

Если вы находитесь в Европе, вы, вероятно, видели это сообщение больше раз, чем хотелось бы считать. Пока остальной мир празднует каждый новый прорыв в области ИИ, многие из нас оказываются прижатыми носом к метафорическому окну, наблюдая за вечеринкой снаружи. От Llama 3.2 до Advanced Voice Mode от OpenAI — мы застряли в бесконечном цикле «Скоро появится в вашем регионе... скоро™️».

Что ж, мне надоело ждать. Если мы не можем присоединиться к вечеринке, давайте устроим свою!

В этом блоге мы проведем вас через создание голосового ассистента, специализированной Agentic RAG (Retrieval-Augmented Generation) системы, предназначенной для голосовых взаимодействий. Используя проекты с открытым исходным кодом, такие как Milvus для векторной базы данных, Llama 3.2 и различные технологии GenAI, включая Assemby AI, DuckDuckGo и ElevenLabs, этот голосовой ассистент выходит за рамки простой обработки — он интеллектуально понимает голосовые запросы и отвечает на них.

Ключевые технологии, которые мы будем использовать

  • Milvus — это высокопроизводительная, хорошо масштабируемая векторная база данных с открытым исходным кодом, которая хранит, индексирует и ищет неструктурированные данные миллиардного масштаба с помощью многомерных векторных эмбеддингов. Она идеально подходит для создания современных ИИ-приложений, таких как Retrieval Augmented Generation (RAG), семантический поиск, мультимодальный поиск и рекомендательные системы. Milvus эффективно работает в различных средах, от ноутбуков до крупномасштабных распределенных систем.
  • Llama 3.2 — это новейшая большая языковая модель (LLM), предоставленная Meta. Мы будем использовать ее для генерации ответов на основе информации, извлеченной из Milvus.
  • Assembly AI предоставляет продвинутые API для преобразования речи в текст, предназначенные для конвертации устной речи в письменный текст с высокой степенью точности.
  • DuckDuckGo — это поисковая система, которая делает акцент на конфиденциальности пользователей и предоставляет одинаковые результаты поиска для всех пользователей, в отличие от традиционных поисковых систем, которые адаптируют результаты на основе пользовательских данных.
  • ElevenLabs специализируется на продвинутом синтезе речи, позволяя пользователям создавать реалистичные голосовые клоны на основе коротких аудиообразцов.

Что мы создадим: Agentic RAG система для голосовых взаимодействий

Существует несколько способов создания Agentic RAG системы. Для тех, кому интересно, я написал блог с пошаговым разбором того, как создать локальную agentic RAG систему с использованием Llama 3.2, LangChain и LangGraph.

Однако на этот раз мы пойдем другим путем и создадим агента с нуля, не полагаясь ни на какие существующие фреймворки. Архитектура этой RAG системы разбита на несколько компонентов (как показано ниже), каждый из которых отвечает за определенную часть этого процесса.

Рисунок- архитектура этой agentic RAG системы.png Рисунок- архитектура этой agentic RAG системы.png

Рисунок: Архитектура этой agentic RAG системы

Ниже приведен обзор того, как работает эта agentic RAG система.

  • Пользователь отправляет свой голосовой запрос в систему, начиная взаимодействие.
  • Assembly AI транскрибирует голос пользователя в текст в реальном времени.
  • Транскрибированный текст обрабатывается Query Processor, который подготавливает его для векторного анализа и обнаружения ключевых слов в агентной RAG-системе.
  • Векторная база данных Milvus выполняет поиски по семантическому сходству и извлекает документы с высоким семантическим сходством с запросом.
  • Одновременно Keyword Detector сканирует текст на наличие конкретных ключевых слов, которые могут запускать определенные действия, например доступ к Google Calendar API, если обнаружены ключевые слова, связанные с календарем.
  • Документы, извлеченные из Milvus, проверяются нашей агентной системой на релевантность запросу. Если они релевантны, они переходят к генерации ответа с использованием Llama 3.2; если нет, инициируется веб-поиск. Если документы из Milvus нерелевантны, DuckDuckGo затем выполняет веб-поиск.
  • Llama 3.2 использует информацию либо из Milvus, либо из DuckDuckGo, либо от Keyword Detector, в зависимости от проверки релевантности, чтобы сгенерировать связный и соответствующий контексту ответ.
  • Ответ, сгенерированный Llama 3.2, преобразуется в речь с использованием технологии Text-to-Speech от ElevenLabs.
  • Наконец, синтезированный голосовой ответ доставляется обратно пользователю, завершая цикл взаимодействия интеллектуальным, контекстно-осведомленным ответом.

В следующем разделе мы обсудим, как мы создаем эту агентную RAG-систему, в частности как эта система одновременно обрабатывает различные типы поиска.

Оркестрация нескольких источников

В отличие от традиционных RAG-систем, которые следуют линейному шаблону запрос → извлечение → генерация, наша система думает самостоятельно. Давайте рассмотрим ключевые компоненты нашей реализации:

💡 Примечание: Для ясности и удобочитаемости здесь мы сосредоточимся на самых важных фрагментах кода. Полная реализация доступна в нашем GitHub-репозитории.

Сначала, векторный поиск 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 использует информацию как контекст, чтобы сгенерировать связный и точный ответ.

Почему Milvus для RAG?

RAG-системы хороши ровно настолько, насколько высоки скорость их извлечения и качество их извлечения. Вот почему Milvus здесь играет ключевую роль:

  1. Скорость важна: Когда вы создаёте голосового ассистента, никто не хочет ждать ответа 5 секунд. Milvus может выполнять поиск по миллионам векторов за миллисекунды.
  2. Точность при масштабировании: Milvus отлично справляется с управлением поиском по высокоразмерным векторам с помощью алгоритмов Approximate Nearest Neighbor (ANN). Благодаря надёжным вариантам индексирования, таким как IVF_FLAT, HNSW и DiskANN, Milvus обеспечивает высокие показатели полноты поиска даже по мере масштабирования векторной базы данных, сохраняя целостность результатов поиска в крупных системах.

Результаты?

Наш DIY голосовой ассистент, возможно, не лучший из существующих, но у него есть несколько уникальных преимуществ:

  • Модульный дизайн: Замените любой компонент (попробовать Whisper вместо AssemblyAI — почему бы и нет?)
  • Полный контроль: Никаких чёрных ящиков, только прозрачный код, который можно взломать и доработать
  • Ориентация на конфиденциальность: Ваши данные остаются вашими

Заключение

Хотя этот проект, очевидно, далёк от того, на что способен OpenAI Advanced Voice mode, к тому же, есть что-то приятное в создании собственного AI-ассистента. Возможно, у него нет обаяния Claude или лоска ChatGPT, но у него есть характер. Что ещё важнее, он предлагает подлинное владение и контроль над вашим AI-стеком. Используя инструменты с открытым исходным кодом, такие как векторная база данных Milvus, мы показали, как можно создать нечто, что является:

  • По-настоящему вашим: Каждый компонент прозрачен и поддаётся изменению
  • Географически неограниченным: Развёртывайте где угодно, обслуживайте кого угодно
  • Всегда доступным: Никаких внезапных изменений API или прекращения работы сервисов
  • Полностью настраиваемым: Добавляйте функции, изменяйте поведение или оптимизируйте под конкретные потребности
  • С приоритетом конфиденциальности: Ваши данные остаются в вашей инфраструктуре, под вашим контролем

И, в отличие от некоторых других AI-инструментов, которые я мог бы упомянуть, этот точно знает, где находится Европа на карте!

Полный код доступен на нашем Github.

Нам бы очень хотелось узнать ваше мнение!

Если вам понравилась эта публикация в блоге, пожалуйста, рассмотрите возможность:

  • ⭐ Поставить нам звезду на GitHub
  • 💬 Присоединиться к нашему Milvus Discord community, чтобы поделиться своим опытом
  • 🔍 Изучить наш Bootcamp repository, чтобы увидеть больше примеров RAG-приложений с Milvus

Обновлено Jul 09, 2026