大規模言語モデルのアプリケーションはさまざまな分野に変革をもたらし、自然言語の処理と理解における新たなフロンティアを形成しています。人間のようなテキストを生成することで知られる LLM は、チャットボット、コンテンツ作成、さらには複雑な問題解決タスクにまで革命をもたらしました。
しかし、LLM はその優れた機能にもかかわらず、特にコンテキスト認識と長期にわたる対話における精度の維持において顕著な課題に直面しています。よくある落とし穴は、生成されたコンテンツが流暢ではあるものの、不正確または無関係になる可能性がある「幻覚」への傾向です。
ここで、 検索拡張生成 (RAG)やベクトル データベースなどのテクノロジーが極めて重要になります。 LLM を、膨大なデータセットから関連情報を動的に取得する RAG と統合することで、これらの制限を大幅に軽減できます。 LLM とベクトル データベースの相乗効果により、構造化されたベクトル データを効率的に処理および取得できるため、LLM アプリケーションに新たなレベルの深さ、コンテキスト、および信頼性をもたらすことが期待されます。
このブログでは、読者は次のことを期待できます。
検索拡張生成 (RAG) は、 AI および自然言語処理の分野における革新的なパラダイムです。これは、情報検索を言語生成プロセスに統合することにより、従来の言語モデルからの大きな変化を示しています。このハイブリッド アプローチにより、AI モデルの能力が強化され、コンテキスト的に正確なだけでなく、外部データ ソースからの最新の知識が注入された応答を生成できます。
RAG の始まりは、GPT (Generative Pre-trained Transformer) などの標準言語モデルの制限を克服する探求に遡ります。従来のモデルは、一貫したテキストの生成には優れているにもかかわらず、特に特定のリアルタイムの知識を必要とするクエリに対して、正確で事実に基づいた応答を提供するのに苦労することがよくあります。
ここでは、ベクトル データベースと統合された検索拡張生成 (RAG) がどのように機能するかを説明します。
取り込みとインデックス作成: ワークフローは、システムのインテリジェンスの基盤である包括的なナレッジ ベースから始まります。このナレッジ ベースは通常、ユーザーが問い合わせる可能性のある情報を含むドキュメントの大規模なコーパスです。これらの文書には、FAQ シートや記事から構造化情報のデータベースまで、あらゆるものが含まれます。これらのドキュメントは利用される前に、前処理されて埋め込みに変換される取り込みプロセスを受けます。埋め込みモデル(多くの場合、高度な機械学習アルゴリズム) を使用して、テキスト情報をベクトル埋め込みに変換します。これらの埋め込みは、多次元空間内のドキュメントの意味論的な内容を数値的に表し、類似性の比較に最適です。
顧客との対話: すべては、顧客がアプリケーションと対話し、クエリを発行することから始まります。このクエリは、顧客が AI による回答を期待する情報または質問のリクエストです。
クエリの埋め込み: 生の顧客クエリは、埋め込みモデルによって処理されます。このモデルは、テキスト クエリをベクトルに変換します。ベクトルは、高次元空間でクエリの意味論的な意味を捉える数値表現です。
Vector Database Search : クエリ ベクトルは、高次元ベクトル データを処理するように設計された特殊なデータベースである Vector Database に送信されます。データベースは類似性検索を実行して、最も関連性の高いドキュメントの埋め込みを取得します。これらの埋め込みは、システムに取り込まれたナレッジ ベースからの前処理されたナレッジを表します。
コンテキストの取得: 取得されたドキュメントの埋め込みが元のクエリと結合されて、クエリと関連コンテキストの両方を含むプロンプトが形成されます。
言語モデル応答の生成: この強化されたプロンプトは、言語学習モデル (LLM) に供給されます。 LLM は、取得したドキュメントのコンテキストを使用して、顧客のクエリに正確かつ有益でコンテキストに関連した応答を生成します。
生成応答: 最後に、LLM は生成応答を生成し、アプリを通じて顧客に返されます。この応答は、モデルの事前トレーニングされた知識に基づいているだけでなく、知識ベースから取得した特定の情報によって強化されているため、ユーザーの要求との関連性が高くなります。
ベクトル データベースは、多くの場合、機械学習へのモデルの埋め込みなどのプロセスを通じて、数値ベクトル形式に変換されたデータを保存および管理します。埋め込みは、元の入力の意味論的特徴または文脈上の特徴を捕捉する、データの数値表現であり、多くの場合高次元ベクトルです。テキスト データの場合、埋め込みは単語、文章、またはドキュメント全体をコンピューターが処理できる形式に変換します。機械学習モデル、特にニューラル ネットワークを使用してこれらの埋め込みを生成すると、ベクトル空間で同様の意味が近くなります。これらのデータベースは、ベクトル空間内で特定のクエリ ベクトルに最も近いデータ ポイントを特定する類似性検索を効率的に実行するように設計されています。
ここでプロセスを詳しく見てみましょう。
データ ストレージ: ドキュメントが取り込まれると、埋め込みモデル (ニューラル ネットワークなど) がテキストを高次元ベクトルに変換します。各ベクトルは、文書の意味論的な意味を数値形式で表します。これらのベクトルはベクトル データベースに保存されます。
インデックス作成: 高速な検索を容易にするために、データベースは、Inverted File Index (IVF) や Hierarchical Navigable Small World (HNSW) などの高次元空間に適したアルゴリズムを使用して、これらのベクトルにインデックスを構築します。インデックスの種類は、検索の速度と精度のバランスを考慮して選択します。
類似検索: クエリが作成されると、同じ埋め込みモデルを使用してベクトルにも変換されます。次に、ベクトル データベースはインデックスを使用して、クエリ ベクトルに最も類似したベクトルを迅速に検索します。類似性は、ユークリッド距離やコサイン類似度などの距離指標によって決定されます。
埋め込みの利点:
意味的類似性: 埋め込みは、意味的に類似した項目がベクトル空間内で近くなるように設計されており、システムがコンテキストと意味を理解できるようにします。たとえば、ゲノミクスの分野では、遺伝子発現データを埋め込みとしてエンコードして、さまざまな遺伝子と表現型の間の関係を示すパターンを明らかにすることができます。これは、従来の分析では明らかではない疾患のバイオマーカーを特定するのに役立ちます。
複雑な関係: 従来の表現では見逃してしまう可能性のある、データ内の複雑な関係やニュアンスを捉えることができます。実用的なアプリケーションは、Netflix や Spotify などのストリーミング サービスで使用されるレコメンデーション システムなどに見られます。これらのプラットフォームは、エンベディングを使用してユーザーの好みやコンテンツの特徴を理解し、ユーザーが以前に選択したものと類似性のある映画や曲を推奨します。コンテンツの多様性にもかかわらず、埋め込みにより、ユーザー消費のより深いパターンを考慮して、ジャンルやアーティストを超えた微妙なレコメンデーションが可能になります。
均一性: 埋め込みにより、さまざまなデータ型が均一なベクトル形式に変換され、比較や取得などの操作が簡素化されます。
RAG および Vector DB ( Milvus ) のローカル開発環境を作成するには、いくつかの重要な手順が必要です。
構造化されたガイドは次のとおりです。
前提条件:
Python 3.6 以降がシステムにインストールされていることを確認してください。
Milvus を実行するには Docker が必要です。
仮想環境:
新しい仮想環境を作成し、それを使用します。
python3 -m venv rag-milvus-env source rag-milvus-env/bin/activate # Install supporting dependencies pip install transformers datasets faiss-cpu torch sentence-transformers pymilvus
docker を使用する Milvus :
Milvus Docker イメージをプルして実行します: (他のベクター データベースを使用することもできます)
以下の手順を使用するか、ここで提供されているスタート ガイドに従うことができます。
docker pull milvusdb/milvus:latest docker run -d --name milvus_cpu -p 19530:19530 -p 19121:19121 milvusdb/milvus:latest
セットアップデータ:
次に、サンプル データをダウンロードし、埋め込みを作成して、コレクションに挿入してみましょう。
import requests import csv url = "http://qim.fs.quoracdn.net/quora_duplicate_questions.tsv" # Download the file response = requests.get(url) response.raise_for_status() # This will raise an error if the download failed # Decode the content and split into lines lines = response.content.decode('utf-8').splitlines() questions = [] # Process the lines reader = csv.reader(lines, delimiter='\t') next(reader) # Skip the header row for row in reader: questions.extend([row[1], row[4]]) # Assuming the questions are in the 2nd and 3rd columns questions = questions[:10000]
埋め込みの作成
from sentence_transformers import SentenceTransformer # transformer to create embeddings model = SentenceTransformer('all-MiniLM-L6-v2') embeddings = model.encode(questions)
ベクターDBに挿入します。
# connect to db connections.connect() embedding_size = 384 # Prepare the collection schema fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True), FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=embedding_size) ] schema = CollectionSchema(fields, "questions") collection = Collection("questions", schema) # Insert the document embeddings mr = collection.insert([embeddings]) # to get document, in practice this would be some external DB. id_to_question = {str(mr.primary_keys[i]): questions[i] for i in range(len(questions))} # List all collections collections = list_collections() print(collections)
コレクションにインデックスを付けます。
from pymilvus import Collection index_params = { "metric_type": "L2", "index_type": "HNSW", # Index of type HNSW, refer to docs for other types. "params": { "M": 16, # Example value, adjust as needed "efConstruction": 200 } } collection = Collection("questions") collection.create_index( field_name="embedding", index_params=index_params )
ドキュメントのクエリ
query = "What is artificial intelligence?" query_embedding = model.encode(query) collection.load() # Define search parameters search_params = {"metric_type": "L2", "params": {"nprobe": 10}} # Perform the search results = collection.search( data=[query_vector], anns_field="embedding", param=search_params, limit=10, expr=None, consistency_level="Strong" ) # Process results for result in results: milvus_id = str(result.id) # Convert ID to string for dictionary lookup original_question = id_to_question[milvus_id] print(f"Milvus ID: {milvus_id}, Similar Question: {original_question}")
ベクトル データベースから意味的に類似したドキュメントを取得したら、このコンテキストと入力クエリを LLM に渡すことができます。LLM にはコンテキストがあるため、より良い結果が得られます。
結論として、RAG と Milvus のようなベクトル データベースの統合は、LLM アプリケーションにおける最も差し迫った課題のいくつか、特に深い文脈理解と動的な情報検索を必要とする課題に対する強力な解決策を提供します。 LLM の生成能力とベクトル データベースの精度と効率を組み合わせることで、企業は AI 主導の応答の関連性と精度を大幅に向上させ、価値のあるコンテキストに富んだインタラクションをユーザーに提供できます。
AI が進化を続ける中、これらのテクノロジーの融合は単なる一歩ではなく飛躍を表し、AI があらゆる分野にわたってより高度で多様で微妙なアプリケーションをサポートできる未来を告げています。このブログは、イノベーターや実践者がこれらのツールの実験を開始するための準備を整え、エンタープライズ AI アプリケーションの領域で可能なことの限界を押し広げました。