【大模型-RAG】RAG最佳实践论文及项目解读

文章目录

    • 论文概述
    • RAG工作流程
    • 核心代码解读
      • 软件架构
      • 查询引擎构建
      • 数据加载与索引创建
      • 微调嵌入模型
    • 项目应用
    • 结论

在人工智能领域,大型语言模型(LLMs)因其强大的文本生成能力而备受关注。然而,这些模型在生成信息时可能会产生过时的信息或编造事实。为了解决这一问题,检索增强生成(Retrieval-Augmented Generation, RAG)技术应运而生。本文将对论文《Searching for Best Practices in Retrieval-Augmented Generation》进行解读,并结合其核心代码实现进行分析。

论文概述

论文《Searching for Best Practices in Retrieval-Augmented Generation》由复旦大学的研究人员撰写,旨在探索RAG技术的最佳实践。RAG通过结合预训练模型和基于检索的模型,提供了一个增强模型性能的稳健框架。论文通过广泛的实验,提出了几种策略,旨在在性能和效率之间取得平衡。
在这里插入图片描述

RAG工作流程

论文将RAG过程划分为如下阶段,并通过实验说明每个阶段模块选择最佳实践方案。

  • Query Classification:并非所有查询都需要检索增强。
  • Chunking:块大小显著影响性能。更大的块提供了更多的上下文,增强了理解,但增加了处理时间。较小的分块提高了检索的召回率,减少了时间,但可能缺乏足够的上下文。使用sliding window技术更加有效,即将文本按照句子进行划分,每个块包含窗口大小个句子。
  • Embedding:嵌入模型选择LLM-Embedder,其与BAAI/big-large-en的效果相当,但前者的大小比后者小三倍。
  • Vector Database:Milvus支持多种索引类型、十亿规模的向量支持、混合搜索和云原生能力。
  • Retrieval:HyDE(pseudoDoc+query)+Hybrid Search(=0.3*BM25+Original embedding)。
  • Reranking:monoT5模型参数量小且准确率相对较高,RankLLaMA绝对准确率更高。
  • Repacking:reverse方式最好。
  • Summarization:Recomp | Fangyuan Xu,Weijia Shi, and Eunsol Choi. Recomp: Improving retrieval-augmented lms with compression and selective augmentation. arXiv preprint arXiv:2310.04408, 2023.
  • Generator Fine-tuning:混合相关和随机上下文可以增强生成器对无关信息的鲁棒性,同时保证相关信息的有效利用。用一个相关文档和一个随机选择的文档来训练。

核心代码解读

博主对论文进行实现,并将代码发布至github,地址为:rag-best-practices,如果对您的工作有帮助,请给一个star※,感谢!也欢迎大家fork项目,以此为baseline构建自己的RAG应用。

软件架构

项目基于 LlamaIndex RAG框架实现,向量数据库选择Qdrant。 大模型选择基于Ollama本地调用qwen2-1.5b模型,嵌入模型选择BAAI/bge-large-zh-v1.5。 选择原因:

  • LlamaIndex框架对当前较为常用的技术进行了模块化封装,个人认为相较于langchain框架来说,其抽象层级更高,把更多的时间用于高层次的思考,而不是陷入编程的细节。
  • Qdrant数据库比Milvus更容易部署,且文档较为详细直观。
    在这里插入图片描述

查询引擎构建

query.py文件中,定义了一个函数build_query_engine,用于构建查询引擎。这个函数根据是否使用混合搜索、重排等参数,构建不同的查询引擎。

rag_query_engine = index.as_query_engine(similarity_top_k=top_k,text_qa_template=qa_prompt_tmpl,node_postprocessors=[reranker, MetadataReplacementPostProcessor(target_metadata_key="window")],sparse_top_k=12,vector_store_query_mode="hybrid",response_synthesizer=get_response_synthesizer(response_mode=response_mode),                                         )

数据加载与索引创建

utils.py文件中,定义了load_txt_data函数,用于加载混合数据并创建索引。这个函数使用了滑动窗口分块技术,并利用Qdrant作为向量存储。

def load_txt_data(input_file, persist_dir, with_sliding_window: bool, chunk_size=512, chunk_overlap=128):documents = SimpleDirectoryReader(input_files=input_file).load_data()if with_sliding_window:# Sliding windows chunking & Extract nodes from documentsnode_parser = SentenceWindowNodeParser.from_defaults(# how many sentences on either side to capturewindow_size=3,# the metadata key that holds the window of surrounding sentenceswindow_metadata_key="window",# the metadata key that holds the original sentenceoriginal_text_metadata_key="original_sentence",)else:node_parser = SentenceSplitter(chunk_size=512, chunk_overlap=128)nodes = node_parser.get_nodes_from_documents(documents, show_progress=True)# indexing & storingtry:storage_context = StorageContext.from_defaults(persist_dir=persist_dir)index = load_index_from_storage(storage_context, show_progress=True)except:index = VectorStoreIndex(nodes=nodes, show_progress=True)index.storage_context.persist(persist_dir=persist_dir)return index, nodes

微调嵌入模型

