Docs Menu
Docs Home
/
MongoDB Atlas
/ / /

LgChart 統合を使用したハイブリッド検索の実行

項目一覧

  • 前提条件
  • 環境を設定する
  • Atlas をベクトル ストアとして使用
  • インデックスの作成
  • ハイブリッド検索クエリの実行
  • 結果を RG パイプラインに渡す

Atlas ベクトル検索を Lgachein と統合すると、 ハイブリッド検索を実行できます。このチュートリアルでは、次の手順を実行します。

  1. 環境を設定します。

  2. Atlas をベクトルストアとして使用します。

  3. データに Atlas ベクトル検索と Atlas Searchインデックスを作成します。

  4. ハイブリッド検索クエリを実行します。

  5. クエリ結果を RAGパイプラインに渡します。

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

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

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

  • Comb などのインタラクティブ Python ノートを実行するための環境。

    注意

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

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

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

1

ノートブックで次のコマンドを実行します。

pip install --upgrade --quiet langchain langchain-community langchain-core langchain-mongodb langchain-openai pymongo pypdf
2

このチュートリアルの環境変数を設定するには、次のコードを実行します。プロンプトが表示されたら、OpenAI APIキーと Atlas クラスターの SRV接続文字列を入力します。

import getpass, os
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
ATLAS_CONNECTION_STRING = getpass.getpass("MongoDB Atlas SRV Connection String:")

注意

接続stringには、次の形式を使用する必要があります。

mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

データのベクトルストアとして Atlas を使用する必要があります。 Atlas では既存のコレクションを使用してベクトルストアをインスタンス化できます。

2

次のコードをノート PC に貼り付けて実行し、Atlas の sample_mflix.embedded_movies名前空間から vector_store という名前のベクトルストアインスタンスを作成します。このコードでは、from_connection_string メソッドを使用して MongoDBAtlasVectorSearchベクトルストアを作成し、次のパラメータを指定します。

  • Atlas クラスターの接続文字列。

  • テキストをベクトル埋め込みに変換するために使用されるモデルとしての OpenAI 埋め込みモデル。デフォルトでは 、このモデルは text-embedding-ada-002 です。

  • sample_mflix.embedded movies 使用する名前空間として 。

  • plot : テキストを含むフィールド。

  • plot_embedding 埋め込みを含むフィールドとして。

  • dotProduct 関連性スコア関数として。

from langchain_mongodb import MongoDBAtlasVectorSearch
from langchain_openai import OpenAIEmbeddings
# Create the vector store
vector_store = MongoDBAtlasVectorSearch.from_connection_string(
connection_string = ATLAS_CONNECTION_STRING,
embedding = OpenAIEmbeddings(disallowed_special=()),
namespace = "sample_mflix.embedded_movies",
text_key = "plot",
embedding_key = "plot_embedding",
relevance_score_fn = "dotProduct"
)

Tip

注意

Atlas ベクトル検索または Atlas SearchProject Data Access Admin インデックスを作成するには、Atlasプロジェクトへの 以上のアクセス権が必要です。

ベクトルストアでハイブリッド検索クエリを有効にするには、コレクションに Atlas ベクトル検索と Atlas Searchインデックスを作成します。インデックスは、LgChuinヘルパーメソッドまたはPyMongoドライバー メソッドのいずれかを使用して作成できます。

1

次のコードを実行して、コレクションのplot_embedding フィールドにインデックスを付けるベクトル検索インデックスを作成します。

# Use helper method to create the vector search index
vector_store.create_vector_search_index(
dimensions = 1536
)
2

plotノート次のコードを実行して、コレクションの フィールドにインデックスを付けるための検索インデックスを作成します。

from langchain_mongodb.index import create_fulltext_search_index
from pymongo import MongoClient
# Connect to your cluster
client = MongoClient(ATLAS_CONNECTION_STRING)
# Use helper method to create the search index
create_fulltext_search_index(
collection = client["sample_mflix"]["embedded_movies"],
field = "plot",
index_name = "search_index"
)
1

次のコードを実行して、コレクションのplot_embedding フィールドにインデックスを付けるベクトル検索インデックスを作成します。

from pymongo import MongoClient
from pymongo.operations import SearchIndexModel
# Connect to your cluster
client = MongoClient(ATLAS_CONNECTION_STRING)
collection = client["sample_mflix"]["embedded_movies"]
# Create your vector search index model, then create the index
vector_index_model = SearchIndexModel(
definition={
"fields": [
{
"type": "vector",
"path": "plot_embedding",
"numDimensions": 1536,
"similarity": "dotProduct"
}
]
},
name="vector_index",
type="vectorSearch"
)
collection.create_search_index(model=vector_index_model)
2

次のコードを実行して、コレクションのplot フィールドにインデックスを付けるための検索インデックスを作成します。

1# Create your search index model, then create the search index
2search_index_model = SearchIndexModel(
3 definition={
4 "mappings": {
5 "dynamic": False,
6 "fields": {
7 "plot": {
8 "type": "string"
9 }
10 }
11 }
12 },
13 name="search_index"
14)
15collection.create_search_index(model=search_index_model)

インデックスの構築には約 1 分かかります。 構築中、インデックスは最初の同期状態になります。 構築が完了したら、コレクション内のデータのクエリを開始できます。

