1.从0实现一个最简RAG系统

张开发
2026/4/16 1:39:38 15 分钟阅读

分享文章

1.从0实现一个最简RAG系统
预热RAG系统比较官方的定义如下‌RAG‌Retrieval-Augmented Generation检索增强生成是一种结合‌信息检索‌与‌大语言模型生成能力‌的技术框架旨在提升大模型在回答问题、生成内容时的‌准确性、可解释性和实时性‌。这听起来不像人话说人话定义RAG系统是在一般语言大模型的基础上增加了信息检索能力这样大模型在回答你问题之前会去先检索相关信息基于相关信息再回答问题这种方式能在一定程度上消除幻觉。废话少说开始手搓代码因为涉及到大预言模型所以语言咱们还是选择python语言而且python语言有很多可以调用的库都是非常强大的工具同时这些年随着python语言的迭代这种语言多了越来越多方便的花式写法。由于是刚开始的代码所以今天简单点先做一个最基础的东西能调用大模型先回答一个简单的问题就好这一步很重要因为后面所有的工作都是基于大模型问答的所以今天的目标是用代码让大模型回答问题就好。语言模型还是选择Openai 这里其实也可以用一些国产模型或者其他模型但是有意思的是现在基本上所有模型都能兼容openai什么意思意思是如果你用了openai的基座现在市面上所有的模型你都能直接拿来用只需要改一下api_key和base_url就行。fromopenaiimportOpenAI clientOpenAI(api_key,base_urlhttps://api.deepseek.com#这里也可以使用其他的语言模型)有了大模型就需要准备咱们的问题和文本内容了。contextTransformer 是一种用于处理序列数据的模型结构广泛应用于自然语言处理任务。questionTransformer是干嘛的有了问题和文本内容后就可以开始调用大模型了具体调用方式参考官方文档即可可能随着版本更新调用方式发生变化但是原理大差不大responseclient.chat.completions.create(modeldeepseek-chat,messages[{role:system,content:你是一个擅长解释论文的助手},{role:user,content:context\n\n问题question}])print(response.choices[0].message.content)RAG原理解读RAG系统听起来很复杂但是底层原理一旦解读将会非常简单下面我们来说说RAG的底层原理和逻辑。RAG检索基于的核心是相关领域知识检索简单来说当用户问到一个问题后RAG系统会到知识数据库中去检索与该问题相关的知识然后基于找到的知识回答用户的问题。整个原理如上所说实现过程中将会利用到一个绕不开的过程那就是Embedding嵌入说到了Embedding嵌入就要稍微展开一下了因为这涉及到机器理解我们世界的文本。Ai中数据的本质我们的有语言文字、图片、视频以及声音但是这些东西是我们能感觉到的但是机器不一样 计算机的世界只有0/1代码以及其能表示的一堆数据那么问题来了如何让计算机也能感受到和我们一样世界呢准确说如何让计算机也理解我们的世界呢这就涉及到计算机中的数据表示了。其实很好理解相信很多人也都知道在计算机中图片数据本质上就是三个矩阵一张彩色的图片在计算机的世界中是三个矩阵也就是表示红、绿、蓝三色光的矩阵当三色光矩阵的数据在现实器同时输出你也就看到一张彩色的图片。同样的在计算机中英文数据由美国上个世纪提出的ASCII码表示但是我们学过计算机的人都知道ASCII码只能表示英文后面为了表示中文编码集又扩展Unicode、UTF-8等编码今天中文在计算机中的表示或者更准确说在机器学习中的表示又One-hot独热编码和基于深度学习的表示其中基于深度学习的表示涉及到文本嵌入后面会详细展开但是要知道One-hot表示相对来说会占据更多的内存但是基于深度学习的特征表示即嵌入embedding方法占用的空间会下降一些。为什么要用Embedding嵌入的好处很多首先一点是可以将一个高纬数据映射到低纬空间另外一点是可以增加一些数据的可解释性和推理能力例如king−manwomanqueen king - man woman queenking−manwomanqueen此外我个人理解嵌入还有一些好处将平时我们所见的数据嵌入到一个高纬的数据空间那么数据将会具备一些低纬空间不具备的特点和特性这样利用这些特点和特性可以很好的解决一些低位空间很难判断的问题。最典型的就是啤酒和尿不湿的案例两类看似不相干的东西但是在数据特点上存在某种正相关的关系人们利用这点将啤酒和尿不湿的货架放在一起可以提高销量。地基代码刚刚说到RAG的技术原理是基于知识检索的这些知识是将网络上大量的长文本切碎成小碎片存储的那么今天先实现一个简单的将知识切碎存储并手动选择一个知识回答问题的系统后面将会进行优化在优化中将会实现自动筛选有效知识。fromopenaiimportOpenAI clientOpenAI(api_key,base_urlhttps://api.deepseek.com)defsplit_text(text,chunk_size100):#用于切分知识的函数chunks[]foriinrange(0,len(text),chunk_size):chunks.append(text[i:ichunk_size])returnchunks#假设text是知识text隐写分析steganalysis是指针对隐写术的检测与破解技术旨在通过分析数字载体的统计特性判断其中是否存在隐蔽信息并在可能的情况下进一步提取或破解隐秘内容。作为信息安全监管的重要手段隐写分析的核心在于破坏隐秘通信的隐蔽性实现对潜在威胁的感知与阻断。从技术路径上隐写分析可分为被动分析与主动分析两类前者仅判断载体中是否包含秘密信息后者则进一步尝试恢复嵌入内容或推断隐写算法参数。检测对象覆盖图像、音频、视频等多模态载体分析方法经历了从早期基于统计特征如均值、直方图、高阶统计量的检测到利用离散余弦变换DCT、离散小波变换DWT等频域变换检测块效应与嵌入痕迹再到当前以卷积神经网络CNN为代表的深度学习模型自动提取高维语义特征的发展历程。评估检测性能的关键指标包括真阳性率与假阳性率等。隐写分析的概念于1998年由Neil F. Johnson等学者在国际信息隐藏会议上正式提出早期研究以统计检测方法为主近年来研究重心逐步转向特征表达优化与分类器设计并开始探索面向生成式隐写等新兴技术的通用分析框架以适应隐蔽通信技术不断演进的对抗需求。chunkssplit_text(text)#chunks是切碎的知识selected_chunkchunks[0]#先手动选一个相关知识假设已经切碎的知识第一条是相关知识后面会做自动化处理question这段的核心思想是什么#这是你问大模型的问题然后他会去找相关知识回答。responseclient.chat.completions.create(modeldeepseek-chat,messages[{role:system,content:你是一个擅长解释论文的助手},{role:user,content:selected_chunk\n\n问题question}])print(response.choices[0].message.content)

更多文章