LLaMA-2、Qdrant、RAG、LangChain、Streamlitを使用したジェネレーティブAIチャットボット (2023/12/22)

LLaMA-2、Qdrant、RAG、LangChain、Streamlitを使用したジェネレーティブAIチャットボット (2023/12/22)

https://blogs.oracle.com/ai-and-datascience/post/ai-chatbot-llama2-qdrant-rag-langchain-streamlit

投稿者:Sudhi Murthy | Software Development Senior Manager

Srikanta Prasad (Sri) | PRINCIPAL PRODUCT MANAGER

Gaurav Chauhan | Member of Technical Staff

Abhinav Kumar | Senior Member of Technical Staff

Anees Anakkot | Senior Principal Member of Technical Staff

https://blogs.oracle.com/content/published/api/v1.1/assets/CONT5741C23C4605433EA43F0C7C9EED26AA/Medium?cb=_cache_7ba7&format=jpg&channelToken=4a09bbae54a44036929b7649645b8048

会話型人工知能(AI)の進化する状況において、取得拡張生成(RAG)フレームワークは、特にチャットボットの機能強化において、重要なイノベーションとして出現しました。RAGは、従来のチャットボット・テクノロジにおける基本的な課題に対処します。事前トレーニング済の言語モデルのみに依存するという制限により、多くの場合、最新情報、特定情報または状況に即した情報がないレスポンスにつながります。RAGベースのシステムは、取得メカニズムと高度な言語生成技術をシームレスに統合することで、関連する最新のコンテンツを外部ソースから動的に取り込むことができます。この機能により、チャットボットの応答の品質と精度が大幅に向上するだけでなく、最新の情報から順応性と情報を確実に得ることができます。


ユーザーが高度にインテリジェントで応答性に優れたデジタル・インタラクションを期待する時代において、チャットボットにおけるRAGベースのシステムの必要性はますます重要になってきており、真にダイナミックで知識のある会話型エージェントを実現する変革的な一歩となっています。従来のチャットボットは、トレーニング・データの範囲によって制約され、多くの場合、最新の具体的な状況に応じた対応を提供するのに苦労します。RAGは、検索メカニズムと言語生成を統合することでこの問題を克服し、チャットボットが外部の現在の情報にリアルタイムでアクセスして組み込むことを可能にします。このアプローチは、レスポンスの正確性と関連性を向上させるだけでなく、チャットボットがニッチまたは専門的な問合せをより効果的に処理できるようにします。さらに、RAGのダイナミック・ラーニング機能により、チャットボットの応答を最新の状態に保ち、新しいトレンドやデータに適応できます。


  • RAGは、より詳細で信頼性の高い情報を提供することで、チャットボットのやり取りに対するユーザー・エンゲージメントと信頼を大幅に向上させ、会話型AIの分野で大きな進歩を遂げています。この手法は、次の理由でチャットボットのコンテキストで特に役立ちます。
  • ナレッジと情報取得の強化: RAGにより、チャットボットは大量のドキュメントやデータベースから関連情報を取り込むことができます。この機能は、モデルの事前トレーニング済ナレッジ・ベースに含まれていない、正確で最新の情報または詳細情報を提供する必要があるチャットボットに特に役立ちます。
  • 回答品質の向上: 関連するドキュメントやテキストのスニペットをコンテキストとして取り出すことで、RAGは、チャットボットがより正確で詳細かつ状況に即した適切な応答を生成するのに役立ちます。この機能は、回答が単純でないか、複数のソースからの情報の統合が必要な複雑な問合せに特に重要です。
  • 生成機能と取得機能のバランス: 従来のチャットボットは、生成(最初からレスポンスを作成)または取得ベース(事前定義済のレスポンスのセットから最適な一致を検索)のいずれかです。RAGはハイブリッド・アプローチを可能にし、ジェネレーティブ・モデルでは、取得された情報に基づいてより微妙で多様な応答を作成でき、より自然で有益な会話につながります。
  • 長い問合せの処理: チャットボットがまれまたは異常な問合せ(長い問合せと呼ばれる)に遭遇した場合、RAGは特に役立ちます。これらのあまり一般的でない質問に対しても関連情報を取得できるため、生成モデルで適切な応答を作成できます。
  • 継続的な学習と適応: RAGベースのシステムは、外部ソースから最新の情報を取り込むことができるため、モデルの完全な再トレーニングを必要とせずに、最新の状態を維持し、新しい情報やトレンドに適応できます。この機能は、時間の経過とともにチャットボットの関連性と正確性を維持するために重要です。
  • カスタマイズと専門性: 医療、法律、技術サポートなどの特定のドメイン向けに設計されたチャットボットの場合、RAGは専門のデータベースやドキュメントから情報を取得するように調整できるため、特定のコンテキストでチャットボットがより効果的になります。



