home / skills / htooayelwinict / claude-config / langchain

langchain skill

/skills/langchain

This skill helps you build LLM apps with LangChain by guiding chains, prompts, memory, retrievers, and tools.

npx playbooks add skill htooayelwinict/claude-config --skill langchain

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
5.2 KB
---
name: langchain
description: Expert guidance for building LLM applications with LangChain framework - chains, prompts, memory, retrievers, and integrations.
allowed-tools: Read, Edit, Bash, Grep, mcp_context7
---

# LangChain Skill

Use this skill when working with LangChain for building LLM-powered applications.

## 📚 Documentation Lookup (Context7)

Always verify patterns with latest docs:
```
mcp_context7_resolve-library-id(libraryName="langchain", query="LCEL chains")
mcp_context7_query-docs(libraryId="/langchain-ai/langchain", query="RunnablePassthrough examples")
```

## Core Concepts

### 1. LLMs and Chat Models
```python
from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic

# Chat model initialization
llm = ChatOpenAI(model="gpt-4o", temperature=0)
claude = ChatAnthropic(model="claude-sonnet-4-20250514")

# Invoke with messages
from langchain_core.messages import HumanMessage, SystemMessage
response = llm.invoke([
    SystemMessage(content="You are a helpful assistant."),
    HumanMessage(content="Hello!")
])
```

### 2. Prompt Templates
```python
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

# Simple template
prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a {role} assistant."),
    ("human", "{input}")
])

# With message history placeholder
prompt_with_history = ChatPromptTemplate.from_messages([
    ("system", "You are a helpful assistant."),
    MessagesPlaceholder(variable_name="history"),
    ("human", "{input}")
])

# Format and invoke
chain = prompt | llm
result = chain.invoke({"role": "coding", "input": "Write a function"})
```

### 3. Output Parsers
```python
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser
from pydantic import BaseModel, Field

class Answer(BaseModel):
    answer: str = Field(description="The answer")
    confidence: float = Field(description="Confidence 0-1")

parser = JsonOutputParser(pydantic_object=Answer)
chain = prompt | llm | parser
```

### 4. Chains with LCEL (LangChain Expression Language)
```python
from langchain_core.runnables import RunnablePassthrough, RunnableLambda

# Pipe syntax for chaining
chain = prompt | llm | StrOutputParser()

# Parallel execution
from langchain_core.runnables import RunnableParallel

parallel_chain = RunnableParallel(
    summary=summary_chain,
    translation=translate_chain
)

# Branching with RunnableBranch
from langchain_core.runnables import RunnableBranch

branch = RunnableBranch(
    (lambda x: "code" in x["topic"], code_chain),
    (lambda x: "math" in x["topic"], math_chain),
    default_chain
)
```

### 5. Memory and Chat History
```python
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory

history = ChatMessageHistory()

chain_with_history = RunnableWithMessageHistory(
    chain,
    lambda session_id: history,
    input_messages_key="input",
    history_messages_key="history"
)

# Invoke with session
result = chain_with_history.invoke(
    {"input": "Hi!"},
    config={"configurable": {"session_id": "user123"}}
)
```

### 6. Retrievers and RAG
```python
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_core.runnables import RunnablePassthrough

# Create retriever
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_texts(texts, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})

# RAG chain
rag_prompt = ChatPromptTemplate.from_template("""
Answer based on context:
{context}

Question: {question}
""")

rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | rag_prompt
    | llm
    | StrOutputParser()
)
```

### 7. Tools and Tool Calling
```python
from langchain_core.tools import tool

@tool
def search(query: str) -> str:
    """Search for information."""
    return f"Results for: {query}"

@tool
def calculator(expression: str) -> float:
    """Evaluate math expression."""
    return eval(expression)

# Bind tools to model
llm_with_tools = llm.bind_tools([search, calculator])

# Or use ToolNode in LangGraph
from langgraph.prebuilt import ToolNode
tool_node = ToolNode([search, calculator])
```

## Best Practices

1. **Use LCEL** - Prefer `|` pipe syntax over legacy Chain classes
2. **Streaming** - Use `.stream()` for real-time output
3. **Async** - Use `.ainvoke()`, `.astream()` for concurrent operations
4. **Callbacks** - Add logging/tracing with callback handlers
5. **Caching** - Enable LLM caching for repeated queries
6. **Error Handling** - Wrap chains with fallbacks using `.with_fallbacks()`

## Common Patterns

### Structured Output
```python
from langchain_core.output_parsers import PydanticOutputParser

class Output(BaseModel):
    result: str
    
llm_structured = llm.with_structured_output(Output)
```

### Streaming
```python
for chunk in chain.stream({"input": "Tell me a story"}):
    print(chunk, end="", flush=True)
```

### Retry with Fallback
```python
chain_with_fallback = main_chain.with_fallbacks([backup_chain])
```

## Installation
```bash
pip install langchain langchain-core langchain-openai langchain-anthropic
pip install langchain-community  # for integrations
```

Overview

This skill provides expert guidance for building LLM applications using the LangChain framework, covering chains, prompts, memory, retrievers, tools, and integrations. It focuses on modern LCEL patterns, prompt templates, structured outputs, streaming, and best practices to produce robust, maintainable pipelines. Use it to accelerate development and avoid common pitfalls when composing LLM components.

How this skill works

The skill inspects common LangChain building blocks and shows concrete code patterns: chat model initialization, ChatPromptTemplate usage, LCEL pipe composition, output parsers, memory wrappers, retrievers for RAG, and tool binding. It demonstrates synchronous and asynchronous invocation, streaming, parallel and branching runnables, and patterns for structured outputs and fallbacks. Examples include creating retrievers with vectorstores, adding message history, and wrapping chains with callbacks and caching.

When to use it

  • When composing LLM pipelines with LangChain’s LCEL pipe syntax (|) instead of legacy Chain classes.
  • When implementing RAG workflows using vectorstores, retrievers, and context prompts.
  • When you need structured output parsing and pydantic-based validation from model responses.
  • When adding streaming, async invocation, or real-time output to UIs or services.
  • When binding external tools or building ToolNodes for tool-enabled agent flows.

Best practices

  • Prefer LCEL pipe syntax for readable, composable chains and use RunnableParallel/RunnableBranch for concurrency and branching.
  • Use ChatPromptTemplate and MessagesPlaceholder for consistent prompt construction and conversation history injection.
  • Adopt Pydantic/Json output parsers to enforce structured outputs and reduce downstream parsing errors.
  • Enable streaming (.stream()) and async methods (.ainvoke(), .astream()) for responsive apps and concurrent workloads.
  • Add callbacks, logging, and caching for observability and performance; wrap chains with fallbacks for resilience.

Example use cases

  • Build a question-answering service that retrieves docs with FAISS, formats context into a rag_prompt, and returns structured answers.
  • Implement a chat assistant that preserves session history using RunnableWithMessageHistory and ChatMessageHistory.
  • Create a tool-enabled agent that uses @tool functions for search and calculation, then binds them to a chat model.
  • Deploy a streaming story generator or long-form content composer using .stream() and incremental UI updates.
  • Compose parallel data transformations (summarization + translation) with RunnableParallel to reduce latency.

FAQ

Should I use LCEL or legacy Chain classes?

Use LCEL pipe syntax (|) for clearer composition and better support for runnables like RunnableParallel and RunnableBranch.

How do I ensure model output is machine-readable?

Use JsonOutputParser or PydanticOutputParser to enforce schemas and validate responses before downstream processing.