Milvus实战:快速上手向量数据库

环境安装

pip install pymilvus chromadb qdrant-client faiss-cpu sentence-transformers uuid

导入Milvus客户端包文件

from pymilvus import MilvusClient

能轻松调用 Hugging Face 平台上的所有开源文本嵌入(Embedding)模型,把文字变成计算机能理解的语义向量

from langchain_huggingface import HuggingFaceEmbeddings

导入拆分文本工具包

from langchain_text_splitters import RecursiveCharacterTextSplitter

初始化milvus向量库

client=MilvusClient("milvus_demo.db")

初始化集合名称

collection_name="milvus_name1"

判断集合是否存在,不存在则创建

复制代码
if not client.has_collection(collection_name=collection_name):
    client.create_collection(
        collection_name=collection_name,
        dimension=384,  # 向量维度,与Embedding模型匹配
        metric_type="COSINE",  # 相似度度量:余弦相似度
        auto_id=True,  # 自动生成主键ID
        consistency_level="Strong"  # 强一致性
    )
从本地文件夹 all-MiniLM-L6-v2 中加载预训练好的句子嵌入模型,创建一个可以直接把文字转成语义向量的工具all-MiniLM-L6-v2 放到项目同级目录
model=SentenceTransformer("./all-MiniLM-L6-v2")
文本转向量
文本 → 向量(所有向量库通用)
def text2ec(text):
    return model.encode(text).tolist()
创建一个 “文本转向量工具”,专门把中文 / 英文句子变成计算机能看懂、能计算的语义向量
embed = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
复制代码
这行代码是LangChain 里专门用来切分长文本的工具,作用只有一个:把一篇长文章、长文档,切成一段一段固定长度的小文本(Chunk)。
spliter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=30)

RecursiveCharacterTextSplitter LangChain 最常用、最好用 的文本切割器 会智能切分 :优先按段落 → 句子 → 单词 → 字符切割,尽量不破坏语义

chunk_size=200 每一小段文本最多 200 个字符 (汉字、字母、标点都算 1 个)

chunk_overlap=30 每一段和下一段重叠 30 个字符 目的:防止一句话被切断,导致语义丢失

spliter = ... 创建一个切割工具,后面直接用它切文

如:

  • 第 1 段:0~200 字
  • 第 2 段:170~370 字(重叠 30 字
  • 第 3 段:340~500 字
复制代码
将文本插入向量库
def milvus_add(demo_text: str):
    chunks = spliter.split_text(demo_text)
    vectors = [text2ec(c) for c in chunks]
    print(f"向量 " + json.dumps(vectors))
    data= [{"vector": vec, "text": c} for vec, c in zip(vectors,chunks,)]
    result = json.dumps(data)
    client.insert(collection_name, data)
    print(f"插入的数据 {result}")
复制代码
query: 输入查询的问题/句子
topk: 返回相似度的前两条数据
def milvus_search(query: str, topk = 2):
    #将问题转换成向量
    query_vec = text2ec(query)
    #从向量库里查询匹配的内容
    res = client.search(
        # 集合名称
        collection_name=collection_name,
        # 向量数据
        data=[query_vec],
        # 相似度匹配前几条数据
        top_k=topk,
        # 输出的字段内容
        output_fields=['text']
    )
res[0]:因为一次只查 1 个 query,所以取第 0 组结果
hit['distance']:相似度分数
数字越小 = 越相似
数字越大 = 越不相关
hit['entity']['text']:取出匹配到的原文
for hit in res[0]:
    print(f"相似度得分:{hit['distance']:.4f} | 内容:{hit['entity']['text']}")
复制代码
测试长文本
demo_text = """
人工智能是模拟人类智能的技术。
机器学习是AI的核心分支。
深度学习基于神经网络。
自然语言处理让机器理解语言。
计算机视觉让机器看懂图像。
"""
加文本加入向量数据库
milvus_add(demo_text)
从向量数据库查询内容
milvus_search("什么是深度学习?")

完整代码

复制代码
from langchain_huggingface import HuggingFaceEmbeddings
from pymilvus import MilvusClient
from langchain_text_splitters import RecursiveCharacterTextSplitter

from sentence_transformers import SentenceTransformer
import json
client=MilvusClient("milvus_demo.db")
collection_name="milvus_name1"
if not client.has_collection(collection_name=collection_name):
    client.create_collection(
        collection_name=collection_name,
        dimension=384,  # 向量维度,与Embedding模型匹配
        metric_type="COSINE",  # 相似度度量:余弦相似度
        auto_id=True,  # 自动生成主键ID
        consistency_level="Strong"  # 强一致性
    )
else:
    print(f"{collection_name} 已存在")
# 从本地文件夹 ./all-MiniLM-L6-v2 中加载预训练好的句子嵌入模型,创建一个可以直接把文字转成语义向量的工具
model=SentenceTransformer("./all-MiniLM-L6-v2")
"""文本 → 向量(所有向量库通用)"""
def text2ec(text):
    return model.encode(text).tolist()
# 创建一个 “文本转向量工具”,专门把中文 / 英文句子变成计算机能看懂、能计算的语义向量
embed = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
# 这行代码是LangChain 里专门用来切分长文本的工具,作用只有一个:
# 把一篇长文章、长文档,切成一段一段固定长度的小文本(Chunk)。
spliter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=30)
# def split_text(text: str, chunk_size = 200, chunk_overlap = 30):
#     chunks = []
#     start = 0
#     text_len = len(text)
#     while start < text_len:
#         end = min(start+chunk_size, text_len)
#         chunks.append(text[start:end])
#         start+= chunk_size-chunk_overlap
#     return chunks




