在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="请问工具人的代表作是什么?"))

总结

如果你有一些简单的内容需要提供给大语言模型,那么可以使用这个方式。但是如果你有很多内容的话,比如知识库。这种实现就处理不了了。那么如何构建一个知识库应用呢?我们后续分享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/15243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用serverless实现从oss下载文件并压缩

公司之前开发一个网盘系统, 可以上传文件, 打包压缩下载文件, 但是在处理大文件的时候, 服务器遇到了性能问题, 主要是这个项目是单机部署.......(离谱), 然后带宽只有100M, 现在用户比之前多很多, 然后所有人的压缩下载请求都给到这一台服务器了, 比如多个人下载的时候带宽问…

在CSDN学Golang云原生(Kubernetes Pod调度)

一,NodeSelector定向调度 在 Kubernetes 中,可以使用 NodeSelector 字段来指定 Pod 调度到哪些节点上运行。NodeSelector 是一个键值对的 map,其中键是节点的标签名,值是标签值。具体步骤如下: 在节点上添加标签 首…

tensorRT多batch动态推理

tensorRT的多batch推理,导出的onnx模型必须是动态batch,只需在导出的时候,设置一个dynamic_axis参数即可。 torch.onnx.export(hybrik_model, dummy_input, "./best_model.onnx", verboseTrue, input_namesinput_names, \output_…

计算机基本硬件的内部结构

1.早期冯诺依曼机结构 世界上第一台计算机ENIAC是使用手动接线来控制计算,十分麻烦。 冯诺依曼提出“存储程序”的概念,是指将指令以二进制代码的形式事先输入计算机的主存储器(内存),然后按照其在存储器中的首地址执…

c++ ,vs2019, cpp20规范之 forward_list 源码分析

通过阅读源码可知,该单向链表不像list双向链表那样有专门的前导节点。即list._Mypair._Myval2._head._next才指向第一个有效数据节点。而 forward_list ._Mypair._Myval2._head 已经指向了有效数据节点。原因就在于复杂巧妙的类型转换。如下图的构造函数里&#xff…

X86、X64和ARM

一、X86、X64架构 X86架构和X64架构(也称为x86-64、AMD64或Intel 64)都是计算机处理器架构的名称,它们都属于x86家族的一部分。这些架构主要用于描述计算机中处理器的指令集和寻址能力。 X86架构 X86指的是支持32位的指令集架构处理器&…

【Matlab】基于长短期记忆网络的时间序列预测(Excel可直接替换数据)

【Matlab】基于长短期记忆网络的时间序列预测(Excel可直接替换数据) 1.模型原理2.数学公式3.文件结构4.Excel数据5.分块代码6.完整代码7.运行结果1.模型原理 "基于长短期记忆网络(Long Short-Term Memory, LSTM)的时间序列预测"是一种使用LSTM神经网络来预测时间…

Spring-ApplictionContext

Spring Spring是整个Java体系最核心的框架,没有之一。 核心类图结构 ApplicationContext ApplicationEventPublisher:提供了一种机制,用于通知应用程序中感兴趣的部分有关其执行过程中发生的特定事件。ListableBeanFactory:是S…

python结合tesseract-ocr识别汉字的训练库过程

一、安装python 例如,安装路径为:C:\rtkapp\python-3.8.0 二、安装opencv 三、安装tesseract-ocr 安装完成后,在系统环境变量path中,添加安装路径C:\rtkapp\Tesseract-OCR 四、打开python安装pytesseract 五、安装java运行环境…

测试开源C#人脸识别模块ViewFaceCore(5:质量检测和眼睛状态检测)

ViewFaceCore模块中的FaceQuality支持预测人脸质量,最初以为是预测人体体重,实际测试过程中才发现是评估人脸图片质量,主要调用Detect函数执行图片质量检测操作,其函数原型如下所示: //// 摘要:// 人脸质量评估///…

Qt+OpenCV+VTK在VS2017中配置路径

QtOpenCVVTK在VS2017中配置路径 《Qt环境配置》《OpenCV环境配置》《VTK环境配置》 《Qt环境配置》 包含目录: D:\Qt\Qt5.12.11\5.12.11\msvc2017_64\include D:\Qt\Qt5.12.11\5.12.11\msvc2017_64\include\QtWidgets D:\Qt\Qt5.12.11\5.12.11\msvc2017_64\include…

[containerd] 初始化流程概览

1. 环境 containerd版本:v1.7.2,containerd debug搭建教程链接操作系统:Ubuntu22.04 2. 初始化流程 containerd的入口为:cmd/containerd/main.go,如下: func main() {// TODO 实例化containerdapp : com…

webstorm配置less转译

Program中路径如果识别不到 项目文件\node_modules.bin\lessc

springCloud Eureka注册中心配置详解

1、创建一个springBoot项目 2、在springBoot项目中添加SpringCloud依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.3</version><type>…

【MySQL数据库备份】

目录 一、概述 二、数据备份的重要性 1. 数据保护 2. 灾难恢复 3. 数据完整性 4. 合规性要求 三、造成数据丢失的原因 1. 硬件故障 2. 人为错误 3. 黑客攻击 4. 自然灾害 5. 软件故障 四、备份类型 1.物理与逻辑角度 1.1 概念 1.2 物理备份 1.2.1 冷备份 1.2…

建造者模式

1.概念 建造者模式是一种创建型设计模式&#xff0c;它允许我们一步一步的来构造对象&#xff0c;其实就是将创建对象的一个过程拆分成了很多个小步骤&#xff0c;常见主要是在一个A类的基础上&#xff0c;加多一个Builder的类&#xff0c;然后属性和A类的一样&#xff0c;我们…

gdb调试时查看汇编代码

在gdb中查看汇编代码&#xff0c;可以使用display命令或x命令。 以下是一个示例程序&#xff0c;我们以它为例来演示如何在gdb中查看汇编代码。 #include <stdio.h> int main() { int a 10; int b 20; int c a b; printf("c %d\n", c); return 0;…

Flutter:滑动面板

前言 无意中发现了这个库&#xff0c;发现现在很多app中都有类似的功能。以手机b站为例&#xff0c;当你在看视频时&#xff0c;点击评论&#xff0c;视频会向上偏移&#xff0c;下方划出评论界面。 sliding_up_panel SlidingUpPanel是一个Flutter插件&#xff0c;用于创建滑…

Stable Diffusion 硬核生存指南:WebUI 中的 VAE

本篇文章聊聊 Stable Diffusion 生态中呼声最高、也是最复杂的开源模型管理图形界面 “stable-diffusion-webui” 中和 VAE 相关的事情。 写在前面 Stable Diffusion 生态中有一个很重要的项目&#xff0c;它对于 SD 生态繁荣做出的贡献可以说居功至伟&#xff0c;自去年八月…

13. Mybatis-Plus

目录 1. MyBatis-Plus 简介 2. 新建项目 3. 添加依赖 4. 配置数据库 5. 编码 1. MyBatis-Plus 简介 通过官网&#xff1a;MyBatis-Plus MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyB…