分享
利用知识图谱提升RAG应用的准确性
输入“/”快速插入内容
利用知识图谱提升RAG应用的准确性
2024年8月19日修改
作者:lucas大叔
原文:
https://zhuanlan.zhihu.com/p/692595...
图检索增强生成(GraphRAG)利用图数据库的结构化特性,以节点和关系的方式进行组织数据,增加了检索到信息的深度和关联上下文,是传统向量检索方法的有效补充。
图擅长以结构化的方式表示和存储异构和互连的信息,可以轻松地捕捉不同数据类型之间的复杂关系和属性。相比之下,向量数据库往往难以处理此类结构化信息,因为它们的优势在于通过高维向量处理非结构化数据。在RAG应用中,可以将结构化图数据与非结构化文本的向量搜索相结合,以实现优势互补。
虽然知识图谱的概念已经比较普及,但构建知识图还是一项有挑战性的工作。它涉及到数据的收集和结构化,需要对领域和图建模有深入的了解。为了简化图谱构建过程,我们尝试利用LLM来构建。LLM对语言和上下文有着深刻的理解,可以实现知识图创建过程重要部分的自动化。通过分析文本数据,LLM可以识别实体,理解实体之间的关系,并建议如何在图结构中最好地表示它们。作为实验的结果,我们在LangChain中添加了图构建模块的第一个版本,并将在这篇博客中进行演示。相关代码可以在
GitHub
获取。
Neo4j环境配置
首先创建一个Neo4j实例。最简单的方法是在Neo4j Aura上启动一个免费实例,该实例提供Neo4j数据库的云实例。或者,你也可以下载
Neo4j Desktop
应用并创建Neo4j数据库的本地实例。
代码块
Plain Text
os.environ["OPENAI_API_KEY"] = "sk-"
os.environ["NEO4J_URI"] = "bolt://localhost:7687"
os.environ["NEO4J_USERNAME"] = "neo4j"
os.environ["NEO4J_PASSWORD"] = "password"
graph = Neo4jGraph()
数据摄入
本演示使用
Elizabeth I
的维基百科页面,我们用LangChain loader无缝地从维基百科抓取和分割文档。
代码块
Plain Text
# Read the wikipedia article
raw_documents = WikipediaLoader(query="Elizabeth I").load()
# Define chunking strategy
text_splitter = TokenTextSplitter(chunk_size=512, chunk_overlap=24)
documents = text_splitter.split_documents(raw_documents[:3])
现在用分割后的文档构建图谱。为此,我们实现了LLMGraphTransformer模块,它大大简化了在图数据库中构建和存储知识图谱。
LLMGraphTransformer类利用LLM将文档转化为图谱文档,允许指定输出图谱中节点和关系类型的约束,不支持抽取节点或者关系的属性。它的参数如下:
•
llm (BaseLanguageModel):支持结构化输出的语言模型实例
•
allowed_nodes (List[str], optional): 指定图谱中包含哪些节点类型,默认是空list,允许所有节点类型
•
allowed_relationships (List[str], optional): 指定图谱中包含哪些关系类型,默认是空list,允许所有关系类型
•
prompt (Optional[ChatPromptTemplate], optional): 传给LLM的带有其他指令的prompt
•
strict_mode (bool, optional): 确定转化是否应该使用筛选以严格遵守`allowed_nodes` 和 `allowed_relationships`,默认为True
本例allowed_nodes和allowed_relationships都采取默认设置,即图谱中允许所有的节点和关系类型。
代码块
Plain Text
llm=ChatOpenAI(temperature=0, model_name="gpt-4-0125-preview")
llm_transformer = LLMGraphTransformer(llm=llm)
# Extract graph data
graph_documents = llm_transformer.convert_to_graph_documents(documents)
# Store to neo4j
graph.add_graph_documents(
graph_documents,
baseEntityLabel=True,
include_source=True
)