RAG本地部署时遇到的一些问题和心得

2025年7月1日更新:用了一段时间谷歌的notebookLLM,便捷性准确性高效性,我原称之为目前notebookLLM地表最强RAG工具,仅仅是个人用户免费使用,其他的RAG工具都可以退下了。

--------------------------以下是原文-------------------------------

本文在我部署RAG知识库时,所遇到的一些情况,稍微整理一下思路,非专业人员,可能有误。

RAG系统是一种结合了信息检索和文本生成能力的AI架构。它的核心思想是,当需要生成文本时,不是仅仅依赖预训练模型自身的知识,而是先从外部知识库中检索相关信息,然后将检索到的信息作为上下文,辅助模型生成更准确、更丰富的文本。

说人话:就是把你的资料上传到一个库,作为一个外部知识库,通过某些开源工具的检索方式,输出资料的片段给大模型,大模型先读取你的片段再回答问题。

操作过程:用户上传文档→用户在开源工具里把文档按token分割成更小的块→存储分块,建立向量数据库,文本块转换成向量表示,实现语义检索。

模型过程:接收用户提出的问题→提取问题里关键字,在数据库中检索相关的文本块→对检索到的文本块进行重新排序,选出与查询最相关的文本块→将重新排序后的文本块进行整合→利用整合后的上下文,生成最终的回复。

网上随便搜出来几分钟的速搭教程,基本上教学都是教操作过程,一般傻瓜跟着操作也能部署,比较容易遇到分块或索引过程中出现错误,可能会需要换开源工具或者换embedding模型。而真正使用知识库,99%用户会遇到的问题是查询时,发现检索到的信息可能过于宽泛或过于狭窄,与实际需求不符的情况。一般RAG卖课付费的内容,也是在解决这些问题。

以下都是针对查询过程(Query Process)遇到的困境和痛点。

如,在模型提取关键字,去向量数据库里查询块,到重排序块返回,这一步容易出现:检索器搜索不到关键词,找不到正确的块

或是,模型将排序后的文本块进行整合,形成更连贯的上下文,这一步出现:整合后的上下文存在逻辑错误或信息冗余,返回小说的第30章和70章的片段,模型把他们拼一块,强行解释了因果

或是,模型输出回复,这一步:模型提不出关键信息,理解不了内容乱答。

一、RAG 的检索阶段痛点


RAG 在检索阶段主要存在三大痛点:①自身本文质量的问题,②使用软件自身的检索策略,③embedding模型

1、文本质量:要构建高质量知识库,人工处理数据是最佳方式。比如采用 QA 式问答形式,或者构建排版清晰、条理明确的文本。若直接上传从网上搜索的电子书、网盘下载的盗版 PDF 文档,切割后的数据往往不理想,可能出现数据丢失或夹杂大量无用信息的情况。有关向量检索的技术逻辑十个博主九个把这个说的很高大上,但是实际使用,它只能关联父亲=爸爸,而你指苹果说iphone,向量检索基本上无法建立对应的联系,因此也就检索不出相应的片段。所以你在提问时,要把它当作一个搜索工作,而不是有问必答的ai助手。
解决方法:人工数据清洗,这里笔者做的只是减少输出给大模型的垃圾信息,对于长文本类的小说散文,数据清洗的收益不大。

2、软件检索策略:市面上有众多部署 RAG 的开源工具,由于各工具的检测策略和检索算法不同,对相同问题的检索结果差异较大。有些工具能准确召回相关片段,而有些则返回风马牛不相及的文本。使用的软件决定了最终返回的片段顺序。
解决方法:找出最适合混合检索架构,个人实测后感觉RAGflow的策略是最强的,笔者问了一个干扰项的问题,同向量模型只有RAGflow召回了正确的片段。

3、embedding 模型:embedding 模型决定了模型对语义关联的理解程度,他决定了当你问“爸爸”时,它知不知道,爸爸同时也指父亲,你说苹果时它能不能猜iphone。
解决方法:挑选合适的embedding中文模型,笔者测试了免费开源的bge和阿里收费的textv3,发现召回确实收费的强。

DeepSeekR1本地RAG知识库(13):Embedding模型讲解(小白也能懂) - 今日头条

Embedding模型讲解,如何提高知识库问题准确率?_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1XzADeFEMs/?spm_id_from=333.1007.tianma.2-2-5.click&vd_source=e0e4e4122d077cc783600ddc34cdbd00


二、RAG 的增强阶段难点


此阶段是大模型的信息输入阶段,RAG 技术将检索到的信息传递给大模型,存在以下潜在问题:①输入给大模型,检索到质量很差的片段。②输入给大模型,很少的信息。③输入给大模型,跳跃性的片段。

1、片段质量差:表现返回来的信息与问题不匹配,导致本地部署的大模型会出现“幻觉”式回答,如果模型接收到的信息乱七八糟和问题无关,并且你本地部署模型推理能力还不强,有很多的模型是不能发现检索信息是碎片化的、毫无关系的,就会强行编造虚假回复,或者发疯式输出,你问天他答地。
解决方法:前期召回不匹配的片段,可以尝试换个工具换检索策略和换embedding模型,进行召回测试看哪个工具能匹配的上片段。LLM模型则需要更换能够进行长思维链模式的模型,加明确prompt限制,让大模型回复禁止瞎编。

