LangChain:使用表达式语言优化提示词链

在 LangChain 里,LCEL 即 LangChain Expression Language(LangChain 表达式语言),本文为你详细介绍它的定义、作用、优势并举例说明,从简单示例到复杂组合示例,让你快速掌握LCEL表达式语言使用技巧。

定义

LangChain Expression Language(LCEL)是 LangChain 推出的一种用于构建和编排链(chains)、代理(agents)等组件的声明式语言。它允许开发者以一种简洁、直观的方式将不同的 LangChain 组件组合在一起,定义复杂的工作流,而无需编写大量的传统 Python 代码来实现组件之间的连接和交互。
在这里插入图片描述

作用

  • 快速构建工作流:能够快速将各种 LangChain 组件(如大语言模型、提示模板、工具等)组合成一个完整的工作流。例如,开发者可以轻松地将一个大语言模型与特定的提示模板以及一些外部工具(如搜索引擎、数据库查询工具)组合在一起,实现一个具备信息检索和知识问答功能的应用。
  • 清晰表达逻辑:以声明式的方式描述组件之间的交互逻辑,使得代码更加清晰易懂。无论是简单的线性流程还是复杂的分支、循环逻辑,都能通过 LCEL 清晰地表达出来,便于开发者理解和维护。
  • 灵活配置和调整:方便开发者对工作流进行灵活的配置和调整。可以根据不同的需求,快速替换工作流中的某个组件,或者修改组件之间的连接方式,而不需要对整个代码结构进行大规模的改动。

优势

  • 简洁性:相比传统的 Python 代码实现方式,LCEL 代码更加简洁。它减少了大量的样板代码,让开发者能够更专注于业务逻辑的定义,提高了开发效率。
  • 可读性:声明式的语法使得代码的可读性大大提高。即使是非专业的开发者也能快速理解工作流的整体结构和各个组件之间的关系,便于团队协作和知识共享。
  • 可组合性:支持将多个较小的工作流组合成更大、更复杂的工作流。这种高度的可组合性使得开发者可以根据不同的场景和需求,灵活地构建各种复杂的应用。
    在这里插入图片描述

简单示例

以下是一个简单的 LCEL 示例,展示了如何使用 LCEL 构建一个基本的问答链:

from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema.runnable import RunnablePassthrough
import os

# 设置 OpenAI API 密钥
os.environ["OPENAI_API_KEY"] = "your_openai_api_key"

# 初始化大语言模型
llm = ChatOpenAI(temperature=0)

# 定义提示模板
prompt = ChatPromptTemplate.from_messages([
    ("human", "{question}")
])

# 使用 LCEL 构建链
chain = (
    RunnablePassthrough.assign() 
    | prompt 
    | llm
)

# 提出问题
question = "苹果公司是哪一年成立的?"
answer = chain.invoke({"question": question})

print(f"问题: {question}")
print(f"答案: {answer.content}")

在这个示例中,首先初始化了 OpenAI 的聊天模型和一个简单的提示模板。然后使用 LCEL 的语法,通过 | 符号将 RunnablePassthrough、提示模板和大语言模型连接起来,构建了一个完整的问答链。最后,向链中输入一个问题,调用 invoke 方法获取模型的回答并打印输出。

提示词链组合示例

我们只需将标题值嵌入到下一个提示模板中,并使用RunnablePassthrough。现在,如果我们想进一步延长这个过程,我们可以简单地重复该过程。

import streamlit as st
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.schema import StrOutputParser
from langchain.schema.runnable import RunnablePassthrough

st.title('Story Creator')
topic = st.text_input('Choose a topic to create a story about')

title_prompt = PromptTemplate.from_template(
    "Write a great title for a story about {topic}"
)

story_prompt = PromptTemplate.from_template(
    """You are a writer. Given the title of story, it is your job to write a story for that title.

Title: {title}"""
)

llm = ChatOpenAI()

title_chain = title_prompt | llm | StrOutputParser()
story_chain = story_prompt | llm | StrOutputParser()
chain = {"title": title_chain} | RunnablePassthrough.assign(story=story_chain)

if topic:
    result = chain.invoke({"topic": topic})
    st.header(result['title'])
    st.write(result['story'])

