Skip to content

LangChain核心概念详解

概述

LangChain是一个用于开发由大语言模型(LLM)驱动的应用程序的框架。本章将深入介绍LangChain的核心概念,包括模型、提示、链、记忆、索引和代理等。

核心概念

1. 模型(Models)

LangChain支持多种LLM模型:

  • OpenAI:GPT-3.5、GPT-4等
  • Anthropic:Claude系列模型
  • Google:Gemini系列模型
  • 开源模型:Llama、Mistral等

2. 提示(Prompts)

提示管理是LangChain的核心功能:

  • PromptTemplate:可重用的提示模板
  • ChatPromptTemplate:聊天提示模板
  • FewShotPromptTemplate:少样本提示模板
  • 提示组合:多个提示的组合使用

3. 链(Chains)

链是LangChain的核心抽象:

  • LLMChain:基础LLM链
  • SequentialChain:顺序执行链
  • RouterChain:条件路由链
  • 自定义链:根据需求自定义链

4. 记忆(Memory)

记忆组件用于管理对话历史:

  • ConversationBufferMemory:完整对话历史
  • ConversationSummaryMemory:对话摘要
  • ConversationBufferWindowMemory:滑动窗口记忆
  • 向量存储记忆:基于向量数据库的记忆

5. 索引(Indexes)

索引组件用于文档检索:

  • 文档加载器:加载各种格式的文档
  • 文本分割器:将文档分割成小块
  • 向量存储:存储文档向量
  • 检索器:检索相关文档

6. 代理(Agents)

代理是LangChain的高级抽象:

  • 工具使用:调用外部工具
  • 推理引擎:决定下一步行动
  • 执行循环:执行和观察结果
  • 错误处理:处理执行失败

技术原理

1. 模型抽象层

LangChain的模型抽象层:

  • 统一接口:统一不同模型的调用接口
  • 参数管理:管理模型参数
  • 错误处理:处理模型调用错误
  • 重试机制:自动重试失败的调用

2. 链执行引擎

链执行引擎的核心机制:

  • 顺序执行:按顺序执行链中的组件
  • 数据传递:在组件间传递数据
  • 错误传播:传播和处理错误
  • 回调机制:支持回调函数

3. 记忆管理机制

记忆管理的核心机制:

  • 存储后端:支持多种存储后端
  • 序列化:序列化和反序列化记忆
  • 压缩:压缩记忆以节省空间
  • 检索:从记忆中检索信息

核心API

1. 模型调用

python
# 导入LangChain的模型封装类
# langchain_openai.ChatOpenAI:OpenAI模型的LangChain封装
# 安装:pip install langchain-openai
from langchain_openai import ChatOpenAI

# 导入Anthropic模型封装类
# langchain_anthropic.ChatAnthropic:Anthropic Claude模型的LangChain封装
# 安装:pip install langchain-anthropic
from langchain_anthropic import ChatAnthropic

# 创建OpenAI模型实例
# ChatOpenAI类:封装了OpenAI API的调用逻辑
# 参数说明:
#   model:模型名称,如"gpt-4o-mini"、"gpt-4o"
#   temperature:控制输出随机性,0-2之间,越低越确定
#   api_key:OpenAI API密钥
llm = ChatOpenAI(
    model="gpt-4o-mini",  # 使用GPT-4o-mini模型(推荐)
    temperature=0.7,  # 中等随机性,平衡创造性和准确性
    api_key="your-api-key"  # 替换为真实的API密钥
)

# 创建Anthropic模型实例
# ChatAnthropic类:封装了Anthropic API的调用逻辑
# 参数说明:
#   model:模型名称,如"claude-3-sonnet-20240229"
#   api_key:Anthropic API密钥
llm = ChatAnthropic(
    model="claude-3-sonnet-20240229",  # 使用Claude 3 Sonnet模型
    api_key="your-api-key"  # 替换为真实的API密钥
)

# 调用模型
# invoke()方法:发送请求并获取响应
# 参数:用户输入的文本
# 返回值:AIMessage对象,包含模型生成的内容
response = llm.invoke("你好!")

# 获取响应内容
# response.content:AIMessage对象的content属性,包含文本内容
print(response.content)

2. 提示模板

