阿里妹导读
本文作者设计了一个通用的开源RAG框架,以兼容未来多样化的基础研究建设和工程化应用诉求。
检索增强生成(RAG:Retrieval Augmented Generation)技术旨在把信息检索与大模型结合,以缓解大模型推理“幻觉”的问题。
近来关于RAG的研究如火如荼,支持RAG的开源框架也层出不穷,并孕育了大量专业领域的AI工程应用。
我们设计了一个通用的开源RAG框架,以兼容未来多样化的基础研究建设和工程化应用诉求。
RAG的目标是通过知识库增强内容生成的质量,通常做法是将检索出来的文档作为提示词的上下文,一并提供给大模型让其生成更可靠的答案。更进一步地,RAG的整体链路还可以与提示词工程(Prompt Engineering)、模型微调(Fine Tuning)、知识图谱(Knowledge Graph)等技术结合,构成更广义的RAG问答链路。
(图:广义的RAG问答链路)
除了传统意义上的增强内容生成,RAG的理念还可以进一步泛化到链路的其他阶段:
我们希望向大家分享一下:引入知识图谱技术后,传统RAG链路到Graph RAG链路会有什么样的变化,如何兼容RAG中的向量数据库(Vector Database)和图数据库(Graph Database)基座,以及蚂蚁的Graph RAG开源技术方案和未来优化方向。
首先回顾一下传统RAG的核心链路。
(图:基于Vector的RAG链路)
传统RAG的核心链路分为三个阶段:
传统RAG希望通过知识库的关联知识增强大模型问答的上下文以提升生成内容质量,但也存在诸多问题。
(图:传统RAG的不足)
论文[23]总结了传统RAG的7个问题:
总的来看:
考虑到传统RAG能力上的不足,Graph RAG从增强知识确定性角度做了进一步的改进,也就是最开始提到的知识内容增强的思路。
相比于传统的基于Vector格式的知识库存储,Graph RAG引入了知识图谱技术,使用Graph格式存储知识。
正如论文[2]所阐述的:基于知识图谱,可以为RAG提供高质量的上下文,以减轻模型幻觉。
Structured data, such as knowledge graphs (KGs), provide high-quality context and mitigate model hallucinations.
(图:基于Graph的RAG链路)
类似地,Graph RAG的核心链路分如下三个阶段:
需要说明的是,从文本中提取三元组和关键词借助了现有的文本大模型的能力,传统的NLP技术如分词、句法分析、实体识别等已经不再是SOTA。
另外,借助于大模型微调技术,可以针对性的构建面向知识抽取、实体识别、自然语言翻译的专有大模型。比如由蚂蚁和浙大联合研发的大模型知识抽取框架OneKE[38]在零样本泛化性能上全面超过了现有模型。
以及借助于Text2GQL、Text2Cypher技术微调的图查询语言专有模型,可以直接将自然语言转换为图查询语言,代替基于关键词中心的子图搜索从而获得更精确的图谱数据。
(图:OneKE知识抽取模型能力透视)
基于以上对传统RAG和Graph RAG的能力介绍,我们可以发现两种RAG架构的核心差异在于知识存储格式的变化(从Vector到Graph),从而导致了RAG中索引、检索和生成阶段流转数据格式的变化。
而RAG的关键流程并未发生根本的改变,基于这个相似性前提,我完全可以抽象出一个更通用的RAG结构,以兼容向量索引和图索引,甚至更多的索引格式(如全文索引等)。
于是一个兼容多种知识索引格式的通用RAG架构,可以按照如下方式设计。
(图:通用RAG架构)
建模是架构落地的第一步,这里对通用RAG的核心设计做出说明:
(图:通用RAG建模)
综上所述,要构建一个完整的开源Graph RAG链路,离不开三个重要的子系统:一个可以支持RAG的AI工程框架,一个知识图谱系统和一个图存储系统。
开源的AI工程框架有诸多选型:LangChain、LlamaIndex、RAGFlow、DB-GPT等。知识图谱系统有:Jena、RDF4J、Oxigraph、OpenSPG等。图存储系统有Neo4j、JanusGraph、NebulaGraph、TuGraph等。
而作为蚂蚁首个对外开源的Graph RAG框架,我们采用蚂蚁全自主的开源产品:DB-GPT[50] + OpenSPG[42] + TuGraph[46]。
(图:蚂蚁Graph RAG开源方案)
DB-GPT是一个开源的AI原生数据应用开发框架,目的是构建大模型领域的基础设施,通过开发多模型管理(SMMF)、Text2SQL效果优化、RAG框架以及优化、Multi-Agents框架协作、AWEL(智能体工作流编排)等多种技术能力,让围绕数据库构建大模型应用更简单,更方便。
(图:DB-GPT技术架构)
OpenSPG是蚂蚁集团结合多年金融领域多元场景知识图谱构建与应用业务经验的总结,并与OpenKG联合推出的基于SPG(Semantic-enhanced Programmable Graph)框架研发的知识图谱引擎。
(图:OpenSPG技术架构)
TuGraph是蚂蚁集团与清华大学联合研发的大规模图处理系统,构建了包含图数据库、图计算引擎、图机器学习、图研发平台的完善图技术体系。
支持海量多源的关联数据的实时处理,显著提升数据分析效率,支撑了蚂蚁支付、安全、社交、公益、数据治理等300多个场景应用,多次打破图数据库性能基准测试LDBC-SNB世界纪录,并跻身IDC中国图数据库市场领导者象限。
(图:TuGraph技术架构)
在DB-GPT的v0.5.6[47]版本中,我们提供了完整的Graph RAG框架实现(PR 1506[48])。接下来我们结合这个PR,阐述Graph RAG的关键实现细节。
索引加工的统一抽象是TransformerBase接口,目前提供了嵌入、抽取、翻译三类转换器。而图索引的构建,则通过三元组提取器TripletExtractor来实现。
(图:TransformerBase接口的继承树)ExtractorBase接口负责信息提取的职责,当下已有的三元组提取器和关键词提取器都依赖了大模型能力,所以抽象类LLExtractor负责与LLM交互的公共逻辑,具体的实现类只需要提供提示词模板和结果解析即可。
三元组提取器TripletExtractor的提示词模板(受LlamaIndex启发),核心理念是通过few-shot样本引导大模型生成三元组结构。
TRIPLET_EXTRACT_PT = (
"Some text is provided below. Given the text, "
"extract up to knowledge triplets as more as possible "
"in the form of (subject, predicate, object).\n"
"Avoid stopwords.\n"
"---------------------\n"
"Example:\n"
"Text: Alice is Bob's mother.\n"
"Triplets:\n(Alice, is mother of, Bob)\n"
...TL;DR...
"Text: Philz is a coffee shop founded in Berkeley in 1982.\n"
"Triplets:(Philz, is, coffee shop)\n(Philz, founded in, Berkeley)\n(Philz, founded in, 1982)\n"
"---------------------\n"
"Text: {text}\n"
"Triplets:\n"
)
大模型让三元组抽取变成了一件非常简单的事情,但是要提高三元组的抽取质量也不是一件容易的事情。最简单的是通过提示词工程不断优化提示词模板,让通用大模型给出更理想的答案。
另外使用专有的知识抽取大模型(如OneKE)可以取得更好的效果,这部分工作还在进行中,我们期望看到OnekeExtractor的社区贡献早日发布。
索引存储的统一抽象是IndexStoreBase接口,目前提供了向量、图、全文三类索引实现。知识图谱接口KnowledgeGraphBase是Graph RAG的存储底座,目前DB-GPT内置的BuiltinKnowledgeGraph实现就是基于文本大模型能力构建的,OpenSPG的接入工作已经在逐步推进。
(图:IndexStoreBase接口的继承树)
知识图谱提供了和向量数据库同样的接口,让知识的存取过程透明化。文档内容经过三元组解析器_triplet_extractor解析后,直接写入图存储_graph_store。
async def aload_document(self, chunks: List[Chunk]) -> List[str]:
"""Extract and persist triplets to graph store.
Args:
chunks: List[Chunk]: document chunks.
Return:
List[str]: chunk ids.
"""
for chunk in chunks:
triplets = await self._triplet_extractor.extract(chunk.content)
for triplet in triplets:
self._graph_store.insert_triplet(*triplet)
logger.info(f"load {len(triplets)} triplets from chunk {chunk.chunk_id}")
return [chunk.chunk_id for chunk in chunks]
图存储接口GraphStoreBase提供统一的图存储抽象,目前内置了MemoryGraphStore和TuGraphStore的实现,分别用于本地测试和生产部署,并预留了Neo4jStore的扩展点。
(图:GraphStoreBase接口的继承树)
具体的图存储提供了三元组写入的实现,一般会调用图数据库的查询语言来完成。例如TuGraphStore会根据三元组生成具体的Cypher语句并执行。
def insert_triplet(self, subj: str, rel: str, obj: str) -> None:
"""Add triplet."""
...TL;DR...
subj_query = f"MERGE (n1:{self._node_label} {{id:'{subj}'}})"
obj_query = f"MERGE (n1:{self._node_label} {{id:'{obj}'}})"
rel_query = (
f"MERGE (n1:{self._node_label} {{id:'{subj}'}})"
f"-[r:{self._edge_label} {{id:'{rel}'}}]->"
f"(n2:{self._node_label} {{id:'{obj}'}})"
)
self.conn.run(query=subj_query)
self.conn.run(query=obj_query)
self.conn.run(query=rel_query)
接口ExtractorBase的另一个实现则是关键词抽取器KeywordExtractor,负责提取用户问题中涉及的实体关键词,它也是借助大模型的能力实现的,同样继承于LLExtractor,提示词模板如下。
KEYWORD_EXTRACT_PT = (
"A question is provided below. Given the question, extract up to "
"keywords from the text. Focus on extracting the keywords that we can use "
"to best lookup answers to the question.\n"
"Generate as more as possible synonyms or alias of the keywords "
"considering possible cases of capitalization, pluralization, "
"common expressions, etc.\n"
"Avoid stopwords.\n"
"Provide the keywords and synonyms in comma-separated format."
"Formatted keywords and synonyms text should be separated by a semicolon.\n"
"---------------------\n"
"Example:\n"
"Text: Alice is Bob's mother.\n"
"Keywords:\nAlice,mother,Bob;mummy\n"
"Text: Philz is a coffee shop founded in Berkeley in 1982.\n"
"Keywords:\nPhilz,coffee shop,Berkeley,1982;coffee bar,coffee house\n"
"---------------------\n"
"Text: {text}\n"
"Keywords:\n"
)
关键词的抽取涉及到文本中实体识别技术,在构造提示词时需要考虑单词的大小写、别称、同义词等情况,这部分还有很大的优化空间。另外,借助于模型微调直接翻译自然语言到图查询语句也是值得探索的方向。图存储接口GraphStoreBase提供了基于关键词的探索接口 explore,会根据抽取的关键词召回局部子图。
@abstractmethod
def explore(
self,
subs: List[str],
direct: Direction = Direction.BOTH,
depth: Optional[int] = None,
fan: Optional[int] = None,
limit: Optional[int] = None,
) -> Graph:
"""Explore on graph."""
这里对接口含义做补充说明:
返回值:Graph接口类型,表示搜索结果子图,提供了便捷的点边更新API。TuGraph的explore接口实现核心逻辑是将上述参数转化为Cypher查询语句,形如:
query = (
f"MATCH p=(n:{self._node_label})"
f"-[r:{self._edge_label}*1..{depth}]-(m:{self._node_label}) "
f"WHERE n.id IN {subs} RETURN p LIMIT {limit}"
)
和其他向量数据库类似,BuiltinKnowledgeGraph同样实现了IndexStoreBase的相似性查询接口。
async def asimilar_search_with_scores(
self,
text,
topk,
score_threshold: float,
filters: Optional[MetadataFilters] = None,
) -> List[Chunk]:
"""Search neighbours on knowledge graph."""
if not filters:
logger.info("Filters on knowledge graph not supported yet")
# extract keywords and explore graph store
keywords = await self._keyword_extractor.extract(text)
subgraph = self._graph_store.explore(keywords, limit=topk)
logger.info(f"Search subgraph from {len(keywords)} keywords")
content = (
"The following vertices and edges data after [Subgraph Data] "
"are retrieved from the knowledge graph based on the keywords:\n"
f"Keywords:\n{','.join(keywords)}\n"
"---------------------\n"
"You can refer to the sample vertices and edges to understand "
"the real knowledge graph data provided by [Subgraph Data].\n"
"Sample vertices:\n"
"(alice)\n"
"Sample edges:\n"
"(alice)-[reward]->(alice)\n"
"---------------------\n"
f"Subgraph Data:\n{subgraph.format()}\n"
)
return [Chunk(content=content, metadata=subgraph.schema())]
关键词通过关键词抽取器_keyword_extractor完成,抽取到的关键词传递给图存储对象_graph_store进行子图探索,探索结果子图直接格式化到提示词上下文字符串content内。 细心的读者可以发现,子图探索的结果直接封装为Graph接口类型,我们甚至还提供了一个MemoryGraph工具类实现。
这样实现图探索接口时,就无需将查询结果转化为Path/Table等内存不友好的格式了,同时也降低了提示词中编码子图数据的token开销。
当然这是建立大模型对Graph数据结构原生的理解基础上,我们相信这是当下主流大模型的基本能力。
(图:Graph接口的核心API)
我们使用《变形金刚》的故事材料tranformers_story.md[49]作为测试文本,验证DB-GPT上Graph RAG的效果。具体操作手册见DB-GPT的文档《Graph RAG User Manual》[31]。 启动DB-GPT后,新增Knowledge Space,选择Knowledge Graph存储类型。上传tranformers_story.md后切片自动构建图索引。
(图:创建知识图谱)
构建好的知识图谱支持快速预览。
(图:知识图谱预览)
基于知识图谱的对话测试。
(图:知识图谱对话)
其实大家在对DB-GPT上Graph RAG实现进行初步的测试后,会发现当下仍有不少体验问题。不避讳的讲,这里除了功能完善度的原因之外,还有Graph RAG自身设计上的不足,这也为后续的进一步优化方向提供了思路。
文章[26]总结了Graph RAG的不足:
GraphRAG, like RAG, has clear limitations, which include how to form graphs, generate queries for querying these graphs, and ultimately decide how much information to retrieve based on these queries. The main challenges are ‘query generation’, ‘reasoning boundary’, and ‘information extraction’.
总的来看分为三大类:
像前边提到的,知识抽取/关键词/查询语言的微调模型主要专注于信息抽取和查询生成。另外,论文[24]实现的基于图的推理增强框架(RoG)则是在推理边界方向尝试的创新(思路有点类似RAT):
(图:RoG:基于图的推理增强)
当然上述三个阶段也可以被简化合并为两个阶段:内容索引阶段和检索生成阶段。我们就这两个大的阶段分别讨论Graph RAG后续可能的优化方向和思路。
Graph RAG的内容索引阶段主要目标便是构建高质量的知识图谱,值得继续探索的有以下方向:
(图:混合检索的Graph RAG)
Graph RAG的检索生成阶段主要目标便是从知识图谱上召回高质量上下文,值得继续探索的有以下方向:
通过以上介绍,相信大家对RAG到Graph RAG的技术演进有了更进一步的了解,并且基于RAG的索引、检索、生成三个基本阶段抽象出了通用的RAG框架,兼容了Vector、Graph、FullText等多种索引形式,最终在开源技术中完整落地。
最后通过探讨Graph RAG未来的优化与演进方向,总结了内容索引和检索生成阶段的不同改进思路,以及RAG向Agent架构的演化趋势。
Graph RAG是个相对新颖AI工程领域,需要探索和改进的工作还有很多要做,我们诚邀DB-GPT/OpenSPG/TuGraph的广大开发者们一起参与共建。前不久Jerry Liu(LlamaIndex CEO)在技术报告《Beyond RAG: Building Advanced Context-Augmented LLM Applications》中也抛出了“RAG的未来是Agent”相似观点。
所以,无论是“RAG for Agents”还是“Agents for RAG”,亦或是“从RAG到Graph RAG再到Agents”,目光可及的是智能体将是未来AI应用的主旋律。
参考资料:
欢迎关注TuGraph代码仓库:
本文由微信公众号阿里云开发者原创,哈喽比特收录。
文章来源:https://mp.weixin.qq.com/s/hd2FzO2p15ERbHe0w87J8Q
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。