待つのはやめて、作り始めよう:MilvusとLlama 3.2による音声アシスタント

"申し訳ありませんが、この機能はお住まいの地域ではまだご利用いただけません"_。
ヨーロッパを拠点にしている人なら、このメッセージを数え切れないほど目にしていることだろう。世界の他の地域が新しいAIの躍進を祝う一方で、私たちの多くは比喩的な窓に鼻を押し付け、外からパーティーを眺めている。Llama 3.2](https://zilliz.com/blog/learn-llama-3-2-and-how-to-build-rag-with-llama-with-milvus)からOpenAIのAdvanced Voice Modeまで、私たちは "Coming to your region...soon™️"という終わりのないサイクルに巻き込まれている。
待ちくたびれた。パーティーに参加できないのなら、自分たちでパーティーを開こう!
このブログでは、音声対話のために設計されたエージェント型RAG(Retrieval-Augmented Generation)システムである音声アシスタントの構築について説明します。ベクターデータベースのためのMilvus、Llama 3.2、Assemby AI、DuckDuckGo、ElevenLabsを含む様々なGenAIの技術などのオープンソースプロジェクトを使用することで、この音声アシスタントは単なる処理を超え、インテリジェントに音声クエリを理解し、応答します。
キーテクノロジー
- Milvusはオープンソースで、高性能、高スケーラブルなベクトルデータベースであり、高次元のベクトル埋め込みを通じて10億スケールの非構造化データを保存、索引付け、検索する。検索拡張生成(RAG)、セマンティック検索、マルチモーダル検索、推薦システムなどの最新のAIアプリケーションの構築に最適です。Milvusは、ラップトップから大規模な分散システムまで、様々な環境で効率的に動作します。
- Llama 3.2](https://zilliz.com/blog/learn-llama-3-2-and-how-to-build-rag-with-llama-with-milvus)**はMetaが提供する最新の大規模言語モデル(LLM)です。Milvusから取得した情報をもとに応答を生成するために使用します。
- Assembly AI**は、話し言葉を高い精度で書き言葉に変換するように設計された高度な音声テキスト変換APIを提供する。
- DuckDuckGo**は、ユーザーのプライバシーを重視し、ユーザーのデータに基づいて検索結果を調整する従来の検索エンジンとは異なり、すべてのユーザーに同じ検索結果を提供する検索エンジンである。
- ElevenLabs**は高度な音声合成を専門としており、ユーザーは短い音声サンプルからリアルな声のクローンを作ることができる。
私たちが作るもの音声対話のためのエージェント型RAGシステム
エージェント型RAGシステムを構築する方法はいくつかあります。興味のある方のために、Llama 3.2、LangChain、LangGraphを使ってローカル・エージェントRAGシステムを構築する方法を説明したブログを書きました。
しかし今回は、既存のフレームワークには頼らず、ゼロからエージェントを構築することで、異なるルートを取ります。このRAGシステムのアーキテクチャは、(以下に示すように)複数のコンポーネントに分かれており、それぞれがこのプロセスの特定の部分を処理します。
図- エージェントRAGシステムのアーキテクチャ.png](https://assets.zilliz.com/Figure_the_architecture_of_this_agentic_RAG_system_069e7f8b14.png)
図:このエージェント型RAGシステムのアーキテクチャ_。
以下は、このエージェント型RAGシステムの仕組みの概要である。
- ユーザーは、音声で問い合わせをシステムに送信し、インタラクションを開始する。
- アセンブリーAIがユーザーの音声をリアルタイムでテキストに書き起こす。
- 書き起こされたテキストはQuery Processorによって処理され、エージェント型RAGシステムにおけるベクトル分析とキーワード検出のために準備される。
- Milvus](https://milvus.io/)ベクトルデータベースは、意味的類似性検索を行い、クエリと意味的類似性の高い文書を検索する。
- 同時に、Keyword Detectorは、カレンダー関連のキーワードが特定された場合、Google Calendar APIにアクセスするなど、特定のアクションを引き起こす可能性のある特定のキーワードについてテキストをスキャンする。
- Milvusから検索されたドキュメントは、エージェントシステムによってクエリとの関連性がチェックされる。関連性がある場合は、Llama 3.2を使ったレスポンス生成に進み、関連性がない場合はウェブ検索が開始される。Milvusからの文書が関連性がない場合、DuckDuckGoはウェブ検索を行う。
- Llama 3.2は、関連性のチェックに応じて、Milvus、DuckDuckGo、Keyword Detectorのいずれかの情報を取り込み、首尾一貫した文脈に適した応答を生成する。
- Llama 3.2によって生成された応答は、ElevenLabsのText-to-Speechテクノロジーを使って音声に変換されます。
- 最後に、合成された音声応答がユーザーに返され、インテリジェントで文脈を考慮した回答でインタラクション・ループが完了します。
次のセクションでは、このエージェント型RAGシステムの構築方法、特にこのシステムが様々なタイプの検索を同時に処理する方法について説明する。
マルチソース・オーケストレーション
直線的なクエリ→検索→生成のパターンに従う従来のRAGシステムとは異なり、我々のシステムは自分で考える。我々の実装の主要な構成要素を探ってみよう:
注: 💡明確さと読みやすさのために、ここでは最も重要なコード・スニペットに焦点を当てる。完全な実装は私たちのGitHubリポジトリにあります。
最初に、Milvusベクトル探索。
milvus_results = self.milvus_wrapper.search_similar_text(text)
relevant_results = [結果 for 結果 in milvus_results
if result["distance"] > 0.6].
if relevant_results:
コンテキスト = "∕n".join([result["text"] for result in milvus_results])
augmented_query = f""
コンテキスト{コンテキスト}
ユーザクエリ:{text}
与えられたコンテキストに基づいて答えてください。
"""
あなたが質問をすると、私たちはまずMilvusのナレッジベースで関連する結果をチェックします。もし関連するもの(類似度>0.6)が見つかれば、それを使ってあなたの質問に答えます。
第二に、カレンダーの統合です。
elif any(keyword in text.lower() for keyword in
["カレンダー", "スケジュール", "イベント", "アポイントメント"]):
events = await self.calendar_service.get_upcoming_events()
augmented_query = f""
カレンダーイベント:{イベント}
ユーザクエリ:{テキスト}。
カレンダーイベントに基づいて回答してください。
"""
もしあなたがスケジュールについて尋ねているのであれば、ナレッジベースを完全にスキップして、あなたのカレンダーに直接行きます。情報がどこにあるか正確に知っている場合は、ベクトルを検索する必要はありません!
最後に、ウェブ検索フォールバックです。
else:
web_results = self.web_searcher.search(text)
if web_results:
context = "♪n".join(web_results[:3])
augmented_query = f""
ウェブ検索結果:{コンテキスト}
ユーザークエリ:{テキスト}。
ウェブ検索結果に基づいて回答してください。
"""
Milvusで関連するものが見つからず、カレンダークエリでもない場合は、DuckDuckGoでウェブ検索をします。そして、上位の結果を取得し、最も関連性の高い段落を抽出して、LLMラマ3.2にフィードバックします。
最終的に、Llama 3.2はその情報を文脈として受け取り、首尾一貫した正確な回答を生成する。
なぜRAGにMilvusなのか?
RAGシステムは、その検索スピードと検索品質があってこそのものである。だからこそ、Milvusが鍵となるのです:
1.1. スピードが重要:音声アシスタントを構築する場合、誰も答えが出るまで5秒も待ちたくはないだろう。Milvusは何百万ものベクトルをミリ秒単位で検索することができます。 2.スケールでの精度:Milvusは近似最近傍(ANN)アルゴリズムによる高次元ベクトル検索を得意としています。IVF_FLAT](https://zilliz.com/learn/vector-index)HNSWDiskANNのような堅牢なインデックスオプションにより、Milvusはベクトルデータベースがスケールしても高い再現率を保証し、大規模なシステムにおいても検索結果の完全性を維持します。
結果は?
我々のDIY音声アシスタントは、最高のものではないかもしれないが、いくつかのユニークな強みを持っている:
- モジュール設計:モジュール設計:どのコンポーネントでも交換可能(AssemblyAIの代わりにWhisperを試してみては?)
- フルコントロール:ブラックボックスなし、透明でハッキング可能なコードのみ
- プライバシー重視:あなたのデータはあなたのもの
結論
このプロジェクトは、OpenAI Advanced Voice modeができることとは明らかにかけ離れているが、それに加えて、自分自身のAIアシスタントを作ることには満足できるものがある。Claudeの魅力やChatGPTの洗練さはないかもしれないが、個性はある。さらに重要なのは、AIスタックの真のオーナーシップとコントロールを提供することだ。Milvus](https://github.com/milvus-io/milvus)ベクターデータベースのようなオープンソースツールを使用することで、我々はどのように構築できるかを示してきた:
- 真にあなたのもの**です:すべてのコンポーネントが透過的で変更可能
- Geographically Unrestricted:どこにでもデプロイでき、誰にでもサービスを提供できる。
- Forever Available:突然の API 変更やサービス停止はありません。
- 完全にカスタマイズ可能:*** 機能の追加、動作の変更、または特定のニーズへの最適化
- プライバシー第一**:お客様のデータは、お客様のインフラに保存され、お客様の管理下に置かれます。
そして、他のAIツールとは異なり、このツールは間違いなくヨーロッパが地図上のどこにあるかを知っている!
完全なコードはGithubにあります。
We'd Love to hear What You Think!
このブログ記事が気に入ったら、ぜひご検討ください:
- ⭐ GitHubで星をつけてください。
- 💬 Milvus Discord コミュニティに参加して、あなたの経験を共有しましょう。
- 🔍 Bootcampリポジトリ でMilvusを使ったRAGアプリケーションの例をもっと見てみる。
読み続けて

Milvus WebUI: A Visual Management Tool for Your Vector Database
Milvus WebUI is a built-in GUI introduced in Milvus v2.5 for system observability. WebUI comes pre-installed with your Milvus instance and offers immediate access to critical system metrics and management features.

Build RAG with LangChainJS, Milvus, and Strapi
A step-by-step guide to building an AI-powered FAQ system using Milvus as the vector database, LangChain.js for workflow coordination, and Strapi for content management

Elasticsearch Was Great, But Vector Databases Are the Future
Purpose-built vector databases outperform dual-system setups by unifying Sparse-BM25 and semantic search in a single, efficient implementation.