⛓️ 全球最流行的LLM开发框架

LangChain 完整教程

为构建强大的LLM应用提供模块化、可组合的工具

⭐ 80K+ Stars 🐍 Python/JavaScript 🔧 模块化设计 🚀 生产级应用

💎 为什么选择 LangChain?

🔗

模块化架构

提供Chains、Agents、Memory等可组合组件,灵活构建复杂AI应用。

🌍

生态丰富

支持100+ LLM集成,300+ 工具和数据源,社区活跃。

🏢

生产就绪

LangSmith监控,LangServe部署,完整的DevOps工具链。

🧩 LangChain核心组件

📝 Prompts

提示词模板管理,支持变量替换和Few-shot示例

🤖 Models

统一的LLM接口,支持OpenAI、Anthropic等100+模型

🔗 Chains

链式调用组件,串联多个步骤完成复杂任务

🧠 Memory

对话记忆管理,支持短期、长期和向量记忆

🧬 Agents

自主决策代理,动态选择工具完成任务

🗄️ Retrievers

文档检索组件,支持向量数据库和混合检索

🚀 快速开始

📦 1. 安装 LangChain

Python版本(推荐):

# 核心库
pip install langchain

# 包含所有集成(推荐)
pip install langchain-community

# OpenAI集成
pip install langchain-openai

# Anthropic集成
pip install langchain-anthropic

# 本地模型集成
pip install langchain-ollama

JavaScript版本:

npm install langchain
npm install @langchain/openai
npm install @langchain/anthropic

👶 2. 第一个 LangChain 程序

基础示例:简单的LLM调用

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage

# 初始化模型
llm = ChatOpenAI(
    model="gpt-4",
    temperature=0.7,
    api_key="your-api-key"
)

# 调用模型
messages = [HumanMessage(content="解释一下什么是LangChain")]
response = llm.invoke(messages)
print(response.content)

使用提示词模板

from langchain_core.prompts import ChatPromptTemplate

# 创建提示词模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专业的{domain}专家"),
    ("human", "{question}")
])

# 创建链
chain = prompt | llm

# 调用链
result = chain.invoke({
    "domain": "Python编程",
    "question": "如何优化代码性能?"
})
print(result.content)

使用输出解析器

from langchain_core.output_parsers import StrOutputParser

# 完整的链:提示词 → 模型 → 解析器
chain = prompt | llm | StrOutputParser()

# 直接获取字符串结果
result = chain.invoke({
    "domain": "数据分析",
    "question": "如何进行数据清洗?"
})
print(result)  # 直接是字符串,不需要.content

🎯 LangChain核心功能详解

1️⃣ 提示词模板(Prompt Templates)

管理和重用提示词,支持变量替换、Few-shot学习和聊天历史。

from langchain_core.prompts import PromptTemplate

# 简单模板
template = PromptTemplate.from_template(
    "将以下文本翻译成{target_language}:{text}"
)

# Few-shot模板
from langchain_core.prompts import FewShotPromptTemplate

examples = [
    {"input": "happy", "output": "快乐"},
    {"input": "sad", "output": "悲伤"}
]

example_prompt = PromptTemplate(
    input_variables=["input", "output"],
    template="英文:{input}\n中文:{output}"
)

few_shot_prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    prefix="你是一个专业翻译:",
    suffix="英文:{input}\n中文:",
    input_variables=["input"]
)

2️⃣ 链式调用(Chains)

组合多个步骤,使用LCEL(LangChain Expression Language)构建复杂流程。

from langchain_core.runnables import RunnablePassthrough

# 简单链:提示词 | 模型 | 解析器
simple_chain = prompt | llm | StrOutputParser()

# 并行链
from langchain_core.runnables import RunnableParallel

chain = RunnableParallel({
    "summary": summary_chain,
    "keywords": keyword_chain,
    "sentiment": sentiment_chain
})

# 条件链
from langchain_core.runnables import RunnableBranch

branch = RunnableBranch(
    (lambda x: "code" in x, code_chain),
    (lambda x: "data" in x, data_chain),
    default_chain
)

3️⃣ 记忆管理(Memory)

保持对话上下文,支持多种记忆类型。

from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain

# 简单缓冲记忆
memory = ConversationBufferMemory()

# 限制长度的记忆
from langchain.memory import ConversationBufferWindowMemory
memory = ConversationBufferWindowMemory(k=5)  # 只保留最近5轮

# 摘要记忆(长对话)
from langchain.memory import ConversationSummaryMemory
memory = ConversationSummaryMemory(llm=llm)

