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

news2024/11/18 21:32:21

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1270082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ApiSix的docker 容器化部署及使用

⼀.etcd安装 Docekr安装Etcd 环境准备 此处安装,是利⽤下载的 etcd 源⽂件,利⽤ docker build 构建完整镜像,具体操作如下: 1.环境准备 1.1. 新建⽂件夹 在磁盘某个路径下新建⼀个⽂件夹,⽤处操作 Dockerfi…

13:kotlin类和对象 -- 属性(Properties)

定义属性 类属性可使用var和val定义 class Address {var name: String "Holmes, Sherlock"var street: String "Baker"var city: String "London"var state: String? nullvar zip: String "123456" }属性使用 fun copyAddres…

00Hadoop数据仓库平台

在这里是学习大数据的第一站 什么是数据仓库常见大数据平台组件及介绍 什么是数据仓库 在计算领域,数据仓库(DW 或 DWH)也称为企业数据仓库(EDW),是一种用于报告和数据分析的系统,被认为是商业智…

深度学习实现语义分割算法系统 - 机器视觉 计算机竞赛

文章目录 1 前言2 概念介绍2.1 什么是图像语义分割 3 条件随机场的深度学习模型3\. 1 多尺度特征融合 4 语义分割开发过程4.1 建立4.2 下载CamVid数据集4.3 加载CamVid图像4.4 加载CamVid像素标签图像 5 PyTorch 实现语义分割5.1 数据集准备5.2 训练基准模型5.3 损失函数5.4 归…

vuepress-----2、初体验

2、初体验 目标 创建GitHub账号创建Github项目初体验vuepress默认主体的首页 初体验 (opens new window) --- home: true heroImage: /hero.png heroText: Hero 标题 tagline: Hero 副标题 actionText: 快速上手 → actionLink: /zh/guide/ features: - title: 简洁至上deta…

mac安装homebrew/brew遇到443

文章目录 问题描述解决方法方法一方法二 参考文献 问题描述 brew 全称Homebrew 是Mac OSX上的软件包管理工具 想在mac终端安装,运行网上提供的指令 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)&quo…

【开源视频联动物联网平台】视频AI智能分析部署方式

利用视频监控的AI智能分析技术,可以让视频监控发挥更大的作用,成为管理者的重要决策工具。近年来,基于视频监控的AI分析算法取得了巨大的发展,并在各种智慧化项目中得到了广泛应用,为客户提供更智能化的解决方案。 然…

淘宝商品详情数据接口(店铺搬家、数据分析、代购商城、ERP选品、无货源铺货、品牌监控)

使用淘宝API接口需要以下步骤: 注册开发者账号:在淘宝开放平台(https://o0b.cn/anzexi)上注册一个开发者账号,并创建一个应用。 获取API密钥:在应用页面上获取API密钥,这是后续调用API接口的凭…

前端魔法:掌握动态 class,让网页元素随心所欲

前言 当你动态的添加类名,在某个变量匹配需求时自动切换到某个类名,实现其对应的效果。这个过程就是我们常说的动态 class,今天就和大家一起聊聊前端中的动态 class。 一、对象语法 1.1 绑定单个 class 我们可以传给 v-bind:class 一个对象&…

034.Python面向对象_综合案例

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…

linux用户管理_用户和组

2 用户管理 2.1 用户和组的基本概念和作用 2.1.1 账户实质 账户实质就是一个用户在系统上的标识,系统依据账户ID来区分每个用户的文件、进程、任务,给每个用户提供特定的工作关键(如用户的工作目录、SHELL版本以及环境配置等)&…

SDK emulator directory is missing

要进行uniapp真机测试,不得不安装配置一下安卓开发环境 ,搞一个模拟器。。。然后又是各种坑。。对比来对比去还是IOS的环境使用着舒服,XCODE下载好,一切重点就是在编码了。。 安卓这个脑残货呀,哎,各种安装…

Springboot——HttpClient入门(Get和Post)

1. HttpClient 1.1 介绍 HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。 HttpClient作用: 发送HTTP请求接收响应数据…

网站优化进阶指南:如何用Python爬虫进行网站结构优化

前段时间一个做网络优化的朋友找我,问我能不能通过爬虫的手段对他们自己的网络进行优化。这个看着着实比较新颖,对于从事爬虫行业的程序员来说,很有挑战性,值得尝试尝试。 说白了使用爬虫进行网站优化需要对网站的结构、内容、链…

详解前后端交互时PO,DTO,VO模型类的应用场景

前后端交互时的数据传输模型 前后端交互流程 前后端交互的流程: 前端与后端开发人员之间主要依据接口进行开发 前端通过Http协议请求后端服务提供的接口后端服务的控制层Controller接收前端的请求Contorller层调用Service层进行业务处理Service层调用Dao持久层对数据持久化 …

如何让电脑每天定时自动关机?

如何让电脑每天定时自动关机?电脑已经成为社会生产活动中不可或缺的一种工具,它对于我们每个人都非常的重要,不管是工作、生活还是学习中,我们都需要利用电脑。不过很多小伙伴因为繁忙或者因为其它的事情,导致电脑经常…

linux用户组_创建_删除_修改

2.2.2 用户组 每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。 组的类型: 基本组&#x…

编程中常见的技术难题——如何有效地解决编程中常见的技术难题?

文章目录 前言编程的重要性编程中常见的技术难题新手编程常见问题一、变量的命名规范二、语法错误三、逻辑错误四、代码复用五、代码优化 解决技术难题的方法后记 前言 在编写程序的过程中,总会遇到各种各样的技术难题,这些问题常常需要程序员们耗费大量…

第十五届蓝桥杯(Web 应用开发)模拟赛 2 期-大学组(详细分析解答)

目录 1.相不相等 1.1 题目要求 1.2 题目分析 1.3 源代码 2.三行情书 2.1 题目要求 2.2 题目分析 2.3 源代码 3.电影院在线订票 3.1 题目要求 3.2 题目分析 3.3 源代码 4.老虎坤(不然违规发不出来) 4.1 题目要求 4.2 题目分析 4.3 源代码 …

vuepress-----9、PWA

# 9、PWA 使用babel 的插件形式 [vuepress/pwa,{serviceWorker: true,updatePopup: {message: "New content is available.",buttonText: "Refresh"}}]提供 Manifest 和 icons (opens new window) 拷贝到public目录下 发布后出现 service workers [外链图片…