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 RunnablePassthroughst.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 RunnablePassthroughst.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 组件(如大语言模型、提示模板、工具等)组合成一个完整的工作流。让开发者可以轻松地将大语言模型与特定的提示模板以及一些外部工具组合在一起,灵活地满足各类需求应用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity学习20:time相关基础 Time.time 和 Time.deltaTime

目录 1 unity里的几种基本时间 1.1 time 相关测试脚本 1.2 游戏开始到现在所用的时间 Time.time 1.3 时间缩放值 Time.timeScale 1.4 固定时间间隔 Time.fixedDeltaTime 1.5 两次响应时间之间的间隔:Time.deltaTime 1.6 对应测试代码 1.7 需要关注的2个基本…

世上本没有路,只有“场”et“Bravo”

楔子:电气本科“工程电磁场”电气研究生课程“高等电磁场分析”和“电磁兼容”自学”天线“、“通信原理”、“射频电路”、“微波理论”等课程 文章目录 前言零、学习历程一、Maxwells equations1.James Clerk Maxwell2.自由空间中传播的电磁波3.边界条件和有限时域…

electron typescript运行并设置eslint检测

目录 一、初始化package.json 二、安装依赖 三、项目结构 四、配置启动项 五、补充:ts转js别名问题 一、初始化package.json 我的:这里的"main"没太大影响,看后面的步骤。 {"name": "xloda-cloud-ui-pc"…

学习数据结构(3)顺序表

1.动态顺序表的实现 (1)初始化 (2)扩容 (3)头部插入 (4)尾部插入 (5)头部删除 (这里注意要保证有效数据个数不为0) (6&a…

PydanticAI应用实战

PydanticAI 是一个 Python Agent 框架,旨在简化使用生成式 AI 构建生产级应用程序的过程。 它由 Pydantic 团队构建,该团队也开发了 Pydantic —— 一个在许多 Python LLM 生态系统中广泛使用的验证库。PydanticAI 的目标是为生成式 AI 应用开发带来类似 FastAPI 的体验,它基…

deepseek R1的确不错,特别是深度思考模式

deepseek R1的确不错,特别是深度思考模式,每次都能自我反省改进。比如我让 它写文案: 【赛博朋克版程序员新春密码——2025我们来破局】 亲爱的代码骑士们: 当CtrlS的肌肉记忆遇上抢票插件,当Spring Boot的…

macbook安装go语言

通过brew来安装go语言 使用brew命令时,一般都会通过brew search看看有哪些版本 brew search go执行后,返回了一堆内容,最下方展示 If you meant "go" specifically: It was migrated from homebrew/cask to homebrew/core. Cas…

若依基本使用及改造记录

若依框架想必大家都了解得不少,不可否认这是一款及其简便易用的框架。 在某种情况下(比如私活)使用起来可谓是快得一匹。 在这里小兵结合自身实际使用情况,记录一下我对若依框架的使用和改造情况。 一、源码下载 前往码云进行…

Kafka 深入服务端 — 时间轮

Kafka中存在大量的延迟操作,比如延时生产、延时拉取和延时删除等。Kafka基于时间轮概念自定义实现了一个用于延时功能的定时器,来完成这些延迟操作。 1 时间轮 Kafka没有使用基于JDK自带的Timer或DelayQueue来实现延迟功能,因为它们的插入和…

数据分析系列--②RapidMiner导入数据和存储过程

一、下载数据 点击下载AssociationAnalysisData.xlsx数据集 二、导入数据 1. 在本地计算机中创建3个文件夹 2. 从本地选择.csv或.xlsx 三、界面说明 四、存储过程 将刚刚新建的过程存储到本地 Congratulations, you are done.

HarmonyOS简介:HarmonyOS核心技术理念

核心理念 一次开发、多端部署可分可合、自由流转统一生态、原生智能 一次开发、多端部署 可分可合 自由流转 自由流转可分为跨端迁移和多端协同两种情况 统一生态 支持业界主流跨平台开发框架,通过多层次的开放能力提供统一接入标准,实现三方框架快速…

ES6语法

一、Let、const、var变量定义 1.let 声明的变量有严格局部作用域 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…

书生大模型实战营3

文章目录 L0——入门岛git基础Git 是什么&#xff1f;Git 中的一些基本概念工作区、暂存区和 Git 仓库区文件状态分支主要功能 Git 平台介绍GitHubGitLabGitee Git 下载配置验证下载 Git配置 Git验证 Git配置 Git常用操作Git简易入门四部曲Git其他指令 闯关任务任务1: 破冰活动…

前端——js高级25.1.27

复习&#xff1a;对象 问题一&#xff1a; 多个数据的封装提 一个对象对应现实中的一个事物 问题二&#xff1a; 统一管理多个数据 问题三&#xff1a; 属性&#xff1a;组成&#xff1a;属性名属性值 &#xff08;属性名为字符串&#xff0c;属性值任意&#xff09; 方…

[创业之路-270]:《向流程设计要效率》-2-企业流程架构模式 POS架构(规划、业务运营、支撑)、OES架构(业务运营、使能、支撑)

目录 一、POS架构 二、OES架构 三、POS架构与OES架构的差异 四、各自的典型示例 POS架构典型示例 OES架构典型示例 示例分析 五、各自的典型企业 POS架构典型企业 OES架构典型企业 分析 六、各自典型的流程 POS架构的典型流程 OES架构的典型流程 企业流程架构模式…

计算机的错误计算(二百二十二)

摘要 利用大模型化简计算 实验表明&#xff0c;虽然结果正确&#xff0c;但是&#xff0c;大模型既绕了弯路&#xff0c;又有数值计算错误。 与前面相同&#xff0c;再利用同一个算式看看另外一个大模型的化简与计算能力。 例1. 化简计算摘要中算式。 下面是与一个大模型的…

【现代深度学习技术】深度学习计算 | 参数管理

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…

C语言,无法正常释放char*的空间

问题描述 #include <stdio.h> #include <stdio.h>const int STRSIZR 10;int main() {char *str (char *)malloc(STRSIZR*sizeof(char));str "string";printf("%s\n", str);free(str); } 乍一看&#xff0c;这块代码没有什么问题。直接书写…

【开源免费】基于Vue和SpringBoot的在线文档管理系统(附论文)

本文项目编号 T 038 &#xff0c;文末自助获取源码 \color{red}{T038&#xff0c;文末自助获取源码} T038&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

忘记宝塔的访问地址怎么找

在linux中安装宝塔面板后会生成网址、账号和密码 如果网址忘记了那将进不去宝塔面板该怎么办呢&#xff1f; bt命令 我们输入 bt 命令的时候&#xff0c;是在根目录里面进行操作的。 / bt 我们根据自己的需要&#xff0c;选择对应的数字就可以了。 bt 14 输入 14 查看面板默…