AI 文摘

大模型时代下KG与图数据库的思变:从NebulaGraph、TigerGraph、Neo4j与大模型的结合尝试





作者: 老刘说NLP 来源: 老刘说NLP

今天是2023年12月7日,星期四,北京,天气晴。

我们来继续看看大模型与知识图谱的一些结合工作。

图数据库是知识图谱产业中十分重要的一环,而在大模型时代下,现有图数据库也需要思变,其需要跟大模型进行结合。例如,Nebular-graph\neo4j\star-dog\tigergraph等,其与langchain结合,通通过大模型生成sql查询语句等,都是一些有趣的尝试。

本文对这些工作进行介绍,供大家一起思考。

一、NebulaGraph的Graph-RAG

文章《Knowledge Graphs & LLMs: Integrating Large Language Models with NebulaGraph》(地址:https://www.nebula-graph.io/posts/knowledge-graphs-via-natural-language)中,给出了nebular-graph与大模型的一些尝试。

我们在之前的文章《基于知识图谱的大模型检索增强实现策略:Graph RAG实现基本原理及优化思路》(地址:https://mp.weixin.qq.com/s/ulhu7qj93d3PRWoUpNcCug)中,对基于知识图谱召回来进行大模型问答增强的方案进行了介绍。

Graph RAG是由悦数图数据提出的概念,是一种基于知识图谱的检索增强技术,通过构建图模型的知识表达,将实体和关系之间的联系用图的形式进行展示,然后利用大语言模型 LLM进行检索增强。

Graph RAG 将知识图谱等价于一个超大规模的词汇表,而实体和关系则对应于单词。通过这种方式,Graph RAG 在检索时能够将实体和关系作为单元进行联合建模。

一个简单的 Graph RAG 思想在于,对用户输入的query提取实体,然后构造子图形成上下文,最后送入大模型完成生成,如下代码所示:

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)  

首先,使用LLM(或其他)模型从问题中提取关键实体。

def _get_key_entities(query_str, llm=None ,with_llm=True):  
    ...  
    return _expand_synonyms(entities)  

其次,根据这些实体检索子图,深入到一定的深度,例如可以是2度甚至更多。

def _retrieve_subgraph_context(entities, depth=2, limit=30):  
    ...  
    return nebulagraph_store.get_relations(entities, depth, limit)  

最后,利用获得的上下文利用LLM产生答案。

def _synthesize_answer(query_str, graph_rag_context, llm):  
    return llm.predict(PROMPT_SYNTHESIZE_AND_REFINE, query_str, graph_rag_context)  

这样一来,知识图谱召回可以作为一路和传统的召回进行融合。

例如,下图所示,当用户输入,tell me about Peter quill时,先识别关键词quil,编写cypher语句获得二跳结果。

又如,如下例子来说明:

用户输入:Tell me events about NASA

得到关键词:Query keywords: [‘NASA’, ’events’]

召回二度逻辑:

Extracted relationships: The following are knowledge triplets in max depth 2 in the form of `subject [predicate, object, predicate_next_hop, object_next_hop ...]  
  
nasa ['public release date', 'mid-2023']  
nasa ['announces', 'future space telescope programs']  
nasa ['publishes images of', 'debris disk']  
nasa ['discovers', 'exoplanet lhs 475 b']  

送入LLM完成问答。

INFO:llama_index.indices.knowledge_graph.retriever:> Starting query: Tell me events about NASA  
> Starting query: Tell me events about NASA  
> Starting query: Tell me events about NASA  
INFO:llama_index.indices.knowledge_graph.retriever:> Query keywords: ['NASA', 'events']  
> Query keywords: ['NASA', 'events']  
> Query keywords: ['NASA', 'events']  
INFO:llama_index.indices.knowledge_graph.retriever:> Extracted relationships: The following are knowledge triplets in max depth 2 in the form of `subject [predicate, object, predicate_next_hop, object_next_hop ...]`  
nasa ['public release date', 'mid-2023']  
nasa ['announces', 'future space telescope programs']  
nasa ['publishes images of', 'debris disk']  
nasa ['discovers', 'exoplanet lhs 475 b']  
> Extracted relationships: The following are knowledge triplets in max depth 2 in the form of `subject [predicate, object, predicate_next_hop, object_next_hop ...]`  
nasa ['public release date', 'mid-2023']  
nasa ['announces', 'future space telescope programs']  
nasa ['publishes images of', 'debris disk']  
nasa ['discovers', 'exoplanet lhs 475 b']  
> Extracted relationships: The following are knowledge triplets in max depth 2 in the form of `subject [predicate, object, predicate_next_hop, object_next_hop ...]`  
nasa ['public release date', 'mid-2023']  
nasa ['announces', 'future space telescope programs']  
nasa ['publishes images of', 'debris disk']  
nasa ['discovers', 'exoplanet lhs 475 b']  
INFO:llama_index.token_counter.token_counter:> [get_response] Total LLM token usage: 159 tokens  
> [get_response] Total LLM token usage: 159 tokens  
> [get_response] Total LLM token usage: 159 tokens  
INFO:llama_index.token_counter.token_counter:> [get_response] Total embedding token usage: 0 tokens  
> [get_response] Total embedding token usage: 0 tokens  
> [get_response] Total embedding token usage: 0 tokens  
INFO:llama_index.token_counter.token_counter:> [get_response] Total LLM token usage: 159 tokens  
> [get_response] Total LLM token usage: 159 tokens  
> [get_response] Total LLM token usage: 159 tokens  
INFO:llama_index.token_counter.token_counter:> [get_response] Total embedding token usage: 0 tokens  
> [get_response] Total embedding token usage: 0 tokens  
> [get_response] Total embedding token usage: 0 tokens  

二、TigerGraph与langchain的结合

TigerGraph的《Integrating TigerGraph and Large Language Models for Generative AI》(地址:https://www.tigergraph.com/blog/integrating-tigergraph-and-llms-for-generative-ai/)中,也是从图数据库的角度,谈了谈与大模型的结合。

其中,一个demo级别的尝试,是LangChain与TigerGraph的Python驱动程序pyTigerGraph集成。

具体的实例可以参考:https://github.com/tigergraph/graph-ml-notebooks/blob/main/applications/large_language_models/TigerGraph_LangChain_Demo.ipynb

1、具体执行逻辑

三个用于与TigerGraph交互的工具:MapQuestionToSchema、GenerateFunction和ExecuteFunction。

LangChain将LLM包装成一个代理,该代理可以自行推理和执行一系列任务。在这种情况下,无论向数据库提出什么问题,代理都会执行相同的一般执行流程。

首先,使用工具MapQuestionToSchema将问题映射到图表的schema。 MapQuestionToSchema要求LLM翻译用户的问题以利用标准模式元素。例如,如果有“机构”的顶点类型,并且用户问“有多少所大学?”,该工具将返回“有多少个机构顶点?”的问题。工具中的LLM会自动将模式元素的同义词转换为其标准化形式。

然后,标准化问题传递给GenerateFunction工具,该工具填充正确的pyTigerGraph函数调用以在数据库上运行。 GenerateFunction然后使用另一个LLM创建pyTigerGraph函数调用。对于问题“有多少个机构顶点?”然后将转换为“getVertexCount(“机构”)”。

最后,该函数调用在ExecuteFunction工具中运行,这返回来自数据库的回复,然后由代理解析并以自然英语陈述答案。

2、一个具体的例子

使用使用OGB MAG数据集的例子进行说明,包括有关论文、作者、主题和机构的信息,以及以下模式中显示的关系。

例如,询问:“how many papers are there?”简单问题时,利用langchain可以完成答案搜索。

又如,询问:“how many papers have a y attribute equal to 1?“复杂问题时。

三、stardog、neo4j与大模型结合的尝试

文章《How AI Uses Stardog》(地址:https://www.stardog.com/blog/how-ai-uses-stardog/)中介绍了stardog数据库与大模型结合的案例

此外,对于neo4j而言,地址https://neo4j.com/generativeAI/中也加上了图数据库与大模型之间的融合工作:

其提出neo4j可以从以下四个方面进行工作:

在LangChain、LlamaIndex等协调框架中直接使用Neo4j;在Neo4j知识图谱中添加矢量嵌入并建立索引;利用云端和本地的所有模型提供者为用户输入生成嵌入信息;通过向量索引中的相似性搜索查找最相关的节点,并从知识图谱中检索上下文信息;用用户问题提示任何 LLM(云或本地)进行自然语言搜索;用检索增强生成的上下文信息将LLM置于基建位置。

import neo4j  
import langchain.embeddings  
import langchain.chat_models  
import langchain.prompts.chat  
  
emb = OpenAIEmbeddings() # VertexAIEmbeddings() or BedrockEmbeddings() or ...  
llm = ChatOpenAI() # ChatVertexAI() or BedrockChat() or ChatOllama() ...  
  
vector = emb.embed_query(user_input)  
  
vectory_query = """  
// find products by similarity search in vector index  
CALL db.index.vector.queryNodes('products', 5, $embedding) yield node as product, score  
  
// enrich with additional explicit relationships from the knowledge graph  
MATCH (product)-[:HAS_CATEGORY]->(cat), (product)-[:BY_BRAND]->(brand)  
MATCH (product)-[:HAS_REVIEW]->(review {rating:5})<-[:WROTE]-(customer)   
  
// return relevant contextual information  
RETURN product.Name, product.Description, brand.Name, cat.Name,   
       collect(review { .Date, .Text })[0..5] as reviews, score  
"""  
  
records = neo4j.driver.execute_query(vectory_query, embedding = vector)  
context = format_context(records)  
  
template = """  
You are a helpful assistant that helps users find information for their shopping needs.  
Only use the context provided, do not add any additional information.  
Context:  {context}  
User question: {question}  
"""  
chain = prompt(template) | llm  
  
answer = chain.invoke({"question":user_input, "context":context}).content  

总结

本文主要介绍了现有图数据库跟大模型结合的一些动作,他们也在思变,可以看看。例如,Nebular-graph\neo4j\star-dog\tigergraph等,其与langchain结合,通通过大模型生成sql查询语句等,但具体效果如何,在真实场景下如何落地,还需要进一步观察和实践。

参考文献

1、https://www.tigergraph.com/blog/integrating-tigergraph-and-llms-for-generative-ai/

2、https://www.nebula-graph.io/

3、https://www.stardog.com/blog/how-ai-uses-stardog/

4、https://neo4j.com/

5、https://www.nebula-graph.io/posts/knowledge-graphs-via-natural-language

关于我们

老刘,刘焕勇,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。

老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。

对于想加入更优质的知识图谱、事件图谱、大模型AIGC实践、相关分享的,可关注公众号,在后台菜单栏中点击会员社区->会员入群加入。

​​​

更多AI工具,参考Github-AiBard123国内AiBard123

可关注我们的公众号:每天AI新工具