ベクトルデータベースと埋め込みの必要性


取得増強生成システムを調べるには、人間の言語と複雑なデータパターンに内在する微妙な意味関係を把握する必要があります。しかし、正確なキーワード一致を中心に構造化することを目的とした従来のデータベースは、多くの場合、この点では不足しています。ただし、ベクトル・データベースでは、テキスト、イメージまたはその他のデータ型の埋込み密度、多次元表現を使用して、これらのサブレットを取得します。高次元の領域でデータをベクトルに変換することで、これらのデータベースにより、より洗練されたコンテキスト対応の検索が可能になります。この機能は、最も直接的に関連する情報を見つけることだけでなく、問合せとセマンティックに整合したレスポンスまたはコンテンツを理解して生成することが目標である、検索拡張生成タスクにおいて重要です。大規模なデータセットでトレーニングされた組み込みは、膨大な数の関係と概念をカプセル化できるため、より直感的で正確かつ効率的な情報取得と情報の生成が可能になるため、ユーザー・エクスペリエンスとデータドリブン・アプリケーションの有効性が大幅に向上します。


この投稿では、Llama2モデルを使用し、Oracle Cloud Infrastructure (OCI)データ・サイエンス・モデル・デプロイメントを使用してエンドポイントをデプロイします。Streamlitを使用して、質問を作成し、適切な回答で回答するアプリケーションを作成します。



ハイレベルのソリューションの概要



ソリューションのデプロイでは、次のステップを使用します。


  1. ユーザーは、Streamlit Webアプリケーションを介して質問を提供します。
  2. Streamlitアプリケーションは、モデル・デプロイメントへの予測コールAPIを呼び出します。
  3. モデル・デプロイメントは、Langchainを起動してユーザーの質問を埋込みに変換します。
  4. この関数は、Qdrant Service APIを呼び出して、ベクター・データベースにリクエストを送信し、上位kの類似ドキュメントを検索します。
  5. このファンクションは、ユーザー問合せおよび同様の文書をコンテキストとしてプロンプトを作成し、大きい言語モデル(LLM)にレスポンスを生成するように要求します。
  6. レスポンスは、関数からAPIゲートウェイに提供され、Streamlitサーバーに送信されます。
  7. ユーザーは、Streamlitアプリケーションでレスポンスを表示できます。



Getting started


この記事では、次のステップについて説明します。


  1. Qdrantデータベースインスタンスの設定
  2. LangchainによるQdrantの構築
  3. RAGの設定
  4. Streamlitサーバーのデプロイ


このソリューションを実装するには、LLMに精通したOCIアカウント、OCI OpenSearchへのアクセスおよびOCIデータ・サイエンス・モデル・デプロイメントが必要です。また、GPUインスタンス(できればA10.2)へのアクセスも必要です。開始には、次のGPUインスタンスを使用しました。



