首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >LangChain_从基础到高级

LangChain_从基础到高级

作者头像
@小森
发布2025-07-27 08:16:58
发布2025-07-27 08:16:58
8340
举报
文章被收录于专栏:xiaosenxiaosen

🚀 LangChain :从基础到高级

本教程通过五个渐进式的实例,带你深入理解 LangChain 的核心概念和实际应用

🎯 教程目标

通过本教程,你将学会:

  • LangChain 的基本概念和组件
  • 如何构建和调试处理链
  • 并行处理和条件分支的实现
  • 实际项目中的最佳实践

第一部分:基础链式操作

📖 概念介绍

LangChain 的核心思想是链式操作(Chaining)- 将多个处理步骤通过管道操作符 | 连接起来,形成一个完整的数据处理流水线。

💻 代码解析
代码语言:javascript
复制
# chain.py - 最简单的链式操作
model = ChatZhipuAI(model="GLM-4-FlashX-250414")

prompt_template = ChatPromptTemplate.from_messages([
    ("system", "you are a facts expert who knows facts about {animal}."),
    ("human", "Tell me {fact_count} facts in chinese."),
])

# 🔗 核心:三步链式操作
chain = prompt_template | model | StrOutputParser() 

result = chain.invoke({"animal": "cat", "fact_count": 2})
🔍 数据流解析
代码语言:javascript
复制
输入数据 {"animal": "cat", "fact_count": 2}
    ↓
📝 prompt_template: 格式化提示模板
    ↓
🤖 model: AI模型生成回复
    ↓
📤 StrOutputParser(): 提取纯文本
    ↓
输出结果: "关于猫的两个事实..."
💡 核心知识点
  1. ChatPromptTemplate: 创建结构化的对话提示
  2. 管道操作符 |: 连接不同的处理组件
  3. StrOutputParser: 将AI回复转换为纯文本字符串
  4. invoke()方法: 执行整个处理链
🌟 适用场景
  • 简单的问答系统
  • 基础的文本生成任务
  • 快速原型开发

第二部分:深入理解链式操作

📖 概念介绍

本部分通过手动构建链式操作调试功能,让你深入理解每个步骤的数据变化过程。

💻 代码解析
代码语言:javascript
复制
# chain2.py - 详细的链式操作分解
format_prompt = RunnableLambda(lambda x: prompt_template.format_prompt(**x))
invoke_model = RunnableLambda(lambda x: model.invoke(x.to_messages()))
parse_output = RunnableLambda(lambda x: x.content)

# 手动构建的链
chain = RunnableSequence(format_prompt, invoke_model, parse_output)
🔧 调试功能演示
代码语言:javascript
复制
def debug_format_prompt(x):
    print(f"输入 x: {x}")                    # dict
    print(f"x 的类型: {type(x)}")            # <class 'dict'>
    result = prompt_template.format_prompt(**x)
    print(f"输出类型: {type(result)}")        # ChatPromptValue
    return result
📊 数据类型变化

步骤

输入类型

输出类型

作用

format_prompt

dict

ChatPromptValue

格式化模板

invoke_model

ChatPromptValue

AIMessage

AI推理

parse_output

AIMessage

str

提取文本

💡 核心知识点
  1. RunnableLambda: 将普通函数转换为可链式操作的组件
  2. RunnableSequence: 顺序执行多个组件
  3. format_prompt() vs invoke(): 两种格式化方法的区别
  4. to_messages(): 转换数据格式的桥梁方法
🌟 适用场景
  • 需要调试的复杂链
  • 自定义处理逻辑
  • 性能监控和日志记录

第三部分:多步骤数据处理链

📖 概念介绍

真实项目中,往往需要多个连续的处理步骤。本部分展示如何构建一个"生成内容→翻译→输出"的完整流水线。

💻 代码解析
代码语言:javascript
复制
# chain3.py - 多步骤处理链
# 第一个模板:生成动物事实
prompt_template = ChatPromptTemplate.from_messages([
    ("system", "you are a facts expert who knows facts about {animal}."),
    ("human", "Tell me {fact_count} facts in chinese."),
])

# 第二个模板:翻译内容
translation_prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a translator and convert the following text into {language}."),
    ("human", "Translate the following text into {language}: {text}"),
])

# 数据转换函数
prepare_for_translation = RunnableLambda(
    lambda output: {"text": output, "language": "french"}
)

