简洁通用的群体智能引擎,用以预测万物,MiroFish

安装使用

本地运行所需的环境搭建较为容易(Nodejs, UV)

  1. 根据 .env.example 准备环境变量文件,注册图数据库所需账号、配置 LLM 的 api-key 等内容
  2. 按照 README.md 安装依赖,(pakcage.json 中的 setup:all 任务)
  3. 启动前后端服务后,通过浏览器访问

程序运行核心流程

核心流程

在使用期间,尝试在本地环境,配合本地30b级模型测试,以欧·亨利短篇小说《麦琪的礼物》作为背景提供给程序读取

初始化 GraphRag

GraphRag: 简单而言,是一种基于图数据库的 RAG,将节点(实体)用作向量搜索的条件,结合图搜索算法,实现图数据库的语义搜索技术

实体关系

截图1

将输入文本按照 500 字符的块进行块拆分,同时有做重叠处理,避免因拆分导致的上下文丢失。

每个文本块都由 LLM 进行实体关系提取处理,得到结构化的节点列表,进一步调接口构建图数据库(该项目的 Rag、图数据库能力均使用 Zep 云上能力)

涉及的核心提示词:MiroFish - 实体关系抽取

初始化 Agent

从图谱提取实体,创建对应的 Agent,在本演示中,LLM 共创建了 15 个 Agent

截图2

这一步会将图谱中的 fact 作为 Agent 的背景设定,测试时发现存在一定的人设错乱现象。比如知识图谱中面临的别名问题,在本次的演示场景下非常严重

生成平台模拟配置

基于 OASIS 建模,创建一个立体的社交平台,为每个 Agent 分配一些硬性的属性(如活动时段、人格等),无论材料中是否能够得到这些信息(这也导致人设的进一步崩坏,此时人工干预会更好)

截图3

初始化激活编排

截图4

基于用户提出的问题,生成一些初始化的话题,为预演做最后的准备

开始模拟

截图5

在完成模拟轮次配置后,即可开始模拟,演示使用了默认的 48 轮,实际执行时执行了几百轮对话

随着模拟的深入,图谱也在进一步演化,并随之产出了很多新的概念、实体。(但不会再出现新的 Agent)

演化后的图谱

商贩纷纷推广自家的商品、谈合作,尽管系统有在每次对话时强化用户的初始问题;但显然这些商贩似乎不太感兴趣。

如果是社交媒体上的舆论推演,估计没有比这更合适的方式了,我们的初始问题是“德拉一家是否有办法重获那只金表”,注意,此问题需结合《麦琪的礼物》这篇小说的背景来理解,这种问题在当前项目的建模下,对每个 Agent 而言显得无关紧要(表现出了有些真实的冷漠)。

对话日志

显然,其中的 Agent 在时代背景上存在很大的错位,表现出的是当今时代的人物画像。

对话不支持回放,可以在 backend/upload/simulations/sim_xxx/reddit/actions.jsonl 找到这些记录。

推演完成

推演完成后,系统会自动调用写报告的智能体,完成一个有固定结构的报告编写,给出针对用户问题的未来预测

在我们的演示中,推演中并没有得到任何有效结论(全是广告),报告自然也没有什么实际内容

报告

也可以在完成后,以上帝视角与每个 Agent 进行进一步对话

对话

核心原理

知识图谱构建

程序通过文本分块、LLM 实体关系提取完成知识图谱构建,通过提示词做了一些分类和举例,强制限制了分类数量;既不会限制太死,又给了 AI 发挥空间,具体细节可以参考提示词

MiroFish - 实体关系抽取

知识图谱的搜索

  • 通过LLM将问题分割为子问题,然后对每个问题进行语义搜索,会得到一组实体
  • 基于这些实体进一步查询,得到全部的关系链,进而得到一个子图
  • 在子图中,进行广度优先搜索,搜索过程中为每一条边做相关性评分,每扩展一跳,相关性做对应的衰减,对包括历史事件在内的所有边进行排序,最后返回50个最相关的关系
  • 结果转为字符串直接给到Agent

社交论坛模拟

设定

为每个 Agent 生成立体的人物设定,使之成为一个有背景的主体

环境

同时在背景设定上,进行较为真实的社区环境模拟,每个小时进行一轮模拟,在该轮模拟中,处于活跃时段的 Agent 会在论坛中进行发帖、点赞等操作。这也导致了大量的 token 消耗

应用场景

最佳场景:模拟在大众媒体上的舆论导向,开箱即用,王炸级应用

需要 GraphRAG 的场景:可能需要去掉模拟推演的部分,利用其图数据库构建和查询的能力做个性化应用(仅参考知识图谱在 Agent 上的应用)