「ベクターデータベースを使用してLLMアプリを作成する方法」

「美容とファッションに関する記事を書くためのテクニック」

イントロダクション

人工知能の領域では、OpenAIのGPT-4、AnthropicのClaude 2、MetaのLlama、Falcon、GoogleのPalmなど、Large Language Models(LLMs)やGenerative AIモデルが問題解決の方法を革新しています。LLMsはディープラーニングの技術を使用して、自然言語処理のタスクを実行します。この記事では、ベクトルデータベースを使用してLLMアプリを構築する方法を紹介します。おそらくAmazonの顧客サービスやFlipkartのDecision Assistantのようなチャットボットと対話したことがあるかもしれません。それらは人間に近いテキストを生成し、実際の会話と区別がつきにくいインタラクティブなユーザーエクスペリエンスを提供します。しかし、これらのLLMsは最適化する必要があります。特定のユースケースに対して非常に関連性が高く具体的な結果を生成するようにするためには。

例えば、Amazonの顧客サービスアプリに「Androidアプリで言語を変更する方法は?」と尋ねた場合、正確にこのテキストでトレーニングされていないため、答えることができないかもしれません。ここでベクトルデータベースが助けになります。ベクトルデータベースは、ドメインのテキスト(この場合はヘルプドキュメント)と、注文履歴などを含むすべてのユーザーの過去のクエリを数値の埋め込みとして保存し、リアルタイムで似たようなベクトルの検索を提供します。この場合、このクエリを数値ベクトルにエンコードし、ベクトルデータベース内で類似のベクトルを検索し、最も近い隣人を見つけるために使用します。このようなヘルプを通じて、チャットボットはユーザーを正しくAmazonアプリの「言語設定の変更」セクションに案内できます。

学習目標

  • LLMsの動作原理、制約、およびベクトルデータベースの必要性について学ぶ。
  • 埋め込みモデルの紹介と、アプリケーションでのエンコードと使用方法について学ぶ。
  • ベクトルデータベースとそれがLLMアプリケーションアーキテクチャの一部である方法について学ぶ。
  • ベクトルデータベースとTensorFlowを使用してLLM/Generative AIアプリケーションをコーディングする方法を学ぶ。

この記事はデータサイエンスブログマラソンの一環として公開されました。

LLMsとは何ですか?

Large Language Models(LLMs)は、自然言語を処理し理解するためにディープラーニングアルゴリズムを使用する基本的な機械学習モデルです。これらのモデルは大量のテキストデータでトレーニングされ、言語のパターンやエンティティの関係を学習します。LLMsは、言語の翻訳、感情分析、チャットボットの会話などのさまざまなタイプの言語タスクを実行することができます。彼らは複雑なテキストデータを理解し、エンティティとそれらの間の関係を識別し、統率的で文法的に正確な新しいテキストを生成することができます。

LLMsについてもっと詳しく読む。

LLMsはどのように動作するのですか?

LLMsは大量のデータ(しばしばテラバイト、さらにはペタバイト)を使用してトレーニングされ、数十億または数兆のパラメータを持ち、ユーザーのプロンプトやクエリに基づいて関連する応答を予測および生成することができます。入力データをワード埋め込み、自己注意層、およびフィードフォワードネットワークを通じて処理し、意味のあるテキストを生成します。LLMアーキテクチャについてもっと読むことができます。

LLMsの制約

LLMsは非常に高い精度で応答を生成するように見えますが、多くの標準化テストでは人間を超える結果を示すことがありますが、それでもこれらのモデルには制約があります。まず第一に、彼らは自身のトレーニングデータに頼ることだけで推論を行い、データ内の特定の情報や現在の情報が欠けているかもしれません。これにより、モデルが誤ったまたは異常な応答を生成することがあります(「幻覚」とも言われます)。これを軽減するための取り組みが継続中です。第二に、モデルはユーザーの期待に合致するように振る舞ったり応答するとは限りません。

これを解決するために、ベクトルデータベースと埋め込みモデルは、ユーザーが情報を求めている類似したモダリティ(テキスト、画像、ビデオなど)に対して、LLMs/Generative AIの知識を向上させるための追加の検索を提供します。以下は、LLMsがユーザーが問い合わせた応答を持っていない場合に、情報を見つけるためにベクトルデータベースに頼る例です。

