🦜️🔗LangChain : モジュール : 検索 – ベクトルストア (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 09/04/2023
* 本ページは、LangChain の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
🦜️🔗 LangChain : モジュール : 検索 – ベクトルストア
INFO : サードパーティのベクトルストアとの組み込みの統合のドキュメントについては 統合 にアクセスしてください。
非構造化データをストアして検索するための最も一般的な方法の一つは、それを埋め込み、結果としての埋め込みベクトルをストアし、それからクエリー時に非構造化クエリーを埋め込み、埋め込みクエリーに「最も類似した」埋め込みベクトルを取得することです。ベクトルストアは埋め込みデータをストアしてベクトル検索を実行する処理をします。
Get started
ウォークスルーはベクトルストアに関連する基本的な機能を紹介します。ベクトルストアを操作する主要パートはそれらに配置するベクトルを作成することです、これは通常は埋め込みを通して作成されます。従って、これに深入りする前にテキスト埋め込みモデルのインターフェイスに馴染むことを勧めます。
多くの優れたベクトルストアの選択肢がありますが、ここには無料、オープンソース、そしてローカルマシンで完全に動作するものがあります。多くの優れたホスト型提供 (サービス) に対する統合すべてをレビューしてください。
このウォークスルーは chroma ベクトルデータベースを使用します、これはローカルマシンでライブラリとして動作します。
※ 訳注: この翻訳では Chroma を扱いますが、原文 では FAISS, Lance についても説明されています。
pip install chromadb
OpenAIEmbeddings を使用したいので、OpenAI API キーを取得する必要があります。
import os
import getpass
os.environ['OPENAI_API_KEY'] = getpass.getpass('OpenAI API Key:')
from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
# Load the document, split it into chunks, embed each chunk and load it into the vector store.
raw_documents = TextLoader('../../../state_of_the_union.txt').load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)
db = Chroma.from_documents(documents, OpenAIEmbeddings())
類似検索
query = "What did the president say about Ketanji Brown Jackson"
docs = db.similarity_search(query)
print(docs[0].page_content)
Tonight. I call on the Senate to: Pass the Freedom to Vote Act. Pass the John Lewis Voting Rights Act. And while you’re at it, pass the Disclose Act so Americans can know who is funding our elections. Tonight, I’d like to honor someone who has dedicated his life to serve this country: Justice Stephen Breyer—an Army veteran, Constitutional scholar, and retiring Justice of the United States Supreme Court. Justice Breyer, thank you for your service. One of the most serious constitutional responsibilities a President has is nominating someone to serve on the United States Supreme Court. And I did that 4 days ago, when I nominated Circuit Court of Appeals Judge Ketanji Brown Jackson. One of our nation’s top legal minds, who will continue Justice Breyer’s legacy of excellence.
ベクトルによる類似検索
similarity_search_by_vector を使用して与えられた埋め込みベクトルに類似したドキュメントの検索を実行することも可能です、これはパラメータとして文字列の代わりに埋め込みベクトルを受け取ります。
embedding_vector = OpenAIEmbeddings().embed_query(query)
docs = db.similarity_search_by_vector(embedding_vector)
print(docs[0].page_content)
The query is the same, and so the result is also the same.
Tonight. I call on the Senate to: Pass the Freedom to Vote Act. Pass the John Lewis Voting Rights Act. And while you’re at it, pass the Disclose Act so Americans can know who is funding our elections. Tonight, I’d like to honor someone who has dedicated his life to serve this country: Justice Stephen Breyer—an Army veteran, Constitutional scholar, and retiring Justice of the United States Supreme Court. Justice Breyer, thank you for your service. One of the most serious constitutional responsibilities a President has is nominating someone to serve on the United States Supreme Court. And I did that 4 days ago, when I nominated Circuit Court of Appeals Judge Ketanji Brown Jackson. One of our nation’s top legal minds, who will continue Justice Breyer’s legacy of excellence.
非同期操作
ベクトルストアは通常は幾つかの IO 操作を必要とする別のサービスと実行されますので、それらは非同期に呼び出されるかもしれません。外部サービスからのレスポンスを待つ時間を浪費しませんので、これはパフォーマンス上の利点があります。FastAPI のような非同期フレームワークで作業する場合にも、それは重要かもしれません。
LangChain はベクトルストア上の非同期操作をサポートします。すべてのメソッドは、async を意味する接頭辞 a を持つ、それらの非同期な counterparts を使用して呼び出されます。
Qdrant はベクトルストアで、これはすべての非同期操作をサポートしますので、このウォークスルーで使用されます。
pip install qdrant-client
from langchain.vectorstores import Qdrant
非同期にベクトルストアを作成する
db = await Qdrant.afrom_documents(documents, embeddings, "http://localhost:6333")
類似検索
query = "What did the president say about Ketanji Brown Jackson"
docs = await db.asimilarity_search(query)
print(docs[0].page_content)
Tonight. I call on the Senate to: Pass the Freedom to Vote Act. Pass the John Lewis Voting Rights Act. And while you’re at it, pass the Disclose Act so Americans can know who is funding our elections. Tonight, I’d like to honor someone who has dedicated his life to serve this country: Justice Stephen Breyer—an Army veteran, Constitutional scholar, and retiring Justice of the United States Supreme Court. Justice Breyer, thank you for your service. One of the most serious constitutional responsibilities a President has is nominating someone to serve on the United States Supreme Court. And I did that 4 days ago, when I nominated Circuit Court of Appeals Judge Ketanji Brown Jackson. One of our nation’s top legal minds, who will continue Justice Breyer’s legacy of excellence.
ベクトルによる類似検索
embedding_vector = embeddings.embed_query(query)
docs = await db.asimilarity_search_by_vector(embedding_vector)
Maximum marginal relevance search (MMR)
Maximal marginal relevance はクエリーの類似性と選択されたドキュメント内の多様性を最適化します。それはまた非同期 API でもサポートされます。
query = "What did the president say about Ketanji Brown Jackson"
found_docs = await qdrant.amax_marginal_relevance_search(query, k=2, fetch_k=10)
for i, doc in enumerate(found_docs):
print(f"{i + 1}.", doc.page_content, "\n")
1. Tonight. I call on the Senate to: Pass the Freedom to Vote Act. Pass the John Lewis Voting Rights Act. And while you’re at it, pass the Disclose Act so Americans can know who is funding our elections. Tonight, I’d like to honor someone who has dedicated his life to serve this country: Justice Stephen Breyer—an Army veteran, Constitutional scholar, and retiring Justice of the United States Supreme Court. Justice Breyer, thank you for your service. One of the most serious constitutional responsibilities a President has is nominating someone to serve on the United States Supreme Court. And I did that 4 days ago, when I nominated Circuit Court of Appeals Judge Ketanji Brown Jackson. One of our nation’s top legal minds, who will continue Justice Breyer’s legacy of excellence. 2. We can’t change how divided we’ve been. But we can change how we move forward—on COVID-19 and other issues we must face together. I recently visited the New York City Police Department days after the funerals of Officer Wilbert Mora and his partner, Officer Jason Rivera. They were responding to a 9-1-1 call when a man shot and killed them with a stolen gun. Officer Mora was 27 years old. Officer Rivera was 22. Both Dominican Americans who’d grown up on the same streets they later chose to patrol as police officers. I spoke with their families and told them that we are forever in debt for their sacrifice, and we will carry on their mission to restore the trust and safety every community deserves. I’ve worked on these issues a long time. I know what works: Investing in crime preventionand community police officers who’ll walk the beat, who’ll know the neighborhood, and who can restore trust and safety.
以上