OpenAIが内蔵検索機能をリリースした今、RAGにベクターデータベースはまだ必要か?

OpenAIは、GPT-4 Turboモデル、新しいAssistants API、およびさまざまな機能強化を発表し、DevDay期間中に多数のリリースを行い、再び注目を集めました。Assistants APIは、開発者が特定のニーズに対応したオーダーメイドのAIアプリケーションを作成するのに役立つ強力なツールとして登場した。また、様々なタスクのための追加知識、より長いプロンプトの長さ、ツールを利用することもできる。
OpenAIアシスタントは、統合された検索機能を備えていますが、それは完璧ではありません。そこで、カスタムリトリーバーが役立ちます。OpenAIの関数呼び出し機能を利用することで、開発者はカスタマイズされたリトリーバーをシームレスに統合することができ、追加知識のスケールを高め、多様なユースケースによりフィットさせることができます。**このブログポストでは、OpenAIの組み込み検索の制約を掘り下げ、Milvusベクターデータベースを使用してカスタマイズされたレトリバーを作成する手順を説明します。
アシスタントのOpenAIの検索の限界とカスタム検索ソリューションの役割
OpenAIのビルトイン検索機能は、モデル固有の知識を超える飛躍を意味し、ユーザが独自の製品情報やユーザ提供のドキュメントなどの追加データでそれを補強することを可能にする。しかし、この機能には顕著な限界がある。
スケーラビリティの制約
OpenAI Retrievalは、ファイルおよび総ストレージの制約を課しており、広範なドキュメント・リポジトリでは不足する可能性がある:
アシスタントあたり最大20ファイル
ファイルあたり512MBの上限
1ファイルあたり200万トークンという隠れた制限。
1組織あたり100GB未満の合計サイズ制限
膨大なデータ・リポジトリを持つ組織にとって、これらの制限は課題となる。ストレージの限界にぶつかることなく、シームレスに成長するスケーラブルなソリューションが必須となる。**Milvus](https://zilliz.com/what-is-milvus)やZilliz Cloud(マネージドMilvus)のようなベクターデータベースを利用したカスタムリトリーバーを統合することで、OpenAIのビルトインリトリーバルに固有のファイル制限を回避することができます。
カスタマイズの欠如
OpenAIのRetrievalは、すぐに使える便利なソリューションを提供していますが、特にレイテンシと検索アルゴリズムのカスタマイズに関しては、すべてのアプリケーションの特定のニーズに一貫して沿うことはできません。**サードパーティのベクトルデータベースを利用することで、開発者は検索プロセスを最適化し、構成する柔軟性を得ることができます。
マルチテナントの欠如
検索はOpenAIアシスタントのビルトイン機能であり、各ユーザーの使用のみをサポートします。しかし、何百万人ものユーザーに共有ドキュメントとユーザーの個人情報の両方を提供することを目指す開発者であれば、ビルトインの検索機能は役に立ちません。共有ドキュメントを各ユーザーのアシスタントに複製すると、ストレージコストが増大します。一方、すべてのユーザーが同じアシスタントを共有すると、ユーザー固有のプライベートドキュメントをサポートする上で課題が生じます。
以下のグラフは、OpenAIのアシスタントにドキュメントを保存するコストが高いことを示しています(1GBあたり月額6円、参考までにAWS S3は0.023円)。
AssistantsのAPI価格は https://openai.com/pricing から](https://assets.zilliz.com/Assistants_API_Pricing_from_Open_AI_84f4eaa930.png)
膨大なデータセットを保有する組織にとって、スケーラブルで、効率的で、費用対効果の高い、特定の運用需要に沿った検索機能は必須である。幸いなことに、OpenAIの柔軟な関数呼び出し機能により、開発者はカスタムレトリバーをOpenAIアシスタントにシームレスに統合することができます。このソリューションにより、企業はOpenAIが提供する最高のAI機能を活用しながら、独自のニーズに合わせて拡張性と柔軟性を維持することができます。
カスタマイズされたOpenAI検索にMilvusを活用する
Milvusはオープンソースのベクトルデータベースで、数十億のベクトルをミリ秒以内に保存し、検索することができる。また、ユーザーの急成長するビジネスニーズに対応するため、高いスケーラビリティを備えています。迅速なスケーリングと超低レイテンシにより、Milvusベクトルデータベースは、OpenAIアシスタントのための高度にスケーラブルでより効率的なリトリーバを構築するための最良の選択肢の一つです。
カスタムOpenAIレトリバーの仕組み](https://assets.zilliz.com/How_a_custom_Open_AI_retriever_works_2b4a6d9f1c.png)
OpenAIの関数呼び出しとMilvusベクトルデータベースでカスタムレトリバーを構築する
ステップバイステップのガイドに従って、カスタムレトリバーを構築し、OpenAIと統合してみましょう。
- **1.環境のセットアップ。
pip install openai==1.2.0
pip install langchain==0.0.333
pip install pymilvus
export OPENAI_API_KEY=xxxx # ここにOpenAIのAPIキーを入力します。
- **このガイドでは、ベクターデータベースとしてMilvusを、ラッパーとしてLangChainを使用します。
from langchain.vectorstores import Milvus
from langchain.embeddings import OpenAIEmbeddings
# リトリーバの準備
vector_db = Milvus(
embedding_function=OpenAIEmbeddings()、
connection_args = {'host': 'localhost', 'port':'19530'}
)
retriever = vector_db.as_retriever(search_kwargs={'k': 5}) # ここでtop_kを変更します。
- **ドキュメントはパースされ、チャンクに分割され、エンベッディングに変換された後、ベクターデータベースに取り込まれる。開発者は検索品質を向上させるために各ステップをカスタマイズすることができる。
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# ドキュメントをパースしてチャンクする。
filepath = 'path/to/your/file'。
doc_data = TextLoader(filepath).load_and_split()。
RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
)
# チャンクをベクターデータベースに埋め込み、挿入する。
vector_db.add_texts([doc.page_content for doc in doc_data])
これで、個人または独自のデータに基づいてセマンティック検索を実行できるカスタムリトリーバを構築することに成功しました。次に、このレトリバーをOpenAIアシスタントと統合し、コンテンツ生成を可能にする必要があります。
- OpenAIの関数呼び出し機能を使ってアシスタントを作成します。 アシスタントは、クエリに応答するときに
CustomRetrieverという関数ツールを使うように指示されます。
import os
from openai import OpenAI
# OpenAIクライアントをセットアップする。
クライアント = OpenAI(api_key=os.getenv('OPENAI_API_KEY'))
# アシスタントを作成する。
my_assistant = client.beta.assistants.create(
name='Chat with a custom retriever'、
instructions='レトリバーを使って関連情報を検索し、検索された情報を元に質問に答えます'、
tools=[
{
'type': 'function'、
'function':{
'name': 'CustomRetriever'、
'description': '提供されたドキュメントから関連情報を取得する、
'parameters': {
'type': 'object'、
'properties': {'query': {'type': 'string', 'description': 'The user query'}}、
'required':['クエリ']
},
}
}
],
model='gpt-4-1106-preview', # ここでOpenAIのモデルを切り替えます。
)
- **Run
は Thread 中のアシスタントの呼び出しです。run 操作の間、アシスタントは関数がCustomRetriever` を呼び出す必要があるかどうかを判断し、関数呼び出しの結果を待ちます。
query = 'ここに質問を入力してください'
# スレッドを作成する。
my_thread = client.beta.threads.create(
messages=[
{
'role':'user'、
'content':QUERY、
}
]
)
# my_threadでmy_assistantの実行を呼び出す。
my_run = client.beta.threads.runs.create(
thread_id=my_thread.id、
assistant_id=my_assistant.id
)
# my_threadが停止するまで待つ。
while True:
my_run = client.beta.threads.runs.retrieve(thread_id=thread.id, run_id=my_run.id)
if my_run.status != 'queued':
break
- **クエリのベクトル検索を行い、結果を送信します。
# ベクトル検索を行い、OpenAI Run が次のアクションの準備ができたら結果を解析する
if my_run.status == 'requires_action':
tool_outputs = [] (ツール出力)
for tool_call in my_run.required_action.submit_tool_outputs.tool_calls:
if tool_call.function.name == 'Custom Retriever':
search_res = retriever.get_relevant_documents(QUERY)
tool_outputs.append({
'tool_call_id': tool_call.id、
'output': ('\n').join([res.page_content for res in search_res])
})
# 検索結果をRunサービスに送信する
client.beta.threads.runs.submit_tool_outputs(
thread_id=my_thread.id、
run_id=my_run.id、
tool_outputs=tool_outputs
)
- **OpenAIとの完全な会話を抽出し、解析する。
messages = client.beta.threads.messages.list(
thread_id=my_thread.id
)
for m in messages:
print(f'{m.role}: {m.content[0].text.value}n')
これで完了です!Milvusのカスタムリトリーバを利用して、提供された知識についてOpenAIアシスタントとチャットすることに成功しました。
結論
OpenAI Assistantsのビルトイン検索ツールは印象的だが、ストレージの制約、スケーラビリティの問題、多様なユーザーニーズに対するカスタマイズの欠如といった制限に悩まされている。また、個人ユーザーのみを対象としているため、数百万人のユーザーと共有・非公開のドキュメントを扱うアプリケーションには課題がある。
Milvus](https://zilliz.com/what-is-milvus)やZilliz Cloud(Milvusのフルマネージドバージョン)のような堅牢なベクターデータベースを使用してカスタムレトリバーを作成することは、上記の課題を克服するのに役立ちます。このアプローチでは、OpenAI Assistant APIの統合により、柔軟性が向上し、ファイル管理の制御が可能になります。
次の投稿では、OpenAI Retrievalとカスタムリトリーバのパフォーマンス、コスト、機能を比較します。また、ベンチマーク結果を公開し、検索品質を向上させる最適なソリューションを求めている開発者に貴重な洞察を提供します。ご期待ください!
読み続けて

Zero-Downtime Migration Now Available in Zilliz Cloud Private Preview
Zero-Downtime Migration enables seamless cluster-to-cluster migrations within Zilliz Cloud while maintaining full service availability.

Optimizing Embedding Model Selection with TDA Clustering: A Strategic Guide for Vector Databases
Discover how Topological Data Analysis (TDA) reveals hidden embedding model weaknesses and helps optimize vector database performance.

Building RAG Pipelines for Real-Time Data with Cloudera and Milvus
explore how Cloudera can be integrated with Milvus to effectively implement some of the key functionalities of RAG pipelines.