LLMsとベクトルデータベース

大規模言語モデル(LLMs)は、電子商取引、旅行、検索、コンテンツ作成、金融など、さまざまな産業のさまざまな部分で利用または統合されています。これらのモデルは、ベクトルデータベースとして知られる比較的新しいタイプのデータベースを使用しており、テキスト、画像、ビデオ、その他のデータの数値表現を埋め込みと呼ばれるバイナリ表現で格納しています。このセクションでは、ベクトルデータベースと埋め込みの基礎に焦点を当て、さらに重要なのは、それらをLLMアプリケーションと統合する方法についてです。

ベクトルデータベースは、高次元空間で埋め込みを格納し検索するデータベースです。これらのベクトルは、データの特徴または属性の数値表現です。高次元空間内のベクトル間の距離または類似性を計算するアルゴリズムを使用して、ベクトルデータベースは似たデータを迅速かつ効率的に取得できます。行または列にデータを格納し、完全一致またはキーワードベースの検索方法を使用する従来のスカラーベースのデータベースとは異なり、ベクトルデータベースは異なる動作をします。ベクトルデータベースは、ベクトルの大規模なコレクションを非常に短時間(ミリ秒オーダー)で検索および比較するために使用します。これには、近似最近傍法(ANN)などの手法が使用されます。

埋め込みのクイックチュートリアル

AIモデルは、テキスト、ビデオ、画像などの生データを< a href = “/?s=word2vec” > word2vec などのベクトル埋め込みライブラリに入力することで、埋め込みを生成します。 AIと機械学習の文脈では、これらの特徴は、パターン、関係、および基礎構造を理解するために重要なデータの異なる次元を表します。

ここに、word2vecを使用して単語の埋め込みを生成する方法の例があります。

1. カスタムのデータコーパスを使用してモデルを生成するか、< a href = “https://github.com/mmihaltz/word2vec-GoogleNews-vectors” > Google またはFastTextからサンプルのプリビルドモデルを使用します。独自のモデルを生成する場合は、「word2vec.model」という名前でファイルシステムに保存できます。

import gensim# word2vecモデルを作成するmodel = gensim.models.Word2Vec(corpus)# モデルファイルを保存するmodel.save('word2vec.model')

2. モデルを読み込み、入力単語のベクトル埋め込みを生成し、ベクトル埋め込み空間内の類似単語を取得するためにそれを使用します。

import gensimimport numpy as np# word2vecモデルを読み込むmodel = gensim.models.Word2Vec.load('word2vec.model')# 「king」という単語のベクトルを取得するking_vector = model['king']# kingベクトルに最も類似したベクトルを取得するsimilar_vectors = model.similar_by_vector(king_vector, topn=5)# 最も類似したベクトルを出力するfor vector in similar_vectors:    print(vector[0], vector[1])    

3. 入力単語に近い上位5つの単語は次のとおりです。

Output: man 0.85prince 0.78queen 0.75lord 0.74emperor 0.72

ベクトルデータベースを使用したLLMアプリケーションアーキテクチャ

ベクトルデータベースは、埋め込みモデルを使用して埋め込みの作成とクエリの処理の両方を処理するために使用されます。データの取り込みパスでは、埋め込みモデルを使用してコーパスコンテンツをベクトルにエンコードし、Pinecone、ChromaDB、Weaviateなどのベクトルデータベースに格納されます。読み込みパスでは、アプリケーションは文章や単語を使用してクエリを行い、埋め込みモデルによって再度ベクトルにエンコードされてから、ベクトルデータベースにクエリされて結果を取得します。

ベクターデータベースを使用したLLMアプリケーション

LLMは言語タスクに助けとなり、テキストだけでなく画像や動画も生成できるGenerative AIなどのモデルの一部となります。このセクションでは、ベクターデータベースを使用して実用的なLLM/Generative AIアプリケーションを構築する方法を学びます。私は言語モデルにtransformersとtorchライブラリを使用し、ベクターデータベースとしてpineconeを使用しました。LLM/埋め込み用の任意の言語モデルと、格納と検索に使用するベクターデータベースを選択できます。

チャットボットアプリ

