|
ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;display: table;padding: 0.5em 1em;color: rgb(63, 63, 63);text-shadow: rgba(0, 0, 0, 0.1) 2px 2px 4px;">使用 Milvus 快速搭建 RAG 服务ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">总结一下我使用 Milvus 做 RAG 时踩过的坑,如果你在正在给老师做项目,然后项目里又要求有知识检索(RAG)的功能,然后又愁不知道怎么做,可以看看我的总结。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;display: table;padding: 0.3em 1em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);border-radius: 8px;box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px;">一、云端 or 本地ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">Milvus提供了本地部署的方式,也就是用 docker 去部署一个 Milvus 数据库,然后把你的数据存进去就可以实现检索。但是用 docker 部署太重了,你需要写很多代码去实现更新数据,插入数据,查询数据等操作,然后最后向外提供 api 接口。这个流程就要花费不少时间。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">我们的首要目的是尽快搭建一个原型,RAG 的细节根本就不用去管,只有先做出来我们才会去考虑其他事情。因此,云端的免费的 Milvus 数据库就是我们的首要选择。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;display: table;padding: 0.3em 1em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);border-radius: 8px;box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px;">二、创建数据库ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">进入 zilliz 云,先完成基本的注册:https://cloud.zilliz.com/。注册成功后,按照里面的指引来,点击 create 创建一个 free 数据库。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;color: rgb(63, 63, 63);"> ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;margin: 0.1em auto 0.5em;border-radius: 8px;box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 8px;" title="null"/>ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">设置一下名字,然后参数保持默认就行了,然后点击 create 然后稍等片刻,初始化需要一点时间。 三、创建 Collection点击 Create Collection,创建一个 collection。  collection 你可以认为就是一张二维表,具有固定的列和变化的行。每列代表一个字段,每行代表一个实体。  接下来就是要填写 collection 的各种参数了。四、添加字段填写好 collection 名称后,我们首先要添加字段。 首先,我举一个例子,假如你是要做一个教材知识库,你拥有所有的高中地理教材,你对教材数据进行清理后,得到了如下的结构。  其中,id 是必须的,每个实体必须要有一个唯一的 id,book_name 是知识点对应的教材名,chapter,subsection 的意思分别是章和小节,source_type 和 source_name 不用管,这只是我这边项目的需求,然后 text 指的是对应的原文。 这个结构清晰的展示了每个知识点在教材库里的具体位置。 你做 RAG 的需求是:1. 我可以对 text 进行检索,比如搜索“人口分布的特点”,能够找到对应的原文片段。2. 我可以对 subsection_name 进行检索,这样我就能方便的找到小节的名称。 因此,你就必须要有两个字段,text_embedding 和 subsection_embedding,用于存储 text 和 subsection_name 向量化后的结果。 然后就是正式的添加字段了,Milvus 对于不同类型的字段的数据类型有要求,如果是 embedding 字段的话,就必须要用向量类型(Vector Fields),我们选择 FLOAT_VECTOR 就行了。  然后向量字段的 2048 指的是向量的维度,这个是根据实际情况来的,比如我用的是 Qwen 的 text-embedding-v4 作为 embedder,向量维度只能填下面的几个。  五、设置索引我们必须要对 embedding 字段设置索引,加快检索速度。设置界面其实已经默认给你设置好了,用的是 AUTOINDEX,意思就是会根据你的实际情况,自动选择合适的索引类型。  其他保持默认,最后点击 create,成功创建 六、插入数据插入数据有两种方法,一是直接在界面选择导入数据,我是导入 json 格式的,这种方法必须保证一下几点要求: 一是必须是一个实体一个实体的格式,例如我下面这种  二是字段名称必须和数据库里的名称一一对应,不能错,不能多也不能少。 三是 embedding 字段必须是已经生成好了的。这个需要单独先去处理,写一个脚本,调用阿里云百炼的 Embedding 模型或者其他模型,生成好实际的 embedding 向量  然后就能插入成功  第二种方法是写脚本,发送 post 请求,方法其实在里面就已经有介绍了,我就不多说了。  其实最简单的方法就是直接上传数据,因为如果你用第二种方法,就已经能够生成第一种方法需要的 json 数据了,没必要多此一举去发送 post 请求了。 七、查询数据查询数据需要发送 post 请求过去,其中需要配置 token 和 endpoint。其他的请求参数可以去文档里面看,里面介绍的详细。 export TOKEN="db_admin:xxxxxxxxxxxxx"
curl --request POST \ --url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \ --header "Authorization: Bearer ${TOKEN}" \ --header "Content-Type: application/json" \ -d '{ "collectionName": "quick_setup", "data": [ [ 0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592 ] ], "annsField": "vector", "limit":3, "outputFields": [ "color" ] }'
结语其实在做 RAG 这个功能之前,不妨多想想,你的项目真的需要做知识检索吗?大模型对于你项目里的知识库,真的有偏见吗? 就比如我这个,做的是地理教材知识库,大模型对于地理概念真的有偏见吗?难道大模型训练的时候没有去使用到教材吗?我觉得是没有偏见的,大模型肯定知道地理教材的一些基本概念,根本没必要实现一个 RAG 服务。与其做 RAG,还不如在 Agent 上面多花点功夫。 那么什么情况下适合使用 RAG 了,我觉得有两点:一、严肃的场合而非娱乐场合。比如医疗大模型,必须要用 RAG,因为药品的合适用量不是开玩笑的,否则会出事故的。二、大模型绝对的无知领域。比如公司业务大模型,任何 AI 肯定不知道你公司的具体事情,比如财务日报啊,员工信息啊,客户信息啊,这些东西大模型是绝对不知道的,才适合用 RAG。
|