LgChart 統合を使用したハイブリッド検索の実行
Atlas ベクトル検索を Lgachein と統合すると、 ハイブリッド検索を実行できます。このチュートリアルでは、次の手順を実行します。
環境を設定します。
Atlas をベクトルストアとして使用します。
データに Atlas ベクトル検索と Atlas Searchインデックスを作成します。
ハイブリッド検索クエリを実行します。
クエリ結果を RAGパイプラインに渡します。
前提条件
Atlas の サンプル データ セット からの映画データを含むコレクションを使用します。
環境を設定する
このチュートリアルの環境を設定します。 .ipynb
拡張機能のファイルを保存して、インタラクティブPythonノートを作成します。このノートはPythonコード スニペットを個別に実行でき、このチュートリアルのコードを実行するために使用します。
ノートク環境を設定するには、次の手順に従います。
環境変数を設定します。
このチュートリアルの環境変数を設定するには、次のコードを実行します。プロンプトが表示されたら、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 を使用する必要があります。 Atlas では既存のコレクションを使用してベクトルストアをインスタンス化できます。
ベクトル ストアをインスタンス化します。
次のコードをノート 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" )
インデックスの作成
注意
Atlas ベクトル検索または Atlas SearchProject Data Access Admin
インデックスを作成するには、Atlasプロジェクトへの 以上のアクセス権が必要です。
ベクトルストアでハイブリッド検索クエリを有効にするには、コレクションに Atlas ベクトル検索と Atlas Searchインデックスを作成します。インデックスは、LgChuinヘルパーメソッドまたはPyMongoドライバー メソッドのいずれかを使用して作成できます。
Atlas Searchインデックスを作成します。
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" )
Atlas Vector Search インデックスを作成します。
次のコードを実行して、コレクションの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)
Atlas Searchインデックスを作成します。
次のコードを実行して、コレクションのplot
フィールドにインデックスを付けるための検索インデックスを作成します。
1 # Create your search index model, then create the search index 2 search_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 ) 15 collection.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
結果を RG パイプラインに渡す
ハイブリッド検索結果を 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.