006-LangChain表达式语言(LCEL)案例分析

1. 案例目标

本案例旨在介绍LangChain表达式语言(LCEL)的基本用法,展示如何通过LCEL将提示模板、模型和输出解析器组合成一个完整的处理链。具体目标包括:

  • 理解LCEL的基本概念和工作原理
  • 学习如何创建和使用提示模板(PromptTemplate)
  • 掌握如何将多个组件通过管道操作符(|)连接成链
  • 了解如何使用输出解析器处理模型响应
  • 实现流式输出和批量处理功能

2. 技术栈与核心依赖

本案例使用的主要技术栈和依赖包括:

  • LangChain - 用于构建AI应用的核心框架
  • langchain-openai - 提供与OpenAI API的集成
  • langchain-core - 提供LangChain的核心功能,包括提示模板和输出解析器
  • langchain-community - 提供社区贡献的组件和集成
  • langsmith - 用于跟踪和调试LangChain应用
  • langchain-opentutorial - 提供教程辅助功能
  • OpenAI API - 提供GPT-4o-mini模型服务

3. 环境配置

运行本案例需要进行以下环境配置:

3.1 安装依赖

# 安装langchain-opentutorial包
%pip install langchain-opentutorial

# 安装所需的核心包
from langchain_opentutorial import package
package.install(
    [
        "langsmith",
        "langchain",
        "langchain_openai",
        "langchain_community",
    ],
    verbose=False,
    upgrade=False,
)

3.2 设置环境变量

# 设置环境变量
from langchain_opentutorial import set_env

set_env(
    {
        "OPENAI_API_KEY": "",  # 设置您的OpenAI API密钥
        "LANGCHAIN_API_KEY": "",  # 设置LangSmith API密钥
        "LANGCHAIN_TRACING_V2": "true",
        "LANGCHAIN_ENDPOINT": "https://api.smith.langchain.com",
        "LANGCHAIN_PROJECT": "",
    }
)

也可以通过.env文件加载环境变量:

# 加载.env文件中的环境变量
from dotenv import load_dotenv
load_dotenv(override=True)

3.3 启用LangSmith跟踪

# 设置LangSmith跟踪
from langsmith import utils
utils.tracing_is_enabled()

4. 案例实现

4.1 提示模板的使用

提示模板(PromptTemplate)用于通过整合用户输入变量来创建完整的提示字符串。

创建提示模板
from langchain_core.prompts import PromptTemplate

# 定义模板
template = "What is the capital of {country}?"

# 使用from_template方法创建PromptTemplate对象
prompt_template = PromptTemplate.from_template(template)
prompt_template
使用提示模板生成提示
# 生成提示
prompt = prompt_template.format(country="Korea")
print(prompt)  # 输出: What is the capital of Korea?

prompt = prompt_template.format(country="USA")
print(prompt)  # 输出: What is the capital of USA?

4.2 链的创建

LangChain表达式语言(LCEL)允许我们使用管道操作符(|)将多个组件组合成一个链。

基本链的创建
from langchain_openai.chat_models import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser

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

# 创建提示
prompt = PromptTemplate.from_template("Please explain {topic} in simple terms.")

# 创建输出解析器
output_parser = StrOutputParser()

# 使用管道操作符创建链
chain = prompt | model | output_parser
调用链
# 设置输入
input = {"topic": "The Principles of Learning in Artificial Intelligence Models"}

# 调用链
response = chain.invoke(input)
print(response)
流式输出
# 请求流式输出
answer = chain.stream(input)

# 流式输出
for token in answer:
    print(token.content, end="", flush=True)

4.3 高级应用示例

案例中还展示了一个更复杂的应用,创建一个英语对话生成器:

创建对话模板
template = """
You are a seasoned English teacher with 10 years of experience. Please write an English conversation suitable for the given situation.  
Refer to the [FORMAT] for the structure.

#SITUATION:
{question}

#FORMAT:
- Dialogue in English:
- Explanation of the Dialogue: 
"""

# 生成提示
prompt = PromptTemplate.from_template(template)

# 初始化ChatOpenAI模型
model = ChatOpenAI(model_name="gpt-4o-mini")

# 初始化字符串输出解析器
output_parser = StrOutputParser()

