LangChain Not Working? Fix Import Errors, Chain Issues & LLM Connection
Troubleshoot LangChain errors — deprecated import paths, ModuleNotFoundError, chain not calling the LLM, LCEL vs legacy syntax, Pydantic v1/v2 conflicts, and LangSmith tracing setup.
Common errors and fixes
Deprecated imports / ModuleNotFoundError
Since LangChain v0.2, provider code was split into separate packages. Importing from langchain directly for models and prompts will fail in newer versions:
# ❌ Old (pre-0.2) — will fail in newer versions
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema import HumanMessage
# ✅ New (0.2+) — correct imports
from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.messages import HumanMessage Install the required packages separately:
pip install langchain langchain-openai langchain-anthropic langchain-core
# For community integrations (Ollama, Hugging Face, etc.)
pip install langchain-community
# For vector stores
pip install langchain-chroma # or langchain-pinecone, langchain-qdrant - langchain-openai: contains
ChatOpenAI,OpenAIEmbeddings— install separately even if you haveopenai. - langchain-core: base classes like
ChatPromptTemplate,StrOutputParser,RunnablePassthrough— always required. - langchain-community: integrations for Ollama, Hugging Face, FAISS, and hundreds of other services.
LCEL vs legacy chain syntax
LangChain Expression Language (LCEL) uses the | operator to compose chains. It returns Runnable objects — you must call .invoke() on the full chain:
import os
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
os.environ["OPENAI_API_KEY"] = "sk-..."
# LCEL (recommended) — use | to compose chains
llm = ChatOpenAI(model="gpt-4o")
prompt = ChatPromptTemplate.from_template("Tell me a joke about {topic}")
parser = StrOutputParser()
chain = prompt | llm | parser # Runnable sequence
# Invoke
result = chain.invoke({"topic": "Python"})
print(result)
# Async
result = await chain.ainvoke({"topic": "Python"})
# Stream
for chunk in chain.stream({"topic": "Python"}):
print(chunk, end="") - Legacy LLMChain still works but shows deprecation warnings — migrate to LCEL for new code.
- Don't mix syntaxes: LCEL chains return
Runnable, not a direct string — call.invoke()to get output. - Async: in async code always use
ainvoke()— callinginvoke()in an async context will block the event loop.
LLM connection errors
Test your LLM connection independently before building a full chain — this isolates whether the issue is the LLM or the chain logic:
# Test your LLM connection independently first
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o") # reads OPENAI_API_KEY from env
try:
response = llm.invoke("Hello")
print(response.content)
except Exception as e:
print(f"Error: {e}") # will show auth or connection error clearly - OpenAI: ensure
OPENAI_API_KEYis set; installlangchain-openainotlangchain[openai](the extras syntax is deprecated). - Anthropic: set
ANTHROPIC_API_KEY; installlangchain-anthropicseparately. - Ollama: run
ollama servefirst; defaultbase_urlishttp://localhost:11434.
RAG / retrieval chain not returning results
A complete LCEL RAG chain using a vector store retriever — check each component independently if results are empty:
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_chroma import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
# Build retriever
vectorstore = Chroma.from_documents(documents, OpenAIEmbeddings())
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
# Build RAG chain
template = """Answer based on context:
{context}
Question: {question}"""
prompt = ChatPromptTemplate.from_template(template)
llm = ChatOpenAI(model="gpt-4o")
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
)
result = chain.invoke("What is the main topic?") - Empty retriever results: check documents were loaded and embeddings created; verify vectorstore has data with
vectorstore.similarity_search("test"). - Install vector store package:
pip install langchain-chromaorlangchain-pineconeorlangchain-qdrant— not included in core. - Context format: if the retriever returns
Documentobjects, you may need to format them: add alambda docs: "\n".join(d.page_content for d in docs)step.
Pydantic v1 vs v2 conflicts
LangChain migrated to Pydantic v2 in 0.3. If you see errors like "BaseModel is defined in pydantic v1" or unexpected ValidationError after upgrading:
# Check your pydantic version
pip show pydantic
# For LangChain 0.3+, pydantic v2 is required
pip install pydantic>=2.0
# If a dependency requires pydantic v1, use compatibility mode
# In your code:
from pydantic.v1 import BaseModel # pydantic v1 compat - langchain-core >= 0.3 requires Pydantic v2. If mixing old community packages, version conflicts are common.
- Fresh virtualenv: if you have hard-to-resolve conflicts, create a fresh virtualenv and install all LangChain packages at once with
pip install langchain langchain-openai langchain-anthropic langchain-core. - Check all versions: run
pip show langchain langchain-core langchain-openai pydanticto see the full picture before upgrading.
Know when LangSmith has an outage
Free email alerts. Star LangSmith on Prismix — no credit card needed.
FAQ
LangChain vs LlamaIndex — which for RAG?
Both work well for RAG. LangChain is more general-purpose (chains, agents, tools, memory). LlamaIndex (formerly GPT Index) is more specialized for data ingestion, indexing, and retrieval. For a standard RAG pipeline with a vector store, either works. For complex multi-step agent workflows, LangChain has more integrations.
LangGraph vs LangChain — when to use LangGraph?
LangGraph is for stateful multi-agent workflows with cycles (e.g., ReAct agents, iterative refinement, human-in-the-loop). Standard LangChain LCEL is for linear chains. If your agent needs to loop, branch based on state, or coordinate multiple sub-agents, use LangGraph.
LangChain memory / conversation history
Use ConversationBufferMemory (stores all messages) or ConversationSummaryMemory (summarizes when too long). In LCEL, pass message history explicitly via RunnableWithMessageHistory or manage messages in your own list. The simplest approach: maintain a messages list and pass it to the LLM each turn.