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

LangChain实战技巧之六:一起玩转config(上篇)——ConfigurableField

简介

    Config 包含两大类内容,

  • ConfigurableField 可配置的字段
  • configurable_alternatives 可配置的替代方案

    分别使用两篇文章来给大家介绍,本篇先介绍ConfigurableField

常规介绍

   一些资料会这样介绍

model_spec = model.configurable_fields(model_name=ConfigurableField(id="model_name",description="指定一个你想要使用的model"))
model_spec.invoke(input="你好啊,我是你的好朋友 —— Song榆钱儿", config={"configurable": {"model_name": "qwen-plus"}})

输出结果

content='你好,Song榆钱儿!很高兴和你成为好朋友。有什么我可以帮助你的吗?' response_metadata={'model_name': 'qwen-plus', 'finish_reason': 'stop', 'request_id': '57cfe500-0520-9ac6-8c5c-50c077539cbc', 'token_usage': {'input_tokens': 21, 'output_tokens': 19, 'total_tokens': 40}} id='run-9fc162a7-4089-4f81-a792-2c17206ef9b0-0'

然后告诉你,可以配置一个model_name作为config参数,在invoke时可以把具体的model_name传递进来,例如:qwen-plus

进阶用法

通常一些资料没告诉你的是,可以有哪些可配置的Field 这里我给大家介绍...授之以渔

model.__fields__.keys()

输出结果

dict_keys(['name', 'cache', 'verbose', 'callbacks', 'tags', 'metadata', 'custom_get_token_ids', 'callback_manager', 'client', 'model_name', 'model_kwargs', 'top_p', 'dashscope_api_key', 'streaming', 'max_retries'])

想用哪个用哪个:)

当然,可以直接用__fields__,这样就把整个dict(每个Field和含义内容都打印出来)

那这个配置除了参数化,还有何用处。。。

应用场景

  • prompt场景

我们看下prompt,提示词config能做些什么 以messages为例,它可以帮助组合成新的提示词 代码如下:

# 先准备两个
prompt_add_1 = ChatPromptTemplate.from_messages([("human", "你好"),("ai", "你好,有什么可以帮助你的吗?")])prompt_add_2 = ChatPromptTemplate.from_messages([("human", "1+1等于几?"),("ai", "1+1的计算结果等于2")])
# 接下来,我们看看怎么用它们
prompt_spec = prompt.configurable_fields(messages=ConfigurableField(id="messages",description="消息列表"))# 见证奇迹的时刻
prompt_spec.invoke({}, config={"configurable": {"messages": [prompt_add_1, prompt_add_2]}})

输出结果

messages=[HumanMessage(content='你好'), AIMessage(content='你好,有什么可以帮助你的吗?'), HumanMessage(content='1+1等于几?'), AIMessage(content='1+1的计算结果等于2')]

细心的小伙伴会发现,上述的方式与这种方式 一毛一样

# 换种方式组合,只不过不用config
prompt = ChatPromptTemplate.from_messages([prompt_add_1, prompt_add_2])
prompt.invoke({})
  • chain场景

看看chain有哪些可config的field

chain.__fields__.keys()

输出

dict_keys(['name', 'first', 'middle', 'last'])

"name"和First"都很简单,下面分别以“middle”、“last”为例

# 定义一个可config的model
model_spec = model.configurable_fields(model_name=ConfigurableField(id="model_name",description="指定一个你想要使用的model"))# 一会儿要用到的函数
def change_me(promptvalue):return promptvalue.to_string().replace("Song榆钱儿", "Songjg")# 一个简单的chain
chain = prompt | model_spec# 将chain做成可config的...
chain = chain.configurable_fields(middle=ConfigurableField(id="process", description="这是啥?"))# 来吧,看实验
chain.invoke(input="你好啊,我是你的好朋友 —— Song榆钱儿", config={"configurable": {"process": [RunnableLambda(change_me)]}})# 不仅有middle,还有last
chain = chain.configurable_fields(middle=ConfigurableField(id="deal", description="这是啥?"),
last=ConfigurableField(id="model_spec", description="这是啥?"))chain.invoke(input="你好啊,我是你的好朋友 —— Song榆钱儿", config={"configurable": {"deal": [RunnableLambda(changeme)],
"model_name": "qwen-plus"}}))

输出结果

