在langchain中使用带简短知识内容的prompt template
简介
langchain中有个比较有意思的prompt template叫做FewShotPromptTemplate。
他是这句话的简写:“Prompt template that contains few shot examples.”
什么意思呢?就是说在Prompt template带了几个比较简单的例子。然后把这些例子发送给LLM,作为简单的上下文环境,从而为LLM提供额外的一些关键信息。
这种few shot examples非常有用,如果你希望LLM可以基于你提供的prompt中的内容进行回答的时候,就需要用到这个东西了。
你可以把Few-shot prompt templates看做是简单的知识库,后面我们会具体讲解如何搭建自己的知识库。
现在先提前了解一下它的魅力吧。
带few shot examples的例子
加入现在我要问chatgpt这样一个问题:
请问工具人的代表作是什么?
因为这里的工具人是我虚拟出来的一个人,真实并不存在,所以chatgpt的回答可能是下面这样的:
工具人的代表作是迈克尔·佩拉的《开膛手杰克》。
因为chatgpt对不会的东西可能会乱回答,所以上面的答案是在合理范围之内的。
那么怎么才能让chatgpt按照我们虚构的内容进行回答呢?
答案就是在prompt中提供有用的信息,比如下面这样子:
问题: 请帮忙描述下古龙?
回答: 姓名:古龙,出生日期:1937年,代表作:《楚留香传奇系列》、《陆小凤系列》、《萧十一郎系列》问题: 请帮忙描述下金庸?
回答: 姓名:金庸,出生日期:1924年,代表作:《射雕英雄传》、《神雕侠侣》、《天龙八部》问题: 请帮忙描述下工具人?
回答: 姓名:工具人,出生日期:1988年,代表作:《工具人传奇》、《工具人上班》、《工具人睡觉》问题: 请问工具人的代表作是什么?
下面是chatgpt的回答:
工具人的代表作是《工具人传奇》、《工具人上班》和《工具人睡觉》。
所以大家想到了什么?
没错,就是可以使用prompt中的信息做知识库,让chatgpt从这个给定的知识库中查询出有用的东西,然后再用自己的语言组织起来,返回给用户。
在langchain中使用FewShotPromptTemplate
实际上,上面的问题和答案都是promot内容的一部分,所以可以保存在PromptTemplate中。
而langchain有与之对应的专门的一个类叫做FewShotPromptTemplate。
上面的问答,其实可以保存在一个json数组中,然后再在FewShotPromptTemplate中使用:
from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain.prompts.prompt import PromptTemplateexamples = [{"question": "请帮忙描述下古龙?","answer":
"""
姓名:古龙,出生日期:1937年,代表作:《楚留香传奇系列》、《陆小凤系列》、《萧十一郎系列》
"""},{"question": "请帮忙描述下金庸?","answer":
"""
姓名:金庸,出生日期:1924年,代表作:《射雕英雄传》、《神雕侠侣》、《天龙八部》
"""},{"question": "请帮忙描述下工具人?","answer":
"""
姓名:工具人,出生日期:1988年,代表作:《工具人传奇》、《工具人上班》、《工具人睡觉》
"""}
]
首先我们来看一下FewShotPromptTemplate中都有哪些属性:
examples: Optional[List[dict]] = None"""Examples to format into the prompt.Either this or example_selector should be provided."""example_selector: Optional[BaseExampleSelector] = None"""ExampleSelector to choose the examples to format into the prompt.Either this or examples should be provided."""example_prompt: PromptTemplate"""PromptTemplate used to format an individual example."""suffix: str"""A prompt template string to put after the examples."""input_variables: List[str]"""A list of the names of the variables the prompt template expects."""example_separator: str = "\n\n""""String separator used to join the prefix, the examples, and suffix."""prefix: str = """""A prompt template string to put before the examples."""template_format: str = "f-string""""The format of the prompt template. Options are: 'f-string', 'jinja2'."""validate_template: bool = True"""Whether or not to try validating the template."""
其中examples和example_selector是可选的,其他的都是必须的。
example_prompt是用来格式化一个特定example的PromptTemplate。
如下所示:
example_prompt = PromptTemplate(input_variables=["question", "answer"], template="问题: {question}\n 回答:{answer}")print(example_prompt.format(**examples[0]))
问题: 请帮忙描述下古龙?
回答: 姓名:古龙,出生日期:1937年,代表作:《楚留香传奇系列》、《陆小凤系列》、《萧十一郎系列》
上面代码中,我们使用PromptTemplate对队列中的数据进行了格式化。
有了examples和example_prompt,我们就可以构建FewShotPromptTemplate了:
prompt = FewShotPromptTemplate(examples=examples, example_prompt=example_prompt, suffix="问题: {input}", input_variables=["input"]
)print(prompt.format(input="请问工具人的代表作是什么?"))
这里输出的内容和我们最开始的内容是一样的。
使用ExampleSelector
在上面的例子中,我们实际上是把所有的shot examples都提交给了大语言模型,但实际上并不是必须的。因为有些examples跟问题是没有关联关系的。
所以langchain给我们提供了一个类叫做ExampleSelector,可以通过这个selector来选择跟我们问题相关的一些examples,从而减少不必要的内容传输。
这里我们使用SemanticSimilarityExampleSelector,它的作用是根据语义的相似度来选择examples:
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddingsexample_selector = SemanticSimilarityExampleSelector.from_examples(# 要选择的examplesexamples,# embedding用来判断文本的相似度OpenAIEmbeddings(),# 向量数据库,用来存储embeddingsChroma,# 最终要选择的长度k=1
)# 选择最为相似的作为输入
question = "请问工具人的代表作是什么?"
selected_examples = example_selector.select_examples({"question": question})
print(f"下面是和这个问题最相似的examples: {question}")
for example in selected_examples:print("\n")for k, v in example.items():print(f"{k}: {v}")
最后,我们同样的把ExampleSelector和FewShotPromptTemplate结合起来一起使用:
prompt = FewShotPromptTemplate(example_selector=example_selector, example_prompt=example_prompt, suffix="问题: {input}", input_variables=["input"]
)print(prompt.format(input="请问工具人的代表作是什么?"))
总结
如果你有一些简单的内容需要提供给大语言模型,那么可以使用这个方式。但是如果你有很多内容的话,比如知识库。这种实现就处理不了了。那么如何构建一个知识库应用呢?我们后续分享。
相关文章:
在langchain中使用带简短知识内容的prompt template
简介 langchain中有个比较有意思的prompt template叫做FewShotPromptTemplate。 他是这句话的简写:“Prompt template that contains few shot examples.” 什么意思呢?就是说在Prompt template带了几个比较简单的例子。然后把这些例子发送给LLM&…...

