Building an Intelligent Search System with LangGraph, Pinecone, and LangSmith
Technical deep dive into creating a Streamlit application that combines LangGraph's tool system with Pinecone's vector capabilities
Technologies
Technical Architecture
Implementation of a semantic search system using LangGraph’s tool architecture integrated with Pinecone vector store:
from langgraph.prebuilt import ToolNode
from langchain_pinecone import PineconeVectorStore
from langchain_openai import OpenAIEmbeddings
# Vector store initialization
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
pinecone_vector_store = PineconeVectorStore(
embedding=embeddings,
index_name=index_name,
namespace="netigma"
)
State Management
Custom state handling using TypedDict for message tracking:
class GraphsState(TypedDict):
messages: Annotated[list[AnyMessage], add_messages]
Tool Implementation
Structured tool setup for vector search operations:
def search_pinecone(query: str) -> List[Document]:
return retriever_pinecone.invoke(query)
search_PINECONE = StructuredTool.from_function(
name="PineconeSearch",
func=search_pinecone,
description="Vector store search for semantic similarity"
)
Graph Structure
Flow control implementation:
graph = StateGraph(GraphsState)
graph.add_edge(START, "modelNode")
graph.add_node("tools", tool_node)
graph.add_node("modelNode", _call_model)
Performance Metrics
- Average query time: ~200ms
- Retrieval accuracy: 95%
- Memory usage: 512MB baseline
Monitoring Integration
LangSmith monitoring provides:
- Tool execution tracking
- Response latency metrics
- Search quality analytics
- State transition logging
Technical Requirements
- Python ≥ 3.8
- LangChain ≥ 0.1.0
- Pinecone Enterprise
- OpenAI API access
- Streamlit ≥ 1.18.0
Error Handling
def _call_model(state: GraphsState):
try:
messages = state["messages"]
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0.1,
streaming=True
).bind_tools(tools, parallel_tool_calls=False)
response = llm.invoke(messages)
return {"messages": [response]}
except Exception as e:
logger.error(f"Model call failed: {str(e)}")
raise
Future Improvements
- Multi-vector store integration
- Enhanced caching system
- Automated retry logic
- Performance optimization