2、信息整合不充分:信息整合不足,明明答案就在返回头部片段里,但是大模型无法准确回答,生成笼统、缺乏实质内容的重复性回答,或者是生成不准确或模棱两可的回复。
解决方法:如果模型召回是排序靠前的片段出现问题,则在前期策略阶段更换更大maxtoken的embedding模型,模型回阶段换更联系输出更多token的大语言模型。限制token K的段数,从策略的优化。如果模型召回片段排序在后面,更换reranker模型。

3、缺乏上下文:检索到的文本片段可能被截断或上下文缺失,致使大模型无法正确理解信息含义,进而生成错误回答。
解决方法:优化提问方式,可分步骤提问,因为模型有自动联系上下文的功能,或者用api,或写提示词,让它不要瞎编。

三、RAG 的生成阶段表现


这一阶段是大模型的输出阶段,常出现以下情况:①大模型输出被截断。②回答很笨。③回答很慢。

1、输出截断:本地部署的大模型存在 token 限制,若第二阶段输入的片段字数过多,占用大量 token,大模型可能因无剩余 token 而导致输出截断。
解决方法:设置模型的最大 token 数,这可能需要强大的硬件支持,或者直接使用 Api。

2、回答质量差:大模型性能不佳时,无法依据检索信息进行正常判断推理,生成的回答仅复述检索内容,缺乏深度推理和创新性见解。
解决方法:尝试不同的模型。

3、检索范围过大,会引入大量无关信息,增加模型处理负担;检索范围过小,则可能遗漏关键信息,导致回答不完整。过多无意义的垃圾信息会干扰模型回复。
解决方法:过多,给模型的无意义的垃圾信息太多了,反而给模型的回复造成了干扰,用更智能能判断上下文因果的模型,或者是用更精确的检索。模型回复很慢,这个无解,只能找api用。

我所提出的解决办法只是基于实践的设想,若有更优方法,欢迎交流探讨。

笔者RAGflow聊天模式突然无法读取知识库了,之前发现dify输出+ragflow的检索策略还挺好用,召回比dify自带的要准确,输出又比ragflow块,推荐给各位

dify外挂ragflow+千问QWQ,解决dify解析和检索短板 - 知乎

-----------------------------------------------

更新,在B站刷了几个视频感觉也说到了我遇到的问题,解决的办法待完善

RAG实战中的常见问题_哔哩哔哩_bilibili

另外一种解决方法的思路:

用notebookLM分析deepseek技术报告,检索+AI,避免“幻觉”_哔哩哔哩_bilibili

### 部署RAG模型的本地环境设置 为了在本地环境中成功部署检索增强生成(Retrieval-Augmented Generation, RAG),需先安装必要的软件包并配置开发环境。这通常涉及创建虚拟环境来隔离项目依赖项,以及下载预训练的语言模型索引数据库。 #### 安装Python库 通过pip工具可以轻松获取所需的Python库文件。对于RAG来说,Hugging Face Transformers库提供了官方支持版本,允许用户加载已经过优化处理过的模型实例[^1]: ```bash pip install transformers datasets faiss-cpu torch ``` #### 下载预训练模型与索引 接着要准备的是从Transformers Hub上拉取预先训练好的查询编码器(query encoder) 上下文文档(context documents) 的向量表示形式。这些资源构成了后续问答环节中的核心组件之一: ```python from transformers import RagTokenizer, RagRetriever, RagTokenForGeneration tokenizer = RagTokenizer.from_pretrained("facebook/rag-token-nq") retriever = RagRetriever.from_pretrained( "facebook/rag-token-nq", index_name="exact", use_dummy_dataset=True ) model = RagTokenForGeneration.from_pretrained("facebook/rag-token-nq", retriever=retriever) ``` #### 构建私有知识库 如果希望利用自有数据集作为背景资料,则需要构建专属的知识图谱或FAQ列表,并将其转换成适合检索的形式存储起来供日后调用。此过程可能需要用到Elasticsearch或其他相似的技术栈来进行高效的信息检索操作。 #### 运行推理服务 最后一步就是启动一个简单的HTTP API服务器用于接收外部请求并将它们转发给内部逻辑层处理;Flask框架是一个不错的选择因为它简单易用而且社区活跃度高。下面给出了一段基本实现代码片段展示如何快速搭建这样一个接口: ```python from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/api/generate', methods=['POST']) def generate(): input_text = request.json.get('input') inputs = tokenizer(input_text, return_tensors='pt') generated = model.generate(inputs['input_ids'], num_return_sequences=1) output = tokenizer.decode(generated[0], skip_special_tokens=True) response_data = {"output": output} return jsonify(response_data), 200 if __name__ == '__main__': app.run(debug=False, host='0.0.0.0', port=8080) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值