ワークフロー・ダイアグラムは、次のステップを実行します。


  1. 問合せを埋込みモデルに渡して、埋込み問合せベクトルとしてセマンティックに表します。
  2. 埋込み問合せベクトルをベクトル・データベースに渡します。
  3. 問合せの埋込みとナレッジ・ベース内のすべての埋込みチャンクとの間のk-nearest neighbors (KNN)で測定された、上位kの関連コンテキストを取得します。
  4. 問合せテキストおよび取得したコンテキスト・テキストをLLMに渡します。
  5. LLMは、提供されたコンテンツを使用してレスポンスを生成します。


ハードウェア要件


モデルの導入には、NVIDIA A10 GPUを使用する個別のOCIセットアップを使用します。このシナリオでは、NVIDIA A10.2インスタンスを使用して7bパラメータ・モデルをデプロイしました。VM.GPU.A10.2シェイプでLlama 7bモデルを使用することをお薦めします(GPU当たり24GBのRAM、2つのA10)。


前提条件


OCI Data Scienceで分散ファインチューニング・プロセスの実行に進む前に、主な前提条件を設定します:


  • 分散トレーニング中にサブネット上のホストが相互に接続できるように、サブネットのCIDRブロック内で発生したIPからの任意のポートへのイングレスを許可するように、セキュリティ・リストを使用してカスタム・サブネットを構成します。
  • オブジェクト・ストレージ・バケットを作成して、ベクトル・データベースでの取込み時に提供されるドキュメントを保存します。
  • OCI Data ScienceリソースがOCI Object Storageのバケット、ネットワーキングなどにアクセスできるようにするポリシーを設定します。
  • HuggingFaceからトークンにアクセスして、Llama2モデルをダウンロードします。モデルを微調整するには、まず事前トレーニング済モデルにアクセスする必要があります。事前トレーニング済モデルをMetaまたはHuggingFaceから取得します。この例では、HUGGING_FACE_HUB_TOKEN環境変数を設定して、HuggingFaceアクセス・トークンを使用して、HuggingFaceから事前トレーニング済モデルをダウンロードします。
  • トレーニングの進行状況を監視するためのログ・グループおよびログ・サービスからのログ。
  • OCI Loggingに移動し、「ログ・グループ」を選択します。
  • 既存のログ・グループを選択するか、作成します。
  • ログ・グループで、1つの予測ログと1つのアクセス・ログを作成します。
  • 「Create custom log」を選択します。
  • 名前(predict|access)を指定し、使用するログ・グループを選択します。
  • 「エージェント構成の作成」で、「構成の追加」を後で選択します。
  • 「エージェント構成の作成」を選択します。
  • ノートブック・セッション: 分散トレーニングを開始し、ファインチューニング・モデルにアクセスするために使用されます。
  • コマンドpip install oracle-ads[opctl] -Uを使用して、最新バージョンのOracle Accelerated Data Science (ADS)をインストールします。



Llama2モデルのデプロイ


A10.2 インスタンスへのLlama2モデルのデプロイ方法について説明した、OCIデータ・サイエンスのブログ「Deploy Llama 2」を参照してください。


モデルメモリの必要性を推定するために、Hugging Faceはモデルメモリ計算機を提供します。FurtherFurthermoreは、変圧器のメモリー要件の基本的な計算に関する洞察を得るために、Eleutherは、このテーマに関する有益な記事を発表しました。Qdrantデータベースにアクセスするためのモデル・デプロイメントの設定時に、カスタム・エグレス機能を使用します。



Qdrantデータベースの設定


Qdrantデータベースを設定するには、次のオプションを使用できます。


  • Dockerコンテナ・インスタンスの作成
  • Pythonクライアントの使用


Qdrantデータベースの設定についてさらに学習するには、このGitHubの例を参照してください。



LangchainでQdrantを初期化


QdrantはLangChainとスムーズに統合され、LangChain内のQdrantをVectorDBQAクラスとともに使用できます。最初のステップは、私たちのLLMの基礎知識として機能するすべての文書をコンパイルすることです。これらをdocsというリストに配置するとします。このリスト内の各項目は、段落のセグメントを含む文字列です。