FTEmbed.py文件中,提供了微调嵌入模型的相关函数。这些函数包括数据准备、微调和评估。

def finetuning_data_preparation(...):docs_nodes = load_corpus(all_data, verbose=verbose)train_nodes = docs_nodes[:int(2 * len(docs_nodes) / 3)]val_nodes = docs_nodes[int(2 * len(docs_nodes) / 3 + 1):]# 自带保存train_dataset = generate_qa_embedding_pairs(llm=llm, nodes=train_nodes, verbose=verbose,
output_path="ft_data/qa_finetune_train_dataset.json")val_dataset = generate_qa_embedding_pairs(llm=llm, nodes=val_nodes, verbose=verbose,output_path="ft_data/qa_finetune_val_dataset.json")train_dataset.save_json(train_dataset_dir)val_dataset.save_json(val_dataset_dir)def finetuning_embedding(...):train_dataset = EmbeddingQAFinetuneDataset.from_json(train_dataset_dir)val_dataset = EmbeddingQAFinetuneDataset.from_json(val_dataset_dir)finetune_engine = SentenceTransformersFinetuneEngine(train_dataset,model_id=model_name,model_output_path=model_output_path,val_dataset=val_dataset,)if not os.path.exists(model_output_path):  # 如果已经存在微调好的模型就不用重新微调了finetune_engine.finetune()embed_model = finetune_engine.get_finetuned_model()print(embed_model)return embed_model

项目应用

论文中提出的RAG最佳实践,可以应用于多种场景,如问答系统、内容生成等。通过结合检索和生成,RAG能够提供更准确、更丰富的信息。

结论

RAG技术通过检索增强生成,有效地提高了大型语言模型的准确性和可靠性。论文《Searching for Best Practices in Retrieval-Augmented Generation》通过广泛的实验,为RAG的实际应用提供了宝贵的指导。结合论文的核心代码实现,我们可以更深入地理解RAG的工作机制和最佳实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/52151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录:96. 不同的二叉搜索树

