首页 > 编程问答 >使用 LCEL 链接 langchain 响应

使用 LCEL 链接 langchain 响应

时间:2024-07-22 11:51:21浏览次数:20  
标签:python langchain py-langchain

我已经开始与 Langchain 合作来感受它,很多视频似乎已经过时了。经过一些研究,我了解到 LCEL 正在被使用,因为其他方法似乎已被弃用。在我的代码中,我尝试使用一个链的输出作为另一个链的输入,但它似乎不起作用。

def main():
    prompt1 = ChatPromptTemplate.from_messages([
        ('system', "Answer in less than 20 words."),
        ('human', '{task}')
    ])
    chain1 = prompt1 | model | {'rep1': StrOutputParser()}

    prompt2 = ChatPromptTemplate.from_messages([
        # ('system', "You're sleepy."),
        ('human', 'Translate {rep1} to {lang}'),
    ])
    datamap = {
        'lang': RunnablePassthrough(),
        'rep1': RunnablePassthrough(),
    }
    chain2 = datamap | prompt2 | model | {'rep2': StrOutputParser()}

    allchain = chain1 | chain2
    response = allchain.invoke({
        'task': 'Good morning',
        'lang': 'french'
    })

    print(response)

我得到的结果是

response: {'rep2': "{'rep1': 'Good morning! How can I help you today?'}"}

我立即写下了这个,所以我明白如果它没有以任何方式优化,但我也很想知道这将如何在生产中完成。


正在正确的轨道上使用 LCEL 在 LangChain 中链接链!问题在于正在使用 RunnablePassthrough rep1 传递给第二条链,这意味着它不会被评估,而只是按原样传递。

以下是解决该问题的修改后的代码以及说明:

from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.chains import LLMChain, SequentialChain
from langchain.schema import StrOutputParser

def main():
    # 第一链:获取简短回复
    prompt1 = ChatPromptTemplate.from_messages([
        ("system", "Answer in less than 20 words."),
        ("human", "{task}")
    ])
    chain1 = LLMChain(llm=ChatOpenAI(temperature=0), prompt=prompt1, output_parser=StrOutputParser())

    # 第二链:翻译回复
    prompt2 = ChatPromptTemplate.from_messages([
        ("human", "Translate {rep1} to {lang}")
    ])
    chain2 = LLMChain(llm=ChatOpenAI(temperature=0), prompt=prompt2, output_parser=StrOutputParser())

    # 使用 SequentialChain 将两个链条连接在一起
    allchain = SequentialChain(
        chains=[chain1, chain2],
        input_variables=["task", "lang"],
        output_variables=["rep2"]
    )

    # 运行链条
    response = allchain({"task": "Good morning", "lang": "french"})

    print(response)

if __name__ == "__main__":
    main()

说明:

  1. 使用 SequentialChain 我们不再需要手动创建数据映射。 SequentialChain 可以很好地处理链之间的输入/输出传递。
  2. 定义 input_variables output_variables 我们明确告诉 SequentialChain 哪些变量是输入,哪些是最终输出。
  3. 直接访问 rep2 由于我们已在 SequentialChain 中定义了 output_variables ,因此我们可以直接从响应中访问 rep2

此代码将按预期工作,并打印出“Good morning”的法语翻译。

关于生产环境:

提供的代码是一个很好的起点,但在将其用于生产环境之前,需要考虑一些事项:

  • 错误处理: 需要添加错误处理机制以捕获链条中可能发生的任何错误。
  • 日志记录: 为了调试和监控,记录链条的输入、输出和任何错误非常重要。
  • 缓存: 如果多次调用具有相同输入的链条,则缓存响应以提高性能和降低成本可能会有所帮助。
  • 模型选择: 仔细选择的模型并考虑性能、成本和用例要求。

LangChain 提供了许多工具和集成,可以帮助解决这些生产环境问题。有关更多信息,请参阅 LangChain 文档: https://python.langchain.com/

标签:python,langchain,py-langchain
From: 78776870

相关文章

  • 如何在 vercel 部署中路由 python 和 typescript 无服务器函数
    我从一个带有Next.js和Typescript前端以及python后端的全栈应用程序开始。由于我们想在vercel上部署,因此我们将所有后端功能迁移到/api文件夹中的typescript函数中,可通过以下方式访问:fetch('api/**foldername**)问题是我有一个简单的pytorch模型,因此......
  • python中datetime模块
    datetime模块可以更方便的显示日期,并对日期进行计算。datetime模块中常用的类及其功能描述如下:datetime.datetime------>表示日期时间的类(常用)datetime.timedelta------>表示时间间隔的类(常用)datetime.date------>表示日期的类datetime.time------>表示时间的类datetime.......
  • Python - requests
    前言:介绍:安装及验证:使用:连续接口请求:传参方式: 前言:当你上班无聊的时候,你做什么,说实话有人让我写个requests的教程,教程我觉得网上已经有很多教程了,也很全面,我还是不要献丑了介绍:哎,我认为就是一个接口请求的仓库,不过requests属于第三方库,......
  • Python学习计划——2.4列表推导式(List Comprehensions)
    列表推导式是Python的一种简洁且强大的语法,用于生成新的列表。它可以用更少的代码、更清晰的方式来创建列表,特别是在处理简单的循环和条件操作时。1.基本语法列表推导式的基本语法如下:[expressionforiteminiterable]expression:表达式,计算结果用于生成列表的元素。ite......
  • Python学习计划——2.3常用内置函数(len, max, min, sum, etc.)
    Python提供了许多内置函数,用于简化对数据结构的操作。以下是一些常用的内置函数及其详细说明。1.len()len()函数用于返回对象(如列表、元组、字符串、字典等)的长度(元素个数)。示例:#列表fruits=["apple","banana","cherry"]print(len(fruits))#输出:3#元组c......
  • 哪个 Python 框架可以在 Google Collab 中显示和更改图像?
    我希望能够在使用GoogleCollab时为RL绘制高fps的位图。我现在可以使用OpenCV绘制图像cv2_imshowgoogle替换cv2.imshow但是,它无法替换现有图像,它下面绘制了新的我能够在替换imshow函数中使用一些JavaScript来修复它。但刷新率约为......
  • VSCode 自动建议 python 导入而不依赖 Intellisense
    我正在使用Transformer中的AutoModel之类的对象,并且经常遇到自动导入建议无法找到的对象。我总是希望VSCode建议“从Transformer中执行”,而不是费心寻找它找不到的原因每当看到未定义的“AutoModel”时,都会导入AutoModel”,因此无需扫描任何python导入目录。这......
  • 如何使用Python计算位移自相关函数?
    我正在使用python来分析粒子的异常扩散。我已经得到了粒子轨迹的位移,我想计算并绘制位移自相关与滞后时间t的关系。我认为可能存在使用t和位移(如deltar)的自相关函数的一般函数,但我不能没找到。我可以得到函数或代码吗?可以使用numpy和matplotlib库在Python......
  • 一天一点点,第四天Python基础
    第一天:一天一点点。Python基础-CSDN博客第二天:一天一点点,接上章Python基础-CSDN博客第三天:一天一点点,第三天Python基础(循环语句)-CSDN博客推导式推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。推导式是一种强大且简洁的语法,适用于生......
  • Python - for循环不使用正则表达式附加数组
    以下代码从URL获取版本号,然后对于每个版本号,转到该版本号的页面并使用文件名的特定模式填充数组。生成的数组应包含每个版本号的文件名列表,但它似乎只包含早期版本(2.6)。使用print语句,我可以看到代码的工作原理是它获取sha256sums.asc文件-所有这些文件,所有版本。我猜......