当前位置:   article > 正文

知识图谱在检索增强生成(RAG)中的应用:详细步骤_检索增强生成 知识图谱

检索增强生成 知识图谱

在人工智能领域,检索和生成模型的融合推动了自然语言处理取得重大进展。

这篇博客探讨了知识图谱如何推动检索增强型生成(RAG)技术的革命,使人工智能系统能够访问结构化知识并生成具有相关性的响应。

掌握知识图谱的潜力,提升基于检索的语言模型的能力,为各种应用和行业打造更精准、更贴近语境的人工智能交互。

以下是如何生成知识图谱、将数据加载到图形数据库中,并将其用作检索增强生成之上的一个层,以提供更可管理和更强大的知识的分步说明。

 配置图形数据库

我们将在这里使用Nebula,您也可以选择任何熟悉的图形数据库,如Neptune、Neo4j、Cosmos DB等。出于演示的目的,我们将在本地Docker容器中托管该数据库。

  1. docker pull vesoft/nebula-graph:nightly
  2. docker run -d --name nebula-server vesoft/nebula-graph:nightly

容器启动后,请设置nebula环境变量。

  1. "GRAPHD_HOST": <host>,
  2. "GRAPHD_PORT": "9669",
  3. "NEBULA_USER": "root",
  4. "NEBULA_PASSWORD": "nebula",
  5. "NEBULA_ADDRESS": GRAPHD_HOST:GRAPHD_PORT

连接数据库,并创建了空间和存储

  1. %reload_ext ngql
  2. connection_string = f"--address {os.environ['GRAPHD_HOST']} --port 9669 --user root --password {os.environ['NEBULA_PASSWORD']}"
  3. %ngql {connection_string}
  4. %ngql CREATE SPACE IF NOT EXISTS rag_demo(vid_type=FIXED_STRING(256), partition_num=1, replica_factor=1);
  5. %%ngql
  6. USE rag_demo;
  7. CREATE TAG IF NOT EXISTS entity(name string);
  8. CREATE EDGE IF NOT EXISTS relationship(relationship string);
  1. space_name = "rag_demo"
  2. edge_types, rel_prop_names = ["relationship"], ["relationship"]
  3. tags = ["entity"]
  4. graph_store = NebulaGraphStore(
  5. space_name=space_name,
  6. edge_types=edge_types,
  7. rel_prop_names=rel_prop_names,
  8. tags=tags,
  9. )
  10. storage_context = StorageContext.from_defaults(graph_store=graph_store)

用 Llama 索引构建知识图谱

这里我们加载了一篇关于加密的维基百科文章作为我们知识的来源。

  1. from llama_index import download_loader
  2. WikipediaReader = download_loader("WikipediaReader")
  3. loader = WikipediaReader()
  4. documents = loader.load_data(pages=['Advanced Encryption Standard'], auto_suggest=False)

从文档中提取知识图谱,并加载到nebula

  1. kg_index = KnowledgeGraphIndex.from_documents(
  2. documents,
  3. storage_context=storage_context,
  4. service_context=service_context,
  5. max_triplets_per_chunk=10,
  6. space_name=space_name,
  7. edge_types=edge_types,
  8. rel_prop_names=rel_prop_names,
  9. tags=tags,
  10. )

以下是从文档中生成的知识图谱:

直接从知识图谱查询

首先,我们可以直接从知识图谱中查询这个问题,并通过总结查询结果来生成答案。

  1. kg_index_query_engine = kg_index.as_query_engine(
  2. retriever_mode="keyword",
  3. verbose=True,
  4. response_mode="tree_summarize",
  5. )
  6. response_graph_rag = kg_index_query_engine.query("What is the secure level of AES encryption")
  7. display(Markdown(f"<b>{response_graph_rag}</b>"))

这里的查询字符串是一个问题:AES加密的安全级别是什么,它根据你的问题提取了关键词,并从你的图形数据库中查询它们。

 知识图谱 RAG

我们可以在知识图谱中应用RAG,而不是直接查询,我们可以根据问题在知识图谱中进行搜索,并使用搜索结果作为上下文来生成答案。

  1. graph_rag_retriever = KnowledgeGraphRAGRetriever(
  2. storage_context=storage_context,
  3. service_context=service_context,
  4. llm=llm,
  5. verbose=True,
  6. )
  7. query_engine = RetrieverQueryEngine.from_args(
  8. graph_rag_retriever, service_context=service_context
  9. )
  10. response = query_engine.query(
  11. "What is AES?",
  12. )
  13. display(Markdown(f"<b>{response}</b>"))

