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

embedded/2025/1/31 16:42:39/

在 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.ppmy.cn/embedded/158402.html

相关文章

从替代到覆盖:暴雨信创服务器打开市场新局面

进入2025年,全球局势更加变幻莫测,高科技领域越来越受到全球局势影响。美国前任总统拜登在卸任前,特别颁布限制GPU产品出口法案。新任总统特朗普上任第一天,废除了多项之前法案,但显示技术交流的内容一条没变。 在如此艰难的局面下,我国信创市场的发展显得尤为重要,国家也从政策…

分布式理解

分布式 如何理解分布式 狭义的分布是指,指多台PC在地理位置上分布在不同的地方。 分布式系统 分布式系**统:**多个能独立运行的计算机(称为结点)组成。各个结点利用计算机网络进行信息传递,从而实现共同的“目标或者任…

基于Go语言的三甲医院人机与智能体协同环境系统(上.文章部分)

一、引言 1.1 研究背景与意义 1.1.1 三甲医院对高效协同系统的需求 三甲医院作为医疗体系的核心力量,承担着疑难病症诊治、医学科研教学等重要任务,其业务具有高度的复杂性。在日常运营中,三甲医院涉及多个科室,每个科室又包含众多专业领域,各科室之间需要紧密协作,共…

Vue 3 中的计算属性:只读与可读写的使用与案例

在 Vue 3 中,计算属性(Computed Properties)是一种强大的工具,它允许我们根据响应式数据动态计算并返回一个新的值。计算属性具有缓存机制,只有当依赖的响应式数据发生变化时,才会重新计算。本文将详细介绍…

Redis存储③Redis基本命令+内部编号和架构

目录 1. Redis 命令行客户端 1.1 与 Redis 服务器交互 1.2 set 和 get 命令 2. 基本全局命令 2.1 keys 2.2 exists 2.3 del 2.4 expire 2.5 ttl 2.6 type 3. 数据结构和内部编码 4. 单线程架构 本篇完。 1. Redis 命令行客户端 1.1 与 Redis 服务器交互 根据上篇…

八种排序算法【C语言实现】

系列文章目录 🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼 🎉🎉我的C语言初阶合集:C语言初阶合集,希望能…

Leetcode:219

1&#xff0c;题目 2&#xff0c;思路 第一种就是简单的暴力比对当时过年没细想 第二种&#xff1a; 用Map的特性key唯一&#xff0c;把数组的值作为Map的key值我们每加载一个元素都会去判断这个元素在Map里面存在与否如果存在进行第二个判断条件abs(i-j)<k,条件 符合直接…

C26.【C++ Cont】动态内存管理和面向对象的方式实现链表

&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;除夕篇&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8; 目录 1.知识回顾…