GraphRAG:知识图谱+大模型

OpenAI的CEO Sam Altman最近分享了一些关于备受期待的GPT-5的有趣见解。在乐观与谨慎之间,他透露了对GPT-5的信心,并表示这个新模型将在GPT-4的基础上有显著提升,不会遇到无法解决的问题。

Altman强调,GPT-5预计将是一个巨大的飞跃,将解决许多GPT-4目前面临的问题。他指出:“GPT-4常犯的错误,比如在推理能力上的不足,有时候完全跑偏,犯一些连六岁小孩都不会犯的错误,这些问题在GPT-5中都能得到解决。”

接下来,我们开始今天的内容。

在大数据和人工智能时代,信息检索技术不断演进。RAG(Retrieval Argumented Generation)是一种结合检索技术和生成技术的方法,通过增强生成过程来提高搜索结果的准确性、相关性和多样性。本文将详细介绍一种新兴技术——Graph RAG。

什么是Graph RAG?

Graph RAG是一种基于知识图谱的检索增强技术。通过构建图模型的知识表达,将实体和关系之间的联系用图的形式展示出来,然后利用大语言模型(LLM)进行检索增强。这种方法将知识图谱视为一个超大规模的词汇表,实体和关系则对应于单词,从而在检索时能够将实体和关系作为单元进行联合建模。

Graph RAG 的工作原理

  1. 提取实体:从用户输入的查询中提取关键实体。

  2. 构建子图:根据提取的实体构建相关的子图,形成上下文。

  3. 生成答案:将构建好的子图输入大语言模型,生成答案。

代码示例

以下是一个简单的Graph RAG代码示例:


def simple_graph_rag(query_str, nebulagraph_store, llm):        entities = _get_key_entities(query_str, llm)        graph_rag_context = _retrieve_subgraph_context(entities)        return _synthesize_answer(query_str, graph_rag_context, llm)
def _get_key_entities(query_str, llm=None ,with_llm=True): ... return _expand_synonyms(entities)
def _retrieve_subgraph_context(entities, depth=2, limit=30): ... return nebulagraph_store.get_relations(entities, depth, limit)
def _synthesize_answer(query_str, graph_rag_context, llm):    return llm.predict(PROMPT_SYNTHESIZE_AND_REFINE,    query_str, graph_rag_context)

传统检索增强技术的瓶颈

传统检索增强技术存在一些瓶颈,比如缺少训练数据和文本理解能力不足。Graph RAG通过知识图谱和大语言模型的结合,有效弥补了这些不足。

图探索的七种方法

方法1:KG基于向量的检索

通过向量相似性查找KG实体,获取连接的文本块并选择性探索关系。该方法非常简单且开箱即用。

query_engine = kg_index.as_query_engine()


方法2:KG基于关键词的检索

使用关键词检索相关的KG实体,获取连接的文本块并探索关系以获取更多上下文。

kg_keyword_query_engine = kg_index.as_query_engine(    include_text=False,    retriever_mode="keyword",    response_mode="tree_summarize",)

方法3:KG混合检索

结合基于向量的检索和基于关键词的检索,从知识图谱中检索信息并去重。

kg_hybrid_query_engine = kg_index.as_query_engine(    include_text=True,    response_mode="tree_summarize",    embedding_mode="hybrid",    similarity_top_k=3,    explore_global_knowledge=True,)

方法4:原生向量索引检索

完全基于向量索引构建文档的向量索引,并从中构建向量查询引擎。

vector_index = VectorStoreIndex.from_documents(wiki_documents + youtube_documents)vector_query_engine = vector_index.as_query_engine()

方法5:自定义组合查询引擎(KG检索和向量索引检索的组合)

结合知识图谱检索和向量检索,利用二者的优势提高搜索结果的准确性和相关性。


from llama_index import QueryBundlefrom llama_index.schema import NodeWithScorefrom llama_index.retrievers import BaseRetriever, VectorIndexRetriever, KGTableRetriever
class CustomRetriever(BaseRetriever): def __init__(self, vector_retriever: VectorIndexRetriever, kg_retriever: KGTableRetriever, mode: str = "OR"): self._vector_retriever = vector_retriever self._kg_retriever = kg_retriever if mode not in ("AND", "OR"): raise ValueError("Invalid mode.") self._mode = mode
def _retrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]: vector_nodes = self._vector_retriever.retrieve(query_bundle) kg_nodes = self._kg_retriever.retrieve(query_bundle)
vector_ids = {n.node.node_id for n in vector_nodes} kg_ids = {n.node.node_id for n in kg_nodes}
combined_dict = {n.node.node_id: n for n in vector_nodes} combined_dict.update({n.node.node_id: n for n in kg_nodes})
if self._mode == "AND": retrieve_ids = vector_ids.intersection(kg_ids) else: retrieve_ids = vector_ids.union(kg_ids)
retrieve_nodes = [combined_dict[rid] for rid in retrieve_ids] return retrieve_nodes

方法6:KnowledgeGraphQueryEngine

一个允许用自然语言查询知识图谱的查询引擎。

query_engine = KnowledgeGraphQueryEngine(    storage_context=storage_context,    service_context=service_context,    llm=llm,    verbose=True,)


方法7:KnowledgeGraphRAGRetriever


在知识图谱上执行Graph RAG查询的检索引擎。

graph_rag_retriever = KnowledgeGraphRAGRetriever(    storage_context=storage_context,    service_context=service_context,    llm=llm,    verbose=True,)
kg_rag_query_engine = RetrieverQueryEngine.from_args( graph_rag_retriever, service_context=service_context)

总结


它不仅解决了传统方法的瓶颈,还提供了多种图探索方法,进一步提升了检索和生成的质量和多样性。随着技术的不断发展,Graph RAG将在更多领域展现其强大的应用潜力。

请使用浏览器的分享功能分享到微信等