GraphRAG(Graph Retrieval-Augmented Generation)是一种结合图形数据库和检索增强生成模型的方法。通过使用Ollama提供的LLM(大语言模型)和Embedding模型服务,我们可以搭建一个本地的知识库,以便进行信息检索和生成。本文将介绍如何使用GraphRAG构建本地知识库,并给出相应的代码示例。
1. 环境准备
首先,确保你的机器上已安装了Python和Ollama。你可以通过以下命令安装Ollama的LLM和Embedding模型:
ollama pull gpt-3.5-turbo
ollama pull embedding-model
2. 数据准备
我们将使用一个简单的知识库示例,包含一些常见问题及其答案。你可以将这些数据存储在一个文本文件中,格式如下:
问题1: 什么是GraphRAG?
答案1: GraphRAG 是一种结合了图结构和生成模型的技术,旨在通过图数据库增强检索能力和生成能力。
问题2: 如何使用Ollama?
答案2: Ollama 提供了一些易于使用的API,可以让开发者方便地调用大语言模型和嵌入模型。
问题3: 什么是Embedding模型?
答案3: Embedding模型是一种将文本转换为向量的技术,使得计算机可以更好地理解文本的语义。
3. 构建知识库
我们将使用一个简单的Python脚本将这些问答对存入本地图数据库中。这里我们使用networkx
库来创建一个图结构来存储知识。
首先安装所需的库:
pip install networkx
接下来,编写代码构建知识库:
import networkx as nx
# 创建一个图对象
knowledge_graph = nx.Graph()
# 读取知识库数据
with open('knowledge_base.txt', 'r', encoding='utf-8') as file:
lines = file.readlines()
for i in range(0, len(lines), 2):
question = lines[i].strip()
answer = lines[i + 1].strip()
# 将问答对添加到图中
knowledge_graph.add_node(question)
knowledge_graph.add_node(answer)
knowledge_graph.add_edge(question, answer)
# 保存图数据
nx.write_gml(knowledge_graph, "knowledge_graph.gml")
4. 使用Ollama进行查询
接下来,我们可以使用Ollama的LLM和Embedding模型来进行查询。当用户提出问题时,我们首先使用Embedding模型来计算问题的向量表示,然后在知识图中找到相关的节点。
下面是一个查询示例:
import ollama
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# 加载嵌入模型和LLM
embedding_model = ollama.load('embedding-model')
llm_model = ollama.load('gpt-3.5-turbo')
# 将问题转化为向量
def get_embedding(text):
return embedding_model.embed(text)
# 查询知识库
def query_knowledge_graph(query):
query_vector = get_embedding(query)
similarities = []
for node in knowledge_graph.nodes():
node_vector = get_embedding(node)
similarity = cosine_similarity([query_vector], [node_vector])
similarities.append((node, similarity[0][0]))
# 按照相似度排序
similarities.sort(key=lambda x: x[1], reverse=True)
# 返回最相关的问题及其答案
top_question = similarities[0][0]
answer = list(knowledge_graph.neighbors(top_question))[0]
return top_question, answer
# 示例查询
query = "GraphRAG是什么?"
top_question, answer = query_knowledge_graph(query)
print(f"你问:{query}")
print(f"相关问题:{top_question}")
print(f"答案:{answer}")
5. 总结
通过结合GraphRAG与Ollama的LLM和Embedding模型,我们能够轻松地构建一个本地知识库,并实现高效的信息检索与问答生成。以上代码示例展示了如何创建知识图、存储问答对以及如何通过用户问题来检索相关答案。这个框架可以根据需求扩展,以适应更复杂的应用场景。