[PR #2535] feat: Add vector search #2766

Closed
opened 2026-02-20 17:47:32 -05:00 by yindo · 0 comments
Owner

Original Pull Request: https://github.com/langchain-ai/langgraph/pull/2535

State: closed
Merged: Yes


  • Initializing the store with an 'embedding config' -> this contains the 'dims' (used to create the table) and the encoder object (rn langchain embeddings object, though that is ......)
  • Call setup() -> creates the vector table.

Each document has 1 or more vectors associated with it for each json path in the embedding config.

Would welcome critique and requests!

Leaving the params as the defaults for pgvector but open to feedback if you think it's important to be able to more transparently configure that in setup()

from typing import TypedDict, List, Dict, Any, Optional

from langchain_openai import OpenAIEmbeddings
from langgraph.graph import StateGraph
from langgraph.store.postgres import PostgresStore

emb_config = {
    "dims": 1536,  # OpenAI embedding dimensions
    "embed": OpenAIEmbeddings(model="text-embedding-3-small"),
    "distance_type": "cosine",
}
with PostgresStore.from_conn_string(
    "postgres://postgres:postgres@localhost:5441",
    embedding=emb_config,
) as store:
    store.setup()


# Define the state type for our graph
class State(TypedDict):
    query: str
    results: Optional[List[Dict[str, Any]]]


def put_stuff(state: State) -> State:
    docs = [
        ("doc1", {"text": "red apple in kitchen"}),
        ("doc2", {"text": "blue car in garage"}),
        ("doc3", {"text": "green apple on table"}),
    ]
    for key, value in docs:
        store.put(("docs",), key, value)


def search_stuff(state: State) -> State:
    """Search for documents using vector similarity."""
    results = store.search(("docs",), query=state["query"])

    return {"results": results}


builder = StateGraph(State)
builder.add_node(put_stuff)
builder.add_node(search_stuff)
builder.add_edge("__start__", "put_stuff")
builder.add_edge("put_stuff", "search_stuff")
# Compile
with PostgresStore.from_conn_string(
    "postgres://postgres:postgres@localhost:5441",
    embedding=emb_config,
) as store:
    chain = builder.compile(store=store)

    result = chain.invoke({"query": "sour apple"})

# Print results
for doc in result["results"]:
    print(doc.key)
    print(doc.value)
    print(doc.response_metadata)

**Original Pull Request:** https://github.com/langchain-ai/langgraph/pull/2535 **State:** closed **Merged:** Yes --- - Initializing the store with an 'embedding config' -> this contains the 'dims' (used to create the table) and the encoder object (rn langchain embeddings object, though that is ......) - Call setup() -> creates the vector table. Each document has 1 or more vectors associated with it for each json path in the embedding config. Would welcome critique and requests! Leaving the params as the defaults for pgvector but open to feedback if you think it's important to be able to more transparently configure that in setup() ```python from typing import TypedDict, List, Dict, Any, Optional from langchain_openai import OpenAIEmbeddings from langgraph.graph import StateGraph from langgraph.store.postgres import PostgresStore emb_config = { "dims": 1536, # OpenAI embedding dimensions "embed": OpenAIEmbeddings(model="text-embedding-3-small"), "distance_type": "cosine", } with PostgresStore.from_conn_string( "postgres://postgres:postgres@localhost:5441", embedding=emb_config, ) as store: store.setup() # Define the state type for our graph class State(TypedDict): query: str results: Optional[List[Dict[str, Any]]] def put_stuff(state: State) -> State: docs = [ ("doc1", {"text": "red apple in kitchen"}), ("doc2", {"text": "blue car in garage"}), ("doc3", {"text": "green apple on table"}), ] for key, value in docs: store.put(("docs",), key, value) def search_stuff(state: State) -> State: """Search for documents using vector similarity.""" results = store.search(("docs",), query=state["query"]) return {"results": results} builder = StateGraph(State) builder.add_node(put_stuff) builder.add_node(search_stuff) builder.add_edge("__start__", "put_stuff") builder.add_edge("put_stuff", "search_stuff") # Compile with PostgresStore.from_conn_string( "postgres://postgres:postgres@localhost:5441", embedding=emb_config, ) as store: chain = builder.compile(store=store) result = chain.invoke({"query": "sour apple"}) # Print results for doc in result["results"]: print(doc.key) print(doc.value) print(doc.response_metadata) ```
yindo added the pull-request label 2026-02-20 17:47:32 -05:00
yindo closed this issue 2026-02-20 17:47:32 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: langchain-ai/langgraph#2766