ベクターデータベースを使用してチャットボットを構築するには、以下の手順に従うことができます:

  1. Pinecone、Chroma、Weaviate、AWS Kendraなどのベクターデータベースを選択します。
  2. チャットボット用のベクターインデックスを作成します。
  3. 選択した大規模テキストコーパスを使用して言語モデルをトレーニングします。たとえば、ニュースチャットボットの場合はニュースデータを使用できます。
  4. ベクターデータベースと言語モデルを統合します。

以下は、ベクターデータベースと言語モデルを使用するチャットボットアプリの簡単な例です:

import pinecone
import transformers

# ベクターデータベースのためのAPIクライアントを作成する
client = pinecone.Client(api_key="YOUR_API_KEY")

# 言語モデルを読み込む
model = transformers.AutoModelForCausalLM.from_pretrained("google/bigbird-roberta-base")

# テキストを生成するための関数を定義する
def generate_text(prompt):
    inputs = model.prepare_inputs_for_generation(prompt, return_tensors="pt")
    outputs = model.generate(inputs, max_length=100)
    return outputs[0].decode("utf-8")

# ユーザーのクエリベクトルに最も類似したベクトルを検索する関数を定義する
def retrieve_similar_vectors(query_vector):
    results = client.search("my_index", query_vector)
    return results

# ユーザーのクエリに対する応答を生成する関数を定義する
def generate_response(query):
    # ユーザーのクエリベクトルに最も類似したベクトルを検索する
    similar_vectors = retrieve_similar_vectors(query)
    # 取得したベクトルに基づいてテキストを生成する
    response = generate_text(similar_vectors[0])
    return response

# チャットボットを開始する
while True:
    # ユーザーのクエリを取得する
    query = input("質問は何ですか? ")
    # ユーザーのクエリに対する応答を生成する
    response = generate_response(query)
    # 応答を表示する
    print(response)

このチャットボットアプリは、ユーザーのクエリベクトルからベクターデータベース内で最も類似したベクトルを抽出し、取得したベクトルに基づいて言語モデルを使用してテキストを生成します。

チャットボット > 質問は何ですか?ユーザーA> エッフェル塔の高さはどれくらいですか?チャットボット>エッフェル塔の高さは、基部からアンテナの先端まで324メートル(1,063フィート)です。 

画像生成アプリ

Generative AIとLLMライブラリの両方を使用する画像生成アプリの構築方法を探ってみましょう。

  1. 画像ベクトルを保存するためのベクターデータベースを作成します。
  2. トレーニングデータから画像ベクトルを抽出します。
  3. 画像ベクトルをベクターデータベースに挿入します。
  4. 生成敵対的ネットワーク(GAN)をトレーニングします。GANの紹介が必要な場合は、こちらを参照してください。
  5. ベクターデータベースとGANを統合します。

以下は、ベクターデータベースとGANを統合して画像を生成するプログラムの簡単な例です:

import pinecone
import torch
from torchvision import transforms

# ベクターデータベースのためのAPIクライアントを作成する
client = pinecone.Client(api_key="YOUR_API_KEY")

# GANを読み込む
generator = torch.load("generator.pt")

# ベクトルから画像を生成するための関数を定義する
def generate_image(vector):
    # ベクトルをテンソルに変換する
    tensor = torch.from_numpy(vector).float()
    # 画像を生成する
    image = generator(tensor)
    # 画像をPIL画像に変換する
    image = transforms.ToPILImage()(image)
    return image

# 画像生成アプリを開始する
while True:
    # ユーザーのクエリを取得する
    query = input("どのような画像を生成したいですか? ")
    # ユーザーのクエリベクトルに最も類似したベクトルを検索する
    similar_vectors = client.search("my_index", query)
    # 抽出したベクトルから画像を生成する
    image = generate_image(similar_vectors[0])
    # 画像を表示する
    image.show()

このプログラムは、ユーザーのクエリベクトルにもっとも類似したベクトルをベクトルデータベースから取得し、それをもとにGANによって画像を生成します。

ImageBot>どんな種類の画像を生成したいですか?Me>流れる川と一緒に描かれた山の風景画像ImageBot> ちょっとお待ちください!これができました...
Generated Image

このプログラムは、特定のニーズに合わせてカスタマイズすることもできます。例えば、人物像や風景など、特定の種類の画像を生成するために特化したGANをトレーニングすることができます。

映画推薦アプリ

