部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >深入实战 HippoRAG2:高效索引、查询与 GraphRAG 对比解析

深入实战 HippoRAG2:高效索引、查询与 GraphRAG 对比解析

作者头像
AgenticAI
发布2025-03-18 16:51:30
发布2025-03-18 16:51:30
6300
代码可运行
举报
文章被收录于专栏:AgenticAIAgenticAI
运行总次数:0
代码可运行

继上文《深度解析仿人脑记忆搜索的HippoRAG2》,我们已经对HippoRAG2有了基本的了解。本篇将更聚焦于实践部分,探讨如何配置和运行HippoRAG2,包括测试评估和索引自定义文档和数据,并分析其成本与运行时间。最后,我们将索引小说《仙逆》,并与我们早期测试GraphRAG的文章《实战微软新一代RAG》在相同问题上的表现进行对比。

1. 安装与环境配置

由于 HippoRAG2 刚刚开源,目前仍以源码运行为主。该项目以科研为目的,且不像微软那样具有广泛的社区支持,因此短期内不太可能提供生产级(production-ready)的实现。按照 HippoRAG1 的发展趋势,未来的优化可能较为有限。 首先,克隆 HippoRAG2 并安装:

代码语言:javascript
代码运行次数:0
运行
复制
pip install https://github.com/OSU-NLP-Group/HippoRAG

创建 Python 3.10 的 Conda 虚拟环境:

代码语言:javascript
代码运行次数:0
运行
复制
conda create -n hippo python=3.10

安装依赖:

代码语言:javascript
代码运行次数:0
运行
复制
pip install -r requirements.txt

然后你会发现,它还需要安装vllmtorchgritlmtransformers等大型依赖。多说一句,后面还需要使用transformer运行HuggingFace上的7B Embedding服务,而这个是FP16的模型,需要至少14G的显存,所以如果你本地显卡不行,官方源码你可能无法运行。

到这我估计到这很多人就要被劝退了,但作为一名经验丰富的技术博主,必须魔改代码,去除上述所有依赖,大模型和Embedding必须可以配置OpenAI兼容的远程服务。魔改代码在最后~完整依赖列表如下:

代码语言:javascript
代码运行次数:0
运行
复制
gritlm==1.0.2
networkx==3.4.2
numpy==2.2.1
openai==1.58.1
pydantic==2.10.4
python_igraph==0.11.8
scipy==1.14.1
tenacity==8.5.0
tiktoken==0.7.0
torch==2.4.0
tqdm==4.66.6
vllm==0.6.6.post1
transformers==4.45.2
nest_asyncio
dspy==2.5.29
einops

2. 配置优化

去除上述配置后,整个世界都安静了,一个RAG应用安装vllm是不是太搞笑了?去除上述本地依赖后,我们可以改为使用远程大模型 API 和嵌入(Embedding)服务,从而降低本地计算资源的消耗。

首先,进行基本配置,其中BaseConfig已经更新支持配置远程模型。大模型配置我们钟爱的DeepSeek V3,Embedding使用硅基流动的免费bge-m3。但按照《上文》所说,这里最好是使用7B左右的大语言模型支持的Emebdding模型,以便于消歧。

代码语言:javascript
代码运行次数:0
运行
复制
from hipporag.utils.config_utils import BaseConfig

config = BaseConfig(
        llm_base_url="https://api.deepseek.com/v1",
        llm_name='deepseek-chat',
        llm_api_key="sk-xxxx",
        embedding_api_base="https://api.siliconflow.cn/v1",
        embedding_api_key="sk-xxx",
        embedding_model_name='BAAI/bge-m3',
        embedding_batch_size=16,
        rerank_dspy_file_path="hipporag/prompts/dspy_prompts/filter_llama3.3-70B-Instruct.json",
        graph_type="facts_and_sim_passage_node_unidirectional",
        max_new_tokens=4096,
        openie_mode="online"
    )

3. 索引

配置已经完成,我们开始索引。索引采用HippoRAG().index()进行索引,接收的输入为字符串数组:

代码语言:javascript
代码运行次数:0
运行
复制
def index(self, docs: List[str]):
    pass

从源码来看,docs数组在index中并不会自动进行chunk分割,因此我们需要先编写一个文本分割方法。例如:

代码语言:javascript
代码运行次数:0
运行
复制
def split_text_by_tokens(file_path: str, max_tokens: int = 512, overlap: int = 100) -> list[str]:
    with open(file_path, 'r', encoding='utf-8') as f:
        text = f.read()
    ...
    while start < len(tokens):
        end = min(start + max_tokens, len(tokens))
        chunk_tokens = tokens[start:end]
        chunks.append(enc.decode(chunk_tokens))
        start += max_tokens - overlap
    return chunks

接下来,对小说《仙逆》的前 10 章进行分割:

代码语言:javascript
代码运行次数:0
运行
复制
docs = chunk.split_text_by_tokens("input/xianni.txt")

实例化 HippoRAG 并执行索引:

代码语言:javascript
代码运行次数:0
运行
复制
from hipporag import HippoRAG
save_dir = 'outputs/xianni' # 指定输出目录
hipporag = HippoRAG(save_dir=save_dir, global_config=config)
hipporag.index(docs=docs)

输入文件大约31000个Token左右,索引耗时10分钟左右,耗费Tokens数量8万。

image-20250303224849656
image-20250303224849656

Hipporag2 自带缓存,抽取的NER等操作都已经自动缓存了,只要文件不变,它会自动利用缓存,第二次索引时间几乎为0,反复跑index是没问题的。