content='你好,Songjg!很高兴再次与你交流。有什么我可以帮助你的吗?' response_metadata={'model_name': 'qwen-turbo', 'finish_reason': 'stop', 'request_id': 'dc0bca5d-e0ce-9fc9-b5e5-c76987f09390', 'token_usage': {'input_tokens': 23, 'output_tokens': 18, 'total_tokens': 41}} id='run-a5a4f67f-7a9c-440b-b969-0ac1ffe8b812-0'
Human: 你好啊,我是你的好朋友 —— Song榆钱儿
content='你好,Songjg!很高兴再次见到你。有什么我可以帮助你的吗?' response_metadata={'model_name': 'qwen-plus', 'finish_reason': 'stop', 'request_id': 'c3ff953d-a72f-9de9-be74-7150a1f3dce3', 'token_usage': {'input_tokens': 23, 'output_tokens': 17, 'total_tokens': 40}} id='run-055dcf5b-433f-486a-9beb-5f3d3947b098-0'
  • Agent场景

agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True,callbacks=None, callback_manager=None, return_intermediate_steps=True)agent_executor.__fields__.keys()

看看有什么

dict_keys(['name', 'memory', 'callbacks', 'verbose', 'tags', 'metadata', 'callback_manager', 'agent', 'tools', 'return_intermediate_steps', 'max_iterations', 'max_execution_time', 'early_stopping_method', 'handle_parsing_errors', 'trim_intermediate_steps'])

基本上都是AgentExecutor简单的参数,“偷懒”就不挨个介绍,请各位看官自行实验: )

One more thing

