在GIE中使用LLM作为智能体助手

如今,得益于大语言模型(LLM)的便捷性,人们更倾向于向LLM寻求问题解答,而非依赖传统搜索引擎。然而,单纯依靠LLM进行问答存在明显缺陷。以GPT为代表的大多数LLM,其知识范围受限于训练材料,而这些材料通常存在两年左右的滞后性。此外,它们缺乏访问互联网获取最新信息的能力。因此在冷门领域,LLM经常给出误导性答案,因为这些领域的训练数据也相对匮乏。

llm_hot_code_question

图1. 大语言模型对热点知识与冷门知识的不同响应

事实上,不太知名领域的知识可以被组织在知识库中,例如关系型数据库管理系统(RDBMS)或图数据库。大语言模型(LLMs)可以作为智能助手,通过直接将用户问题转化为可执行的查询语句,高效地帮助用户从这些知识库中检索所需信息。这种方法可以显著减少大语言模型在冷门领域生成误导性信息的情况。

llm+knowledge_base

图2. 使用LLM作为助手从知识库中检索信息

按照这一模式,我们通过OpenAI的API将GPT集成到GIE中作为智能助手。现在,即使您对图数据完全陌生,在大语言模型的协助下,您也能便捷地从图中获取所需信息。本文档将以《红楼梦》人物关系图为例,指导您如何在GIE中使用大语言模型作为智能助手。

0. 环境

LLM集成功能适用于GraphScope 0.25及更高版本,它使用langchain来处理提示词。因此,开始前请确保您已配置好以下环境:

python>=3.8
graphscope>=0.25.0
pandas==2.0.3
langchain>=0.0.316  

我们强烈建议为GraphScope及其依赖项创建一个干净的Python虚拟环境。如果不确定如何操作,可以按照这些说明进行。

1. 下载数据集

在本文档中,我们以《红楼梦》的图数据为例。您可以通过直接git clone数据集仓库来下载该数据集:

git clone https://github.com/Suchun-sv/The-Dream-of-the-Red-Chamber.git

或者您可以访问Git仓库,选择Download ZIP按钮下载数据集,然后解压。

最后,您需要将数据集移动到运行Python文件的目录中。

# unzip The-Dream-of-the-Red-Chamber.zip # if you download the zip file
# move the dataset to the directory where you run your python file
mv /path/to/The-Dream-of-the-Red-Chamber/data ./data

2. 加载图数据

准备好数据集后,使用以下Python代码让GIE加载数据集并构建图。

import graphscope as gs
import pandas as pd
gs.set_option()
sess = gs.session(cluster_type='hosts')
graph = sess.g()
nodes_sets = pd.read_csv("./data/stone_story_nodes_relation.csv", sep=",")
graph = graph.add_vertices(nodes_sets, label="Person", vid_field="id")
edges_sets = pd.read_csv("./data/stone_story_edges.csv")
for edge_label in edges_sets['label'].unique():
    edges_sets_ = edges_sets[edges_sets['label'] == edge_label]
    graph = graph.add_edges(edges_sets_, src_field="head", dst_field="tail", label=edge_label)
print(graph.schema)

如果在终端或控制台中看到以下输出,表明数据集已成功加载到GIE中。

Properties: Property(0, eid, LONG, False, ), Property(1, label, STRING, False, )
Comment: Relations: [Relation(source='Person', destination='Person')]
type: EDGE
Label: daughter_in_law_of_grandson_of
Properties: Property(0, eid, LONG, False, ), Property(1, label, STRING, False, )
Comment: Relations: [Relation(source='Person', destination='Person')]
type: EDGE
Label: wife_of
Properties: Property(0, eid, LONG, False, ), Property(1, label, STRING, False, )
Comment: Relations: [Relation(source='Person', destination='Person')]
type: EDGE
...

3. 设置终端节点和API密钥

由于GIE的LLM助手模块使用了OpenAI的API,在使用前您需要设置终端节点和API密钥:

endpoint = "https://xxx" # use your endpoint 
api_key = "xxx" # replace to your own api key

4. 从问题生成图查询语句

在GIE的LLM助手模块中,query_to_cypher函数允许您根据提供的问题生成相应的查询语句。

from graphscope.langchain_prompt.query import query_to_cypher

只需定义您的问题并将其传递给query_to_cypher。该工具将根据问题及已加载图的信息生成相应的Cypher查询。以下是LLM助手针对问题"贾宝玉是谁的儿子?"生成Cypher查询的示例。

from graphscope.langchain_prompt.query import query_to_cypher
question = "贾宝玉是谁的儿子?"
cypher_sentence = query_to_cypher(graph, question, endpoint=endpoint, api_key=api_key)
print(cypher_sentence)

查询语句示例如下:

MATCH (p:Person)-[:son_of]->(q:Person)
WHERE p.name = '贾宝玉'
RETURN q.name

请注意,生成的查询语句可能并非100%准确,您可以根据需要编辑查询语句。

5. 使用GIE执行生成的查询语句

最后,您可以在内置的GIE交互式会话中执行生成的Cypher查询。以下是一个示例。

# Start the GIE interactive session
g = gs.interactive(graph, params={'neo4j.bolt.server.disabled': 'false', 'neo4j.bolt.server.port': 7687})
# Submit the query sentence
q1 = g.execute(cypher_sentence, lang="cypher")
# Check the query results
print(q1.records)

Here the output would be “贾政”, which is accurate according to the story of Dream of the Red Chamber.