Atlas によってインデックスがビルドされたら、データに対してハイブリッド検索クエリを実行できます。次のコードでは、MongoDBAtlasHybridSearchRetriever リトリバーを使用して stringtime travel のハイブリッド検索を実行します。また、次のパラメータも指定します。

  • vectorstore:ベクトルストアインスタンスの名前。

  • search_index_name: Atlas Searchインデックスの名前。

  • top_k: 返されるドキュメントの数。

  • fulltext_penalty: 全文検索のペナルティ。

    ペナルティが低いほど、全文検索スコアが高くなります。

  • vector_penalty:ベクトル検索のペナルティ。

    ペナルティが低いほどベクトル検索スコアが高くなります。

レプリカは、全文検索スコアとベクトル検索スコアの合計でソートされたドキュメントのリストを返します。コード例の最終出力には、タイトル、プロット、および 各ドキュメントの異なるスコアが含まれます。

ハイブリッド検索クエリー結果の詳細については、「 クエリについて 」を参照してください。

from langchain_mongodb.retrievers.hybrid_search import MongoDBAtlasHybridSearchRetriever
# Initialize the retriever
retriever = MongoDBAtlasHybridSearchRetriever(
vectorstore = vector_store,
search_index_name = "search_index",
top_k = 5,
fulltext_penalty = 50,
vector_penalty = 50
)
# Define your query
query = "time travel"
# Print results
documents = retriever.invoke(query)
for doc in documents:
print("Title: " + doc.metadata["title"])
print("Plot: " + doc.page_content)
print("Search score: {}".format(doc.metadata["fulltext_score"]))
print("Vector Search score: {}".format(doc.metadata["vector_score"]))
print("Total score: {}\n".format(doc.metadata["fulltext_score"] + doc.metadata["vector_score"]))
Title: Timecop
Plot: An officer for a security agency that regulates time travel, must fend for his life against a shady politician who has a tie to his past.
Search score: 0.019230769230769232
Vector Search score: 0.01818181818181818
Total score: 0.03741258741258741
Title: The Time Traveler's Wife
Plot: A romantic drama about a Chicago librarian with a gene that causes him to involuntarily time travel, and the complications it creates for his marriage.
Search score: 0.0196078431372549
Vector Search score: 0
Total score: 0.0196078431372549
Title: Thrill Seekers
Plot: A reporter, learning of time travelers visiting 20th century disasters, tries to change the history they know by averting upcoming disasters.
Search score: 0
Vector Search score: 0.0196078431372549
Total score: 0.0196078431372549
Title: About Time
Plot: At the age of 21, Tim discovers he can travel in time and change what happens and has happened in his own life. His decision to make his world a better place by getting a girlfriend turns out not to be as easy as you might think.
Search score: 0
Vector Search score: 0.019230769230769232
Total score: 0.019230769230769232
Title: My iz budushchego
Plot: My iz budushchego, or We Are from the Future, is a movie about time travel. Four 21st century treasure seekers are transported back into the middle of a WWII battle in Russia. The movie's ...
Search score: 0.018867924528301886
Vector Search score: 0
Total score: 0.018867924528301886

ハイブリッド検索結果を CRGパイプラインに渡して、検索されたドキュメントに対して応答を生成できます。サンプルコードでは、次の処理が行われます。

  • 検索されたドキュメントをクエリのコンテキストとして使用するように LM に指示するための Lgachein プロンプト テンプレートを定義します。 LgChart はこれらのドキュメントを 入力変数に渡し、クエリを{context} {query}変数に渡します。

  • 連鎖 を構築します は、以下を指定します。

    • 関連するドキュメントを検索するために定義したハイブリッド検索リドライバー。

    • 定義した プロンプト テンプレート。

    • コンテキストを認識する応答を生成するための OpenAI による LM。デフォルトでは 、これはgpt-3.5-turbo モデルです。

  • サンプルクエリでチェーンをプロンプし、応答を返します。生成される応答は異なる場合があります。

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI
# Define a prompt template
template = """
Use the following pieces of context to answer the question at the end.
{context}
Question: Can you recommend some movies about {query}?
"""
prompt = PromptTemplate.from_template(template)
model = ChatOpenAI()
# Construct a chain to answer questions on your data
chain = (
{"context": retriever, "query": RunnablePassthrough()}
| prompt
| model
| StrOutputParser()
)
# Prompt the chain
query = "time travel"
answer = chain.invoke(query)
print(answer)
Based on the pieces of context provided, here are some movies about time travel that you may find interesting:
1. "Timecop" (1994) - A movie about a cop who is part of a law enforcement agency that regulates time travel, seeking justice and dealing with personal loss.
2. "The Time Traveler's Wife" (2009) - A romantic drama about a man with the ability to time travel involuntarily and the impact it has on his relationship with his wife.
3. "Thrill Seekers" (1999) - A movie about two reporters trying to prevent disasters by tracking down a time traveler witnessing major catastrophes.
4. "About Time" (2013) - A film about a man who discovers he can travel through time and uses this ability to improve his life and relationships.
5. "My iz budushchego" (2008) - A Russian movie where four treasure seekers from the 21st century are transported back to a WWII battle, exploring themes of action, drama, fantasy, and romance.
These movies offer a variety of perspectives on time travel and its impact on individuals and society.

戻る

はじめる