title: 十天手搓minRAG,操纵DeepSeek的幕后黑手 CreateTime: 2025-02-20 13:00:19 UpdateTime: 2025-04-03 11:07:01 CategoryName: AI --- 如果你想让```DeepSeek```乖乖听话,成为手中的提现木偶,建议阅读此篇. RAG本质是使用本地知识库,组装成提示词(Prompt),发送给大模型,让大模型回答期望的结果. 例如把以下内容发给```DeepSeek```: ```text 根据提供的文档,回答问题\n 文档:\n minRAG是最简单的RAG系统,项目地址:https://gitee.com/minrag/minrag\n 什么RAG系统最简单? ``` ![01.png](/public/upload/ai/minrag/01.png) 图上可以看出,```DeepSeek```的回答实际是由RAG组装的提示词(Prompt)决定的,这样就完成了对```DeepSeek```的操纵。如果没有提示词 (Prompt),```DeepSeek``` 就是脱缰的野马,自由发挥了...... 当然,我们的程序是不能直接控制```DeepSeek```的问答页面的,所以我们需要调用```DeepSeek```的接口,自己做个类似```DeepSeek```的页面,然后把提示词和用户的问题一起发给```DeepSeek```. 感谢Gitee AI提供的每天免费100次调用,我们用 ```DeepSeek-V3``` 模型进行测试, 访问 [https://ai.gitee.com/hf-models/deepseek-ai/DeepSeek-V3/api](https://ai.gitee.com/hf-models/deepseek-ai/DeepSeek-V3/api) ![02.png](/public/upload/ai/minrag/02.png) 图中可以看出,我们使用Gitee AI的免费体验令牌,在```System Prompt```系统提示词中输入了minRAG的信息,然后在输入框里发送了问题```什么RAG系统最简单?```,```DeepSeek-V3```就输出了我们想要的答案. 实际完整的```curl```请求如下: ```shell curl https://ai.gitee.com/v1/chat/completions \ -X POST \ -H "Authorization: Bearer A4FTACZVPGAIV8PZCKIBEUGV7ZBMXTIBEGUGNC11" \ -H "Content-Type: application/json" \ -d '{"model":"DeepSeek-V3", "messages":[ {"role":"system","content":"根据提供的文档,回答问题\\n \n文档:\\n \nminRAG是最简单的RAG系统,项目地址:https://gitee.com/minrag/minrag\\n \n"}, {"role":"user","content":"什么RAG系统最简单?"} ] }' ``` 我们可以看到,```messages```数组中,有```system```和```user```两种类型的消息,```system```信息就是有RAG系统组装成的提示词(Prompt),```user```是用户的问题.```assistant```是```DeepSeek```的回复,如下图: ![03.png](/public/upload/ai/minrag/03.png) 图中我们可以看到,大模型已经回复了我们想要的结果.恭喜你,至此,你已经完全掌握了RAG的心法. 如何根据用户的问题,组装系统提示词呢? 聪明的你一定有了好答案,使用全文检索搜索引擎呀! 我们根据用户的问题,从资料库中,搜索相关联的内容,组装成提示词就可以了呀. 是的,但是还可以更近一步,使用向量数据库.最简单的场景,我们的资料库里是中文,用户用英语,德语提问怎么办?跨语种的向量模型(Embedding)可以根据语义相似匹配,例如```bge-m3```模型. 嗯,那我们就把全文检索和向量模型都使用,然后拼接在一起,这样就可以了. 可是这样发给大模型的信息就很多了,比如全文检索搜索出来10条,向量数据库匹配了10条,我们组合起来就要发给大模型20条了. 有没有办法在发送之前,对这20条信息进行评分? 有的,就是重排序(```reranker```)模型,例如```bge-reranker-v2-m3```模型,根据用户的问题,从20条信息中筛选最接近的几条信息. 到这里,感觉已经大功告成了呀.可是,一个文档的内容很多呀,可能上万字,一部小说上百万字,不能一次性都发给```DeepSeek```,它也吃不下呀..... 于是呀,就需要对这些文档进行拆分切割,把大文章拆成一个个的小块```chunk```,这样只需要发小块```chunk```给```DeepSeek```就可以了呀. 哎呀,还有问题,如果用户上传word,pdf格式怎么办?还要把内容提取成文本,因为```DeepSeek```的接口只支持文本呀. 于是,就有了RAG的基本处理流程: ![04.png](/public/upload/ai/minrag/04.png) 然后又需要对流程进行自定义的编排,就是流水线....... 完成以上工作,```minRAG```用了10天,不超过1万行代码,RAG 从未如此简单. ```minRAG```是从零开始的RAG系统,追求极致的简单和强大,无需安装,双击启动.支持OpenAI、Gitee AI、百度千帆、腾讯云LKE、阿里云百炼、字节火山引擎等AI平台. 项目地址: https://gitee.com/minrag/minrag 下载体验: https://gitee.com/minrag/minrag/releases ![demo.png](/public/upload/ai/minrag/demo.png)