LangChain 框架详解:构建 LLM 应用的利器

返回

LangChain 框架详解

LangChain 是构建 LLM 应用最流行的开源框架。本文深入解析 LangChain 的核心概念、组件架构和实际使用方法。

一、什么是 LangChain?

LangChain 是一个用于开发由语言模型驱动的应用程序的开源框架。它的核心目标是:

  1. 连接 — 将 LLM 与外部数据源、API、工具连接起来
  2. 编排 — 组织多个组件协同工作
  3. 简化 — 提供高层抽象,降低开发复杂度

1.1 为什么需要 LangChain?

┌─────────────────────────────────────────────────────────────────┐
│                    不用 LangChain vs 使用 LangChain              │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ❌ 不用框架                          ✅ 使用 LangChain           │
│  ━━━━━━━━━━━━━━━━                   ━━━━━━━━━━━━━━━━            │
│  • 每个模型 API 都不一样              • 统一接口,随意切换        │
│  • 自己处理 Token 限制                 • 自动处理上下文窗口        │
│  • 手动管理对话历史                   • 内置记忆系统              │
│  • 工具调用自己实现                   • 预构建的工具集成          │
│  • Agent 逻辑从头写                   • 10 行代码创建 Agent         │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

二、核心组件架构

2.1 LangChain 组件总览

┌─────────────────────────────────────────────────────────────────┐
│                      LangChain 核心组件                          │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐ │
│  │     Models      │  │     Prompts     │  │    Memory       │ │
│  │     模型        │  │     提示词       │  │     记忆        │ │
│  ├─────────────────┤  ├─────────────────┤  ├─────────────────┤ │
│  │ • Chat Models   │  │ • Templates     │  │ • Conversation  │ │
│  │ • LLMs          │  │ • Few-shot      │  │ • Buffer        │ │
│  │ • Embeddings    │  │ • Examples      │  │ • Vector Store  │ │
│  └─────────────────┘  └─────────────────┘  └─────────────────┘ │
│                                                                 │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐ │
│  │     Tools       │  │    Agents       │  │  Retrievers     │ │
│  │     工具        │  │    智能体        │  │    检索器        │ │
│  ├─────────────────┤  ├─────────────────┤  ├─────────────────┤ │
│  │ • API 调用       │  │ • ReAct         │  │ • Vector DB     │ │
│  │ • 数据库查询     │  │ • Plan & Exec   │  │ • Self-query    │ │
│  │ • 文件系统       │  │ • OpenAI Func   │  │ • Multi-query   │ │
│  └─────────────────┘  └─────────────────┘  └─────────────────┘ │
│                                                                 │
│  ┌─────────────────┐  ┌─────────────────┐                      │
│  │   Chains        │  │   Callbacks     │                      │
│  │   链            │  │   回调          │                      │
│  ├─────────────────┤  ├─────────────────┤                      │
│  │ • Sequential    │  │ • Logging       │                      │
│  │ • Parallel      │  │ • Tracing       │                      │
│  │ • Transform     │  │ • Monitoring    │                      │
│  └─────────────────┘  └─────────────────┘                      │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

三、核心概念详解

3.1 模型(Models)

LangChain 提供统一的接口来调用各种 LLM:

from langchain_anthropic import ChatAnthropic
from langchain_openai import ChatOpenAI
from langchain_google_genai import ChatGoogleGenerativeAI

# Anthropic Claude
claude = ChatAnthropic(model="claude-sonnet-4-6")

# OpenAI GPT
gpt = ChatOpenAI(model="gpt-4o")

# Google Gemini
gemini = ChatGoogleGenerativeAI(model="gemini-2.0-pro")

# 统一的使用方式
response = claude.invoke("你好,请介绍一下自己")

模型类型

类型用途示例
Chat Models对话式交互ChatOpenAI, ChatAnthropic
LLMs文本补全传统 GPT-3 风格
Embeddings文本向量化OpenAIEmbeddings

3.2 提示词(Prompts)

Prompt 模板帮助你管理和复用提示词:

from langchain.prompts import ChatPromptTemplate

# 创建模板
template = ChatPromptTemplate.from_messages([
    ("system", "你是一个{role},擅长{expertise}"),
    ("user", "{input}")
])

# 使用模板
prompt = template.invoke({
    "role": "编程助手",
    "expertise": "Python 开发",
    "input": "如何读取文件?"
})

Few-shot 示例

from langchain.prompts import FewShotChatMessagePromptTemplate

examples = [
    {"input": "2+2", "output": "4"},
    {"input": "2*3", "output": "6"},
]

few_shot = FewShotChatMessagePromptTemplate(
    examples=examples,
    example_prompt=ChatPromptTemplate.from_messages([
        ("user", "{input}"),
        ("ai", "{output}")
    ])
)

3.3 记忆(Memory)

记忆系统让 Agent 能够记住对话历史:

from langchain.memory import ConversationBufferMemory

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

# 保存对话
memory.save_context(
    {"input": "你好"},
    {"output": "你好!有什么可以帮助你的?"}
)

# 获取历史
history = memory.load_memory_variables({})

记忆类型

类型特点适用场景
Buffer Memory保存完整历史短对话
Summary Memory自动总结历史长对话
Vector Store Memory向量检索相关历史需要上下文检索
Entity Memory记忆实体信息需要记住人名、事物

3.4 工具(Tools)

工具让 Agent 能够执行实际操作:

from langchain.tools import tool

@tool
def get_weather(city: str) -> str:
    """查询城市天气"""
    # 实际调用天气 API
    return f"{city} 今天晴朗,温度 25°C"

@tool
def search_web(query: str) -> str:
    """搜索网络信息"""
    # 调用搜索 API
    return "搜索结果..."

