Zilliz CloudとAWS BedrockでRAGを構築する:ナラティブガイド
Zilliz CloudとAWS Bedrockを使用してRAGアプリケーションを構築する方法に関する包括的なガイド
検索強化型生成(RAG)は、情報検索と自然言語処理(NLP)を組み合わせてテキスト生成を強化するAIのフレームワークである。このシステムでは、言語モデル に、クエリに応答して知識ベースや外部データベースを検索できる検索メカニズムが追加される。こうすることで、最新の関連情報を応答に取り込むことができ、より正確で文脈に富んだ出力が得られる。
Zilliz Cloudは、データを効率的に管理、分析、検索するためのツールを提供するプラットフォームである。AWS Marketplaceで利用可能であり、オープンソースのMilvus ベクトルデータベース上に構築されたZilliz Cloudは、大規模なベクトル化データの保存と処理のためのソリューションを提供する。RAGの文脈では、Zilliz Cloudのベクトルデータベースの機能は、ベクトル埋め込みの大規模なセットを格納し、検索するために活用することができ、RAGフレームワークの検索コンポーネントを容易にします。
AWS Bedrockは、事前に訓練された様々な基礎モデルへのアクセスを提供するクラウドサービスです。これは、NLPソリューションのデプロイとスケーリングのための堅牢なインフラストラクチャを提供し、開発者が言語生成、理解、翻訳のためのモデルをプロジェクトに統合することを可能にする。RAGの実装では、AWS Bedrockでアクセス可能な言語モデルが生成の側面を処理し、首尾一貫して文脈に関連したテキスト応答を作成し、検索された情報をシームレスに統合することができます。
Zilliz CloudとAWS Bedrockの統合の例を見てみよう。
Zilliz CloudとAWS Bedrockを統合し、図1のようなRAGアプリケーションを実装したコード例を見てみましょう。
コード例](https://assets.zilliz.com/Fig_1_Main_steps_in_implementing_a_RAG_application_using_Zilliz_Cloud_and_AWS_Bedrock_589680d85d.png)
図1.Zilliz CloudとAWS Bedrockを使ったRAGアプリケーションの主な実装手順
#パッケージをダウンロードし、インポートする。
pip install --upgrade --quiet langchain langchain-core langchain-text-splitters langchain-community langchain-aws bs4 boto3
# 例えば
bs4 をインポートする
import boto3
AWS bedrockとZilliz Cloudへの接続設定
次のステップでは、AWS と Zilliz Cloud サービスに接続するために必要な環境変数を設定します。AWSのリージョンとアクセスキーは、必要なクレデンシャルとリージョン構成を提供するように設定され、AWS Bedrockサービスとのスムーズな統合を保証する。同様に、Zilliz CloudのURIとAPIキーが設定され、アプリケーションがZilliz Cloudプラットフォームに安全に接続できるようにします。Zilliz Cloudプラットフォームは、RAGシステムの検索操作に不可欠なベクトルデータベース機能を提供します。
# AWS のリージョンとアクセスキーの環境変数を設定する。
REGION_NAME = "us-east-1"
AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")
# ZILLIZクラウド環境変数の設定
ZILLIZ_CLOUD_URI = os.getenv("ZILLIZ_CLOUD_URI")
ZILLIZ_CLOUD_API_KEY = os.getenv("ZILLIZ_CLOUD_API_KEY")
指定された認証情報を使ってAWS Bedrock Runtimeサービスに接続するためのboto3クライアントが作成され、AWS Bedrockの言語モデルの統合が可能になります。ChatBedrock](https://python.langchain.com/docs/integrations/chat/bedrock/)インスタンスが初期化され、クライアントにリンクされ、特定の言語モデル(この場合は˶anthropic.claude-3-sonnet-20240229-v1:0
)を使用するように設定されます。この設定により、応答のばらつきを制御するための低温パラメータなど、モデル固有の設定とともに、テキスト応答を生成するために必要なインフラが提供される。BedrockEmbeddings`インスタンスは、テキストのような非構造化データをベクトル表現に変換することができる。
# 指定された認証情報でboto3クライアントを作成する。
client = boto3.client(
"bedrock-runtime"、
region_name=REGION_NAME、
aws_access_key_id=AWS_ACCESS_KEY_ID、
aws_secret_access_key=AWS_SECRET_ACCESS_KEY、
)
# 言語モデル操作用のChatBedrockインスタンスを初期化します。
llm = ChatBedrock(
client=client、
model_id="anthropic.claude-3-sonnet-20240229-v1:0",
region_name=REGION_NAME、
model_kwargs={"temperature":0.1},
)
# テキスト埋め込みを扱うためのBedrockEmbeddingsインスタンスを初期化する。
embeddings = BedrockEmbeddings(client=client, region_name=REGION_NAME)
情報の収集と処理
埋め込みモデルがインスタンス化されたので、次は外部ソースからデータを読み込みます。 WebBaseLoade](https://python.langchain.com/docs/integrations/document_loaders/web_base/)インスタンスは、特定のウェブソースからコンテンツを取得するために作成されます。このケースでは、AIエージェントに関するブログ記事からコンテンツをロードするように設定されています。次にローダーは、指定されたウェブ・ソースからドキュメントを取得し、処理の準備が整ったコンテンツのコレクションを提供する。次に、RecursiveCharacterTextSplitter インスタンスを使用して、取得したドキュメントをより小さなテキストチャンクに分割します。これにより、コンテンツが管理しやすくなり、テキスト埋め込みモジュールや言語生成モジュールなどの他のコンポーネントに送り込んで、さらに処理できるようになる。
# ウェブソースからドキュメントを読み込むための WebBaseLoader インスタンスを作成する。
loader = WebBaseLoader(
web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",)、
bs_kwargs=dict(
parse_only=bs4.SoupStrainer()
class_=("post-content", "post-title", "post-header")
)
),
)
# ローダーを使ってウェブソースからドキュメントをロードする
documents = loader.load()
# テキストをチャンクに分割するための RecursiveCharacterTextSplitter を初期化します。
text_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200)
# text_splitterを使ってドキュメントをチャンクに分割する
docs = text_splitter.split_documents(documents)
レスポンスの生成
事前に定義されたプロンプトテンプレートが各回答の構造を導き、可能な限り統計的な情報と数字を使用し、必要な情報が不足している場合は回答を捏造しないようにAIに指示する。
# AIの回答を生成するためのプロンプトテンプレートを定義する
prompt_template = """
Human: あなたはファイナンシャルアドバイザーのAIシステムで、可能な限り事実に基づいた統計的な情報を使って質問への回答を提供します。
以下の情報を使って、<question>タグで囲まれた質問に簡潔に答えてください。
答えがわからない場合は、わからないとだけ答え、答えを作ろうとしないでください。
<context>
{コンテキスト}
</context>
<question>
質問
</question>
回答は具体的で、可能であれば統計や数字を使うこと。
アシスタント:""
# 定義されたテンプレートと入力変数でPromptTemplateインスタンスを作成する
prompt = PromptTemplate(
template=PROMPT_TEMPLATE, input_variables=["context", "question"].
)
読み込まれたドキュメントと埋め込みデータからZillizベクトルストアが初期化され、Zillizクラウドプラットフォームに接続されます。このストアはドキュメントをベクトルとして整理し、RAG操作のための迅速かつ効率的なドキュメント検索を容易にする。そして、検索されたドキュメントは首尾一貫したテキストにフォーマットされ、AIが回答に統合する物語を作成し、事実に基づき、洞察に満ちた、ユーザーのニーズに関連した回答を提供する。
# 読み込まれたドキュメントと埋め込みデータからZillizベクトルストアを初期化する。
vectorstore = Zilliz.from_documents(
documents=docs、
embedding=embeddings、
connection_args={
"uri":zilliz_cloud_uri、
"token":zilliz_cloud_api_key、
"secure":セキュア(secure)": true、
},
auto_id=True、
drop_old=True、
)
# ドキュメントの検索と生成のためにレトリバーを作成します。
retriever = vectorstore.as_retriever()
# 取得したドキュメントをフォーマットする関数を定義する
def format_docs(docs):
return "⦅docs".join(doc.page_content for doc in docs)
最後に、AIレスポンスを生成するための完全なRAGチェーンと、その使い方を示す。このチェーンは、まずユーザーのクエリに関連するドキュメントをベクターストアから取得し、それらをリトリーバーとフォーマッターで処理し、次にそれらをプロンプトテンプレートに渡して応答構造をフォーマットすることで動作する。この構造化された入力は、次に言語モデルに供給され、首尾一貫した応答を生成し、文字列形式に解析されてユーザーに提示され、正確で情報に基づいた回答を提供する。
# AI応答生成のためのRAG(Retrieval-Augmented Generation)チェーンを定義する。
rag_chain = (
{"context": retriever | format_docs, "question":RunnablePassthrough()}|プロンプト
| プロンプト
| プロンプト
| StrOutputParser()
)
# rag_chain.get_graph().print_ascii()
# 特定の質問でRAGチェーンを起動し、回答を取得する
res = rag_chain.invoke("AIエージェントの自己反省とは?")
print(res)
モデルからの回答は以下のようになります。
自己反省は、自律型AIエージェントが過去の行動、決定、間違いを分析し、改良することによって、反復的に改善することを可能にする重要な能力である。AIエージェントにとっての自己反省の重要な側面には、以下のようなものがある:
1.過去の推論の軌跡と行動シーケンスの効率と有効性を評価し、非効率的な計画や幻覚(進歩のない連続した同一の行動を生成する)のような潜在的な問題を特定する。
2.将来の行動を導くために、過去の経験からの観察や記憶をより高いレベルの推論や要約に統合すること。
Zilliz Cloud IntegrationとAWS Bedrockの利点
表1に示すように、Zilliz CloudとAWS Bedrockはシームレスに統合され、RAGアプリケーションに効率性、拡張性、正確性を提供する。この相乗効果により、大規模なデータセットを扱う包括的なソリューションの開発が可能になり、より正確な回答を提供し、RAGチェーンの実装を簡素化することができる。
| ストレージと検索|Milvus上に構築された管理されたベクトルデータベースを提供。 | 様々な言語モデルとの統合が可能。 | Zilliz Cloudのベクトル・ストレージとAWS BedrockのNLP機能を組み合わせることで、AIを活用したクエリの効率を高め、関連情報への迅速なアクセスを可能にする。 | | スケーラビリティ|Zilliz Cloudのインフラは大規模なデータの保存と検索をサポートし、膨大なデータセットの効率的な管理を可能にする。 | AWS BedrockはスケーラブルなNLPソリューションを提供し、多様なモデルに対応し、大量のクエリをシームレスに処理する。 | この統合は、データストレージと言語生成の両方にスケーラビリティを提供し、膨大なデータセットを扱い、頻繁な検索と処理を必要とするプロジェクトに理想的です。| | 精度|Zilliz Cloudは、ベクトル埋め込みによる正確なデータ検索を可能にし、関連情報が正確に取得されることを保証する。| AWS Bedrockの言語モデルは、検索された情報をレスポンスに組み込むことができ、首尾一貫した文脈に沿った正確なアウトプットを提供する。| この相乗効果により、幻覚を最小限に抑え、事実に基づいた正確な応答が保証され、AI主導のクエリとデータ検索の品質が向上する。 | | 実装の容易さ|Zilliz CloudはわかりやすいAPIとPythonライブラリとの統合を提供し、ベクトルストアのセットアップを簡素化する。 | AWS Bedrockは、訓練済みモデルとの容易な統合と、NLPタスクのための柔軟な構成を提供する。 | この組み合わせは、RAGチェーンの実装にシンプルで効率的なアプローチを提供し、様々なアプリケーションのための包括的なソリューションの構築を容易にします。
表1.Zilliz CloudとAWS Bedrockを統合するメリット
結論
このブログでは、RAGシステムを実装するためのZilliz CloudとAWS Bedrockの統合をデモンストレーションした。我々は、Milvus上に構築されたZilliz Cloudのベクトルデータベースが、ベクトル埋め込み用のスケーラブルなストレージと検索ソリューションを提供する一方で、AWS Bedrockが言語生成用のロバストな事前学習済みモデルを提供することを見た。コード例では、両サービスへの接続設定、外部ソースからのデータのロード、処理と分割、関連情報を検索して首尾一貫した応答に統合する完全なRAGチェーンの構築について説明した。このセットアップにより、幻覚や不正確さが最小限に抑えられ、最新の NLP モデルとベクトル・データベースの相乗効果が実証されます。ぜひこのガイドを読んで、あなたのプロジェクトに同様のテクニックを適用する方法を検討してみてください。そうすることで、金融アドバイスからカスタマーサポートまで、様々な領域で正確で文脈に富んだ応答を提供する強力なアプリケーションを構築することができます。RAG、Zilliz Cloud、そしてAWS Bedrockをより深く理解するための追加リソースはこちらです:
リソース
Milvus® 上に構築されたマネージド・ベクター・データベース Zilliz Cloud](https://zilliz.com/cloud)
ファンデーションモデルによるジェネレーティブAIアプリケーションの構築 - Amazon Bedrock](https://aws.amazon.com/bedrock/)
Retrieval Augmented Generation (RAG)によるAIアプリケーションの構築](https://zilliz.com/learn/Retrieval-Augmented-Generation)
ベクターライブラリ対ベクターデータベース - Zilliz blog](https://zilliz.com/learn/vector-library-versus-vector-database)
WebBaseLoader | 🦜️🔗 LangChain](https://python.langchain.com/docs/integrations/document_loaders/web_base/)
Beautiful Soup 4.12.0 ドキュメント](https://www.crummy.com/software/BeautifulSoup/bs4/doc/)
文字による再帰的分割 | 🦜️🔗 LangChain](https://python.langchain.com/docs/modules/data_connection/document_transformers/recursive_text_splitter/)
大規模言語モデル (LLM)](https://zilliz.com/glossary/large-language-models-(llms))
Boto3 1.34.95ドキュメント](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)