# 构建链
chain = prompt | model | output_parser
使用对话生成器
# 执行链获取响应
print(chain.invoke({"question": "I want to go to a restaurant and order food."}))

# 流式输出
answer = chain.stream({"question": "Ordering Pizza in the US"})
for token in answer:
    print(token, end="", flush=True)

5. 案例效果

5.1 基本链效果

当使用基本链询问"人工智能模型的学习原理"时,系统会返回一个详细的解释,包括:

  • 数据的重要性
  • 从示例中学习
  • 反馈循环
  • 泛化能力
  • 过拟合和欠拟合
  • 算法选择
  • 持续学习

2. 对话生成器效果

对话生成器能够根据给定的场景生成符合格式的英语对话,包括:

  • 完整的英语对话内容
  • 对话的详细解释
  • 场景相关的词汇和表达
  • 实用的交际用语

3. 流式输出效果

流式输出功能可以实时显示模型生成的文本,提供更好的用户体验,特别是在生成长文本时。

6. 案例实现思路

6.1 LCEL设计理念

LangChain表达式语言(LCEL)的设计理念是提供一种简洁、直观的方式来组合不同的组件。其核心思想包括:

  • 组合性:通过管道操作符(|)将不同组件连接起来,形成处理链
  • 统一接口:所有组件都实现了相同的接口,可以无缝连接
  • 异步支持:原生支持异步操作,提高性能
  • 流式处理:内置流式处理能力,适合实时应用

6.2 组件协作机制

在LCEL中,各组件之间的协作遵循以下机制:

  1. 数据流:数据从左向右流动,每个组件的输出作为下一个组件的输入
  2. 类型转换:LCEL自动处理不同组件之间的类型转换
  3. 错误处理:支持统一的错误处理机制
  4. 批处理:支持批量处理多个输入

6.3 提示模板设计

提示模板的设计考虑了以下因素:

  • 参数化:使用占位符({})表示可变部分
  • 格式化:支持多种格式化方式
  • 验证:对输入参数进行验证
  • 部分变量:支持部分变量的预填充

6.4 输出解析器设计

输出解析器的设计考虑了以下因素:

  • 格式转换:将模型输出转换为所需格式
  • 错误处理:处理解析失败的情况
  • 类型安全:确保输出类型的一致性
  • 扩展性:支持自定义解析逻辑

7. 扩展建议

7.1 功能扩展

  • 多模态支持:扩展链以支持图像、音频等多模态输入
  • 记忆机制:添加记忆组件,使链能够记住之前的交互
  • 条件路由:根据输入内容动态选择不同的处理路径
  • 并行处理:支持并行执行多个分支,提高效率

7.2 性能优化

  • 缓存机制:为频繁调用的组件添加缓存
  • 批处理优化:优化批处理逻辑,提高吞吐量
  • 异步优化:充分利用异步特性,提高并发性能
  • 资源管理:优化资源使用,减少内存占用

7.3 应用场景扩展

  • 文档问答:结合向量数据库,构建文档问答系统
  • 代码生成:扩展为代码生成和解释工具
  • 数据分析:集成数据分析工具,提供智能分析能力
  • 工作流自动化:构建复杂的工作流自动化系统

7.4 集成扩展

  • 外部API集成:集成更多外部API,扩展功能
  • 数据库集成:与各种数据库系统集成,支持数据持久化
  • 云服务集成:与云服务提供商集成,提供云端能力
  • 监控集成:集成监控系统,实时跟踪应用性能

8. 总结

本案例详细介绍了LangChain表达式语言(LCEL)的基本概念和使用方法,展示了如何通过LCEL将提示模板、模型和输出解析器组合成一个完整的处理链。通过这个案例,我们学习了:

  • LCEL的核心概念:了解了LCEL的设计理念和工作原理
  • 提示模板的使用:掌握了如何创建和使用提示模板
  • 链的构建和调用:学会了如何使用管道操作符构建和调用链
  • 输出解析器的应用:理解了如何使用输出解析器处理模型响应
  • 流式输出的实现:掌握了如何实现流式输出功能

