在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 PromptTemplate
examples = [
{
"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 OpenAIEmbeddings
example_selector = SemanticSimilarityExampleSelector.from_examples(
# 要选择的examples
examples,
# embedding用来判断文本的相似度
OpenAIEmbeddings(),
# 向量数据库,用来存储embeddings
Chroma,
# 最终要选择的长度
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的更多相关文章
- shell脚本中使用echo显示带颜色的内容
shell脚本中使用echo显示带颜色的内容,需要使用参数-e 格式如下: echo -e "\033[字背景颜色;文字颜色m字符串\033[0m" 例如: echo -e &qu ...
- Keil环境中建立带FreeRTOS的STM32L项目
本文是网上转载,版权所有. Keil环境中建立带FreeRTOS的STM32L项目 1.先把source文件夹复制至project目录,然后在keil中添加RTOS文件,如图: 其中heap_2.c按 ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework中web相关的知识(概述)
Spring Framework中web相关的知识 1.概述: 参考资料:官网documentation中第22小节内容 关于spring web mvc: spring framework中拥有自 ...
- ReactiveCocoa基础知识内容
本文记录一些关于学习ReactiveCocoa基础知识内容,对于ReactiveCocoa相关的概念如果不了解可以网上搜索:RACSignal有很多方法可以来订阅不同的事件类型,ReactiveCoc ...
- java中不带package和带package的编译运行方式
Java中不带package的程序和带package的程序编译的方式是不同的. 一.不带package的程序建立个HelloWorld.java的文件,放入C:\,内容如下:public class ...
- PHPExcell单元格中某些时间格式的内容不能正确获得的处理办法
今天在写导入功能的时候某个时间格式的单元格内容不能正确获得,得出的是一串非时间戳的数字. 此时可以使用PHPExcell中自带的方法进行处理:PHPExcel_Shared_Date::ExcelTo ...
- 切记ajax中要带上AntiForgeryToken防止CSRF攻击
在程序项目中经常看到ajax post数据到服务器没有加上防伪标记,导致CSRF被攻击,下面小编通过本篇文章给大家介绍ajax中要带上AntiForgeryToken防止CSRF攻击,感兴趣的朋友一起 ...
- OC中最难的一部分内容:内存管理
OC中最难的一部分内容:内存管理为什么说他难呢?因为内存如果需要我们程序员去管理的话,那个难度肯定是很大的,如果是Java,垃圾回收器会把这份工作给做了,我们不需要关心,但是就是因为如此,Androi ...
- WPF自学入门(六)WPF带标题的内容控件简单介绍
在WPF自学入门(二)WPF-XAML布局控件的文章中分别介绍StackPanel,WarpPanel,DockPanel,Grid,Canvas五种布局容器的使用,可以让我们大致了解容器可以使用在什 ...
- 盘点 Python 中的那些冷知识(二)
上一篇文章分享了 Python中的那些冷知识,地址在这里 盘点 Python 中的那些冷知识(一) 今天将接着分享!! 06. 默认参数最好不为可变对象 函数的参数分三种 可变参数 默认参数 关键字参 ...
随机推荐
- Java 新的生态型应用开发框架,Solon v2.2.13 发布
Java 新的生态型应用开发框架,Solon :更快.更小.更简单.从零开始构建,有自己的标准规范与开放生态: 150多个生态插件,可以满足各种场景开发 大量的国产框架适配,可以为应用软件国产化提供更 ...
- vue项目PC端如何适配不同分辨率屏幕
配置前言 项目构建:基于vue-cli3构建,使用postcss-px2rem px2rem-loader插件进行rem适配实现原理:每次打包,webpack通过使用插件postcss-px2rem, ...
- Ajax 以及 Ajax基于Promise封装
AJAX - 创建 XMLHttpRequest 对象 var xmlhttp = new XMLHttpRequest(); 通过打印实例对象我们发现,我们打印的是 xmlhttp 对象,里面所有的 ...
- 基于pip的python包管理工具
以下是软件下载链接:https://mysecreat.lanzoub.com/i5yvf0swgtne 软件功能:可以对python包进行安装.卸载.升级.换源等操作,不用输入复杂命令 源码: im ...
- JavaWeb之day02css与js
目录: 1.CSS概述和与HTML的结合方式(四种)(*******) 2.CSS的基本选择器(******) 3.CSS的扩展选择器(了解) 4.CSS的盒子模型(了解) 5.CSS的布局(浮动)( ...
- 2021-11-08:扁平化嵌套列表迭代器。给你一个嵌套的整数列表 nestedList 。每个元素要么是一个整数,要么是一个列表;该列表的元素也可能是整数或者是其他列表。请你实现一个迭代器将其扁平化
2021-11-08:扁平化嵌套列表迭代器.给你一个嵌套的整数列表 nestedList .每个元素要么是一个整数,要么是一个列表:该列表的元素也可能是整数或者是其他列表.请你实现一个迭代器将其扁平化 ...
- 2021-10-03:合并两个有序数组。非递减数组nums1和nums2。合并这两个数组并放在nums1中。力扣88。
2021-10-03:合并两个有序数组.非递减数组nums1和nums2.合并这两个数组并放在nums1中.力扣88. 福大大 答案2021-10-03: 从右往左遍历nums1和nums2,谁大拷贝 ...
- json在线效验检测工具
json在线效验检测工具:https://www.sojson.com/ 解析结果: { 'os_type': 'Windows', 'os_release': '10 64bit 10.0.1904 ...
- drf——restful规范、序列化反序列化、drf介绍和快速使用、drf之APIView源码
1.restful规范 # restful是一种定义API接口的设计风格,API接口的编写规范,尤其适用于前后端分离的应用模式中 这种风格的理念人为后端开发任务就是提供数据的,对外提供的是数据资源的访 ...
- js 字符串格式数组转为数组对象
工作中经常会遇到将json字符串转换为json对象,但是将字符串格式数组转为数组对象的场景却不多 如: 其中label_exp: "["cap_pop","wk ...