【llamaindex和GraphRAG】

1、AI解决代码issue

在权威榜单 SWE-Bench 中,Genie 以解决了 30.07% 问题的成绩夺得榜首。

(SWE-Bench 是一个用来评估大模型解决现实中软件问题的基准。)

微软下一代RAG:GraphRAG与LlamaIndex性能对比

本文尝试通过LlamaIndex实现朴素RAG和支持知识图谱的属性图索引(Property Graph Index),以比较它们在总结整体故事脉络和实体关系上的区别。

一、LlamaIndex介绍

LlamaIndex是一个利用大型语言模型(LLMs)构建具备情境增强功能的生成式人工智能应用程序的框架。它充当桥梁角色,专为简化大规模语言模型在不同场景下的应用而设计,提供以下工具:

  1. 数据连接器:从其原始来源和格式中导入现有数据,如 API、PDF、SQL 等。
  2. 数据索引:以中间表示形式结构化数据,便于 LLM 高效使用。
  3. 引擎
    • 查询引擎:用于问答的强大接口(例如,RAG 管道)。
    • 聊天引擎:用于与数据进行多轮“来回”互动的对话接口。
  4. 智能体:由 LLM 驱动的知识工作者,通过工具增强,从简单的助手功能到 API 集成等。
  5. 可观测性/评估集成:使你能够严格地实验、评估和监控你的应用程序,形成良性循环。

二、LlamaIndex实现朴素RAG

  1. 配置
    • 按照GraphRAG中的settings.yaml配置,文本分割采用300 Token大小,重叠大小为100。
    chunks:
      size: 300 
      overlap: 100
      group_by_columns: [id] # by default, we don't allow chunks to cross documents
    
    • 配置LLM,对OpenAI库进行抽象,使用第三方兼容OpenAI库的模型需按照如下方式配置。
    from llama_index.llms.openai.utils import ALL_AVAILABLE_MODELS, CHAT_MODELS
    MY_MODELS: Dict[str, int] = {
        "qwen-turbo-0624": 32768,
        "gpt-3.5-turbo": 4000,
        "moonshot-v1-8k": 8000,
        "llama3-70b-8192": 8192,
    }
    ALL_AVAILABLE_MODELS.update(MY_MODELS)
    # 不加入这个字典,会导致它采用Completion而不是Chat Completion接口,Qwen不兼容Completion兼容。
    CHAT_MODELS.update(MY_MODELS)
    
    • 初始化LLM并将其配置到全局LLM上。
    from llama_index.llms.openai import OpenAI
    from llama_index.core.settings import Settings
    Settings.llm = OpenAI(
        model="qwen-turbo-0624",
        temperature=0.1,
        max_tokens=2000,
        api_key=os.getenv("QWEN_API_TOKEN"),
        api_base="https://dashscope.aliyuncs.com/compatible-mode/v1"
    )
    
    • 初始化嵌入模型,同样将其配置到全局embed_model上,这里采用北京智源BAAI/bge-base-zh-v1.5嵌入模型。

!pip install llama-index-embeddings-huggingface
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
Settings.embed_model = HuggingFaceEmbedding(model_name=“BAAI/bge-base-zh-v1.5”)

