当前位置: 首页 > news >正文

【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: 100group_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 PropertyGraphIndexgraph_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


http://www.mrgr.cn/news/3368.html

相关文章:

  • JS中构造函数继承问题注意事项总结
  • 备份docker所有镜像
  • 数据分析面试常见50个问题及解答要点
  • 力扣 411周赛
  • vue3+ts+vite+pinia+element-plus搭建一个项目
  • 武汉漂流记-第一集
  • 服务器托管:单线机房与双线机房之间的区别
  • 纯php+txt实现即时通讯
  • Qt 系统相关 - 网络与音视频
  • c++基础——指针的使用条件
  • 线段树-点修区查
  • 培训第三十二天(学习playbook-roles,脚本创建数据库和表,mycat读写分离)
  • Selenium + Python 自动化测试16(Python基础复习)
  • VBA技术资料MF187:写入文件属性及自定义属性
  • Redis性能压测、监控工具及优化方案
  • 解决centos7 yum报错:cannot find a valid baseurl for repo:base/7/x86_64的方案
  • 运维团队如何有效利用自动巡检与报表功能提升管理效率
  • 数字图像处理【14】特征检测——Harris角点检测
  • 鸿蒙HarmonyOS开发知识:命令行工具Command Line Tools
  • Go —— 反射