这里主要解释下核心代码:

  • streamlit是一个用于快速构建数据应用和 Web 界面的 Python 库。如果未接触过,可以简单理解未html表单,下面是设置表单页面标题,然后定义输入文本框。

  • st.title('Story Creator'):在 Streamlit 应用中设置页面标题为 Story Creator

  • st.text_input('Choose a topic to create a story about'):创建一个文本输入框,提示用户输入一个用于创作故事的主题,并将用户输入的值存储在变量 topic 中。

  • title_chain:将 title_promptllmStrOutputParser| 操作符连接起来,形成一个链。这个链的作用是根据用户输入的主题生成故事标题,并将模型的输出解析为字符串。

  • story_chain:将 story_promptllmStrOutputParser| 操作符连接起来,形成一个链。这个链的作用是根据生成的标题创作故事,并将模型的输出解析为字符串。

  • chain:将 title_chainstory_chain 组合起来。{"title": title_chain} 表示将 title_chain 的输出作为键为 title 的值,RunnablePassthrough.assign(story=story_chain) 表示将 story_chain 的输出作为键为 story 的值,最终形成一个包含标题和故事内容的结果。

现在我们知道如何用RunnablePassthrough传递值。下面我们想进一步延长这个过程,我们可以简单地重复该过程。

import streamlit as st
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.schema import StrOutputParser
from langchain.schema.runnable import RunnablePassthrough

st.title('Story Creator')
topic = st.text_input('Choose a topic to create a story about')

title_prompt = PromptTemplate.from_template(
    "Write a great title for a story about {topic}"
)

story_prompt = PromptTemplate.from_template(
    """You are a writer. Given the title of story, it is your job to write a story for that title.

Title: {title}"""
)

review_prompt = PromptTemplate.from_template(
    """You are a critic. Given a story, it is your job to write a review for that story.

Title: {title}
Story: {story}"""
)

llm = ChatOpenAI()

title_chain = title_prompt | llm | StrOutputParser()
story_chain = story_prompt | llm | StrOutputParser()
review_chain = review_prompt | llm | StrOutputParser()
chain = ({"title": title_chain}
         | RunnablePassthrough.assign(story=story_chain)
         | RunnablePassthrough.assign(review=review_chain))

if topic:
    result = chain.invoke({"topic": topic})
    st.header(result['title'])
    st.write(result['story'])
    st.header("Review")
    st.write(result['review'])

该示例在之前基础上,增加了评论功能。

总结

LCEL能够快速将各种 LangChain 组件(如大语言模型、提示模板、工具等)组合成一个完整的工作流。让开发者可以轻松地将大语言模型与特定的提示模板以及一些外部工具组合在一起,灵活地满足各类需求应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/960587.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Samba】Ubuntu20.04 Windows 共享文件夹

【Samba】Ubuntu20.04 Windows 共享文件夹 前言整体思路检查 Ubuntu 端 和 Windows 网络通信是否正常创建共享文件夹安装并配置 Samba 服务器安装 Samba 服务器创建 Samba 用户编辑 Samba 配置文件重启 Samba 服务器 在 Windows 端 访问 Ubuntu 的共享文件夹 前言 本文基于 Ub…

基于Springboot + vue实现的洗衣店订单管理系统

“前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能学习网站” 💖学习知识需费心, 📕整理归纳更费神。 🎉源码免费人人喜…

卡特兰数学习

