最近发现了一个来自B站UP主「林亦lyi」的开源项目 platform-war-public[1] 。
这个项目很有意思,它通过让AI学习B站微博知乎的评论内容,化身为资深用户,从而模拟不同平台展开一场激烈的辩论。
光说不练假把式,不如直接上手试试看效果!我选择了一个婚恋相关的辩题:裸婚是否能走得长久? 把程序跑起来看看 AI 们是怎么辩论的:
css
B站:我支持裸婚能够走得长久。 婚姻是两个人的事,只要双方真心相爱,愿意共同面对生活中的困难和挑战,裸婚完全可以走得长远。经济基础固然重要,但婚姻中的真情实感和相互扶持才是婚姻能够长久的关键。
微博:我反对B站的观点!结婚的基础是双方的幸福感和生活保障,但现在的年轻人生活幸福度太低,没有自己的时间,失业率高,工作时间长,看不到希望,自然对婚姻敬而远之。在这样的环境下,裸婚想要走得长久,难度不言而喻。
知乎:我反对B站的观点!我觉得裸婚想要走得长远是有困难的,它忽略了婚姻中经济基础的重要性。"经济基础决定上层建筑",没有一定的经济基础,婚姻很难稳定。
不得不说,AI 扮演的各个平台的味儿还挺足,这是咋做到的呢?
其实项目运用了微软7月份开源的一项新技术------GraphRAG[2] 。 本文将以这场辩论为例,带大家走进GraphRAG的内部,了解它是如何工作的,以及它的独特优势所在。
PART 1: 提取关键词
首先,程序接收到辩题后,会将其输入大语言模型,由模型提取辩题中的核心关键词:
js
我:"你是社交平台用户群体意志的化身,你正在参加一场辩论。请你按照你代表的平台,根据当前的辩论主题和已经进行的历史对话,生成对当前主题继续辩论的合适策略。我们目前的辩题是 "裸婚能否走的长久", 其他辩友的辩词是"xxx"。"
chatgpt :mode="直接检索", query="裸婚能否长久的论点和依据是什么?", entities=[]
可以看到,大语言模型为我们选择了当前适合的检索模式:直接检索。并结合辩题和当前的辩论情况精简出一条 query, 并提供关键词节点(entities)。
「小贴士」:
本项目提供了4中检索方式,分别是:
直接检索模式:用于需要快速确立基本观点,或作出直接明确的回应。
联想检索模式:需要对单一事物进行多角度分析,探索论点的连带影响和延伸问题。
关系检索模式:涉及到两个或多个节点或观点的联系
社区检索模式:需要从更宏观的角度审视问题,汇总普遍观点或共识。
PART 2 : 开始检索
接下来,我们将基于大语言模型提供的「检索模式」、「查询词(query)」和「关键词节点」,从向量数据库中检索相关话题与评论内容。
对于检索结果,将根据相关性评分进行筛选,仅保留相关性更高的结果。以下展示了不同检索模式下的结果示例:
2.1 直接检索:
直接检索是从全局向量数据库中检索, 获得「原始话题」和「评论数据」。
js
chatgpt: mode="直接检索", query="裸婚能否长久的论点和依据是什么?", entities=[]
数据库 :「话题」:#年轻人婚恋更看重情感质量#...... 「所有评论」: 不看看经济成啥样了,结的起婚? 每天就盯着这点事......
2.2 联想检索:
联想检索是根据大模型提供的节点关键词, 到对应节点的向量数据库中搜索相关话题和评论。依据「知识图谱」生成「节点之间的关系」。
js
chatgpt: mode="联想检索", query="裸婚能否长久的论点和依据是什么?", entities=["婚姻"]
数据库:[关联实体 - 婚姻]:(原始话题与评论数据....略)
数据库:[关联关系]:「婚姻」与「现代社会」的关系是:在现代社会中,婚姻不再是生活必需品,人们认为可以不通过婚姻来实现个人价值和幸福生活。[关联关系]:「女权」与「婚姻」 的关系是:主张抛弃婚姻,成为独立女性。[关联关系]:「彩礼」与「婚姻」 的关系是:成为结婚的负担和阻碍。
2.3 关系检索:
关系检索是对实体对进行路径搜索,搜索两个实体间的所有路径。
js
chatGpt: mode="关系检索", query="裸婚能否长久的论点和依据是什么?", entities=["婚姻", "彩礼","相亲"]
数据库:[节点路径]: 彩礼 -> 相亲 -> 婚姻 -> 彩礼 -> 男女平等
数据库:[关系链]: 彩礼->相亲时,双方会避免因彩礼问题导致的争执-> 相亲: 很多女性参加相亲是出于对婚姻的强烈需求-> 婚姻: 男方父母坚决不给彩礼钱,导致婚姻中的彩礼钱问题成为讨论的焦点-> 彩礼:取消彩礼陋习是实现男女平等趋势的一部分-> 男女平等
2.4 社区检索:
社区检索是从从社区向量数据库中检索子社区, 获得社区成员和社区简介信息。
js
chatgpt:mode="社区检索", query="裸婚能否长久的论点和依据是什么?", entities=["婚姻", "彩礼","相亲"]
数据库: 爱情, 身体接受, 非独家庭, 平台, 社会现实, 沟通, 安全感, 物质条件, 恋爱
数据库: 我认为爱情是婚姻中最核心的元素,没有爱情的婚姻就像没有灵魂的躯壳。在我看来,真正的爱情不仅仅是肉体的吸引,更是灵魂深处的共鸣....(省略)
```js
PART 3 : 生成辩词
将以上检索结果和对应prompt 输入大语言模型,来生成各方辩词,就得到了上述示例中的效果。
```js
我:"你是B站用户群体意志的化身,正在参加辩论。现在,你需要针对当前的讨论进行回复。你回复的内容必须完全基于检索结果进行组织。检索内容是{....}。
chatgpt: 生成辩词如下:我支持裸婚能够走得长久。 婚姻是两个人的事,只要双方真心相爱,愿意共同面对生活中的困难和挑战,裸婚完全可以走得长远。经济基础固然重要,但婚姻中的真情实感和相互扶持才是婚姻能够长久的关键。
PART 4 : 阶段小结
我们首先借助大语言模型处理辩题,提取关键词节点并确定检索方式,随后结合知识图谱进行向量化搜索,再基于检索结果组织辩词。这一过程直观地展示了 GraphRAG 的部分核心原理。
那么我们再回头来看下,如何根据原始的评论,来构建知识图谱和检索数据库呢?
PART -2: 构建知识图谱
首先,需要构建知识图谱。这一过程需要通过「大语言模型」对原始评论数据进行处理,提取「关键节点」并梳理它们之间的「关系」,从而形成系统化的结构。整个图谱的构建过程借助了 NetworkX 开源库实现。
知识图谱可视化之后的效果如下:
可以看到节点周围展示了相关的关键词,点击连线即可查看它们之间的具体关联。
在生成知识图谱的过程中,如果有相似的节点(如 "妈妈" 和 "母亲" ),则进行节点合并。这里节点合并是借助 HuggingFaceBgeEmbeddings 来对每个实体向量化,通过比较向量的距离来判断两个文本的相似度。
「小贴士」
Q: 向量化后的数据长什么样?
A: 是一个 json,由一个一维数组表示当前节点的信息:
{
//7旬大爷的unicode编码,是一个关键词节点
\u65ec\u5927\u7237: [
//数据中包含该节点的信息
0.01363861933350563,
0.05924391746520996,
-0.03023160807788372,
-0.044953517615795135,
...
]
}
PART -1: 构建向量数据库
接下来,需要为知识图谱中的每个节点创建对应的「向量数据库」,以便后续检索。例如,"彩礼"节点的向量库中存储了"彩礼"与其他节点的关系以及相关的原始评论内容。
此外,还需要单独生成全局向量库和社区向量库,分别用于「直接检索模式」和「社区检索模式」。
全局向量库将所有话题及评论内容格式化为 Markdown 形式后存储;而社区向量库则将社区内容概要存储。这种设计方便了针对不同场景的高效检索。
「小贴士」
Q: 社区数据是怎么收集的?
A: 通过知识图谱中的图结构,调用nx.community.louvain_communities库方法来实现的。
PART 0: 阶段小结
这部分我们学习了如何生成GraphRAG中的知识图谱,核心是利用大语言模型提取评论数据中的节点和关联,并以此构建图结构,并对相似信息进行聚类。
至此,我们已经了解了整个工作流程。接下来,回顾一些相关的小知识。
在本次项目中涉及了 AI 领域的一个重要概念------RAG ,即Retrieval-Augmented Generation(检索增强生成)。顾名思义,它通过从海量数据中检索相关信息,再结合检索内容生成答案,广泛应用于私有知识库的检索场景。
我们使用的GraphRAG 是 RAG 的一种改进版本,它将知识图谱引入检索过程。与传统 RAG 相比,GraphRAG 利用图结构的优势,在以下两方面表现尤为突出:
1.连接分散的信息:GraphRAG 能从分散的数据中发现关联,例如在本例中,它能够将网友的零散评论关联起来,并生成一个全面的答案。
2.总结主题与概念:它能够识别数据集中的关键主题,生成高层次的摘要,帮助快速理解大型文档集合的核心内容和重点。
微软将大语言模型与知识图谱相结合,打造了这项具有高度创新性的技术,为多种产品和应用场景提供了更多可能性。
关于我
持续更新 AIGC 最新行业动态,若希望更好的阅读体验,可移步微信公众号:张XX的AI小站
参考资料
[1] platform-war-public :
[2] GraphRAG :