映画コーパスから映画推薦アプリを構築する方法を見ていきましょう。同じアイデアを使用して、製品やその他のエンティティに対する推薦システムを構築することもできます。

  1. 映画ベクトルを格納するためのベクトルデータベースを作成します。
  2. 映画メタデータから映画ベクトルを抽出します。
  3. 映画ベクトルをベクトルデータベースに挿入します。
  4. ユーザーに映画を推薦します。

Pinecone APIを使用してユーザーに映画を推薦する例を示します:

import pinecone# APIクライアントを作成するclient = pinecone.Client(api_key="YOUR_API_KEY")# ユーザーのベクトルを取得するuser_vector = client.get_vector("user_index", user_id)# ユーザーに映画を推薦するresults = client.search("movie_index", user_vector)# 結果を表示するfor result in results:    print(result["title"])

以下はユーザーに対するサンプルの推薦です

The Shawshank RedemptionThe Dark KnightInceptionThe GodfatherPulp Fiction

ベクトル検索/データベースを使用したLLMの実世界のユースケース

  • MicrosoftとTikTokは、Pineconeなどのベクトルデータベースを使用して、長期的なメモリと高速なルックアップを実現しています。これは、LLM単体ではベクトルデータベースなしではできないものです。過去の質問/回答を保存し、セッションを再開することができます。例えば、ユーザーは「先週話したパスタのレシピについてもっと教えてください」と尋ねることができます。こちらを参照してください。

  • FlipkartのDecision Assistantは、まずクエリをベクトルエンベディングとしてエンコードし、高次元空間に関連商品を格納するベクトルに対してルックアップを行って、ユーザーに製品を推薦します。例えば、「Wrangler leather jacket brown men VoAGI」と検索すると、ベクトルの類似検索を使用してユーザーに関連商品を推薦します。それ以外の場合、LLMには推薦がないため、そのようなタイトルや製品の詳細を含む製品カタログは存在しません。こちらを読んでください。
  • アフリカのFinTech企業であるChipper Cashは、詐欺ユーザーのサインアップを10倍減らすためにベクトルデータベースを使用しています。これは、以前のユーザーサインアップのすべての画像をベクトルエンベディングとして格納することによって行われます。次に、新しいユーザーがサインアップすると、ベクトルとしてエンコードし、既存のユーザーと比較して詐欺を検出します。こちらを読んでください。
Source: Chipper Cash
  • Facebookは、Instagram ReelsやFacebook Storiesなど、多くのプロダクトで、FAISSという独自のベクトル検索ライブラリを使用しています。これにより、マルチメディアを簡単にルックアップし、ユーザーに対してより良い提案のための類似候補を見つけることができます。

結論

ベクトルデータベースは、画像生成、映画や製品の推薦、チャットボットなど、さまざまなLLMアプリケーションの構築に役立ちます。LLMに訓練されていない追加または類似の情報を提供します。ベクトルエンベディングを効率的に高次元空間に格納し、最も類似したエンベディングを高い正確度で見つけるための最近傍探索を使用します。

主要なポイント

この記事からの主なポイントは、ベクトルデータベースはLLMアプリに非常に適しており、以下の重要な機能をユーザーが統合するために提供しています:

  • パフォーマンス:ベクトルデータベースは、効率的にベクトルデータを格納し、取得するように設計されています。これは、高性能なLLMアプリを開発する上で重要です。
  • 精度:ベクトルデータベースは、わずかな変化を示しても、類似のベクトルを正確にマッチングすることができます。最近傍アルゴリズムを使用して類似のベクトルを計算します。
  • マルチモーダル:ベクトルデータベースは、テキスト、画像、音声など、さまざまなマルチモーダルデータに対応することができます。この多様性により、多様なデータタイプで作業するLLM / Generative AIアプリには理想的な選択肢となります。
  • 開発者向け:ベクトルデータベースは、機械学習の技術に詳しくない開発者でも、比較的使いやすいです。

さらに、既存のSQL / NoSQLソリューションには、既にベクトル埋め込みストレージ、インデックス、高速な類似性検索機能が追加されていることを強調しておきます。たとえば、PostgreSQLおよびRedisなどです。この領域は急速に進化しているため、アプリ開発者は近い将来、革新的なアプリを構築するための多くの選択肢が利用できるでしょう。

よくある質問

この記事に表示されるメディアはAnalytics Vidhyaが所有しておらず、著者の裁量で使用されます。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more