自我进化的Agent框架Illufly:开源创新,引领未来智能时代

发表时间: 2024-10-27 23:46

欢迎使用 ✨ illufly

“illufly”乃是“illution butterfly”的缩写,中文释义为“幻蝶”。illufly乃是一个具备自我进化能力的 Agent 框架,其目标在于:“基于自我进化,快速创造价值”。illufly 被精心设计为在意图揣测、问答经验、资料召回率、工具规划能力等诸般场景下皆具有自我进化之能力。

GitHub 上的 illufly 开源地址:arcstep/illufly

此文作为起始,逐步阐述在各种场景下自我进化的实现方式。

本文所举之例,要求您安装 illufly 的 python 包,同时开通通义千问大模型的 API 接口。倘若运用 OpenAI 抑或其他大模型,则需您将 ChatQwen 更换为 ChatOpenAI 等其他子类。

敬请留意:illufly 仍处于开发进程之中,框架的部分概念将持续更新,使用时请锁定版本。

1 从内置的 RAG 能力开始讲起

illufly 在使用时简便、直接、快速,但创造价值的场景极为丰富。

从 illufly.chat 导入一个封装完备的大模型乃是最为常见的起始方式。

from illufy.chat import ChatQwen

ChatQwen 系 ChatAgent 子类。

这一行代码甚为简洁,然而这个 Agent 已然具备诸多神奇能力。包括:

  • 内置记忆体连续对话的能力
  • 内置记忆持久化能力
  • 内置 RAG 能力
  • 内置工具回调能力
  • 异步支持
  • Token 统计
  • ...

1.1 连续对话

首先是连续对话能力:

from illufly.chat import ChatQwenqwen = ChatQwen()qwen("请你帮我写封一句话情书,深情又逗比的那种")

于这浩渺宇宙的某一角落,我觅得了您这颗举世无双的星辰,虽说我或许是个不称职的宇航员,但甘愿凭借我的逗趣超能力,携您穿越浪漫的银河。

实际上,上述代码已然内置了若干功能特性:

  • 流式输出 内置流输出,逐个字蹦出来显示
  • 支持连续对话 存有记忆,能够基于前文连续对话

查看对话记忆:

qwen.memory

[

{‘role’: ‘user’, ‘content’: ‘请你帮我写封一句话情书,深情又逗比的那种’},

{‘role’: ‘assistant’, ‘content’: ‘在这宇宙的某个角落,我找到了你这颗独一无二的星星,虽然我可能是个不合格的宇航员,但愿意用我的逗比超能力,带你飞越浪漫的银河。’}

]

1.2 内置 RAG 支持

运用 RAG(检索增强生成)乃是开发大模型应用时的常见场景。
illufly 内置了若干 RAG 实现策略,其中最简单的方式便是在声明实例时添加背景知识。

构建朴素的 RAG 应用:

from illufly.chat import ChatQwen# 声明大模型实例qwen = ChatQwen(knowledge=[    "我的女朋友名字叫林徽因,我喜欢叫她「银子」",    "她喜欢叫我「金子」",])# 使用qwen("请你帮我写封一句话情书,深情又逗比的那种")

“亲爱的银子,你乃是我生活中不可或缺的熠熠闪光点,若无你,我的人生将会丧失所有的璀璨金光,亦会缺失诸多的欢声笑语,爱你的金子如是言。”

将资料保存到文件并根据问题召回:

illufly 亦支持传统的 RAG 流程:将文档切割成多个片段,再凭借向量模型对问题和文档片段进行比较,此过程称作「召回」,即从数据库中查找出文本相似的那部分文档片段。

您可以将资料整理为 markdown 文件,放置于指定位置,例如 ./docs/gf.md 之中,而后运用向量模型嵌入文档,再借助向量数据库进行检索,最终加载至大模型的提示语当中。

在 illufly 框架内,这一过程依旧极为简洁,您仅需负责声明实例即可,其余交由 illufly 实现。

from illufly.rag import TextEmbeddings, FaissDBfrom illufly.chat import ChatQwen# 声明向量数据库并加载指定位置的文档db = FaissDB(embeddings=TextEmbeddings(), top_k=3)db.load("./docs")# 声明大模型实例qwen = ChatQwen(knowledge=[db])# 使用qwen("请你帮我写封一句话情书,深情又逗比的那种")

亲爱的银子,你是我的小白兔,不仅源于你的温柔可爱,还因你总能让我这“金子”熠熠生辉,哪怕处于最平淡的日子里。爱你,犹如呼吸般自然,却又欲大声呼喊让整个世界皆知晓!

