“ 向量数据库是RAG技术的重要底座之一 ”
关于RAG和向量数据库的基础知识这里就不再做介绍了,不懂的可以翻看之前的文章。
今天的主要目的是使用milvus向量数据库来实现RAG检索增强,后面会附上代码。
使用milvus实现RAG
RAG的核心在于检索,而与传统字符匹配和分词检索方式不同的是RAG主要是基于语义检索的方式,也就是向量检索。而一个好的向量数据库就成为RAG技术环节中必不可少的一环。
备注:RAG并不是只支持向量检索,也可以使用传统的检索方式,主要根据不同的应用场景选择最合适的方式;RAG的核心是准确,高效的检索到有效数据,也就是说RAG重视的是结果,而不是过程。
milvus是我国企业自主开发的一款向量数据库,根据其官方介绍,milvus既可以方便本地开发测试,也可以大规模集群部署支持上百亿的向量检索需求。
而且,milvus同时还支持多种检索方式和算法:
并且集成多种语言的SDK:
当然,今天的主要目的不是为了给milvus产品打广告,而是使用milvus实现RAG——检索增强问答系统。
https://milvus.io/docs/zh
milvus官方文档
_安装milvus_
milvus有多种版本,每种版本支持的场景不太一样,但安装方式都非常简单。
轻量级可以直接通过pip进行安装,并直接嵌入到python代码中:
# 本地python sdk 使用``pip install mivlus
而单机版和集群版都是通过docker 进行安装,官方提供了详细的安装命令:
# 单机安装 linux系统 需要梯子``curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh`` ``bash standalone_embed.sh start``
版本 | 说明 | 使用场景 | 数据量 |
milvus Lite | 轻量级版本 | 常用于本地开发使用 | 百万到千万级向量数据 |
milvus Standalone | 单机版 | 常用于小规模用户使用 | 上亿级向量数据 |
milvus Distributed | 集群版 | 常用于大规模业务场景 | 百亿级向量数据 |
为了方便管理,milvus提供了一个可视化的客户端工具——attu,只需要一个命令就可以安装:
# attu 安装命令 这个{milvus server IP} 要换成你自己的服务器地址或本地地址` `docker run -p 8000:3000 -e MILVUS_URL={milvus server IP}:19530 zilliz/attu:v2.4`` ``项目地址: https://github.com/zilliztech/attu
这里有一个坑, zilliz/attu:v2.4 attu的镜像有些平台会拉不下来,大家可以换个思路使用自己的电脑或者能够拉下attu镜像的服务器,拉取之后把使用 save命令把镜像保存下来,然后再部署到你的电脑或服务器上。
当然,attu客户端工具并不是必须的,只是方便管理milvus ,也可以不使用。
如下是attu的管理页面:
用户本地或在服务上安装好milvus向量数据库之后,就可以直接使用了。
在python 中连接milvus数据库的方式有两种,然后用户所有与milvus数据库的操作都可以基于milvus_client客户端对象实现。
# milvus 客户端有两种连接方式 一种是本地开发测试使用 一种是独立部署``# 独立部署方式``# milvus_client = MilvusClient(``# uri="你的milvus ip:19530",``# token="root:milvus" # 默认用户名和密码` `# )`` ``# 本地方式 会在本地创建一个milvus 数据库``milvus_client = MilvusClient("milvus_demo.db")
其次,milvus也像传统的关系型数据库一样,拥有数据库的概念;不同的数据可以放到不同的数据库中,默认数据库就是default,如果你没有声明或创建数据库,那么你的数据默认都在default数据库中。
但milvus的主要操作是通过Collections来实现的;Collections就类似于传统数据库中的表结构。
如下图所示:
在学会milvus数据库的基本使用之后,就可以通过嵌入模型把数据导入到milvus数据库的collection中;然后通过调用大模型实现RAG问答。
详细实现可以查看官方文档:
https://milvus.io/docs/zh/build-rag-with-milvus.md
完整代码如下所示,这里使用的是阿里云的通义千问模型,嵌入模型使用的也是阿里云的嵌入模型;当然milvus官方也提供了一些嵌入模型,用户也可以根据自己的喜好选择一些第三方的模型。
需要安装的python 包,当然作者这里只是记录了一部分包,如果代码执行出错提示缺包,用户自行下载即可。
!pip install jq``!pip install pymilvus[model]``!pip install pymilvus``!pip install tqdm``!pip install openai`` ``# python 环境是3.9
这里的代码是完整的可执行代码,只需要把文件路径换成你本地下载的文件即可;还有就是大模型客户端可以选择你自己的模型和key。
这里的测试文件使用的是milvus官方提供的问题文档,下载地址:
https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
from glob import glob``from openai import OpenAI``from pymilvus import MilvusClient``from tqdm import tqdm``import json`` ``text_lines = []`` ``# 路径 milvus_docs/en/faq/*.md``for file_path in glob("换成你的文件路径", recursive=True):` `with open(file_path, "r") as file:` `file_text = file.read()`` ` `text_lines += file_text.split("# ")`` ``print("text_lines: ", text_lines)`` ``# 这里使用的是openai的工具包 可以连接openai, 通义千问, 等多种兼容openai格式的大模型服务商 这里使用的是阿里的通义千问模型``openai_client = OpenAI(` `api_key="换成你的key",` `base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"``)`` ``# 嵌入模型``def emb_text(text):` `return (` `openai_client.embeddings.create(input=text, model="text-embedding-v3").data[0].embedding` `)`` `` ``test_embedding = emb_text("This is a test")`` ``embedding_dim = len(test_embedding)`` ``print(embedding_dim)``print(test_embedding[:10])`` ``# milvus 客户端有两种连接方式 一种是本地开发测试使用 一种是独立部署``# 独立部署方式``# milvus_client = MilvusClient(``# uri="你的milvus ip:19530",``# token="root:milvus"``# )`` ``# 本地方式 会在本地创建一个milvus 数据库``milvus_client = MilvusClient("milvus_demo.db")`` ``collection_name = "my_rag_collection"`` ``if milvus_client.has_collection(collection_name):` `milvus_client.drop_collection(collection_name)`` ``milvus_client.create_collection(` `collection_name=collection_name,` `dimension=embedding_dim,` `metric_type="IP",` `consistency_level="Strong"``)`` ``data = []`` ``for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):` `data.append({"id": i, "vector": emb_text(line), "text": line})`` ``print("data: ", len(data))`` ``milvus_client.insert(collection_name=collection_name, data=data)`` ``question = "How is data stored in milvus?"`` ``search_res = milvus_client.search(` `collection_name=collection_name,` `data=[` `emb_text(question)` `],` `limit=3,` `search_params={"metric_type": "IP", "params": {}},` `output_fields=["text"]``)`` ``retrieved_lines_with_distances = [` `(res["entity"]["text"], res["distance"]) for res in search_res[0]``]`` ``print("retrieved: ", retrieved_lines_with_distances)`` ``print(json.dumps(retrieved_lines_with_distances, indent=4))`` ``context = "\n".join(` `[line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]``)`` ``SYSTEM_PROMPT = """``Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.``"""``USER_PROMPT = f"""``Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.``<context>``{context}``</context>``<question>``{question}``</question>``"""`` ``response = openai_client.chat.completions.create(` `model="qwen-plus", # 可以换成你自己喜欢的模型` `messages=[` `{"role": "system", "content": SYSTEM_PROMPT},` `{"role": "user", "content": USER_PROMPT},` `],``)``print(response.choices[0].message.content)`` ``
当然,上面文章写的不明白的地方,用户可以自己看milvus的官方文档,操作起来真的特别简单,这个案例就是作者自己根据milvus的官方文档实现的。
文档地址:https://milvus.io/docs/zh/build-rag-with-milvus.md
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。