你是否曾经想过要构建一个强大的搜索工具,能够访问并分析来自多篇研究论文、网站甚至整个数据库的信息?好了,准备好被革命性技术Graph RAG所震撼。在这篇博客文章中,我们将看看如何导入数据,并将其整合到你的Python程序里,最终创建一个能根据你提供的信息给出深刻见解的顶尖聊天机器人。
什么是Graph RAG呢?
RAG 图,简称图增强检索生成技术,是自然语言处理(NLP)和知识图谱技术的强大结合。它帮助你从数据中构建知识图谱,从而让应用程序能够高效地检索和理解复杂信息,就像一个专家会做的那样。
构建您的知识图谱:构建过程
让我们深入探讨如何利用图谱RAG的实际步骤。第一步是将你的数据转换成图谱RAG能够理解的格式。按照以下步骤操作:
- 首先,将数据转换为图谱RAG能理解的格式,例如知识图谱或图数据库等。
- 其次,将数据导入图谱RAG系统中。
- 安装及设置:使用
pip install graph-rag
安装 Graph RAG 包。接下来,设置你的 OpenAI API 密钥以访问其强大的语言模型。
运行以下命令:
python -m graphrag.index --root .
2. 数据下载和转换:在这个教程里,我们要用一组某个特定领域的研究文章。下载这些研究论文,并将PDF文件转换成文本文件以便处理。
3. 这里就是魔法发生的时刻。使用 Graph RAG 的 `index` 函数从您的文本文件中创建一个结构化的知识图。这一步是将原始数据转换成图形格式,以便以后可以高效地检索信息。
将图形RAG集成到您的Python应用程序中
现在,我们来看看如何将Graph RAG集成到您的Python代码中,从而打造一个强大的信息检索系统。
- 设置语言模型:我们将使用OpenAI的GPT-3.5 Turbo模型来生成响应。请确保您已经设置了API密钥,并根据项目需求选择合适的模型。
- 加载上下文:通过加载您在上一步中索引的所有数据文件来创建上下文。此上下文将作为聊天机器人的知识库的基础。
- 构建搜索功能:定义一个全局搜索函数,利用已加载的上下文。此函数将用户查询作为输入,并使用Graph RAG(图谱检索和生成)在知识图谱中搜索相关信息,生成相应的响应。
把这些都整合起来:构建自己的智能聊天机器人
在核心组件就绪后,是时候构建一个聊天界面了。我们可以用Chainlit这样的库来创建一个用户友好的界面,让用户提问并得到有洞察力的答案从你的知识图谱里。
import os
import pandas as pd
import tiktoken
from graphrag.query.indexer_adapters import read_indexer_entities, read_indexer_reports
from graphrag.query.llm.oai.chat_openai import ChatOpenAI
from graphrag.query.llm.oai.typing import OpenaiApiType
from graphrag.query.structured_search.global_search.community_context import (
GlobalCommunityContext,
)
from graphrag.query.structured_search.global_search.search import GlobalSearch
# ## 全局搜索示例
api_key = os.environ["GRAPHRAG_API_KEY"]
llm_model = "gpt-3.5-turbo"
llm = ChatOpenAI(
api_key=api_key,
model=llm_model,
api_type=OpenaiApiType.OpenAI, # OpenaiApiType.OpenAI 或 OpenaiApiType.AzureOpenAI
max_retries=20,
)
token_encoder = tiktoken.get_encoding("cl100k_base")
INPUT_DIR = "inputs/artifacts"
COMMUNITY_REPORT_TABLE = "create_final_community_reports"
ENTITY_TABLE = "create_final_nodes"
ENTITY_EMBEDDING_TABLE = "create_final_entities"
# 来自 Leiden 社区层次结构的社区级别,我们从该级别加载社区报告
# 更高的值意味着我们使用了更细粒度的社区报告(代价是更高的计算成本)
COMMUNITY_LEVEL = 2
# %%
entity_df = pd.read_parquet(f"{INPUT_DIR}/{ENTITY_TABLE}.parquet")
report_df = pd.read_parquet(f"{INPUT_DIR}/{COMMUNITY_REPORT_TABLE}.parquet")
entity_embedding_df = pd.read_parquet(f"{INPUT_DIR}/{ENTITY_EMBEDDING_TABLE}.parquet")
reports = read_indexer_reports(report_df, entity_df, COMMUNITY_LEVEL)
entities = read_indexer_entities(entity_df, entity_embedding_df, COMMUNITY_LEVEL)
print(f"报告记录数:{len(report_df)}")
print("查看报告数据的前几行:report_df.head()")
# #### 基于社区报告构建全局上下文
context_builder = GlobalCommunityContext(
community_reports=reports,
entities=entities, # 如果不想使用社区权重进行排名,则默认为 None
token_encoder=token_encoder,
)
# #### 执行全局搜索
context_builder_params = {
"use_community_summary": False, # False 表示使用完整的社区报告,True 表示使用简短摘要。
"shuffle_data": True,
"include_community_rank": True,
"min_community_rank": 0,
"community_rank_name": "rank",
"include_community_weight": True,
"community_weight_name": "出现权重",
"normalize_community_weight": True,
"max_tokens": 3_000, # 根据您的模型的标记限制来调整此值(如果您使用的是具有8k限制的模型,一个好的设置可能是5000)
"context_name": "报告",
}
map_llm_params = {
"max_tokens": 1000,
"temperature": 0.0,
"response_format": {"type": "json_object"},
}
reduce_llm_params = {
"max_tokens": 2000, # 根据您的模型的标记限制来调整此值(如果您使用的是具有8k限制的模型,一个好的设置可能是1000-1500)
"temperature": 0.0,
}
search_engine = GlobalSearch(
llm=llm,
context_builder=context_builder,
token_encoder=token_encoder,
max_data_tokens=12_000, # 根据您的模型的标记限制来调整此值(如果您使用的是具有8k限制的模型,一个好的设置可能是5000)
map_llm_params=map_llm_params,
reduce_llm_params=reduce_llm_params,
allow_general_knowledge=False, # 设置为 True 表示 LLM 将鼓励包含一般知识,这可能会增加幻觉,但在某些情况下可能很有用。
json_mode=True, # 如果您的 LLM 模型不支持 JSON 模式,则设置为 False。
context_builder_params=context_builder_params,
concurrent_coroutines=10,
response_type="多页报告", # 用于描述响应类型和格式的任意文本,可以是任何东西,例如优先列表、单段落、多段落、多页报告
)
import nest_asyncio
import asyncio
nest_asyncio.apply()
async def main(query: str):
result = await search_engine.asearch(query)
print(result.response)
return result
if __name__ == "__main__":
query = "VLM Health Future Work"
result = asyncio.run(main(query))
# 检查用于构建 LLM 响应上下文的数据
print(result.context_data["reports"])
# 检查 LLM 调用次数和标记数
print(f"LLM 调用次数:{result.llm_calls}。 LLM 标记数:{result.prompt_tokens}")
成本优化的几点关键考量
虽然 Graph RAG 是个强大的工具,但控制成本很重要。下面是一些小建议:
- 模型选择:对于日常使用,选择较为经济实惠的模型如GPT-3.5 Turbo,仅在需要处理复杂或专业查询时使用更昂贵的模型。
- 社区级别:根据查询的复杂性调整社区级别。较高层级提供更多上下文,但也会带来更高的成本。
- 令牌使用情况:监控令牌消耗以避免不必要的花费。
例子和应用场景
- 研究分析:分析研究论文,并提供关键发现和未来研究方向的深入总结。
- 客户支持:创建一个聊天机器人,能够访问一个包含常见问题解答的知识库,帮助迅速解决客户问题。
- 个人知识管理:整理并高效访问您的笔记、文章和研究材料。
最后,
RAG图是信息检索领域的重大突破。通过遵循上述步骤,你可以构建高效且准确地从多个来源访问和分析信息的强大应用程序。无论你是研究人员、开发者,还是仅仅希望改善知识管理,RAG图都为你开启了一扇充满无限可能的大门。
行动号召:
- 请务必联系获取更多关于AI教程的见解。-gunderichardson@gmail.com
- 领英上的链接-Richardson Gunde
- 在下面的评论区分享您对图RAG及其潜在应用的看法。
- 通过您的社交网络分享这篇博客文章,让更多人了解知识!
共同学习,写下你的评论
评论加载中...
作者其他优质文章