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("什么是深度学习?")
相关推荐
艾莉丝努力练剑1 小时前
【Qt】事件
服务器·开发语言·网络·数据库·qt·tcp/ip·计算机网络
Bert.Cai1 小时前
Oracle简介
数据库·oracle
名不经传的养虾人1 小时前
从0到1:企业级AI项目迭代日记 Vol.41|多租户不是一个功能,是一次手术
服务器·数据库·系统架构·ai编程·ai工作流·企业ai
艾莉丝努力练剑1 小时前
【QT】窗口
运维·网络·数据库·qt·计算机网络·microsoft
元拓数智1 小时前
跨库NL2SQL可信落地的核心:用IntaLink破解数据关系“迷雾”
数据库·人工智能·ai·nlp·agent·llama
worilb2 小时前
Spring Cloud 学习与实践(6):Nacos 配置中心
数据库·学习·spring cloud
lld9510272 小时前
(三)本地策略框架
java·服务器·数据库
scan7242 小时前
根据context={“query_type“: “vip“} 进行选择
数据库
Solis程序员2 小时前
亿级流量下的 Redis 计数系统设计:位图事实 + 事件聚合 + SDS 汇总
数据库·redis·缓存