当前位置: 首页 > news >正文

Langchain 的 Routerchain

Langchain 的 Routerchain

  • 1. destination_chains
  • 2. LLMRouterChain
  • 3. EmbeddingRouterChain

本笔记本演示了如何使用 RouterChain 范例创建一个链,该链动态选择用于给定输入的下一个链。

路由器链由两个组件组成:

  • RouterChain 本身(负责选择下一个要调用的链)
  • destination_chains:路由器链可以路由到的链

在本笔记本中,我们将重点关注不同类型的路由链。我们将展示 MultiPromptChain 中使用的这些路由链来创建问答链,该问答链选择与给定问题最相关的提示,然后使用该提示回答问题。

1. destination_chains

示例代码,

import os
import openaifrom dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
os.environ['OPENAI_API_KEY'] = os.environ['OPENAI_API_KEY_CLAUDE2']
os.environ['OPENAI_API_BASE'] = os.environ['OPENAI_API_BASE_CLAUDE2']
openai.api_key = os.environ['OPENAI_API_KEY']
openai.api_base = os.environ['OPENAI_API_BASE']import warnings
warnings.filterwarnings('ignore')
from langchain.chains.router import MultiPromptChain
from langchain.llms import OpenAI
from langchain.chains import ConversationChain
from langchain.chains.llm import LLMChain
from langchain.prompts import PromptTemplate
physics_template = """你是一位非常厉害的物理学教授。\
你很擅长简明易懂地回答物理问题。\
当你不知道问题的答案时,你会坦白承认你不知道。这里有一个问题:
{input}"""math_template = """你是一位非常出色的数学家。你很擅长回答数学问题。\
你之所以那么优秀,是因为你能把复杂的问题分解成几个组成部分,\
回答这些组成部分,然后把它们重新组合起来回答更广泛的问题。这里有一个问题:
{input}"""
prompt_infos = [{"name": "physics","description": "擅长回答物理问题","prompt_template": physics_template,},{"name": "math","description": "擅长回答数学问题","prompt_template": math_template,},
]
llm = OpenAI()
destination_chains = {}
for p_info in prompt_infos:name = p_info["name"]prompt_template = p_info["prompt_template"]prompt = PromptTemplate(template=prompt_template, input_variables=["input"])chain = LLMChain(llm=llm, prompt=prompt)destination_chains[name] = chain
default_chain = ConversationChain(llm=llm, output_key="text")

2. LLMRouterChain

该链使用 LLM 来确定如何路由事物。

示例代码,

from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser
from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE
destinations = [f"{p['name']}: {p['description']}" for p in prompt_infos]
destinations_str = "\n".join(destinations)
router_template = MULTI_PROMPT_ROUTER_TEMPLATE.format(destinations=destinations_str)
router_prompt = PromptTemplate(template=router_template,input_variables=["input"],output_parser=RouterOutputParser(),
)
router_chain = LLMRouterChain.from_llm(llm, router_prompt)
chain = MultiPromptChain(router_chain=router_chain,destination_chains=destination_chains,default_chain=default_chain,verbose=True,
)
print(chain.run("什么是黑体辐射?"))

输出结果,

> Entering new MultiPromptChain chain...
physics: {'input': '什么是黑体辐射?'}
> Finished chain.嗯,让我试着用简单的语言解释一下黑体辐射。黑体辐射是任何温度大于绝对零度的物体所发射出的电磁辐射。当物体被加热时,其组成原子和分子的能量水平会发生变化。这些能量变化会导致电磁辐射的发射。具体来说,黑体辐射遵循普朗克的辐射定律。这个定律说明,物体发射的电磁辐射能谱与物体的温度有关。温度越高,辐射峰值对应的波长越短。例如,一个温度为6000开尔文左右的物体,其辐射峰值在可见光范围内;而一个更热的物体,其辐射峰值可能处于紫外线范围。简而言之,黑体辐射是热物体发出的、与温度相关的电磁辐射。它遵循普朗克辐射定律,这与量子力学理论密切相关。我尽量用简单的话解释这一概念,如果有任何不清楚的地方请告诉我。

示例代码,

print(chain.run("大于40的第一个质数,且该质数加1能被3整除的是什么?")
)

输出结果,

> Entering new MultiPromptChain chain...
math: {'input': '大于40的第一个质数,且该质数加1能被3整除的是什么?'}
> Finished chain.好的,让我来分步回答这个问题:1. 大于40的第一个质数是41
2. 41加1等于42
3. 42能被3整除因此,大于40的第一个质数,且该质数加1能被3整除的是41。所以答案是:41

示例代码,

print(chain.run("造成降雨的云层叫什么名字?"))

输出结果,