# 使用记忆的对话链
conversation = ConversationChain(
    llm=llm,
    memory=memory,
    verbose=True
)

response = conversation.predict(input="你好,我是小明")
response = conversation.predict(input="我刚才说我叫什么?")

📚 RAG应用开发实战

检索增强生成(RAG)是LangChain的核心应用场景,从基础到高级的完整实现

🎯 基础RAG实现(5分钟上手)

from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA

# 1. 加载文档
loader = TextLoader("docs/my_document.txt")
documents = loader.load()

# 2. 文档分块
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50
)
texts = text_splitter.split_documents(documents)

# 3. 创建向量存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(
    documents=texts,
    embedding=embeddings
)

# 4. 创建检索器
retriever = vectorstore.as_retriever(
    search_type="similarity",
    search_kwargs={"k": 3}
)

# 5. 创建问答链
qa_chain = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(model="gpt-4"),
    chain_type="stuff",
    retriever=retriever,
    return_source_documents=True
)

# 6. 提问
result = qa_chain.invoke({"query": "文档的主要内容是什么?"})
print(result["result"])
print("来源文档:", result["source_documents"])

🚀 高级RAG技术

混合检索(Hybrid Search)

from langchain.retrievers import EnsembleRetriever
from langchain_community.retrievers import BM25Retriever

# 向量检索器
vector_retriever = vectorstore.as_retriever(k=5)

# BM25关键词检索器
bm25_retriever = BM25Retriever.from_documents(texts)
bm25_retriever.k = 5

# 混合检索(0.5权重各占一半)
ensemble_retriever = EnsembleRetriever(
    retrievers=[vector_retriever, bm25_retriever],
    weights=[0.5, 0.5]
)

上下文压缩(Context Compression)

from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor

# 创建压缩器
compressor = LLMChainExtractor.from_llm(llm)

# 压缩检索器
compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor,
    base_retriever=retriever
)

# 只返回相关部分
compressed_docs = compression_retriever.get_relevant_documents(
    "什么是LangChain?"
)

多查询检索(Multi-Query)

from langchain.retrievers.multi_query import MultiQueryRetriever

# 自动生成多个查询变体
multi_query_retriever = MultiQueryRetriever.from_llm(
    retriever=vectorstore.as_retriever(),
    llm=ChatOpenAI(temperature=0)
)

# 用户问题 → 生成3-5个变体 → 分别检索 → 合并去重
docs = multi_query_retriever.get_relevant_documents(
    "LangChain的主要优势"
)

对话式RAG

from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

qa = ConversationalRetrievalChain.from_llm(
    llm=ChatOpenAI(),
    retriever=retriever,
    memory=memory
)

# 多轮对话
qa.invoke({"question": "LangChain是什么?"})
qa.invoke({"question": "它有哪些核心组件?"})  # 理解"它"指代LangChain

🤖 Agent开发实战

什么是Agent?

Agent是能够自主决策的AI助手,它可以:

  • 理解任务:分析用户意图
  • 制定计划:拆解复杂任务为步骤
  • 选择工具:动态调用合适的工具
  • 执行反馈:根据结果调整策略

🛠️ 创建第一个Agent

from langchain.agents import initialize_agent, Tool, AgentType
from langchain_openai import ChatOpenAI
from langchain_community.tools import DuckDuckGoSearchRun

# 定义工具
search = DuckDuckGoSearchRun()

tools = [
    Tool(
        name="搜索",
        func=search.run,
        description="当需要查找最新信息或你不知道的内容时使用"
    ),
    Tool(
        name="计算器",
        func=lambda x: eval(x),
        description="当需要进行数学计算时使用,输入数学表达式"
    )
]

# 初始化Agent
agent = initialize_agent(
    tools=tools,
    llm=ChatOpenAI(model="gpt-4", temperature=0),
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)

# 运行Agent
result = agent.run("2024年诺贝尔物理学奖得主是谁?获奖理由是什么?")
print(result)

🔍 Agent执行过程:

  1. 1. 分析问题:需要查找最新信息
  2. 2. 选择工具:使用"搜索"工具
  3. 3. 执行搜索:调用DuckDuckGo
  4. 4. 分析结果:提取获奖者和理由
  5. 5. 生成回答:整理成完整答案

🔧 创建自定义工具

方法1:使用装饰器

from langchain.tools import tool

@tool
def get_word_length(word: str) -> int:
    """返回单词的长度"""
    return len(word)

# 使用工具
tools = [get_word_length]

方法2:继承BaseTool

from langchain.tools import BaseTool
from typing import Optional

