(直播加餐)LangChain表达式语言(LCEL)初探 | 豆包MarsCode AI刷题

114 阅读3分钟

在 LangChain 的强大功能中,LangChain Expression Language (LCEL) 是一个值得特别关注的工具。它通过一种直观的表达方式,帮助我们简化链条逻辑的构建与管理。接下来,从概念、基本语法、常用功能到实际应用,解读 LCEL。


什么是 LCEL?

LCEL(LangChain Expression Language)是一种专为 LangChain 设计的表达式语言,主要用于描述链条逻辑。它通过简单的语法和内置函数,让开发者能够更方便地构建和管理复杂的任务流。

特点

  • 简洁性:以简单的语法,清晰表达复杂逻辑。
  • 灵活性:支持自定义变量、条件判断、嵌套表达式等。
  • 可扩展性:可以与 LangChain 的各组件无缝配合。

LCEL 基本语法

LCEL 的语法灵感来源于传统的编程语言,常用的构造包括变量、函数、运算符等。

变量与占位符

LCEL 使用 $变量名 表示变量,可以通过上下文传递值。例如:

"Hello, $name! Welcome to LangChain."

基本运算

支持常见的数学运算和字符串操作:

  • 数学运算:+, -, *, /, %
  • 比较运算:==, !=, <, <=, >, >=
  • 逻辑运算:&&, ||, !

内置函数

LCEL 提供了一些实用函数,用于数据处理:

  • length(value):返回字符串或列表的长度。
  • lower(value) / upper(value):将字符串转为小写/大写。
  • concat(str1, str2, ...):拼接多个字符串。
  • if(condition, true_value, false_value):三元条件表达式。

常用功能解析

动态变量替换

LCEL 可以根据上下文动态替换变量,这在对话生成中非常有用。

from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate

# 定义 LCEL 表达式
template = "你好,$name!今天是$day。希望你过得愉快!"
prompt = PromptTemplate.from_template(template)

# 构建链条
llm_chain = LLMChain(prompt=prompt, llm=llm)
response = llm_chain.run({"name": "小明", "day": "星期五"})

print(response)  # 输出:"你好,小明!今天是星期五。希望你过得愉快!"

条件逻辑

LCEL 支持在表达式中嵌入条件逻辑,从而实现更复杂的场景处理。

"你当前的分数是 $score,评价:${if($score >= 60, '合格', '不合格')}。"

在代码中:

template = "你当前的分数是 $score,评价:${if($score >= 60, '合格', '不合格')}。"
prompt = PromptTemplate.from_template(template)

response = llm_chain.run({"score": 75})
print(response)  # 输出:"你当前的分数是 75,评价:合格。"

嵌套表达式

LCEL 支持表达式嵌套,适合处理复杂的数据操作。例如:

"你的名字长度是 ${length($name)} 个字符,大写形式为 ${upper($name)}。"

构建复杂链条

LCEL 在构建多步任务流时表现尤为出色。以下是一个简单的“天气查询助手”示例。

示例:天气查询助手

假设我们要实现一个询问天气的对话链条,可以用 LCEL 表达以下逻辑:

  1. 用户输入城市名称。
  2. 输出该城市的天气情况。
from langchain.chains import SimpleSequentialChain
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI

# 定义 LCEL 表达式
input_template = "用户输入的城市是 $city。请告诉我该城市的天气。"
output_template = "城市 $city 的天气是晴朗,气温 $temperature°C。"

# 构建 PromptTemplates
input_prompt = PromptTemplate.from_template(input_template)
output_prompt = PromptTemplate.from_template(output_template)

# 构建链条
llm = OpenAI(temperature=0.5)
input_chain = LLMChain(prompt=input_prompt, llm=llm)
output_chain = LLMChain(prompt=output_prompt, llm=llm)

# 使用 SimpleSequentialChain 连接链条
overall_chain = SimpleSequentialChain(chains=[input_chain, output_chain])

# 运行链条
response = overall_chain.run({"city": "北京", "temperature": 22})
print(response)

完整应用示例:个性化对话助手

假如我们要实现一个复杂的个性化助手,涉及用户问候、兴趣推荐等逻辑,可以借助 LCEL 快速实现。

代码实现

from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI

# 定义 LCEL 表达式
greeting_template = "你好,$name!很高兴见到你。"
recommend_template = "${if($interest == '运动', '我建议你试试篮球!', '我推荐你看看最新的电影。')}"

# 构建 PromptTemplates
greeting_prompt = PromptTemplate.from_template(greeting_template)
recommend_prompt = PromptTemplate.from_template(recommend_template)

# 构建链条
llm = OpenAI(temperature=0.5)
greeting_chain = LLMChain(prompt=greeting_prompt, llm=llm)
recommend_chain = LLMChain(prompt=recommend_prompt, llm=llm)

# 组合链条并运行
user_data = {"name": "小李", "interest": "运动"}
greeting_response = greeting_chain.run(user_data)
recommend_response = recommend_chain.run(user_data)

print(greeting_response)  # 输出:"你好,小李!很高兴见到你。"
print(recommend_response)  # 输出:"我建议你试试篮球!"

总结

我们了解了 LCEL 的概念和语法,并用实际代码展示了如何将其应用到对话逻辑构建中。LCEL 的简洁与灵活让它在复杂链条管理中大放异彩,尤其适合需要动态调整逻辑的任务场景。

快速回顾

  1. LCEL 是什么:简洁、灵活的链条表达式语言。
  2. 核心语法:变量、运算符、条件逻辑、内置函数等。
  3. 实战:从变量替换到构建完整链条,LCEL 极大简化了开发流程。

延伸思考

  • 如何结合 LCEL 实现动态多轮对话?
  • 在实时数据处理场景中,LCEL 能否替代传统的模板工具?

通过深入挖掘 LCEL,我们可以打造更智能、更高效的对话应用!