RAGの勉強のため,langchain-openaiパッケージのOpenAIEmbeddingsの利用方法をまとめた.
設定
OpenAIのアカウントを持っていない場合は,作成が必要.OpenAIのAPI Keyを作成する.
langchain-openaiパッケージをインストール.
pip install langchain-openai
インスタンス化
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(
model="text-embedding-3-large"
)
text-embedding-3-modelでは,返される埋め込みのサイズを指定できる.他のモデルは以下.
| モデル名 | 特徴 | 埋め込み次元 |
|---|---|---|
| text-embedding-3-small | 軽量・低コスト | 1536 |
| text-embedding-3-large | 高性能モデル | 3072 |
| text-embedding-ada-002 | 旧モデル.まだ利用可能だが非推奨. | 1536 |
索引付けと検索
埋め込みを使って索引付け・検索する方法.サンプルテキストをInMemoryVectorStoreにベクトルとして保持させる.このとき,InMemoryVectorStoreの利用のため,langchain-coreのインストールが必要.
pip install langchain-core
※ InMemoryVectorStore: 簡易なベクトル検索機能をメモリ上で提供するクラス
# Create a vector store with a sample text
from langchain_core.vectorstores import InMemoryVectorStore
text = "LangChain is the framework for building context-aware reasoning applications"
vectorstore = InMemoryVectorStore.from_texts(
[text],
embedding=embeddings,
)
# Use the vectorstore as a retriever
retriever = vectorstore.as_retriever()
# Retrieve the most similar text
retrieved_documents = retriever.invoke("What is LangChain?")
# show the retrieved document's content
retrieved_documents[0].page_content
主なメソッドの説明
| メソッド | 説明 |
|---|---|
| from_texts(texts, embedding[, metadatas]) | textsとembeddingsによって初期化されたVectorStoreを返す |
| as_retriever(**kwargs) | そのVectorStoreによって初期化されたVectorStoreRetrieverを返す |
主なインターフェースの説明
| インターフェース | 説明 |
|---|---|
| VectorStore | テキストなどのデータをベクトル化して格納し,類似度検索を行うための抽象的なインターフェース. |
| Retriever | クエリを入力すると,関連する文書を返してくれるシンプルなインターフェース.as_retrieverを利用してVectorStoreをRetrieverとして使うケースが多い (内部的にはsimilarity_search()を呼び出しているだけ). |
上記の実行結果,APIによる参照は以下のようになる.
'LangChain is the framework for building context-aware reasoning applications'
直接利用
VectorStoreとRetrieverについて,from_textsやinvoke操作時に,内部ではembeddings.embed_documents(...) とembeddings.embed_query(...) が呼び出されている.これらのメソッドを直接呼び出すことで独自のユースケース向けに埋め込みを取得することができる.
単一のテキストを埋め込む
一つのテキストだけ埋め込み表現を取得したい場合の例が以下のコード.embed_queryを使ってtextの埋め込みを取得.
single_vector = embeddings.embed_query(text)
print(str(single_vector)[])
埋め込み表現の前方100文字を取得すると以下のようになる.
[-0.019276829436421394, 0.0037708976306021214, -0.03294256329536438, 0.0037671267054975033, 0.008175
複数のテキストを埋め込む
複数のテキストで埋め込み表現を取得した場合の例が以下のコード.embed_documentsを使ってtextとtext2の埋め込みを取得.
text2 = (
"LangGraph is a library for building stateful, multi-actor applications with LLMs"
)
two_vectors = embeddings.embed_documents([text, text2])
for vector in two_vectors:
print(str(vector)[])
埋め込み表現の前方100文字を取得すると以下のようになる.
[-0.019260549917817116, 0.0037612367887049913, -0.03291035071015358, 0.003757466096431017, 0.0082049
[-0.010181212797760963, 0.023419594392180443, -0.04215526953339577, -0.001532090245746076, -0.023573
参考