Docs Menu
Docs Home
/
MongoDB Atlas
/ /

Haystack 統合を使い始める

項目一覧

  • バックグラウンド
  • 前提条件
  • 環境を設定する
  • Atlas Vector Search インデックスの作成
  • Atlas でのカスタム データの保存
  • データに関する質問に答えます
  • 次のステップ

Atlas Vector Searchと Haystack を統合できます を使用してカスタムLLM アプリケーションを構築し、検索拡張生成(RAG )を実装します。このチュートリアルでは、Haystack と Atlas Vector Search の使用を開始して、データに対してセマンティック検索を実行し、 RAG実装を構築する方法を説明します。 具体的には、次のアクションを実行します。

  1. 環境を設定します。

  2. Atlas Vector Search インデックスの作成。

  3. カスタム データを Atlas に保存します。

  4. Atlas Vector Search を使用してデータの質問に答え、 RAGを実装します。

Haystack は、 LLM 、埋め込みモデル、ベクトル検索を使用してカスタム アプリケーションを構築するためのフレームワークです。 Atlas Vector Searchを Haystack と統合することで、 Atlasをベクトルデータベースとして使用し、 Atlas Vector Searchを使用してセマンティックで類似したドキュメントを検索してRAGを実装することができます。 RGRAG Atlas Vector Searchの詳細については、「 を使用した 検索拡張生成(RAG ) 」を してください。

Atlas の サンプル データ セット からの映画データを含むコレクションを使用します。

  • MongoDB バージョン 6.0.11 を実行している Atlas クラスター、 7.0.2、またはそれ以降( RCを含む)。

  • OpenAI API キー。 API リクエストに使用できるクレジットを持つ有料の OpenAI アカウントが必要です。

  • Colas などの Python プロジェクトを実行するためのノート。

    注意

    Colab を使用している場合は、ノートブックセッションの IP アドレスが Atlas プロジェクトのアクセスリストに含まれていることを確認します。

このチュートリアルの環境を設定します。 .ipynb 拡張機能のファイルを保存して、インタラクティブPythonノートを作成します。このノートはPythonコード スニペットを個別に実行でき、このチュートリアルのコードを実行するために使用します。

ノートク環境を設定するには、次の手順に従います。

1
  1. 次のコマンドを実行します:

    pip --quiet install mongodb-atlas-haystack pymongo
  2. 必要なパッケージをインポートするには、次のコードを実行します。

    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
2

次のコードを実行し、プロンプトが表示されたら、次の内容を提供します。

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 プロジェクトに対するProject Data Access Admin以上のアクセス権が必要です。

このセクションでは、カスタム データを保存するためのhaystack_dbデータベースとtestコレクションを作成します。 次に、データに対してベクトル検索クエリを有効にするために、Atlas Vector Search インデックスを作成します。

1
client = MongoClient(os.environ.get("MONGO_CONNECTION_STRING"))
2

次のコードを実行して、 haystack_dbデータベースとtestコレクションを作成します。

# Create your database and collection
db_name = "haystack_db"
collection_name = "test"
database = client[db_name]
database.create_collection(collection_name)
# Define collection
collection = client[db_name][collection_name]
3

次のコードを実行して、 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 のコレクションに保存します。 次のコード スニペットをノートに貼り付けて実行します。

1

次のコードを実行して、Atlas をドキュメント ストアとしてインスタンス化します。 このコードは、Atlas クラスターへの接続を確立し、次の項目を指定します。

  • haystack_db ドキュメントの保存に使用される Atlas データベースとコレクションであるtestと :

  • vector_index セマンティック検索クエリを実行するために使用されるインデックス。

document_store = MongoDBAtlasDocumentStore(
database_name="haystack_db",
collection_name="test",
vector_search_index="vector_index",
)
2

このコードは、いくつかのサンプル ドキュメントを定義し、 パイプライン を実行します 次のコンポーネントを含む。

  • 埋め込み 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 を使用してアプリケーションに実装する方法を説明します。

次のコードは、 パイプライン を定義して実行します 次のコンポーネントが含まれます。

この例では、サンプル クエリ 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は、次の開発者リソースも提供しています。

Tip

以下も参照してください。

戻る

セマンティック カーネル