RunnableWithMessageHistory(……………………history_factory_config=[ConfigurableFieldSpec(id="Songjg",annotation=str,name="Song榆钱儿",description="我的名字",default="",is_shared=True)]

这个是一种应用比较广泛的,消息历史相关的Runnable,可定义config传参变量,关于它的详细内容以后再给大家介绍...

相关文章:

LangChain实战技巧之六:一起玩转config(上篇)——ConfigurableField

简介 Config 包含两大类内容, ConfigurableField 可配置的字段 configurable_alternatives 可配置的替代方案 分别使用两篇文章来给大家介绍,本篇先介绍ConfigurableField 常规介绍 一些资料会这样介绍 model_spec model.configurable_fields(model…...

扫码称重上位机

目录 一 设计原型 二 后台代码 一 设计原型 模拟工具: 二 后台代码 主程序: using System.IO.Ports; using System.Net; using System.Net.Sockets; using System.Text;namespace 扫码称重上位机 {public partial class Form1 : Form{public Form1(){Initialize…...

操作系统入门 -- 进程的通信方式

操作系统入门 – 进程的通信方式 1.什么是进程通信 1.1 定义 进程通信就是在不同进程之间交换信息。在之前文章中可以了解到,进程之间相互独立,一般不可能互相访问。因此进程之间若需要通信,则需要一个所有进程都认可的共享空间&#xff0…...

Python读取wps中的DISPIMG图片格式

需求: 读出excel的图片内容,这放在微软三件套是很容易的,但是由于wps的固有格式,会出现奇怪的问题,只能读出:类似于 DISPIMG(“ID_2B83F9717AE1XXXX920xxxx644C80DB1”,1) 【该DISPIMG函数只有wps才拥有】 …...

elasticsearch的入门与实践

Elasticsearch是一个基于Lucene构建的开源搜索引擎。它提供了一个分布式、多租户能力的全文搜索引擎,具有HTTP web接口和无模式的JSON文档。以下是Elasticsearch的入门与实践的基本步骤: 入门 安装Elasticsearch: 从Elasticsearch官网下载对…...

神经网络学习6-线性层

归一化用的较少 正则化用来解决过拟合,处理最优化问题,批量归一化加快速度 正则化(Regularization): 作用:正则化是一种用来防止过拟合的技术,通过向模型的损失函数中添加惩罚项,使…...

PHP框架详解 - CodeIgniter 框架

CodeIgniter 是一个成熟的轻量级 PHP 框架,专为小到中型的 Web 应用开发设计。它以其简洁、灵活和易于学习的特点而受到开发者的喜爱。 CodeIgniter 框架的特点包括: 轻量级:CodeIgniter 的核心非常小,加载速度快,适…...

奔驰EQS SUV升级原厂主动式氛围灯效果展示

以下是一篇关于奔驰 EQs 升级原厂主动氛围灯案例的宣传文案: 在汽车科技不断演进的今天,我们自豪地为您呈现奔驰 EQs 升级原厂主动氛围灯的精彩案例。 奔驰 EQs,作为豪华电动汽车的典范,其卓越品质与高端性能有目共睹。而此次升…...

echarts Y轴展示时间片段,series data数据 也是时间片段,鼠标放上去 提示框显示对应的时间片段

功能要求 1、折线图,展示每天对应的一个时间片段 2、echarts Y轴展示时间片段,如:[00:00,03:00,05:15] 3、X轴展示日期,如:[xx年xx月xx日] 后端返回的数据结构,如 [{xAdate:"2024-06-15",data:…...

20. mediasoup服务器的布署与使用

Mediasoup Demo部署 架构服务分析 服务端提供3个服务: 1.www服务,浏览器通过访问服务器目录获取客户端代码,通过V8引擎,启动底层WebRTC 2.nodejs提供websocket服务和http服务,用于信令交互 3.Mediasoup C提供的流媒体…...

【leetcode--同构字符串】

要求:判断两个字符串的形式是不是一致,即是不是AABC或者ABBBCC这种。 trick:使用set()结合zip()。 set()用法:用于创建一个不包含重复元素的集合 zip&#…...

shell expr功能详解

expr命令可以实现数值运算、数值或字符串比较、字符串匹配、字符串提取、字符串长度计算等功能。它还具个特殊功能,判断变量或参数是否为整数、是否为空、是否为0等。 1.字符串表达式 ------------------------- expr支持模式匹配和字符串操作。字符串表达式的优先…...

java继承Thead类和实现Runnable接口创建线程的区别

一、继承Thread类创建多线程 public class Demo{public static void main(String[] args) {MyThread thread new MyThread();thread.start();}} class MyThread extends Thread{Overridepublic void run() {//子线程执行的操作} }注意:开启子线程要调用start()方法…...

interface Ref<T = any> 这是什么写法?为什么写接口还需要加上<T = any>

问: export interface Ref<T any> { value: T [RefSymbol]: true } 这里既然是interface接口,为什么还有<T any>这是什么意思? 回答: <T any> 中的 <T> 表示这是一个泛型参数&#xff0c;它可以在接口中作为类型的占位符&#xff0c;在实际…...

深入探索 MongoDB GridFS:高效大文件存储与管理的全面指南

GridFS 是 MongoDB 的一个规范&#xff0c;用于存储和检索超过 BSON 文档大小限制&#xff08;16MB&#xff09;的文件。与传统的文件系统不同&#xff0c;GridFS 可以将一个大文件分割成多个小块&#xff0c;并存储在 MongoDB 的两个集合中&#xff1a;fs.files 和 fs.chunks。…...

基于CentOS Stream 9平台 安装/卸载 Redis7.0.15

已更正systemctl管理Redis服务问题 1. 官方下载地址 https://redis.io/downloads/#redis-downloads 1.1 下载或上传到/opt/coisini目录下&#xff1a; mkdir /opt/coisini cd /opt/coisini wget https://download.redis.io/releases/redis-7.0.15.tar.gz2. 解压 tar -zxvf re…...

激励-保健理论和公平理论

激励-保健理论 herzberg的激励-保健理论中&#xff0c;保健因素是context of a job&#xff0c;激励因素是content of a job。 context of a job是受组织控制的因素&#xff0c;比如工作条件&#xff0c;基本工资&#xff0c;公司政策等&#xff0c;个人无法支配。content of…...

深入探索 Spring Boot 自定义启动画面

目录 引言什么是 Spring Boot 启动画面Spring Boot 默认启动画面为什么要自定义启动画面如何自定义 Spring Boot 启动画面 修改配置文件使用 Banner 接口通过图片实现启动画面ASCII 艺术画的应用 进阶&#xff1a;基于环境变量的动态 Banner多模块项目中的启动画面Spring Boot…...

Redis实战—Redis分布式锁

本博客为个人学习笔记&#xff0c;学习网站与详细见&#xff1a;黑马程序员Redis入门到实战 P56 - P63 目录 分布式锁介绍 基于Redis的分布式锁 Redis锁代码实现 修改业务代码 分布式锁误删问题 分布式锁原子性问题 Lua脚本 编写脚本 代码优化 总结 分布式锁介绍…...

联想Y7000P 2023款拆机教程及升级内存教程

0.电脑参数介绍 联想Y7000P 2023电脑&#xff0c;笔者电脑CPU为i7-13700H&#xff0c;14核20线程&#xff1b;标配内存为三星的DDR5-5600MHz-8GB*2&#xff0c;由于电脑CPU限制&#xff0c;实际内存跑的频率为5200MHz; 2个内存插槽&#xff0c;2个固态硬盘插槽。每个内存插槽最…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...