Qdrantの初期化


次のタスクは、これらのドキュメントから埋込みを生成することです。説明するために、センテンス・トランスフォーマ・パッケージのコンパクト・モデルを使用します。


from langchain.vectorstores import Qdrant
from langchain.embeddings import LlamaCppEmbeddings
import qdrant_client
  
#Load the embeddings model
embedding = LlamaCppEmbeddings(model_path=model_folder_directory,n_gpu_layers=1000)

# Get your Qdrant URL and API Key
url = 
api_key = 

# Setting up Qdrant

client = qdrant_client.QdrantClient(
    url,
    api_key=api_key
)

qdrant = Qdrant(
    client=client, collection_name="my_documents",
    embeddings=embeddings
)


ベクトルデータベースにアップロードするクドラント


# If adding for the first time, this method recreate the collection
qdrant = Qdrant.from_texts(
                texts, # texts is a list of documents to convert in embeddings and store to vector DB
                embedding,
                url=url,
                api_key=api_key,
                collection_name="my_documents"
            )

# Adding following texts to the vector DB by calling the same object
qdrant.add_texts(texts) # texts is a list of documents to convert in embeddings and store to vector DB


ベクトルデータベースからのクドラント取得


Qdrantは、バッチ検索、範囲検索、地理空間検索、距離メトリックなどの類似検索方法に取得オプションを提供します。ここでは、プロンプトの質問に基づいて類似性検索を使用します。


qdrant = Qdrant(
    client=client, collection_name="my_documents",
    embeddings=embeddings
)

# Similarity search
docs = qdrant.similarity_search(prompt)


RAGの設定


Langchainが提供するプロンプトテンプレートとQAチェーンを使用してチャットボットを作成します。これにより、コンテキストと質問をLlama2ベースのモデルに直接渡すことができます。


from langchain.chains.question_answering import load_qa_chain
from langchain.prompts.prompt import PromptTemplate

template = """You are an assistant to the user, you are given some context below, please answer the query of the user with as detail as possible

Context:\"""
{context}
\"""

Question:\"
{question}
\"""

Answer:"""

chain = load_qa_chain(llm, chain_type="stuff", prompt=qa_prompt)

## Retrieve docs from Qdrant Vector DB based upon user prompt
docs = qdrant.similarity_search(user_prompt)

answer = chain({"input_documents": docs, "question": question,"context": docs}, return_only_outputs=True)['output_text']


Streamlitアプリケーションのホスティング


コンピュート・インスタンスを設定し、Streamlitアプリケーションをホストするには、Githubのreadmeに従います。





まとめ


Oracle Cloud無料トライアルをお試しください。300米ドルの無料クレジットを併用した30日間のトライアルでは、Oracle Cloud Infrastructure Data Scienceサービスにアクセスできます。詳細は、次のリソースを参照してください。


GitHubのOCI Data Scienceサンプル・リポジトリ内のすべてのファイルを含むフル・サンプル。


データ・サイエンス・サービスのドキュメントを参照してください。


OCI Data Science Feature Storeについてお読みください。


次の設定手順でOCIテナンシを構成し、OCI Data Scienceの使用を開始します。


新しいGitHubリポジトリに星を付けてクローニングします。ノートブック・チュートリアルとコード・サンプルが含まれていました。


私たちのチュートリアルを見る YouTubeプレイリスト.


LiveLabsのいずれかを試してください。「データ・サイエンス」を検索します。



コメント

このブログの人気の投稿

Oracle Database 19cサポート・タイムラインの重要な更新 (2024/11/20)

Oracle APEXのInteractive Gridで、Oracle Formsと比較して、重複行の検証を制御/通過させる方法 (2022/07/21)

Oracle APEX 24.1の一般提供の発表 (2024/06/17)