1、AI解决代码issue
在权威榜单 SWE-Bench 中,Genie
以解决了 30.07% 问题的成绩夺得榜首。
(SWE-Bench 是一个用来评估大模型解决现实中软件问题的基准。)
微软下一代RAG:GraphRAG与LlamaIndex性能对比
本文尝试通过LlamaIndex实现朴素RAG和支持知识图谱的属性图索引(Property Graph Index),以比较它们在总结整体故事脉络和实体关系上的区别。
一、LlamaIndex介绍
LlamaIndex是一个利用大型语言模型(LLMs)构建具备情境增强功能的生成式人工智能应用程序的框架。它充当桥梁角色,专为简化大规模语言模型在不同场景下的应用而设计,提供以下工具:
- 数据连接器:从其原始来源和格式中导入现有数据,如 API、PDF、SQL 等。
- 数据索引:以中间表示形式结构化数据,便于 LLM 高效使用。
- 引擎:
- 查询引擎:用于问答的强大接口(例如,RAG 管道)。
- 聊天引擎:用于与数据进行多轮“来回”互动的对话接口。
- 智能体:由 LLM 驱动的知识工作者,通过工具增强,从简单的助手功能到 API 集成等。
- 可观测性/评估集成:使你能够严格地实验、评估和监控你的应用程序,形成良性循环。
二、LlamaIndex实现朴素RAG
- 配置:
- 按照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)
-
数据读取与索引:
- 使用数据连接器准备读取文本。
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)])
-
查询:
- 索引大约耗时18秒,完成后执行查询。
base_query_engine = index.as_query_engine() resp = base_query_engine.query("在这个故事中王林的经历有哪些?") print(resp)
回答:在这个故事中,王林经历了从平凡生活到发现一处宛如世外桃源般仙境的过程。他首先遇到了几个门内长老,他们对凡人的生死并不关心,认为修道之人应该有更高的追求。接着,王林和几位同伴不慎摔落,却意外地来到了一个美丽的地方,这里有青山绿水、鸟语花香,给人一种隔世的感觉。他们看到了一座高耸入云的山峰,山峰上云雾缭绕,时而传来兽鸣,一条石阶小径蜿蜒而下,如同画中景色。最令人印象深刻的是,山峰顶端有一座大殿,虽然被云雾遮掩,但七彩光芒闪烁,让人不由自主地产生膜拜之情。
第2个问题:
resp = query_engine.query("谁是王林 他的主要人际关系是什么样") print(resp)
回答:王林是故事中的一个角色,他是王氏家族的一员。在这个故事中,王林的主要人际关系包括他的家族成员,特别是他的大哥、父亲以及其他亲戚。他的大哥和三弟在家族聚会上是主角之一,所有的亲戚都前来庆祝。王林的父亲受到了特别的尊敬和赞美,因为他的儿子可能即将被选中,这意味着他将不再需要做木匠的工作,而家族成员会称呼他为“二爷”。此外,王林还与一位躺在对面的少年有短暂的互动,这位少年对王林的食物表示了兴趣,王林慷慨地分享了他的甘薯。
三、LlamaIndex属性图索引
- 功能:
- 属性图是一种知识集合,由带有属性(如元数据)的标记节点(如实体类别、文本标签等)组成,这些节点通过关系链接成结构化路径。在LlamaIndex中,PropertyGraphIndex 提供了关键功能,包括构建图和查询图。
- 索引与查询:
- 使用属性图索引非常简单,且支持自定义或连接已有知识图谱。
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