LangChain 15根据问题自动路由Router Chain确定用户的意图

LangChain系列文章

  1. LangChain 实现给动物取名字
  2. LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字
  3. LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄
  4. LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve
  5. LangChain 5易速鲜花内部问答系统
  6. LangChain 6根据图片生成推广文案HuggingFace中的image-caption模型
  7. LangChain 7 文本模型TextLangChain和聊天模型ChatLangChain
  8. LangChain 8 模型Model I/O:输入提示、调用模型、解析输出
  9. LangChain 9 模型Model I/O 聊天提示词ChatPromptTemplate, 少量样本提示词FewShotPrompt
  10. LangChain 10思维链Chain of Thought一步一步的思考 think step by step
  11. LangChain 11实现思维树Implementing the Tree of Thoughts in LangChain’s Chain
  12. LangChain 12调用模型HuggingFace中的Llama2和Google Flan t5
  13. LangChain 13输出解析Output Parsers 自动修复解析器
  14. LangChain 14 SequencialChain链接不同的组件
    在这里插入图片描述

Router Chain

路由允许您创建非确定性链,其中前一步的输出定义了下一步。路由有助于在与LLMs的交互中提供结构和一致性。

作为一个非常简单的例子,假设我们有两个针对不同类型问题进行优化的模板,并且我们希望根据用户输入选择模板。

Chain/chat_chains_router.py这段代码利用 Langchain 库创建了一个处理链,用于根据用户的输入问题在不同主题(物理、数学或通用问题)之间进行选择并生成回答。以下是对代码的详细解释:

# 导入 Langchain 库的 ChatOpenAI 类,用于与 OpenAI 聊天模型进行交互。
from langchain.chat_models import ChatOpenAI  

# 导入 PromptTemplate 模块,用于创建和管理提示模板。
from langchain.prompts import PromptTemplate  


from langchain.schema.output_parser import StrOutputParser
from langchain.schema.runnable import RunnableBranch
from typing import Literal
from langchain.output_parsers.openai_functions import PydanticAttrOutputFunctionsParser
from langchain.utils.openai_functions import convert_pydantic_to_openai_function
from langchain.utils.openai_functions import convert_pydantic_to_openai_function


# 导入 dotenv 库,用于从 .env 文件加载环境变量,管理敏感数据如 API 密钥。
from dotenv import load_dotenv  

# 调用 load_dotenv 函数来加载 .env 文件中的环境变量。
load_dotenv()  

# 定义物理问题的提示模板
physics_template = """
你是一位非常聪明的物理教授。你擅长以简明易懂的方式回答物理问题。当你不知道某个问题的答案时,你会承认自己不知道。

以下是一个问题:
{input}
"""
physics_prompt = PromptTemplate.from_template(physics_template)

# 定义数学问题的提示模板
math_template = """
你是一个非常优秀的数学家。你擅长回答数学问题。你之所以这么厉害,是因为你能够把难题分解成组成部分,回答这些部分,然后把它们放在一起回答更广泛的问题。

这里有一个问题:
{input}
"""
math_prompt = PromptTemplate.from_template(math_template)

# 定义通用问题的提示模板
general_prompt = PromptTemplate.from_template(
    "您是一个很有帮助的助手。尽可能准确地回答问题。"
)

# 创建基于条件的提示分支
prompt_branch = RunnableBranch(
    (lambda x: x["topic"] == "物理", physics_prompt),
    (lambda x: x["topic"] == "数学", math_prompt),
    general_prompt
)

# 定义主题分类器模型
from langchain.pydantic_v1 import BaseModel
from typing import Literal

class TopicClassifier(BaseModel):
    "分类用户问题的主题"

    topic: Literal["物理", "数学", "通用"]
    "用户问题的主题。其中之一是'数学','物理'或'通用'。"


# 创建主题分类器函数
from langchain.utils.openai_functions import convert_pydantic_to_openai_function
classifier_function = convert_pydantic_to_openai_function(TopicClassifier)

print("classifier_function")
print(classifier_function)


# 创建 ChatOpenAI 实例并绑定主题分类器函数
llm = ChatOpenAI().bind(
    functions=[classifier_function], function_call={"name": "TopicClassifier"}
)

# 创建解析器
from langchain.output_parsers.openai_functions import PydanticAttrOutputFunctionsParser
parser = PydanticAttrOutputFunctionsParser(
    pydantic_schema=TopicClassifier, attr_name="topic"
)

# 创建分类链
classifier_chain = llm | parser

# 创建最终的处理链
from operator import itemgetter
from langchain.schema.output_parser import StrOutputParser
from langchain.schema.runnable import RunnablePassthrough

final_chain = (
    RunnablePassthrough.assign(topic=itemgetter("input") | classifier_chain)
    | prompt_branch
    | ChatOpenAI()
    | StrOutputParser()
)

# 使用处理链生成响应
response = final_chain.invoke({"input": "第一个大于 40 的质数是多少,且该质数的 1 加上能被 3 整除?"})
print(response)

response1 = final_chain.invoke({"input": "请解释什么是相对论。"})
print(response1)

输出结果:

zgpeace at zgpeaces-MBP in ~/Workspace/LLM/langchain-llm-app (develop●) (.venv) 
$ python Chain/chat_chains_router.py
classifier_function
{'name': 'TopicClassifier', 'description': '分类用户问题的主题', 'parameters': {'title': 'TopicClassifier', 'description': '分类用户问题的主题', 'type': 'object', 'properties': {'topic': {'title': 'Topic', 'enum': ['物理', '数学', '通用'], 'type': 'string'}}, 'required': ['topic']}}
首先,我们需要找到第一个大于 40 的质数。我们可以从 41 开始,然后检查每个数是否为质数。质数是只能被 1 和自身整除的正整数。

41 是一个质数,因此它是第一个大于 40 的质数。

接下来,我们需要找到 41 加上能被 3 整除的数。我们可以从 1 开始,然后依次检查每个数是否能被 3 整除。

1 不能被 3 整除,所以我们需要继续检查下一个数。

2 不能被 3 整除,所以我们需要继续检查下一个数。

3 能够被 3 整除,所以 41 加上 344。

因此,第一个大于 40 的质数是 41 且该质数的 1 加上能被 3 整除是 44。
相对论是一种科学理论,它是由爱因斯坦在20世纪初提出的。它主要研究光的传播和物体的运动,特别是在高速和引力场中的情况下。相对论告诉我们,物体的运动和时间的流逝都是相对的,即取决于观察者的参考系。

在相对论中,光的速度是宇宙中最快的速度,无论观察者如何运动,光速度的值都是一样的。这导致了一些非常奇特的现象,例如时间的相对性和长度的相对性。根据相对论,当物体以接近光速运动时,它们的时间会变慢,而长度也会变短。这被称为时间膨胀和长度收缩。

相对论还告诉我们,质量和能量之间存在着等效关系,也就是著名的E=mc²公式。这意味着质量和能量可以互相转化,而且质量越大的物体所蕴含的能量也越大。

总的来说,相对论改变了我们对时间、空间和物质的理解,它揭示了一些非常奇妙和不直观的现象。尽管相对论可能有些复杂,但我们可以用简单的例子和比喻来解释它,以帮助人们更好地理解。

代码
https://github.com/zgpeace/pets-name-langchain/tree/develop

参考

https://python.langchain.com/docs/modules/chains/foundational/router

  • 27
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值