class CustomTool(BaseTool):
    name = "自定义工具"
    description = "工具描述"
    
    def _run(self, query: str) -> str:
        # 工具逻辑
        return f"处理结果:{query}"
    
    async def _arun(self, query: str):
        # 异步版本
        raise NotImplementedError()

🚀 高级Agent模式

ReAct Agent(推荐)

结合推理(Reasoning)和行动(Acting)的模式

from langchain.agents import create_react_agent
from langchain import hub

# 使用社区prompt
prompt = hub.pull("hwchase17/react")

agent = create_react_agent(
    llm=llm,
    tools=tools,
    prompt=prompt
)

from langchain.agents import AgentExecutor

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,
    max_iterations=10
)

OpenAI Functions Agent

利用OpenAI的函数调用能力

from langchain.agents import create_openai_functions_agent

agent = create_openai_functions_agent(
    llm=ChatOpenAI(model="gpt-4"),
    tools=tools,
    prompt=prompt
)

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True
)

💼 实战案例集

案例1:企业知识库问答系统

构建支持多文档格式的智能问答系统,包含增量更新和来源追踪。

from langchain_community.document_loaders import (
    PyPDFLoader, 
    Docx2txtLoader,
    UnstructuredMarkdownLoader
)
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Qdrant
from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory
import os

class KnowledgeBase:
    def __init__(self, collection_name="company_kb"):
        self.embeddings = OpenAIEmbeddings()
        self.vectorstore = Qdrant(
            collection_name=collection_name,
            embeddings=self.embeddings,
            path="./qdrant_db"
        )
        self.llm = ChatOpenAI(model="gpt-4", temperature=0)
        
    def load_documents(self, directory):
        """加载多种格式文档"""
        docs = []
        for filename in os.listdir(directory):
            filepath = os.path.join(directory, filename)
            
            if filename.endswith('.pdf'):
                loader = PyPDFLoader(filepath)
            elif filename.endswith('.docx'):
                loader = Docx2txtLoader(filepath)
            elif filename.endswith('.md'):
                loader = UnstructuredMarkdownLoader(filepath)
            else:
                continue
                
            docs.extend(loader.load())
        
        # 分块
        text_splitter = RecursiveCharacterTextSplitter(
            chunk_size=500,
            chunk_overlap=50,
            separators=["\n\n", "\n", "。", "!", "?", ";", " "]
        )
        
        texts = text_splitter.split_documents(docs)
        
        # 添加到向量库
        self.vectorstore.add_documents(texts)
        print(f"已索引 {len(texts)} 个文档块")
        
    def create_qa_chain(self):
        """创建问答链"""
        memory = ConversationBufferMemory(
            memory_key="chat_history",
            return_messages=True,
            output_key="answer"
        )
        
        qa_chain = ConversationalRetrievalChain.from_llm(
            llm=self.llm,
            retriever=self.vectorstore.as_retriever(
                search_type="mmr",  # 最大边际相关性
                search_kwargs={"k": 5, "fetch_k": 20}
            ),
            memory=memory,
            return_source_documents=True,
            verbose=True
        )
        
        return qa_chain

# 使用示例
kb = KnowledgeBase()
kb.load_documents("./company_docs")
qa_chain = kb.create_qa_chain()

# 提问
result = qa_chain.invoke({"question": "公司的休假政策是什么?"})
print("回答:", result["answer"])
print("来源:", [doc.metadata for doc in result["source_documents"]])

💡 核心要点:

  • ✓ 支持PDF、Word、Markdown等多种格式
  • ✓ 使用MMR避免返回重复内容
  • ✓ 对话记忆支持多轮对话
  • ✓ 返回来源文档便于验证

案例2:智能客服Agent

结合工具调用和知识库的智能客服系统,能够查询订单、搜索FAQ、转人工等。

from langchain.agents import create_openai_functions_agent, AgentExecutor
from langchain_core.tools import tool
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

# 定义客服工具
@tool
def query_order_status(order_id: str) -> str:
    """查询订单状态,输入订单号"""
    # 实际应该查询数据库
    return f"订单{order_id}状态:已发货,预计明天送达"

@tool
def search_faq(question: str) -> str:
    """搜索常见问题,输入问题关键词"""
    # 实际应该查询FAQ知识库
    return "根据FAQ:退货需在收货后7天内申请"

@tool
def transfer_to_human() -> str:
    """转接人工客服"""
    return "正在为您转接人工客服,请稍候..."

