bash
日志打印出来的是这个,现在attu为什么看不到插入的数据信息,集合信息已经可以看到,为什么看不到数据呢
/home/anaconda3/envs/bi-txt-sql/bin/python -X pycache_prefix=/home/.cache/JetBrains/PyCharm2023.2/cpython-cache /home/tools/pycharm-professional-2023.2.5/pycharm-2023.2.5/plugins/python/helpers/pydev/pydevd.py --multiprocess --qt-support=auto --client 127.0.0.1 --port 42745 --file /home/PycharmProjects/bi-txt-sql/app/api/endpoints/testmilvus.py
已连接到 pydev 调试器(内部版本号 232.10300.41)/home/.local/lib/python3.10/site-packages/torch/__init__.py:235: UserWarning: The NumPy module was reloaded (imported a second time). This can in some cases result in small but subtle issues and is discouraged.
from torch._C import * # noqa: F403
成功连接到 Milvus 服务器
集合 'weather' 不存在,正在创建...
集合 'weather' 已创建
/home/.local/lib/python3.10/site-packages/huggingface_hub/file_download.py:1132: FutureWarning: resume_download is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use force_download=True.
warnings.warn(
/home/.local/lib/python3.10/site-packages/huggingface_hub/file_download.py:1132: FutureWarning: resume_download is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use force_download=True.
warnings.warn(
嵌入向量生成成功
成功插入 4 条数据到集合 'weather' 中
现有的 Milvus 集合: ['weather']
进程已结束,退出代码为 0
根据日志,你的 Milvus 集合 "weather"
已经创建,并且你成功插入了 4 条数据。但是你在使用 Attu 时看不到这些数据。这可能是由于以下几种原因:
可能原因及解决方法:
1. 未创建索引
Milvus 在插入数据后,需要创建索引以支持快速搜索和可见性。如果没有创建索引,虽然数据已插入,但你在 Attu 中可能看不到可视化的数据。
解决方法:创建索引
你可以在插入数据后创建一个索引。Milvus 支持多种索引类型,如 IVF_FLAT
、IVF_SQ8
等。你可以在插入数据后创建索引:
python
# 创建索引
index_params = {
"metric_type": "L2", # 可以根据需求选择其他相似度度量方式,如 IP
"index_type": "IVF_FLAT",
"params": {"nlist": 128}
}
collection.create_index(field_name="embedding", index_params=index_params)
print("索引已创建")
2. 数据还未加载
Milvus 使用 lazy loading(延迟加载),这意味着插入的数据并不会立即可供查询。你需要显式地调用 load()
方法来加载数据,使它们可用于搜索和可视化。
解决方法:加载集合数据
python
# 加载集合数据
collection.load()
print("集合数据已加载")
3. Attu 缓存问题
Attu 可能缓存了之前的集合信息,因此即使你插入了数据,Attu 可能没有刷新数据。
解决方法:刷新 Attu
尝试手动刷新 Attu 页面,或者重启 Attu 服务,确保它能够从 Milvus 中获取最新的数据。
bash
docker restart attu
4. Milvus 数据插入未生效
尽管日志显示插入成功,有时候如果数据没有完全提交到 Milvus 中,可能会导致数据不可见。
解决方法:确保数据插入已提交并且集合已 flush
python
# 插入后 flush 数据
collection.flush()
5. 查看 Attu 中是否选择了正确的集合
确保你在 Attu 中查看的是正确的集合。有时,可能是查看的集合不是你刚刚插入数据的集合。
完整修改后的代码:
确保你在插入数据后创建索引、加载集合,并刷新 Attu:
python
import torch
from transformers import AutoTokenizer, AutoModel
from pymilvus import CollectionSchema, FieldSchema, DataType, Collection, connections, utility
import numpy as np
# 计算文本嵌入的函数
def embed_texts(texts, model, tokenizer):
"""
使用 Jina-embeddings-v2 模型将文本转化为嵌入向量
"""
inputs = tokenizer(texts, return_tensors='pt', padding=True, truncation=True)
with torch.no_grad():
outputs = model(**inputs)
embeddings = outputs.last_hidden_state[:, 0, :] # 提取CLS token嵌入
return embeddings.numpy()
if __name__ == '__main__':
# 创建连接并检查是否成功
try:
connections.connect(alias="default", host="172.19.17.52", port="19530")
print("成功连接到 Milvus 服务器")
except Exception as e:
print(f"连接 Milvus 失败: {e}")
# 定义集合结构,注意我们为主键添加了 is_primary=True
id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True)
text_field = FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=100)
embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=768)
schema = CollectionSchema(fields=[id_field, text_field, embedding_field])
# 集合名称
collection_name = "weather"
# 检查集合是否存在
if not utility.has_collection(collection_name):
print(f"集合 '{collection_name}' 不存在,正在创建...")
# 创建集合
try:
collection = Collection(name=collection_name, schema=schema)
print(f"集合 '{collection_name}' 已创建")
except Exception as e:
print(f"创建集合时出错: {e}")
else:
print(f"集合 '{collection_name}' 已存在,正在使用现有集合...")
# 加载现有集合
collection = Collection(name=collection_name)
# 加载 Jina-embeddings-v2-base-zh 模型和对应的 tokenizer
model_name = 'jinaai/jina-embeddings-v2-base-zh'
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModel.from_pretrained(model_name, trust_remote_code=True)
# 示例文本
candidate_texts = ['今天天气下雨吗?', '今天是一个晴天', '今天是星期几?', '今天天气怎么样?']
# 使用 Jina-embeddings-v2 模型生成文本嵌入向量
try:
candidate_embeddings = embed_texts(candidate_texts, model, tokenizer)
print(f"嵌入向量生成成功")
except Exception as e:
print(f"生成嵌入向量时出错: {e}")
# 插入数据
try:
collection.insert([candidate_texts, candidate_embeddings.tolist()])
collection.flush()
print(f"成功插入 {len(candidate_texts)} 条数据到集合 '{collection_name}' 中")
except Exception as e:
print(f"插入数据时出错: {e}")
# 创建索引
index_params = {
"metric_type": "L2",
"index_type": "IVF_FLAT",
"params": {"nlist": 128}
}
collection.create_index(field_name="embedding", index_params=index_params)
print("索引已创建")
# 加载集合数据
collection.load()
print("集合数据已加载")
# 查看所有现有的 Milvus 集合
try:
collections = utility.list_collections()
print("现有的 Milvus 集合: ", collections)
except Exception as e:
print(f"列出现有集合时出错: {e}")
总结:
- 创建索引:确保插入后创建索引,以支持查询和可视化。
- 加载集合 :在插入数据后,显式调用
load()
使数据可用。 - 刷新 Attu:刷新或重启 Attu,确保它从 Milvus 获取最新的数据。
- 确保正确查看集合:在 Attu 中确认是否选择了正确的集合。
通过这些步骤,你应该能够在 Attu 中看到你插入的数据。