mirror of
https://github.com/hwchase17/langchain.git
synced 2025-10-23 11:16:58 +00:00
## **Description:** This PR updates the internal documentation link for the RAG tutorials to reflect the updated path. Previously, the link pointed to the root `/docs/tutorials/`, which was generic. It now correctly routes to the RAG-specific tutorial page for the following vector store docs. 1. AstraDBVectorStore 2. Clickhouse 3. CouchbaseSearchVectorStore 4. DatabricksVectorSearch 5. ElasticsearchStore 6. FAISS 7. Milvus 8. MongoDBAtlasVectorSearch 9. openGauss 10. PGVector 11. PGVectorStore 12. PineconeVectorStore 13. QdrantVectorStore 14. Redis 15. SQLServer ## **Issue:** N/A ## **Dependencies:** None ## **Twitter handle:** N/A
583 lines
16 KiB
Plaintext
583 lines
16 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "683953b3",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Faiss\n",
|
|
"\n",
|
|
">[Facebook AI Similarity Search (FAISS)](https://engineering.fb.com/2017/03/29/data-infrastructure/faiss-a-library-for-efficient-similarity-search/) is a library for efficient similarity search and clustering of dense vectors. It contains algorithms that search in sets of vectors of any size, up to ones that possibly do not fit in RAM. It also includes supporting code for evaluation and parameter tuning.\n",
|
|
">\n",
|
|
">See [The FAISS Library](https://arxiv.org/pdf/2401.08281) paper.\n",
|
|
"\n",
|
|
"You can find the FAISS documentation at [this page](https://faiss.ai/).\n",
|
|
"\n",
|
|
"This notebook shows how to use functionality related to the `FAISS` vector database. It will show functionality specific to this integration. After going through, it may be useful to explore [relevant use-case pages](/docs/how_to#qa-with-rag) to learn how to use this vectorstore as part of a larger chain."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "601ac1d5-48a2-4e41-bf51-f1d5fdd5639d",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"source": [
|
|
"## Setup\n",
|
|
"\n",
|
|
"The integration lives in the `langchain-community` package. We also need to install the `faiss` package itself. We can install these with:\n",
|
|
"\n",
|
|
"Note that you can also install `faiss-gpu` if you want to use the GPU enabled version"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "08165d56",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"pip install -qU langchain-community faiss-cpu"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "408be78f-7b0e-44d4-8d48-56a6cb9b3fb9",
|
|
"metadata": {},
|
|
"source": [
|
|
"If you want to get best in-class automated tracing of your model calls you can also set your [LangSmith](https://docs.smith.langchain.com/) API key by uncommenting below:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "951c82cb-40bf-46ac-9f3f-d2fca7d204b8",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# os.environ[\"LANGSMITH_TRACING\"] = \"true\"\n",
|
|
"# os.environ[\"LANGSMITH_API_KEY\"] = getpass.getpass()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "78dde98a-584f-4f2a-98d5-e776fd9558fa",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Initialization\n",
|
|
"\n",
|
|
"import EmbeddingTabs from \"@theme/EmbeddingTabs\";\n",
|
|
"\n",
|
|
"<EmbeddingTabs/>\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "5b394da3",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# | output: false\n",
|
|
"# | echo: false\n",
|
|
"from langchain_openai import OpenAIEmbeddings\n",
|
|
"\n",
|
|
"embeddings = OpenAIEmbeddings(model=\"text-embedding-3-large\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"id": "dc37144c-208d-4ab3-9f3a-0407a69fe052",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"import faiss\n",
|
|
"from langchain_community.docstore.in_memory import InMemoryDocstore\n",
|
|
"from langchain_community.vectorstores import FAISS\n",
|
|
"\n",
|
|
"index = faiss.IndexFlatL2(len(embeddings.embed_query(\"hello world\")))\n",
|
|
"\n",
|
|
"vector_store = FAISS(\n",
|
|
" embedding_function=embeddings,\n",
|
|
" index=index,\n",
|
|
" docstore=InMemoryDocstore(),\n",
|
|
" index_to_docstore_id={},\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "d8761614",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Manage vector store\n",
|
|
"\n",
|
|
"### Add items to vector store"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"id": "3867e154",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"['22f5ce99-cd6f-4e0c-8dab-664128307c72',\n",
|
|
" 'dc3f061b-5f88-4fa1-a966-413550c51891',\n",
|
|
" 'd33d890b-baad-47f7-b7c1-175f5f7b4e59',\n",
|
|
" '6e6c01d2-6020-4a7b-95da-ef43d43f01b5',\n",
|
|
" 'e677223d-ad75-4c1a-bef6-b5912bd1de03',\n",
|
|
" '47e2a168-6462-4ed2-b1d9-d9edfd7391d6',\n",
|
|
" '1e4d66d6-e155-4891-9212-f7be97f36c6a',\n",
|
|
" 'c0663096-e1a5-4665-b245-1c2e6c4fb653',\n",
|
|
" '8297474a-7f7c-4006-9865-398c1781b1bc',\n",
|
|
" '44e4be03-0a8d-4316-b3c4-f35f4bb2b532']"
|
|
]
|
|
},
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"from uuid import uuid4\n",
|
|
"\n",
|
|
"from langchain_core.documents import Document\n",
|
|
"\n",
|
|
"document_1 = Document(\n",
|
|
" page_content=\"I had chocolate chip pancakes and scrambled eggs for breakfast this morning.\",\n",
|
|
" metadata={\"source\": \"tweet\"},\n",
|
|
")\n",
|
|
"\n",
|
|
"document_2 = Document(\n",
|
|
" page_content=\"The weather forecast for tomorrow is cloudy and overcast, with a high of 62 degrees.\",\n",
|
|
" metadata={\"source\": \"news\"},\n",
|
|
")\n",
|
|
"\n",
|
|
"document_3 = Document(\n",
|
|
" page_content=\"Building an exciting new project with LangChain - come check it out!\",\n",
|
|
" metadata={\"source\": \"tweet\"},\n",
|
|
")\n",
|
|
"\n",
|
|
"document_4 = Document(\n",
|
|
" page_content=\"Robbers broke into the city bank and stole $1 million in cash.\",\n",
|
|
" metadata={\"source\": \"news\"},\n",
|
|
")\n",
|
|
"\n",
|
|
"document_5 = Document(\n",
|
|
" page_content=\"Wow! That was an amazing movie. I can't wait to see it again.\",\n",
|
|
" metadata={\"source\": \"tweet\"},\n",
|
|
")\n",
|
|
"\n",
|
|
"document_6 = Document(\n",
|
|
" page_content=\"Is the new iPhone worth the price? Read this review to find out.\",\n",
|
|
" metadata={\"source\": \"website\"},\n",
|
|
")\n",
|
|
"\n",
|
|
"document_7 = Document(\n",
|
|
" page_content=\"The top 10 soccer players in the world right now.\",\n",
|
|
" metadata={\"source\": \"website\"},\n",
|
|
")\n",
|
|
"\n",
|
|
"document_8 = Document(\n",
|
|
" page_content=\"LangGraph is the best framework for building stateful, agentic applications!\",\n",
|
|
" metadata={\"source\": \"tweet\"},\n",
|
|
")\n",
|
|
"\n",
|
|
"document_9 = Document(\n",
|
|
" page_content=\"The stock market is down 500 points today due to fears of a recession.\",\n",
|
|
" metadata={\"source\": \"news\"},\n",
|
|
")\n",
|
|
"\n",
|
|
"document_10 = Document(\n",
|
|
" page_content=\"I have a bad feeling I am going to get deleted :(\",\n",
|
|
" metadata={\"source\": \"tweet\"},\n",
|
|
")\n",
|
|
"\n",
|
|
"documents = [\n",
|
|
" document_1,\n",
|
|
" document_2,\n",
|
|
" document_3,\n",
|
|
" document_4,\n",
|
|
" document_5,\n",
|
|
" document_6,\n",
|
|
" document_7,\n",
|
|
" document_8,\n",
|
|
" document_9,\n",
|
|
" document_10,\n",
|
|
"]\n",
|
|
"uuids = [str(uuid4()) for _ in range(len(documents))]\n",
|
|
"\n",
|
|
"vector_store.add_documents(documents=documents, ids=uuids)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "a410a2dc",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Delete items from vector store"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"id": "c3db04bd",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"True"
|
|
]
|
|
},
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"vector_store.delete(ids=[uuids[-1]])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "77de24ff",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Query vector store\n",
|
|
"\n",
|
|
"Once your vector store has been created and the relevant documents have been added you will most likely wish to query it during the running of your chain or agent. \n",
|
|
"\n",
|
|
"### Query directly\n",
|
|
"\n",
|
|
"#### Similarity search\n",
|
|
"\n",
|
|
"Performing a simple similarity search with filtering on metadata can be done as follows:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"id": "53d95d3f",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"* Building an exciting new project with LangChain - come check it out! [{'source': 'tweet'}]\n",
|
|
"* LangGraph is the best framework for building stateful, agentic applications! [{'source': 'tweet'}]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"results = vector_store.similarity_search(\n",
|
|
" \"LangChain provides abstractions to make working with LLMs easy\",\n",
|
|
" k=2,\n",
|
|
" filter={\"source\": \"tweet\"},\n",
|
|
")\n",
|
|
"for res in results:\n",
|
|
" print(f\"* {res.page_content} [{res.metadata}]\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "39cb1496",
|
|
"metadata": {},
|
|
"source": [
|
|
"Some [MongoDB query and projection operators](https://www.mongodb.com/docs/manual/reference/operator/query/) are supported for more advanced metadata filtering. The current list of supported operators are as follows:\n",
|
|
"- `$eq` (equals)\n",
|
|
"- `$neq` (not equals)\n",
|
|
"- `$gt` (greater than)\n",
|
|
"- `$lt` (less than)\n",
|
|
"- `$gte` (greater than or equal)\n",
|
|
"- `$lte` (less than or equal)\n",
|
|
"- `$in` (membership in list)\n",
|
|
"- `$nin` (not in list)\n",
|
|
"- `$and` (all conditions must match)\n",
|
|
"- `$or` (any condition must match)\n",
|
|
"- `$not` (negation of condition)\n",
|
|
"\n",
|
|
"Performing the same above similarity search with advanced metadata filtering can be done as follows:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "1b3dd99d",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"* Building an exciting new project with LangChain - come check it out! [{'source': 'tweet'}]\n",
|
|
"* LangGraph is the best framework for building stateful, agentic applications! [{'source': 'tweet'}]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"results = vector_store.similarity_search(\n",
|
|
" \"LangChain provides abstractions to make working with LLMs easy\",\n",
|
|
" k=2,\n",
|
|
" filter={\"source\": {\"$eq\": \"tweet\"}},\n",
|
|
")\n",
|
|
"for res in results:\n",
|
|
" print(f\"* {res.page_content} [{res.metadata}]\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "5ae35069",
|
|
"metadata": {},
|
|
"source": [
|
|
"#### Similarity search with score\n",
|
|
"\n",
|
|
"You can also search with score:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"id": "a9078ce9",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"* [SIM=0.893688] The weather forecast for tomorrow is cloudy and overcast, with a high of 62 degrees. [{'source': 'news'}]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"results = vector_store.similarity_search_with_score(\n",
|
|
" \"Will it be hot tomorrow?\", k=1, filter={\"source\": \"news\"}\n",
|
|
")\n",
|
|
"for res, score in results:\n",
|
|
" print(f\"* [SIM={score:3f}] {res.page_content} [{res.metadata}]\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "e9091b1f",
|
|
"metadata": {},
|
|
"source": [
|
|
"#### Other search methods\n",
|
|
"\n",
|
|
"\n",
|
|
"There are a variety of other ways to search a FAISS vector store. For a complete list of those methods, please refer to the [API Reference](https://python.langchain.com/api_reference/community/vectorstores/langchain_community.vectorstores.faiss.FAISS.html)\n",
|
|
"\n",
|
|
"### Query by turning into retriever\n",
|
|
"\n",
|
|
"You can also transform the vector store into a retriever for easier usage in your chains. "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"id": "10da64fa",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"[Document(metadata={'source': 'news'}, page_content='Robbers broke into the city bank and stole $1 million in cash.')]"
|
|
]
|
|
},
|
|
"execution_count": 7,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"retriever = vector_store.as_retriever(search_type=\"mmr\", search_kwargs={\"k\": 1})\n",
|
|
"retriever.invoke(\"Stealing from the bank is a crime\", filter={\"source\": \"news\"})"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "5edd1909",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Usage for retrieval-augmented generation\n",
|
|
"\n",
|
|
"For guides on how to use this vector store for retrieval-augmented generation (RAG), see the following sections:\n",
|
|
"\n",
|
|
"- [Tutorials](/docs/tutorials/rag)\n",
|
|
"- [How-to: Question and answer with RAG](https://python.langchain.com/docs/how_to/#qa-with-rag)\n",
|
|
"- [Retrieval conceptual docs](https://python.langchain.com/docs/concepts/retrieval)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "31bda7fd",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Saving and loading\n",
|
|
"You can also save and load a FAISS index. This is useful so you don't have to recreate it everytime you use it."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"id": "1b31fe27-e0b3-42c6-b17c-8270b517ee1f",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"vector_store.save_local(\"faiss_index\")\n",
|
|
"\n",
|
|
"new_vector_store = FAISS.load_local(\n",
|
|
" \"faiss_index\", embeddings, allow_dangerous_deserialization=True\n",
|
|
")\n",
|
|
"\n",
|
|
"docs = new_vector_store.similarity_search(\"qux\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"id": "98378c4e",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"Document(metadata={'source': 'tweet'}, page_content='Building an exciting new project with LangChain - come check it out!')"
|
|
]
|
|
},
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"docs[0]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "57da60d4",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Merging\n",
|
|
"You can also merge two FAISS vectorstores"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 13,
|
|
"id": "9b8f5e31-3f40-4e94-8d97-5883125efba7",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"{'b752e805-350e-4cf5-ba54-0883d46a3a44': Document(page_content='foo')}"
|
|
]
|
|
},
|
|
"execution_count": 13,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"db1 = FAISS.from_texts([\"foo\"], embeddings)\n",
|
|
"db2 = FAISS.from_texts([\"bar\"], embeddings)\n",
|
|
"\n",
|
|
"db1.docstore._dict"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 14,
|
|
"id": "83392605",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"{'08192d92-746d-4cd1-b681-bdfba411f459': Document(page_content='bar')}"
|
|
]
|
|
},
|
|
"execution_count": 14,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"db2.docstore._dict"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 15,
|
|
"id": "a3fcc1c7",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"db1.merge_from(db2)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 16,
|
|
"id": "41c51f89",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"{'b752e805-350e-4cf5-ba54-0883d46a3a44': Document(page_content='foo'),\n",
|
|
" '08192d92-746d-4cd1-b681-bdfba411f459': Document(page_content='bar')}"
|
|
]
|
|
},
|
|
"execution_count": 16,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"db1.docstore._dict"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "65654d80",
|
|
"metadata": {},
|
|
"source": [
|
|
"## API reference\n",
|
|
"\n",
|
|
"For detailed documentation of all `FAISS` vector store features and configurations head to the API reference: https://python.langchain.com/api_reference/community/vectorstores/langchain_community.vectorstores.faiss.FAISS.html"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3 (ipykernel)",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.10.12"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|