赞
踩
前几天学习了SmartFlowAI/Hand-on-RAG项目里的RAG方面的内容,在这里写一篇文档总结一下
该仓库是一个从零开始实现大模型RAG的的项目,主要是llama-index和langchain不太好魔改:)
在本仓库的RAG实现过程主要包括三个基本步骤:
索引 — 将文档库分割成较短的 Chunk,并通过编码器构建向量索引。
这里分割成chunk是先按换行符分割行,每一行作为一个chunk,如果超出了最长文本,就把上一个chunk最后的cover_context拿出来和下一段拼凑一下?
检索 — 根据问题和 chunks 的相似度检索相关文档片段。
这里使用cosine similarity来比较文章相似度,当然也可以用欧式距离,曼哈顿距离之类的方法。
生成 — 以检索到的上下文为条件,生成问题的回答。
方法是将检索到的上下文插入到prompt temple里,然后送到大模型里提问。
RAG的方法和在网页上上传文件再提问的方法不一样,上传文件时文件的所有内容都会被放进上下文窗口内,如果文件长度超过窗口长度,模型不能处理。
而RAG只从文件筛选出匹配度高的chunk输入模型,不会占用太长的上下文。
如果用户的提问和知识库里的文本不能完全匹配导致引用到错误的上下文怎么办?这时候需要对用户提问做一下改写,或者将知识库的文本和问题匹配成问答对,然后匹配的时候使用用户的问题和问答对里的问题匹配。
参考:
朴素RAG的主要步骤是索引-检索-生成,具体如下:
建立索引:这一过程通常在离线状态下进行,包括数据清理、提取,将不同文件格式(如PDF、HTML、Word、Markdown等)转换为纯文本,然后进行文本分块,并创建索引。
检索:使用相同的编码模型将用户输入转换为向量,计算问题嵌入和文档块嵌入之间的相似度,选择相似度最高的前K个文档块作为当前问题的增强上下文信息。
生成:将给定的问题和相关文档合并为新的提示,然后由大型语言模型基于提供的信息回答问题。如果有历史对话信息,也可以合并到提示中,用于多轮对话。
高级RAG旨在解决朴素RAG中存在的检索质量和生成质量的问题,主要方法是检索预处理和检索结果后处理。
检索预处理:主要方法是查询重写和数据库优化。查询重写是将用户的查询送入大模型重写为多个子问题或者关键字等更详细的信息以提高检索准确度。数据库优化包括增加索引数据的细粒度、优化索引结构、添加元数据等策略。
模块化RAG是一种更灵活的RAG实现,它允许不同的检索和生成模块根据特定的应用需求进行替换或重新配置,为整个问答过程提供了更丰富的多样性和更强的灵活性。模块化RAG范式正成为RAG领域的主流。
检索结果后处理:主要通过Reranker模型对检索结果进行重排以进一步筛选最相关的结果。或者对检索结果进行压缩以突出关键信息,同时一定程度上加快推理速度。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。