ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

* LangChain中Milvus的使用指南

* LangChain中Milvus的使用指南 一、安装Docker DeskTop生产环境推荐Docker安装1.1 下载安装包官网https://www.docker.com/方式1选择版本下载方式2从视频资料里获取1.2 安装步骤1点击OK即可步骤2等待安装完成步骤3重启电脑或稍后自行重启也可以关闭窗口稍后自行重启。步骤4接受服务协议点击启动图标弹窗如下窗口选择跳过步骤5完成安装步骤6选择允许控制步骤7不登录使用步骤8跳过个别首次安装的小伙伴会被windows系统提示需要安装适用于Linux的Windows子系统。这里选择确认安装。稍等片刻后会完成安装。步骤9安装成功验证通过winr调取运行输入cmd输入docker。能显示如下内容即可成功1.3 设置Proxy我们后续下载的Milvus是最新版在国内可能没有对应镜像所以建议“xx上网”1.4 配置加速器(备选)因为 Milvus 镜像文件比较大好几百 MB 甚至上 GB加上 Docker Hub 的官方镜像源在国内访问经常受到网络限制或干扰所以会出现下载速度极慢、甚至卡死报错的情况。所以我们可以加速器。南京大学镜像站https://docker.dockerimages.jobcher.com阿里云的个人专属加速器免费且稳定。登录 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors在左侧导航栏选择镜像工具 - 镜像加速器在页面中你会看到一个属于你的 加速器地址。在Docker Desktop中-右上角的 齿轮图标-左侧配置Docker Engine { builder: { gc: { defaultKeepStorage: 20GB, enabled: true } }, experimental: false, registry-mirrors: [ https://rlmws9iw.mirror.aliyuncs.com, https://docker.dockerimages.jobcher.com ] }二、安装Milvus以管理员身份打开Docker Desktop确保Docker Engine状态正常后进行下一步打开powershell后续操作都在powershell命令行完成切换文件目录(base) PS C:\WINDOWS\system32 d: (base) PS D:\ cd D:\developTools\Milvus (base) PS D:\developTools\Milvus注意developTools\Milvus是你期望保存Milvus数据库的目录执行前需要确保此文件目录存在。不存在提前创建好。下载启动脚本(base) PS D:\developTools\Milvus Invoke-WebRequest https://raw.githubusercontent.com/milvus-io/milvus/refs/heads/master/scripts/standalone_embed.bat -OutFile standalone.bat说明1、执行完以后会在当前路径下生成standalone.bat文件。2、如果下载不畅可以打开ikun。执行命令(base) PS D:\developTools\Milvus .\standalone.bat start第三步我们将启动脚本安装在当前目录下通过bat文件传递启动命令。如果更换了启动脚本的下载位置更改命令指向该文件即可。查看状态本地缺少Milvus镜像会自动从云端拉取看到上图所示Start successfully 则启动成功。停止容器(base) PS D:\developToo1s\Milvus .\standalone.bat stop此外在Docker容器中可见三、测试前准备工作3.1 确保Milvus已启动(base) PS D:\developToo1s\Milvus .\standalone.bat start3.2 安装Milvus Python SDKpip install pymilvus # 已在requirements_full.txt文件中安装Milvus Lite已包含在Milvus的Python SDK中此处不用Milvus Lite直接访问在docker desktop安装的、Standalone模式的Milvus服务。3.3 Milvus数据模型3.3.1 整体结构从业务角度Milvus数据模型层级如下Database - Collection - Partition - EntityDatabaseMilvus 的数据库用来隔离不同业务数据。Collection最核心的逻辑容器类似于关系型数据库里的 table。Partition分区是 collection 的子集不是必须手动创建一个 collection 至少会有默认partition。Entity可以理解为 collection 中的一条记录。类似于关系型数据库的一行数据。3.3.2 具体说明在传统数据库中如果你想存储用户信息你会建一张表叫 user_table 想存储商品会建一张表叫product_table 。在向量数据库中我们要存储的是成千上万个“特征向量”以及它们对应的文本。为了把不同用途的向量分门别类地存放我们就要创建不同的 Collection。 比如COLLECTION_NAME “docs” 就是给这张“表”取名叫 docs 专门用来存放你切分好的文档片段向量。四、基本用法4.1 DDL操作4.1.1 Database4.1.1.1 查看数据库创建客户端from pymilvus import MilvusClient client MilvusClient(http://localhost:19530)列出所有数据库existing_dbs client.list_databases() print( Databases ) for db in existing_dbs: print(db)输出如下 Databases default4.1.1.2 创建数据库db_name rag_tutorial if db_name not in existing_dbs: client.create_database(db_namedb_name)4.1.1.3 删除数据库client.drop_database(db_namedb_name)如果数据库下有Collection则无法删除需要先删除它的所有Collection才能删除Database4.1.2 Collection4.1.2.1 切换数据库client.use_database(db_namedb_name)上述命令的作用等价于关系型数据库中的 use database4.1.2.2 查看数据库下的collectionscollections client.list_collections() print( Collections ) for collection in collections: print(collection)输出如下 Collections 4.1.2.3 创建collectioncollection_name docs client.create_collection( collection_namecollection_name, dimension1024, metric_typeCOSINE )dimension 嵌入向量维度应和嵌入模型的向量维度保持一致见下文。metric_type 表示向量相似度的计算方式COSINE 表示余弦相似度。当用户提问时系统会把提问也变成向量然后去数据库里找“最相似”的本地文本向量。但怎么定义“相似”呢 向量数据库需要知道计算规则。COSINE 余弦相似度关注的是两个向量在方向上的夹角如果两个向量方向完全一致代表文本意思极度接近余弦值接近 1 。如果方向正交毫无关系值接近 0 。结论在 RAG 检索时Milvus 会帮你计算用户问题与数据库中所有文本的余弦相似度并把得分Score从大到小排序把得分最高最相似的前 K 个片段还给你。 (注除了COSINE 之外常见的还有 L2 欧氏距离、IP 内积等。)4.1.2.4 删除collectionif client.has_collection(collection_namecollection_name): client.drop_collection(collection_namecollection_name)4.2 DML操作确保已删除名为docs 的collection下文会重新创建4.2.1 准备嵌入模型选择bge-m3 作为嵌入模型可以通过硅基流动调用该模型可以免费调用如果追求更低的延迟、更稳定的服务也可以充值后选择带有pro 前缀的模型如下所示这两款产品的模型是一样的区别只在于资费和服务保障。注册后获取硅基流动的API_KEY写入.env文件SILICONFLOW_BASE_URLhttps://api.siliconflow.cn/v1 SILICONFLOW_API_KEYYOUR_API_KEY准备嵌入模型代码如下from langchain.embeddings import init_embeddings import os from dotenv import load_dotenv load_dotenv(overrideTrue) # 初始化嵌入模型 embed_model init_embeddings( modelopenai:Pro/BAAI/bge-m3, api_keyos.getenv(SILICONFLOW_API_KEY), base_urlos.getenv(SILICONFLOW_BASE_URL), )或者from langchain_openai import OpenAIEmbeddings import os from dotenv import load_dotenv load_dotenv(overrideTrue) # 初始化嵌入模型 embed_model OpenAIEmbeddings( modelPro/BAAI/bge-m3, # 免费模型 ID: BAAI/bge-m3 base_urlos.getenv(SILICONFLOW_BASE_URL), api_keyos.getenv(SILICONFLOW_API_KEY), )4.2.2 准备collection4.2.2.1 创建collectionclient.create_collection( collection_namecollection_name, dimension1024, metric_typeCOSINE )根据模型维度创建匹配的collection。4.2.2.2 查看collection元数据from rich import print as rprint # 查看 collection 元数据 metadata client.describe_collection( collection_namecollection_name, ) rprint(metadata)输出如下{ collection_name: docs, auto_id: False, num_shards: 1, description: , fields: [ { field_id: 100, name: id, description: , type: DataType.INT64: 5, params: {}, is_primary: True }, { field_id: 101, name: vector, description: , type: DataType.FLOAT_VECTOR: 101, params: {dim: 1024} } ], functions: [], aliases: [], collection_id: 467030880814894392, consistency_level: 2, properties: {timezone: UTC}, num_partitions: 1, enable_dynamic_field: True, enable_namespace: False, created_timestamp: 467030999785013266, update_timestamp: 467030999785013266 }我们在创建collection时没有指定schema后者可以理解为表结构此时Milvus会将collection定义为默认结构。字段信息如下id 数据ID作为主键唯一标识数据vector 数据的嵌入向量此外enable_dynamic_field 为True 这表示 collection 支持动态字段。也就是说除了预定义的id 和 vector 字段之外在插入数据时还可以携带其他未提前声明的字段这些字段会被自动写入并统一存储在动态字段中。这样做的好处是能够在不修改 schema 的情况下灵活保存额外的业务属性例如文本内容、标签、时间戳或来源信息等适合字段结构不固定的场景。4.2.3 准备数据4.2.3.1 准备原始数据# 准备测试数据 texts [ LangChain 是一个用于构建 LLM 应用的开发框架。, Milvus 是一个适合 AI 应用的向量数据库。, RAG 的核心是先检索相关知识再让大模型生成答案。, Docker Desktop 可以方便地在本地运行 Milvus Standalone。 ]4.2.3.2 生成嵌入向量vectors embed_model.embed_documents(texts)4.2.3.3 查看生成的嵌入向量print(len(vectors)) print(len(vectors[0])) print(vectors[0][:5])输出如下4 1024 [-0.027955636382102966, 0.052097633481025696, 0.042480628937482834, 0.0016073246952146292, 0.030923642218112946]4.2.3.4 封装为可以插入的数据格式由上可知collection需要id字段作为主键唯一标识数据需要vector字段存储嵌入向量其余字段可以按需添加。data [ {id: i, vector: vectors[i], text: texts[i], source: demo} for i in range(len(texts)) ]4.2.4 写入数据4.2.4.1 插入数据# 插入数据 insert_res client.upsert( collection_namecollection_name, datadata ) print(insert result:, insert_res)upsert可以保证幂等写入即主键相同时覆盖输出如下insert result: {upsert_count: 4, ids: [0, 1, 2, 3]}4.2.4.2 手动flush# 手动 flush client.flush(collection_namecollection_name)Milvus不会第一时间将数据落盘要看到写入效果我们手动flush将数据刷写到磁盘4.2.4.3 查看collection统计信息# 查看 collection 统计 stats client.get_collection_stats(collection_namecollection_name) print(collection stats:, stats)输出如下collection stats: {row_count: 4}4.3 DQL操作4.3.1 扫描数据通过query_iterator 扫描collection下的所有数据it client.query_iterator( collection_namecollection_name, batch_size100, filter, # 不加过滤 扫全部 output_fields[*] # 你的显式 schema 字段 ) i 0 while True: rows it.next() if not rows: break for row in rows: print( * 30, f- 第{i 1}条 -, * 30) print(row) print( * 30, f- 第{i 1}条 -, * 30) i 1 it.close()输出如下 - 第1条 - {id: 0, vector: [0.06801506131887436, 0.06247688829898834, ......], text: LangChain 是一个用于构建 LLM 应用的开发框架。, source: demo} - 第1条 - - 第2条 - {id: 1, vector: [0.03384151682257652, 0.057637207210063934, ......], text: Milvus 是一个适合 AI 应用的向量数据库。, source: demo} - 第2条 - - 第3条 - {id: 2, vector: [-0.009978039190173149, 0.09607630968093872, ......], text: RAG 的核心是先检索相关知识再让大模型生成答案。, source: demo} - 第3条 - - 第4条 - {id: 3, vector: [0.027756735682487488, 0.11396646499633789, ......], text: Docker Desktop 可以方便地在本地运行 Milvus Standalone。, source: demo} - 第4条 - 4.3.2 通过主键查询数据# 查询 res client.get( collection_namecollection_name, ids[0, 1, 2, 3], ) print(len(res)) for i in range(len(res)): print( * 30, f- 第{i 1}条 -, * 30) print(res[i]) print( * 30, f- 第{i 1}条 -, * 30)输出如下4 - 第1条 - {id: 0, vector: [0.06801506131887436, 0.06247688829898834, 0.1035236120223999, -0.030978884547948837, 0.004772709216922522, ......], text: LangChain 是一个用于构建 LLM 应用的开发框架。, source: demo} - 第1条 - - 第2条 - {id: 1, vector: [0.03384151682257652, 0.057637207210063934, 0.07520284503698349, 0.0011678006267175078, 0.013201077468693256, ......], text: Milvus 是一个适合 AI 应用的向量数据库。, source: demo} - 第2条 - - 第3条 - {id: 2, vector: [-0.009978039190173149, 0.09607630968093872, 0.029030004516243935, 0.005278652533888817, 0.022045450285077095, ......], text: RAG 的核心是先检索相关知识再让大模型生成答案。, source: demo} - 第3条 - - 第4条 - {id: 3, vector: [0.027756735682487488, 0.11396646499633789, 0.04289725795388222, -0.043288204818964005, -0.029911866411566734, ......], text: Docker Desktop 可以方便地在本地运行 Milvus Standalone。, source: demo} - 第4条 - 4.3.3 相似度检索4.3.3.1 准备查询嵌入# 相似度检索 query 什么是向量数据库 query_vector embed_model.embed_query(query)4.3.3.2 检索results client.search( collection_namecollection_name, data[query_vector], # Milvus search 这里仍然要传二维列表 limit3, output_fields[text, source] ) print( search results ) for hit in results[0]: print(hit)limit 表示检索结果最多保留几条数据output_fields 表示输出的实体中展示哪些字段。结果如下 search results {id: 0, distance: 0.5897263884544373, entity: {text: LangChain 是一个用于构建 LLM 应用的开发框架。, source: demo}} {id: 1, distance: 0.5572514533996582, entity: {text: Milvus 是一个适合 AI 应用的向量数据库。, source: demo}} {id: 2, distance: 0.50614333152771, entity: {text: RAG 的核心是先检索相关知识再让大模型生成答案。, source: demo}}
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进