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模式查看执行过程
- 回调函数:使用回调函数监控执行
- 日志分析:分析日志定位问题
下一步学习
- API参考手册 - 详细的API文档
- 最佳实践指南 - 生产环境使用建议
- LangGraph工作流 - 学习基于图的Agent工作流