本文节选自笔者博客: https://www.blog.zeeland.cn/archives/promptulate666
在构建了【prompt-me】一个专为 Prompt Engineer设计LLM Prompt Layer框架架构之后,我发现可以构建一个更强大的LLM框架,于是在肝了几天把prompt-me
完全组件化重构了之后,有了现在这个框架。
promptulate
是一个专为 Prompt Engineer设计LLM Prompt Layer框架,支持连续对话、对话保存、对话内容与标题总结、角色预设、使用外部工具等功能,开箱即用。
通过 promptulate
,你可以轻松构建起属于自己的LLM应用程序。
本项目重构重构重构了两次,在本人深度阅读langchain, Auto-GPT, django, django-rest-framework, gpt_academic...
等大牛项目的源码之后,学习它们的架构、代码设计思路等内容,最终有了现在的版本,相较于之前的老版本prompt-me
,promptulate
重新构建了 llms, message, memory, framework, preset_roles, tools, provider
等模块,将prompt
的各个流程全部组件化,便有了现在的promptualte
框架,但是工作量很大,还在不断地完善细节中,欢迎大家的参与。
在看了当前这么多prompt-engineering
之后,本人的架构设计思想在langchain, Auto-GPT
之上进行不断改进,构建出了一套属于promptualte
的LLM Prompt Layer框架。promptulate
由以下几部分组成:
Conversation
模型,还有self-ask
和ReAct
等模型正在火速开发中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过期了,可以把cache
文件给删除掉,Windows的cache
在当前目录下,linux的cache
在/tmp
下。
promptulate
的架构设计可以轻松兼容不同的大语言模型扩展,在promptulate
中,llm负责最基本的内容生成部分,因此为最基础的组件。下面展示一个OpenAI的示例:
from promptulate.llms import OpenAI
llm = OpenAI()
llm("你知道鸡哥的《只因你太美》?")
'是的,鸡哥的《只因你太美》是这几年非常流行的一首歌曲。'
我想你可能遇到了无法访问的小问题,It's OK, promptulate
提供了三种访问OpenAI的方式,分别是
off
默认的访问方式,不开代理custom
自定义代理方式promptulate
promptulate提供的免费代理服务器promptulate
提供了免费的代理服务器,感谢 ayaka14732
,你可以在不用科学de上网的情况下直接调用OpenAI的相关接口,下面是代理的设置方式:
from promptulate.llms import OpenAI
from promptulate.utils import set_proxy_mode
llm = OpenAI()
llm("你知道鸡哥的《只因你太美》?")
def set_free_proxy():
set_proxy_mode("promptulate")
def set_custom_proxy():
proxies = {'http': 'http://127.0.0.1:7890'}
set_proxy_mode("custom", proxies=proxies)
def turn_off_proxy():
set_proxy_mode("off")
def main():
set_free_proxy()
llm = OpenAI()
llm("你知道鸡哥的《只因你太美》?")
if __name__ == '__main__':
main()
和OPENAI_API_KEY一样,关于代理的配置我也设置了缓存,这意味着你只需要配置一次代理即可(我也太聪明了吧)。事实上
promptulate
提供了关闭全局配置项缓存的功能,但默认开启,不推荐关闭,所以我不告诉你怎么关闭~
Conversation
是framework
中最基础的组件,其支持prompt生成、上下文对话、对话存储、角色预设的基本功能,此外,provider
为其提供了语言翻译、markdown数据导出、对话总结、标题总结等扩展功能。
接下来,我们先从对基础的对话开始,使用Conversation
可以开始一段对话,使用其predict()
函数可以生成回答。
from promptulate import Conversation
conversation = Conversation()
conversation.predict("你知道鸡哥的《只因你太美》吗?")
'是的,鸡哥的《只因你太美》是这几年非常流行的一首歌曲。'
Conversation
默认使用OpenAI GPT3.5
作为LLM,当然,因为其架构设计,Conversation
还可以轻松扩展其他类型的llm(当前暂时只开发了OpenAI,其他大语言模型的扩展正在火速开发中,当然如果你有自己想接入的大语言模型,欢迎你的pr!)
下面是一个更复杂的示例,展示了使用OpenAI作为大语言模型进行对话,使用本地文件进行存储,进行文章总结与标题总结的功能。
from promptulate import Conversation
from promptulate.memory import LocalCacheChatMemory
from promptulate.llms import OpenAI
def main():
memory = LocalCacheChatMemory()
llm = OpenAI(model="gpt-3.5-turbo", temperature=0.9, top_p=1, stream=False, presence_penalty=0, n=1)
conversation = Conversation(llm=llm, memory=memory)
ret = conversation.predict("你知道鸡哥的著作《只因你太美》吗?")
print(f"[predict] {ret}")
ret = conversation.predict_by_translate("你知道鸡哥会什么技能吗?", country='America')
print(f"[translate output] {ret}")
ret = conversation.summary_content()
print(f"[summary content] {ret}")
ret = conversation.summary_topic()
print(f"[summary topic] {ret}")
ret = conversation.export_message_to_markdown(output_type="file", file_path="output.md")
print(f"[export markdown] {ret}")
if __name__ == '__main__':
main()
[predict] 是的,我知道《只因你太美》这本书,是中国知名作家鸡肋(江南)所著的一篇言情小说。这本小说讲述了一个富家千金与一个贫穷男孩之间的爱情故事,情节曲折动人,深受读者喜爱。该小说在出版后得到了很高的评价和反响,并被改编成电影和电视剧等多种形式进行推广。
[translate output] I'm sorry, I cannot determine what you mean by "鸡哥" or what skills they may possess without additional context. Can you please provide more information or clarify your question?
[summary content] 在之前的对话中,用户询问我是否知道鸡哥的著作《只因你太美》。我回答了肯定的,解释了该小说的情节大致概括和其受欢迎的原因。我也提到了该小说的广泛影响,包括被改编成电影和电视剧等多种形式进行推广。
[summary topic] 鸡哥的小说。
咱就是说季皮提老师不懂鸡哥-.-
上面的示例中,我们使用
LocalCacheChatMemory()
进行聊天记录的本地化文件存储,文件存储形式默认是以json的形式进行存储的,保存在cache
中。
OpenAI(model="gpt-3.5-turbo", temperature=0.9, top_p=1, stream=False, presence_penalty=0, n=1)
进行初始化一个大模型,里面是OpenAI需要传入的一些参数,具体可以查看https://platform.openai.com/docs/api-reference/chat/create
查看具体含义,这里不做详细讲解,如果你不想理会这些参数,你也可以直接llm = OpenAI()
就好啦,默认使用gpt-3.5-turbo
作为大语言模型,其他参数使用默认的就好了。
conversation.predict_by_translate("你知道鸡哥会什么技能吗?", country='America')
这个功能为使用特定语言进行预测,provider
为其提供了TranslatorMixin
,让Conversation
得以拥有此功能。对于这个方法,你只需要传入prompt和你需要转换的语言的国家名称就好了。
conversation.summary_content()
这个函数可以直接总结上面的对话内容。
conversation.summary_topic()
这个函数可以直接总结上面的对话,并提供一个标题。
conversation.export_message_to_markdown(output_type="file", file_path="output.md")
这个函数可以将对话记录导出为markdown文件,如果output_type="text"
,则只返回markdown对话的内容。
provider
为Conversation
提供了 SummarizerMixin, TranslatorMixin, DeriveHistoryMessageMixin
,让其拥有了总结对话、总结标题、翻译、markdown导出的能力,provider提供的函数中一般都提供了一个enable_embed_message
的参数,这个参数的意思是:是否将本次对话保存进历史对话中,下面我们来看一个demo。
from promptulate import Conversation
conversation = Conversation()
conversation.predict_by_translate("你知道鸡哥会什么技能吗?", country='America', enable_embed_message=True)
如果你设置了enable_embed_message=True
, 那么这一次的predict将保存进历史对话中,provider提供的函数默认是不会将预测结果存入对话中的哦,这一点需要注意一下。
你可以为framework
提供一些特定的角色,让其可以处理特殊任务,如linux终端,思维导图生成器等,通过下面的方法你可以查看当前支持所有的预设角色。
from promptulate.preset_roles import get_all_preset_roles
print(get_all_preset_roles())
['default-role', 'linux-terminal', 'mind-map-generator', 'sql-generator', 'copy-writer', 'code-analyzer']
下面展示使用mind-map-generator
生成md思维导图的过程:
from promptulate import Conversation
def main():
conversation = Conversation(role="mind-map-generator")
ret = conversation.predict("请帮我生成一段python的思维导图")
print(ret)
if __name__ == '__main__':
main()
# Python
## 基础语法
### 数据类型
- 数字
- 字符串
- 列表
...
放入xmind中可以直接导入生成markdown的思维导图,咱就是说还不错,如下图所示:
如果你想要自定义预设角色,可以使用如下方法:
from promptulate import Conversation
from promptulate.preset_roles import CustomPresetRole
class SpiritualTeacher(CustomPresetRole):
name = '心灵导师'
description = """
从现在起你是一个充满哲学思维的心灵导师,当我每次输入一个疑问时你需要用一句富有哲理的名言警句来回答我,并且表明作者和出处
要求字数不少于15个字,不超过30字,每次只返回一句且不输出额外的其他信息,你需要使用中文和英文双语输出"""
def main():
role = SpiritualTeacher()
conversation = Conversation(role=role)
ret = conversation.predict("论文被拒绝了怎么办?")
print(ret)
if __name__ == '__main__':
main()
“失败不是终点,放弃才是。”——托马斯·爱迪生
妈呀,我怎么还有这么多待办事项,vivo50帮帮我 >.<
如果你想为这个项目做贡献,你可以提交pr或issue。我很高兴看到更多的人参与并优化它。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章