> Entering new MultiPromptChain chain...
physics: {'input': '造成降雨的云层叫什么名字?'}
> Finished chain.对不起,我并不是真正的物理学教授。 我是一位人工智能助手,被设计来有礼貌和有帮助的回答问题。 对于你提出的关于造成降雨的云层名称的问题,我不确定正确的专业术语。 但是我可以告诉你,与降雨相关的主要云层类型通常包括:积雨云(Cumulonimbus)- 引起雷暴和降雨的大型、高密度的云。这些云能够产生强降雨,雷电和冰雹。层状云(Stratiform)- EXTENSIVE的平坦和统一的云层,常常产生连绵的降雨。nimbostratus- 一种灰色、阴郁的层状云,常带来持续的降雨。虽然我不知道专业的正式名称,但我希望这一概述能对回答你的问题有所帮助。作为一位人工智能助手,对我来说坦诚承认我的知识局限性也是重要的。请随时问我更多问题,我会尽我所能回答或寻找信息。

3. EmbeddingRouterChain

EmbeddingRouterChain 使用嵌入和相似性在目标链之间进行路由。

示例代码,

from langchain.chains.router.embedding_router import EmbeddingRouterChain
from langchain.embeddings import CohereEmbeddings
from langchain.vectorstores import Chroma
names_and_descriptions = [("physics", ["关于物理问题"]),("math", ["关于数学问题"]),
]
# !pip install cohere
router_chain = EmbeddingRouterChain.from_names_and_descriptions(names_and_descriptions, Chroma, CohereEmbeddings(), routing_keys=["input"]
)
chain = MultiPromptChain(router_chain=router_chain,destination_chains=destination_chains,default_chain=default_chain,verbose=True,
)
print(chain.run("什么是黑体辐射?"))

输出结果,

> Entering new MultiPromptChain chain...
physics: {'input': '什么是黑体辐射?'}
> Finished chain.嗯,黑体辐射是一个重要的物理概念。让我试着用简单的语言来解释一下:黑体是物理学中一个理想化的物体,它能完美地吸收所有的入射电磁辐射,而不反射任何光线。黑体会以其温度对应的黑体辐射谱发出电磁辐射。 换句话说,任何温度高于绝对零度的物体都会发出电磁辐射,而这个电磁辐射的频谱分布取决于物体的温度。高温物体发出的峰值波长更短,也就是更倾向于可见光和紫外线。低温物体发出的辐射则更倾向于红外线和微波。黑体辐射是理解恒星、火焰、电灯丝和其它高温物体发射辐射的重要概念。它揭示了物体的辐射特性仅与温度有关,与组成材料无关。希望这个解释对你有所帮助!如果还有其他问题,欢迎随时提出,我会尽我所能回答。

示例代码,


print(chain.run("大于40的第一个质数,且该质数加1能被3整除的是什么?")
)

输出结果,

> Entering new MultiPromptChain chain...
math: {'input': '大于40的第一个质数,且该质数加1能被3整除的是什么?'}
> Finished chain.好的,让我来分解这个问题:1. 找到大于40的第一个质数。第一个大于40的质数是41。2. 找到一个质数,加1后能被3整除。如果一个数加1后能被3整除,那么这个数能被3整除再减1。 3. 41加1是42,42能被3整除。4. 所以,大于40的第一个质数且该质数加1能被3整除的质数是41。答案是:41

完结!

相关文章:

Langchain 的 Routerchain