python
# 导入LangChain的聊天提示模板
# langchain.prompts.ChatPromptTemplate:用于创建聊天提示模板
# 提示模板可以包含系统消息、用户消息等
from langchain.prompts import ChatPromptTemplate

# 创建提示模板
# ChatPromptTemplate.from_messages():从消息列表创建提示模板
# 参数:消息列表,每个消息是元组格式 (角色, 内容)
# 角色类型:
#   "system":系统消息,定义AI助手的行为
#   "user":用户消息,用户的输入
#   "assistant":助手消息,AI的回复
# 占位符:{input} 表示运行时会被替换的变量
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个有用的助手。"),  # 系统消息:定义助手角色
    ("user", "{input}")  # 用户消息:{input}是占位符
])

# 格式化提示
# format_messages():将占位符替换为实际值
# 参数:占位符变量名和值的映射
# 返回值:格式化后的消息列表
messages = prompt.format_messages(input="你好!")
print(messages)

3. 链构建

python
# 导入必要的LangChain组件
from langchain_openai import ChatOpenAI  # OpenAI模型封装
from langchain.prompts import ChatPromptTemplate  # 提示模板
from langchain.schema.output_parser import StrOutputParser  # 字符串输出解析器

# 创建链(Chain)
# 链是LangChain的核心抽象,将多个组件串联起来
# 使用管道操作符 | 连接各个组件
# 数据流向:提示模板 -> 模型 -> 输出解析器
chain = (
    # 第一步:创建提示模板
    ChatPromptTemplate.from_messages([
        ("system", "你是一个有用的助手。"),
        ("user", "{input}")
    ])
    # 第二步:创建OpenAI模型
    | ChatOpenAI(model="gpt-4o-mini")
    # 第三步:创建输出解析器
    # StrOutputParser():将模型输出转换为字符串
    | StrOutputParser()
)

# 执行链
# invoke()方法:执行整个链
# 参数:包含占位符变量的字典
# 返回值:链的最终输出结果
result = chain.invoke({"input": "你好!"})
print(result)

4. 记忆管理(现代方式)

python
# 导入LangChain的核心组件
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, AIMessage
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory

# 创建存储会话历史的字典
# 每个session_id对应一个独立的对话历史
store = {}

def get_session_history(session_id: str) -> InMemoryChatMessageHistory:
    """获取会话历史"""
    if session_id not in store:
        store[session_id] = InMemoryChatMessageHistory()
    return store[session_id]

# 创建模型
llm = ChatOpenAI(model="gpt-4o-mini")

# 创建带历史的链
# RunnableWithMessageHistory:自动管理对话历史
with_message_history = RunnableWithMessageHistory(
    llm,  # 语言模型
    get_session_history,  # 获取历史的函数
    input_messages_key="input",  # 输入消息的键
    history_messages_key="history",  # 历史消息的键
)

# 配置session_id
config = {"configurable": {"session_id": "abc123"}}

# 第一轮对话
response = with_message_history.invoke(
    {"input": "你好,我叫小明"},
    config=config,
)
print(response.content)

# 第二轮对话(模型会记住上下文)
response = with_message_history.invoke(
    {"input": "我叫什么名字?"},
    config=config,
)
print(response.content)  # 模型会回答"小明"

实践指南

1. 环境准备

bash
# 安装LangChain
pip install langchain langchain-openai langchain-anthropic

# 设置环境变量
export OPENAI_API_KEY="your-openai-key"
export ANTHROPIC_API_KEY="your-anthropic-key"

2. 基础示例

python
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema.output_parser import StrOutputParser

# 创建简单链的函数
def simple_chain():
    """
    创建一个简单的LangChain链
    
    返回值:
        chain: 可执行的链对象
    
    链的结构:提示模板 -> 模型 -> 输出解析器
    """
    # 创建提示模板
    prompt = ChatPromptTemplate.from_messages([
        ("system", "你是一个有用的助手。"),  # 系统消息
        ("user", "{input}")  # 用户消息占位符
    ])
    
    # 创建OpenAI模型
    llm = ChatOpenAI(model="gpt-4o-mini")
    
    # 创建输出解析器
    # StrOutputParser():将模型输出转换为纯字符串
    output_parser = StrOutputParser()
    
    # 使用管道操作符连接组件
    # 数据流向:prompt -> llm -> output_parser
    chain = prompt | llm | output_parser
    return chain

