我们看看下面这个例子,通过 Graph RAG回答这些问题,因为 LLM 生成的知识图谱告诉LLM整个数据集的结构(以及主题)。这允许将私有数据集组织成预先汇总的有意义的语义集群。LLM在响应用户查询时使用这些集群来总结这些主题。
我们通过向两个系统提出以下问题来说明整个数据集的推理能力:
查询:“数据中排名前 5 的主题是什么?”
从基线 RAG 的结果来看,我们发现列出的主题都与两国之间的战争没有太大关系。正如预期的那样,向量搜索检索到了不相关的文本,并将其插入到法学硕士的上下文窗口中。包含的结果很可能以“主题”一词为关键,导致对数据集中发生的情况的评估不太有用。
观察 Graph RAG 的结果,我们可以清楚地看到结果与整个数据集中发生的情况更加一致。答案提供了五个主要主题以及数据集中观察到的支持细节。引用的报告由LLM为 Graph RAG 中的每个语义集群预先生成,并反过来提供原始源材料的出处。
客服系统,领英LinkedIn落地RAG结合Graph来进行用户问答服务LLM应用,能够显著提升信息检索的质量和速度,提供更加准确和丰富的问答服务。 行业研究,Graph RAG能够通过分析大量文本数据,提供内容推荐、情感分析等功能,增强新闻编辑和发布的效率。可以参考这篇论文https://arxiv.org/abs/2404.16130,作者小哥使用Graph RAG索引和检索海量的文档数据源,生成更优的回答。 个人或企业知识库,例如通过检索某个领域的论文和博客,构建自己的知识体系,类似第二大脑的应用。 推荐系统,在电商、视频流媒体和在线教育等领域,Graph RAG可以通过分析用户行为和偏好,以及商品或课程之间的关系,来提供个性化的内容推荐。
如何实现Graph RAG
从文本中提取结构化信息:借助LLM从文本中抽取结构化图形信息。 存储到图形数据库中:将提取的结构化图形信息存储到图形库中,可实现下游RAG应用程序
#pythonfrom langchain_community.graphs import Neo4jGraphfrom langchain_experimental.graph_transformers import LLMGraphTransformerfrom langchain_openai import ChatOpenAIfrom langchain_core.documents import Documentgraph = Neo4jGraph()llm = ChatOpenAI(temperature=0, model_name="gpt-4-0125-preview")llm_transformer = LLMGraphTransformer(llm=llm)from langchain_core.documents import Documenttext = """Marie Curie, was a Polish and naturalised-French physicist and chemist who conducted pioneering research on radioactivity.She was the first woman to win a Nobel Prize, the first person to win a Nobel Prize twice, and the only person to win a Nobel Prize in two scientific fields.Her husband, Pierre Curie, was a co-winner of her first Nobel Prize, making them the first-ever married couple to win the Nobel Prize and launching the Curie family legacy of five Nobel Prizes.She was, in 1906, the first woman to become a professor at the University of Paris."""documents = [Document(page_content=text)]graph_documents = llm_transformer.convert_to_graph_documents(documents)print(f"Nodes:{graph_documents[0].nodes}")print(f"Relationships:{graph_documents[0].relationships}")graph.add_graph_documents(graph_documents)
将问题转换为图数据库查询:LLM将用户输入转换为图查询语言(例如Cypher)。 执行查询:执行图数据库的查询,并返回查询到的数据。 回答问题:模型使用查询结果响应用户输入。
LangChain内置了一个机遇Neo4j实现的chain实现上面图例的工作流,它接受一个问题,将其转换为Cypher查询,执行查询,并使用结果来回答原始问题。
#pythonfrom langchain_community.graphs import Neo4jGraphfrom langchain.chains import GraphCypherQAChainfrom langchain_openai import ChatOpenAIgraph = Neo4jGraph()#graph.refresh_schema()llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)chain = GraphCypherQAChain.from_llm(graph=graph, llm=llm, verbose=True)response = chain.invoke({"query": "What was the cast of the Casino?"})print(response)
另一种基于MapReduce的方式,LLM 处理整个数据集,创建对源数据中所有实体和关系的引用,生成的知识图谱。然后,基于知识图谱创建自下而上的聚类,将数据按层次结构组织成语义聚类,这种划分允许对语义概念和主题进行预先总结,有助于对数据集的整体理解。在查询时,这两个结构都用于在回答问题时为 LLM 上下文窗口提供材料,使它能够回答不同抽象级别的问题。
多模态集成:探索将向量表示与知识图谱结合的Vector+Graph RAG,以及自我增强(Self-RAG)和多向量检索器的多模态RAG集成,以提高模型的理解能力和响应质量。 减少大模型的“幻觉”:通过改进检索增强技术,减少由大型语言模型产生的误导性或不准确的输出,即所谓的“幻觉”。这可以通过更精细的数据处理和更高效的信息检索机制来实现。 提升企业落地能力:Graph RAG旨在提升大型语言模型在实际应用中的企业落地能力,特别是在智能问答领域,通过提供更全面、更精准的上下文信息来优化搜索引擎和推荐系统。
总结来说,Graph RAG技术在提高搜索结果的精准度和减少大模型误导性输出方面具有潜力,但也不是银弹,回到非常具体实际业务场景,我们面对的问题都要比上面列举的示例复杂得多。本文介绍的内容希望能给大家提供一种思路,抛砖引玉~~
https://github.com/langchain-ai/langchain/tree/master/templates/neo4j-advanced-rag