# 使用工具
tools = [get_weather, search_web]

内置工具

LangChain 提供丰富的内置工具:

  • 🔍 搜索: Google Search, Bing, DuckDuckGo
  • 📊 计算: Wolfram Alpha, Calculator
  • 💻 代码: Python REPL, GitHub
  • 📁 文件: File System, Web Scraper
  • 🗄️ 数据库: SQL Database, MongoDB

3.5 Agent(智能体)

Agent 是 LangChain 的核心,它能够自主决定使用哪些工具来完成任务:

from langchain.agents import create_agent

agent = create_agent(
    model="claude-sonnet-4-6",
    tools=[get_weather, search_web],
    system_prompt="你是一个有帮助的助手,可以使用工具查询信息",
)

result = agent.invoke({
    "messages": [{"role": "user", "content": "北京天气怎么样?"}]
})

Agent 类型

类型说明适用场景
create_agent现代推荐方式通用场景
ReAct推理 + 行动需要多步推理
Plan & Execute先计划后执行复杂任务
OpenAI Functions使用 Function CallingOpenAI 模型
Conversational对话式 Agent客服场景

3.6 检索器(Retrievers)

检索器用于从大量数据中查找相关信息:

from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings

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

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

# 检索相关文档
relevant_docs = retriever.invoke("查询问题")

四、实战:构建一个完整的 Agent

4.1 场景:智能研究助手

让我们构建一个能够研究主题、搜索信息、总结报告的智能助手。

from langchain.agents import create_agent
from langchain.tools import tool
from langchain_anthropic import ChatAnthropic

# 1. 定义工具
@tool
def search_topic(topic: str) -> str:
    """搜索特定主题的信息"""
    # 实际实现会调用搜索 API
    return f"关于{topic}的研究信息..."

@tool
def analyze_data(data: str) -> str:
    """分析数据并提取关键信息"""
    return f"分析结果:{data[:100]}..."

@tool
def write_report(topic: str, findings: str) -> str:
    """撰写研究报告"""
    return f"## {topic} 研究报告\n\n{findings}"

# 2. 创建 Agent
agent = create_agent(
    model=ChatAnthropic(model="claude-sonnet-4-6"),
    tools=[search_topic, analyze_data, write_report],
    system_prompt="""你是一个研究助手,帮助完成以下任务:
1. 搜索主题相关信息
2. 分析收集到的数据
3. 撰写结构化的研究报告

请逐步完成任务,并在每一步说明你在做什么。""",
)

# 3. 使用 Agent
result = agent.invoke({
    "messages": [{
        "role": "user", 
        "content": "请研究量子计算的最新进展,并写一份报告"
    }]
})

print(result["messages"][-1].content)

4.2 添加记忆功能

from langchain.memory import ConversationBufferMemory

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

agent = create_agent(
    model="claude-sonnet-4-6",
    tools=[search_topic, analyze_data, write_report],
    system_prompt="你是一个研究助手...",
    memory=memory,
)

# 现在 Agent 可以记住之前的对话
result1 = agent.invoke({"messages": [{"role": "user", "content": "研究量子计算"}]})
result2 = agent.invoke({"messages": [{"role": "user", "content": "基于刚才的研究,总结三个关键点"}]})

4.3 添加 LangSmith 追踪

import os

# 设置环境变量开启追踪
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_API_KEY"] = "your_api_key"
os.environ["LANGSMITH_PROJECT"] = "research-assistant"

# 现在所有调用都会自动记录到 LangSmith
# 访问 https://smith.langchain.com 查看追踪

五、最佳实践

5.1 Prompt 设计

好的 Prompt:

system_prompt = """你是一个专业的{role}

## 能力
- 能力 1: 描述
- 能力 2: 描述

## 约束
- 约束 1
- 约束 2

## 输出格式
请按照以下格式回答:
1. 分析
2. 方案
3. 建议"""

避免:

# 太模糊
system_prompt = "你是一个助手"

# 太长太复杂
system_prompt = "你是一个...(500 字)"

5.2 工具设计

@tool
def search_weather(city: str, date: str = "today") -> str:
    """查询城市天气
    
    Args:
        city: 城市名称,如"北京"、"New York"
        date: 日期,默认"today",格式"YYYY-MM-DD"
    
    Returns:
        天气信息字符串
    """
    # 清晰的文档字符串帮助 Agent 理解何时使用此工具
    pass

5.3 错误处理

from langchain.agents import AgentExecutor

executor = AgentExecutor.from_agent_and_tools(
    agent=agent,
    tools=tools,
    handle_parsing_errors=True,  # 自动处理解析错误
    max_iterations=5,  # 限制最大迭代次数
    max_execution_time=60,  # 限制执行时间
)

5.4 性能优化

优化点方法
减少 Token精简 Prompt,使用摘要
缓存使用 LangChain 缓存中间结果
并行并行执行独立的任务
流式使用流式输出提升用户体验

六、常见问题

Q1: LangChain 和 LangGraph 有什么区别?

LangChain 是高层框架,适合快速构建标准应用;LangGraph 是底层编排引擎,适合复杂工作流。LangChain 的 Agent 底层使用 LangGraph。

Q2: 如何选择模型提供商?

  • 追求性能: Claude (Anthropic), GPT-4 (OpenAI)
  • 性价比: Claude Haiku, GPT-4o-mini
  • 开源: Llama (Meta), Mistral
  • 国内: 通义千问、文心一言、Kimi

Q3: LangChain 支持哪些语言?

  • Python: 最成熟,功能最全
  • JavaScript/TypeScript: 功能逐步完善
  • 其他: 社区有 Java、Go 等非官方实现

七、学习资源


💡 提示: LangChain 更新频繁,建议定期查看官方文档了解最新功能和最佳实践。