def text2ec(text):
    """文本 → 向量(所有向量库通用)"""
    return model.encode(text).tolist()
def milvus_add(demo_text: str):
    chunks = spliter.split_text(demo_text)
    vectors = [text2ec(c) for c in chunks]
    print(f"向量 " + json.dumps(vectors))
    data= [{"vector": vec, "text": c} for vec, c in zip(vectors,chunks,)]
    result = json.dumps(data)
    client.insert(collection_name, data)
    print(f"插入的数据 {result}")
# query: 输入查询的问题/句子
# topk: 返回相似度的前两条数据
def milvus_search(query: str, topk = 2):
    #将问题转换成向量
    query_vec = text2ec(query)
    #从向量库里查询匹配的内容
    res = client.search(
        # 集合名称 相当于数据库表名
        collection_name=collection_name,
        # 把查询向量发过去
        data=[query_vec],
        # 返回最相似的 topk 条
        top_k=topk,
        # 只返回原始文本内容(不返回其他无用字段)
        output_fields=['text']
    )
    '''
    res[0]:因为一次只查 1 个 query,所以取第 0 组结果
    hit['distance']:相似度分数
    数字越小 = 越相似
    数字越大 = 越不相关
    hit['entity']['text']:取出匹配到的原文
    '''
    for hit in res[0]:
        print(f"相似度得分:{hit['distance']:.4f} | 内容:{hit['entity']['text']}")
# 测试长文本
demo_text = """
人工智能是模拟人类智能的技术。
机器学习是AI的核心分支。
深度学习基于神经网络。
自然语言处理让机器理解语言。
计算机视觉让机器看懂图像。
"""
milvus_add(demo_text)
milvus_search("什么是深度学习?")
相关推荐
LaughingZhu2 分钟前
Product Hunt 每日热榜 | 2026-07-17
前端·数据库·人工智能·经验分享·mysql·chatgpt·html
DFT计算杂谈4 分钟前
DeepSeek 集群服务器无root本地部署指南
数据库·人工智能·python·opencv·算法
潇凝子潇6 分钟前
UnsupportedOperationException
java·前端·数据库
七夜zippoe13 分钟前
DolphinDB实时聚合计算:多维度聚合
数据库·dolphindb
踏月的造梦星球10 小时前
DMDPC 学习:架构、部署、运维与调优
运维·数据库·学习·架构
韩楚风10 小时前
【参天引擎】事务生命周期 / MVCC / Undo / ACID / 分布式事务 功能域整体解析
数据库·分布式·mysql·架构·cantian
renhongxia111 小时前
世界模型,是“空中楼阁”还是AGI的“最后一块拼图”?
运维·服务器·数据库·人工智能·算法·agi
程序员无隅11 小时前
Coding Agent 为什么压缩上下文后还能继续工作?上下文模块设计拆解
java·开发语言·数据库
愿做无知一猿11 小时前
Nacos连接MySQL异常?DataGrip竟成救星
数据库·mysql
G.O.G.O.G11 小时前
LeetCode SQL 从入门到精通(MySQL)06(上)
数据库·sql·mysql·leetcode