# 客服提示词
prompt = ChatPromptTemplate.from_messages([
    ("system", """你是一个专业的客服助手,负责帮助用户解决问题。

【服务准则】
1. 友好、耐心、专业
2. 优先使用工具查询准确信息
3. 无法解决时转人工客服
4. 保护用户隐私

可用工具:
- query_order_status: 查询订单
- search_faq: 搜索常见问题
- transfer_to_human: 转人工"""),
    MessagesPlaceholder(variable_name="chat_history", optional=True),
    ("human", "{input}"),
    MessagesPlaceholder(variable_name="agent_scratchpad")
])

# 创建Agent
tools = [query_order_status, search_faq, transfer_to_human]

agent = create_openai_functions_agent(
    llm=ChatOpenAI(model="gpt-4", temperature=0),
    tools=tools,
    prompt=prompt
)

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,
    max_iterations=5
)

# 测试
result = agent_executor.invoke({
    "input": "我的订单ORD123456什么时候能到?"
})
print(result["output"])

案例3:数据分析Agent

能够读取CSV、执行Python代码、生成图表的数据分析助手。

from langchain_experimental.agents import create_pandas_dataframe_agent
import pandas as pd

# 加载数据
df = pd.read_csv("sales_data.csv")

# 创建数据分析Agent
agent = create_pandas_dataframe_agent(
    ChatOpenAI(model="gpt-4", temperature=0),
    df,
    verbose=True,
    agent_type=AgentType.OPENAI_FUNCTIONS,
    allow_dangerous_code=True  # 允许执行代码
)

# 自然语言查询数据
questions = [
    "这个数据集有多少行?",
    "销售额最高的前5个产品是什么?",
    "计算平均订单金额",
    "哪个月份的销售额最高?",
    "帮我找出销售额异常的记录"
]

for q in questions:
    print(f"\n问题:{q}")
    answer = agent.invoke(q)
    print(f"回答:{answer}")

🎓 高级特性与技巧

⚡ 流式输出(Streaming)

from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler

# 方法1:回调函数
llm = ChatOpenAI(
    streaming=True,
    callbacks=[StreamingStdOutCallbackHandler()]
)

# 方法2:stream方法
for chunk in llm.stream("讲一个故事"):
    print(chunk.content, end="", flush=True)

# 方法3:astream异步流式
async for chunk in llm.astream("讲一个故事"):
    print(chunk.content, end="")

📊 批处理(Batch)

# 批量调用,提升效率
questions = [
    "什么是Python?",
    "什么是JavaScript?",
    "什么是Go?"
]

# 并行处理多个请求
results = chain.batch([
    {"question": q} for q in questions
])

# 异步批处理
results = await chain.abatch([
    {"question": q} for q in questions
])

📋 结构化输出

from langchain_core.output_parsers import JsonOutputParser
from langchain_core.pydantic_v1 import BaseModel, Field

# 定义输出结构
class Person(BaseModel):
    name: str = Field(description="姓名")
    age: int = Field(description="年龄")
    occupation: str = Field(description="职业")

parser = JsonOutputParser(pydantic_object=Person)

prompt = ChatPromptTemplate.from_messages([
    ("system", "提取人物信息。\n{format_instructions}"),
    ("human", "{text}")
])

chain = prompt | llm | parser

result = chain.invoke({
    "text": "小明今年25岁,是一名软件工程师",
    "format_instructions": parser.get_format_instructions()
})

print(result)  # {"name": "小明", "age": 25, "occupation": "软件工程师"}

🛡️ 错误处理与重试

from langchain.chains import LLMChain
from langchain.callbacks import get_openai_callback

# 追踪成本
with get_openai_callback() as cb:
    result = chain.invoke({"question": "..."})
    print(f"Token使用:{cb.total_tokens}")
    print(f"成本:${cb.total_cost}")

# 重试机制
from tenacity import retry, stop_after_attempt

@retry(stop=stop_after_attempt(3))
def call_with_retry(chain, input_data):
    return chain.invoke(input_data)

# 超时控制
from langchain.callbacks import TimeoutCallback

chain.invoke(
    {"question": "..."},
    config={"callbacks": [TimeoutCallback(timeout=30)]}
)

🌐 LangChain生态系统

🔍

LangSmith

调试、测试、监控LLM应用的平台

  • • 追踪每次调用的详细过程
  • • 评估和测试提示词效果
  • • 监控生产环境性能
  • • 团队协作和版本管理
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your-key"

# 所有调用自动追踪到LangSmith
了解更多
🚀

LangServe

将LangChain应用部署为REST API

  • • 自动生成OpenAPI文档
  • • 支持流式响应
  • • Playground测试界面
  • • 生产级性能
from langserve import add_routes
from fastapi import FastAPI

app = FastAPI()

