This document describes the LangChain integration.
This document describes the LangChain integration.
LangChain is a framework for developing applications powered by language models. It is a set of tools that allows you to fine-tune, deploy, and use language models in production.
pgvecto.rs provides a LangChain integration that allows you to retrieve the most similar vectors in LangChain.
Install dependencies
Some dependencies are required to use the LangChain integration:
pip install langchain langchain-openai pgvecto-rs
You could start the postgres instance with pgvecto.rs extension in a docker container:
We will show how to use pgvecto.rs in LangChain to retrieve the most similar vectors.
First, you need to create the text loader and the text splitter to split the text into chunks. We use the markdown file getting-started/overview.md as an example.
Then, we will create the PGVecto_rs instance and load the documents into the database.
## PGVecto.rs needs the connection string to the database.## We will load it from the environment variables.importosPORT=os.getenv("DB_PORT",5432)HOST=os.getenv("DB_HOST","localhost")USER=os.getenv("DB_USER","postgres")PASS=os.getenv("DB_PASS","mysecretpassword")DB_NAME=os.getenv("DB_NAME","postgres")# Run tests with shell:URL="postgresql+psycopg://{username}:{password}@{host}:{port}/{db_name}".format(port=PORT,host=HOST,username=USER,password=PASS,db_name=DB_NAME,)# The pgvectors Module will try to create a table with the name of the collection.# So, make sure that the collection name is unique and the user has the permission to create a table.COLLECTION_NAME="state_of_the_union_test"db=PGVecto_rs.from_documents(embedding=embeddings,documents=docs,collection_name=COLLECTION_NAME,db_url=URL,)
Query index
Finally, we can retrieve the most similar chunks in LangChain.
query="What is pgvecto.rs"docs_with_score=db.similarity_search_with_score(query)fordoc,scoreindocs_with_score:print("-"*80)print("Score: ",score)print(doc.page_content)print("-"*80)
The output is:
Created a chunk of size 1181, which is longer than the specified 1000
--------------------------------------------------------------------------------
Score: 0.25059962
# Overview
An introduction to the pgvecto.rs.
## What is pgvecto.rs
pgvecto.rs is a Postgres extension that provides vector similarity search functions. It is written in Rust and based on [pgrx](https://github.com/tcdi/pgrx). It is currently in the beta status, we invite you to try it out in production and provide us with feedback. Read more at [๐our launch blog](https://modelz.ai/blog/pgvecto-rs).
## Why use pgvecto.rs
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Score: 0.29536954
- ๐ **Easy to use**: pgvecto.rs is a Postgres extension, which means that you can use it directly within your existing database. This makes it easy to integrate into your existing workflows and applications.
- ๐ **Async indexing**: pgvecto.rs's index is asynchronously constructed by the background threads and does not block insertions and always ready for new queries.
- ๐ฅ **Filtering**: pgvecto.rs supports filtering. You can set conditions when searching or retrieving points. This is the missing feature of other postgres extensions.
- ๐งฎ **Quantization**: pgvecto.rs supports scalar quantization and product quantization up to 64x.
- ๐ฆ **Rewrite in Rust**: Rust's strict compile-time checks ensure memory safety, reducing the risk of bugs and security issues commonly associated with C extensions.
## Comparison with pgvector
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Score: 0.35845917
More details at [๐`pgvecto.rs` vs. pgvector](../faqs/comparison-pgvector.md).
## Quick start
For new users, we recommend using the [Docker image](https://hub.docker.com/r/tensorchord/pgvecto-rs) to get started quickly.
...
Initialize from an existing database
Above, we created a vector store from scratch. However, often times we want to work with an existing vector store. In order to do that, we can initialize it directly.
db=PGVecto_rs(embedding=embeddings,collection_name=COLLECTION_NAME,# OpenAI embedding has 1536 dimensions.dimension=1536,db_url=URL,)
First, create the text loader and the text splitter to split the text into chunks. We use the markdown file getting-started/overview.md as an example.
importloggingimportosimportsyslogging.basicConfig(stream=sys.stdout,level=logging.INFO)logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))frompgvecto_rs.sdkimportPGVectoRsURL="postgresql+psycopg://{username}:{password}@{host}:{port}/{db_name}".format(port=os.getenv("DB_PORT","5432"),host=os.getenv("DB_HOST","localhost"),username=os.getenv("DB_USER","postgres"),password=os.getenv("DB_PASS","mysecretpassword"),db_name=os.getenv("DB_NAME","postgres"),)client=PGVectoRs(db_url=URL,collection_name="example",dimension=1536,# Using OpenAIโs text-embedding-ada-002)
Then setup the OpenAI API key and load the documents into the database.
importosos.environ["OPENAI_API_KEY"]="sk-..."fromllama_indeximportSimpleDirectoryReader,VectorStoreIndexfromllama_index.vector_storesimportPGVectoRsStore# load documentsdocuments=SimpleDirectoryReader("./src/getting-started/overview.md").load_data()# initialize without metadata filterfromllama_index.storage.storage_contextimportStorageContextvector_store=PGVectoRsStore(client=client)storage_context=StorageContext.from_defaults(vector_store=vector_store)index=VectorStoreIndex.from_documents(documents,storage_context=storage_context)
Query index
Finally, we can retrieve the most similar chunks.
# set Logging to DEBUG for more detailed outputsquery_engine=index.as_query_engine()response=query_engine.query("What did the author do growing up?")
3 - Citus
citus is a PostgreSQL extension that turns Postgres into a distributed database. pgvecto.rs works well with citus Here are the steps to enable vector search in
citus is a PostgreSQL extension that turns Postgres into a distributed database. pgvecto.rs works well with citus Here are the steps to enable vector search in a distributed PostgreSQL instance.
citus can works on Single-Node and Multi-Node, both of which are compatible with pgvecto.rs natively.
Single-Node Citus
First, prepare the dockerfile with pgvecto.rs and citus installed and attach them to PostgreSQL.
Details
citus must be placed first in shared_preload_libraries due to its restrictions.
You can use the same Dockerfile and image for Multi-Node citus as for Single-Node Citus.
In this example, we will start a cluster of 1 coordinator node and 2 worker nodes with docker compose.
Warning
Don’t use POSTGRES_HOST_AUTH_METHOD: "trust" in production, see citus notes about Increasing Worker Security for detailed authentication configure.
If you’re using a citus distributed table, the pg_vector_index_stat view on the coordinator will be empty. Since all the indexes are created at the workers actually, we can only inspect the vector status by distributing this view to the workers.