# 🔗 完整的多步骤链
chain = (
    prompt_template | 
    model | 
    StrOutputParser() | 
    prepare_for_translation | 
    translation_prompt | 
    model | 
    StrOutputParser()
)
🔄 完整数据流
代码语言:javascript
复制
{"animal": "cat", "fact_count": 2}
    ↓
📝 生成中文动物事实
    ↓
🤖 AI生成: "猫的两个事实..."
    ↓
📤 提取纯文本
    ↓
🔄 数据转换: {"text": "猫的两个事实...", "language": "french"}
    ↓
📝 翻译提示模板
    ↓
🤖 AI翻译: "Deux faits sur les chats..."
    ↓
📤 提取最终结果
💡 核心知识点
  1. 多模板协作: 不同的模板处理不同的任务
  2. 数据格式转换: 在步骤间转换数据结构
  3. 链式思维: 将复杂任务分解为简单步骤
  4. 同一模型的复用: 一个模型处理多种任务
🌟 适用场景
  • 内容生成+处理的工作流
  • 多语言应用
  • 复杂的数据处理管道

第四部分:并行处理与分析

📖 概念介绍

当需要对同一数据进行多角度分析时,并行处理能大大提高效率。本部分展示如何同时进行剧情分析和角色分析。

💻 代码解析
代码语言:javascript
复制
# chain4.py - 并行处理示例
# 电影摘要模板
summary_template = ChatPromptTemplate.from_messages([
    ("system", "You are a movie critic."),
    ("human", "Provide a brief summary of the movie {movie_name}.")
])

# 分析函数
def analyze_plot(plot):
    plot_template = ChatPromptTemplate.from_messages([
        ("system", "You are a movie critic."),
        ("human", "Analyze the plot: {plot}. What are its strengths and weaknesses?"),
    ])
    return plot_template.format_prompt(plot=plot)

# 🔀 并行处理链
chain = (
    summary_template |
    model |
    StrOutputParser() |
    RunnableParallel({
        "summary": RunnableLambda(lambda x: x),  # 保留原始摘要
        "branches": RunnableParallel({
            "plot": plot_branch_chain,
            "characters": character_branch_chain
        })
    }) |
    RunnableLambda(combine_verdicts)
)
🔀 并行处理架构
代码语言:javascript
复制
电影摘要文本
    ↓
┌─ RunnableParallel ────────────────────┐
│                                       │
│  📋 summary: 保留原始摘要              │
│                                       │
│  🔀 branches: RunnableParallel        │
│      ├─ 📈 plot: 剧情分析             │
│      └─ 👥 characters: 角色分析       │
│                                       │
└───────────────────────────────────────┘
    ↓
📊 combine_verdicts: 合并所有结果
💡 核心知识点
  1. RunnableParallel: 并行执行多个任务
  2. 嵌套并行: 多层级的并行处理结构
  3. 数据保留: 在并行处理中保留原始数据
  4. 结果合并: 将多个分析结果组合成最终输出
⚡ 性能优势
  • 时间效率: 并行执行比顺序执行快2-3倍
  • 资源利用: 充分利用多核CPU和GPU
  • 用户体验: 减少等待时间
🌟 适用场景
  • 内容的多维度分析
  • 并行数据处理
  • 高性能AI应用

第五部分:条件分支与智能路由

📖 概念介绍

真实应用中,往往需要根据输入内容的不同特征选择不同的处理路径。本部分展示如何构建智能的反馈处理系统。

💻 代码解析
代码语言:javascript
复制
# chain5.py - 条件分支处理
# 为不同情感定义不同的处理模板
positive_feedback_template = ChatPromptTemplate.from_messages([
    ("system", "你是一个乐于助人的助手。"),
    ("human", "为这条积极反馈生成一封感谢信:{feedback}。"),
])

negative_feedback_template = ChatPromptTemplate.from_messages([
    ("system", "你是一个乐于助人的助手。"),
    ("human", "为这条负面反馈生成一个回复:{feedback}。"),
])

# 🌲 条件分支路由
branches = RunnableBranch(
    (
        lambda x: "positive" in x,
        positive_feedback_template | model | StrOutputParser()
    ),
    (
        lambda x: "negative" in x,
        negative_feedback_template | model | StrOutputParser()
    ),
    (
        lambda x: "neutral" in x,
        neutral_feedback_template | model | StrOutputParser()
    ),
    escalate_feedback_template | model | StrOutputParser()  # 默认分支
)