add_routes(app, chain, path="/chat")

# uvicorn main:app --reload
# API: http://localhost:8000/chat
了解更多
🔀

LangGraph

构建有状态的多Agent工作流

  • • 图结构编排Agent
  • • 循环和条件分支
  • • 持久化状态管理
  • • 人机协作工作流
from langgraph.graph import StateGraph

graph = StateGraph(AgentState)
graph.add_node("research", research_node)
graph.add_node("write", write_node)
graph.add_edge("research", "write")

app = graph.compile()
了解更多

⭐ 最佳实践

✅ 推荐做法

  • 使用LCEL:新的链式语法(prompt | llm | parser)更简洁、支持流式
  • 启用LangSmith:追踪每次调用,便于调试和优化
  • 异步优先:高并发场景使用ainvoke、astream等异步方法
  • 缓存机制:使用Cache减少重复调用,降低成本
  • 错误处理:添加重试逻辑和降级策略

❌ 常见陷阱

  • 过度使用Chain:简单任务直接调用LLM,不要过度封装
  • 忽略Token限制:注意上下文长度,及时清理历史
  • 不测试就上线:务必用测试集验证效果
  • 硬编码API密钥:使用环境变量或密钥管理服务
  • 忽略成本:监控API调用量,设置预算告警

⚡ 性能优化技巧

缓存策略

from langchain.cache import InMemoryCache
from langchain.globals import set_llm_cache

set_llm_cache(InMemoryCache())

# Redis缓存(生产环境)
from langchain.cache import RedisCache
import redis

set_llm_cache(
    RedisCache(
        redis.Redis(host="localhost", port=6379)
    )
)

并发控制

# 限制并发数
from langchain_core.runnables import RunnableConfig

config = RunnableConfig(
    max_concurrency=5
)

results = await chain.abatch(
    inputs,
    config=config
)

成本监控

from langchain.callbacks import get_openai_callback

with get_openai_callback() as cb:
    result = chain.invoke({...})
    
    print(f"Tokens: {cb.total_tokens}")
    print(f"Cost: ${cb.total_cost:.4f}")

❓ 常见问题解答

Q1: LangChain vs LlamaIndex,如何选择?

LangChain:功能全面,适合构建复杂应用(Agent、多步骤工作流)
LlamaIndex:专注数据索引和RAG,更简单易用
建议:RAG应用用LlamaIndex,需要Agent或复杂流程用LangChain,也可以混合使用

Q2: 如何降低API调用成本?

多种策略结合使用:

  • • 使用缓存避免重复调用
  • • 简单任务用gpt-3.5-turbo或gpt-4o-mini
  • • 压缩提示词,去掉冗余描述
  • • 设置max_tokens限制输出长度
  • • 考虑使用本地模型(Ollama)替代部分场景

Q3: Agent经常出错或死循环怎么办?

设置合理的限制和指导:

  • • 设置max_iterations=10限制循环次数
  • • 工具描述要清晰,避免歧义
  • • 使用early_stopping_method="generate"
  • • 提示词中明确任务边界
  • • 升级到GPT-4,推理能力更强

Q4: 如何处理超长文档?

多种策略可选:

  • • Map-Reduce:先分段总结,再合并总结
  • • Refine:迭代式优化答案
  • • Map-Rerank:生成多个答案后排序选择最佳
  • • 使用支持长上下文的模型(Claude 200K)

Q5: 生产环境部署注意事项?

确保稳定性和可维护性:

  • • 使用LangSmith监控所有调用
  • • 实现完善的错误处理和重试机制
  • • 限流保护,防止成本失控
  • • 敏感信息过滤和审计日志
  • • A/B测试新版本提示词
  • • 定期备份向量数据库

Q6: 如何调试LangChain应用?

使用多种调试工具:

  • • 设置verbose=True查看详细过程
  • • 使用LangSmith可视化追踪
  • • 添加自定义回调函数记录中间结果
  • • 单元测试每个组件
  • • 使用调试模式:set_debug(True)

🗺️ LangChain学习路径

1️⃣

基础入门

1-2周

  • • LLM基础调用
  • • Prompt模板
  • • 简单Chain
  • • 输出解析
2️⃣

RAG开发

2-3周

  • • 文档加载
  • • 向量存储
  • • 检索优化
  • • 对话记忆
3️⃣

Agent实战

3-4周

  • • 工具定义
  • • Agent类型
  • • 自主决策
  • • 多Agent协作
4️⃣

生产部署

持续学习

  • • LangServe API
  • • LangSmith监控
  • • 性能优化
  • • 成本控制

📖 进阶学习资源

继续探索