1,概念 卡特兰数(英语:Catalan number),又称卡塔兰数,明安图数。是组合数学中一种常出现于各种计数问题中的数列。它在不同的计数问题中频繁出现。 2,公式 卡特兰数的递推公式为:f(…

2025_1_27 C语言内存,递归,汉诺塔问题

1.c程序在内存中的布局 代码段(Code Segment) 位置:通常位于内存的最低地址。 用途:存储程序的可执行指令。 特点:只读,防止程序运行时被修改。数据段(Data Segment) 位置&#xf…

解锁数字经济新动能:探寻 Web3 核心价值

随着科技的快速发展,我们正迈入一个全新的数字时代,Web3作为这一时代的核心构成之一,正在为全球数字经济带来革命性的变革。本文将探讨Web3的核心价值,并如何推动数字经济的新动能。 Web3是什么? Web3,通常…

活动回顾和预告|微软开发者社区 Code Without Barriers 上海站首场活动成功举办!

Code Without Barriers 上海活动回顾 Code Without Barriers:AI & DATA 深入探索人工智能与数据如何变革行业 2025年1月16日,微软开发者社区 Code Without Barriers (CWB)携手 She Rewires 她原力在大中华区的首场活动“AI &…

Day27-【13003】短文,线性表两种基本实现方式空间效率、时间效率比较?兼顾优点的静态链表是什么?如何融入空闲单元链表来解决问题?

文章目录 本次内容总览第四节,两种基本实现方式概览两种基本实现方式的比较元素个数n大于多少时,使用顺序表存储的空间效率才会更高?时间效率比较?*、访问操作,也就是读运算,读操作1、插入,2、删…

python -m pip和pip的主要区别

python -m pip和pip的主要区别在于它们与Python环境的关联方式和安装路径。‌ ‌与Python环境的关联方式‌: pip 是直接使用命令行工具来安装Python包,不指定特定的Python解释器。如果系统中存在多个Python版本,可能会导致安装的包被安装到…

C语言从入门到进阶

视频:https://www.bilibili.com/video/BV1Vm4y1r7jY?spm_id_from333.788.player.switch&vd_sourcec988f28ad9af37435316731758625407&p23 //枚举常量 enum Sex{MALE,FEMALE,SECRET };printf("%d\n", MALE);//0 printf("%d\n", FEMALE…

Blazor-Blazor Web App项目结构

让我们还是从创建项目开始,来一起了解下Blazor Web App的项目情况 创建项目 呈现方式 这里我们可以看到需要选择项目的呈现方式,有以上四种呈现方式 ● WebAssembly ● Server ● Auto(Server and WebAssembly) ● None 纯静态界面静态SSR呈现方式 WebAs…

新版IDEA创建数据库表

这是老版本的IDEA创建数据库表,下面可以自己勾选Not null(非空),Auto inc(自增长),Unique(唯一标识)和Primary key(主键) 这是新版的IDEA创建数据库表,Not null和Auto inc可以看得到,但Unique和Primary key…

某公交管理系统简易逻辑漏洞+SQL注入挖掘

视频教程在我主页简介或专栏里 目录: 某公交管理系统挖掘 SQL注入漏洞 越权漏洞 某公交管理系统挖掘 SQL注入漏洞 前台通过给的账号密码,进去 按顺序依次点击1、2、3走一遍功能点,然后开启抓包点击4 当点击上图的4步骤按钮时,会抓到图下数据包&a…

通过案例研究二项分布和泊松分布之间关系(2)

通过案例研究二项分布和泊松分布之间关系 2. 汽车出事故的概率p与保险公司盈利W之间的关系3.通过遗传算法多次迭代计算控制p为多少时公司盈利最大(1) 计算过程(2) 结果及分析(计算过程详见附录二程序) 4.改变思路求解固定p为0.01时,保险费用如何设置公司可获得最大利润(1)计算过…

mysql 学习5 mysql图形化界面DataGrip下载 安装 使用

一、下载和安装 下载: 其他版本 - DataGrip PS:安装目录最好不要有中文。 C:\Program Files\JetBrains\DataGrip 2023.3.4 二、 夸克网盘分享 当前电脑是下载到 :D:\Ctool\mysql\datagrip2023_3_4\datagrip2024\jetbra-datagrip\scripts …

2025.1.21——八、[HarekazeCTF2019]Avatar Uploader 2(未完成) 代码审计|文件上传

题目来源:buuctf [HarekazeCTF2019]Avatar Uploader 2 一、打开靶机,整理信息 跟Avatar Uploader 1 题目长得一样,先上传相同文件看看情况,另外这道题还有源码,可以看看 二、解题思路 step 1:上传同类…

使用EVE-NG-锐捷实现OSPF

一、OSPF基础知识 Open shortest Path First(OSPF)开放式最短路径优先协议 1.OSPF的关系状态 (1)邻居关系(TWO-WAY) 只发送hello包不发送LSA包(链路状态通告包) (2)邻接关系(FULL) OSPF设备与设备之间相互建立OSPF关系,初始为邻居关系(TWO-WAY)状态&#xff0…

未来五年高速线缆市场有望翻3倍!AEC凭借传输距离优势占比将更高

未来五年高速线缆市场有望翻3倍!AEC凭借传输距离优势占比将更高 高速铜缆凭借高带宽、高速等优势,有望成为数据中心连接的最优解。铜缆高速连接主要用于数据中心内部服务器与交换机之间、交换机... - 雪球 高速铜缆凭借高带宽、高速等优势,有…

zyNo.19

哈希(md5)绕过问题 本质上是弱类型问题的延申 题型 登录的哈希验证 $a ! $b Md5($a) md5($b) 解决办法Md5绕过 var_dump ("0e123456" "0e4456789"); //true 0e545993274517709034328855841020//true 参考资料0e开头的哈希…

怎么样把pdf转成图片模式(不能复制文字)

贵但好用的wps, 转换——转为图片型pdf —————————————————————————————————————————— 转换前: 转换后: 肉眼可见,模糊了,且不能复制。 其他免费办法,参考&…

飞致云开源社区月度动态报告(2025年1月)

自2023年6月起,中国领先的开源软件公司飞致云以月度为单位发布《飞致云开源社区月度动态报告》,旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况,以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源运营数据概览&…