自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:连接到特征存储]
分类目录:《自然语言处理从入门到应用》总目录
特征存储是传统机器学习中的一个概念,它确保输入模型的数据是最新和相关的。在考虑将LLM应用程序投入生产时,这个概念非常重要。为了个性化LLM应用程序,我们可能希望将LLM与特定用户的最新信息结合起来。特征存储可以是保持数据更新的好方法,而LangChain提供了一种将该数据与LLM结合的简单方式。
在下面的示例中,我们将展示如何将提示模板连接到特征存储。其基本思想是从提示模板中调用特征存储以检索值,然后将这些值格式化到提示中。
Feast
首先,我们将使用流行的开源特征存储框架Feast。首先,假设我们已经做完了Feast的入门步骤。紧接着,我们将基于入门示例构建,并创建一个LLMChain,用于驱动有关其最新统计信息。
加载 Feast 存储
根据Feast的README中的说明进行设置:
from feast import FeatureStore# 根据存储路径进行更新
feast_repo_path = "../../../../../my_feature_repo/feature_repo/"
store = FeatureStore(repo_path=feast_repo_path)
提示
在这里,我们将设置一个自定义的FeastPromptTemplate。这个提示模板将接收一个司机 ID,查找他们的统计数据,并将这些统计数据格式化到提示中。需要注意的是,这个提示模板的输入只有driver_id,因为这是唯一由用户定义的部分,所有的其它变量都在提示模板内部查找。
from langchain.prompts import PromptTemplate, StringPromptTemplate
template = """根据司机的最新统计数据,写一个便签将这些统计数据传达给他们。
如果他们的对话率超过0.5,请给他们一个赞美。否则,在最后讲一个关于鸡的愚蠢笑话,让他们感觉好一些。以下是司机的统计数据:
对话率:{conv_rate}
接受率:{acc_rate}
平均每日行程数:{avg_daily_trips}你的回复:"""
prompt = PromptTemplate.from_template(template)
class FeastPromptTemplate(StringPromptTemplate):def format(self, **kwargs) -> str:driver_id = kwargs.pop("driver_id")feature_vector = store.get_online_features(features=['driver_hourly_stats:conv_rate','driver_hourly_stats:acc_rate','driver_hourly_stats:avg_daily_trips'],entity_rows=[{"driver_id": driver_id}]).to_dict()kwargs["conv_rate"] = feature_vector["conv_rate"][0]kwargs["acc_rate"] = feature_vector["acc_rate"][0]kwargs["avg_daily_trips"] = feature_vector["avg_daily_trips"][0]return prompt.format(**kwargs)
prompt_template = FeastPromptTemplate(input_variables=["driver_id"])
print(prompt_template.format(driver_id=1001))
输出:
根据司机的最新统计数据,写一个便签将这些统计数据传达给他们。
如果他们的对话率超过0.5,请给他们一个赞美。否则,在最后讲一个关于鸡的愚蠢笑话,让他们感觉好一些。以下是司机的统计数据:
对话率:0.4745151400566101
接受率:0.055561766028404236
平均每日行程数:936你的回复:
在上面的例子中,我们创建了一个FeastPromptTemplate的实例,并使用format方法为特定的driver_id生成一个提示。使用store.get_online_features从特征存储中检索司机的特征向量,并将相关统计数据填充到提示模板中。现在,我们可以将生成的提示文本用于进一步处理或作为输入提供给您的语言模型。
在链式结构中使用
现在我们可以在链式结构中使用它,创建一个由特征存储支持的个性化链式结构:
from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain
chain = LLMChain(llm=ChatOpenAI(), prompt=prompt_template)
chain.run(1001)
输出:
"嗨!我想向您更新一下您当前的统计数据。您的接受率为0.055561766028404236,平均每日行程数为936。虽然您当前的对话率为0.4745151400566101,但我相信只要再加一点努力,您就能超过0.5的标准!继续保持良好的工作!还记得,即使鸡无法总是穿过马路,但它们仍会尽力而为。"
以上是根据提供的统计数据生成的更新消息。消息中包含司机的接受率、平均每日行程数和对话率的信息。鼓励司机继续努力工作,并给予他们一些鸡的笑话来增加一些轻松的氛围。
Tecton
上面,我们展示了如何在LangChain中使用流行的开源自管特征存储Feast。下面的示例将展示如何使用Tecton进行类似的集成。Tecton是一个完全托管的特征平台,用于协调完整的ML特征生命周期,从转换到在线服务,具备企业级SLA。
前提条件
- Tecton部署
- 将
TECTON_API_KEY环境变量设置为有效的服务账户密钥
定义和加载特征
我们将使用Tecton教程中user_transaction_counts的Feature View作为Feature Service的一部分。为简单起见,我们只使用了一个Feature View;然而,更复杂的应用可能需要更多的Feature View来检索其提示所需的特征。
user_transaction_metrics = FeatureService(name="user_transaction_metrics",features=[user_transaction_counts]
)
上述Feature Service预计将被应用到实时工作空间中。在本示例中,我们将使用prod工作空间。
import tectonworkspace = tecton.get_workspace("prod")
feature_service = workspace.get_feature_service("user_transaction_metrics")
Prompts
在这里,我们将设置一个自定义的TectonPromptTemplate。该提示模板将接收一个用户ID,查找其统计数据,并将这些统计数据格式化为提示。需要注意的是,该提示模板的输入只有user_id,因为这是唯一由用户定义的部分,所有其他的变量都在提示模板内部查找。
from langchain.prompts import PromptTemplate, StringPromptTemplate
template = """给定供应商的最新交易统计数据,根据以下规则给他们写一封信:1. 如果他们在过去一天内有交易,向他们祝贺最近的销售成绩。
2. 如果过去一天没有交易,但过去30天内有交易,逗趣地鼓励他们多卖一些。
3. 最后总是加上一个关于鸡的愚蠢笑话。以下是供应商的统计数据:
过去一天的交易数量:{transaction_count_1d}
过去30天的交易数量:{transaction_count_30d}您的回复:"""
prompt = PromptTemplate.from_template(template)
class TectonPromptTemplate(StringPromptTemplate):def format(self, **kwargs) -> str:user_id = kwargs.pop("user_id")feature_vector = feature_service.get_online_features(join_keys={"user_id": user_id}).to_dict()kwargs["transaction_count_1d"] = feature_vector["user_transaction_counts.transaction_count_1d_1d"]kwargs["transaction_count_30d"] = feature_vector["user_transaction_counts.transaction_count_30d_1d"]return prompt.format(**kwargs)prompt_template = TectonPromptTemplate(input_variables=["user_id"])
print(prompt_template.format(user_id="user_469998441571"))
输出:
给定供应商的最新交易统计数据,根据以下规则给他们写一封信:如果他们在过去一天内有交易,向他们祝贺最近的销售成绩。
如果过去一天没有交易,但过去30天内有交易,逗趣地鼓励他们多卖一些。
最后总是加上一个关于鸡的愚蠢笑话。
以下是供应商的统计数据: 过去一天的交易数量:657 过去30天的交易数量:20326您的回复:
在链式模型中使用
现在我们可以在链式模型中使用它,创建一个通过Tecton Feature平台支持的个性化链式模型:
from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain
chain = LLMChain(llm=ChatOpenAI(), prompt=prompt_template)
chain.run("user_469998441571")
输出:
'哇,恭喜您最近的销售成绩!您的业务就像热气球上的一只鸡一样飞得很高!继续保持良好的工作!'
Featureform
最后,我们将使用Featureform,一个开源的企业级特征存储,来运行相同的示例。Featureform允许我们使用Spark等基础设施或本地环境来定义特征转换。
初始化Featureform
我们可以按照README中的说明初始化Featureform中的转换和特征。
import featureform as ffclient = ff.Client(host="demo.featureform.com")
Prompts
在这里,我们将设置一个自定义的FeatureformPromptTemplate,该提示模板将使用用户每笔交易的平均金额作为输入。需要注意的是,该提示模板的输入只有avg_transaction,因为所有其他变量都在提示模板内部查找。
from langchain.prompts import PromptTemplate, StringPromptTemplate
template = """Given the amount a user spends on average per transaction, let them know if they are a high roller. Otherwise, make a silly joke about chickens at the end to make them feel betterHere are the user's stats:
Average Amount per Transaction: ${avg_transcation}Your response:"""
prompt = PromptTemplate.from_template(template)
class FeatureformPromptTemplate(StringPromptTemplate):def format(self, **kwargs) -> str:user_id = kwargs.pop("user_id")fpf = client.features([("avg_transactions", "quickstart")], {"user": user_id})return prompt.format(**kwargs)prompt_template = FeatureformPrompTemplate(input_variables=["user_id"])
print(prompt_template.format(user_id="C1410926"))
在对话链中使用
现在我们还可以将其用于对话链中,成功创建一个由Featureform Feature平台支持的个性化对话链。
from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain
chain = LLMChain(llm=ChatOpenAI(), prompt=prompt_template)
chain.run("C1410926")
参考文献:
[1] LangChain 🦜️🔗 中文网,跟着LangChain一起学LLM/GPT开发:https://www.langchain.com.cn/
[2] LangChain中文网 - LangChain 是一个用于开发由语言模型驱动的应用程序的框架:http://www.cnlangchain.com/
相关文章:
自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:连接到特征存储]
分类目录:《自然语言处理从入门到应用》总目录 特征存储是传统机器学习中的一个概念,它确保输入模型的数据是最新和相关的。在考虑将LLM应用程序投入生产时,这个概念非常重要。为了个性化LLM应用程序,我们可能希望将LLM与特定用户…...
jenkins自定义邮件发送人姓名
jenkins发送邮件的时候发送人姓名默认的,如果要自定义发件人姓名,只需要修改如下信息即可: 系统管理-system-Jenkins Location下的系统管理员邮件地址 格式为:自定义姓名<邮件地址>...
SolidWorks二次开发---简单的连接solidworks
创建一个.net Framework的应用,正常4.0以上就可以了。 打开nuget包管理 在里面搜索paine 在版中选择对应的solidworks年份开头的,进行安装。 安装完之后 : 同时选中下面两个dll,把嵌入操作类型改为false 然后在按钮的单击事件中输入: Connect.Crea…...
docker 安装 active Mq
在安装完Docker的机器上,安装activeMQ。 拉取镜像: docker pull webcenter/activemq 查看镜像: docker images Docker运行ActiveMQ镜像 docker run --name activemq -d -p 8161:8161 -p 61616:61616 --privilegedtrue --restartalways …...
【Linux】TCP协议
🌠 作者:阿亮joy. 🎆专栏:《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录 👉TCP协议&…...
DevOps系列文章之 自动化测试大全(单测和集成测试)
自动化测试业界主流工具 核心目标: 主要是功能测试和覆盖率测试 业界常用主流工具 GoogleTest GoogleTest是一个跨平台的(Liunx、Mac OS X、Windows 、Cygwin 、Windows CE and Symbian ) C单元测试框架,由google公司发布,为在不同平台上为编…...
Android启动速度优化
本节主要内容:了解APP启动流程、启动状态、查看启动时间、CPU Profile定位启动耗时代码、StrictMode严苛模式检测不合理写法、解决启动黑白屏问题。 一、APP启动流程 ①用户点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startAc…...
linux 日志 系统安全日志 web日志
web日志 LINUX日志系统之WEB日志(一)_dracut.log_麻子来了的博客-CSDN博客 系统安全日志 Linux系统安全日志详解_sinolover的博客-CSDN博客 wtmp和utmp文件都是二进制文件,需使用who、w、users、last和ac来操作这两个文件。 who /var/lo…...
SpringBoot 整合 MongoDB 连接 阿里云MongoDB
注:spring-boot-starter-data-mongodb 2.7.5;jdk 1.8 阿里云MongoDB是副本集实例的 在网上查找了一番,大多数都是教连接本地mongodb或者linux上的mongodb 阿里云上有java版连接教程,但它不是SpringBoot方法配置的,是手…...
Debeizum 增量快照
在Debeizum1.6版本发布之后,成功推出了Incremental Snapshot(增量快照)的功能,同时取代了原有的实验性的Parallel Snapshot(并行快照)。在本篇博客中,我将介绍全新快照方式的原理,以…...
windows下安装composer
安装Php 教程 下载composer 官网 中文网站 exe下载地址 下载好exe 双击运行 找到php.ini注释一行代码 测试 composer -v说明安装成功 修改源 执行以下命令即可修改 composer config -g repo.packagist composer https://packagist.phpcomposer.com # 查看配置…...
企业游学进华秋,助力电子产业创新与发展
近日,淘IC企业游学活动,携20多位电子行业的企业家,走进了深圳华秋电子有限公司(以下简称“华秋”),进行交流学习、供需对接。华秋董事长兼CEO陈遂佰对华秋的发展历程、业务版块、产业布局等做了详尽的介绍&…...
玩转Tomcat:从安装到部署
文章目录 一、什么是 Tomcat二、Tomcat 的安装与使用2.1 下载安装2.2 目录结构2.3 启动 Tomcat 三、部署程序到 Tomcat3.1 Windows环境3.2 Linux环境 一、什么是 Tomcat 一看到 Tomcat,我们一般会想到什么?没错,就是他,童年的回忆…...
吃透《西瓜书》第四章 决策树定义与构造、ID3决策树、C4.5决策树、CART决策树
目录 一、基本概念 1.1 什么是信息熵? 1.2 决策树的定义与构造 二、决策树算法 2.1 ID3 决策树 2.2 C4.5 决策树 2.3 CART 决策树 一、基本概念 1.1 什么是信息熵? 信息熵: 熵是度量样本集合纯度最常用的一种指标,代表一个系统中蕴…...
复现宏景eHR存在任意文件上传漏洞(0day)
目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现 一、漏洞描述 北京宏景世纪软件股份有限公司(简称“宏景软件”)自成立以来始终专注于国有企事业单位人力与人才管理数智化(数字化、智能化)产品的研发和应用推广,是中国国有企事业单位人力与人才管理数智…...
unity连接MySQL数据库并完成增删改查
数据存储量比较大时,我就需要将数据存储在数据库中方便使用,尤其是制作管理系统时,它的用处就更大了。 在编写程序前,需要在Assets文件夹中创建plugins文件,将.dll文件导入,文件从百度网盘自取:…...
13个ChatGPT类实用AI工具汇总
在ChatGPT爆火后,各种工具如同雨后春笋一般层出不穷。以下汇总了13种ChatGPT类实用工具,可以帮助学习、教学和科研。 01 / ChatGPT for google/ 一个浏览器插件,可搭配现有的搜索引擎来使用 最大化搜索效率,对搜索体验的提升相…...
1-linux下mysql8.0.33安装
在互联网企业的日常工作/运维中,我们会经常用到mysql数据库,而linux下mysql的安装方式有三种: 1.mysql rpm安装 2.mysql二进制安装 3.mysql源码安装 今天就为大家讲讲linux下mysql8.0.33版本rpm方式的安装。 1.前提 1.1.系统版本 Cent…...
golang反射获取结构体的值和修改值
功能:根据id和反射技术封装 创建和更新人的查询 一、代码二、演示 一、代码 package coryCommonimport ("context""errors""github.com/gogf/gf/v2/container/gvar""github.com/tiger1103/gfast/v3/internal/app/system/dao&qu…...
中文大模型评估数据集——C-Eval
C-EVAL: A Multi-Level Multi-Discipline Chinese Evaluation Suite for Foundation Models https://arxiv.org/pdf/2305.08322v1.pdfhttps://github.com/SJTU-LIT/cevalhttps://cevalbenchmark.com/static/leaderboard.html Part1 前言 怎么去评估一个大语言模型呢? 在广泛…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
