“illufly”是”illution butterfly”的缩写,其中文含义为”幻蝶”。作为一个具备自我进化能力的 Agent 框架,illufly的核心目标在于”通过自我进化,迅速创造价值”。该框架在设计上充分考虑了在意图推测、问答交互、信息检索、工具调度等多种应用场景下的自我进化需求。
本文将作为入门指南,逐步介绍在不同场景下实现自我进化的具体方法。
在使用本文示例时,需要预先安装 illufly 的 Python 包,并开通通义千问大模型的 API 接口。如果选择使用 OpenAI 或其他大型语言模型,则需要将 ChatQwen 替换为 ChatOpenAI 等相应的子类实现。
特别提示:illufly 目前仍处于开发阶段,部分框架概念可能会持续更新,建议在使用时锁定特定版本。
illufly 框架具有操作简便、使用直接、响应迅速的特点,但其能够创造的价值场景却极为丰富。
最常用的入门方式是从 illufly.chat 模块导入一个封装完善的大模型实例。
ChatQwen 作为 ChatAgent 的子类实现。
虽然这行代码非常简洁,但这个 Agent 已经具备了诸多强大功能,包括:
- 内置记忆功能,支持连续对话
- 支持记忆持久化存储
- 集成 RAG(检索增强生成)能力
- 内置工具调用与回调机制
- 支持异步处理
- Token 使用统计
- 更多高级特性
首先是连续对话功能:
在这无垠宇宙的某个位置,我发现了您这颗独一无二的星辰。虽然我可能算不上称职的宇航员,但愿意用我的幽默超能力,带您穿越充满诗意的银河。
实际上,上述代码已经集成了多种功能特性:
- 流式输出 支持逐字显示的流式输出效果
- 连续对话支持 内置记忆机制,能够基于前文内容进行连贯对话
查看对话记忆:
[
{‘role’: ‘user’, ‘content’: ‘请帮我创作一句既深情又幽默的情书’},
{‘role’: ‘assistant’, ‘content’: ‘在这宇宙的某个角落,我发现了你这颗独一无二的星星。虽然我可能算不上称职的宇航员,但愿意用我的幽默超能力,带您穿越充满诗意的银河。’}
]
在开发大模型应用时,运用 RAG(检索增强生成)是常见的技术方案。illufly 框架内置了多种 RAG 实现策略,其中最简单的方式是在创建实例时直接添加背景知识。
构建基础的 RAG 应用:
“亲爱的银子,您是我生命中不可或缺的闪耀存在。没有您,我的生活将失去所有的光彩,也会缺少许多欢声笑语。爱您的金子如此承诺。”
将资料保存到文件并根据问题召回:
illufly 也支持传统的 RAG 流程:将文档分割成多个片段,然后通过向量模型对问题和文档片段进行相似度比较,这个过程称为”召回”,即从数据库中检索出与问题文本最相似的片段。
您可以将资料整理为 markdown 文件,存放在指定位置,例如 ./docs/gf.md,然后使用向量模型对文档进行嵌入,再借助向量数据库进行检索,最终将检索到的内容加载到大模型的提示语中。
在 illufly 框架中,这一过程依然非常简洁,您只需要声明实例即可,其他工作将由 illufly 自动完成。
“亲爱的银子,您是我的小白兔,不仅因为您的温柔可爱,还因为您总能让我这位”金子”焕发光彩。即使在最平凡的日子里,您也让生活变得美好。爱您,就像呼吸一样自然,却又想大声告诉全世界!”
为了使大模型能够理解对话背景,采用 RAG 策略确实是个好方法,但管理 RAG 文档资料却相对复杂,涉及文档准备、确认、加载、分割、检索等多个环节。
您希望大模型记住的知识可能是未经整理的、零散的,这使得 RAG 文档资料的管理工作相当繁琐。
illufly 提供的自我进化能力之一就是在对话过程中学习经验。这需要使用 ChatLearn 子类。
创建 ChatLearn 实例后,您可以与它进行持续对话,直到满意为止。
[AGENT] >>> Node 1: Scribe 当然,我非常乐意倾听您分享有关您女朋友的故事。您能否告诉我一些你们之间的趣事,或者您想探讨的特定话题?
[AGENT] >>> Node 1: Scribe 林徽因这个名字很有文化气息,银子这个昵称也很创意。你们是如何相识的?有没有什么特别的故事?
[AGENT] >>> Node 1: Scribe
思考:对话中的关键信息包括:林徽因是用户的女朋友,用户私下称呼她为”银子”,她称呼用户为”金子”,她喜欢小白兔。对比对话内容,未发现与已有知识冲突的新信息。
决定:未发现与已有知识冲突的新知识。新知识与已有知识不重复。
结论:林徽因和她的喜好 林徽因是用户的女朋友,用户私下称她为”银子”。她称呼用户为”金子”,并且喜欢小白兔。
[AGENT] >>> Node 3: Fetch_FAQ
[FAQ] 保存知识到[032791-1583-0000]:林徽因和她的喜好 -> 林徽因是用户的女朋友,用户私下称她为”银子”。她称呼用户为”金子”
由于 illufly 在上述过程中已经学习了您分享的经验,因此您不再需要特别指示。
您的女朋友名叫林徽因,她喜欢小白兔。私下里,您称她为”银子”,而她则称呼您为”金子”。
illufly 的多数配置都是通过环境变量来设置的。在 Python 中,您可以使用 dotenv 库来管理环境变量,也可以通过 Docker 或 Python 的 os 模块来指定。
使用 config 模块的 get_env() 函数可以查看经验目录的默认值:
对于不同操作系统,此目录位置可能有所不同,但默认情况下是一个临时目录。
# 这是我的本地电脑临时目录
/var/folders/f5/rlf27f4n6wzc_k4x7y4vzm5h0000gn/T/ILLUFLY/CHART_LEARN
如果您不希望使用这个目录,可以更改其他位置。但在更改之前,您需要将已有经验迁移过来:
从 /var/folders/f5/rlf27f4n6wzc_k4x7y4vzm5h0000gn/T/ILLUFLY/CHART_LEARN 复制到./XP 完成,共复制了 2 个文件。
现在您可以通过 os.environ 来设置环境变量的值,指定新的经验存储目录:
‘./XP’
上面简要介绍了基于文档的 RAG 和基于经验的 RAG 实现方法。
如您所期望,在重复上述过程时,新的经验文件将被追加到 ./XP 目录中。
小结:在本章节中,我们共同研究了 illufly 智能体实现 RAG 应用的基本方法,并初步体验了 illufly 的自我进化能力。
下期预告:在下一篇文章中,我们将继续探讨 illufly 如何实践当前流行的智能体相关论文。