96. 不同的二叉搜索树 class Solution { public:int numTrees(int n) {int dp[30]{0};//由i个结点组成的二叉搜索树有多少种dp[0]1; for(int i1;i<n;i)for(int j0;j<i;j)//j表示根节点左子树有j个结点dp[i]dp[j]*dp[i-j-1];//对根节点左右子树结点数量遍历//数量有左子树…

什么是数据结构三要素?

目录 1.逻辑结构 2.数据的存储结构 3.数据的运算 1.逻辑结构 逻辑结构是指数据元素之间的逻辑关系&#xff0c;即从逻辑关系上描述数据。 它与数据的存储无关&#xff0c;是独立于计算机的。数据的逻辑结构非为线性结构和非线性结构&#xff0c;线性表是典型的线性结构&am…

ELK学习笔记——如何给Kibana新增用户和角色

Kibana新增用户和角色 首先用超管账号登录上Kibana&#xff0c;按照下面步骤操作 1、创建角色 按图操作 2、创建用户 按图操作 3、给用户分配角色 至此&#xff0c;角色和用户绑定成功&#xff1b; 最后&#xff0c;可以退出管理员账号&#xff0c;登录这个新…

【MATLAB】FIR滤波器的MATLAB实现

FIR滤波器的MATLAB实现 FIR滤波器的设计fir1函数fir2函数 与IIR滤波器相比&#xff0c;FIR滤波器既有其优势也有其局限性。FIR滤波器的主要优点包括&#xff1a; 精确的线性相位响应&#xff1b;永远保持稳定性&#xff1b;设计方法通常是线性的&#xff1b;在硬件实现中具有更…

Django学习实战篇二(适合略有基础的新手小白学习)(从0开发项目)

前言&#xff1a; 从这一章开始&#xff0c;我们来创建项目typeidea&#xff0c;我把它放到了GitHub上。强烈建议你也到GitHub上注册一个账号&#xff08;如果没有的话&#xff09;&#xff0c;然后创建这样的项目。当然&#xff0c;你也可以起一个属于自己的名称。这个项目就是…

Live800:以客户为中心,重塑服务标准

在快速迭代的商业环境中&#xff0c;企业若想持续繁荣&#xff0c;就必须不断审视并优化自身的服务模式。传统上&#xff0c;服务往往被视为产品交易的附加品&#xff0c;但今日之市场&#xff0c;服务已悄然成为企业核心竞争力的关键要素。因此&#xff0c;“以客户为中心&…

5、Django Admin后台移除“删除所选”操作

默认情况下&#xff0c;Django Admin后台的listview模型列表页&#xff0c;会有一个Delete Selected删除所选操作。假设你需要再从Hero管理模型中移除该删除操作。 ModelAdmin.get_actions方法可以返回所有的操作方法。通过覆盖此方法&#xff0c;移除其中delete_selected方法…

美团面试:mysql 索引失效?怎么解决? (重点知识,建议收藏,读10遍+)

美团面试&#xff1a;mysql 索引失效&#xff1f;怎么解决&#xff1f; 尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、shein 希音、shopee、百度、网易的面试资格&#xff0c;遇到很多很…

MacTalk 测评通义灵码,如何实现“微信表情”小功能?

作者&#xff1a;池建强&#xff0c;墨问西东创始人 前段时间&#xff0c;我写了篇墨问研发团队放弃 GitHub Copilot 的文章&#xff0c;没想到留言区一些读者推荐我们试试通义灵码&#xff0c;说它效果很不错。我呢&#xff0c;一直没腾出时间折腾。 直到月中时&#xff0c;…

Java之线程篇一

目录 如何理解进程&#xff1f; 进程和线程的区别 线程的优点 线程的缺点 线程异常 线程用途 创建线程 方法一&#xff1a;继承Thread类&#xff0c;重写run() 观察线程 小结 方法二&#xff1a; 实现Runnable接口&#xff0c;重写run() 方法三&#xff1a;继承Threa…

k8s之HPA实践——实现Web服务器的自动伸缩特性

文章目录 在生产环境中&#xff0c;总会有一些意想不到的事情发生&#xff0c;比如公司网站流量突然升高&#xff0c;此时之前创建的Pod已不足以支撑所有的访问&#xff0c;而运维人员也不可能24小时守着业务服务&#xff0c;这时就可以通过配置HPA&#xff0c;实现负载过高的情…

AI时代来临,AI基础数据服务行业未来发展有哪些变化

AI基础数据服务是针对人工智能&#xff08;AI&#xff09;领域提供的一项服务&#xff0c;它包括数据采集、数据清洗、信息抽取和数据标注等服务。AI基础数据服务旨在为AI算法的训练和优化提供必要的数据支持&#xff0c;为AI算法的性能提供保障。 标贝科技提供专业的数据采集、…

写的一致性问题之双写模式

文章目录 1、先写mysql&#xff1a;mysql会回滚&#xff0c;而redis不会回滚2、先写redis&#xff1a; 1、先写mysql&#xff1a;mysql会回滚&#xff0c;而redis不会回滚 写入msql成功&#xff0c;写入redis也成功&#xff0c;但是后续事务提交失败&#xff0c;mysql会回滚&a…

自己开发完整项目一、登录功能-04(集成jwt)

一、说明 前面文章我们写到了通过数据库查询出用户信息并返回&#xff0c;那么在真实的项目中呢&#xff0c;后端是需要给前端返回一个tocken&#xff0c;当前端通过登录功能认证成功之后&#xff0c;我们后端需要将用户信息和权限整合成一个tocken返回给前端&#xff0c;当前端…

硬盘数据恢复的正确姿势,这4款神器让你2024年秒变IT达人

现在&#xff0c;数据对我们超级关键&#xff0c;干啥都缺不了。但要是数据没了或者手一滑给删了&#xff0c;那可真够呛。甭管是点错了、电脑故障还是硬件磕了碰了&#xff0c;数据丢了可是大麻烦。不过幸亏科技一直在进步&#xff0c;硬盘数据恢复的技术也越来越厉害&#xf…

最近大模型最火的就业方向有哪些?

在2023和2024年&#xff0c;大语言模型的发展迎来了绝对风口&#xff0c;吸引了大量创业者和投资者。然而&#xff0c;经过一年的发展&#xff0c;许多公司已经销声匿迹。那么&#xff0c;未来大模型方向上还有哪些可以继续发展的方向呢? 基座大模型预训练 现状 - 展现出“胜…

CST软件如何仿真Total Scan方向图的

本期将介绍如何在CST软件中得到Total Scan方向图。 CASE1 首先以两个dipole天线为例&#xff0c;如下图所示&#xff1a; 我们完成这个两单元阵的仿真&#xff0c;可以在远场结果看到各个频点的结果如下图所示&#xff1a; 我们可以在combine按钮下任意合成不同幅度相位下的结…

R-Adapter:零样本模型微调新突破,提升鲁棒性与泛化能力 | ECCV 2024

大规模图像-文本预训练模型实现了零样本分类&#xff0c;并在不同数据分布下提供了一致的准确性。然而&#xff0c;这些模型在下游任务中通常需要微调优化&#xff0c;这会降低对于超出分布范围的数据的泛化能力&#xff0c;并需要大量的计算资源。论文提出新颖的Robust Adapte…

2025入局自动驾驶的秋招人,应该瞄准哪些技术方向?

2024年已过大半&#xff0c;9月随着开学季的来临&#xff0c;2025届的毕业生也纷纷踏出了秋招的第一步。 无论是在学生期间就深耕许久智驾技术、还是从其他赛道转战至智驾&#xff0c;自2023年末一直到今年上半年来&#xff0c;都一直国内智驾行业层出不穷的各种破圈动态刷屏。…

免费OCR 文字识别工具

免费&#xff1a;本项目所有代码开源&#xff0c;完全免费。 方便&#xff1a;解压即用&#xff0c;离线运行&#xff0c;无需网络。 高效&#xff1a;自带高效率的离线OCR引擎&#xff0c;内置多种语言识别库。 灵活&#xff1a;支持命令行、HTTP接口等外部调用方式。 功能…