提升LLM代理效率:BM25助力轻量级、高速检索
轻量级检索方法BM25如何增强语言模型代理(LLM Agents) 在当前的生成式人工智能领域,无论是聊天机器人还是自主助手,都需要在正确的时间检索正确的信息来增强其智能性。检索过程通过获取相关知识或上下文,帮助这些模型更准确地推理和回答问题。没有良好的检索层,即使是小巧的语言模型也会因为依赖固定的训练数据而“幻觉”或沉默,尤其是在面对最新政策更新等实时问题时。 嵌入式检索的局限 目前主流的检索方法是基于向量嵌入的,如Sentence Transformers等模型可以将单词、句子或文档映射成高维向量,然后通过余弦相似度等指标进行比较,找到最接近查询向量的文档。这种方法在处理大规模无结构数据时非常有效,但在处理结构化数据(如百科全书、技术手册或产品目录)时却显得笨重和低效。用户通常会提出直接的事实性问题,此时基于关键词的方法(如BM25)往往效果更好,且更为快速、简单和经济。 BM25的优势 BM25是一种已有数十年历史的排名函数,广泛应用于Elasticsearch和Apache Lucene等搜索引擎中。它根据以下因素对文档进行评分: 词频:查询词在文档中出现的频率。 逆文档频率:查询词在整个文档集合中的稀有程度。 文档长度:文档的长度,以平衡短文档和长文档的影响。 这种混合评分机制使BM25成为一个强大且可解释的相关度度量工具,完全可以在CPU上运行,无需额外训练。结合小巧的LLM(如Gemma-2B或TinyLlama),可以构建一个轻量、高效的信息检索系统。 实现轻量级检索 数据集概述 该实现使用了来自Kaggle的Wikipedia Structured Contents by Wikimedia数据集,该数据集包含文章的标题、摘要和信息框,采用JSONL格式存储。这种结构化的数据非常适合关键词检索。 内存中的BM25实现 使用Python库rank_bm25可以轻松实现内存中的BM25检索。该库支持多种BM25变体(如Okapi BM25、BM25+、BM25L等),并提供了词干化和停用词处理的选项。具体步骤如下: 分词:将语料库中的每个文档转换为小写,然后分割成词列表。 初始化BM25:创建BM25对象并传入分词后的文档列表。 搜索函数:定义一个搜索函数,接收查询词并返回与查询最相关的前K个文档。 持久化的BM25实现 使用Whoosh库可以实现持久化存储的BM25检索。Whoosh是一个纯Python的搜索引擎库,支持字段加权的BM25(BM25F)。具体步骤如下: 定义模式:设置文档字段的权重,例如为标题字段设置较高的权重。 创建或清除索引目录:确保索引目录存在且为空。 索引文档:将文档添加到索引中。 搜索函数:定义一个搜索函数,解析查询词并在索引中进行搜索。 生成答案 将检索到的上下文传递给小巧的LLM(如Gemma-2B、GPT-2、HuggingFace Smol Agents等),可以生成最终的答案。具体步骤如下: 加载模型:使用transformers库加载预先训练的语言模型。 RAG答案函数:定义一个函数,先通过BM25检索出最相关的前K个文档,然后将这些上下文和查询词组合成提示,生成答案。 这种轻量级的检索与生成式模型相结合的系统可以在CPU上运行,并且端到端的延迟仅需几秒钟,适合低资源设备和实时应用。 行业评价 Perplexity CEO对此评论道:“我们不仅仅依赖向量空间方法。一旦获取到内容,不会将其全部转化成一个巨大的向量数据库进行检索,因为这非常困难。向量嵌入并不是魔法,理解特定查询的相关文档也相当复杂。”这反映了行业实践中,传统检索算法与现代技术相结合的趋势,而非单纯依赖嵌入模型。 公司背景 Perplexity是一家专注于自然语言处理和生成式AI的初创公司,以其高效的本地检索和生成模型著称。通过结合传统检索算法如BM25和现代语言模型,他们成功地提高了系统的性能和可靠性。其他许多公司也在探索类似的方法,以在保持高性能的同时降低成本和复杂性。
