Haystack 統合を使い始める
Atlas Vector Searchと Haystack を統合できます を使用してカスタムLLM アプリケーションを構築し、検索拡張生成(RAG )を実装します。このチュートリアルでは、Haystack と Atlas Vector Search の使用を開始して、データに対してセマンティック検索を実行し、 RAG実装を構築する方法を説明します。 具体的には、次のアクションを実行します。
環境を設定します。
Atlas Vector Search インデックスの作成。
カスタム データを Atlas に保存します。
Atlas Vector Search を使用してデータの質問に答え、 RAGを実装します。
バックグラウンド
Haystack は、 LLM 、埋め込みモデル、ベクトル検索を使用してカスタム アプリケーションを構築するためのフレームワークです。 Atlas Vector Searchを Haystack と統合することで、 Atlasをベクトルデータベースとして使用し、 Atlas Vector Searchを使用してセマンティックで類似したドキュメントを検索してRAGを実装することができます。 RGRAG Atlas Vector Searchの詳細については、「 を使用した 検索拡張生成(RAG ) 」を してください。
前提条件
Atlas の サンプル データ セット からの映画データを含むコレクションを使用します。
環境を設定する
このチュートリアルの環境を設定します。 .ipynb
拡張機能のファイルを保存して、インタラクティブPythonノートを作成します。このノートはPythonコード スニペットを個別に実行でき、このチュートリアルのコードを実行するために使用します。
ノートク環境を設定するには、次の手順に従います。
依存関係をインストールしてインポートします。
次のコマンドを実行します:
pip --quiet install mongodb-atlas-haystack pymongo 必要なパッケージをインポートするには、次のコードを実行します。
import getpass, os from haystack import Pipeline, Document from haystack.document_stores.types import DuplicatePolicy from haystack.components.writers import DocumentWriter from haystack.components.generators import OpenAIGenerator from haystack.components.builders.prompt_builder import PromptBuilder from haystack.components.embedders import OpenAITextEmbedder, OpenAIDocumentEmbedder from haystack_integrations.document_stores.mongodb_atlas import MongoDBAtlasDocumentStore from haystack_integrations.components.retrievers.mongodb_atlas import MongoDBAtlasEmbeddingRetriever from pymongo import MongoClient from pymongo.operations import SearchIndexModel
環境変数を定義します。
次のコードを実行し、プロンプトが表示されたら、次の内容を提供します。
OpenAI API キー。
Atlas クラスターのSRV接続文字列。
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:") os.environ["MONGO_CONNECTION_STRING"]=getpass.getpass("MongoDB Atlas Connection String:")
注意
接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
Atlas Vector Search インデックスの作成
注意
Atlas Vector Search インデックスを作成するには、Atlas プロジェクトに対するProject Data Access Admin
以上のアクセス権が必要です。
このセクションでは、カスタム データを保存するためのhaystack_db
データベースとtest
コレクションを作成します。 次に、データに対してベクトル検索クエリを有効にするために、Atlas Vector Search インデックスを作成します。
Atlas Vector Search インデックスを定義します。
次のコードを実行して、 vectorSearchタイプのインデックスを作成します。 embedding
フィールドには、OpenAI のtext-embedding-ada-002
埋め込みモデルを使用して作成する埋め込みが含まれます。 インデックス定義では、 1536
ベクトル次元を指定し、 cosine
を使用して類似性を測定します。
# Create your index model, then create the search index search_index_model = SearchIndexModel( definition={ "fields": [ { "type": "vector", "path": "embedding", "numDimensions": 1536, "similarity": "cosine" } ] }, name="vector_index", type="vectorSearch" ) collection.create_search_index(model=search_index_model)
インデックスの構築には約 1 分かかります。 構築中、インデックスは最初の同期状態になります。 構築が完了したら、コレクション内のデータのクエリを開始できます。
Atlas でのカスタム データの保存
このセクションでは、 ドキュメント ストア と呼ばれるベクトル データベースとして Atlas をインスタンス化します 。次に、カスタム データからベクトル埋め込みを作成し、これらのドキュメントを Atlas のコレクションに保存します。 次のコード スニペットをノートに貼り付けて実行します。
Atlas をドキュメント ストアとしてインスタンス化します。
次のコードを実行して、Atlas をドキュメント ストアとしてインスタンス化します。 このコードは、Atlas クラスターへの接続を確立し、次の項目を指定します。
haystack_db
ドキュメントの保存に使用される Atlas データベースとコレクションであるtest
と :vector_index
セマンティック検索クエリを実行するために使用されるインデックス。
document_store = MongoDBAtlasDocumentStore( database_name="haystack_db", collection_name="test", vector_search_index="vector_index", )
Atlas クラスターに サンプル データ をロードします。
このコードは、いくつかのサンプル ドキュメントを定義し、 パイプライン を実行します 次のコンポーネントを含む。
埋め込み OpenAI により、ドキュメントがベクトル埋め込みに変換されます。
# Create some example documents documents = [ Document(content="My name is Jean and I live in Paris."), Document(content="My name is Mark and I live in Berlin."), Document(content="My name is Giorgio and I live in Rome."), ] # Initializing a document embedder to convert text content into vectorized form. doc_embedder = OpenAIDocumentEmbedder() # Setting up a document writer to handle the insertion of documents into the MongoDB collection. doc_writer = DocumentWriter(document_store=document_store, policy=DuplicatePolicy.SKIP) # Creating a pipeline for indexing documents. The pipeline includes embedding and writing documents. indexing_pipe = Pipeline() indexing_pipe.add_component(instance=doc_embedder, name="doc_embedder") indexing_pipe.add_component(instance=doc_writer, name="doc_writer") # Connecting the components of the pipeline for document flow. indexing_pipe.connect("doc_embedder.documents", "doc_writer.documents") # Running the pipeline with the list of documents to index them in MongoDB. indexing_pipe.run({"doc_embedder": {"documents": documents}})
Calculating embeddings: 100%|██████████| 1/1 [00:00<00:00, 4.16it/s] {'doc_embedder': {'meta': {'model': 'text-embedding-ada-002', 'usage': {'prompt_tokens': 32, 'total_tokens': 32}}}, 'doc_writer': {'documents_written': 3}}
Tip
サンプル コードを実行した後、クラスター内のhaystack_db.test
コレクションに移動すると、Atlas UI でベクトル埋め込みを表示できます。
データに関する質問に答えます
このセクションでは、RAG Atlas Vector Searchと Haystack を使用してアプリケーションに実装する方法を説明します。
次のコードは、 パイプライン を定義して実行します 次のコンポーネントが含まれます。
OpenAIテキスト埋め込み 埋め込み クエリから埋め込みを作成します。
MongoDBAtlas埋め込みRetriggers 検索要素 クエリ埋め込みと同様の埋め込みをドキュメントストアから検索します。
PromptBuilder は、プロンプトのコンテキストとして、検索されたドキュメントを使用するように LLMに指示するプロンプトを渡します。
OpenAIGenerator ジェネレーター の LLMLM を使用してコンテキストを認識する応答を生成します。
この例では、サンプル クエリ Where does Mark live?
を使用してLLMをプロンプトします。 LLMは、 Atlasに保存したカスタム データから、正確でコンテキストを認識する応答を生成します。
# Template for generating prompts for a movie recommendation engine. prompt_template = """ You are an assistant allowed to use the following context documents.\nDocuments: {% for doc in documents %} {{ doc.content }} {% endfor %} \nQuery: {{query}} \nAnswer: """ # Setting up a retrieval-augmented generation (RAG) pipeline for generating responses. rag_pipeline = Pipeline() rag_pipeline.add_component("text_embedder", OpenAITextEmbedder()) # Adding a component for retrieving related documents from MongoDB based on the query embedding. rag_pipeline.add_component(instance=MongoDBAtlasEmbeddingRetriever(document_store=document_store,top_k=15), name="retriever") # Building prompts based on retrieved documents to be used for generating responses. rag_pipeline.add_component(instance=PromptBuilder(template=prompt_template), name="prompt_builder") # Adding a language model generator to produce the final text output. rag_pipeline.add_component(instance=OpenAIGenerator(), name="llm") # Connecting the components of the RAG pipeline to ensure proper data flow. rag_pipeline.connect("text_embedder.embedding", "retriever.query_embedding") rag_pipeline.connect("retriever", "prompt_builder.documents") rag_pipeline.connect("prompt_builder", "llm") # Run the pipeline query = "Where does Mark live?" result = rag_pipeline.run( { "text_embedder": {"text": query}, "prompt_builder": {"query": query}, }); print(result['llm']['replies'][0])
Mark lives in Berlin.
次のステップ
MongoDBは、次の開発者リソースも提供しています。