# 🔗 完整的智能路由链
chain = classification_chain | branches
🌲 分支决策流程
代码语言:javascript
复制
用户反馈
    ↓
🔍 情感分类: "这个产品很糟糕..."
    ↓
📊 分类结果: "negative"
    ↓
🌲 RunnableBranch 决策:
    ├─ ✅ positive? → 感谢信模板
    ├─ ✅ negative? → 问题解决模板 ← 选中
    ├─ ❌ neutral? → 详情询问模板
    └─ ❌ default → 人工客服模板
    ↓
📝 生成针对性回复
💡 核心知识点
  1. RunnableBranch: 根据条件选择不同的处理路径
  2. 条件函数: 使用lambda函数进行路径判断
  3. 默认分支: 处理未匹配的情况
  4. 智能路由: 根据内容特征自动选择最合适的处理方式
🎯 分支策略

条件

处理策略

目标

积极反馈

生成感谢信

增强客户满意度

负面反馈

问题解决方案

化解客户不满

中性反馈

询问更多细节

获取有用信息

其他情况

转人工客服

确保服务质量

🌟 适用场景
  • 客户服务系统
  • 内容审核和分类
  • 智能问答机器人
  • 个性化推荐系统

🎯 最佳实践总结

1. 📐 设计原则
  • 单一职责: 每个组件只负责一个明确的功能
  • 可复用性: 设计可以在不同场景中重复使用的组件
  • 可测试性: 每个步骤都应该可以独立测试和调试
2. 🛠️ 开发建议
代码语言:javascript
复制
# ✅ 推荐:清晰的链式结构
chain = prompt | model | parser

# ✅ 推荐:适当的错误处理
try:
    result = chain.invoke(input_data)
except Exception as e:
    print(f"处理失败: {e}")

# ✅ 推荐:调试功能
debug_chain = chain.with_config({"run_name": "debug_run"})
3. ⚡ 性能优化
  • 并行处理: 对于独立的任务使用 RunnableParallel
  • 缓存策略: 缓存常用的模板和配置
  • 流式处理: 对于长时间运行的任务使用 stream() 方法
4. 🔍 调试技巧
  • 使用 RunnableLambda 添加日志输出
  • 分步测试每个组件
  • 利用 LangSmith 进行链路追踪

🚀 进阶学习路径

阶段1:基础掌握 ✅
  • 理解基本的链式操作
  • 掌握 prompt 模板的使用
  • 熟悉数据类型转换
阶段2:进阶应用 🔄
  • 掌握并行处理技术
  • 学会条件分支设计
  • 理解复杂数据流
阶段3:生产应用 🎯
  • 错误处理和异常管理
  • 性能监控和优化
  • 与外部系统的集成
  • 大规模部署策略

📚 参考资源

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🚀 LangChain :从基础到高级
    • 🎯 教程目标
    • 第一部分:基础链式操作
      • 📖 概念介绍
      • 💻 代码解析
      • 🔍 数据流解析
      • 💡 核心知识点
      • 🌟 适用场景
    • 第二部分:深入理解链式操作
      • 📖 概念介绍
      • 💻 代码解析
      • 🔧 调试功能演示
      • 📊 数据类型变化
      • 💡 核心知识点
      • 🌟 适用场景
    • 第三部分:多步骤数据处理链
      • 📖 概念介绍
      • 💻 代码解析
      • 🔄 完整数据流
      • 💡 核心知识点
      • 🌟 适用场景
    • 第四部分:并行处理与分析
      • 📖 概念介绍
      • 💻 代码解析
      • 🔀 并行处理架构
      • 💡 核心知识点
      • ⚡ 性能优势
      • 🌟 适用场景
    • 第五部分:条件分支与智能路由
      • 📖 概念介绍
      • 💻 代码解析
      • 🌲 分支决策流程
      • 💡 核心知识点
      • 🎯 分支策略
      • 🌟 适用场景
    • 🎯 最佳实践总结
      • 1. 📐 设计原则
      • 2. 🛠️ 开发建议
      • 3. ⚡ 性能优化
      • 4. 🔍 调试技巧
    • 🚀 进阶学习路径
      • 阶段1:基础掌握 ✅
      • 阶段2:进阶应用 🔄
      • 阶段3:生产应用 🎯
    • 📚 参考资源
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档