教你如何结合Milvus向量数据库实现GraphRAG技术。
GraphRAG技术借助知识图谱,给RAG应用注入了新的动力,使其能够在海量数据中精确检索所需信息。本文将带你了解GraphRAG的实现方法,包括如何创建索引以及如何利用Milvus向量数据库进行查询,助你在信息检索的道路上事半功倍。
1、先决条件
在运行本文中的代码之前,请确保已安装以下依赖项:
注意:通过一个分支仓库来安装GraphRAG,这是因为Milvus的存储功能在本文编写时还未被官方正式合并。
2、数据准备
为了进行GraphRAG索引,我们需要准备一个小型文本文件。我们将从Gutenberg项目(https://www.gutenberg.org/)下载一个大约一千行的文本文件,这个文件包含了关于达芬奇的故事。
利用这个数据集,构建一个涉及达芬奇所有关系的知识图谱索引,并使用Milvus向量数据库来检索相关知识,以便回答相关问题。
以下是Python代码,用于下载文本文件并进行初步处理:
3、初始化工作空间
现在,使用GraphRAG对文本文件进行索引。首先运行graphrag.index --init
命令初始化工作空间。
4、配置环境变量文件
在索引的根目录下,能找到一个名为.env
的文件。要启用这个文件,请将你的OpenAI API密钥添加进去。
注意事项:
- 本例将使用OpenAI模型作为一部分,请准备好你的API密钥。
- GraphRAG索引的成本相对较高,因为它需要用LLM处理整个文本语料库。运行这个演示可能会花费一些资金。为了节省成本,你可以考虑将文本文件缩减尺寸。
5、执行索引流程
运行索引需要一些时间,请耐心等待。执行完毕后,你可以在./graphrag_index/output/<timestamp>/
路径下找到一个新创建的文件夹,里面包含了多个parquet格式的文件。
执行以下命令开始索引过程:
6、使用Milvus向量数据库进行查询
在查询阶段,我们使用Milvus来存储GraphRAG本地搜索中实体描述的向量嵌入。
这种方法将知识图谱的结构化数据与输入文档的非结构化数据相结合,为LLM提供了额外的相关实体信息,从而能够得出更准确的答案。
7、从索引过程中加载数据
在索引过程中,会生成几个parquet文件。我们将其加载到内存中,并将实体描述信息存储在Milvus向量数据库中。
读取实体:
实体数量:651

图片
读取关系
关系数量:290

读取社区报告
报告记录:45

读取文本单元
文本单元记录:51

8、构建本地搜索引擎
一切准备就绪,现在已经有了本地搜索引擎所需的所有数据。接下来,我们可以利用这些数据,配合一个大型语言模型(LLM)和一个嵌入模型,来构建一个LocalSearch
实例,为搜索任务提供强大的支持。
api_key = os.environ["OPENAI_API_KEY"] # 你的OpenAI API密钥
llm_model = "gpt-4o" # 或 gpt-4-turbo-preview
embedding_model = "text-embedding-3-small"
llm = ChatOpenAI(
api_key=api_key,
model=llm_model,
api_type=OpenaiApiType.OpenAI,
max_retries=20,
)
token_encoder = tiktoken.get_encoding("cl100k_base")
text_embedder = OpenAIEmbedding(
api_key=api_key,
api_base=None,
api_type=OpenaiApiType.OpenAI,
model=embedding_model,
deployment_name=embedding_model,
max_retries=20,
)
context_builder = LocalSearchMixedContext(
community_reports=reports,
text_units=text_units,
entities=entities,
relatinotallow=relationships,
covariates=None, #covariates,#todo
entity_text_embeddings=description_embedding_store,
embedding_vectorstore_key=EntityVectorStoreKey.ID, # 如果向量存储使用实体标题作为ID,则将此设置为EntityVectorStoreKey.TITLE
text_embedder=text_embedder,
token_encoder=token_encoder,
)
local_context_params = {
"text_unit_prop": 0.5,
"community_prop": 0.1,
"conversation_history_max_turns": 5,
"conversation_history_user_turns_only": True,
"top_k_mapped_entities": 10,
"top_k_relationships": 10,
"include_entity_rank": True,
"include_relationship_weight": True,
"include_community_rank": False,
"return_candidate_context": False,
"embedding_vectorstore_key": EntityVectorStoreKey.ID, # 如果向量存储使用实体标题作为ID,则将此设置为EntityVectorStoreKey.TITLE
"max_tokens": 12
_000, # 根据你的模型的令牌限制更改此设置(如果你使用的是8k限制的模型,一个好设置可能是5000)
}
llm_params = {
"max_tokens": 2_000, # 根据你的模型的令牌限制更改此设置(如果你使用的是8k限制的模型,一个好设置可能是1000=1500)
"temperature": 0.0,
}
search_engine = LocalSearch(
llm=llm,
context_builder=context_builder,
token_encoder=token_encoder,
llm_params=llm_params,
context_builder_params=local_context_params,
response_type="multiple paragraphs", # 描述响应类型和格式的自由形式文本,可以是任何内容,例如优先列表、单段、多段、多页报告
)
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
9、进行查询
GraphRAG的结果具体,明确标出了引用的数据源。
10、问题生成
GraphRAG还可以根据历史查询生成问题,这对于在聊天机器人对话中创建推荐问题非常有用。这种方法结合了知识图谱的结构化数据和输入文档的非结构化数据,产生与特定实体相关的候选问题。
如果你想删除索引以节省空间,可以移除索引根。
11、结语
本文带领大家深入了解了GraphRAG技术,这是一种融合知识图谱来强化RAG应用的创新手段。GraphRAG特别擅长处理那些需要跨信息片段进行多步骤推理和全面回答问题的复杂任务。
结合Milvus向量数据库后,GraphRAG能够高效地在庞大的数据集中探索复杂的语义联系,从而得出更精准、更深刻的分析结果。这种强强联合的解决方案,使GraphRAG成为众多实际通用人工智能(GenAI)应用中的得力助手,为理解和处理复杂信息提供了强有力的支持。
本文转载自公众号AI科技论谈
原文链接:https://mp.weixin.qq.com/s/rfTwh0B6wnKjauiZsTqwyw