LCEL为构建AI应用提供了一种简洁、直观的方式,使得开发者可以轻松地组合不同的组件,创建复杂的应用。通过本案例的学习,读者应该能够理解LCEL的基本概念,并能够使用LCEL构建自己的AI应用。

未来,LCEL有望成为构建AI应用的标准方式,随着LangChain生态系统的不断发展,LCEL的功能和性能也将不断提升,为开发者提供更加强大和灵活的工具。

### LangChain LCEL 实现多链顺序调用 LangChain 提供了一种灵活的方式来组合多个链条(Chains),并通过其表达语言LCEL)实现复杂的逻辑操作。以下是关于如何通过 LangChain 的 `SimpleSequentialChain` 和其他组件来实现多链顺序调用的具体方法。 #### 使用 SimpleSequentialChain 组合两条 Chain 可以通过 `SimpleSequentialChain` 将多个链条按顺序连接起来,从而形成一个多阶段的工作流程。以下是一个具体的代码示例: ```python from langchain.chains import SimpleSequentialChain, LLMChain from langchain.prompts import PromptTemplate from langchain.llms import OpenAI # 定义第一个 Chain (Synopsis Chain) synopsis_template = """You are a helpful assistant that generates movie synopses. Title: {title} Genre: {genre} Write a brief synopsis for this movie:""" synopsis_prompt = PromptTemplate(input_variables=["title", "genre"], template=synopsis_template) llm = OpenAI(temperature=0.7) synopsis_chain = LLMChain(llm=llm, prompt=synopsis_prompt) # 定义第二个 Chain (Review Chain) review_template = """You are a helpful assistant that writes reviews about movies. Movie Synopsis: {movie_synopsis} Write a short review of this movie.""" review_prompt = PromptTemplate(input_variables=["movie_synopsis"], template=review_template) review_chain = LLMChain(llm=llm, prompt=review_prompt) # 创建 Sequential Chain 来串联这两个 Chains overall_chain = SimpleSequentialChain(chains=[synopsis_chain, review_chain], verbose=True) # 执行整体 Chain result = overall_chain.run({"title": "The Matrix", "genre": "Science Fiction"}) print(result) ``` 上述代码展示了如何使用 `SimpleSequentialChain` 将两个链条按顺序执行[^1]。首先生成电影简介 (`synopsis_chain`),然后基于该简介撰写评论 (`review_chain`)--- #### 利用 Runnable 协议扩展功能 除了 `SimpleSequentialChain`,还可以利用 LangChain 中的 `Runnable` 协议来自定义更复杂的行为。例如,如果需要支持批量处理或流式传输数据,则可以借助 `Runnable` 接口中的 `stream` 或 `batch` 方法[^3]。下面展示一个简单的例子: ```python from langchain.schema.runnable import RunnableLambda # 自定义函数作为 Chain 的一部分 def process_input(text): return f"Processed Input: {text}" custom_chain = RunnableLambda(process_input) # 结合之前的 Chains 构建新的 Sequence complex_chain = synopsis_chain | custom_chain | review_chain # 调用 Complex Chain 并查看结果 output = complex_chain.invoke({"title": "Inception", "genre": "Thriller"}) print(output) ``` 在这个例子中,我们引入了 `RunnableLambda` 来封装自定义函数,并将其与其他链条结合起来,形成了一个新的工作流。 --- #### 声明式的 LangChain 表达语言LCEL) 对于更加高级的需求,可以直接采用 LangChain 表达语言LCEL)。它允许开发者以声明的方式描述整个流水线结构,而无需显式编写 Python 代码。这种模式非常适合大规模部署以及动态调整配置场景下的应用开发[^2]。 虽然官方文档尚未提供完整的 LCEL 示例脚本,但可以根据现有 API 文档推测其实现形式如下所示: ```yaml pipeline: steps: - name: generate_synopsis type: llm_chain config: prompt: | You are an AI writer who creates engaging summaries... input_vars: title: string genre: string - name: write_review type: llm_chain depends_on: [generate_synopsis] config: prompt: | Based on the provided summary, craft a compelling critique... input_vars: movie_synopsis: string ``` 此 YAML 文件定义了一个两步管道:第一步生成摘要;第二步依据前一步的结果撰写影评。实际运行时会由框架解析这些指令并完成相应任务。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值