- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
本文节选自笔者博客: https://www.blog.zeeland.cn/archives/019hasaa 。
如果你经常阅读论文,那么你肯定会遇到以下几个问题:
关于上面的几个问题,本文将会基于当前Python新兴的大语言模型开发框架 promptulate 来演示使用如何用两行代码快速构建上手构建一个属于自己的论文总结工具.
一个强大的大语言模型自动化与应用开发框架,支持智能决策、消息持久化、外部工具调用、角色预设等功能,开箱即用。 通过promptulate,你可以轻松构建起属于自己的LLM应用程序.
项目地址: https://github.com/Undertone0809/promptulate 。
官方文档: promptulate document 。
作为一个强大的大语言模型应用开发框架,其主要有以下特性:
在架构上, promptulate 主要由以下几部分组成:
Agent
更高级的执行器,负责复杂任务的调度和分发 framework
框架层,实现不同类型的prompt框架,包括最基础的 Conversation
模型,还有 self-ask
和 ReAct
等模型。 llm
大语言模型,负责生成回答,可以支持不同类型的大语言模型 memory
负责对话的存储,支持不同的存储方式及其扩展,如文件存储、数据库存储等 tools
提供外部工具扩展调用,如搜索引擎、计算器等 preset roles
提供预设角色,进行定制化对话 provider
为framework和agent提供tools和其他细粒度能力的集成 打开终端,输入下面命令下载 promptulate 最新版, -U 表示更新到最新版,如果你已经下载 promptulate 旧版本,那么执行此命令会更新到最新版。 promptulate 当前正处于快速发展阶段,因此你可能需要经常更新最新版以享用最新的成果.
pip install -U promptulate
下列文档全部使用 OPENAI GPT3.5 进行测试 。
在使用 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 。
promptulate 的架构设计可以轻松兼容不同的大语言模型扩展,在 promptulate 中,llm负责最基本的内容生成部分,因此为最基础的组件.
下面的示例展示了如何使用OpenAI进行交互.
from promptulate.llms import OpenAI
llm = OpenAI()
answer = llm("请解释一下引力波的放射与广义相对论的必然关系")
print(answer)
输出结果如下:
广义相对论是一种描述引力如何影响时空的物理学理论,它指出当物质和能量聚集在一起时,它们弯曲了周围的时空,引起了引力。质量和能量更大的物体会导致更大
的时空弯曲,这就是为什么地球会围绕太阳旋转。根据广义相对论,当物质或能量在空间中运动时,它们会产生引力波,就像在水面上产生涟漪一样。引力波是一种类
似电磁波的波动,但它们是由物质和能量的弯曲引起的,而电磁波是由电荷的振动引起的。引力波是极微弱的,但是当强烈的引力场存在(例如在引力天体碰撞或超新
星爆炸等事件中),它们可以被探测到。事实上,2015年,激光干涉引力波天文台利用引力波探测器直接探测到了引力波,并为广义相对论提供了强有力的证据。因
此,引力波的放射与广义相对论必然关系紧密。通过引力波,我们可以更加深入地了解时空的性质,并进一步验证这个理论。
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 具有tools模块,tools模块为LLM提供了调用外部工具扩展的能力,可以说tools是走向智能化的第一步,通过tools来为LLM构建一套感知反馈系统,可以为LLM应用开发提供更多的可能性.
当前 promptulate 支持以下几种工具:
在 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框架——两行代码构建一个强大的论文总结助手的文章就讲到这里了,如果你想了解更多关于【promptulate专栏】ChatGPT框架——两行代码构建一个强大的论文总结助手的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Stackoverflow JS Genius的! 我当前的项目有一个问题,它正在使用 Node 的HTTP createServer,并使用Formidable来解析主体数据。 请参阅下面的代码。
我正在尝试将文件上传到我的 NodeJS 服务器。我目前收到错误: 错误:错误的内容类型 header ,未知的内容类型:image/jpeg “image/jpeg”是有效的 MIME 类型,为什么
我有一个用作路由器的 Node.JS 服务器,可以向它发出 post 请求以上传文件,应该只允许 jpg/png/jpeg 扩展名我目前正在做的是: var form = new formidable
我正在使用https://github.com/felixge/node-formidable用于使用express上传文件。 虽然它工作得很好,但有一个问题:我有一个包含 9 个 type="fil
Haskell 的类型推理引擎比 Scala 的类型推理引擎强大得多。在 Haskell 中,我很少需要显式编写类型,而在 Scala 中,类型只能在表达式中推断,而不能在方法定义中推断。 例如,请参
我将 Superpowered 用于各种实时 FX,它们都非常简单。然而,音高变换是另一回事,我认为事实上是因为它基于时间拉伸(stretch)算法,当然必须处理随时间变化的输出,这比应用 EQ 或混
我正在使用mean stack 和formidable上传文件 表单具有 multipart/form-data 属性 exports.create = function(req, res) {
我正在尝试构建我的第一个 node.js 应用程序,但是,使用 node server.js 运行时,我收到以下错误消息: connect: multipart: use parser (multip
对于强大的 npm 包,当我使用 import * as formidable from "formidable" 时,我收到一条错误消息,指出 formidable({ multiples: tru
我注意到了 std::string str; str += 'b'; // works str.append('b'); // does not work str.append(1, 'b'); //
我有一个需要访问本地 FS 的 HTML/JS(YUI 框架)照片管理器。我应该将 HTML/JS 移动到 AIR,还是硬着头皮将其“移植”到 Flex AIR? 我知道营销说的是什么,但我想要真正的
我是一名优秀的程序员,十分优秀!