- 按照GraphRAG配置文本分割器。
```python
from llama_index.core.node_parser import SentenceSplitter
Settings.text_splitter = SentenceSplitter(chunk_size=300, chunk_overlap=100)
  1. 数据读取与索引

    • 使用数据连接器准备读取文本。
    docs = SimpleDirectoryReader(input_files=["./data/xianni.txt"]).load_data(show_progress=True)
    
    • 将读取的数据通过一个helper方法进行分割、嵌入并存储到高维向量数据库中。
    from llama_index.core import VectorStoreIndex
    base_index = VectorStoreIndex.from_documents(docs, show_progress=True, transformations=[SentenceSplitter(chunk_size=300, chunk_overlap=100)])
    
  2. 查询

    • 索引大约耗时18秒,完成后执行查询。
    base_query_engine = index.as_query_engine()
    resp = base_query_engine.query("在这个故事中王林的经历有哪些?")
    print(resp)
    

    回答:在这个故事中,王林经历了从平凡生活到发现一处宛如世外桃源般仙境的过程。他首先遇到了几个门内长老,他们对凡人的生死并不关心,认为修道之人应该有更高的追求。接着,王林和几位同伴不慎摔落,却意外地来到了一个美丽的地方,这里有青山绿水、鸟语花香,给人一种隔世的感觉。他们看到了一座高耸入云的山峰,山峰上云雾缭绕,时而传来兽鸣,一条石阶小径蜿蜒而下,如同画中景色。最令人印象深刻的是,山峰顶端有一座大殿,虽然被云雾遮掩,但七彩光芒闪烁,让人不由自主地产生膜拜之情。

    第2个问题:

    resp = query_engine.query("谁是王林 他的主要人际关系是什么样")
    print(resp)
    

    回答:王林是故事中的一个角色,他是王氏家族的一员。在这个故事中,王林的主要人际关系包括他的家族成员,特别是他的大哥、父亲以及其他亲戚。他的大哥和三弟在家族聚会上是主角之一,所有的亲戚都前来庆祝。王林的父亲受到了特别的尊敬和赞美,因为他的儿子可能即将被选中,这意味着他将不再需要做木匠的工作,而家族成员会称呼他为“二爷”。此外,王林还与一位躺在对面的少年有短暂的互动,这位少年对王林的食物表示了兴趣,王林慷慨地分享了他的甘薯。

三、LlamaIndex属性图索引

  1. 功能
    • 属性图是一种知识集合,由带有属性(如元数据)的标记节点(如实体类别、文本标签等)组成,这些节点通过关系链接成结构化路径。在LlamaIndex中,PropertyGraphIndex 提供了关键功能,包括构建图和查询图。
  2. 索引与查询
    • 使用属性图索引非常简单,且支持自定义或连接已有知识图谱。
    from llama_index.core import PropertyGraphIndex
    
    graph_index = PropertyGraphIndex.from_documents(docs, show_progress=True, transformations=[SentenceSplitter(chunk_size=300, chunk_overlap=100)])
    graph_query_engine = graph_index.as_query_engine()
    resp = graph_query_engine.query("在这个故事中王林的经历有哪些?")
    print(resp)
    
    resp = query_engine.query("谁是王林 他的主要人际关系是什么样")
    print(resp)
    
    • 索引过程可能会遇到诸多访问LLM的RateLimitError,暂无解决方法,除非自己修改。整个索引过程大约耗时4分钟左右完成,与其评估时间差不多。
    • 第一个问题是一个全局问题,但似乎LLM没能很好理解提问(也可能是提问过于笼统),与GraphRAG依然没法比。修改问题后结果提高不少,但仍缺少一段开头的感觉。
    • 第二个问题回答相较于GraphRAG提取的社交关系,似乎只是提取到了小说前半段,后半段的实体关系几乎完全没有。增加关于铁柱和王林的关系的提问,答案会不一样。

四、总结

以上测试都是采用LlamaIndex默认实现进行测试,未进行任何优化。从时间、成本和性能来看,时间和成本上GraphRAG不占优势,构建索引时间长且Token消耗大。但从对全局的理解来看,GraphRAG确实强大。对于朴素RAG是否会被淘汰存在争议,欢迎评论区留言分享更好的优化手段和对比方法。

标签:LLM、后端、AIGC

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Llamaindex是一个开源的搜索引擎,可以用于快速搜索和索引大型数据集。为了在本地部署Llamaindex,您需要按照以下步骤进行操作。 首先,您需要从Llamaindex的官方GitHub页面上下载源代码。确保您的计算机已安装了Git系统,然后使用命令行工具输入以下命令来克隆代码库: ``` git clone https://github.com/llama-lab/llamaindex.git ``` 下载完成后,进入项目文件夹并创建一个Python虚拟环境。使用以下命令可以创建一个虚拟环境: ``` python3 -m venv llama-env ``` 然后需要激活虚拟环境。在Mac和Linux系统下,使用以下命令: ``` source llama-env/bin/activate ``` 在Windows系统下,使用以下命令: ``` llama-env\Scripts\activate ``` 接下来,安装Llamaindex的依赖项。在虚拟环境中运行以下命令: ``` pip install -r requirements.txt ``` 等待依赖项安装完成后,可以开始配置Llamaindex。编辑`config.yaml`文件,根据您的需求进行相应的修改。您可以设置数据集的路径、索引文件的位置和其他相关参数。 完成配置后,运行以下命令来创建索引: ``` python3 llama.py -f path/to/dataset ``` 上述命令中的`path/to/dataset`应替换为实际的数据集路径。运行该命令后,Llamaindex会开始索引数据集。 当索引完成后,您可以使用以下命令来搜索索引中的数据: ``` python3 llama.py -s "your search query" ``` 您可以将`"your search query"`替换为实际的搜索关键字。Llamaindex将返回与关键字匹配的结果。 以上就是在本地部署Llamaindex的步骤。祝您在使用Llamaindex时取得成功!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ai君臣

学会的就要教给人

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

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

打赏作者

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

抵扣说明:

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

余额充值