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

news/2024/4/17 17:12:45

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 Literalclass 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 RunnablePassthroughfinal_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


https://www.xjx100.cn/news/3119032.html

相关文章

推荐一款好用的BMP转PNG工具BMP2PNG

推荐一款好用的BMP转PNG工具BMP2PNG 自己写的一个BMP转PNG工具BMP2PNG 写这个工具是因为要使用传奇的部分素材在COCOS2DX使用, 但是COCOS2DX不支持BMP 如果直接将BMP转换到PNG的话,网上找到的工具都不支持透明色转换。难道要用PS一个一个抠图吗&#xf…

普中STM32 单片机资料

普中科技–各型号开发板资料下载链接: ①普中-精灵1开发板: 百度网盘链接:https://pan.baidu.com/s/1Pa8Ep1xmg6uoq17O6Nwyyw?pwd=1234 提取码:1234 ②普中-ESP32开发板: 百度网盘链接:https://pan.baidu.com/s/16VthcbW27oEWp162H3bi6Q?pwd=1234 提取码:1234 一…

LVS+Keepalived实验

实验前准备 主DR服务器:(ens33)192.168.188.11 ipvsadm、keepalived (ens33:0)192.168.188.188 备DR服务器:(ens33)192.168.188.12 ipvsadm、keepalived (ens33:0)192.168.188.188 Wbe服务器1:(ens33)192.168.188.13 (lo:0)192.168.188.188 W…

MySQL中的JOIN与IN:性能对比与最佳实践

文章目录 JOIN与IN的基本介绍JOININ JOIN与IN性能对比使用JOIN的查询使用IN的查询 何时使用JOIN何时使用IN性能优化的其他考虑因素总结 🎉MySQL中的JOIN与IN:性能对比与最佳实践 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈…

HTML中使用JavaScript实现一个简单的鼠标悬停特效。

代码中&#xff0c;我们首先在CSS中定义了一个红色的方块&#xff0c;然后使用:hover伪类定义了鼠标悬停时的样式。接着&#xff0c;在JavaScript中定义了一个函数showMessage()&#xff0c;用于在控制台输出一条消息。最后&#xff0c;在HTML中使用<div>标签定义了一个i…

文生视频的发展史及其原理解析:从Gen2、Emu Video到PixelDance、SVD、Pika 1.0

前言 考虑到文生视频开始爆发&#xff0c;比如11月份就是文生视频最火爆的一个月 11月3日&#xff0c;Runway的Gen-2发布里程碑式更新&#xff0c;支持4K超逼真的清晰度作品(runway是Stable Diffusion最早版本的开发商&#xff0c;Stability AI则开发的SD后续版本)11月16日&a…

springMVC实验(二)—调式工具APIFOX的使用

【知识要点】 后端开发调试工具 前后端分离已经成为互联网类软件开发主流模式&#xff0c;没有前端操作的支持&#xff0c;如何调试后端程序的就是开发人员必须解决的问题。如&#xff1a;get类请求可以直接使用浏览器就能模拟测试&#xff0c;但是post、put等类型的请求&…

FPGA程序执行相关知识点

1.目前&#xff0c;大多数FPGA芯片是基于 SRAM 的结构的&#xff0c; 而 SRAM 单元中的数据掉电就会丢失&#xff0c;因此系统上电后&#xff0c;必须要由配置电路将正确的配置数据加载到 SRAM 中&#xff0c;此后 FPGA 才能够正常的运行。 常见的配置芯片有EPCS 芯片 &#x…