最近在大型语言模型(LLM)领域,如GPT、Gemini等模型中,我们经常听到一个术语——"幻觉"(Hallucination)。这种现象指的是模型开始生成与事实不符的内容。为了解决这个问题,机器学习社区发明了一种称为RAG(检索增强生成)的方法。今天,我将分享如何利用RAG技术构建一个能够访问整个互联网的AI搜索引擎。
RAG的核心思想很简单:在将用户查询输入模型之前,先为其提供与查询相关的背景知识。这就像开卷考试一样——我们为模型提供与问题相关的参考资料,模型基于这些资料来生成答案。这些知识可以来自任何地方:PDF文档、文本文件,甚至是互联网(包括Google搜索)。那些需要付费才能访问互联网的聊天LLM,其实可以用这种方法免费实现。虽然在速度和准确性上可能不如付费选项,但总比没有强。
RAG模型的基本架构包含两个主要组件:预训练的检索器(查询编码器+文档索引)和预训练的序列到序列模型(生成器)。整个过程采用端到端的微调方式:
但在我们的实际项目中,对这个架构做了一些调整。我们的文档直接来自Google搜索结果——当用户提出问题时,首先将查询发送到Google,然后从搜索结果中提取所有链接(当然不包括广告)。
从Google获取的页面数据虽然已经根据PageRank算法进行了排序,但仍然包含大量无关文本。为了筛选出最相关的内容,我们需要:
提示:句子分块的大小需要根据具体应用场景调整。对于一般问答,200-300个token的块大小通常效果较好。
我们选用Google的Gemma-7b-it作为生成器模型。这是一个已经经过指令微调的模型,对于70亿参数的模型来说表现相当出色。与RAG方法结合后,它的性能更加优秀。
与原始论文不同,我们的方法没有使用端到端的反向传播,而是仅使用模型进行推理。这虽然牺牲了一些性能,但大大简化了实现难度。
整个项目主要使用以下技术:
在实际开发中,我们遇到了一些性能挑战:
GPU内存管理:当需要编码和存储大量数据时,应用程序会变得不稳定。解决方案包括:
响应速度:Google搜索和模型推理都需要时间,导致整体响应较慢。可以尝试:
硬件要求:Gemma-7b-it可以在配备16GB VRAM的RTX 4090上运行,但对于更大规模的部署,需要考虑:
虽然这个方案可以查询最新事件(不受LLM训练数据时间限制),但输出结果有时感觉比较通用,不够针对特定目的进行优化。这可能是因为使用的7B参数模型能力有限。要获得更准确的答案,可以:
问题:从网页抓取的文本包含大量噪音和无用信息。
解决方案:
问题:余弦相似度返回的结果与查询意图不符。
解决方案:
问题:模型输出过于通用,缺乏针对性。
解决方案:
如果你不想从头开始构建整个系统,可以考虑以下替代方案:
使用LangChain框架:
扩展功能:
性能优化:
在实际使用中,我发现这个方案特别适合需要最新信息的查询场景,比如技术问题解答、新闻摘要等。虽然响应速度不如商业API快,但零成本的优势使其成为个人项目和小规模应用的理想选择。