1.3 在对话中自主进化

为使大模型能够明晰对话的背景,采用 RAG 策略诚然是良策,然而管理 RAG 文档资料却略显繁杂,牵涉到文档的筹备、确认、加载、切分、检索等诸多细节。

您期望大模型记住的知识或许是未经规整的、零碎化的,这致使 RAG 文档资料的管理颇具繁琐。

illufly 提供自我进化能力,其中之一便是在对话进程中习得经验。这需要 ChatLearn 子类。

声明 ChatLearn 实例之后,你可以跟「它」慢慢聊,直到你满意为止。

from illufly.chat import ChatQwenfrom illufly.learn import ChatLearntalker = ChatLearn(ChatQwen())
talker("我跟你说说我的女朋友")

[AGENT] >>> Node 1: Scribe 当然,我甚为乐意倾听您分享有关您女朋友之事。您能够向我讲述一些你们之间的故事,抑或您意欲探讨的特定方面。

talker("她叫林徽因,我私下里叫她`银子`,她就叫我`金子`")

[AGENT] >>> Node 1: Scribe 林徽因此名听起来颇具文化底蕴,银子这一昵称亦颇具创意。您们是如何相识的呢?有无什么特别的故事?

talker("不需要其他,你现在帮我总结吧")

[AGENT] >>> Node 1: Scribe

思考:对话中的关键信息涵盖:林徽因系用户的女朋友,用户私下里称其为“银子”,其称呼用户为“金子”,其喜欢小白兔。对比对话内容,未发觉与已有知识存有冲突的新知识。

决定:未发现与已有知识存在冲突的新知识。新知识与已有知识不重复。

结论:林徽因和她的喜好 林徽因是用户的女朋友,用户私下里称她为“银子”。她称呼用户为“金子”,并且喜欢小白兔。

[AGENT] >>> Node 3: Fetch_FAQ

[FAQ] 保存知识到[032791-1583-0000]:林徽因和她的喜好 -> 林徽因是用户的女朋友,用户私下里称她为“银子”。她称呼用户为“金子”

1.4 使用在对话中获得的经验

因为上述过程中 illufly 已经学习了你分享的「经验」,所以你不再需要专门叮嘱。

from illufly.rag import FaissDB, TextEmbeddingsfrom illufly.chat import ChatQwendb = FaissDB(embeddings=TextEmbeddings(), top_k=3)qwen = ChatQwen(knowledge=[db])qwen("你知道我女朋友叫什么吗?有什么爱好?")

您的女朋友名曰林徽因,她钟爱小白兔。于私下之中,您称其为“银子”,而她则呼您为“金子”。

1.5 管理经验数据

illufly 的众多设置大多是通过环境变量予以指定的。在 Python 中,您能够借助 dotenv 来管理环境变量的设置,亦可通过 docker 或者 Python 的 os 模块来进行指定。

使用 config 模块的 get_env() 能够查看经验目录的默认值:

对于不同的操作系统而言,此目录位置或许有所差异,但在默认情况下这是一个临时目录。

from illufly.config import get_env# 若不带参数,便返回所有环境变量的默认值get_env("ILLUFLY_CHAT_LEARN")

# 这是我的本地电脑临时目录

/var/folders/f5/rlf27f4n6wzc_k4x7y4vzm5h0000gn/T/ILLUFLY/CHART_LEARN

倘若您不钟意这个目录,能够更改为其他位置。不过在此之前,您可以将已有经验迁移过来:

qwen.clone_chat_learn("./XP")

从 /var/folders/f5/rlf27f4n6wzc_k4x7y4vzm5h0000gn/T/ILLUFLY/CHART_LEARN 拷贝到./XP 完成,共克隆了 2 个文件。

现在您可以通过 os.environ 来指定环境变量的值,设定新的经验存储目录:

import osos.environ["ILLUFLY_CHAT_LEARN"] = "./XP"get_env("ILLUFLY_CHAT_LEARN")

’./XP’

上面简略介绍了基于文档资料的 RAG 和基于经验的 RAG 实现。

如您所愿,重复上述过程时,新的经验文件将追加到 ./XP 目录中。


小结:在本次的内容之中,我们一道研究了 illufly 智能体实现 RAG 应用的基本方法,并且小试了 illufly 的自我进化能力。

下期预告:下期我们将继续探究 illufly 中对于流行的智能体论文的实践。