java医院电子病历系统源码:云端SaaS服务 前后端分离模式开发和部署
电子病历系统是什么? 电子病历是指医务人员在医疗活动过程中,使用医疗机构信息系统生成的文字、符号、图表、图形、数据、影像等数字化信息,并能实现存储、管理、传输和重现的医疗记录,是病历的一种记录形式。 医院通过电子病历以电子化方式记录患者就诊的信息&…...

【Golang 接口自动化01】使用标准库net/http发送Get请求
目录 发送Get请求 响应信息 拓展 资料获取方法 发送Get请求 使用Golang发送get请求很容易,我们还是使用http://httpbin.org作为服务端来进行演示。 package mainimport ("bytes""fmt""log""net/http""net/url&qu…...

Excel透视表与python实现
目录 一、Excel透视表 1、源数据 2、数据总分析 3、数据top分析 二、python实现 1、第一张表演示 2、第二张表演示 一、Excel透视表 1、源数据 1)四个类目,每类50条数据 2)数据内容 2、数据总分析 1)选择要分析的字段&…...

二级制部署kubernetes(1.20)
😘作者简介:一名运维工作人员。 👊宣言:人生就是B(birth)和D(death)之间的C(choise),做好每一个选择。 🙏创作不易,动动小…...

云曦暑期学习第二周——文件上传漏洞
1.文件上传 1.1原理 一些web应用程序中允许上传图片、视频、头像和许多其他类型的文件到服务器中。 文件上传漏洞就是利用服务端代码对文件上传路径变量过滤不严格将可执行的文件上传到一个到服务器中 ,再通过URL去访问以执行恶意代码。 1.2为什么存在文件上传漏…...
软件测试右移的意义与关键点
测试右移是将测试延伸到研发阶段之后的阶段,一般在产品发布上线后进行的测试,包括在线测试,在线监控和日志分析,甚至包括α测试、β测。测试右移描述的是软件测试工作重心的转变,而不是某项具体的测试技术。 测试右移的含义 测试…...

