利用Milvus向量数据库实现GraphRAG

大家好,GraphRAG技术借助知识图谱,给RAG应用注入了新的动力,使其能够在海量数据中精确检索所需信息。本文将介绍GraphRAG的实现方法,包括如何创建索引以及如何利用Milvus向量数据库进行查询,助力在信息检索的道路上事半功倍。

在运行本文中的代码之前,请确保已安装以下依赖项:

pip install --upgrade pymilvus
pip install git+https://github.com/zc277584121/graphrag.git

通过一个分支仓库来安装GraphRAG,这是因为Milvus的存储功能在本文编写时还未被官方正式合并。

1.数据准备

进行GraphRAG索引需要准备一个文本文件,从Gutenberg项目(https://www.gutenberg.org/)下载一个大约一千行的文本文件,这个文件包含了关于达芬奇的故事。

利用这个数据集,构建一个涉及达芬奇所有关系的知识图谱索引,并使用Milvus向量数据库来检索相关知识,以便回答相关问题。

以下是Python代码,用于下载文本文件并进行初步处理:

import nest_asyncio
nest_asyncio.apply()

import os
import urllib.request

index_root = os.path.join(os.getcwd(), 'graphrag_index')
os.makedirs(os.path.join(index_root, 'input'), exist_ok=True)
url = "https://www.gutenberg.org/cache/epub/7785/pg7785.txt"
file_path = os.path.join(index_root, 'input', 'davinci.txt')
urllib.request.urlretrieve(url, file_path)
with open(file_path, 'r+', encoding='utf-8') as file:
    # 使用文本文件的前934行,因为后面的行与本例无关。
    # 如果想节省API密钥成本,可以截断文本文件以减小大小。
    lines = file.readlines()
    file.seek(0)
    file.writelines(lines[:934])  # 如果想节省API密钥成本,可以减少这个数字。
    file.truncate()

2.配置环境并执行索引流程

现在,使用GraphRAG对文本文件进行索引。首先运行graphrag.index --init命令初始化工作空间。

python -m graphrag.index --init --root ./graphrag_index

在索引的根目录下,能找到一个名为.env的文件。要启用这个文件,请将OpenAI API密钥添加。

注意事项:

  • 本例将使用OpenAI模型作为一部分,请准备好自己的API密钥。

  • GraphRAG索引的成本相对较高,因为它需要用LLM处理整个文本语料库。运行这个演示可能会花费一些资金。为了节省成本,可以考虑将文本文件缩减尺寸。

运行索引需要一些时间,执行完毕后,可以在./graphrag_index/output/<timestamp>/路径下找到一个新创建的文件夹,里面包含了多个parquet格式的文件。

执行以下命令开始索引过程:

python -m graphrag.index --root ./graphrag_index

3.使用Milvus向量数据库进行查询

在查询阶段,使用Milvus来存储GraphRAG本地搜索中实体描述的向量嵌入。

这种方法将知识图谱的结构化数据与输入文档的非结构化数据相结合,为LLM提供了额外的相关实体信息,从而能够得出更准确的答案。

import os

import pandas as pd
import tiktoken
from graphrag.query.con
### 如何构建支持 RAG 的向量数据库 #### 1. **RAG 架构的核心组件** 在 RAG(检索增强生成)架构中,向量数据库是一个至关重要的部分。其主要功能是从大量外部数据源中高效检索相关信息并将其提供给生成模型。通过这种方式,语言模型可以利用实时更新的知识库来改进生成质量[^1]。 #### 2. **向量数据库的选择与实现** 为了有效支持 RAG 架构,向量数据库需要具备以下几个特性: - **高维相似度搜索**:能够快速计算查询向量与其他存储向量之间的余弦相似度或其他距离度量。 - **大规模扩展性**:支持海量文档嵌入的存储和索引。 - **低延迟响应**:确保检索过程不会成为整个系统的性能瓶颈。 常见的向量数据库解决方案包括 Milvus、Faiss 和 Elasticsearch 等工具。其中,Elasticsearch 可以被配置为一个高效的向量搜索引擎,适合中小规模的应用场景[^3]。 以下是基于 Elasticsearch 的简单实现方案: ```python from elasticsearch import Elasticsearch import numpy as np # 初始化 Elasticsearch 客户端 es = Elasticsearch() # 创建索引映射,定义字段类型为 dense_vector index_name = "rag_database" if not es.indices.exists(index=index_name): mapping = { "mappings": { "properties": { "embedding": {"type": "dense_vector", "dims": 768}, "text": {"type": "text"} } } } es.indices.create(index=index_name, body=mapping) # 插入文档及其对应的嵌入表示 def insert_document(doc_id, text, embedding): doc = { "text": text, "embedding": embedding.tolist() } es.index(index=index_name, id=doc_id, body=doc) # 执行 KNN 查询 def knn_search(query_embedding, k=5): query_body = { "size": k, "_source": ["text"], "query": { "knn": { "embedding": { "vector": query_embedding.tolist(), "k": k } } } } response = es.search(index=index_name, body=query_body) return [hit["_source"]["text"] for hit in response["hits"]["hits"]] ``` 上述代码展示了如何使用 Elasticsearch 存储文档嵌入以及执行最近邻搜索的功能。 #### 3. **Advanced RAG 的变体架构** 随着技术的发展,出现了多种针对特定需求优化的 RAG 变种架构。例如 GraphRAG 将知识图谱引入到传统 RAG 中,增强了语义理解和推理能力;而 HybridRAG 则尝试融合多个异构数据源以扩大覆盖范围[^2]。 这些高级版本通常会增加额外的数据处理模块或者调整原有的工作流设计,在实际部署时需权衡复杂度与收益之间的关系。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python慕遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值