【promptulate专栏】ChatGPT框架——两行代码构建一个强大的论文总结助手
前言
如果你经常阅读论文,那么你肯定会遇到以下几个问题:
- 论文晦涩难懂看不明白怎么办?
- 有很多论文需要看,没有那么多精力怎么办?
- 如何快速总结记录论文的一些关键点为我所用?
关于上面的几个问题,本文将会基于当前Python新兴的大语言模型开发框架promptulate来演示使用如何用两行代码快速构建上手构建一个属于自己的论文总结工具。
Promptulate
一个强大的大语言模型自动化与应用开发框架,支持智能决策、消息持久化、外部工具调用、角色预设等功能,开箱即用。 通过promptulate,你可以轻松构建起属于自己的LLM应用程序。
作为一个强大的大语言模型应用开发框架,其主要有以下特性:
- 大语言模型支持:支持不同类型的大语言模型的扩展接口
- 对话终端:提供简易对话终端,直接体验与大语言模型的对话
- 角色预设:提供预设角色,以不同的角度调用GPT
- 长对话模式:支持长对话聊天,支持多种方式的对话持久化
- 外部工具:集成外部工具能力,可以进行网络搜索、执行Python代码等强大的功能
- KEY池:提供API key池,彻底解决key限速的问题
- 智能代理人:集成ReAct,self-ask等高级Agent,结合外部工具赋能LLM
- 中文优化:针对中文语境进行特别优化,更适合中文场景
- 数据导出:支持markdowm等格式的对话导出
- 对话总结:提供API式的对话总结、翻译、标题生成
- 高级抽象,支持插件扩展、存储扩展、大语言模型扩展
在架构上,promptulate
主要由以下几部分组成:
Agent
更高级的执行器,负责复杂任务的调度和分发framework
框架层,实现不同类型的prompt框架,包括最基础的Conversation
模型,还有self-ask
和ReAct
等模型。llm
大语言模型,负责生成回答,可以支持不同类型的大语言模型memory
负责对话的存储,支持不同的存储方式及其扩展,如文件存储、数据库存储等tools
提供外部工具扩展调用,如搜索引擎、计算器等preset roles
提供预设角色,进行定制化对话provider
为framework和agent提供tools和其他细粒度能力的集成
Promptulate快速上手
安装最新版
打开终端,输入下面命令下载promptulate
最新版,-U
表示更新到最新版,如果你已经下载promptulate
旧版本,那么执行此命令会更新到最新版。promptulate
当前正处于快速发展阶段,因此你可能需要经常更新最新版以享用最新的成果。
pip install -U promptulate
基本使用
下列文档全部使用
OPENAI GPT3.5
进行测试
KEY配置
在使用promptulate
之前,你需要先导入你的OPENAI_API_KEY
import os
os.environ['OPENAI_API_KEY'] = "your-key"
在你第一次使用的时候,需要使用os.environ["OPENAI_API_KEY"]
导入"OPENAI_API_KEY" 的环境变量,但是在第一运行之后promptulate
会进行缓存,即后面再运行就不需要再导入key了。如果你的key过期了,可以尝试重新按照上面的方法导入key,或者你也可以把cache
文件给删除掉,Windows的cache
在当前目录下,linux的cache
在/tmp
下。
LLM
详细文档请跳转LLM
promptulate
的架构设计可以轻松兼容不同的大语言模型扩展,在promptulate
中,llm负责最基本的内容生成部分,因此为最基础的组件。
下面的示例展示了如何使用OpenAI进行交互。
from promptulate.llms import OpenAI
llm = OpenAI()
answer = llm("请解释一下引力波的放射与广义相对论的必然关系")
print(answer)
输出结果如下:
广义相对论是一种描述引力如何影响时空的物理学理论,它指出当物质和能量聚集在一起时,它们弯曲了周围的时空,引起了引力。质量和能量更大的物体会导致更大
的时空弯曲,这就是为什么地球会围绕太阳旋转。根据广义相对论,当物质或能量在空间中运动时,它们会产生引力波,就像在水面上产生涟漪一样。引力波是一种类
似电磁波的波动,但它们是由物质和能量的弯曲引起的,而电磁波是由电荷的振动引起的。引力波是极微弱的,但是当强烈的引力场存在(例如在引力天体碰撞或超新
星爆炸等事件中),它们可以被探测到。事实上,2015年,激光干涉引力波天文台利用引力波探测器直接探测到了引力波,并为广义相对论提供了强有力的证据。因
此,引力波的放射与广义相对论必然关系紧密。通过引力波,我们可以更加深入地了解时空的性质,并进一步验证这个理论。
Key池
promptulate
为OpenAI进行特别优化,构建了Key池,如果你使用的是GPT3.5
5美元的账号,一定会遇到限速的问题,这个时候,如果你有一堆Key,就可以很好的解决这个问题。promptulate
的LRU KEY轮询机制巧妙的解决了限速的问题,你可以使用LLM随意地进行提问(前提是你有够多的key)。此外,如果你既有GPT4
和GPT3.5
的KEY,KEY池也可以不同模型的KEY调度,你可以按照下面的方式将key导入到你的key池中。
from promptulate.llms import OpenAI
from promptulate.utils import export_openai_key_pool
keys = [
{"model": "gpt-3.5-turbo", "key": "xxxxx"},
{"model": "gpt-3.5-turbo", "key": "xxxxx"},
{"model": "gpt-3.5-turbo", "key": "xxxxx"},
{"model": "gpt-4", "key": "xxxxx"},
]
export_openai_key_pool(keys)
llm = OpenAI()
for i in range(10):
llm("你好")
上面的示例中,当你使用了export_openai_key_pool(keys)
之后,cache会进行缓存,因此在下一次执行的时候,你就无需再导入key或key pool就可以使用OpenAI进行推理了。
需要注意的是,cache会初始化key pool中的数据,因此如果你的一些key失效了,可以尝试重新执行该命令进行初始化操作,或者你可以使用如下删除key_pool中的指定key。
from promptulate.utils.openai_key_pool import OpenAIKey, OpenAIKeyPool
key_pool: OpenAIKeyPool = OpenAIKeyPool()
key_pool.delete("your key")
使用下面的方式可以进行查询当前key_pool中的所有key。
from promptulate.utils.openai_key_pool import OpenAIKey, OpenAIKeyPool
key_pool: OpenAIKeyPool = OpenAIKeyPool()
keys = key_pool.all()
for key in keys:
print(key)
输入如下所示:
{'__name__': 'OpenAIKey', '__unique_id__': '62f56487-d528-4f5c-84bb-9c2a3df7354e', 'model': 'gpt-3.5-turbo', 'key': 'key1'}
{'__name__': 'OpenAIKey', '__unique_id__': 'ac3abd29-c62e-458d-b3cc-3f825594910f', 'model': 'gpt-3.5-turbo', 'key': 'key2'}
{'__name__': 'OpenAIKey', '__unique_id__': 'c90ab3c2-e6c0-4a16-a2f9-a298d6290218', 'model': 'gpt-3.5-turbo', 'key': 'key3'}
{'__name__': 'OpenAIKey', '__unique_id__': 'c13b1965-5034-4463-9409-2ad90ba1d260', 'model': 'gpt-3.5-turbo', 'key': 'key4'}
使用Promptulate构建论文总结工具
下面展示如何使用promptulate
构建属于自己的论文总结工具。
上面章节说到过,promptulate
具有tools模块,tools模块为LLM提供了调用外部工具扩展的能力,可以说tools是走向智能化的第一步,通过tools来为LLM构建一套感知反馈系统,可以为LLM应用开发提供更多的可能性。
当前promptulate
支持以下几种工具:
- DuckDuckGo Search: DDG搜索引擎
- Arxiv: Arxiv论文检索工具
- Semantic Scholar: Semantic Scholar论文检索工具,可以检索论文、查询论文参考文献、查询引用该论文的文献
- Python REPL: 可以执行python脚本
- FileManager: 可以进行文件读写
- ...
在promptulate
中,为了构建更加智能的Agent,一些提供给Agent的Tool也是有大语言模型调用权限的,它们一般有一些简单的能力处理功能。如果你有需要,你可以直接使用这些带有LLM的Tool,本文将会介绍的PaperSummaryTool就是一个带有大语言模型的Tool。
接下来我们使用PaperSummaryTool来演示一下给Tool赋能LLM之后的表现,下面的示例展示了使用PaperSummaryTool搜索论文attention is all you need
from promptulate.tools.paper.tools import PaperSummaryTool
from promptulate.utils.logger import get_logger, enable_log
enable_log()
def main():
tool = PaperSummaryTool()
result = tool.run("attention is all you need")
# you can also input an arxiv id as follows
# result = tool.run("2303.09014")
print(result)
if __name__ == "__main__":
main()
输出结果如下
标题:注意力就是你所需要的
摘要:目前主流的序列转换模型基于复杂的循环或卷积神经网络,采用编码器-解码器结构。表现最好的模型还通过注意力机制连接编码器和解码器。我们提出了一种新的简单网络架构——Transformer,仅基于注意力机制,完全摒弃了循环和卷积。在两个机器翻译任务上的实验表明,这些模型在质量上优于其他模型,同时更易于并行化,训练时间显著缩短。我们的模型在WMT 2014年英德翻译任务上实现了28.4 BLEU的成绩,超过了现有最佳结果,包括集成模型,提高了2个BLEU。在WMT 2014年英法翻译任务中,我们的模型在8个GPU上训练3.5天后,实现了新的单模型最优BLEU得分41.8,训练成本仅为文献中最佳模型的一小部分。我们证明Transformer在其他任务上具有很好的泛化能力,成功地将其应用于英语成分句法分析,无论是大规模还是有限的训练数据。
关键词:Transformer, attention mechanism, machine translation, BLEU score, parallelizable, training time, generalization.
关键见解:
- 传统的序列转换模型基于复杂的循环或卷积神经网络,而最好的模型通过注意力机制连接编码器和解码器。
- 本文提出了一种新的简单网络架构——Transformer,仅基于注意力机制,完全摒弃了循环和卷积。在机器翻译任务上,这种模型在质量上表现更好,同时更易于并行化,训练时间显著缩短。
- 本文的模型在WMT 2014英德翻译任务上取得了28.4 BLEU的成绩,在WMT 2014英法翻译任务上取得了41.8 BLEU的成绩,成为了单模型下的最佳结果。
经验教训:
- 注意力机制是一种有效的连接编码器和解码器的方式,可以提高序列转换模型的性能。
- 简单的网络架构也可以取得很好的效果,不一定需要复杂的循环或卷积结构。
- Transformer模型具有很好的泛化能力,可以成功应用于其他任务,如英语成分句法分析。
相关建议:
- 进一步探究Transformer网络结构的优化方法,提高其在不同任务上的表现。
- 尝试将Transformer应用于其他自然语言处理任务,如文本分类、命名实体识别等。
- 研究如何在Transformer中引入外部知识,如知识图谱等,以提高其对语义的理解和表达能力。
- 探索如何将Transformer应用于多语言翻译任务,以实现更加高效和准确的跨语言翻译。
- 研究如何在Transformer中引入对抗训练等方法,以提高其对抗攻击的鲁棒性。
相关论文:
[1] [Convolutional Sequence to Sequence Learning](https://www.semanticscholar.org/paper/43428880d75b3a14257c3ee9bda054e61eb869c0)
[2] [Massive Exploration of Neural Machine Translation Architectures](https://www.semanticscholar.org/paper/4550a4c714920ef57d19878e31c9ebae37b049b2)
[3] [A Structured Self-attentive Sentence Embedding](https://www.semanticscholar.org/paper/204a4a70428f3938d2c538a4d74c7ae0416306d8)
[4] [Factorization tricks for LSTM networks](https://www.semanticscholar.org/paper/79baf48bd560060549998d7b61751286de062e2a)
[5] [Structured Attention Networks](https://www.semanticscholar.org/paper/13d9323a8716131911bfda048a40e2cde1a76a46)
[6] [Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer](https://www.semanticscholar.org/paper/510e26733aaff585d65701b9f1be7ca9d5afc586)
[7] [Neural Machine Translation in Linear Time](https://www.semanticscholar.org/paper/98445f4172659ec5e891e031d8202c102135c644)
[8] [Can Active Memory Replace Attention?](https://www.semanticscholar.org/paper/735d547fc75e0772d2a78c46a1cc5fad7da1474c)
[9] [Xception: Deep Learning with Depthwise Separable Convolutions](https://www.semanticscholar.org/paper/5b6ec746d309b165f9f9def873a2375b6fb40f3d)
[10] [Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation](https://www.semanticscholar.org/paper/dbde7dfa6cae81df8ac19ef500c42db96c3d1edd)
输出结果已经被排版成markdown格式的数据,因此很适合被渲染出来显示。
此外,上面的例子中,含有多步的LLM推理(四次推理过程)和多次API调用(从Arxiv和Semantic Scholar中获取论文、引用等相关数据),但是prompulate
的事件总线并行机制大大化简了推理总时间,平均推理时间保持在十几秒(具体事件取决于网络环境)。
因为采用并行机制,因此在使用有LLM能力的Tool或者Agent时会在同一时间内快速地多次调用API,如果你的key有限速问题,推荐你使用key-pool来解决key限速的问题(如果你是5美元的key)。
总结
本文主要介绍了如何使用大语言模型开发框架promptulate构建一个论文总结助手,通过promptulate,我们还可以构建很多有意思的应用程序,如让GPT调用搜索引擎,文件检索等,后续的文章会陆续更新。
【promptulate专栏】ChatGPT框架——两行代码构建一个强大的论文总结助手的更多相关文章
- 从实体框架核心开始:构建一个ASP。NET Core应用程序与Web API和代码优先开发
下载StudentApplication.Web.zip - 599.5 KB 下载StudentApplication.API.zip - 11.5 KB 介绍 在上一篇文章中,我们了解了实体框架的 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章 ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架 ...
- 从零构建一个简单的 Python Web框架
为什么你想要自己构建一个 web 框架呢?我想,原因有以下几点: 你有一个新奇的想法,觉得将会取代其他的框架 你想要获得一些名气 你遇到的问题很独特,以至于现有的框架不太合适 你对 web 框架是如何 ...
- .Net 从零开始构建一个框架之基本实体结构与基本仓储构建
本系列文章将介绍如何在.Net框架下,从零开始搭建一个完成CRUD的Framework,该Framework将具备以下功能,基本实体结构(基于DDD).基本仓储结构.模块加载系统.工作单元.事件总线( ...
- 如何在Visual Studio 2017中使用C# 7+语法 构建NetCore应用框架之实战篇(二):BitAdminCore框架定位及架构 构建NetCore应用框架之实战篇系列 构建NetCore应用框架之实战篇(一):什么是框架,如何设计一个框架 NetCore入门篇:(十二)在IIS中部署Net Core程序
如何在Visual Studio 2017中使用C# 7+语法 前言 之前不知看过哪位前辈的博文有点印象C# 7控制台开始支持执行异步方法,然后闲来无事,搞着,搞着没搞出来,然后就写了这篇博文,不 ...
- 快速构建一个完整的Selenium框架
今天跟大家细讲如何构建一个完整的selenium框架,当你学会了这一篇你就也可以说自己会selenium自动化测试了. 1.新建项目,结构如图: 注意:整个项目除了最外层的是文件夹,其他的都是包(pa ...
- 开源低代码平台开发实践二:从 0 构建一个基于 ER 图的低代码后端
前后端分离了! 第一次知道这个事情的时候,内心是困惑的. 前端都出去搞 SPA,SEO 们同意吗? 后来,SSR 来了. 他说:"SEO 们同意了!" 任何人的反对,都没用了,时代 ...
- 抛弃EF,20分构建一个属于自己的ORM框架
Poiuyt_cyc 博客园首页新随笔联系订阅管理随笔 - 11 文章 - 0 评论 - 111 抛弃EF,20分构建一个属于自己的ORM框架 相信EF大家都不陌生了,因为数据库表跟程序实体是一一 ...
- [资源共享]C#+AE构建GIS桌面端应用系统框架-全代码
转自:http://www.cnblogs.com/gispeng/archive/2008/10/06/1304534.html [资源共享]C#+AE构建GIS桌面端应用系统框架-全代码 ( ...
- 构建NetCore应用框架之实战篇(一):什么是框架,如何设计一个框架
一.系列简述 本篇起,将通过一系列文章,去描述如何构建一个应用开发框架,并以作者开发的框架为例,逐个点展开分析,如何从零开始,构建自己的开发框架. 本系列文章的目的,是带领有一编程经验的人,通过动手, ...
随机推荐
- 全网最详细 二进制 k8s v1.25.x文档
二进制安装k8s v1.25.0 IPv4/IPv6双栈 Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes(k8s)二进制高可用安装部署,支持IPv4+IPv6双栈 ...
- [Linux]CentOS查看RPM包依赖问题
[经典应用案例] 查看此文前,可先查看 此博文中:在安装软件过程中,如何解决的依赖组件问题? [数据库/Linux]CentOS7安装MySQL Percona版(RPM方式) : 2-1 依赖组件问 ...
- [Linux]常用命令之【systemctl/service/chkconfig/pstree】
1 systemctl 1-0 systemctl 基本使用 systemctl start/stop/restart/status sshd systemctl enable/disable ssh ...
- dotnet初探:用miniapi创建一个自己的url
致谢 首先写在前面,非常感谢微软mvp桂素伟先生的技术分享,因为微软的文档大部分都如机器翻译般的生硬,让人难以读下去,正是他的无私分享为我的.net学习旅程提供了方向,非常感谢.如果大家对他比较感兴趣 ...
- Python 字典定义
字典 能将相关信息关联起来 可存储的信息几乎不受限制 # 案例1 alien_0 = {'color':'green','points':5} print(alien_0['color']) prin ...
- MySQL(Zip版)安装配置
MySQL官网下载地址:MySQL 将压缩包内文件夹解压至任意目录,以mysql-5.7.40版本为例 第一步 添加环境变量 将mysql-5.7.40-winx64文件夹内的bin文件夹添加到环境变 ...
- Django笔记三十九之settings配置介绍
本文首发于公众号:Hunter后端 原文链接:Django笔记三十九之settings配置介绍 这一篇笔记介绍 Django 里 settings.py 里一些常用的配置项,这些配置有一些是在之前的笔 ...
- selenium IDE插件的配置使用
开头 Selenium提供了一个可以自动录制脚本的插件 叫selenium IDE 让我们一起看看如何安装使用 安装 因为google扩展商城大多数人用不了,所以我们选用的是edag来下载seleni ...
- 2023-01-03:超过5名学生的课。编写一个SQL查询来报告 至少有5个学生 的所有班级,返回结果不限顺序。请问sql语句如何写? +---------+ | class | +-----
2023-01-03:超过5名学生的课.编写一个SQL查询来报告 至少有5个学生 的所有班级,返回结果不限顺序.请问sql语句如何写? ±--------+ | class | ±--------+ ...
- 2020-01-04:mysql里的innodb引擎的数据结构,你有看过吗?
福哥答案2020-01-04: 面试官刚开始问我看过mysql源码没,然后问了这个问题.回答B+树,过不了面试官那关.答案来自<MySQL技术内幕 InnoDB存储引擎 第2版>第四章,时 ...