VLAN原理(Virtual LAN 虚拟局域网)
VLAN(Virtual LAN 虚拟局域网) 1、广播/广播域 2、广播的危害:增加网络/终端负担,传播病毒, 3、如何控制广播?? 控制广播隔离广播域 路由器物理隔离广播 路由器隔离广播缺点&…...
YOLOv8 如何进行目标追踪
检测模型 YOLOv8n 追踪效果 YOLOv8 检测-追踪 分割模型 YOLOv8n-seg 追踪效果 YOLOv8 分割-追踪 关键点模型 YOLOv8n-pose 追踪效果 YOLOv8 检测-追踪 原理解析 目标检测是指在图像或视频中定位并识别出一个或多个目标物体的位置和类别。 目标检测算法通常会输出目标的边界框…...

【暑期每日一练】 day10
目录 选择题 (1) 解析: (2) 解析: (3) 解析: (4) 解析: (5) 解析: 编程题 题一 …...

antd中的Cascader级联选择框怎么清空重置React
项目场景: React项目,使用antd中的Cascader级联选择框 问题描述: 通过其他按钮无法重置选择框中的项 原因分析:(对应解决办法一和二) 1、级联选择框的数据默认是根据options绑定的数组中的value值来进行…...

复现YOLOv5改进最新MPDIoU:有效和准确的边界盒回归的损失,打败G/E/CIoU,效果明显!!!
MPDIoU: A Loss for Efficient and Accurate Bounding Box Regression 论文简介MPDIoU核心设计思路论文方法实验部分加入YOLOv5代码论文地址:https://arxiv.org/pdf/2307.07662.pdf 论文简介 边界盒回归(Bounding box regression, BBR)广泛应用于目标检测和实例分割,是目标…...

低代码在数智化时代中的应用
随着科技的发展,企业从生产到经营中海量的数据持续被记录。数据是望远镜,发现完全不同的商业边界;数据是显微镜,判断肉眼察觉不到的消费和生活行为;数据是雷达,帮助企业提前预测未来的行为。 而通过人工智…...

应用层协议——http
文章目录 1. HTTP协议1.1 认识URL1.2 urlencode和urldecode1.3 HTTP协议格式1.3.1 HTTP请求1.3.2 HTTP响应1.3.3 外网测试1.3.4 添加html文件1.3.5 HTTP常见Header1.3.6 GET和POST 1.4 HTTP的状态码1.4.1 301和3021.4.2 代码实现 1.5 Cookie1.5.1 代码验证1.5.2 Cookiesession …...

element-tree-line el-tree 添加结构线 添加虚线
概览:给element组件添加上虚线,通过使用插件element-tree-line 参考连接: 参考别人的博客 安装插件: # npm npm install element-tree-line -S # yarn yarn add element-tree-line -S main.js全局注册引入插件: imp…...

【Lua学习笔记】Lua进阶——函数和闭包
文章目录 函数函数嵌套闭包Closures可变函数函数重载 函数 函数嵌套 function A()print("这里是函数A")return function ()print("返回函数不要起名")end end B A() B()输出: 这里是函数A 返回函数不要起名使用函数嵌套的用法,我…...

大学生竞赛管理系统springboot比赛报名信息java jsp源代码mysql
本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 大学生竞赛管理系统springboot 系统有3权限ÿ…...

UnixBench 5.1.3 银河麒麟桌面操作系统V10 (SP1) ARM64 aarch64 图形性能测试 2d 3d, glmark2 3d测试
编译 安装libgl sudo apt install libgl-dev yeqiangyeqiang-greatwall:~/Downloads/UnixBench$ sudo apt install libgl-dev [sudo] yeqiang 的密码: 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 下列软件包…...

JavaScript高级——ES6基础入门
目录 前言let 和 const块级作用域模板字符串一.模板字符串是什么二.模板字符串的注意事项三. 模板字符串的应用 箭头函数一.箭头函数是什么二.普通函数与箭头函数的转换三.this指向1. 全局作用域中的 this 指向2. 一般函数(非箭头函数)中的this指向3.箭头…...

2023年超越期待的高性能视频剪辑主机推荐| Intel 蝰蛇峡谷测评
1、开箱 蝰蛇峡谷的开箱体验是非常令人兴奋的。首先,打开包装后,你会看到一个精致且高质感的机箱,给人一种专业的感觉。蝰蛇峡谷的外观设计简洁大方,黑色的机箱与红色的Logo相得益彰,展现了其高性能的特点。 在打开机…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

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

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...