环境安装
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("什么是深度学习?")