# 使用示例
# 创建链实例
chain = simple_chain()

# 执行链
# invoke()方法:执行整个链
# 参数:包含输入变量的字典
result = chain.invoke({"input": "解释什么是Python"})
print(result)

3. 工具集成示例

python
# 导入必要的LangChain组件
from langchain_openai import ChatOpenAI  # OpenAI模型
from langchain.agents import AgentExecutor, create_openai_tools_agent  # Agent执行器和创建函数
from langchain.tools import tool  # 工具装饰器

# 使用@tool装饰器定义工具
# @tool装饰器:将函数转换为LangChain工具
# 函数的docstring会作为工具的描述
# 函数的类型注解会作为参数的类型定义
@tool
def search(query: str) -> str:
    """搜索互联网
    
    参数:
        query (str): 搜索关键词
    
    返回值:
        str: 搜索结果
    """
    # 这里应该是实际的搜索API调用
    # 示例返回模拟结果
    return f"搜索结果: {query}"

@tool
def calculate(expression: str) -> str:
    """计算数学表达式
    
    参数:
        expression (str): 数学表达式,如 "2 + 3 * 4"
    
    返回值:
        str: 计算结果
    """
    try:
        # eval()函数:执行字符串形式的Python表达式
        # 注意:生产环境中应使用更安全的计算方式
        result = eval(expression)
        return str(result)
    except:
        return "计算错误"

def create_agent():
    """
    创建Agent执行器
    
    返回值:
        AgentExecutor: Agent执行器实例
    
    Agent是能够使用工具的智能体
    """
    # 创建OpenAI模型
    llm = ChatOpenAI(model="gpt-4o-mini")
    
    # 工具列表
    tools = [search, calculate]
    
    # 导入提示模板
    from langchain.prompts import ChatPromptTemplate
    
    # 创建提示模板
    # Agent提示模板需要包含{agent_scratchpad}占位符
    # agent_scratchpad:Agent的思考过程和工具调用历史
    prompt = ChatPromptTemplate.from_messages([
        ("system", "你是一个有用的助手,可以使用工具来完成任务。"),  # 系统消息
        ("user", "{input}"),  # 用户输入
        ("placeholder", "{agent_scratchpad}")  # Agent思考过程
    ])
    
    # 创建Agent
    # create_openai_tools_agent():创建支持OpenAI工具调用的Agent
    # 参数:
    #   llm:语言模型
    #   tools:工具列表
    #   prompt:提示模板
    agent = create_openai_tools_agent(llm, tools, prompt)
    
    # 创建Agent执行器
    # AgentExecutor:管理Agent的执行循环
    # 参数:
    #   agent:Agent实例
    #   tools:工具列表
    #   verbose=True:打印详细执行过程
    agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
    return agent_executor

# 使用示例
# 创建Agent实例
agent = create_agent()

# 执行Agent
# invoke()方法:执行Agent
# 参数:包含用户输入的字典
# Agent会自动决定是否使用工具,以及使用哪个工具
result = agent.invoke({"input": "搜索最新科技新闻并计算相关数据"})
print(result)

最佳实践

1. 链设计原则

  • 单一职责:每个链只做一件事
  • 可组合性:链应该可以轻松组合
  • 错误处理:添加适当的错误处理
  • 日志记录:记录链的执行过程

2. 性能优化

  • 缓存结果:缓存常见查询结果
  • 异步执行:使用异步API提升性能
  • 批量处理:批量处理多个请求
  • 模型选择:根据任务选择合适的模型

3. 安全考虑

  • 输入验证:验证用户输入
  • 权限控制:限制工具使用权限
  • 敏感信息:避免在提示中包含敏感信息
  • 审计日志:记录所有操作日志

常见问题

1. 安装问题

  • 依赖冲突:使用虚拟环境隔离依赖
  • 版本兼容:检查版本兼容性
  • API密钥:确保API密钥正确设置

2. 性能问题

  • 响应慢:优化提示设计,减少token数量
  • 内存占用:使用流式处理减少内存占用
  • 并发限制:使用异步处理提升并发能力

3. 调试技巧

  • verbose模式:开启verbose模式查看执行过程
  • 回调函数:使用回调函数监控执行
  • 日志分析:分析日志定位问题

下一步学习