Langchain 的 Routerchain 1. destination_chains2. LLMRouterChain3. EmbeddingRouterChain 本笔记本演示了如何使用 RouterChain 范例创建一个链,该链动态选择用于给定输入的下一个链。 路由器链由两个组件组成: RouterChain 本身(负责选…...

Springboot - druid 数据库密码加密

yml配置 jasypt:encryptor:password: U3buwRJdQ2023algorithm: PBEWithMD5AndDES # 数据源配置 spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.cj.jdbc.Driverdruid:# 主库数据源master:url: yourUrlusername: yourUsernamepass…...

Python中运行取消Python console模式

在Python里run的时候突然会发现,进入的不是run模式,而是console模式,这种运行模式能保留你每次的运行历史,因为会重开一个运行小页面,关闭操作如下:...

macOS Monterey 12.6.8 (21G725) 正式版发布,ISO、IPSW、PKG 下载

macOS Monterey 12.6.8 (21G725) 正式版发布,ISO、IPSW、PKG 下载 本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也支持…...

计科web常见错误排错【HTTP状态404、导航栏无法点开、字符乱码及前后端数据传输呈现、jsp填写的数据传到数据库显示null、HTTP状态500】

web排错记录 在使用javaweb的过程中会出现的一些错误请在下方目录查找。 目录 错误1:HTTP状态404——未找到 错误2:导航栏下拉菜单无法点开的问题 错误3:字符乱码问题 错误4:jsp网页全部都是??&#x…...

仿VScode MDK背景配色方案

效果如果所示 操作方法:备份后修改~/UV4文件夹下的global.prop,用以下的代码代替。 # properties for all file types indent.automatic1 virtual.space0 view.whitespace0 view.endofline0 code.page936 caretline.visible1 highlight.matchingbraces1…...

AutoSAR系列讲解(实践篇)9.5-通信的数据映射

本节很简单,但是很重要,是配置中必不可少的一个部分。因此单独列了这么一节出来 Data Mapping概述 在Davinci Cfg中,数据是不能直接放在IPDU上的,必须要映射到相应的Signals上才行。Signals一般是由通信矩阵定义的,但是通信矩阵并不知道程序中究竟用的是哪个数据进行传输…...

janus-Gateway的服务端部署

janus-Gateway 需求是前后端的webRTC推拉流,但是后端用的是c,于是使用了这个库做视频流的推送和拉取,记录踩坑过程。 如果你也需要自己部署janus的服务端并在前端拉流测试,希望对你有所帮助。 由于janus的服务器搭建需要linux环境…...

力扣简单1道_两数之和

两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序…...

从vue3速学react

单位老项目vue2,新项目vue3,业务已经熟练使用vue了,空余时间自学下react,写个博客记录下 react没有双向绑定,用的是jsx语法,useState后面是初始化值,需要改变data的时候,需要用定义的setXXX来改变XXX值&am…...

Kotlin 协程 CoroutineScope

协程定义: 19年官方是这样说的:协程是轻量级的线程,协程就是 Kotlin 提供的一套线程封装的 API; 现在官方是这样说的:协程是一种并发设计模式; 协程作用: 1.处理耗时任务; 2.保…...

如何构建适合自己的DevOps软件测试改进方案

​目录 DevOps成熟度模型分析 构建适合企业自身性能的测试过程改进框架 资料获取方法 根据2022年的DevOps全球调查报告显示,主流软件企业采用或部分采用DevOps且已获得良好成效的占比已达70%,DevOps俨然成为当下软件开发研究的重要方向。 测试作为软…...

PHP关于字符串的各类处理方法

判断字符串是否以指定子串开头或结尾 function startsWith($str, $prefix) {return stripos($str, $prefix) 0; }function endsWith($str, $suffix) {return substr_compare($str, $suffix, -strlen($suffix)) 0; }// 示例用法 $text "hello world"; $result st…...

Springboot+MyBatis使用

目录 依赖 配置信息 xml文件 mapper接口 打印日志 分页查询 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency><dependency><groupId>my…...

WebSocketServer的使用(@ServerEndpoint)

前端代码 function initWebSocket() {if (typeof WebSocket "undefined") {console.log("您的浏览器不支持WebSocket");} else {console.log("您的浏览器支持WebSocket");//实现化WebSocket对象&#xff0c;指定要连接的服务器地址与端口 建立连…...

【yolov8系列】将yolov8-seg 模型部署到瑞芯微RK3566上

前言 之前记录过【yolov5系列】将模型部署到瑞芯微RK3566上&#xff0c;整体比较流畅&#xff0c;记录了onnx转rknn的相关环境配置&#xff0c;使用的rk版本为rknn-toolkit2-v1.4.0。当前库已经更新为1.5&#xff0c;这里还是沿用1.4的版本进行记录。本篇博客是在上篇博客&…...

Java类的默认构造函数

什么情况下存在默认构造函数 说明 如果一个Java类没有显式包含构造函数的声明&#xff0c;那么隐含着有一个默认构造函数。 示例 定义一个类B&#xff0c;没有显式声明构造函数&#xff0c;所以存在一个默认构造函数&#xff1a; package com.thb;public class B {public …...

华为openGauss数据库入门 - gsql用法

目录 1.1 gsql的语法 1.2 gsql常用选项 1.2.1 最常用的必要选项 1.2.2 -r选项 1.2.3 -E选项 1.2.4 -t选项 1.2.5 -A选项 1.2.6 -v选项 1.2.7 -c选项 1.2.8 -f选项 1.2.9 -q选项 1.3 gsql的元命令 1.3.1 \l命令 1.3.2 \du命令和\dg命令 1.3.3 \db命令 1.3.4 \d…...

The Sandbox 重新上线,带来全新体验!

在经历了一个充满史诗般新回忆的全力开局后&#xff0c;我们短暂休息了片刻&#xff0c;为玩家准备了全新的、惊心动魄的游戏活动。 我们已经完成了功能的微调&#xff0c;准备将您的游戏体验提升到一个全新高度&#xff01; 想知道我们正在做什么吗&#xff1f;现在还无法公开…...

动态内存管理面试题

动态内存管理面试题 文章目录 动态内存管理面试题一、第一题此代码存在的问题运行结果分析原因修改 二、第二题此代码存在的问题运行结果分析原因修改 一、第一题 代码如下&#xff08;示例&#xff09;&#xff1a; #include<stdio.h> #include<string.h> #incl…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...