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 的工作原理
提取实体:从用户输入的查询中提取关键实体。
构建子图:根据提取的实体构建相关的子图,形成上下文。
生成答案:将构建好的子图输入大语言模型,生成答案。
代码示例
以下是一个简单的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 QueryBundle
from llama_index.schema import NodeWithScore
from 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(
service_context=service_context
)
总结
它不仅解决了传统方法的瓶颈,还提供了多种图探索方法,进一步提升了检索和生成的质量和多样性。随着技术的不断发展,Graph RAG将在更多领域展现其强大的应用潜力。