🔗 LangChain开发指南

构建LLM应用的核心框架

🔗
什么是LangChain?
LLM应用开发框架
LangChain核心设计
┌─────────────────────────────────────────────────────────────────┐ │ │ │ LangChain = 组件化 + 链式调用 + 代理机制 │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ Models │ + │ Prompts │ + │ Chains │ + │ Agents │ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ Memory │ + │ RAG │ + │Callbacks│ │ │ └─────────┘ └─────────┘ └─────────┘ │ │ │ └─────────────────────────────────────────────────────────────────┘

📦 Models

封装各种LLM接口

💬 Prompts

提示词模板管理

🔗 Chains

链式调用组合

🤖 Agents

智能代理执行任务

🧠 Memory

对话状态持久化

🔄 RAG

检索增强生成

🎯 核心概念

🏗️ 模型调用 (Models)

模型 用途
ChatOpenAIOpenAI GPT-3.5/4
ChatAnthropicClaude系列
HuggingFaceHub开源模型

💭 提示词 (Prompts)

类型 说明
ChatPromptTemplate聊天格式模板
PromptTemplate简单文本模板
PipelinePrompt模板组合

⛓️ 链 (Chains)

类型 用途
LLMChain简单链
SequentialChain顺序链
TransformChain转换链

🧠 记忆 (Memory)

类型 用途
ConversationBuffer完整对话历史
ConversationWindow窗口记忆
VectorStoreMemory向量存储记忆

📚 RAG集成

RAG工作流程
┌─────────────────────────────────────────────────────────────────┐ │ │ │ 用户问题 ──▶ 检索器 ──▶ 向量数据库 ──▶ 返回相关文档 │ │ │ │ │ │ ▼ ▼ │ │ ┌─────────┐ ┌─────────────────────────────────────────┐ │ │ │ 提示词 │ │ 文档加载 → 分割 → 向量化 → 存储 │ │ │ 模板 │◀───│ │ │ │ └────┬────┘ └─────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────┐ │ │ │ LLM生成 │ │ │ └─────────┘ │ │ │ └─────────────────────────────────────────────────────────────────┘
组件 作用 示例
DocumentLoader加载文档PDFLoader, TextLoader
TextSplitter分割文本RecursiveCharacterTextSplitter
Embeddings向量化OpenAIEmbeddings
VectorStore向量存储FAISS, Chroma, Pinecone
Retriever检索器VectorStoreRetriever

🤖 代理系统

🔧 工具 (Tools)

  • 搜索工具
  • 计算器
  • 自定义函数

📋 代理类型

  • Zero-shot ReAct
  • Conversational
  • Plan-and-Execute

🔄 执行流程

  • 接收任务
  • 选择工具
  • 执行并反馈

📡 回调系统

回调机制
┌─────────────────────────────────────────────────────────────────┐ │ │ │ 事件触发点: │ │ • on_llm_start - LLM开始处理 │ │ • on_llm_end - LLM完成处理 │ │ • on_chain_start - 链开始执行 │ │ • on_chain_end - 链完成执行 │ │ • on_tool_start - 工具开始执行 │ │ • on_tool_end - 工具完成执行 │ │ │ │ 常用场景: │ │ • 日志记录 │ │ • 监控指标 │ │ • 流式输出 │ │ • 进度追踪 │ │ │ └─────────────────────────────────────────────────────────────────┘

⚙️ 生产实践

场景 推荐方案
模型选择GPT-4(复杂), GPT-3.5(简单), Claude(长文本)
缓存策略语义缓存、Redis缓存
速率限制Token限流、请求限流
错误处理重试机制、降级方案
监控告警LangSmith、日志系统

📋 常用模式对比

模式 复杂度 适用场景
简单LLM调用单次问答、简单任务
链式调用⭐⭐多步骤处理、复杂流程
对话系统⭐⭐聊天机器人、客服系统
RAG系统⭐⭐⭐知识库、文档问答
代理系统⭐⭐⭐⭐工具调用、多任务协调

💻 代码示例:带记忆的对话系统

完整示例:对话Chain + Memory
from langchain_openai import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder

# 1. 初始化模型
llm = ChatOpenAI(model="gpt-4", temperature=0.7)

# 2. 定义提示词模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专业的AI助手,请用简洁清晰的语言回答问题。"),
    MessagesPlaceholder(variable_name="history", n_messages=10),
    ("human", "{input}")
])

# 3. 创建对话记忆
memory = ConversationBufferMemory(
    return_messages=True,
    memory_key="history"
)

# 4. 构建对话链
conversation = ConversationChain(
    llm=llm,
    prompt=prompt,
    memory=memory,
    verbose=True
)

# 5. 开始对话
while True:
    user_input = input("\n你: ")
    if user_input.lower() in ["exit", "quit", "退出"]:
        break
    
    response = conversation.invoke({"input": user_input})
    print(f"AI: {response['response']}")

# 输出对话历史
print("\n=== 对话历史 ===")
for msg in memory.buffer:
    print(f"{msg.type}: {msg.content}")
代码说明

🔧 核心组件

  • ChatOpenAI - OpenAI模型
  • ConversationChain - 对话链
  • ConversationBufferMemory - 记忆存储

📝 关键参数

  • n_messages=10 - 保留最近10条消息
  • memory_key="history" - 记忆变量名
  • verbose=True - 显示执行过程

💡 扩展方向

  • 接入RAG实现知识增强
  • 添加Tools实现工具调用
  • 使用VectorStoreMemory优化