结合知识图谱RAG和向量数据库RAG

知识图谱 rag 最强大的用例在于它可以与现有的搜索结合使用,将额外的知识注入 GenAI 结果中,从而提高性能。

  • 从问题中提取关键词
  • 知识图谱数据库中语义搜索相似对象
  • 从向量数据库中搜索语义相似的上下文
  • 根据这些关键词在图数据库中生成查询。
  • 结合向量数据库上下文和知识图谱查询结果生成答案。

为了实现这一目标,我们需要创建一个结合向量查询和图数据库查询结果的自定义检索。

 创建搜索

  1. # import QueryBundle
  2. from llama_index import QueryBundle
  3. # import NodeWithScore
  4. from llama_index.data_structs import NodeWithScore
  5. # Retrievers
  6. from llama_index.retrievers import BaseRetriever, VectorIndexRetriever, KGTableRetriever
  7. from typing import List
  8. class CustomRetriever(BaseRetriever):
  9. """Custom retriever that performs both Vector search and Knowledge Graph search"""
  10. def __init__(
  11. self,
  12. vector_retriever: VectorIndexRetriever,
  13. kg_retriever: KGTableRetriever,
  14. mode: str = "OR"
  15. ) -> None:
  16. """Init params."""
  17. self._vector_retriever = vector_retriever
  18. self._kg_retriever = kg_retriever
  19. if mode not in ("AND", "OR"):
  20. raise ValueError("Invalid mode.")
  21. self._mode = mode
  22. def _retrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]:
  23. """Retrieve nodes given query."""
  24. vector_nodes = self._vector_retriever.retrieve(query_bundle)
  25. kg_nodes = self._kg_retriever.retrieve(query_bundle)
  26. vector_ids = {n.node.get_doc_id() for n in vector_nodes}
  27. kg_ids = {n.node.get_doc_id() for n in kg_nodes}
  28. combined_dict = {n.node.get_doc_id(): n for n in vector_nodes}
  29. combined_dict.update({n.node.get_doc_id(): n for n in kg_nodes})
  30. if self._mode == "AND":
  31. retrieve_ids = vector_ids.intersection(kg_ids)
  32. else:
  33. retrieve_ids = vector_ids.union(kg_ids)
  34. retrieve_nodes = [combined_dict[rid] for rid in retrieve_ids]
  35. return retrieve_nodes
  1. from llama_index import ResponseSynthesizer
  2. from llama_index.query_engine import RetrieverQueryEngine
  3. # create custom retriever
  4. vector_retriever = VectorIndexRetriever(index=vector_index)
  5. kg_retriever = KGTableRetriever(index=kg_index, retriever_mode='keyword', include_text=False)
  6. custom_retriever = CustomRetriever(vector_retriever, kg_retriever)
  7. # create response synthesizer
  8. response_synthesizer = ResponseSynthesizer.from_args(
  9. service_context=service_context,
  10. response_mode="tree_summarize",
  11. )

 创建查询引擎

  1. custom_query_engine = RetrieverQueryEngine(
  2. retriever=custom_retriever,
  3. response_synthesizer=response_synthesizer,
  4. )
  5. vector_query_engine = vector_index.as_query_engine()
  6. kg_keyword_query_engine = kg_index.as_query_engine(
  7. # setting to false uses the raw triplets instead of adding the text from the corresponding nodes
  8. include_text=False,
  9. retriever_mode='keyword',
  10. response_mode="tree_summarize",
  11. )

 进行查询

  1. response = kg_keyword_query_engine.query(
  2. "What is your encryption method, how secure it is?"
  3. )
  4. display(Markdown(f"<b>{response}</b>"))

总结:为什么知识图谱在RAG中很有用

  1. 从图数据库中提取知识并保存,相比于 GPT-4 RAG 更便于生成答案。
  2. 能够添加特定领域知识,填补 GPT 预训练模型未学习到的知识。
  3. 减少幻觉或错误信息风险的真实知识库
  4. 快速获取各种问题的答复,有助于事实核查
  5. 另一种从文档中提取信息的方法是不使用搜索。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/934276
推荐阅读
相关标签
  

闽ICP备14008679号