【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调用搜索引擎,文件检索等,后续的文章会陆续更新。