索引后的文件就在我们设置的save_dir下,包含chunk_embeddingentity_embeddingfact_embedding3部分,以及graphml图存储和openie结果,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
├── deepseek-chat_BAAI_bge-m3
│   ├── chunk_embeddings
│   │   └── vdb_chunk.parquet
│   ├── entity_embeddings
│   │   └── vdb_entity.parquet
│   ├── fact_embeddings
│   │   └── vdb_fact.parquet
│   └── graph.graphml
├── llm_cache
│   ├── deepseek-chat_cache.sqlite
│   └── deepseek-chat_cache.sqlite.lock
└── openie_results_ner_deepseek-chat.json

4. 查询

hipporag2的查询方法目前只支持一组查询语句,因此我们参考文章《实战GraphRAG》的测试问题集,对《仙逆》进行查询。

代码语言:javascript
代码运行次数:0
运行
复制
all_queries = ["谁是王林 他的主要人际关系是什么样", 
               "王林和铁柱的关系", 
               "王林的小名是什么", 
               "在这个故事中王林的经历有哪些"]

查询方式如下:

  • 先检索后回答
代码语言:javascript
代码运行次数:0
运行
复制
retrieval_results = hipporag.retrieve(queries=all_queries)
ret = hipporag.qa(retrieval_results)
  • 直接生成答案
代码语言:javascript
代码运行次数:0
运行
复制
hipporag.rag_qa(queries=retrieval_results)
ret = hipporag.rag_qa(queries=all_queries)

示例回答:

  • 谁是王林 他的主要人际关系是什么样

王林的本名是王林,小名叫铁柱。他是王氏家族的一员,父亲是家族内庶出的次子,母亲对他非常关心。王林从小聪明,喜欢读书,是村子内公认的神童,父母对他期望很高。他的主要人际关系包括:

  1. 父亲:对王林寄予厚望,经常听到别人夸奖王林时会露出开怀的微笑。
  2. 母亲:对王林关心有佳,从小生活在父母的慈爱之中。
  3. 亲戚:包括三祖父、四叔等,三祖父曾暗中帮助过王林的父亲,四叔在家族中维护王林和他父亲。
  4. 王天山:王林的亲戚,与王林父亲有矛盾,曾冷嘲热讽王林。
  5. 王卓:王林的亲戚,傲慢不逊,对王林表现出轻蔑。 Answer: 王林是王氏家族的一员,小名叫铁柱。他的主要人际关系包括父亲、母亲、三祖父、四叔、王天山和王卓。
  • 王林和铁柱的关系

根据文本内容,王林的本名是王林,而“铁柱”是他的小名。因此,王林和铁柱是同一个人,铁柱是王林的称呼。 Answer: 王林和铁柱是同一个人,铁柱是王林的小名。

  • 王林的小名是什么。

王林的小名是铁柱。根据文本描述,铁柱是他的小名,因为从小身体瘦弱,父亲怕养不活,于是按照习俗称呼他为铁柱。 Answer: 铁柱。

  • 在这个故事中王林的经历有哪些

在这个故事中,王林的经历包括以下几个主要事件:

  1. 王林离家出走,试图自杀,但被天然形成的风眼吸扯,因此没有摔死。
  2. 他被张姓弟子找到并带回恒岳派,与母亲相见,了解了事情的经过。
  3. 王林被四叔带走,前往县城参加家族的选拔,离开了居住十五年的山村。
  4. 在恒岳派的测试中,王林坚持到最后,尽管身体受伤严重,但他没有放弃。
  5. 王林和其他坚持到最后的少年被送到剑灵阁进行剑灵测试,尽管心灵受到创伤,但他仍然坚持。
  6. 在攀爬石阶的过程中,王林全身受伤,但他仍然坚持用手攀爬,表现出极强的毅力和决心。

Answer: 王林的经历包括离家出走、被救回、参加选拔、坚持测试、剑灵测试和攀爬石阶。

从问答效果来看,前面三个问题回答都是对的,而当时GraphRAG没能回答正确关于王林和铁柱的关系。而HippoRAG不仅解释了是他的小名,还解释了小名的由来,回答比较完整和丰富。

我们在看第4个问题,这其实是一个全局类的问题,HippoRAG除了描述的事情的经过,它还按照顺序描述了出来,可以说非常不错。

5. 评估

如果你要评估,你需要设计数据集。评估数据集要按照这个形式设计

代码语言:javascript
代码运行次数:0
运行
复制
[
  {
    "id": "sample/question_1.json",
    "question": "Which Stanford University professor works on Alzheimer's?",
    "answer": [
      "Thomas C. Sudhof"
    ],
    "answerable": true,
    "paragraphs": [
      {
        "title": "Thomas C. Sudhof",
        "text": "Introductio...",
        "is_supporting": true,
        "idx": 0
      }
    ]
  }
]

评估方法如下,会在回答完成后自动完成EM和F1评分计算。

代码语言:javascript
代码运行次数:0
运行
复制
gold_docs = get_gold_docs(samples, dataset_name)
gold_answers = get_gold_answers(samples)
hipporag.rag_qa(queries=all_queries, gold_docs=gold_docs, gold_answers=gold_answers)

总结

本文介绍了 HippoRAG2 的安装、配置、索引、查询及评估流程,并与 GraphRAG 进行了对比测试。后续我们将继续深入优化HippoRAG2,直到能够简单使用~

关注我,获得第一时间更新~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AgenticAI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 安装与环境配置
  • 2. 配置优化
  • 3. 索引
  • 4. 查询
  • 5. 评估
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档