Llama3、Ollama、DSPy、Milvusを使った検索支援生成(RAG)システムの作り方
この記事では、4つの主要技術を使ったRAGシステムの構築を読者に案内することを目的としている:Llama3、Ollama、DSPy、Milvusである。まず、これらが何であるかを理解しよう。
シリーズ全体を読む
- 検索拡張ジェネレーション(RAG)でAIアプリを構築する
- LLMの課題をマスターする:検索拡張世代の探求
- ディープラーニングにおける主要なNLPテクノロジー
- RAGアプリケーションの評価方法
- リランカーによるRAGの最適化:役割とトレードオフ
- マルチモーダル検索拡張世代(RAG)のフロンティアを探る
- ChatGPTをMilvusで強化する:長期記憶でAIを強化する
- RAGパイプラインのパフォーマンスを高める方法
- ChatGPTをMilvusで強化する:長期記憶でAIを強化する
- Pandas DataFrame:Milvusによるチャンキングとベクトル化
- Llama3、Ollama、DSPy、Milvusを使った検索支援生成(RAG)システムの作り方
- 検索拡張世代(RAG)のためのチャンキング戦略ガイド
- 仮説的文書埋め込み(HyDE)による情報検索とRAGの改善
- Milvus Lite、Llama3、LlamaIndexを使ったRAGの構築
- RA-DITによるRAGの強化:LLM幻覚を最小化する微調整アプローチ
さて、皆さんはすでにNLPアプリケーションで使用されているフレームワークであるRAG(Retrieval-Augmented Generation)システムをご存知だろう。この記事では、4つの主要なテクノロジーを使ってRAGシステムを構築する方法を読者に紹介する:Llama3、Ollama、DSPy、Milvusである。まず、これらが何であるかを理解しよう。
##Llama3、Ollama、DSPy、Milvusの紹介
*Llama3はMeta社のオープンソースの言語モデルで、8Bと70Bのパラメータで事前に学習され、命令によって微調整された言語モデルを特徴としています。NLP技術の最新の進歩に基づいて構築されており、複雑なクエリの理解と応答において高い精度を提供するとしている。
Ollamaは、Llama 2のようなオープンソースの大規模言語モデルをローカルで実行することを可能にする。
DSPyは、言語モデルと検索モデルを使って高度なタスクを解決するためのフレームワークです。
最後に、Milvus ****は、効率的な類似検索と迅速なデータ検索のために設計された高度なベクトルデータベースです。スケーラブルなストレージ・ソリューションと高速検索機能を提供する。MilvusをRAGシステムに統合することで、関連情報を迅速に検索し取得する能力が大幅に向上する。
セットアップとインストール
まず、依存関係を処理するのに適したPython環境を作成し、有効にします。venvやcondaのような仮想環境を使えば、プロジェクトのパッケージを分離して管理できます。
ターミナルで以下のコマンドを実行して、必要なPythonライブラリをインストールします。
pip install dspy pymilvus openai pandas
インストールしたライブラリをPythonスクリプトにインポートして、使用できるようにします。
import dspy
インポート milvus
インポート openai
import os
インポート pandas as pd
OpenAIのAPIキーを設定するには、環境変数に設定します。your_openai_api_key' は実際の OpenAI API キーに置き換えてください。
# OpenAIとMilvusのAPIキーの設定 (ここで'your_key_here'を実際のキーに置き換える必要があります)
os.environ['OPENAI_API_KEY'] = 'your_openai_api_key'.
Milvusの設定
OpenAIのAPIキーを設定したら、次はRAGシステム内でエンベッディングを管理するためにMilvusを設定します。提供されたURIを使用してデータベースに接続するためにMilvusクライアントの初期化を開始します。この接続により、あなたのシステムはMilvusベクトルデータベースと対話することができます。
接続が完了したら、埋め込み専用のコレクションをセットアップする必要があります。埋め込みと一意な識別子を格納するために必要なフィールドでコレクションを定義します。ベクトル次元を指定し、Milvus内の検索機能を最適化するために適切なインデックスタイプを選択します。
以下はMilvusクライアントの初期化とコレクションの設定方法です。
from pymilvus import MilvusClient, MetricType, IndexType, DataType
# Milvus クライアントの初期化
milvus_client = Milvus(uri='your_milvus_uri')
# コレクションパラメータの定義
コレクション名 = 'ZillizBlogCollection'
collection_params = {
'fields':[
{'name': 'text', 'type':DataType.FLOAT_VECTOR, 'params':'params': {'dim': 768}, 'indexes':['index_type': IndexType.IVF_FLAT, 'metric_type': MetricType.L2}]}、
{'name': 'id', 'type':DataType.INT64, 'auto_id':true}.
]
}
# コレクションが存在しない場合は作成する
if not milvus_client.has_collection(collection_name):
milvus_client.create_collection(collection_name, collection_params)
データインジェストでは、テキストデータをコレクションに挿入する前に前処理を行い、エンベッディングに変換します。この処理には通常、以下の関数で示すように、テキストから埋め込みを生成するモデルを使用します。
# ブログ記事のMilvusベクトルを作成する関数
def create_milvus_vectors(data_frame, text_column='text'):
# 埋め込みを生成するためにOpenAIのモデルを使うことを想定している
embeddings = openai.Embedding.create(
input=data_frame[text_column].tolist()、
model="text-embedding-ada-002"
)
return embeddings['data'].
MilvusRMとの統合
MilvusRMは検索機構とMilvusコレクションを効率的に統合するためのコンポーネントです。以下のコードのようにコレクション名と接続URIを指定してMilvusRMを初期化します。
from dspy.retrieve.milvus_rm import MilvusRM
# MilvusRM retrieverを初期化する。
milvus_retriever = MilvusRM(
collection_name=collection_name、
uri='your_milvus_uri'、
k=5
)
Llama3とOllamaのセットアップ
Ollamaホスティングサービスを通じてアプリケーションをLlama3に接続するには、モデルのバージョンやトークンの制限など、必要な設定を行います。この設定により、あなたのシステムはLlama3のレスポンス生成機能にアクセスできるようになります。以下は、この接続を確立する方法です。
# OllamaでホストされているLlama3に接続する
llama3_ollama = dspy.OllamaLocal(
model="llama3:8b-instruct-q5_1",
max_tokens=4000、
タイムアウト_s=480
)
接続を設定したら、Llama3への接続が動作していることを確認する簡単なテストを行います。この検証ステップは、システムがLlama3と効果的に通信し、応答を受信できるかどうかを確認するために重要です。
# 接続のテスト
test_query = "最新のAIは?"
test_response = llama3_ollama(test_query)
print("Test Llama3 response:", test_response)
RAGシステムの構築
MilvusRMの検索能力とLlama3の生成能力の両方を統合するためにRAGシステムのPythonクラスを定義する。このクラス構造により、システムは関連情報を検索し、応答を生成することでクエリを効率的に処理することができる。
class RAG(dspy.Module):
def __init__(self, retriever, generator, k=5):
super().__init__()
self.retrieve = dspy.Retrieve(k=k, retriever_model=retriever)
self.generate_answer = dspy.Predict(generator)
def forward(self, question):
コンテキスト = self.retrieve(question).passages。
pred = self.generate_answer(context=context, question=question).answer
return dspy.Prediction(context=context, answer=pred, question=question)
先に初期化したコンポーネントでRAGシステムをインスタンス化し、クエリを処理して応答するように設定します。
# RAG システムをインスタンス化する
rag_system = RAG(retriever=milvus_retriever, generator=llama3_ollama)
MIPRO 最適化
RAGシステムによって生成された回答を評価するための最適化指標を定義する。この評価基準では、生成された回答をグランドトゥルースの回答と比較し、正確性と関連性を評価する。
# 評価メトリックを定義する
def metric_function(gold, pred):
# これはより複雑で、より高度なアライメントとコヒーレンスのメトリクスを統合することができます。
return np.mean(gold == pred)
検索された文書に基づいてLlama3が使用するプロンプトを改良するために、MIPROオプティマイザを設定し、開始する。この最適化プロセスは、生成される応答の関連性と品質を向上させることを目的としている。
from dspy.teleprompt import MIPRO
# trainset'は質問と回答のペアがロードされたDataFrameであると仮定します。
trainset = pd.DataFrame({
'question':['AIとは何ですか?', '機械学習について説明してください']、
gold_answer':[Artificial intelligence is the simulation of human intelligence in machines.", 'Machine learning is a subset of AI that allows systems to learn and improve from experience.]
})
# MIPRO オプティマイザーの設定と実行
mipro_optimizer = MIPRO(
prompt_model=llama3_ollama、
task_model=llama3_ollama、
metric=metric_function、
num_candidates=3
)
評価とテスト
RAGシステムのテストでは、あらかじめ決められたクエリを投入し、生成された回答を分析します。しばしば「ゴールド」アンサーと呼ばれる既知の正解と比較することで、システムの回答の正確さを評価する。この比較により、システムが正しい情報を提供する頻度を判断することができます。
正確さに加えて、生成された回答の関連性も評価します。関連性は、システムの回答がクエリの意図にどれだけ合致しているかを測定します。この評価は、システムが正しく、文脈上適切で、ユーザーにとって有用な情報を提供することを保証するのに役立ちます。
結論
このチュートリアルでは、効果的な自然言語処理のために、検索と生成のコンポーネントを統合することの重要性を学びました。各コンポーネントの設定と最適化、そしてクエリの処理とレスポンスの生成における各コンポーネントの役割を理解するための洞察を得ることができました。
私たちのシステムを強化するために、応答の多様性と質を向上させるためのデータセットの拡張を検討することができる。さらに、より洗練された評価指標を統合することで、システムのパフォーマンスと関連性についてより深い洞察を得ることができるだろう。
参考文献
読み続けて

LLMの課題をマスターする:検索拡張世代の探求
この4部構成のハンドブックでは、RAGについて、そのアーキテクチャ、利点、対処できる課題、そして生成AIアプリケーションのパフォーマンスを向上させるためにRAGが望ましい選択肢である理由を探ります。

RAGパイプラインのパフォーマンスを高める方法
この記事では、RAGアプリケーションのパフォーマンスを向上させるための様々な一般的なアプローチをまとめました。また、これらのコンセプトやテクニックを素早く理解し、実装や最適化を迅速に行えるよう、わかりやすい図解も用意しました。

Pandas DataFrame:Milvusによるチャンキングとベクトル化
チャンクテキストとエンベッディングを含むすべてのデータをPandas DataFrameに格納すれば、Milvusベクトルデータベースに簡単に統合してインポートできる。